Speedup and cleanup vom decoder.

This brings the vom Decoder implementation into a reasonable
state, performance-wise.  The main changes are to:

1) Bytes handling is improved, both for []byte lists and [n]byte
arrays, and regardless of named / unnamed / generated / reflect
variants.  Note that the implementation chooses to not re-use
existing byte slices when decoding, which costs ~10% in our
benchmarks, but is safer for developers.

2) Scalar collections now have special Decoder ReadValue* and
NextEntryValue* methods.  This simplifies the generated code, and
also lets us implement some important optimizations, which speed
up array, list, set and map.

Other than similar changes on the Encoder, the largest remaining
item for vom speedup / cleanup is to re-implement the vdl type
registration mechanism, which will let us use David Crawshaw's
cool ideas for smaller binary sizes, and also for a faster /
simpler implementation.

There are lots of files here.  The important ones to look at are
the non *.vdl.go files under:
  v.io/v23/vdl
  v.io/v23/vom
  v.io/v23/verror
  v.io/x/ref/lib/vdl/codegen/golang

Here are the decoding benchmarks.  I'm not worrying too much
about the ones that got worse, since the absolute magnitude is
relatively small.

benchmark                          old ns/op  new ns/op    delta
Vom___Decode_____XNumber               1477       1318   -10.77%
Vom___DecodeMany_XNumber                536        459   -14.37%
Vom___Decode_____VNumber               1045        898   -14.07%
Vom___DecodeMany_VNumber                260        256    -1.54%
Vom___Decode_____XStringSmall          1627       1437   -11.68%
Vom___DecodeMany_XStringSmall           681        617    -9.40%
Vom___Decode_____VStringSmall          1207       1012   -16.16%
Vom___DecodeMany_VStringSmall           405        343   -15.31%
Vom___Decode_____XStringLarge         33714      33658    -0.17%
Vom___DecodeMany_XStringLarge         33325      32451    -2.62%
Vom___Decode_____VStringLarge         33284      32038    -3.74%
Vom___DecodeMany_VStringLarge         31765      31426    -1.07%
Vom___Decode_____VEnum                 1123        910   -18.97%
Vom___DecodeMany_VEnum                  298        271    -9.06%
Vom___Decode_____XByteListSmall        1950       1592   -18.36%
Vom___DecodeMany_XByteListSmall         931        802   -13.86%
Vom___Decode_____VByteListSmall        1225       1052   -14.12%
Vom___DecodeMany_VByteListSmall         426        386    -9.39%
Vom___Decode_____XByteListLarge       20721      19814    -4.38%
Vom___DecodeMany_XByteListLarge       19334      18850    -2.50%
Vom___Decode_____VByteListLarge       19364      18905    -2.37%
Vom___DecodeMany_VByteListLarge       17947      17987    +0.22%
Vom___Decode_____XByteArray            1758       1568   -10.81%
Vom___DecodeMany_XByteArray             768        733    -4.56%
Vom___Decode_____VByteArray            1125        945   -16.00%
Vom___DecodeMany_VByteArray             358        332    -7.26%
Vom___Decode_____XArray                2553       1840   -27.93%
Vom___DecodeMany_XArray                1234        733   -40.60%
Vom___Decode_____VArray                1515       1199   -20.86%
Vom___DecodeMany_VArray                 502        409   -18.53%
Vom___Decode_____XListSmall            3719       2178   -41.44%
Vom___DecodeMany_XListSmall            2344       1088   -53.58%
Vom___Decode_____VListSmall            1608       1255   -21.95%
Vom___DecodeMany_VListSmall             589        465   -21.05%
Vom___Decode_____XListLarge        28288185    3706132   -86.90%
Vom___DecodeMany_XListLarge        28454774    3718255   -86.93%
Vom___Decode_____VListLarge         5264233    2425440   -53.93%
Vom___DecodeMany_VListLarge         6324235    2424557   -61.66%
Vom___Decode_____XListAnySmall         5459       4371   -19.93%
Vom___DecodeMany_XListAnySmall         3895       2918   -25.08%
Vom___Decode_____VListAnySmall         2898       2666    -8.01%
Vom___DecodeMany_VListAnySmall         1701       1507   -11.41%
Vom___Decode_____XListAnyLarge     56238352   38693410   -31.20%
Vom___DecodeMany_XListAnyLarge     56389732   37919725   -32.75%
Vom___Decode_____VListAnyLarge     27310371   25149237    -7.91%
Vom___DecodeMany_VListAnyLarge     26423353   24243553    -8.25%
Vom___Decode_____VSet                  2291       1970   -14.01%
Vom___DecodeMany_VSet                  1227       1088   -11.33%
Vom___Decode_____XMap                  5278       4169   -21.01%
Vom___DecodeMany_XMap                  4734       3048   -35.61%
Vom___Decode_____VMap                  2699       2144   -20.56%
Vom___DecodeMany_VMap                  1527       1209   -20.83%
Vom___Decode_____XSmallStruct          3860       3506    -9.17%
Vom___DecodeMany_XSmallStruct          2451       2353    -4.00%
Vom___Decode_____VSmallStruct          1878       1627   -13.37%
Vom___DecodeMany_VSmallStruct           823        674   -18.10%
Vom___Decode_____XLargeStruct         33192      30363    -8.52%
Vom___DecodeMany_XLargeStruct         31344      28640    -8.63%
Vom___Decode_____VLargeStruct          8687       7311   -15.84%
Vom___DecodeMany_VLargeStruct          7038       6028   -14.35%
Vom___Decode_____XLargeStructZero      2121       2069    -2.45%
Vom___DecodeMany_XLargeStructZero       758        726    -4.22%
Vom___Decode_____VLargeStructZero      1319       1338    +1.44%
Vom___DecodeMany_VLargeStructZero       293        298    +1.71%
Vom___Decode_____VSmallUnion           2706       2516    -7.02%
Vom___DecodeMany_VSmallUnion           1237       1241    +0.32%
Vom___Decode_____Time                  3078       2812    -8.64%
Vom___DecodeMany_Time                  1800       1672    -7.11%
Vom___Decode_____Blessings            57178      56034    -2.00%
Vom___DecodeMany_Blessings            54852      53810    -1.90%
Vom___Decode_____RPCRequestZero        1765       1767    +0.11%
Vom___DecodeMany_RPCRequestZero         309        327    +5.83%
Vom___Decode_____RPCRequestFull       58691      57640    -1.79%
Vom___DecodeMany_RPCRequestFull       55820      54865    -1.71%
Vom___Decode_____RPCResponseZero       1804       1803    -0.06%
Vom___DecodeMany_RPCResponseZero        338        333    -1.48%
Vom___Decode_____RPCResponseFull      43685      42907    -1.78%
Vom___DecodeMany_RPCResponseFull      39505      39474    -0.08%

MultiPart: 1/5
Change-Id: I84abbe48d97c7ba0eb84ba9007b701acae120965
diff --git a/discovery/discovery.vdl.go b/discovery/discovery.vdl.go
index ea96587..fea1927 100644
--- a/discovery/discovery.vdl.go
+++ b/discovery/discovery.vdl.go
@@ -39,14 +39,11 @@
 }
 
 func (x *AdId) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_array_1); err != nil {
-		return err
-	}
 	bytes := x[:]
-	if err := dec.DecodeBytes(16, &bytes); err != nil {
+	if err := dec.ReadValueBytes(16, &bytes); err != nil {
 		return err
 	}
-	return dec.FinishValue()
+	return nil
 }
 
 // Attributes represents service attributes as a key/value pair.
@@ -106,43 +103,25 @@
 		tmpMap = make(Attributes, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
+		default:
+			var elem string
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
+				return err
+			default:
+				elem = value
+			}
+			if tmpMap == nil {
+				tmpMap = make(Attributes)
+			}
+			tmpMap[key] = elem
 		}
-		var key string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
-			}
-			var err error
-			if key, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
-			}
-			var err error
-			if elem, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		if tmpMap == nil {
-			tmpMap = make(Attributes)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -203,42 +182,22 @@
 		tmpMap = make(Attachments, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
+		default:
+			var elem []byte
+			if err := dec.ReadValueBytes(-1, &elem); err != nil {
+				return err
+			}
+			if tmpMap == nil {
+				tmpMap = make(Attachments)
+			}
+			tmpMap[key] = elem
 		}
-		var key string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
-			}
-			var err error
-			if key, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem []byte
-		{
-			if err := dec.StartValue(__VDLType_list_4); err != nil {
-				return err
-			}
-			if err := dec.DecodeBytes(-1, &elem); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		if tmpMap == nil {
-			tmpMap = make(Attachments)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -400,19 +359,16 @@
 		case "":
 			return dec.FinishValue()
 		case "Id":
-			if err := x.Id.VDLRead(dec); err != nil {
+			bytes := x.Id[:]
+			if err := dec.ReadValueBytes(16, &bytes); err != nil {
 				return err
 			}
 		case "InterfaceName":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.InterfaceName, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.InterfaceName = value
 			}
 		case "Addresses":
 			if err := __VDLReadAnon_list_1(dec, &x.Addresses); err != nil {
@@ -438,31 +394,20 @@
 	if err := dec.StartValue(__VDLType_list_6); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make([]string, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, elem, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			*x = append(*x, elem)
 		}
-		var elem string
-		if err := dec.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		var err error
-		if elem, err = dec.DecodeString(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
diff --git a/naming/naming.vdl.go b/naming/naming.vdl.go
index 47628cd..c84a681 100644
--- a/naming/naming.vdl.go
+++ b/naming/naming.vdl.go
@@ -42,15 +42,13 @@
 }
 
 func (x *MountFlag) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_uint32_1); err != nil {
+	switch value, err := dec.ReadValueUint(32); {
+	case err != nil:
 		return err
+	default:
+		*x = MountFlag(value)
 	}
-	tmp, err := dec.DecodeUint(32)
-	if err != nil {
-		return err
-	}
-	*x = MountFlag(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 // MountedServer represents a server mounted on a specific name.
@@ -126,15 +124,11 @@
 		case "":
 			return dec.FinishValue()
 		case "Server":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Server, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Server = value
 			}
 		case "Deadline":
 			var wire vdltime.WireDeadline
@@ -280,41 +274,29 @@
 		case "":
 			return dec.FinishValue()
 		case "Name":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Name, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Name = value
 			}
 		case "Servers":
 			if err := __VDLReadAnon_list_1(dec, &x.Servers); err != nil {
 				return err
 			}
 		case "ServesMountTable":
-			if err := dec.StartValue(vdl.BoolType); err != nil {
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.ServesMountTable, err = dec.DecodeBool(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.ServesMountTable = value
 			}
 		case "IsLeaf":
-			if err := dec.StartValue(vdl.BoolType); err != nil {
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.IsLeaf, err = dec.DecodeBool(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.IsLeaf = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -328,10 +310,9 @@
 	if err := dec.StartValue(__VDLType_list_5); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make([]MountedServer, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -340,12 +321,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem MountedServer
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem MountedServer
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -413,15 +395,11 @@
 		case "":
 			return dec.FinishValue()
 		case "Name":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Name, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Name = value
 			}
 		case "Error":
 			if err := verror.VDLRead(dec, &x.Error); err != nil {
@@ -649,15 +627,11 @@
 	switch f {
 	case "Name":
 		var field GlobChildrenReplyName
-		if err := dec.StartValue(vdl.StringType); err != nil {
+		switch value, err := dec.ReadValueString(); {
+		case err != nil:
 			return err
-		}
-		var err error
-		if field.Value, err = dec.DecodeString(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = value
 		}
 		*x = field
 	case "Error":
diff --git a/query/engine/internal/testdata/testdata.vdl.go b/query/engine/internal/testdata/testdata.vdl.go
index f8b272f..b128925 100644
--- a/query/engine/internal/testdata/testdata.vdl.go
+++ b/query/engine/internal/testdata/testdata.vdl.go
@@ -115,48 +115,32 @@
 		case "":
 			return dec.FinishValue()
 		case "Street":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Street, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Street = value
 			}
 		case "City":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.City, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.City = value
 			}
 		case "State":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.State, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.State = value
 			}
 		case "Zip":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Zip, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Zip = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -234,17 +218,15 @@
 }
 
 func (x *CreditAgency) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_enum_2); err != nil {
+	switch value, err := dec.ReadValueString(); {
+	case err != nil:
 		return err
+	default:
+		if err := x.Set(value); err != nil {
+			return err
+		}
 	}
-	enum, err := dec.DecodeString()
-	if err != nil {
-		return err
-	}
-	if err := x.Set(enum); err != nil {
-		return err
-	}
-	return dec.FinishValue()
+	return nil
 }
 
 type ExperianRating int
@@ -309,17 +291,15 @@
 }
 
 func (x *ExperianRating) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_enum_3); err != nil {
+	switch value, err := dec.ReadValueString(); {
+	case err != nil:
 		return err
+	default:
+		if err := x.Set(value); err != nil {
+			return err
+		}
 	}
-	enum, err := dec.DecodeString()
-	if err != nil {
-		return err
-	}
-	if err := x.Set(enum); err != nil {
-		return err
-	}
-	return dec.FinishValue()
+	return nil
 }
 
 type RatingsArray [4]int16
@@ -361,29 +341,23 @@
 	if err := dec.StartValue(__VDLType_array_4); err != nil {
 		return err
 	}
-	index := 0
-	for {
-		switch done, err := dec.NextEntry(); {
+	for index := 0; index < 4; index++ {
+		switch done, elem, err := dec.NextEntryValueInt(16); {
 		case err != nil:
 			return err
-		case done != (index >= len(*x)):
-			return fmt.Errorf("array len mismatch, done:%v index:%d len:%d %T)", done, index, len(*x), *x)
 		case done:
-			return dec.FinishValue()
+			return fmt.Errorf("short array, got len %d < 4 %T)", index, *x)
+		default:
+			x[index] = int16(elem)
 		}
-		if err := dec.StartValue(vdl.Int16Type); err != nil {
-			return err
-		}
-		tmp, err := dec.DecodeInt(16)
-		if err != nil {
-			return err
-		}
-		x[index] = int16(tmp)
-		if err := dec.FinishValue(); err != nil {
-			return err
-		}
-		index++
 	}
+	switch done, err := dec.NextEntry(); {
+	case err != nil:
+		return err
+	case !done:
+		return fmt.Errorf("long array, got len > 4 %T", *x)
+	}
+	return dec.FinishValue()
 }
 
 type EquifaxCreditReport struct {
@@ -446,16 +420,11 @@
 		case "":
 			return dec.FinishValue()
 		case "Rating":
-			if err := dec.StartValue(vdl.ByteType); err != nil {
+			switch value, err := dec.ReadValueUint(8); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeUint(8)
-			if err != nil {
-				return err
-			}
-			x.Rating = byte(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Rating = byte(value)
 			}
 		case "FourScoreRatings":
 			if err := x.FourScoreRatings.VDLRead(dec); err != nil {
@@ -537,17 +506,15 @@
 }
 
 func (x *Tdh) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_enum_6); err != nil {
+	switch value, err := dec.ReadValueString(); {
+	case err != nil:
 		return err
+	default:
+		if err := x.Set(value); err != nil {
+			return err
+		}
 	}
-	enum, err := dec.DecodeString()
-	if err != nil {
-		return err
-	}
-	if err := x.Set(enum); err != nil {
-		return err
-	}
-	return dec.FinishValue()
+	return nil
 }
 
 type ExperianCreditReport struct {
@@ -643,16 +610,26 @@
 		case "":
 			return dec.FinishValue()
 		case "Rating":
-			if err := x.Rating.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
+			default:
+				if err := x.Rating.Set(value); err != nil {
+					return err
+				}
 			}
 		case "TdhApprovals":
 			if err := __VDLReadAnon_set_1(dec, &x.TdhApprovals); err != nil {
 				return err
 			}
 		case "Auditor":
-			if err := x.Auditor.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
+			default:
+				if err := x.Auditor.Set(value); err != nil {
+					return err
+				}
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -671,23 +648,22 @@
 		tmpMap = make(map[Tdh]struct{}, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key Tdh
-		{
-			if err := key.VDLRead(dec); err != nil {
+		default:
+			var keyEnum Tdh
+			if err := keyEnum.Set(key); err != nil {
 				return err
 			}
+			if tmpMap == nil {
+				tmpMap = make(map[Tdh]struct{})
+			}
+			tmpMap[keyEnum] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(map[Tdh]struct{})
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -793,16 +769,11 @@
 		case "":
 			return dec.FinishValue()
 		case "Rating":
-			if err := dec.StartValue(vdl.Int16Type); err != nil {
+			switch value, err := dec.ReadValueInt(16); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(16)
-			if err != nil {
-				return err
-			}
-			x.Rating = int16(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Rating = int16(value)
 			}
 		case "PreviousRatings":
 			if err := __VDLReadAnon_map_2(dec, &x.PreviousRatings); err != nil {
@@ -825,44 +796,25 @@
 		tmpMap = make(map[string]int16, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
+		default:
+			var elem int16
+			switch value, err := dec.ReadValueInt(16); {
+			case err != nil:
+				return err
+			default:
+				elem = int16(value)
+			}
+			if tmpMap == nil {
+				tmpMap = make(map[string]int16)
+			}
+			tmpMap[key] = elem
 		}
-		var key string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
-			}
-			var err error
-			if key, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem int16
-		{
-			if err := dec.StartValue(vdl.Int16Type); err != nil {
-				return err
-			}
-			tmp, err := dec.DecodeInt(16)
-			if err != nil {
-				return err
-			}
-			elem = int16(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		if tmpMap == nil {
-			tmpMap = make(map[string]int16)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -1076,8 +1028,13 @@
 		case "":
 			return dec.FinishValue()
 		case "Agency":
-			if err := x.Agency.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
+			default:
+				if err := x.Agency.Set(value); err != nil {
+					return err
+				}
 			}
 		case "Report":
 			if err := VDLReadAgencyReport(dec, &x.Report); err != nil {
@@ -1242,37 +1199,25 @@
 		case "":
 			return dec.FinishValue()
 		case "Name":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Name, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Name = value
 			}
 		case "Id":
-			if err := dec.StartValue(vdl.Int64Type); err != nil {
+			switch value, err := dec.ReadValueInt(64); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Id, err = dec.DecodeInt(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Id = value
 			}
 		case "Active":
-			if err := dec.StartValue(vdl.BoolType); err != nil {
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Active, err = dec.DecodeBool(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Active = value
 			}
 		case "Address":
 			if err := x.Address.VDLRead(dec); err != nil {
@@ -1298,10 +1243,9 @@
 	if err := dec.StartValue(__VDLType_list_14); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make([]AddressInfo, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -1310,12 +1254,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem AddressInfo
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem AddressInfo
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -1437,26 +1382,18 @@
 		case "":
 			return dec.FinishValue()
 		case "CustId":
-			if err := dec.StartValue(vdl.Int64Type); err != nil {
+			switch value, err := dec.ReadValueInt(64); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.CustId, err = dec.DecodeInt(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.CustId = value
 			}
 		case "InvoiceNum":
-			if err := dec.StartValue(vdl.Int64Type); err != nil {
+			switch value, err := dec.ReadValueInt(64); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.InvoiceNum, err = dec.DecodeInt(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.InvoiceNum = value
 			}
 		case "InvoiceDate":
 			var wire vdltime.Time
@@ -1467,15 +1404,11 @@
 				return err
 			}
 		case "Amount":
-			if err := dec.StartValue(vdl.Int64Type); err != nil {
+			switch value, err := dec.ReadValueInt(64); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Amount, err = dec.DecodeInt(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Amount = value
 			}
 		case "ShipTo":
 			if err := x.ShipTo.VDLRead(dec); err != nil {
@@ -1660,109 +1593,67 @@
 		case "":
 			return dec.FinishValue()
 		case "B":
-			if err := dec.StartValue(vdl.ByteType); err != nil {
+			switch value, err := dec.ReadValueUint(8); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeUint(8)
-			if err != nil {
-				return err
-			}
-			x.B = byte(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.B = byte(value)
 			}
 		case "Ui16":
-			if err := dec.StartValue(vdl.Uint16Type); err != nil {
+			switch value, err := dec.ReadValueUint(16); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeUint(16)
-			if err != nil {
-				return err
-			}
-			x.Ui16 = uint16(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Ui16 = uint16(value)
 			}
 		case "Ui32":
-			if err := dec.StartValue(vdl.Uint32Type); err != nil {
+			switch value, err := dec.ReadValueUint(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeUint(32)
-			if err != nil {
-				return err
-			}
-			x.Ui32 = uint32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Ui32 = uint32(value)
 			}
 		case "Ui64":
-			if err := dec.StartValue(vdl.Uint64Type); err != nil {
+			switch value, err := dec.ReadValueUint(64); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Ui64, err = dec.DecodeUint(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Ui64 = value
 			}
 		case "I16":
-			if err := dec.StartValue(vdl.Int16Type); err != nil {
+			switch value, err := dec.ReadValueInt(16); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(16)
-			if err != nil {
-				return err
-			}
-			x.I16 = int16(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.I16 = int16(value)
 			}
 		case "I32":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.I32 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.I32 = int32(value)
 			}
 		case "I64":
-			if err := dec.StartValue(vdl.Int64Type); err != nil {
+			switch value, err := dec.ReadValueInt(64); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.I64, err = dec.DecodeInt(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.I64 = value
 			}
 		case "F32":
-			if err := dec.StartValue(vdl.Float32Type); err != nil {
+			switch value, err := dec.ReadValueFloat(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeFloat(32)
-			if err != nil {
-				return err
-			}
-			x.F32 = float32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F32 = float32(value)
 			}
 		case "F64":
-			if err := dec.StartValue(vdl.Float64Type); err != nil {
+			switch value, err := dec.ReadValueFloat(64); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.F64, err = dec.DecodeFloat(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F64 = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -1874,28 +1765,20 @@
 	switch f {
 	case "Title":
 		var field TitleOrValueTypeTitle
-		if err := dec.StartValue(vdl.StringType); err != nil {
+		switch value, err := dec.ReadValueString(); {
+		case err != nil:
 			return err
-		}
-		var err error
-		if field.Value, err = dec.DecodeString(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = value
 		}
 		*x = field
 	case "Value":
 		var field TitleOrValueTypeValue
-		if err := dec.StartValue(vdl.Int64Type); err != nil {
+		switch value, err := dec.ReadValueInt(64); {
+		case err != nil:
 			return err
-		}
-		var err error
-		if field.Value, err = dec.DecodeInt(64); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = value
 		}
 		*x = field
 	case "":
@@ -1980,15 +1863,11 @@
 		case "":
 			return dec.FinishValue()
 		case "Name":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Name, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Name = value
 			}
 		case "TitleOrValue":
 			if err := VDLReadTitleOrValueType(dec, &x.TitleOrValue); err != nil {
@@ -2196,27 +2075,18 @@
 		case "":
 			return dec.FinishValue()
 		case "A":
-			if err := dec.StartValue(vdl.ByteType); err != nil {
+			switch value, err := dec.ReadValueUint(8); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeUint(8)
-			if err != nil {
-				return err
-			}
-			x.A = byte(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.A = byte(value)
 			}
 		case "B":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.B, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.B = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -2292,27 +2162,18 @@
 		case "":
 			return dec.FinishValue()
 		case "A":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.A, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.A = value
 			}
 		case "B":
-			if err := dec.StartValue(vdl.Float32Type); err != nil {
+			switch value, err := dec.ReadValueFloat(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeFloat(32)
-			if err != nil {
-				return err
-			}
-			x.B = float32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.B = float32(value)
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -2530,23 +2391,20 @@
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key K
-		{
+		default:
+			var key K
 			if err := key.VDLRead(dec); err != nil {
 				return err
 			}
-		}
-		var elem V
-		{
+			var elem V
 			if err := elem.VDLRead(dec); err != nil {
 				return err
 			}
+			if tmpMap == nil {
+				tmpMap = make(map[K]V)
+			}
+			tmpMap[key] = elem
 		}
-		if tmpMap == nil {
-			tmpMap = make(map[K]V)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -2559,37 +2417,22 @@
 		tmpMap = make(map[int16][]map[string]struct{}, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueInt(16); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key int16
-		{
-			if err := dec.StartValue(vdl.Int16Type); err != nil {
-				return err
-			}
-			tmp, err := dec.DecodeInt(16)
-			if err != nil {
-				return err
-			}
-			key = int16(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem []map[string]struct{}
-		{
+		default:
+			var elem []map[string]struct{}
 			if err := __VDLReadAnon_list_6(dec, &elem); err != nil {
 				return err
 			}
+			if tmpMap == nil {
+				tmpMap = make(map[int16][]map[string]struct{})
+			}
+			tmpMap[int16(key)] = elem
 		}
-		if tmpMap == nil {
-			tmpMap = make(map[int16][]map[string]struct{})
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -2597,10 +2440,9 @@
 	if err := dec.StartValue(__VDLType_list_27); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make([]map[string]struct{}, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -2609,12 +2451,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem map[string]struct{}
+			if err := __VDLReadAnon_set_7(dec, &elem); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem map[string]struct{}
-		if err := __VDLReadAnon_set_7(dec, &elem); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -2627,30 +2470,18 @@
 		tmpMap = make(map[string]struct{}, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
+		default:
+			if tmpMap == nil {
+				tmpMap = make(map[string]struct{})
 			}
-			var err error
-			if key, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
+			tmpMap[key] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(map[string]struct{})
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -2717,26 +2548,18 @@
 		case "":
 			return dec.FinishValue()
 		case "T1":
-			if err := dec.StartValue(vdl.TypeObjectType); err != nil {
+			switch value, err := dec.ReadValueTypeObject(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.T1, err = dec.DecodeTypeObject(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.T1 = value
 			}
 		case "T2":
-			if err := dec.StartValue(vdl.TypeObjectType); err != nil {
+			switch value, err := dec.ReadValueTypeObject(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.T2, err = dec.DecodeTypeObject(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.T2 = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -3466,43 +3289,25 @@
 		tmpMap = make(map[bool]string, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueBool(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
+		default:
+			var elem string
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
+				return err
+			default:
+				elem = value
+			}
+			if tmpMap == nil {
+				tmpMap = make(map[bool]string)
+			}
+			tmpMap[key] = elem
 		}
-		var key bool
-		{
-			if err := dec.StartValue(vdl.BoolType); err != nil {
-				return err
-			}
-			var err error
-			if key, err = dec.DecodeBool(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
-			}
-			var err error
-			if elem, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		if tmpMap == nil {
-			tmpMap = make(map[bool]string)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -3515,44 +3320,25 @@
 		tmpMap = make(map[byte]string, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueUint(8); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
+		default:
+			var elem string
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
+				return err
+			default:
+				elem = value
+			}
+			if tmpMap == nil {
+				tmpMap = make(map[byte]string)
+			}
+			tmpMap[byte(key)] = elem
 		}
-		var key byte
-		{
-			if err := dec.StartValue(vdl.ByteType); err != nil {
-				return err
-			}
-			tmp, err := dec.DecodeUint(8)
-			if err != nil {
-				return err
-			}
-			key = byte(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
-			}
-			var err error
-			if elem, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		if tmpMap == nil {
-			tmpMap = make(map[byte]string)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -3565,44 +3351,25 @@
 		tmpMap = make(map[uint16]string, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueUint(16); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
+		default:
+			var elem string
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
+				return err
+			default:
+				elem = value
+			}
+			if tmpMap == nil {
+				tmpMap = make(map[uint16]string)
+			}
+			tmpMap[uint16(key)] = elem
 		}
-		var key uint16
-		{
-			if err := dec.StartValue(vdl.Uint16Type); err != nil {
-				return err
-			}
-			tmp, err := dec.DecodeUint(16)
-			if err != nil {
-				return err
-			}
-			key = uint16(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
-			}
-			var err error
-			if elem, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		if tmpMap == nil {
-			tmpMap = make(map[uint16]string)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -3615,44 +3382,25 @@
 		tmpMap = make(map[uint32]string, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueUint(32); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
+		default:
+			var elem string
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
+				return err
+			default:
+				elem = value
+			}
+			if tmpMap == nil {
+				tmpMap = make(map[uint32]string)
+			}
+			tmpMap[uint32(key)] = elem
 		}
-		var key uint32
-		{
-			if err := dec.StartValue(vdl.Uint32Type); err != nil {
-				return err
-			}
-			tmp, err := dec.DecodeUint(32)
-			if err != nil {
-				return err
-			}
-			key = uint32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
-			}
-			var err error
-			if elem, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		if tmpMap == nil {
-			tmpMap = make(map[uint32]string)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -3665,43 +3413,25 @@
 		tmpMap = make(map[uint64]string, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueUint(64); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
+		default:
+			var elem string
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
+				return err
+			default:
+				elem = value
+			}
+			if tmpMap == nil {
+				tmpMap = make(map[uint64]string)
+			}
+			tmpMap[key] = elem
 		}
-		var key uint64
-		{
-			if err := dec.StartValue(vdl.Uint64Type); err != nil {
-				return err
-			}
-			var err error
-			if key, err = dec.DecodeUint(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
-			}
-			var err error
-			if elem, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		if tmpMap == nil {
-			tmpMap = make(map[uint64]string)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -3714,44 +3444,25 @@
 		tmpMap = make(map[int16]string, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueInt(16); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
+		default:
+			var elem string
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
+				return err
+			default:
+				elem = value
+			}
+			if tmpMap == nil {
+				tmpMap = make(map[int16]string)
+			}
+			tmpMap[int16(key)] = elem
 		}
-		var key int16
-		{
-			if err := dec.StartValue(vdl.Int16Type); err != nil {
-				return err
-			}
-			tmp, err := dec.DecodeInt(16)
-			if err != nil {
-				return err
-			}
-			key = int16(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
-			}
-			var err error
-			if elem, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		if tmpMap == nil {
-			tmpMap = make(map[int16]string)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -3764,44 +3475,25 @@
 		tmpMap = make(map[int32]string, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueInt(32); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
+		default:
+			var elem string
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
+				return err
+			default:
+				elem = value
+			}
+			if tmpMap == nil {
+				tmpMap = make(map[int32]string)
+			}
+			tmpMap[int32(key)] = elem
 		}
-		var key int32
-		{
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
-				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			key = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
-			}
-			var err error
-			if elem, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		if tmpMap == nil {
-			tmpMap = make(map[int32]string)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -3814,43 +3506,25 @@
 		tmpMap = make(map[int64]string, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueInt(64); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
+		default:
+			var elem string
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
+				return err
+			default:
+				elem = value
+			}
+			if tmpMap == nil {
+				tmpMap = make(map[int64]string)
+			}
+			tmpMap[key] = elem
 		}
-		var key int64
-		{
-			if err := dec.StartValue(vdl.Int64Type); err != nil {
-				return err
-			}
-			var err error
-			if key, err = dec.DecodeInt(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
-			}
-			var err error
-			if elem, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		if tmpMap == nil {
-			tmpMap = make(map[int64]string)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -3863,44 +3537,25 @@
 		tmpMap = make(map[float32]string, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueFloat(32); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
+		default:
+			var elem string
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
+				return err
+			default:
+				elem = value
+			}
+			if tmpMap == nil {
+				tmpMap = make(map[float32]string)
+			}
+			tmpMap[float32(key)] = elem
 		}
-		var key float32
-		{
-			if err := dec.StartValue(vdl.Float32Type); err != nil {
-				return err
-			}
-			tmp, err := dec.DecodeFloat(32)
-			if err != nil {
-				return err
-			}
-			key = float32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
-			}
-			var err error
-			if elem, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		if tmpMap == nil {
-			tmpMap = make(map[float32]string)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -3913,43 +3568,25 @@
 		tmpMap = make(map[float64]string, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueFloat(64); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
+		default:
+			var elem string
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
+				return err
+			default:
+				elem = value
+			}
+			if tmpMap == nil {
+				tmpMap = make(map[float64]string)
+			}
+			tmpMap[key] = elem
 		}
-		var key float64
-		{
-			if err := dec.StartValue(vdl.Float64Type); err != nil {
-				return err
-			}
-			var err error
-			if key, err = dec.DecodeFloat(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
-			}
-			var err error
-			if elem, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		if tmpMap == nil {
-			tmpMap = make(map[float64]string)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -3962,43 +3599,25 @@
 		tmpMap = make(map[string]string, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
+		default:
+			var elem string
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
+				return err
+			default:
+				elem = value
+			}
+			if tmpMap == nil {
+				tmpMap = make(map[string]string)
+			}
+			tmpMap[key] = elem
 		}
-		var key string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
-			}
-			var err error
-			if key, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
-			}
-			var err error
-			if elem, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		if tmpMap == nil {
-			tmpMap = make(map[string]string)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -4011,36 +3630,22 @@
 		tmpMap = make(map[string]map[string]string, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
-			}
-			var err error
-			if key, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem map[string]string
-		{
+		default:
+			var elem map[string]string
 			if err := __VDLReadAnon_map_18(dec, &elem); err != nil {
 				return err
 			}
+			if tmpMap == nil {
+				tmpMap = make(map[string]map[string]string)
+			}
+			tmpMap[key] = elem
 		}
-		if tmpMap == nil {
-			tmpMap = make(map[string]map[string]string)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -4059,9 +3664,8 @@
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key time.Time
-		{
+		default:
+			var key time.Time
 			var wire vdltime.Time
 			if err := wire.VDLRead(dec); err != nil {
 				return err
@@ -4069,24 +3673,18 @@
 			if err := vdltime.TimeToNative(wire, &key); err != nil {
 				return err
 			}
-		}
-		var elem string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			var elem string
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
+			default:
+				elem = value
 			}
-			var err error
-			if elem, err = dec.DecodeString(); err != nil {
-				return err
+			if tmpMap == nil {
+				tmpMap = make(map[time.Time]string)
 			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
+			tmpMap[key] = elem
 		}
-		if tmpMap == nil {
-			tmpMap = make(map[time.Time]string)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -4629,30 +4227,18 @@
 		tmpMap = make(map[bool]struct{}, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueBool(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key bool
-		{
-			if err := dec.StartValue(vdl.BoolType); err != nil {
-				return err
+		default:
+			if tmpMap == nil {
+				tmpMap = make(map[bool]struct{})
 			}
-			var err error
-			if key, err = dec.DecodeBool(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
+			tmpMap[key] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(map[bool]struct{})
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -4665,31 +4251,18 @@
 		tmpMap = make(map[byte]struct{}, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueUint(8); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key byte
-		{
-			if err := dec.StartValue(vdl.ByteType); err != nil {
-				return err
+		default:
+			if tmpMap == nil {
+				tmpMap = make(map[byte]struct{})
 			}
-			tmp, err := dec.DecodeUint(8)
-			if err != nil {
-				return err
-			}
-			key = byte(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
+			tmpMap[byte(key)] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(map[byte]struct{})
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -4702,31 +4275,18 @@
 		tmpMap = make(map[uint16]struct{}, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueUint(16); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key uint16
-		{
-			if err := dec.StartValue(vdl.Uint16Type); err != nil {
-				return err
+		default:
+			if tmpMap == nil {
+				tmpMap = make(map[uint16]struct{})
 			}
-			tmp, err := dec.DecodeUint(16)
-			if err != nil {
-				return err
-			}
-			key = uint16(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
+			tmpMap[uint16(key)] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(map[uint16]struct{})
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -4739,31 +4299,18 @@
 		tmpMap = make(map[uint32]struct{}, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueUint(32); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key uint32
-		{
-			if err := dec.StartValue(vdl.Uint32Type); err != nil {
-				return err
+		default:
+			if tmpMap == nil {
+				tmpMap = make(map[uint32]struct{})
 			}
-			tmp, err := dec.DecodeUint(32)
-			if err != nil {
-				return err
-			}
-			key = uint32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
+			tmpMap[uint32(key)] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(map[uint32]struct{})
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -4776,30 +4323,18 @@
 		tmpMap = make(map[uint64]struct{}, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueUint(64); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key uint64
-		{
-			if err := dec.StartValue(vdl.Uint64Type); err != nil {
-				return err
+		default:
+			if tmpMap == nil {
+				tmpMap = make(map[uint64]struct{})
 			}
-			var err error
-			if key, err = dec.DecodeUint(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
+			tmpMap[key] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(map[uint64]struct{})
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -4812,31 +4347,18 @@
 		tmpMap = make(map[int16]struct{}, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueInt(16); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key int16
-		{
-			if err := dec.StartValue(vdl.Int16Type); err != nil {
-				return err
+		default:
+			if tmpMap == nil {
+				tmpMap = make(map[int16]struct{})
 			}
-			tmp, err := dec.DecodeInt(16)
-			if err != nil {
-				return err
-			}
-			key = int16(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
+			tmpMap[int16(key)] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(map[int16]struct{})
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -4849,31 +4371,18 @@
 		tmpMap = make(map[int32]struct{}, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueInt(32); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key int32
-		{
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
-				return err
+		default:
+			if tmpMap == nil {
+				tmpMap = make(map[int32]struct{})
 			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			key = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
+			tmpMap[int32(key)] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(map[int32]struct{})
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -4886,30 +4395,18 @@
 		tmpMap = make(map[int64]struct{}, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueInt(64); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key int64
-		{
-			if err := dec.StartValue(vdl.Int64Type); err != nil {
-				return err
+		default:
+			if tmpMap == nil {
+				tmpMap = make(map[int64]struct{})
 			}
-			var err error
-			if key, err = dec.DecodeInt(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
+			tmpMap[key] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(map[int64]struct{})
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -4922,31 +4419,18 @@
 		tmpMap = make(map[float32]struct{}, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueFloat(32); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key float32
-		{
-			if err := dec.StartValue(vdl.Float32Type); err != nil {
-				return err
+		default:
+			if tmpMap == nil {
+				tmpMap = make(map[float32]struct{})
 			}
-			tmp, err := dec.DecodeFloat(32)
-			if err != nil {
-				return err
-			}
-			key = float32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
+			tmpMap[float32(key)] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(map[float32]struct{})
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -4959,30 +4443,18 @@
 		tmpMap = make(map[float64]struct{}, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueFloat(64); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key float64
-		{
-			if err := dec.StartValue(vdl.Float64Type); err != nil {
-				return err
+		default:
+			if tmpMap == nil {
+				tmpMap = make(map[float64]struct{})
 			}
-			var err error
-			if key, err = dec.DecodeFloat(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
+			tmpMap[key] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(map[float64]struct{})
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -5001,9 +4473,8 @@
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key time.Time
-		{
+		default:
+			var key time.Time
 			var wire vdltime.Time
 			if err := wire.VDLRead(dec); err != nil {
 				return err
@@ -5011,11 +4482,11 @@
 			if err := vdltime.TimeToNative(wire, &key); err != nil {
 				return err
 			}
+			if tmpMap == nil {
+				tmpMap = make(map[time.Time]struct{})
+			}
+			tmpMap[key] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(map[time.Time]struct{})
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -5070,15 +4541,11 @@
 		case "":
 			return dec.FinishValue()
 		case "Key":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Key, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Key = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
diff --git a/rpc/rpc.vdl.go b/rpc/rpc.vdl.go
index bcb6ab4..5207042 100644
--- a/rpc/rpc.vdl.go
+++ b/rpc/rpc.vdl.go
@@ -217,48 +217,32 @@
 		case "":
 			return dec.FinishValue()
 		case "Suffix":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Suffix, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Suffix = value
 			}
 		case "Method":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Method, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Method = value
 			}
 		case "NumPosArgs":
-			if err := dec.StartValue(vdl.Uint64Type); err != nil {
+			switch value, err := dec.ReadValueUint(64); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.NumPosArgs, err = dec.DecodeUint(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.NumPosArgs = value
 			}
 		case "EndStreamArgs":
-			if err := dec.StartValue(vdl.BoolType); err != nil {
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.EndStreamArgs, err = dec.DecodeBool(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.EndStreamArgs = value
 			}
 		case "Deadline":
 			var wire vdltime.WireDeadline
@@ -281,15 +265,11 @@
 				return err
 			}
 		case "Language":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Language, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Language = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -431,41 +411,29 @@
 				return err
 			}
 		case "EndStreamResults":
-			if err := dec.StartValue(vdl.BoolType); err != nil {
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.EndStreamResults, err = dec.DecodeBool(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.EndStreamResults = value
 			}
 		case "NumPosResults":
-			if err := dec.StartValue(vdl.Uint64Type); err != nil {
+			switch value, err := dec.ReadValueUint(64); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.NumPosResults, err = dec.DecodeUint(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.NumPosResults = value
 			}
 		case "TraceResponse":
 			if err := x.TraceResponse.VDLRead(dec); err != nil {
 				return err
 			}
 		case "AckBlessings":
-			if err := dec.StartValue(vdl.BoolType); err != nil {
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.AckBlessings, err = dec.DecodeBool(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.AckBlessings = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
diff --git a/security/access/access.vdl.go b/security/access/access.vdl.go
index d46fae0..2c62566 100644
--- a/security/access/access.vdl.go
+++ b/security/access/access.vdl.go
@@ -262,24 +262,20 @@
 	if err := dec.StartValue(__VDLType_list_2); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make([]security.BlessingPattern, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, elem, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			*x = append(*x, security.BlessingPattern(elem))
 		}
-		var elem security.BlessingPattern
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -287,31 +283,20 @@
 	if err := dec.StartValue(__VDLType_list_3); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make([]string, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, elem, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			*x = append(*x, elem)
 		}
-		var elem string
-		if err := dec.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		var err error
-		if elem, err = dec.DecodeString(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -372,36 +357,22 @@
 		tmpMap = make(Permissions, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
-			}
-			var err error
-			if key, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem AccessList
-		{
+		default:
+			var elem AccessList
 			if err := elem.VDLRead(dec); err != nil {
 				return err
 			}
+			if tmpMap == nil {
+				tmpMap = make(Permissions)
+			}
+			tmpMap[key] = elem
 		}
-		if tmpMap == nil {
-			tmpMap = make(Permissions)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -432,15 +403,13 @@
 }
 
 func (x *Tag) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_string_6); err != nil {
+	switch value, err := dec.ReadValueString(); {
+	case err != nil:
 		return err
+	default:
+		*x = Tag(value)
 	}
-	tmp, err := dec.DecodeString()
-	if err != nil {
-		return err
-	}
-	*x = Tag(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 //////////////////////////////////////////////////
diff --git a/security/access/internal/internal.vdl.go b/security/access/internal/internal.vdl.go
index 787e9cc..4c433eb 100644
--- a/security/access/internal/internal.vdl.go
+++ b/security/access/internal/internal.vdl.go
@@ -45,15 +45,13 @@
 }
 
 func (x *MyTag) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_string_1); err != nil {
+	switch value, err := dec.ReadValueString(); {
+	case err != nil:
 		return err
+	default:
+		*x = MyTag(value)
 	}
-	tmp, err := dec.DecodeString()
-	if err != nil {
-		return err
-	}
-	*x = MyTag(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 //////////////////////////////////////////////////
diff --git a/security/security.vdl.go b/security/security.vdl.go
index 0bc448d..cd1a597 100644
--- a/security/security.vdl.go
+++ b/security/security.vdl.go
@@ -46,14 +46,11 @@
 }
 
 func (x *nonce) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_array_1); err != nil {
-		return err
-	}
 	bytes := x[:]
-	if err := dec.DecodeBytes(16, &bytes); err != nil {
+	if err := dec.ReadValueBytes(16, &bytes); err != nil {
 		return err
 	}
-	return dec.FinishValue()
+	return nil
 }
 
 // Caveat is a condition on the validity of a blessing/discharge.
@@ -130,17 +127,12 @@
 		case "":
 			return dec.FinishValue()
 		case "Id":
-			if err := x.Id.VDLRead(dec); err != nil {
+			bytes := x.Id[:]
+			if err := dec.ReadValueBytes(16, &bytes); err != nil {
 				return err
 			}
 		case "ParamVom":
-			if err := dec.StartValue(__VDLType_list_4); err != nil {
-				return err
-			}
-			if err := dec.DecodeBytes(-1, &x.ParamVom); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
+			if err := dec.ReadValueBytes(-1, &x.ParamVom); err != nil {
 				return err
 			}
 		default:
@@ -237,37 +229,25 @@
 		case "":
 			return dec.FinishValue()
 		case "ReportServer":
-			if err := dec.StartValue(vdl.BoolType); err != nil {
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.ReportServer, err = dec.DecodeBool(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.ReportServer = value
 			}
 		case "ReportMethod":
-			if err := dec.StartValue(vdl.BoolType); err != nil {
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.ReportMethod, err = dec.DecodeBool(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.ReportMethod = value
 			}
 		case "ReportArguments":
-			if err := dec.StartValue(vdl.BoolType); err != nil {
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.ReportArguments, err = dec.DecodeBool(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.ReportArguments = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -428,7 +408,8 @@
 		case "":
 			return dec.FinishValue()
 		case "Nonce":
-			if err := x.Nonce.VDLRead(dec); err != nil {
+			bytes := x.Nonce[:]
+			if err := dec.ReadValueBytes(16, &bytes); err != nil {
 				return err
 			}
 		case "Caveats":
@@ -436,25 +417,15 @@
 				return err
 			}
 		case "DischargerKey":
-			if err := dec.StartValue(__VDLType_list_4); err != nil {
-				return err
-			}
-			if err := dec.DecodeBytes(-1, &x.DischargerKey); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
+			if err := dec.ReadValueBytes(-1, &x.DischargerKey); err != nil {
 				return err
 			}
 		case "DischargerLocation":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.DischargerLocation, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.DischargerLocation = value
 			}
 		case "DischargerRequirements":
 			if err := x.DischargerRequirements.VDLRead(dec); err != nil {
@@ -472,10 +443,9 @@
 	if err := dec.StartValue(__VDLType_list_7); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make([]Caveat, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -484,12 +454,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem Caveat
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem Caveat
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -516,15 +487,13 @@
 }
 
 func (x *Hash) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_string_8); err != nil {
+	switch value, err := dec.ReadValueString(); {
+	case err != nil:
 		return err
+	default:
+		*x = Hash(value)
 	}
-	tmp, err := dec.DecodeString()
-	if err != nil {
-		return err
-	}
-	*x = Hash(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 // Signature represents a digital signature.
@@ -635,37 +604,22 @@
 		case "":
 			return dec.FinishValue()
 		case "Purpose":
-			if err := dec.StartValue(__VDLType_list_4); err != nil {
-				return err
-			}
-			if err := dec.DecodeBytes(-1, &x.Purpose); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
+			if err := dec.ReadValueBytes(-1, &x.Purpose); err != nil {
 				return err
 			}
 		case "Hash":
-			if err := x.Hash.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
+			default:
+				x.Hash = Hash(value)
 			}
 		case "R":
-			if err := dec.StartValue(__VDLType_list_4); err != nil {
-				return err
-			}
-			if err := dec.DecodeBytes(-1, &x.R); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
+			if err := dec.ReadValueBytes(-1, &x.R); err != nil {
 				return err
 			}
 		case "S":
-			if err := dec.StartValue(__VDLType_list_4); err != nil {
-				return err
-			}
-			if err := dec.DecodeBytes(-1, &x.S); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
+			if err := dec.ReadValueBytes(-1, &x.S); err != nil {
 				return err
 			}
 		default:
@@ -762,15 +716,11 @@
 		case "":
 			return dec.FinishValue()
 		case "ThirdPartyCaveatId":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.ThirdPartyCaveatId, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.ThirdPartyCaveatId = value
 			}
 		case "Caveats":
 			if err := __VDLReadAnon_list_1(dec, &x.Caveats); err != nil {
@@ -823,15 +773,13 @@
 }
 
 func (x *BlessingPattern) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_string_11); err != nil {
+	switch value, err := dec.ReadValueString(); {
+	case err != nil:
 		return err
+	default:
+		*x = BlessingPattern(value)
 	}
-	tmp, err := dec.DecodeString()
-	if err != nil {
-		return err
-	}
-	*x = BlessingPattern(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 // DischargeImpetus encapsulates the motivation for a discharge being sought.
@@ -974,15 +922,11 @@
 				return err
 			}
 		case "Method":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Method, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Method = value
 			}
 		case "Arguments":
 			if err := __VDLReadAnon_list_3(dec, &x.Arguments); err != nil {
@@ -1000,24 +944,20 @@
 	if err := dec.StartValue(__VDLType_list_13); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make([]BlessingPattern, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, elem, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			*x = append(*x, BlessingPattern(elem))
 		}
-		var elem BlessingPattern
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -1025,10 +965,9 @@
 	if err := dec.StartValue(__VDLType_list_14); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make([]*vom.RawBytes, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -1037,13 +976,14 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem *vom.RawBytes
+			elem = new(vom.RawBytes)
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem *vom.RawBytes
-		elem = new(vom.RawBytes)
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -1150,24 +1090,14 @@
 		case "":
 			return dec.FinishValue()
 		case "Extension":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Extension, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Extension = value
 			}
 		case "PublicKey":
-			if err := dec.StartValue(__VDLType_list_4); err != nil {
-				return err
-			}
-			if err := dec.DecodeBytes(-1, &x.PublicKey); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
+			if err := dec.ReadValueBytes(-1, &x.PublicKey); err != nil {
 				return err
 			}
 		case "Caveats":
@@ -1254,19 +1184,16 @@
 		case "":
 			return dec.FinishValue()
 		case "Id":
-			if err := x.Id.VDLRead(dec); err != nil {
+			bytes := x.Id[:]
+			if err := dec.ReadValueBytes(16, &bytes); err != nil {
 				return err
 			}
 		case "ParamType":
-			if err := dec.StartValue(vdl.TypeObjectType); err != nil {
+			switch value, err := dec.ReadValueTypeObject(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.ParamType, err = dec.DecodeTypeObject(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.ParamType = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -1391,10 +1318,9 @@
 	if err := dec.StartValue(__VDLType_list_18); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make([][]Certificate, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -1403,12 +1329,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem []Certificate
+			if err := __VDLReadAnon_list_5(dec, &elem); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem []Certificate
-		if err := __VDLReadAnon_list_5(dec, &elem); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -1416,10 +1343,9 @@
 	if err := dec.StartValue(__VDLType_list_19); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make([]Certificate, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -1428,12 +1354,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem Certificate
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem Certificate
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -1581,15 +1508,11 @@
 		case "":
 			return dec.FinishValue()
 		case "Blessing":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Blessing, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Blessing = value
 			}
 		case "Err":
 			if err := verror.VDLRead(dec, &x.Err); err != nil {
diff --git a/services/appcycle/appcycle.vdl.go b/services/appcycle/appcycle.vdl.go
index 655e4da..1c19aa3 100644
--- a/services/appcycle/appcycle.vdl.go
+++ b/services/appcycle/appcycle.vdl.go
@@ -97,28 +97,18 @@
 		case "":
 			return dec.FinishValue()
 		case "Progress":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.Progress = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Progress = int32(value)
 			}
 		case "Goal":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.Goal = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Goal = int32(value)
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
diff --git a/services/application/application.vdl.go b/services/application/application.vdl.go
index 3a36336..cc920d3 100644
--- a/services/application/application.vdl.go
+++ b/services/application/application.vdl.go
@@ -90,15 +90,11 @@
 		case "":
 			return dec.FinishValue()
 		case "File":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.File, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.File = value
 			}
 		case "Signature":
 			if err := x.Signature.VDLRead(dec); err != nil {
@@ -179,36 +175,22 @@
 		tmpMap = make(Packages, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
-			}
-			var err error
-			if key, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem SignedFile
-		{
+		default:
+			var elem SignedFile
 			if err := elem.VDLRead(dec); err != nil {
 				return err
 			}
+			if tmpMap == nil {
+				tmpMap = make(Packages)
+			}
+			tmpMap[key] = elem
 		}
-		if tmpMap == nil {
-			tmpMap = make(Packages)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -419,15 +401,11 @@
 		case "":
 			return dec.FinishValue()
 		case "Title":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Title, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Title = value
 			}
 		case "Args":
 			if err := __VDLReadAnon_list_1(dec, &x.Args); err != nil {
@@ -454,16 +432,11 @@
 				return err
 			}
 		case "Restarts":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.Restarts = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Restarts = int32(value)
 			}
 		case "RestartTimeWindow":
 			var wire vdltime.Duration
@@ -485,31 +458,20 @@
 	if err := dec.StartValue(__VDLType_list_5); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make([]string, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, elem, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			*x = append(*x, elem)
 		}
-		var elem string
-		if err := dec.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		var err error
-		if elem, err = dec.DecodeString(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
diff --git a/services/binary/binary.vdl.go b/services/binary/binary.vdl.go
index e4041b9..1d01299 100644
--- a/services/binary/binary.vdl.go
+++ b/services/binary/binary.vdl.go
@@ -136,15 +136,11 @@
 		case "":
 			return dec.FinishValue()
 		case "Name":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Name, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Name = value
 			}
 		case "Profiles":
 			if err := __VDLReadAnon_map_1(dec, &x.Profiles); err != nil {
@@ -167,43 +163,25 @@
 		tmpMap = make(map[string]bool, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
+		default:
+			var elem bool
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
+				return err
+			default:
+				elem = value
+			}
+			if tmpMap == nil {
+				tmpMap = make(map[string]bool)
+			}
+			tmpMap[key] = elem
 		}
-		var key string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
-			}
-			var err error
-			if key, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem bool
-		{
-			if err := dec.StartValue(vdl.BoolType); err != nil {
-				return err
-			}
-			var err error
-			if elem, err = dec.DecodeBool(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		if tmpMap == nil {
-			tmpMap = make(map[string]bool)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -276,26 +254,18 @@
 		case "":
 			return dec.FinishValue()
 		case "Checksum":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Checksum, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Checksum = value
 			}
 		case "Size":
-			if err := dec.StartValue(vdl.Int64Type); err != nil {
+			switch value, err := dec.ReadValueInt(64); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Size, err = dec.DecodeInt(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Size = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
diff --git a/services/build/build.vdl.go b/services/build/build.vdl.go
index 2d29e4e..3ed327f 100644
--- a/services/build/build.vdl.go
+++ b/services/build/build.vdl.go
@@ -92,17 +92,15 @@
 }
 
 func (x *Architecture) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_enum_1); err != nil {
+	switch value, err := dec.ReadValueString(); {
+	case err != nil:
 		return err
+	default:
+		if err := x.Set(value); err != nil {
+			return err
+		}
 	}
-	enum, err := dec.DecodeString()
-	if err != nil {
-		return err
-	}
-	if err := x.Set(enum); err != nil {
-		return err
-	}
-	return dec.FinishValue()
+	return nil
 }
 
 // Format specifies the file format of a host.
@@ -174,17 +172,15 @@
 }
 
 func (x *Format) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_enum_2); err != nil {
+	switch value, err := dec.ReadValueString(); {
+	case err != nil:
 		return err
+	default:
+		if err := x.Set(value); err != nil {
+			return err
+		}
 	}
-	enum, err := dec.DecodeString()
-	if err != nil {
-		return err
-	}
-	if err := x.Set(enum); err != nil {
-		return err
-	}
-	return dec.FinishValue()
+	return nil
 }
 
 // OperatingSystem specifies the operating system of a host.
@@ -262,17 +258,15 @@
 }
 
 func (x *OperatingSystem) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_enum_3); err != nil {
+	switch value, err := dec.ReadValueString(); {
+	case err != nil:
 		return err
+	default:
+		if err := x.Set(value); err != nil {
+			return err
+		}
 	}
-	enum, err := dec.DecodeString()
-	if err != nil {
-		return err
-	}
-	if err := x.Set(enum); err != nil {
-		return err
-	}
-	return dec.FinishValue()
+	return nil
 }
 
 // File records the name and contents of a file.
@@ -348,24 +342,14 @@
 		case "":
 			return dec.FinishValue()
 		case "Name":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Name, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Name = value
 			}
 		case "Contents":
-			if err := dec.StartValue(__VDLType_list_5); err != nil {
-				return err
-			}
-			if err := dec.DecodeBytes(-1, &x.Contents); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
+			if err := dec.ReadValueBytes(-1, &x.Contents); err != nil {
 				return err
 			}
 		default:
diff --git a/services/device/device.vdl.go b/services/device/device.vdl.go
index 6b15ddd..f0fbf13 100644
--- a/services/device/device.vdl.go
+++ b/services/device/device.vdl.go
@@ -88,43 +88,25 @@
 		tmpMap = make(Config, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
+		default:
+			var elem string
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
+				return err
+			default:
+				elem = value
+			}
+			if tmpMap == nil {
+				tmpMap = make(Config)
+			}
+			tmpMap[key] = elem
 		}
-		var key string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
-			}
-			var err error
-			if key, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
-			}
-			var err error
-			if elem, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		if tmpMap == nil {
-			tmpMap = make(Config)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -192,17 +174,15 @@
 }
 
 func (x *InstallationState) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_enum_2); err != nil {
+	switch value, err := dec.ReadValueString(); {
+	case err != nil:
 		return err
+	default:
+		if err := x.Set(value); err != nil {
+			return err
+		}
 	}
-	enum, err := dec.DecodeString()
-	if err != nil {
-		return err
-	}
-	if err := x.Set(enum); err != nil {
-		return err
-	}
-	return dec.FinishValue()
+	return nil
 }
 
 // InstanceState describes the states that an instance can be in at any
@@ -293,17 +273,15 @@
 }
 
 func (x *InstanceState) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_enum_3); err != nil {
+	switch value, err := dec.ReadValueString(); {
+	case err != nil:
 		return err
+	default:
+		if err := x.Set(value); err != nil {
+			return err
+		}
 	}
-	enum, err := dec.DecodeString()
-	if err != nil {
-		return err
-	}
-	if err := x.Set(enum); err != nil {
-		return err
-	}
-	return dec.FinishValue()
+	return nil
 }
 
 // InstanceStatus specifies the Status returned by the Application Status method
@@ -368,19 +346,20 @@
 		case "":
 			return dec.FinishValue()
 		case "State":
-			if err := x.State.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
+			default:
+				if err := x.State.Set(value); err != nil {
+					return err
+				}
 			}
 		case "Version":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Version, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Version = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -452,19 +431,20 @@
 		case "":
 			return dec.FinishValue()
 		case "State":
-			if err := x.State.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
+			default:
+				if err := x.State.Set(value); err != nil {
+					return err
+				}
 			}
 		case "Version":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Version, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Version = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -536,19 +516,20 @@
 		case "":
 			return dec.FinishValue()
 		case "State":
-			if err := x.State.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
+			default:
+				if err := x.State.Set(value); err != nil {
+					return err
+				}
 			}
 		case "Version":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Version, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Version = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -783,13 +764,7 @@
 	switch f {
 	case "InstancePublicKey":
 		var field BlessServerMessageInstancePublicKey
-		if err := dec.StartValue(__VDLType_list_8); err != nil {
-			return err
-		}
-		if err := dec.DecodeBytes(-1, &field.Value); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
+		if err := dec.ReadValueBytes(-1, &field.Value); err != nil {
 			return err
 		}
 		*x = field
@@ -1005,30 +980,18 @@
 		tmpMap = make(map[string]struct{}, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
+		default:
+			if tmpMap == nil {
+				tmpMap = make(map[string]struct{})
 			}
-			var err error
-			if key, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
+			tmpMap[key] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(map[string]struct{})
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -1100,26 +1063,18 @@
 		case "":
 			return dec.FinishValue()
 		case "IdentityName":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.IdentityName, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.IdentityName = value
 			}
 		case "AccountName":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.AccountName, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.AccountName = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
diff --git a/services/groups/groups.vdl.go b/services/groups/groups.vdl.go
index 58f3356..28bdb6b 100644
--- a/services/groups/groups.vdl.go
+++ b/services/groups/groups.vdl.go
@@ -53,15 +53,13 @@
 }
 
 func (x *BlessingPatternChunk) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_string_1); err != nil {
+	switch value, err := dec.ReadValueString(); {
+	case err != nil:
 		return err
+	default:
+		*x = BlessingPatternChunk(value)
 	}
-	tmp, err := dec.DecodeString()
-	if err != nil {
-		return err
-	}
-	*x = BlessingPatternChunk(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 type GetRequest struct {
@@ -196,23 +194,18 @@
 		tmpMap = make(map[BlessingPatternChunk]struct{}, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key BlessingPatternChunk
-		{
-			if err := key.VDLRead(dec); err != nil {
-				return err
+		default:
+			if tmpMap == nil {
+				tmpMap = make(map[BlessingPatternChunk]struct{})
 			}
+			tmpMap[BlessingPatternChunk(key)] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(map[BlessingPatternChunk]struct{})
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -283,17 +276,15 @@
 }
 
 func (x *ApproximationType) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_enum_5); err != nil {
+	switch value, err := dec.ReadValueString(); {
+	case err != nil:
 		return err
+	default:
+		if err := x.Set(value); err != nil {
+			return err
+		}
 	}
-	enum, err := dec.DecodeString()
-	if err != nil {
-		return err
-	}
-	if err := x.Set(enum); err != nil {
-		return err
-	}
-	return dec.FinishValue()
+	return nil
 }
 
 // Approximation contains information about membership approximations made
@@ -364,26 +355,18 @@
 		case "":
 			return dec.FinishValue()
 		case "Reason":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Reason, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Reason = value
 			}
 		case "Details":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Details, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Details = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
diff --git a/services/logreader/logreader.vdl.go b/services/logreader/logreader.vdl.go
index 14768b5..4f7cf28 100644
--- a/services/logreader/logreader.vdl.go
+++ b/services/logreader/logreader.vdl.go
@@ -91,26 +91,18 @@
 		case "":
 			return dec.FinishValue()
 		case "Position":
-			if err := dec.StartValue(vdl.Int64Type); err != nil {
+			switch value, err := dec.ReadValueInt(64); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Position, err = dec.DecodeInt(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Position = value
 			}
 		case "Line":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Line, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Line = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
diff --git a/services/mounttable/mounttable.vdl.go b/services/mounttable/mounttable.vdl.go
index 4ad044d..d82f2ae 100644
--- a/services/mounttable/mounttable.vdl.go
+++ b/services/mounttable/mounttable.vdl.go
@@ -54,15 +54,13 @@
 }
 
 func (x *Tag) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_string_1); err != nil {
+	switch value, err := dec.ReadValueString(); {
+	case err != nil:
 		return err
+	default:
+		*x = Tag(value)
 	}
-	tmp, err := dec.DecodeString()
-	if err != nil {
-		return err
-	}
-	*x = Tag(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 //////////////////////////////////////////////////
diff --git a/services/repository/repository.vdl.go b/services/repository/repository.vdl.go
index dae3aa4..3050faf 100644
--- a/services/repository/repository.vdl.go
+++ b/services/repository/repository.vdl.go
@@ -94,26 +94,18 @@
 		case "":
 			return dec.FinishValue()
 		case "Type":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Type, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Type = value
 			}
 		case "Encoding":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Encoding, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Encoding = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
diff --git a/services/syncbase/syncbase.vdl.go b/services/syncbase/syncbase.vdl.go
index 381c621..8469ae5 100644
--- a/services/syncbase/syncbase.vdl.go
+++ b/services/syncbase/syncbase.vdl.go
@@ -102,26 +102,18 @@
 		case "":
 			return dec.FinishValue()
 		case "Blessing":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Blessing, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Blessing = value
 			}
 		case "Name":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Name, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Name = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -263,15 +255,11 @@
 		case "":
 			return dec.FinishValue()
 		case "NtpHost":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.NtpHost, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.NtpHost = value
 			}
 		case "Now":
 			var wire vdltime.Time
@@ -290,26 +278,18 @@
 				return err
 			}
 		case "DoNtpUpdate":
-			if err := dec.StartValue(vdl.BoolType); err != nil {
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.DoNtpUpdate, err = dec.DecodeBool(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.DoNtpUpdate = value
 			}
 		case "DoLocalUpdate":
-			if err := dec.StartValue(vdl.BoolType); err != nil {
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.DoLocalUpdate, err = dec.DecodeBool(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.DoLocalUpdate = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -399,26 +379,18 @@
 		case "":
 			return dec.FinishValue()
 		case "Hint":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Hint, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Hint = value
 			}
 		case "ReadOnly":
-			if err := dec.StartValue(vdl.BoolType); err != nil {
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.ReadOnly, err = dec.DecodeBool(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.ReadOnly = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -451,15 +423,13 @@
 }
 
 func (x *BatchHandle) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_string_6); err != nil {
+	switch value, err := dec.ReadValueString(); {
+	case err != nil:
 		return err
+	default:
+		*x = BatchHandle(value)
 	}
-	tmp, err := dec.DecodeString()
-	if err != nil {
-		return err
-	}
-	*x = BatchHandle(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 // KeyValue is a key-value pair.
@@ -531,15 +501,11 @@
 		case "":
 			return dec.FinishValue()
 		case "Key":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Key, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Key = value
 			}
 		case "Value":
 			x.Value = new(vom.RawBytes)
@@ -619,15 +585,11 @@
 				return err
 			}
 		case "Row":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Row, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Row = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -828,26 +790,18 @@
 		case "":
 			return dec.FinishValue()
 		case "Description":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Description, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Description = value
 			}
 		case "PublishSyncbaseName":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.PublishSyncbaseName, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.PublishSyncbaseName = value
 			}
 		case "Perms":
 			if err := x.Perms.VDLRead(dec); err != nil {
@@ -862,15 +816,11 @@
 				return err
 			}
 		case "IsPrivate":
-			if err := dec.StartValue(vdl.BoolType); err != nil {
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.IsPrivate, err = dec.DecodeBool(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.IsPrivate = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -884,10 +834,9 @@
 	if err := dec.StartValue(__VDLType_list_11); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make([]Id, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -896,12 +845,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem Id
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem Id
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -909,31 +859,20 @@
 	if err := dec.StartValue(__VDLType_list_12); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make([]string, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, elem, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			*x = append(*x, elem)
 		}
-		var elem string
-		if err := dec.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		var err error
-		if elem, err = dec.DecodeString(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -1004,28 +943,18 @@
 		case "":
 			return dec.FinishValue()
 		case "SyncPriority":
-			if err := dec.StartValue(vdl.ByteType); err != nil {
+			switch value, err := dec.ReadValueUint(8); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeUint(8)
-			if err != nil {
-				return err
-			}
-			x.SyncPriority = byte(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.SyncPriority = byte(value)
 			}
 		case "BlobDevType":
-			if err := dec.StartValue(vdl.ByteType); err != nil {
+			switch value, err := dec.ReadValueUint(8); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeUint(8)
-			if err != nil {
-				return err
-			}
-			x.BlobDevType = byte(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.BlobDevType = byte(value)
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -1114,17 +1043,15 @@
 }
 
 func (x *ResolverType) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_enum_14); err != nil {
+	switch value, err := dec.ReadValueString(); {
+	case err != nil:
 		return err
+	default:
+		if err := x.Set(value); err != nil {
+			return err
+		}
 	}
-	enum, err := dec.DecodeString()
-	if err != nil {
-		return err
-	}
-	if err := x.Set(enum); err != nil {
-		return err
-	}
-	return dec.FinishValue()
+	return nil
 }
 
 // BatchSource represents where the batch was committed.
@@ -1190,17 +1117,15 @@
 }
 
 func (x *BatchSource) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_enum_15); err != nil {
+	switch value, err := dec.ReadValueString(); {
+	case err != nil:
 		return err
+	default:
+		if err := x.Set(value); err != nil {
+			return err
+		}
 	}
-	enum, err := dec.DecodeString()
-	if err != nil {
-		return err
-	}
-	if err := x.Set(enum); err != nil {
-		return err
-	}
-	return dec.FinishValue()
+	return nil
 }
 
 type BatchInfo struct {
@@ -1284,30 +1209,27 @@
 		case "":
 			return dec.FinishValue()
 		case "Id":
-			if err := dec.StartValue(vdl.Uint64Type); err != nil {
+			switch value, err := dec.ReadValueUint(64); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Id, err = dec.DecodeUint(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Id = value
 			}
 		case "Hint":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Hint, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Hint = value
 			}
 		case "Source":
-			if err := x.Source.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
+			default:
+				if err := x.Source.Set(value); err != nil {
+					return err
+				}
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -1393,17 +1315,15 @@
 }
 
 func (x *ValueState) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_enum_17); err != nil {
+	switch value, err := dec.ReadValueString(); {
+	case err != nil:
 		return err
+	default:
+		if err := x.Set(value); err != nil {
+			return err
+		}
 	}
-	enum, err := dec.DecodeString()
-	if err != nil {
-		return err
-	}
-	if err := x.Set(enum); err != nil {
-		return err
-	}
-	return dec.FinishValue()
+	return nil
 }
 
 // Value contains the encoded bytes for a row's value stored in syncbase.
@@ -1489,8 +1409,13 @@
 		case "":
 			return dec.FinishValue()
 		case "State":
-			if err := x.State.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
+			default:
+				if err := x.State.Set(value); err != nil {
+					return err
+				}
 			}
 		case "Bytes":
 			x.Bytes = new(vom.RawBytes)
@@ -1608,15 +1533,11 @@
 		case "":
 			return dec.FinishValue()
 		case "Key":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Key, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Key = value
 			}
 		case "LocalValue":
 			if err := dec.StartValue(__VDLType_optional_20); err != nil {
@@ -1743,26 +1664,18 @@
 		case "":
 			return dec.FinishValue()
 		case "Start":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Start, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Start = value
 			}
 		case "Limit":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Limit, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Limit = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -2051,31 +1964,20 @@
 	if err := dec.StartValue(__VDLType_list_24); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make([]uint64, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, elem, err := dec.NextEntryValueUint(64); {
 		case err != nil:
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			*x = append(*x, elem)
 		}
-		var elem uint64
-		if err := dec.StartValue(vdl.Uint64Type); err != nil {
-			return err
-		}
-		var err error
-		if elem, err = dec.DecodeUint(64); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -2279,15 +2181,11 @@
 				return err
 			}
 		case "Continued":
-			if err := dec.StartValue(vdl.BoolType); err != nil {
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Continued, err = dec.DecodeBool(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Continued = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -2367,17 +2265,15 @@
 }
 
 func (x *ValueSelection) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_enum_27); err != nil {
+	switch value, err := dec.ReadValueString(); {
+	case err != nil:
 		return err
+	default:
+		if err := x.Set(value); err != nil {
+			return err
+		}
 	}
-	enum, err := dec.DecodeString()
-	if err != nil {
-		return err
-	}
-	if err := x.Set(enum); err != nil {
-		return err
-	}
-	return dec.FinishValue()
+	return nil
 }
 
 // ResolutionInfo contains the application’s reply to a conflict for a key,
@@ -2479,19 +2375,20 @@
 		case "":
 			return dec.FinishValue()
 		case "Key":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Key, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Key = value
 			}
 		case "Selection":
-			if err := x.Selection.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
+			default:
+				if err := x.Selection.Set(value); err != nil {
+					return err
+				}
 			}
 		case "Result":
 			if err := dec.StartValue(__VDLType_optional_20); err != nil {
@@ -2510,15 +2407,11 @@
 				}
 			}
 		case "Continued":
-			if err := dec.StartValue(vdl.BoolType); err != nil {
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Continued, err = dec.DecodeBool(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Continued = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -2624,30 +2517,27 @@
 				return err
 			}
 		case "KeyPrefix":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.KeyPrefix, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.KeyPrefix = value
 			}
 		case "Type":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Type, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Type = value
 			}
 		case "Resolver":
-			if err := x.Resolver.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
+			default:
+				if err := x.Resolver.Set(value); err != nil {
+					return err
+				}
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -2747,10 +2637,9 @@
 	if err := dec.StartValue(__VDLType_list_31); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make([]CrRule, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -2759,12 +2648,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem CrRule
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem CrRule
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -2841,16 +2731,11 @@
 		case "":
 			return dec.FinishValue()
 		case "Version":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.Version = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Version = int32(value)
 			}
 		case "Policy":
 			if err := x.Policy.VDLRead(dec); err != nil {
@@ -2887,15 +2772,13 @@
 }
 
 func (x *BlobRef) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_string_33); err != nil {
+	switch value, err := dec.ReadValueString(); {
+	case err != nil:
 		return err
+	default:
+		*x = BlobRef(value)
 	}
-	tmp, err := dec.DecodeString()
-	if err != nil {
-		return err
-	}
-	*x = BlobRef(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 // BlobFetchState represents the state transitions of a blob fetch.
@@ -2973,17 +2856,15 @@
 }
 
 func (x *BlobFetchState) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_enum_34); err != nil {
+	switch value, err := dec.ReadValueString(); {
+	case err != nil:
 		return err
+	default:
+		if err := x.Set(value); err != nil {
+			return err
+		}
 	}
-	enum, err := dec.DecodeString()
-	if err != nil {
-		return err
-	}
-	if err := x.Set(enum); err != nil {
-		return err
-	}
-	return dec.FinishValue()
+	return nil
 }
 
 // BlobFetchStatus describes the progress of an asynchronous blob fetch.
@@ -3062,30 +2943,27 @@
 		case "":
 			return dec.FinishValue()
 		case "State":
-			if err := x.State.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
+			default:
+				if err := x.State.Set(value); err != nil {
+					return err
+				}
 			}
 		case "Received":
-			if err := dec.StartValue(vdl.Int64Type); err != nil {
+			switch value, err := dec.ReadValueInt(64); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Received, err = dec.DecodeInt(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Received = value
 			}
 		case "Total":
-			if err := dec.StartValue(vdl.Int64Type); err != nil {
+			switch value, err := dec.ReadValueInt(64); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Total, err = dec.DecodeInt(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Total = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -3181,37 +3059,25 @@
 		case "":
 			return dec.FinishValue()
 		case "CollectionBlessing":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.CollectionBlessing, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.CollectionBlessing = value
 			}
 		case "CollectionName":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.CollectionName, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.CollectionName = value
 			}
 		case "RowKey":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.RowKey, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.RowKey = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -3300,15 +3166,11 @@
 				return err
 			}
 		case "FromSync":
-			if err := dec.StartValue(vdl.BoolType); err != nil {
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.FromSync, err = dec.DecodeBool(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.FromSync = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
diff --git a/services/watch/watch.vdl.go b/services/watch/watch.vdl.go
index d8f3d2f..76f23a0 100644
--- a/services/watch/watch.vdl.go
+++ b/services/watch/watch.vdl.go
@@ -177,15 +177,12 @@
 }
 
 func (x *ResumeMarker) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_list_1); err != nil {
-		return err
-	}
 	var bytes []byte
-	if err := dec.DecodeBytes(-1, &bytes); err != nil {
+	if err := dec.ReadValueBytes(-1, &bytes); err != nil {
 		return err
 	}
 	*x = bytes
-	return dec.FinishValue()
+	return nil
 }
 
 // GlobRequest specifies which entities should be watched and, optionally,
@@ -260,20 +257,18 @@
 		case "":
 			return dec.FinishValue()
 		case "Pattern":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Pattern, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Pattern = value
 			}
 		case "ResumeMarker":
-			if err := x.ResumeMarker.VDLRead(dec); err != nil {
+			var bytes []byte
+			if err := dec.ReadValueBytes(-1, &bytes); err != nil {
 				return err
 			}
+			x.ResumeMarker = bytes
 		default:
 			if err := dec.SkipValue(); err != nil {
 				return err
@@ -411,27 +406,18 @@
 		case "":
 			return dec.FinishValue()
 		case "Name":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Name, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Name = value
 			}
 		case "State":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.State = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.State = int32(value)
 			}
 		case "Value":
 			x.Value = new(vom.RawBytes)
@@ -439,19 +425,17 @@
 				return err
 			}
 		case "ResumeMarker":
-			if err := x.ResumeMarker.VDLRead(dec); err != nil {
+			var bytes []byte
+			if err := dec.ReadValueBytes(-1, &bytes); err != nil {
 				return err
 			}
+			x.ResumeMarker = bytes
 		case "Continued":
-			if err := dec.StartValue(vdl.BoolType); err != nil {
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Continued, err = dec.DecodeBool(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Continued = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
diff --git a/syncbase/syncbase.vdl.go b/syncbase/syncbase.vdl.go
index b2cf4a2..e0e9292 100644
--- a/syncbase/syncbase.vdl.go
+++ b/syncbase/syncbase.vdl.go
@@ -118,8 +118,13 @@
 		case "":
 			return dec.FinishValue()
 		case "State":
-			if err := x.State.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
+			default:
+				if err := x.State.Set(value); err != nil {
+					return err
+				}
 			}
 		case "Val":
 			x.Val = new(vom.RawBytes)
@@ -135,8 +140,13 @@
 				return err
 			}
 		case "Selection":
-			if err := x.Selection.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
+			default:
+				if err := x.Selection.Set(value); err != nil {
+					return err
+				}
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -293,15 +303,11 @@
 		case "":
 			return dec.FinishValue()
 		case "Key":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Key, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Key = value
 			}
 		case "LocalValue":
 			if err := x.LocalValue.VDLRead(dec); err != nil {
@@ -331,31 +337,20 @@
 	if err := dec.StartValue(__VDLType_list_6); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make([]uint64, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, elem, err := dec.NextEntryValueUint(64); {
 		case err != nil:
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			*x = append(*x, elem)
 		}
-		var elem uint64
-		if err := dec.StartValue(vdl.Uint64Type); err != nil {
-			return err
-		}
-		var err error
-		if elem, err = dec.DecodeUint(64); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -529,36 +524,22 @@
 		tmpMap = make(map[string]ConflictRow, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
-			}
-			var err error
-			if key, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem ConflictRow
-		{
+		default:
+			var elem ConflictRow
 			if err := elem.VDLRead(dec); err != nil {
 				return err
 			}
+			if tmpMap == nil {
+				tmpMap = make(map[string]ConflictRow)
+			}
+			tmpMap[key] = elem
 		}
-		if tmpMap == nil {
-			tmpMap = make(map[string]ConflictRow)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -571,36 +552,22 @@
 		tmpMap = make(map[uint64][]ConflictRow, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueUint(64); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key uint64
-		{
-			if err := dec.StartValue(vdl.Uint64Type); err != nil {
-				return err
-			}
-			var err error
-			if key, err = dec.DecodeUint(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem []ConflictRow
-		{
+		default:
+			var elem []ConflictRow
 			if err := __VDLReadAnon_list_4(dec, &elem); err != nil {
 				return err
 			}
+			if tmpMap == nil {
+				tmpMap = make(map[uint64][]ConflictRow)
+			}
+			tmpMap[key] = elem
 		}
-		if tmpMap == nil {
-			tmpMap = make(map[uint64][]ConflictRow)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -608,10 +575,9 @@
 	if err := dec.StartValue(__VDLType_list_10); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make([]ConflictRow, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -620,12 +586,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem ConflictRow
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem ConflictRow
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -750,36 +717,22 @@
 		tmpMap = make(map[uint64][]syncbase.ScanOp, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueUint(64); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key uint64
-		{
-			if err := dec.StartValue(vdl.Uint64Type); err != nil {
-				return err
-			}
-			var err error
-			if key, err = dec.DecodeUint(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem []syncbase.ScanOp
-		{
+		default:
+			var elem []syncbase.ScanOp
 			if err := __VDLReadAnon_list_6(dec, &elem); err != nil {
 				return err
 			}
+			if tmpMap == nil {
+				tmpMap = make(map[uint64][]syncbase.ScanOp)
+			}
+			tmpMap[key] = elem
 		}
-		if tmpMap == nil {
-			tmpMap = make(map[uint64][]syncbase.ScanOp)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -787,10 +740,9 @@
 	if err := dec.StartValue(__VDLType_list_13); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make([]syncbase.ScanOp, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -799,12 +751,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem syncbase.ScanOp
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem syncbase.ScanOp
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -1013,36 +966,22 @@
 		tmpMap = make(map[uint64]syncbase.BatchInfo, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueUint(64); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key uint64
-		{
-			if err := dec.StartValue(vdl.Uint64Type); err != nil {
-				return err
-			}
-			var err error
-			if key, err = dec.DecodeUint(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem syncbase.BatchInfo
-		{
+		default:
+			var elem syncbase.BatchInfo
 			if err := elem.VDLRead(dec); err != nil {
 				return err
 			}
+			if tmpMap == nil {
+				tmpMap = make(map[uint64]syncbase.BatchInfo)
+			}
+			tmpMap[key] = elem
 		}
-		if tmpMap == nil {
-			tmpMap = make(map[uint64]syncbase.BatchInfo)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -1113,15 +1052,11 @@
 		case "":
 			return dec.FinishValue()
 		case "Key":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Key, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Key = value
 			}
 		case "Result":
 			if err := dec.StartValue(__VDLType_optional_21); err != nil {
@@ -1249,36 +1184,22 @@
 		tmpMap = make(map[string]ResolvedRow, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
-			}
-			var err error
-			if key, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem ResolvedRow
-		{
+		default:
+			var elem ResolvedRow
 			if err := elem.VDLRead(dec); err != nil {
 				return err
 			}
+			if tmpMap == nil {
+				tmpMap = make(map[string]ResolvedRow)
+			}
+			tmpMap[key] = elem
 		}
-		if tmpMap == nil {
-			tmpMap = make(map[string]ResolvedRow)
-		}
-		tmpMap[key] = elem
 	}
 }
 
diff --git a/syncbase/testdata/testdata.vdl.go b/syncbase/testdata/testdata.vdl.go
index 9488a3e..3e05d6c 100644
--- a/syncbase/testdata/testdata.vdl.go
+++ b/syncbase/testdata/testdata.vdl.go
@@ -115,48 +115,32 @@
 		case "":
 			return dec.FinishValue()
 		case "Street":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Street, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Street = value
 			}
 		case "City":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.City, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.City = value
 			}
 		case "State":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.State, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.State = value
 			}
 		case "Zip":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Zip, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Zip = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -234,17 +218,15 @@
 }
 
 func (x *CreditAgency) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_enum_2); err != nil {
+	switch value, err := dec.ReadValueString(); {
+	case err != nil:
 		return err
+	default:
+		if err := x.Set(value); err != nil {
+			return err
+		}
 	}
-	enum, err := dec.DecodeString()
-	if err != nil {
-		return err
-	}
-	if err := x.Set(enum); err != nil {
-		return err
-	}
-	return dec.FinishValue()
+	return nil
 }
 
 type ExperianRating int
@@ -309,17 +291,15 @@
 }
 
 func (x *ExperianRating) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_enum_3); err != nil {
+	switch value, err := dec.ReadValueString(); {
+	case err != nil:
 		return err
+	default:
+		if err := x.Set(value); err != nil {
+			return err
+		}
 	}
-	enum, err := dec.DecodeString()
-	if err != nil {
-		return err
-	}
-	if err := x.Set(enum); err != nil {
-		return err
-	}
-	return dec.FinishValue()
+	return nil
 }
 
 type EquifaxCreditReport struct {
@@ -373,16 +353,11 @@
 		case "":
 			return dec.FinishValue()
 		case "Rating":
-			if err := dec.StartValue(vdl.ByteType); err != nil {
+			switch value, err := dec.ReadValueUint(8); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeUint(8)
-			if err != nil {
-				return err
-			}
-			x.Rating = byte(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Rating = byte(value)
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -437,8 +412,13 @@
 		case "":
 			return dec.FinishValue()
 		case "Rating":
-			if err := x.Rating.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
+			default:
+				if err := x.Rating.Set(value); err != nil {
+					return err
+				}
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -499,16 +479,11 @@
 		case "":
 			return dec.FinishValue()
 		case "Rating":
-			if err := dec.StartValue(vdl.Int16Type); err != nil {
+			switch value, err := dec.ReadValueInt(16); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(16)
-			if err != nil {
-				return err
-			}
-			x.Rating = int16(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Rating = int16(value)
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -728,8 +703,13 @@
 		case "":
 			return dec.FinishValue()
 		case "Agency":
-			if err := x.Agency.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
+			default:
+				if err := x.Agency.Set(value); err != nil {
+					return err
+				}
 			}
 		case "Report":
 			if err := VDLReadAgencyReport(dec, &x.Report); err != nil {
@@ -861,37 +841,25 @@
 		case "":
 			return dec.FinishValue()
 		case "Name":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Name, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Name = value
 			}
 		case "Id":
-			if err := dec.StartValue(vdl.Int64Type); err != nil {
+			switch value, err := dec.ReadValueInt(64); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Id, err = dec.DecodeInt(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Id = value
 			}
 		case "Active":
-			if err := dec.StartValue(vdl.BoolType); err != nil {
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Active, err = dec.DecodeBool(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Active = value
 			}
 		case "Address":
 			if err := x.Address.VDLRead(dec); err != nil {
@@ -1027,26 +995,18 @@
 		case "":
 			return dec.FinishValue()
 		case "CustId":
-			if err := dec.StartValue(vdl.Int64Type); err != nil {
+			switch value, err := dec.ReadValueInt(64); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.CustId, err = dec.DecodeInt(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.CustId = value
 			}
 		case "InvoiceNum":
-			if err := dec.StartValue(vdl.Int64Type); err != nil {
+			switch value, err := dec.ReadValueInt(64); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.InvoiceNum, err = dec.DecodeInt(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.InvoiceNum = value
 			}
 		case "InvoiceDate":
 			var wire vdltime.Time
@@ -1057,15 +1017,11 @@
 				return err
 			}
 		case "Amount":
-			if err := dec.StartValue(vdl.Int64Type); err != nil {
+			switch value, err := dec.ReadValueInt(64); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Amount, err = dec.DecodeInt(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Amount = value
 			}
 		case "ShipTo":
 			if err := x.ShipTo.VDLRead(dec); err != nil {
@@ -1250,109 +1206,67 @@
 		case "":
 			return dec.FinishValue()
 		case "B":
-			if err := dec.StartValue(vdl.ByteType); err != nil {
+			switch value, err := dec.ReadValueUint(8); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeUint(8)
-			if err != nil {
-				return err
-			}
-			x.B = byte(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.B = byte(value)
 			}
 		case "Ui16":
-			if err := dec.StartValue(vdl.Uint16Type); err != nil {
+			switch value, err := dec.ReadValueUint(16); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeUint(16)
-			if err != nil {
-				return err
-			}
-			x.Ui16 = uint16(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Ui16 = uint16(value)
 			}
 		case "Ui32":
-			if err := dec.StartValue(vdl.Uint32Type); err != nil {
+			switch value, err := dec.ReadValueUint(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeUint(32)
-			if err != nil {
-				return err
-			}
-			x.Ui32 = uint32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Ui32 = uint32(value)
 			}
 		case "Ui64":
-			if err := dec.StartValue(vdl.Uint64Type); err != nil {
+			switch value, err := dec.ReadValueUint(64); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Ui64, err = dec.DecodeUint(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Ui64 = value
 			}
 		case "I16":
-			if err := dec.StartValue(vdl.Int16Type); err != nil {
+			switch value, err := dec.ReadValueInt(16); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(16)
-			if err != nil {
-				return err
-			}
-			x.I16 = int16(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.I16 = int16(value)
 			}
 		case "I32":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.I32 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.I32 = int32(value)
 			}
 		case "I64":
-			if err := dec.StartValue(vdl.Int64Type); err != nil {
+			switch value, err := dec.ReadValueInt(64); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.I64, err = dec.DecodeInt(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.I64 = value
 			}
 		case "F32":
-			if err := dec.StartValue(vdl.Float32Type); err != nil {
+			switch value, err := dec.ReadValueFloat(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeFloat(32)
-			if err != nil {
-				return err
-			}
-			x.F32 = float32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F32 = float32(value)
 			}
 		case "F64":
-			if err := dec.StartValue(vdl.Float64Type); err != nil {
+			switch value, err := dec.ReadValueFloat(64); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.F64, err = dec.DecodeFloat(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F64 = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -1464,28 +1378,20 @@
 	switch f {
 	case "Title":
 		var field TitleOrValueTypeTitle
-		if err := dec.StartValue(vdl.StringType); err != nil {
+		switch value, err := dec.ReadValueString(); {
+		case err != nil:
 			return err
-		}
-		var err error
-		if field.Value, err = dec.DecodeString(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = value
 		}
 		*x = field
 	case "Value":
 		var field TitleOrValueTypeValue
-		if err := dec.StartValue(vdl.Int64Type); err != nil {
+		switch value, err := dec.ReadValueInt(64); {
+		case err != nil:
 			return err
-		}
-		var err error
-		if field.Value, err = dec.DecodeInt(64); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = value
 		}
 		*x = field
 	case "":
@@ -1570,15 +1476,11 @@
 		case "":
 			return dec.FinishValue()
 		case "Name":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Name, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Name = value
 			}
 		case "TitleOrValue":
 			if err := VDLReadTitleOrValueType(dec, &x.TitleOrValue); err != nil {
@@ -1759,28 +1661,23 @@
 	if err := dec.StartValue(__VDLType_array_17); err != nil {
 		return err
 	}
-	index := 0
-	for {
-		switch done, err := dec.NextEntry(); {
+	for index := 0; index < 4; index++ {
+		switch done, elem, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
-		case done != (index >= len(*x)):
-			return fmt.Errorf("array len mismatch, done:%v index:%d len:%d %T)", done, index, len(*x), *x)
 		case done:
-			return dec.FinishValue()
+			return fmt.Errorf("short array, got len %d < 4 %T)", index, *x)
+		default:
+			x[index] = elem
 		}
-		if err := dec.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		var err error
-		if x[index], err = dec.DecodeString(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
-		}
-		index++
 	}
+	switch done, err := dec.NextEntry(); {
+	case err != nil:
+		return err
+	case !done:
+		return fmt.Errorf("long array, got len > 4 %T", *x)
+	}
+	return dec.FinishValue()
 }
 
 type KeyIndexData struct {
@@ -1984,31 +1881,20 @@
 	if err := dec.StartValue(__VDLType_list_19); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make([]string, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, elem, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			*x = append(*x, elem)
 		}
-		var elem string
-		if err := dec.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		var err error
-		if elem, err = dec.DecodeString(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -2021,43 +1907,25 @@
 		tmpMap = make(map[int64]string, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueInt(64); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
+		default:
+			var elem string
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
+				return err
+			default:
+				elem = value
+			}
+			if tmpMap == nil {
+				tmpMap = make(map[int64]string)
+			}
+			tmpMap[key] = elem
 		}
-		var key int64
-		{
-			if err := dec.StartValue(vdl.Int64Type); err != nil {
-				return err
-			}
-			var err error
-			if key, err = dec.DecodeInt(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
-			}
-			var err error
-			if elem, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		if tmpMap == nil {
-			tmpMap = make(map[int64]string)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -2070,30 +1938,18 @@
 		tmpMap = make(map[string]struct{}, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
+		default:
+			if tmpMap == nil {
+				tmpMap = make(map[string]struct{})
 			}
-			var err error
-			if key, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
+			tmpMap[key] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(map[string]struct{})
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -2148,15 +2004,11 @@
 		case "":
 			return dec.FinishValue()
 		case "Key":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Key, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Key = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
diff --git a/uniqueid/uniqueid.vdl.go b/uniqueid/uniqueid.vdl.go
index 8ea5a17..9e07464 100644
--- a/uniqueid/uniqueid.vdl.go
+++ b/uniqueid/uniqueid.vdl.go
@@ -39,14 +39,11 @@
 }
 
 func (x *Id) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_array_1); err != nil {
-		return err
-	}
 	bytes := x[:]
-	if err := dec.DecodeBytes(16, &bytes); err != nil {
+	if err := dec.ReadValueBytes(16, &bytes); err != nil {
 		return err
 	}
-	return dec.FinishValue()
+	return nil
 }
 
 // Hold type definitions in package-level variables, for better performance.
diff --git a/vdl/.api b/vdl/.api
index 2fc3f1d..993f7f4 100644
--- a/vdl/.api
+++ b/vdl/.api
@@ -168,7 +168,7 @@
 pkg vdl, method (WireRetryCode) String() string
 pkg vdl, method (WireRetryCode) VDLIsZero() bool
 pkg vdl, method (WireRetryCode) VDLWrite(Encoder) error
-pkg vdl, type Decoder interface { DecodeBool, DecodeBytes, DecodeFloat, DecodeInt, DecodeString, DecodeTypeObject, DecodeUint, FinishValue, IgnoreNextStartValue, Index, IsAny, IsNil, IsOptional, LenHint, NextEntry, NextField, SkipValue, StartValue, Type }
+pkg vdl, type Decoder interface { DecodeBool, DecodeBytes, DecodeFloat, DecodeInt, DecodeString, DecodeTypeObject, DecodeUint, FinishValue, IgnoreNextStartValue, Index, IsAny, IsNil, IsOptional, LenHint, NextEntry, NextEntryValueBool, NextEntryValueFloat, NextEntryValueInt, NextEntryValueString, NextEntryValueTypeObject, NextEntryValueUint, NextField, ReadValueBool, ReadValueBytes, ReadValueFloat, ReadValueInt, ReadValueString, ReadValueTypeObject, ReadValueUint, SkipValue, StartValue, Type }
 pkg vdl, type Decoder interface, DecodeBool() (bool, error)
 pkg vdl, type Decoder interface, DecodeBytes(int, *[]byte) error
 pkg vdl, type Decoder interface, DecodeFloat(int) (float64, error)
@@ -184,7 +184,20 @@
 pkg vdl, type Decoder interface, IsOptional() bool
 pkg vdl, type Decoder interface, LenHint() int
 pkg vdl, type Decoder interface, NextEntry() (bool, error)
+pkg vdl, type Decoder interface, NextEntryValueBool() (bool, bool, error)
+pkg vdl, type Decoder interface, NextEntryValueFloat(int) (bool, float64, error)
+pkg vdl, type Decoder interface, NextEntryValueInt(int) (bool, int64, error)
+pkg vdl, type Decoder interface, NextEntryValueString() (bool, string, error)
+pkg vdl, type Decoder interface, NextEntryValueTypeObject() (bool, *Type, error)
+pkg vdl, type Decoder interface, NextEntryValueUint(int) (bool, uint64, error)
 pkg vdl, type Decoder interface, NextField() (string, error)
+pkg vdl, type Decoder interface, ReadValueBool() (bool, error)
+pkg vdl, type Decoder interface, ReadValueBytes(int, *[]byte) error
+pkg vdl, type Decoder interface, ReadValueFloat(int) (float64, error)
+pkg vdl, type Decoder interface, ReadValueInt(int) (int64, error)
+pkg vdl, type Decoder interface, ReadValueString() (string, error)
+pkg vdl, type Decoder interface, ReadValueTypeObject() (*Type, error)
+pkg vdl, type Decoder interface, ReadValueUint(int) (uint64, error)
 pkg vdl, type Decoder interface, SkipValue() error
 pkg vdl, type Decoder interface, StartValue(*Type) error
 pkg vdl, type Decoder interface, Type() *Type
diff --git a/vdl/coder.go b/vdl/coder.go
index 31a01ec..8d16c19 100644
--- a/vdl/coder.go
+++ b/vdl/coder.go
@@ -121,13 +121,55 @@
 	// DecodeFloat returns the top value on the stack as a float, where the result
 	// has bitlen bits.  Errors are returned on loss of precision.
 	DecodeFloat(bitlen int) (float64, error)
-	// DecodeBytes decodes the top value on the stack as bytes, into x.  If
-	// fixedlen >= 0 the decoded bytes must be exactly that length, otherwise
-	// there is no restriction on the number of decoded bytes.  If cap(*x) is not
-	// large enough to fit the decoded bytes, a new byte slice is assigned to *x.
-	DecodeBytes(fixedlen int, x *[]byte) error
 	// DecodeTypeObject returns the top value on the stack as a type.
 	DecodeTypeObject() (*Type, error)
+	// DecodeBytes decodes the top value on the stack as bytes, into x.  If
+	// fixedLen >= 0 the decoded bytes must be exactly that length, otherwise
+	// there is no restriction on the number of decoded bytes.  If cap(*x) is not
+	// large enough to fit the decoded bytes, a new byte slice is assigned to *x.
+	DecodeBytes(fixedLen int, x *[]byte) error
+
+	// ReadValueBool behaves as if StartValue, DecodeBool, FinishValue were
+	// called in sequence.  Some decoders optimize this codepath.
+	ReadValueBool() (bool, error)
+	// ReadValueString behaves as if StartValue, DecodeString, FinishValue were
+	// called in sequence.  Some decoders optimize this codepath.
+	ReadValueString() (string, error)
+	// ReadValueUint behaves as if StartValue, DecodeUint, FinishValue were called
+	// in sequence.  Some decoders optimize this codepath.
+	ReadValueUint(bitlen int) (uint64, error)
+	// ReadValueInt behaves as if StartValue, DecodeInt, FinishValue were called
+	// in sequence.  Some decoders optimize this codepath.
+	ReadValueInt(bitlen int) (int64, error)
+	// ReadValueFloat behaves as if StartValue, DecodeFloat, FinishValue were
+	// called in sequence.  Some decoders optimize this codepath.
+	ReadValueFloat(bitlen int) (float64, error)
+	// ReadValueTypeObject behaves as if StartValue, DecodeTypeObject, FinishValue
+	// were called in sequence.  Some decoders optimize this codepath.
+	ReadValueTypeObject() (*Type, error)
+	// ReadValueBytes behaves as if StartValue, DecodeBytes, FinishValue were
+	// called in sequence.  Some decoders optimize this codepath.
+	ReadValueBytes(fixedLen int, x *[]byte) error
+
+	// NextEntryValueBool behaves as if NextEntry, StartValue, DecodeBool,
+	// FinishValue were called in sequence.  Some decoders optimize this codepath.
+	NextEntryValueBool() (done bool, _ bool, _ error)
+	// NextEntryValueString behaves as if NextEntry, StartValue, DecodeString,
+	// FinishValue were called in sequence.  Some decoders optimize this codepath.
+	NextEntryValueString() (done bool, _ string, _ error)
+	// NextEntryValueUint behaves as if NextEntry, StartValue, DecodeUint,
+	// FinishValue were called in sequence.  Some decoders optimize this codepath.
+	NextEntryValueUint(bitlen int) (done bool, _ uint64, _ error)
+	// NextEntryValueInt behaves as if NextEntry, StartValue, DecodeInt,
+	// FinishValue were called in sequence.  Some decoders optimize this codepath.
+	NextEntryValueInt(bitlen int) (done bool, _ int64, _ error)
+	// NextEntryValueFloat behaves as if NextEntry, StartValue, DecodeFloat,
+	// FinishValue were called in sequence.  Some decoders optimize this codepath.
+	NextEntryValueFloat(bitlen int) (done bool, _ float64, _ error)
+	// NextEntryValueTypeObject behaves as if NextEntry, StartValue,
+	// DecodeTypeObject, FinishValue were called in sequence.  Some decoders
+	// optimize this codepath.
+	NextEntryValueTypeObject() (done bool, _ *Type, _ error)
 }
 
 // Encoder defines the interface for an encoder of vdl values.  The Encoder is
@@ -188,33 +230,30 @@
 //
 // Since this is meant to be used in the implementation of DecodeBytes, there is
 // no outer call to StartValue/FinishValue.
-func DecodeConvertedBytes(dec Decoder, fixedlen int, buf *[]byte) error {
-	if len := dec.LenHint(); len >= 0 && cap(*buf) < len {
-		*buf = make([]byte, 0, len)
-	} else {
+func DecodeConvertedBytes(dec Decoder, fixedLen int, buf *[]byte) error {
+	// Only re-use the existing buffer if we're filling in an array.  This
+	// sacrifices some performance, but also avoids bugs when repeatedly decoding
+	// into the same value.
+	switch len := dec.LenHint(); {
+	case fixedLen >= 0:
 		*buf = (*buf)[:0]
+	case len > 0:
+		*buf = make([]byte, 0, len)
+	default:
+		*buf = nil
 	}
 	index := 0
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, elem, err := dec.NextEntryValueUint(8); {
 		case err != nil:
 			return err
-		case fixedlen >= 0 && done != (index >= fixedlen):
-			return fmt.Errorf("array len mismatch, done:%v index:%d len:%d", done, index, fixedlen)
+		case fixedLen >= 0 && done != (index >= fixedLen):
+			return fmt.Errorf("array len mismatch, done:%v index:%d len:%d", done, index, fixedLen)
 		case done:
 			return nil
+		default:
+			*buf = append(*buf, byte(elem))
 		}
-		if err := dec.StartValue(ByteType); err != nil {
-			return err
-		}
-		elem, err := dec.DecodeUint(8)
-		if err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
-		}
-		*buf = append(*buf, byte(elem))
 		index++
 	}
 }
diff --git a/vdl/pipe.go b/vdl/pipe.go
index 0b75361..cc3d94f 100644
--- a/vdl/pipe.go
+++ b/vdl/pipe.go
@@ -692,3 +692,129 @@
 	copy(*b, d.Enc.ArgBytes)
 	return d.Enc.Err
 }
+
+// The ReadValue* and NextEntryValue* methods just call methods in sequence.
+
+func (d *pipeDecoder) ReadValueBool() (bool, error) {
+	if err := d.StartValue(BoolType); err != nil {
+		return false, err
+	}
+	value, err := d.DecodeBool()
+	if err != nil {
+		return false, err
+	}
+	return value, d.FinishValue()
+}
+
+func (d *pipeDecoder) ReadValueString() (string, error) {
+	if err := d.StartValue(StringType); err != nil {
+		return "", err
+	}
+	value, err := d.DecodeString()
+	if err != nil {
+		return "", err
+	}
+	return value, d.FinishValue()
+}
+
+func (d *pipeDecoder) ReadValueUint(bitlen int) (uint64, error) {
+	if err := d.StartValue(Uint64Type); err != nil {
+		return 0, err
+	}
+	value, err := d.DecodeUint(bitlen)
+	if err != nil {
+		return 0, err
+	}
+	return value, d.FinishValue()
+}
+
+func (d *pipeDecoder) ReadValueInt(bitlen int) (int64, error) {
+	if err := d.StartValue(Int64Type); err != nil {
+		return 0, err
+	}
+	value, err := d.DecodeInt(bitlen)
+	if err != nil {
+		return 0, err
+	}
+	return value, d.FinishValue()
+}
+
+func (d *pipeDecoder) ReadValueFloat(bitlen int) (float64, error) {
+	if err := d.StartValue(Float64Type); err != nil {
+		return 0, err
+	}
+	value, err := d.DecodeFloat(bitlen)
+	if err != nil {
+		return 0, err
+	}
+	return value, d.FinishValue()
+}
+
+func (d *pipeDecoder) ReadValueTypeObject() (*Type, error) {
+	if err := d.StartValue(TypeObjectType); err != nil {
+		return nil, err
+	}
+	value, err := d.DecodeTypeObject()
+	if err != nil {
+		return nil, err
+	}
+	return value, d.FinishValue()
+}
+
+func (d *pipeDecoder) ReadValueBytes(fixedLen int, x *[]byte) error {
+	if err := d.StartValue(ttByteList); err != nil {
+		return err
+	}
+	if err := d.DecodeBytes(fixedLen, x); err != nil {
+		return err
+	}
+	return d.FinishValue()
+}
+
+func (d *pipeDecoder) NextEntryValueBool() (done bool, _ bool, _ error) {
+	if done, err := d.NextEntry(); done || err != nil {
+		return done, false, err
+	}
+	value, err := d.ReadValueBool()
+	return false, value, err
+}
+
+func (d *pipeDecoder) NextEntryValueString() (done bool, _ string, _ error) {
+	if done, err := d.NextEntry(); done || err != nil {
+		return done, "", err
+	}
+	value, err := d.ReadValueString()
+	return false, value, err
+}
+
+func (d *pipeDecoder) NextEntryValueUint(bitlen int) (done bool, _ uint64, _ error) {
+	if done, err := d.NextEntry(); done || err != nil {
+		return done, 0, err
+	}
+	value, err := d.ReadValueUint(bitlen)
+	return false, value, err
+}
+
+func (d *pipeDecoder) NextEntryValueInt(bitlen int) (done bool, _ int64, _ error) {
+	if done, err := d.NextEntry(); done || err != nil {
+		return done, 0, err
+	}
+	value, err := d.ReadValueInt(bitlen)
+	return false, value, err
+}
+
+func (d *pipeDecoder) NextEntryValueFloat(bitlen int) (done bool, _ float64, _ error) {
+	if done, err := d.NextEntry(); done || err != nil {
+		return done, 0, err
+	}
+	value, err := d.ReadValueFloat(bitlen)
+	return false, value, err
+}
+
+func (d *pipeDecoder) NextEntryValueTypeObject() (done bool, _ *Type, _ error) {
+	if done, err := d.NextEntry(); done || err != nil {
+		return done, nil, err
+	}
+	value, err := d.ReadValueTypeObject()
+	return false, value, err
+}
diff --git a/vdl/reflect_reader.go b/vdl/reflect_reader.go
index 4cece9a..c34b410 100644
--- a/vdl/reflect_reader.go
+++ b/vdl/reflect_reader.go
@@ -52,35 +52,18 @@
 	case **Type:
 		// Special-case type decoding, since we must assign the hash-consed pointer
 		// for correctness, rather than filling in a newly-created Type.
-		if !calledStart {
-			if err := dec.StartValue(TypeObjectType); err != nil {
-				return err
-			}
+		if calledStart {
+			dec.IgnoreNextStartValue()
 		}
 		var err error
-		if *x, err = dec.DecodeTypeObject(); err != nil {
-			return err
-		}
-		return dec.FinishValue()
+		*x, err = dec.ReadValueTypeObject()
+		return err
 
-		// Cases after this point are purely performance optimizations.
-		// TODO(toddw): Handle other common cases.
-	case *[]byte:
-		if !calledStart {
-			if err := dec.StartValue(ttByteList); err != nil {
-				return err
-			}
-		}
-		if err := dec.DecodeBytes(-1, x); err != nil {
-			return err
-		}
-		return dec.FinishValue()
+		// TODO(toddw): Consider adding common-cases as performance optimizations.
 	}
 	return errReadMustReflect
 }
 
-var ttByteList = ListType(ByteType)
-
 // ReadReflect is like Read, but takes a reflect.Value argument.
 func ReadReflect(dec Decoder, rv reflect.Value) error {
 	if !rv.IsValid() {
@@ -111,21 +94,25 @@
 	if tt == AnyType {
 		return readIntoAny(dec, calledStart, rv)
 	}
-	// Now start the decoder value, if we haven't already.
-	if !calledStart {
-		if err := dec.StartValue(tt); err != nil {
-			return err
+	// Handle optional types, which need StartValue to be called first to
+	// determine whether the decoded value is nil.
+	if tt.Kind() == Optional {
+		if !calledStart {
+			calledStart = true
+			if err := dec.StartValue(tt); err != nil {
+				return err
+			}
+		}
+		// Handle nil decoded values next, to simplify the rest of the cases.  This
+		// handles cases where the dec value is either any(nil) or optional(nil).
+		if dec.IsNil() {
+			return readFromNil(dec, rv, tt)
 		}
 	}
-	// Handle nil decoded values next, to simplify the rest of the cases.  This
-	// handles cases where the dec value is either any(nil) or optional(nil).
-	if dec.IsNil() {
-		return readFromNil(dec, rv, tt)
-	}
-	// Now we know that the decoded value isn't nil.  Flatten pointers and check
-	// for fast non-reflect support.
+	// Now we know that rv isn't optional.  Flatten pointers and check for fast
+	// non-reflect support.
 	rv = rvFlattenPointers(rv)
-	if err := readNonReflect(dec, true, rv.Addr().Interface()); err != errReadMustReflect {
+	if err := readNonReflect(dec, calledStart, rv.Addr().Interface()); err != errReadMustReflect {
 		return err
 	}
 	// Handle native types, which need the ToNative conversion.  Notice that rv is
@@ -136,19 +123,64 @@
 	// TODO(toddw): Investigate support for native pointer types.
 	if ni := nativeInfoFromNative(rv.Type()); ni != nil {
 		rvWire := reflect.New(ni.WireType).Elem()
-		if err := readReflect(dec, true, rvWire, tt); err != nil {
+		if err := readReflect(dec, calledStart, rvWire, tt); err != nil {
 			return err
 		}
 		return ni.ToNative(rvWire, rv.Addr())
 		// NOTE: readReflect guarantees that FinishValue has already been called.
 	}
-	// Handle non-nil wire values.
-	if err := readNonNilValue(dec, rv, tt.NonOptional()); err != nil {
+	tt = tt.NonOptional()
+	// Handle scalar wire values.
+	if ttIsScalar(tt) {
+		if calledStart {
+			dec.IgnoreNextStartValue()
+		}
+		return readValueScalar(dec, rv, tt)
+	}
+	// Handle bytes wire values.
+	if tt.IsBytes() {
+		if calledStart {
+			dec.IgnoreNextStartValue()
+		}
+		return readValueBytes(dec, rv, tt)
+	}
+	// Handle composite wire values.
+	if !calledStart {
+		if err := dec.StartValue(tt); err != nil {
+			return err
+		}
+	}
+	var err error
+	switch tt.Kind() {
+	case Array:
+		err = readFixedLenList(dec, "array", rv.Len(), rv, tt)
+	case List:
+		err = readList(dec, rv, tt)
+	case Set:
+		err = readSet(dec, rv, tt)
+	case Map:
+		err = readMap(dec, rv, tt)
+	case Struct:
+		err = readStruct(dec, rv, tt)
+	case Union:
+		err = readUnion(dec, rv, tt)
+	default:
+		// Note that both Any and Optional were handled in readIntAny, and
+		// TypeObject was handled via the readNonReflect special-case.
+		return fmt.Errorf("vdl: Read unhandled type %v %v", rv.Type(), tt)
+	}
+	if err != nil {
 		return err
 	}
 	return dec.FinishValue()
 }
 
+// settable exists to avoid a call to reflect.Call() to invoke Set()
+// which results in an allocation
+type settable interface {
+	Set(string) error
+}
+
 // readIntoAny uses dec to decode a value into rv, which has VDL type any.
 func readIntoAny(dec Decoder, calledStart bool, rv reflect.Value) error {
 	if calledStart {
@@ -318,117 +350,213 @@
 	return false, nil
 }
 
-// settable exists to avoid a call to reflect.Call() to invoke Set()
-// which results in an allocation
-type settable interface {
-	Set(string) error
+func ttIsScalar(tt *Type) bool {
+	switch tt.Kind() {
+	case Bool, String, Enum, Byte, Uint16, Uint32, Uint64, Int8, Int16, Int32, Int64, Float32, Float64:
+		return true
+	}
+	return false
 }
 
-func readNonNilValue(dec Decoder, rv reflect.Value, tt *Type) error {
-	// Handle named and unnamed []byte and [N]byte, where the element type is the
-	// unnamed byte type.  Cases like []MyByte fall through and are handled as
-	// regular lists, since we can't easily convert []MyByte to []byte.
-	switch {
-	case tt.Kind() == Array && tt.Elem() == ByteType:
-		bytes := rv.Slice(0, tt.Len()).Interface().([]byte)
-		return dec.DecodeBytes(tt.Len(), &bytes)
-	case tt.Kind() == List && tt.Elem() == ByteType:
-		var bytes []byte
-		if err := dec.DecodeBytes(-1, &bytes); err != nil {
-			return err
-		}
-		rv.Set(reflect.ValueOf(bytes))
-		return nil
-	}
-	// Handle regular non-nil values.
+func readValueScalar(dec Decoder, rv reflect.Value, tt *Type) error {
 	switch kind := tt.Kind(); kind {
 	case Bool:
-		val, err := dec.DecodeBool()
+		value, err := dec.ReadValueBool()
 		if err != nil {
 			return err
 		}
-		rv.SetBool(val)
+		rv.SetBool(value)
 		return nil
 	case String:
-		val, err := dec.DecodeString()
+		value, err := dec.ReadValueString()
 		if err != nil {
 			return err
 		}
-		rv.SetString(val)
+		rv.SetString(value)
 		return nil
 	case Enum:
-		val, err := dec.DecodeString()
+		value, err := dec.ReadValueString()
 		if err != nil {
 			return err
 		}
-		return rv.Addr().Interface().(settable).Set(val)
+		return rv.Addr().Interface().(settable).Set(value)
 	case Byte, Uint16, Uint32, Uint64:
-		val, err := dec.DecodeUint(kind.BitLen())
+		value, err := dec.ReadValueUint(kind.BitLen())
 		if err != nil {
 			return err
 		}
-		rv.SetUint(val)
+		rv.SetUint(value)
 		return nil
 	case Int8, Int16, Int32, Int64:
-		val, err := dec.DecodeInt(kind.BitLen())
+		value, err := dec.ReadValueInt(kind.BitLen())
 		if err != nil {
 			return err
 		}
-		rv.SetInt(val)
+		rv.SetInt(value)
 		return nil
 	case Float32, Float64:
-		val, err := dec.DecodeFloat(kind.BitLen())
+		value, err := dec.ReadValueFloat(kind.BitLen())
 		if err != nil {
 			return err
 		}
-		rv.SetFloat(val)
+		rv.SetFloat(value)
 		return nil
-	case Array:
-		return readArray(dec, rv, tt)
-	case List:
-		return readList(dec, rv, tt)
-	case Set:
-		return readSet(dec, rv, tt)
-	case Map:
-		return readMap(dec, rv, tt)
-	case Struct:
-		return readStruct(dec, rv, tt)
-	case Union:
-		return readUnion(dec, rv, tt)
 	}
-	// Note that Any was already handled via readAny, Optional was handled via
-	// readFromNil (or stripped off for non-nil values), and TypeObject was
-	// handled via the readNonReflect special-case.
-	return fmt.Errorf("vdl: Read unhandled type %v %v", rv.Type(), tt)
+	return fmt.Errorf("vdl: readValueScalar called on non-scalar %v, %v", tt, rv.Type())
 }
 
-func readArray(dec Decoder, rv reflect.Value, tt *Type) error {
-	rt := rv.Type()
-	index := 0
-	for {
-		switch done, err := dec.NextEntry(); {
+func readNextEntryScalar(dec Decoder, rv reflect.Value, tt *Type) (bool, error) {
+	switch kind := tt.Kind(); kind {
+	case Bool:
+		switch done, value, err := dec.NextEntryValueBool(); {
 		case err != nil:
-			return err
-		case done != (index >= rv.Len()):
-			return fmt.Errorf("array len mismatch, done:%v index:%d len:%d %v", done, index, rt.Len(), rt)
+			return false, err
 		case done:
-			return nil
+			return true, nil
+		default:
+			rv.SetBool(value)
+			return false, nil
 		}
-		if err := readReflect(dec, false, rv.Index(index), tt.Elem()); err != nil {
-			return err
+	case String:
+		switch done, value, err := dec.NextEntryValueString(); {
+		case err != nil:
+			return false, err
+		case done:
+			return true, nil
+		default:
+			rv.SetString(value)
+			return false, nil
 		}
-		index++
+	case Enum:
+		switch done, value, err := dec.NextEntryValueString(); {
+		case err != nil:
+			return false, err
+		case done:
+			return true, nil
+		default:
+			return false, rv.Addr().Interface().(settable).Set(value)
+		}
+	case Byte, Uint16, Uint32, Uint64:
+		switch done, value, err := dec.NextEntryValueUint(kind.BitLen()); {
+		case err != nil:
+			return false, err
+		case done:
+			return true, nil
+		default:
+			rv.SetUint(value)
+			return false, nil
+		}
+	case Int8, Int16, Int32, Int64:
+		switch done, value, err := dec.NextEntryValueInt(kind.BitLen()); {
+		case err != nil:
+			return false, err
+		case done:
+			return true, nil
+		default:
+			rv.SetInt(value)
+			return false, nil
+		}
+	case Float32, Float64:
+		switch done, value, err := dec.NextEntryValueFloat(kind.BitLen()); {
+		case err != nil:
+			return false, err
+		case done:
+			return true, nil
+		default:
+			rv.SetFloat(value)
+			return false, nil
+		}
 	}
+	return false, fmt.Errorf("vdl: readNextEntryScalar called on non-scalar %v, %v", tt, rv.Type())
+}
+
+func readValueBytes(dec Decoder, rv reflect.Value, tt *Type) error {
+	kind := tt.Kind()
+	// Go doesn't allow type conversions from []MyByte to []byte, but the reflect
+	// package does let us perform this conversion.  We slice arrays so that we
+	// can fill them in directly.
+	fixedLen, needAssign := -1, false
+	var fillPtr *[]byte
+	switch {
+	case kind == Array:
+		fixedLen = tt.Len()
+		tmp := rv.Slice(0, fixedLen).Bytes()
+		fillPtr = &tmp
+	case tt.Name() != "" || tt.Elem() != ByteType:
+		fillPtr = new([]byte)
+		needAssign = true
+	default: // rv has type []byte
+		fillPtr = rv.Addr().Interface().(*[]byte)
+	}
+	if err := dec.ReadValueBytes(fixedLen, fillPtr); err != nil {
+		return err
+	}
+	if needAssign {
+		rv.SetBytes(*fillPtr)
+	}
+	return nil
+}
+
+func readFixedLenList(dec Decoder, name string, len int, rv reflect.Value, tt *Type) error {
+	ttElem := tt.Elem()
+	if ttIsScalar(ttElem) {
+		// Handle scalar element fastpath.
+		for index := 0; index < len; index++ {
+			switch done, err := readNextEntryScalar(dec, rv.Index(index), ttElem); {
+			case err != nil:
+				return err
+			case done:
+				return fmt.Errorf("vdl: short %s, got len %d < %d %v", name, index, len, rv.Type())
+			}
+		}
+	} else {
+		// Handle non-scalar elements.
+		for index := 0; index < len; index++ {
+			switch done, err := dec.NextEntry(); {
+			case err != nil:
+				return err
+			case done:
+				return fmt.Errorf("vdl: short %s, got len %d < %d %v", name, index, len, rv.Type())
+			}
+			if err := readReflect(dec, false, rv.Index(index), ttElem); err != nil {
+				return err
+			}
+		}
+	}
+	switch done, err := dec.NextEntry(); {
+	case err != nil:
+		return err
+	case !done:
+		return fmt.Errorf("vdl: long %s, got len > %d %v", name, len, rv.Type())
+	}
+	return nil
 }
 
 func readList(dec Decoder, rv reflect.Value, tt *Type) error {
 	rt := rv.Type()
-	switch len := dec.LenHint(); {
-	case len > 0:
-		rv.Set(reflect.MakeSlice(rt, 0, len))
-	default:
-		rv.Set(reflect.Zero(rt))
+	rtElem, ttElem := rt.Elem(), tt.Elem()
+	if len := dec.LenHint(); len > 0 {
+		// Handle fixed-length fastpath.
+		rv.Set(reflect.MakeSlice(rt, len, len))
+		return readFixedLenList(dec, "list", len, rv, tt)
 	}
+	// TODO(toddw): Make progressively larger slices, rather than creating each
+	// element one at a time.
+	rv.Set(reflect.Zero(rt))
+	if ttIsScalar(ttElem) {
+		// Handle scalar element fastpath.
+		for {
+			rvElem := reflect.New(rtElem).Elem()
+			switch done, err := readNextEntryScalar(dec, rvElem, ttElem); {
+			case err != nil:
+				return err
+			case done:
+				return nil
+			}
+			rv.Set(reflect.Append(rv, rvElem))
+		}
+	}
+	// Handle non-scalar elements.
 	for {
 		switch done, err := dec.NextEntry(); {
 		case err != nil:
@@ -436,11 +564,11 @@
 		case done:
 			return nil
 		}
-		elem := reflect.New(rt.Elem()).Elem()
-		if err := readReflect(dec, false, elem, tt.Elem()); err != nil {
+		rvElem := reflect.New(rtElem).Elem()
+		if err := readReflect(dec, false, rvElem, ttElem); err != nil {
 			return err
 		}
-		rv.Set(reflect.Append(rv, elem))
+		rv.Set(reflect.Append(rv, rvElem))
 	}
 }
 
@@ -448,7 +576,26 @@
 
 func readSet(dec Decoder, rv reflect.Value, tt *Type) error {
 	rt := rv.Type()
+	rtKey, ttKey := rt.Key(), tt.Key()
 	tmpSet, isNil := reflect.Zero(rt), true
+	if ttIsScalar(tt.Key()) {
+		// Handle scalar key fastpath.
+		for {
+			rvKey := reflect.New(rtKey).Elem()
+			switch done, err := readNextEntryScalar(dec, rvKey, ttKey); {
+			case err != nil:
+				return err
+			case done:
+				rv.Set(tmpSet)
+				return nil
+			}
+			if isNil {
+				tmpSet, isNil = reflect.MakeMap(rt), false
+			}
+			tmpSet.SetMapIndex(rvKey, rvEmptyStruct)
+		}
+	}
+	// Handle non-scalar elements.
 	for {
 		switch done, err := dec.NextEntry(); {
 		case err != nil:
@@ -457,20 +604,44 @@
 			rv.Set(tmpSet)
 			return nil
 		}
-		key := reflect.New(rt.Key()).Elem()
-		if err := readReflect(dec, false, key, tt.Key()); err != nil {
+		rvKey := reflect.New(rtKey).Elem()
+		if err := readReflect(dec, false, rvKey, ttKey); err != nil {
 			return err
 		}
 		if isNil {
 			tmpSet, isNil = reflect.MakeMap(rt), false
 		}
-		tmpSet.SetMapIndex(key, rvEmptyStruct)
+		tmpSet.SetMapIndex(rvKey, rvEmptyStruct)
 	}
 }
 
 func readMap(dec Decoder, rv reflect.Value, tt *Type) error {
 	rt := rv.Type()
+	rtKey, ttKey := rt.Key(), tt.Key()
+	rtElem, ttElem := rt.Elem(), tt.Elem()
 	tmpMap, isNil := reflect.Zero(rt), true
+	if ttIsScalar(ttKey) {
+		// Handle scalar key fastpath.
+		for {
+			rvKey := reflect.New(rtKey).Elem()
+			switch done, err := readNextEntryScalar(dec, rvKey, ttKey); {
+			case err != nil:
+				return err
+			case done:
+				rv.Set(tmpMap)
+				return nil
+			}
+			rvElem := reflect.New(rtElem).Elem()
+			if err := readReflect(dec, false, rvElem, ttElem); err != nil {
+				return err
+			}
+			if isNil {
+				tmpMap, isNil = reflect.MakeMap(rt), false
+			}
+			tmpMap.SetMapIndex(rvKey, rvElem)
+		}
+	}
+	// Handle non-scalar keys.
 	for {
 		switch done, err := dec.NextEntry(); {
 		case err != nil:
@@ -479,18 +650,18 @@
 			rv.Set(tmpMap)
 			return nil
 		}
-		key := reflect.New(rt.Key()).Elem()
-		if err := readReflect(dec, false, key, tt.Key()); err != nil {
+		rvKey := reflect.New(rtKey).Elem()
+		if err := readReflect(dec, false, rvKey, ttKey); err != nil {
 			return err
 		}
-		elem := reflect.New(rt.Elem()).Elem()
-		if err := readReflect(dec, false, elem, tt.Elem()); err != nil {
+		rvElem := reflect.New(rtElem).Elem()
+		if err := readReflect(dec, false, rvElem, ttElem); err != nil {
 			return err
 		}
 		if isNil {
 			tmpMap, isNil = reflect.MakeMap(rt), false
 		}
-		tmpMap.SetMapIndex(key, elem)
+		tmpMap.SetMapIndex(rvKey, rvElem)
 	}
 }
 
diff --git a/vdl/reflect_type.go b/vdl/reflect_type.go
index 92903f1..4fc2d6a 100644
--- a/vdl/reflect_type.go
+++ b/vdl/reflect_type.go
@@ -421,6 +421,8 @@
 var (
 	errTypeFromReflectValue = errors.New("invalid vdl.TypeOf(reflect.Value{})")
 
+	ttByteList = ListType(ByteType)
+
 	rtInterface          = reflect.TypeOf((*interface{})(nil)).Elem()
 	rtBool               = reflect.TypeOf(false)
 	rtByte               = reflect.TypeOf(byte(0))
diff --git a/vdl/reflect_writer.go b/vdl/reflect_writer.go
index 307d767..04442df 100644
--- a/vdl/reflect_writer.go
+++ b/vdl/reflect_writer.go
@@ -40,8 +40,6 @@
 	return writeReflect(enc, rv, tt)
 }
 
-var ttBytes = ListType(ByteType)
-
 func writeNonReflect(enc Encoder, v interface{}) error {
 	switch x := v.(type) {
 	case Writer:
@@ -52,7 +50,7 @@
 		// Cases after this point are purely performance optimizations.
 		// TODO(toddw): Handle other common cases.
 	case []byte:
-		if err := enc.StartValue(ttBytes); err != nil {
+		if err := enc.StartValue(ttByteList); err != nil {
 			return err
 		}
 		if err := enc.EncodeBytes(x); err != nil {
diff --git a/vdl/transcode.go b/vdl/transcode.go
index afe0dc3..a2349c4 100644
--- a/vdl/transcode.go
+++ b/vdl/transcode.go
@@ -36,6 +36,7 @@
 		fixedLen := -1
 		if d.Type().Kind() == Array {
 			fixedLen = d.Type().Len()
+			b = make([]byte, fixedLen)
 		}
 		if err := d.DecodeBytes(fixedLen, &b); err != nil {
 			return err
diff --git a/vdl/util.go b/vdl/util.go
index c5291fc..ea894dd 100644
--- a/vdl/util.go
+++ b/vdl/util.go
@@ -123,15 +123,38 @@
 
 func (z zeroDecoder) DecodeBool() (bool, error)        { return false, nil }
 func (z zeroDecoder) DecodeString() (string, error)    { return "", nil }
-func (z zeroDecoder) DecodeTypeObject() (*Type, error) { return AnyType, nil }
 func (z zeroDecoder) DecodeUint(int) (uint64, error)   { return 0, nil }
 func (z zeroDecoder) DecodeInt(int) (int64, error)     { return 0, nil }
 func (z zeroDecoder) DecodeFloat(int) (float64, error) { return 0, nil }
-func (z zeroDecoder) DecodeBytes(fixedlen int, x *[]byte) error {
-	*x = (*x)[:0]
+func (z zeroDecoder) DecodeTypeObject() (*Type, error) { return AnyType, nil }
+func (z zeroDecoder) DecodeBytes(fixedLen int, x *[]byte) error {
+	if fixedLen >= 0 {
+		for i := 0; i < fixedLen; i++ {
+			(*x)[i] = 0
+		}
+	} else {
+		*x = nil
+	}
 	return nil
 }
 
+func (z zeroDecoder) ReadValueBool() (bool, error)               { return false, nil }
+func (z zeroDecoder) ReadValueString() (string, error)           { return "", nil }
+func (z zeroDecoder) ReadValueUint(bitlen int) (uint64, error)   { return 0, nil }
+func (z zeroDecoder) ReadValueInt(bitlen int) (int64, error)     { return 0, nil }
+func (z zeroDecoder) ReadValueFloat(bitlen int) (float64, error) { return 0, nil }
+func (z zeroDecoder) ReadValueTypeObject() (*Type, error)        { return AnyType, nil }
+func (z zeroDecoder) ReadValueBytes(fixedLen int, x *[]byte) error {
+	return z.DecodeBytes(fixedLen, x)
+}
+
+func (z zeroDecoder) NextEntryValueBool() (bool, bool, error)               { return true, false, nil }
+func (z zeroDecoder) NextEntryValueString() (bool, string, error)           { return true, "", nil }
+func (z zeroDecoder) NextEntryValueUint(bitlen int) (bool, uint64, error)   { return true, 0, nil }
+func (z zeroDecoder) NextEntryValueInt(bitlen int) (bool, int64, error)     { return true, 0, nil }
+func (z zeroDecoder) NextEntryValueFloat(bitlen int) (bool, float64, error) { return true, 0, nil }
+func (z zeroDecoder) NextEntryValueTypeObject() (bool, *Type, error)        { return true, nil, nil }
+
 var (
 	rvAnyType               = reflect.ValueOf(AnyType)
 	kkZeroValueNotCanonical = []Kind{Any, TypeObject, Union}
diff --git a/vdl/value_decoder.go b/vdl/value_decoder.go
index 26487b0..1d6c112 100644
--- a/vdl/value_decoder.go
+++ b/vdl/value_decoder.go
@@ -381,3 +381,129 @@
 	}
 	return nil
 }
+
+// The ReadValue* and NextEntryValue* methods just call methods in sequence.
+
+func (d *valueDecoder) ReadValueBool() (bool, error) {
+	if err := d.StartValue(BoolType); err != nil {
+		return false, err
+	}
+	value, err := d.DecodeBool()
+	if err != nil {
+		return false, err
+	}
+	return value, d.FinishValue()
+}
+
+func (d *valueDecoder) ReadValueString() (string, error) {
+	if err := d.StartValue(StringType); err != nil {
+		return "", err
+	}
+	value, err := d.DecodeString()
+	if err != nil {
+		return "", err
+	}
+	return value, d.FinishValue()
+}
+
+func (d *valueDecoder) ReadValueUint(bitlen int) (uint64, error) {
+	if err := d.StartValue(Uint64Type); err != nil {
+		return 0, err
+	}
+	value, err := d.DecodeUint(bitlen)
+	if err != nil {
+		return 0, err
+	}
+	return value, d.FinishValue()
+}
+
+func (d *valueDecoder) ReadValueInt(bitlen int) (int64, error) {
+	if err := d.StartValue(Int64Type); err != nil {
+		return 0, err
+	}
+	value, err := d.DecodeInt(bitlen)
+	if err != nil {
+		return 0, err
+	}
+	return value, d.FinishValue()
+}
+
+func (d *valueDecoder) ReadValueFloat(bitlen int) (float64, error) {
+	if err := d.StartValue(Float64Type); err != nil {
+		return 0, err
+	}
+	value, err := d.DecodeFloat(bitlen)
+	if err != nil {
+		return 0, err
+	}
+	return value, d.FinishValue()
+}
+
+func (d *valueDecoder) ReadValueTypeObject() (*Type, error) {
+	if err := d.StartValue(TypeObjectType); err != nil {
+		return nil, err
+	}
+	value, err := d.DecodeTypeObject()
+	if err != nil {
+		return nil, err
+	}
+	return value, d.FinishValue()
+}
+
+func (d *valueDecoder) ReadValueBytes(fixedLen int, x *[]byte) error {
+	if err := d.StartValue(ttByteList); err != nil {
+		return err
+	}
+	if err := d.DecodeBytes(fixedLen, x); err != nil {
+		return err
+	}
+	return d.FinishValue()
+}
+
+func (d *valueDecoder) NextEntryValueBool() (done bool, _ bool, _ error) {
+	if done, err := d.NextEntry(); done || err != nil {
+		return done, false, err
+	}
+	value, err := d.ReadValueBool()
+	return false, value, err
+}
+
+func (d *valueDecoder) NextEntryValueString() (done bool, _ string, _ error) {
+	if done, err := d.NextEntry(); done || err != nil {
+		return done, "", err
+	}
+	value, err := d.ReadValueString()
+	return false, value, err
+}
+
+func (d *valueDecoder) NextEntryValueUint(bitlen int) (done bool, _ uint64, _ error) {
+	if done, err := d.NextEntry(); done || err != nil {
+		return done, 0, err
+	}
+	value, err := d.ReadValueUint(bitlen)
+	return false, value, err
+}
+
+func (d *valueDecoder) NextEntryValueInt(bitlen int) (done bool, _ int64, _ error) {
+	if done, err := d.NextEntry(); done || err != nil {
+		return done, 0, err
+	}
+	value, err := d.ReadValueInt(bitlen)
+	return false, value, err
+}
+
+func (d *valueDecoder) NextEntryValueFloat(bitlen int) (done bool, _ float64, _ error) {
+	if done, err := d.NextEntry(); done || err != nil {
+		return done, 0, err
+	}
+	value, err := d.ReadValueFloat(bitlen)
+	return false, value, err
+}
+
+func (d *valueDecoder) NextEntryValueTypeObject() (done bool, _ *Type, _ error) {
+	if done, err := d.NextEntry(); done || err != nil {
+		return done, nil, err
+	}
+	value, err := d.ReadValueTypeObject()
+	return false, value, err
+}
diff --git a/vdl/value_reader.go b/vdl/value_reader.go
index f9f8880..45a1cae 100644
--- a/vdl/value_reader.go
+++ b/vdl/value_reader.go
@@ -90,11 +90,12 @@
 
 func (vv *Value) readNonNilValue(dec Decoder) error {
 	if vv.Type().IsBytes() {
+		var val []byte
 		fixedLen := -1
 		if vv.Kind() == Array {
 			fixedLen = vv.Type().Len()
+			val = make([]byte, fixedLen)
 		}
-		var val []byte
 		if err := dec.DecodeBytes(fixedLen, &val); err != nil {
 			return err
 		}
diff --git a/vdl/vdl.vdl.go b/vdl/vdl.vdl.go
index a9c4dfb..9d59619 100644
--- a/vdl/vdl.vdl.go
+++ b/vdl/vdl.vdl.go
@@ -93,17 +93,15 @@
 }
 
 func (x *WireRetryCode) VDLRead(dec Decoder) error {
-	if err := dec.StartValue(__VDLType_enum_1); err != nil {
+	switch value, err := dec.ReadValueString(); {
+	case err != nil:
 		return err
+	default:
+		if err := x.Set(value); err != nil {
+			return err
+		}
 	}
-	enum, err := dec.DecodeString()
-	if err != nil {
-		return err
-	}
-	if err := x.Set(enum); err != nil {
-		return err
-	}
-	return dec.FinishValue()
+	return nil
 }
 
 // WireError is the wire representation for the built-in error type.  Errors and
@@ -233,30 +231,27 @@
 		case "":
 			return dec.FinishValue()
 		case "Id":
-			if err := dec.StartValue(StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Id, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Id = value
 			}
 		case "RetryCode":
-			if err := x.RetryCode.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
+			default:
+				if err := x.RetryCode.Set(value); err != nil {
+					return err
+				}
 			}
 		case "Msg":
-			if err := dec.StartValue(StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Msg, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Msg = value
 			}
 		case "ParamList":
 			if err := __VDLReadAnon_list_1(dec, &x.ParamList); err != nil {
@@ -274,10 +269,9 @@
 	if err := dec.StartValue(__VDLType_list_3); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make([]*Value, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -286,13 +280,14 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem *Value
+			elem = new(Value)
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem *Value
-		elem = new(Value)
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
diff --git a/vdl/vdltest/vdltest.vdl.go b/vdl/vdltest/vdltest.vdl.go
index 59fb3d6..2a12b56 100644
--- a/vdl/vdltest/vdltest.vdl.go
+++ b/vdl/vdltest/vdltest.vdl.go
@@ -9,6 +9,7 @@
 
 import (
 	"fmt"
+	"reflect"
 	"v.io/v23/vdl"
 	"v.io/v23/verror"
 )
@@ -139,37 +140,25 @@
 		case "":
 			return dec.FinishValue()
 		case "IsCanonical":
-			if err := dec.StartValue(vdl.BoolType); err != nil {
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.IsCanonical, err = dec.DecodeBool(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.IsCanonical = value
 			}
 		case "Label":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Label, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Label = value
 			}
 		case "TargetLabel":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.TargetLabel, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.TargetLabel = value
 			}
 		case "Target":
 			var readAny interface{}
@@ -178,15 +167,11 @@
 			}
 			x.Target = readAny
 		case "SourceLabel":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.SourceLabel, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.SourceLabel = value
 			}
 		case "Source":
 			var readAny interface{}
@@ -224,15 +209,13 @@
 }
 
 func (x *VBool) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_bool_2); err != nil {
+	switch value, err := dec.ReadValueBool(); {
+	case err != nil:
 		return err
+	default:
+		*x = VBool(value)
 	}
-	tmp, err := dec.DecodeBool()
-	if err != nil {
-		return err
-	}
-	*x = VBool(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 type VString string
@@ -257,15 +240,13 @@
 }
 
 func (x *VString) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_string_3); err != nil {
+	switch value, err := dec.ReadValueString(); {
+	case err != nil:
 		return err
+	default:
+		*x = VString(value)
 	}
-	tmp, err := dec.DecodeString()
-	if err != nil {
-		return err
-	}
-	*x = VString(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 type VByte byte
@@ -290,15 +271,13 @@
 }
 
 func (x *VByte) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_byte_4); err != nil {
+	switch value, err := dec.ReadValueUint(8); {
+	case err != nil:
 		return err
+	default:
+		*x = VByte(value)
 	}
-	tmp, err := dec.DecodeUint(8)
-	if err != nil {
-		return err
-	}
-	*x = VByte(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 type VEnumAbc int
@@ -369,17 +348,15 @@
 }
 
 func (x *VEnumAbc) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_enum_5); err != nil {
+	switch value, err := dec.ReadValueString(); {
+	case err != nil:
 		return err
+	default:
+		if err := x.Set(value); err != nil {
+			return err
+		}
 	}
-	enum, err := dec.DecodeString()
-	if err != nil {
-		return err
-	}
-	if err := x.Set(enum); err != nil {
-		return err
-	}
-	return dec.FinishValue()
+	return nil
 }
 
 type VEnumBcd int
@@ -450,17 +427,15 @@
 }
 
 func (x *VEnumBcd) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_enum_6); err != nil {
+	switch value, err := dec.ReadValueString(); {
+	case err != nil:
 		return err
+	default:
+		if err := x.Set(value); err != nil {
+			return err
+		}
 	}
-	enum, err := dec.DecodeString()
-	if err != nil {
-		return err
-	}
-	if err := x.Set(enum); err != nil {
-		return err
-	}
-	return dec.FinishValue()
+	return nil
 }
 
 type VStructEmpty struct {
@@ -572,26 +547,18 @@
 		case "":
 			return dec.FinishValue()
 		case "Id":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Id, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Id = value
 			}
 		case "Msg":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Msg, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Msg = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -623,15 +590,13 @@
 }
 
 func (x *VUint16) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_uint16_9); err != nil {
+	switch value, err := dec.ReadValueUint(16); {
+	case err != nil:
 		return err
+	default:
+		*x = VUint16(value)
 	}
-	tmp, err := dec.DecodeUint(16)
-	if err != nil {
-		return err
-	}
-	*x = VUint16(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 type VUint32 uint32
@@ -656,15 +621,13 @@
 }
 
 func (x *VUint32) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_uint32_10); err != nil {
+	switch value, err := dec.ReadValueUint(32); {
+	case err != nil:
 		return err
+	default:
+		*x = VUint32(value)
 	}
-	tmp, err := dec.DecodeUint(32)
-	if err != nil {
-		return err
-	}
-	*x = VUint32(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 type VUint64 uint64
@@ -689,15 +652,13 @@
 }
 
 func (x *VUint64) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_uint64_11); err != nil {
+	switch value, err := dec.ReadValueUint(64); {
+	case err != nil:
 		return err
+	default:
+		*x = VUint64(value)
 	}
-	tmp, err := dec.DecodeUint(64)
-	if err != nil {
-		return err
-	}
-	*x = VUint64(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 type VInt8 int8
@@ -722,15 +683,13 @@
 }
 
 func (x *VInt8) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_int8_12); err != nil {
+	switch value, err := dec.ReadValueInt(8); {
+	case err != nil:
 		return err
+	default:
+		*x = VInt8(value)
 	}
-	tmp, err := dec.DecodeInt(8)
-	if err != nil {
-		return err
-	}
-	*x = VInt8(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 type VInt16 int16
@@ -755,15 +714,13 @@
 }
 
 func (x *VInt16) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_int16_13); err != nil {
+	switch value, err := dec.ReadValueInt(16); {
+	case err != nil:
 		return err
+	default:
+		*x = VInt16(value)
 	}
-	tmp, err := dec.DecodeInt(16)
-	if err != nil {
-		return err
-	}
-	*x = VInt16(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 type VInt32 int32
@@ -788,15 +745,13 @@
 }
 
 func (x *VInt32) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_int32_14); err != nil {
+	switch value, err := dec.ReadValueInt(32); {
+	case err != nil:
 		return err
+	default:
+		*x = VInt32(value)
 	}
-	tmp, err := dec.DecodeInt(32)
-	if err != nil {
-		return err
-	}
-	*x = VInt32(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 type VInt64 int64
@@ -821,15 +776,13 @@
 }
 
 func (x *VInt64) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_int64_15); err != nil {
+	switch value, err := dec.ReadValueInt(64); {
+	case err != nil:
 		return err
+	default:
+		*x = VInt64(value)
 	}
-	tmp, err := dec.DecodeInt(64)
-	if err != nil {
-		return err
-	}
-	*x = VInt64(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 type VFloat32 float32
@@ -854,15 +807,13 @@
 }
 
 func (x *VFloat32) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_float32_16); err != nil {
+	switch value, err := dec.ReadValueFloat(32); {
+	case err != nil:
 		return err
+	default:
+		*x = VFloat32(value)
 	}
-	tmp, err := dec.DecodeFloat(32)
-	if err != nil {
-		return err
-	}
-	*x = VFloat32(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 type VFloat64 float64
@@ -887,15 +838,13 @@
 }
 
 func (x *VFloat64) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_float64_17); err != nil {
+	switch value, err := dec.ReadValueFloat(64); {
+	case err != nil:
 		return err
+	default:
+		*x = VFloat64(value)
 	}
-	tmp, err := dec.DecodeFloat(64)
-	if err != nil {
-		return err
-	}
-	*x = VFloat64(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 type VArray3_Any [3]interface{}
@@ -931,23 +880,27 @@
 	if err := dec.StartValue(__VDLType_array_18); err != nil {
 		return err
 	}
-	index := 0
-	for {
+	for index := 0; index < 3; index++ {
 		switch done, err := dec.NextEntry(); {
 		case err != nil:
 			return err
-		case done != (index >= len(*x)):
-			return fmt.Errorf("array len mismatch, done:%v index:%d len:%d %T)", done, index, len(*x), *x)
 		case done:
-			return dec.FinishValue()
+			return fmt.Errorf("short array, got len %d < 3 %T)", index, *x)
+		default:
+			var readAny interface{}
+			if err := vdl.Read(dec, &readAny); err != nil {
+				return err
+			}
+			x[index] = readAny
 		}
-		var readAny interface{}
-		if err := vdl.Read(dec, &readAny); err != nil {
-			return err
-		}
-		x[index] = readAny
-		index++
 	}
+	switch done, err := dec.NextEntry(); {
+	case err != nil:
+		return err
+	case !done:
+		return fmt.Errorf("long array, got len > 3 %T", *x)
+	}
+	return dec.FinishValue()
 }
 
 type VArray3_Bool [3]bool
@@ -989,28 +942,23 @@
 	if err := dec.StartValue(__VDLType_array_19); err != nil {
 		return err
 	}
-	index := 0
-	for {
-		switch done, err := dec.NextEntry(); {
+	for index := 0; index < 3; index++ {
+		switch done, elem, err := dec.NextEntryValueBool(); {
 		case err != nil:
 			return err
-		case done != (index >= len(*x)):
-			return fmt.Errorf("array len mismatch, done:%v index:%d len:%d %T)", done, index, len(*x), *x)
 		case done:
-			return dec.FinishValue()
+			return fmt.Errorf("short array, got len %d < 3 %T)", index, *x)
+		default:
+			x[index] = elem
 		}
-		if err := dec.StartValue(vdl.BoolType); err != nil {
-			return err
-		}
-		var err error
-		if x[index], err = dec.DecodeBool(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
-		}
-		index++
 	}
+	switch done, err := dec.NextEntry(); {
+	case err != nil:
+		return err
+	case !done:
+		return fmt.Errorf("long array, got len > 3 %T", *x)
+	}
+	return dec.FinishValue()
 }
 
 type VArray3_VBool [3]VBool
@@ -1046,21 +994,23 @@
 	if err := dec.StartValue(__VDLType_array_20); err != nil {
 		return err
 	}
-	index := 0
-	for {
-		switch done, err := dec.NextEntry(); {
+	for index := 0; index < 3; index++ {
+		switch done, elem, err := dec.NextEntryValueBool(); {
 		case err != nil:
 			return err
-		case done != (index >= len(*x)):
-			return fmt.Errorf("array len mismatch, done:%v index:%d len:%d %T)", done, index, len(*x), *x)
 		case done:
-			return dec.FinishValue()
+			return fmt.Errorf("short array, got len %d < 3 %T)", index, *x)
+		default:
+			x[index] = VBool(elem)
 		}
-		if err := x[index].VDLRead(dec); err != nil {
-			return err
-		}
-		index++
 	}
+	switch done, err := dec.NextEntry(); {
+	case err != nil:
+		return err
+	case !done:
+		return fmt.Errorf("long array, got len > 3 %T", *x)
+	}
+	return dec.FinishValue()
 }
 
 type VArray1_String [1]string
@@ -1102,28 +1052,23 @@
 	if err := dec.StartValue(__VDLType_array_21); err != nil {
 		return err
 	}
-	index := 0
-	for {
-		switch done, err := dec.NextEntry(); {
+	for index := 0; index < 1; index++ {
+		switch done, elem, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
-		case done != (index >= len(*x)):
-			return fmt.Errorf("array len mismatch, done:%v index:%d len:%d %T)", done, index, len(*x), *x)
 		case done:
-			return dec.FinishValue()
+			return fmt.Errorf("short array, got len %d < 1 %T)", index, *x)
+		default:
+			x[index] = elem
 		}
-		if err := dec.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		var err error
-		if x[index], err = dec.DecodeString(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
-		}
-		index++
 	}
+	switch done, err := dec.NextEntry(); {
+	case err != nil:
+		return err
+	case !done:
+		return fmt.Errorf("long array, got len > 1 %T", *x)
+	}
+	return dec.FinishValue()
 }
 
 type VArray3_VString [3]VString
@@ -1159,21 +1104,23 @@
 	if err := dec.StartValue(__VDLType_array_22); err != nil {
 		return err
 	}
-	index := 0
-	for {
-		switch done, err := dec.NextEntry(); {
+	for index := 0; index < 3; index++ {
+		switch done, elem, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
-		case done != (index >= len(*x)):
-			return fmt.Errorf("array len mismatch, done:%v index:%d len:%d %T)", done, index, len(*x), *x)
 		case done:
-			return dec.FinishValue()
+			return fmt.Errorf("short array, got len %d < 3 %T)", index, *x)
+		default:
+			x[index] = VString(elem)
 		}
-		if err := x[index].VDLRead(dec); err != nil {
-			return err
-		}
-		index++
 	}
+	switch done, err := dec.NextEntry(); {
+	case err != nil:
+		return err
+	case !done:
+		return fmt.Errorf("long array, got len > 3 %T", *x)
+	}
+	return dec.FinishValue()
 }
 
 type VArray2_TypeObject [2]*vdl.Type
@@ -1214,28 +1161,23 @@
 	if err := dec.StartValue(__VDLType_array_23); err != nil {
 		return err
 	}
-	index := 0
-	for {
-		switch done, err := dec.NextEntry(); {
+	for index := 0; index < 2; index++ {
+		switch done, elem, err := dec.NextEntryValueTypeObject(); {
 		case err != nil:
 			return err
-		case done != (index >= len(*x)):
-			return fmt.Errorf("array len mismatch, done:%v index:%d len:%d %T)", done, index, len(*x), *x)
 		case done:
-			return dec.FinishValue()
+			return fmt.Errorf("short array, got len %d < 2 %T)", index, *x)
+		default:
+			x[index] = elem
 		}
-		if err := dec.StartValue(vdl.TypeObjectType); err != nil {
-			return err
-		}
-		var err error
-		if x[index], err = dec.DecodeTypeObject(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
-		}
-		index++
 	}
+	switch done, err := dec.NextEntry(); {
+	case err != nil:
+		return err
+	case !done:
+		return fmt.Errorf("long array, got len > 2 %T", *x)
+	}
+	return dec.FinishValue()
 }
 
 type VArray1_Byte [1]byte
@@ -1260,14 +1202,11 @@
 }
 
 func (x *VArray1_Byte) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_array_24); err != nil {
-		return err
-	}
 	bytes := x[:]
-	if err := dec.DecodeBytes(1, &bytes); err != nil {
+	if err := dec.ReadValueBytes(1, &bytes); err != nil {
 		return err
 	}
-	return dec.FinishValue()
+	return nil
 }
 
 type VArray2_VByte [2]VByte
@@ -1300,24 +1239,11 @@
 }
 
 func (x *VArray2_VByte) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_array_25); err != nil {
+	bytes := reflect.ValueOf(x[:]).Bytes()
+	if err := dec.ReadValueBytes(2, &bytes); err != nil {
 		return err
 	}
-	index := 0
-	for {
-		switch done, err := dec.NextEntry(); {
-		case err != nil:
-			return err
-		case done != (index >= len(*x)):
-			return fmt.Errorf("array len mismatch, done:%v index:%d len:%d %T)", done, index, len(*x), *x)
-		case done:
-			return dec.FinishValue()
-		}
-		if err := x[index].VDLRead(dec); err != nil {
-			return err
-		}
-		index++
-	}
+	return nil
 }
 
 type VArray2_VEnumAbc [2]VEnumAbc
@@ -1353,21 +1279,25 @@
 	if err := dec.StartValue(__VDLType_array_26); err != nil {
 		return err
 	}
-	index := 0
-	for {
-		switch done, err := dec.NextEntry(); {
+	for index := 0; index < 2; index++ {
+		switch done, elem, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
-		case done != (index >= len(*x)):
-			return fmt.Errorf("array len mismatch, done:%v index:%d len:%d %T)", done, index, len(*x), *x)
 		case done:
-			return dec.FinishValue()
+			return fmt.Errorf("short array, got len %d < 2 %T)", index, *x)
+		default:
+			if err := x[index].Set(elem); err != nil {
+				return err
+			}
 		}
-		if err := x[index].VDLRead(dec); err != nil {
-			return err
-		}
-		index++
 	}
+	switch done, err := dec.NextEntry(); {
+	case err != nil:
+		return err
+	case !done:
+		return fmt.Errorf("long array, got len > 2 %T", *x)
+	}
+	return dec.FinishValue()
 }
 
 type VArray2_VEnumBcd [2]VEnumBcd
@@ -1403,21 +1333,25 @@
 	if err := dec.StartValue(__VDLType_array_27); err != nil {
 		return err
 	}
-	index := 0
-	for {
-		switch done, err := dec.NextEntry(); {
+	for index := 0; index < 2; index++ {
+		switch done, elem, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
-		case done != (index >= len(*x)):
-			return fmt.Errorf("array len mismatch, done:%v index:%d len:%d %T)", done, index, len(*x), *x)
 		case done:
-			return dec.FinishValue()
+			return fmt.Errorf("short array, got len %d < 2 %T)", index, *x)
+		default:
+			if err := x[index].Set(elem); err != nil {
+				return err
+			}
 		}
-		if err := x[index].VDLRead(dec); err != nil {
-			return err
-		}
-		index++
 	}
+	switch done, err := dec.NextEntry(); {
+	case err != nil:
+		return err
+	case !done:
+		return fmt.Errorf("long array, got len > 2 %T", *x)
+	}
+	return dec.FinishValue()
 }
 
 type VArray1_VStructEmpty [1]VStructEmpty
@@ -1453,21 +1387,25 @@
 	if err := dec.StartValue(__VDLType_array_28); err != nil {
 		return err
 	}
-	index := 0
-	for {
+	for index := 0; index < 1; index++ {
 		switch done, err := dec.NextEntry(); {
 		case err != nil:
 			return err
-		case done != (index >= len(*x)):
-			return fmt.Errorf("array len mismatch, done:%v index:%d len:%d %T)", done, index, len(*x), *x)
 		case done:
-			return dec.FinishValue()
+			return fmt.Errorf("short array, got len %d < 1 %T)", index, *x)
+		default:
+			if err := x[index].VDLRead(dec); err != nil {
+				return err
+			}
 		}
-		if err := x[index].VDLRead(dec); err != nil {
-			return err
-		}
-		index++
 	}
+	switch done, err := dec.NextEntry(); {
+	case err != nil:
+		return err
+	case !done:
+		return fmt.Errorf("long array, got len > 1 %T", *x)
+	}
+	return dec.FinishValue()
 }
 
 type VArray1_VNamedError [1]VNamedError
@@ -1503,21 +1441,25 @@
 	if err := dec.StartValue(__VDLType_array_29); err != nil {
 		return err
 	}
-	index := 0
-	for {
+	for index := 0; index < 1; index++ {
 		switch done, err := dec.NextEntry(); {
 		case err != nil:
 			return err
-		case done != (index >= len(*x)):
-			return fmt.Errorf("array len mismatch, done:%v index:%d len:%d %T)", done, index, len(*x), *x)
 		case done:
-			return dec.FinishValue()
+			return fmt.Errorf("short array, got len %d < 1 %T)", index, *x)
+		default:
+			if err := x[index].VDLRead(dec); err != nil {
+				return err
+			}
 		}
-		if err := x[index].VDLRead(dec); err != nil {
-			return err
-		}
-		index++
 	}
+	switch done, err := dec.NextEntry(); {
+	case err != nil:
+		return err
+	case !done:
+		return fmt.Errorf("long array, got len > 1 %T", *x)
+	}
+	return dec.FinishValue()
 }
 
 type VArray2_Error [2]error
@@ -1553,21 +1495,25 @@
 	if err := dec.StartValue(__VDLType_array_30); err != nil {
 		return err
 	}
-	index := 0
-	for {
+	for index := 0; index < 2; index++ {
 		switch done, err := dec.NextEntry(); {
 		case err != nil:
 			return err
-		case done != (index >= len(*x)):
-			return fmt.Errorf("array len mismatch, done:%v index:%d len:%d %T)", done, index, len(*x), *x)
 		case done:
-			return dec.FinishValue()
+			return fmt.Errorf("short array, got len %d < 2 %T)", index, *x)
+		default:
+			if err := verror.VDLRead(dec, &x[index]); err != nil {
+				return err
+			}
 		}
-		if err := verror.VDLRead(dec, &x[index]); err != nil {
-			return err
-		}
-		index++
 	}
+	switch done, err := dec.NextEntry(); {
+	case err != nil:
+		return err
+	case !done:
+		return fmt.Errorf("long array, got len > 2 %T", *x)
+	}
+	return dec.FinishValue()
 }
 
 type VArray1_Uint32 [1]uint32
@@ -1609,29 +1555,23 @@
 	if err := dec.StartValue(__VDLType_array_31); err != nil {
 		return err
 	}
-	index := 0
-	for {
-		switch done, err := dec.NextEntry(); {
+	for index := 0; index < 1; index++ {
+		switch done, elem, err := dec.NextEntryValueUint(32); {
 		case err != nil:
 			return err
-		case done != (index >= len(*x)):
-			return fmt.Errorf("array len mismatch, done:%v index:%d len:%d %T)", done, index, len(*x), *x)
 		case done:
-			return dec.FinishValue()
+			return fmt.Errorf("short array, got len %d < 1 %T)", index, *x)
+		default:
+			x[index] = uint32(elem)
 		}
-		if err := dec.StartValue(vdl.Uint32Type); err != nil {
-			return err
-		}
-		tmp, err := dec.DecodeUint(32)
-		if err != nil {
-			return err
-		}
-		x[index] = uint32(tmp)
-		if err := dec.FinishValue(); err != nil {
-			return err
-		}
-		index++
 	}
+	switch done, err := dec.NextEntry(); {
+	case err != nil:
+		return err
+	case !done:
+		return fmt.Errorf("long array, got len > 1 %T", *x)
+	}
+	return dec.FinishValue()
 }
 
 type VArray3_Uint64 [3]uint64
@@ -1673,28 +1613,23 @@
 	if err := dec.StartValue(__VDLType_array_32); err != nil {
 		return err
 	}
-	index := 0
-	for {
-		switch done, err := dec.NextEntry(); {
+	for index := 0; index < 3; index++ {
+		switch done, elem, err := dec.NextEntryValueUint(64); {
 		case err != nil:
 			return err
-		case done != (index >= len(*x)):
-			return fmt.Errorf("array len mismatch, done:%v index:%d len:%d %T)", done, index, len(*x), *x)
 		case done:
-			return dec.FinishValue()
+			return fmt.Errorf("short array, got len %d < 3 %T)", index, *x)
+		default:
+			x[index] = elem
 		}
-		if err := dec.StartValue(vdl.Uint64Type); err != nil {
-			return err
-		}
-		var err error
-		if x[index], err = dec.DecodeUint(64); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
-		}
-		index++
 	}
+	switch done, err := dec.NextEntry(); {
+	case err != nil:
+		return err
+	case !done:
+		return fmt.Errorf("long array, got len > 3 %T", *x)
+	}
+	return dec.FinishValue()
 }
 
 type VArray3_Int64 [3]int64
@@ -1736,28 +1671,23 @@
 	if err := dec.StartValue(__VDLType_array_33); err != nil {
 		return err
 	}
-	index := 0
-	for {
-		switch done, err := dec.NextEntry(); {
+	for index := 0; index < 3; index++ {
+		switch done, elem, err := dec.NextEntryValueInt(64); {
 		case err != nil:
 			return err
-		case done != (index >= len(*x)):
-			return fmt.Errorf("array len mismatch, done:%v index:%d len:%d %T)", done, index, len(*x), *x)
 		case done:
-			return dec.FinishValue()
+			return fmt.Errorf("short array, got len %d < 3 %T)", index, *x)
+		default:
+			x[index] = elem
 		}
-		if err := dec.StartValue(vdl.Int64Type); err != nil {
-			return err
-		}
-		var err error
-		if x[index], err = dec.DecodeInt(64); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
-		}
-		index++
 	}
+	switch done, err := dec.NextEntry(); {
+	case err != nil:
+		return err
+	case !done:
+		return fmt.Errorf("long array, got len > 3 %T", *x)
+	}
+	return dec.FinishValue()
 }
 
 type VArray1_OptVStructEmpty [1]*VStructEmpty
@@ -1802,33 +1732,37 @@
 	if err := dec.StartValue(__VDLType_array_34); err != nil {
 		return err
 	}
-	index := 0
-	for {
+	for index := 0; index < 1; index++ {
 		switch done, err := dec.NextEntry(); {
 		case err != nil:
 			return err
-		case done != (index >= len(*x)):
-			return fmt.Errorf("array len mismatch, done:%v index:%d len:%d %T)", done, index, len(*x), *x)
 		case done:
-			return dec.FinishValue()
-		}
-		if err := dec.StartValue(__VDLType_optional_35); err != nil {
-			return err
-		}
-		if dec.IsNil() {
-			x[index] = nil
-			if err := dec.FinishValue(); err != nil {
+			return fmt.Errorf("short array, got len %d < 1 %T)", index, *x)
+		default:
+			if err := dec.StartValue(__VDLType_optional_35); err != nil {
 				return err
 			}
-		} else {
-			x[index] = new(VStructEmpty)
-			dec.IgnoreNextStartValue()
-			if err := x[index].VDLRead(dec); err != nil {
-				return err
+			if dec.IsNil() {
+				x[index] = nil
+				if err := dec.FinishValue(); err != nil {
+					return err
+				}
+			} else {
+				x[index] = new(VStructEmpty)
+				dec.IgnoreNextStartValue()
+				if err := x[index].VDLRead(dec); err != nil {
+					return err
+				}
 			}
 		}
-		index++
 	}
+	switch done, err := dec.NextEntry(); {
+	case err != nil:
+		return err
+	case !done:
+		return fmt.Errorf("long array, got len > 1 %T", *x)
+	}
+	return dec.FinishValue()
 }
 
 type VArray3_OptVNamedError [3]*VNamedError
@@ -1873,33 +1807,37 @@
 	if err := dec.StartValue(__VDLType_array_36); err != nil {
 		return err
 	}
-	index := 0
-	for {
+	for index := 0; index < 3; index++ {
 		switch done, err := dec.NextEntry(); {
 		case err != nil:
 			return err
-		case done != (index >= len(*x)):
-			return fmt.Errorf("array len mismatch, done:%v index:%d len:%d %T)", done, index, len(*x), *x)
 		case done:
-			return dec.FinishValue()
-		}
-		if err := dec.StartValue(__VDLType_optional_37); err != nil {
-			return err
-		}
-		if dec.IsNil() {
-			x[index] = nil
-			if err := dec.FinishValue(); err != nil {
+			return fmt.Errorf("short array, got len %d < 3 %T)", index, *x)
+		default:
+			if err := dec.StartValue(__VDLType_optional_37); err != nil {
 				return err
 			}
-		} else {
-			x[index] = new(VNamedError)
-			dec.IgnoreNextStartValue()
-			if err := x[index].VDLRead(dec); err != nil {
-				return err
+			if dec.IsNil() {
+				x[index] = nil
+				if err := dec.FinishValue(); err != nil {
+					return err
+				}
+			} else {
+				x[index] = new(VNamedError)
+				dec.IgnoreNextStartValue()
+				if err := x[index].VDLRead(dec); err != nil {
+					return err
+				}
 			}
 		}
-		index++
 	}
+	switch done, err := dec.NextEntry(); {
+	case err != nil:
+		return err
+	case !done:
+		return fmt.Errorf("long array, got len > 3 %T", *x)
+	}
+	return dec.FinishValue()
 }
 
 type VList_Any []interface{}
@@ -1938,10 +1876,9 @@
 	if err := dec.StartValue(__VDLType_list_38); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(VList_Any, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -1950,14 +1887,15 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem interface{}
+			var readAny interface{}
+			if err := vdl.Read(dec, &readAny); err != nil {
+				return err
+			}
+			elem = readAny
+			*x = append(*x, elem)
 		}
-		var elem interface{}
-		var readAny interface{}
-		if err := vdl.Read(dec, &readAny); err != nil {
-			return err
-		}
-		elem = readAny
-		*x = append(*x, elem)
 	}
 }
 
@@ -2003,31 +1941,20 @@
 	if err := dec.StartValue(__VDLType_list_39); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(VList_Bool, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, elem, err := dec.NextEntryValueBool(); {
 		case err != nil:
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			*x = append(*x, elem)
 		}
-		var elem bool
-		if err := dec.StartValue(vdl.BoolType); err != nil {
-			return err
-		}
-		var err error
-		if elem, err = dec.DecodeBool(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -2067,24 +1994,20 @@
 	if err := dec.StartValue(__VDLType_list_40); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(VList_VBool, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, elem, err := dec.NextEntryValueBool(); {
 		case err != nil:
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			*x = append(*x, VBool(elem))
 		}
-		var elem VBool
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -2130,31 +2053,20 @@
 	if err := dec.StartValue(__VDLType_list_41); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(VList_String, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, elem, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			*x = append(*x, elem)
 		}
-		var elem string
-		if err := dec.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		var err error
-		if elem, err = dec.DecodeString(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -2194,24 +2106,20 @@
 	if err := dec.StartValue(__VDLType_list_42); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(VList_VString, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, elem, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			*x = append(*x, VString(elem))
 		}
-		var elem VString
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -2251,31 +2159,20 @@
 	if err := dec.StartValue(__VDLType_list_43); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(VList_TypeObject, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, elem, err := dec.NextEntryValueTypeObject(); {
 		case err != nil:
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			*x = append(*x, elem)
 		}
-		var elem *vdl.Type
-		if err := dec.StartValue(vdl.TypeObjectType); err != nil {
-			return err
-		}
-		var err error
-		if elem, err = dec.DecodeTypeObject(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -2301,15 +2198,12 @@
 }
 
 func (x *VList_Byte) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_list_44); err != nil {
-		return err
-	}
 	var bytes []byte
-	if err := dec.DecodeBytes(-1, &bytes); err != nil {
+	if err := dec.ReadValueBytes(-1, &bytes); err != nil {
 		return err
 	}
 	*x = bytes
-	return dec.FinishValue()
+	return nil
 }
 
 type VList_VByte []VByte
@@ -2345,28 +2239,12 @@
 }
 
 func (x *VList_VByte) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_list_45); err != nil {
+	var bytes []byte
+	if err := dec.ReadValueBytes(-1, &bytes); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
-		*x = make(VList_VByte, 0, len)
-	default:
-		*x = nil
-	}
-	for {
-		switch done, err := dec.NextEntry(); {
-		case err != nil:
-			return err
-		case done:
-			return dec.FinishValue()
-		}
-		var elem VByte
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
-	}
+	reflect.ValueOf(x).Elem().SetBytes(bytes)
+	return nil
 }
 
 type VList_VEnumAbc []VEnumAbc
@@ -2405,24 +2283,24 @@
 	if err := dec.StartValue(__VDLType_list_46); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(VList_VEnumAbc, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, elem, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var enum VEnumAbc
+			if err := enum.Set(elem); err != nil {
+				return err
+			}
+			*x = append(*x, enum)
 		}
-		var elem VEnumAbc
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -2462,24 +2340,24 @@
 	if err := dec.StartValue(__VDLType_list_47); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(VList_VEnumBcd, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, elem, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var enum VEnumBcd
+			if err := enum.Set(elem); err != nil {
+				return err
+			}
+			*x = append(*x, enum)
 		}
-		var elem VEnumBcd
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -2519,10 +2397,9 @@
 	if err := dec.StartValue(__VDLType_list_48); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(VList_VStructEmpty, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -2531,12 +2408,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem VStructEmpty
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem VStructEmpty
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -2576,10 +2454,9 @@
 	if err := dec.StartValue(__VDLType_list_49); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(VList_VNamedError, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -2588,12 +2465,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem VNamedError
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem VNamedError
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -2633,10 +2511,9 @@
 	if err := dec.StartValue(__VDLType_list_50); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(VList_Error, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -2645,12 +2522,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem error
+			if err := verror.VDLRead(dec, &elem); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem error
-		if err := verror.VDLRead(dec, &elem); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -2690,24 +2568,20 @@
 	if err := dec.StartValue(__VDLType_list_51); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(VList_VUint16, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, elem, err := dec.NextEntryValueUint(16); {
 		case err != nil:
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			*x = append(*x, VUint16(elem))
 		}
-		var elem VUint16
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -2747,24 +2621,20 @@
 	if err := dec.StartValue(__VDLType_list_52); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(VList_VFloat32, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, elem, err := dec.NextEntryValueFloat(32); {
 		case err != nil:
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			*x = append(*x, VFloat32(elem))
 		}
-		var elem VFloat32
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -2804,24 +2674,20 @@
 	if err := dec.StartValue(__VDLType_list_53); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(VList_VFloat64, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, elem, err := dec.NextEntryValueFloat(64); {
 		case err != nil:
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			*x = append(*x, VFloat64(elem))
 		}
-		var elem VFloat64
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -2870,10 +2736,9 @@
 	if err := dec.StartValue(__VDLType_list_54); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(VList_OptVStructEmpty, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -2882,24 +2747,25 @@
 			return err
 		case done:
 			return dec.FinishValue()
-		}
-		var elem *VStructEmpty
-		if err := dec.StartValue(__VDLType_optional_35); err != nil {
-			return err
-		}
-		if dec.IsNil() {
-			elem = nil
-			if err := dec.FinishValue(); err != nil {
+		default:
+			var elem *VStructEmpty
+			if err := dec.StartValue(__VDLType_optional_35); err != nil {
 				return err
 			}
-		} else {
-			elem = new(VStructEmpty)
-			dec.IgnoreNextStartValue()
-			if err := elem.VDLRead(dec); err != nil {
-				return err
+			if dec.IsNil() {
+				elem = nil
+				if err := dec.FinishValue(); err != nil {
+					return err
+				}
+			} else {
+				elem = new(VStructEmpty)
+				dec.IgnoreNextStartValue()
+				if err := elem.VDLRead(dec); err != nil {
+					return err
+				}
 			}
+			*x = append(*x, elem)
 		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -2948,10 +2814,9 @@
 	if err := dec.StartValue(__VDLType_list_55); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(VList_OptVNamedError, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -2960,24 +2825,25 @@
 			return err
 		case done:
 			return dec.FinishValue()
-		}
-		var elem *VNamedError
-		if err := dec.StartValue(__VDLType_optional_37); err != nil {
-			return err
-		}
-		if dec.IsNil() {
-			elem = nil
-			if err := dec.FinishValue(); err != nil {
+		default:
+			var elem *VNamedError
+			if err := dec.StartValue(__VDLType_optional_37); err != nil {
 				return err
 			}
-		} else {
-			elem = new(VNamedError)
-			dec.IgnoreNextStartValue()
-			if err := elem.VDLRead(dec); err != nil {
-				return err
+			if dec.IsNil() {
+				elem = nil
+				if err := dec.FinishValue(); err != nil {
+					return err
+				}
+			} else {
+				elem = new(VNamedError)
+				dec.IgnoreNextStartValue()
+				if err := elem.VDLRead(dec); err != nil {
+					return err
+				}
 			}
+			*x = append(*x, elem)
 		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -3028,30 +2894,18 @@
 		tmpMap = make(VSet_Bool, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueBool(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key bool
-		{
-			if err := dec.StartValue(vdl.BoolType); err != nil {
-				return err
+		default:
+			if tmpMap == nil {
+				tmpMap = make(VSet_Bool)
 			}
-			var err error
-			if key, err = dec.DecodeBool(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
+			tmpMap[key] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(VSet_Bool)
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -3096,23 +2950,18 @@
 		tmpMap = make(VSet_VBool, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueBool(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key VBool
-		{
-			if err := key.VDLRead(dec); err != nil {
-				return err
+		default:
+			if tmpMap == nil {
+				tmpMap = make(VSet_VBool)
 			}
+			tmpMap[VBool(key)] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(VSet_VBool)
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -3163,30 +3012,18 @@
 		tmpMap = make(VSet_String, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
+		default:
+			if tmpMap == nil {
+				tmpMap = make(VSet_String)
 			}
-			var err error
-			if key, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
+			tmpMap[key] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(VSet_String)
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -3231,23 +3068,18 @@
 		tmpMap = make(VSet_VString, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key VString
-		{
-			if err := key.VDLRead(dec); err != nil {
-				return err
+		default:
+			if tmpMap == nil {
+				tmpMap = make(VSet_VString)
 			}
+			tmpMap[VString(key)] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(VSet_VString)
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -3298,31 +3130,18 @@
 		tmpMap = make(VSet_Byte, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueUint(8); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key byte
-		{
-			if err := dec.StartValue(vdl.ByteType); err != nil {
-				return err
+		default:
+			if tmpMap == nil {
+				tmpMap = make(VSet_Byte)
 			}
-			tmp, err := dec.DecodeUint(8)
-			if err != nil {
-				return err
-			}
-			key = byte(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
+			tmpMap[byte(key)] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(VSet_Byte)
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -3367,23 +3186,18 @@
 		tmpMap = make(VSet_VByte, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueUint(8); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key VByte
-		{
-			if err := key.VDLRead(dec); err != nil {
-				return err
+		default:
+			if tmpMap == nil {
+				tmpMap = make(VSet_VByte)
 			}
+			tmpMap[VByte(key)] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(VSet_VByte)
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -3428,23 +3242,22 @@
 		tmpMap = make(VSet_VEnumAbc, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key VEnumAbc
-		{
-			if err := key.VDLRead(dec); err != nil {
+		default:
+			var keyEnum VEnumAbc
+			if err := keyEnum.Set(key); err != nil {
 				return err
 			}
+			if tmpMap == nil {
+				tmpMap = make(VSet_VEnumAbc)
+			}
+			tmpMap[keyEnum] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(VSet_VEnumAbc)
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -3489,23 +3302,22 @@
 		tmpMap = make(VSet_VEnumBcd, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key VEnumBcd
-		{
-			if err := key.VDLRead(dec); err != nil {
+		default:
+			var keyEnum VEnumBcd
+			if err := keyEnum.Set(key); err != nil {
 				return err
 			}
+			if tmpMap == nil {
+				tmpMap = make(VSet_VEnumBcd)
+			}
+			tmpMap[keyEnum] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(VSet_VEnumBcd)
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -3556,17 +3368,16 @@
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key VStructEmpty
-		{
+		default:
+			var key VStructEmpty
 			if err := key.VDLRead(dec); err != nil {
 				return err
 			}
+			if tmpMap == nil {
+				tmpMap = make(VSet_VStructEmpty)
+			}
+			tmpMap[key] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(VSet_VStructEmpty)
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -3617,17 +3428,16 @@
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key VNamedError
-		{
+		default:
+			var key VNamedError
 			if err := key.VDLRead(dec); err != nil {
 				return err
 			}
+			if tmpMap == nil {
+				tmpMap = make(VSet_VNamedError)
+			}
+			tmpMap[key] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(VSet_VNamedError)
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -3678,30 +3488,18 @@
 		tmpMap = make(VSet_Uint64, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueUint(64); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key uint64
-		{
-			if err := dec.StartValue(vdl.Uint64Type); err != nil {
-				return err
+		default:
+			if tmpMap == nil {
+				tmpMap = make(VSet_Uint64)
 			}
-			var err error
-			if key, err = dec.DecodeUint(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
+			tmpMap[key] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(VSet_Uint64)
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -3746,23 +3544,18 @@
 		tmpMap = make(VSet_VUint64, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueUint(64); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key VUint64
-		{
-			if err := key.VDLRead(dec); err != nil {
-				return err
+		default:
+			if tmpMap == nil {
+				tmpMap = make(VSet_VUint64)
 			}
+			tmpMap[VUint64(key)] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(VSet_VUint64)
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -3813,31 +3606,18 @@
 		tmpMap = make(VSet_Float32, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueFloat(32); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key float32
-		{
-			if err := dec.StartValue(vdl.Float32Type); err != nil {
-				return err
+		default:
+			if tmpMap == nil {
+				tmpMap = make(VSet_Float32)
 			}
-			tmp, err := dec.DecodeFloat(32)
-			if err != nil {
-				return err
-			}
-			key = float32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
+			tmpMap[float32(key)] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(VSet_Float32)
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -3897,43 +3677,25 @@
 		tmpMap = make(VMap_Bool_Bool, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueBool(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
+		default:
+			var elem bool
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
+				return err
+			default:
+				elem = value
+			}
+			if tmpMap == nil {
+				tmpMap = make(VMap_Bool_Bool)
+			}
+			tmpMap[key] = elem
 		}
-		var key bool
-		{
-			if err := dec.StartValue(vdl.BoolType); err != nil {
-				return err
-			}
-			var err error
-			if key, err = dec.DecodeBool(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem bool
-		{
-			if err := dec.StartValue(vdl.BoolType); err != nil {
-				return err
-			}
-			var err error
-			if elem, err = dec.DecodeBool(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		if tmpMap == nil {
-			tmpMap = make(VMap_Bool_Bool)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -3981,29 +3743,25 @@
 		tmpMap = make(VMap_VBool_VBool, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueBool(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key VBool
-		{
-			if err := key.VDLRead(dec); err != nil {
+		default:
+			var elem VBool
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
 				return err
+			default:
+				elem = VBool(value)
 			}
-		}
-		var elem VBool
-		{
-			if err := elem.VDLRead(dec); err != nil {
-				return err
+			if tmpMap == nil {
+				tmpMap = make(VMap_VBool_VBool)
 			}
+			tmpMap[VBool(key)] = elem
 		}
-		if tmpMap == nil {
-			tmpMap = make(VMap_VBool_VBool)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -4063,43 +3821,25 @@
 		tmpMap = make(VMap_String_String, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
+		default:
+			var elem string
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
+				return err
+			default:
+				elem = value
+			}
+			if tmpMap == nil {
+				tmpMap = make(VMap_String_String)
+			}
+			tmpMap[key] = elem
 		}
-		var key string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
-			}
-			var err error
-			if key, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
-			}
-			var err error
-			if elem, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		if tmpMap == nil {
-			tmpMap = make(VMap_String_String)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -4147,29 +3887,25 @@
 		tmpMap = make(VMap_VString_VString, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key VString
-		{
-			if err := key.VDLRead(dec); err != nil {
+		default:
+			var elem VString
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
+			default:
+				elem = VString(value)
 			}
-		}
-		var elem VString
-		{
-			if err := elem.VDLRead(dec); err != nil {
-				return err
+			if tmpMap == nil {
+				tmpMap = make(VMap_VString_VString)
 			}
+			tmpMap[VString(key)] = elem
 		}
-		if tmpMap == nil {
-			tmpMap = make(VMap_VString_VString)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -4229,45 +3965,25 @@
 		tmpMap = make(VMap_Byte_Byte, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueUint(8); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
+		default:
+			var elem byte
+			switch value, err := dec.ReadValueUint(8); {
+			case err != nil:
+				return err
+			default:
+				elem = byte(value)
+			}
+			if tmpMap == nil {
+				tmpMap = make(VMap_Byte_Byte)
+			}
+			tmpMap[byte(key)] = elem
 		}
-		var key byte
-		{
-			if err := dec.StartValue(vdl.ByteType); err != nil {
-				return err
-			}
-			tmp, err := dec.DecodeUint(8)
-			if err != nil {
-				return err
-			}
-			key = byte(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem byte
-		{
-			if err := dec.StartValue(vdl.ByteType); err != nil {
-				return err
-			}
-			tmp, err := dec.DecodeUint(8)
-			if err != nil {
-				return err
-			}
-			elem = byte(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		if tmpMap == nil {
-			tmpMap = make(VMap_Byte_Byte)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -4315,29 +4031,25 @@
 		tmpMap = make(VMap_VByte_VByte, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueUint(8); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key VByte
-		{
-			if err := key.VDLRead(dec); err != nil {
+		default:
+			var elem VByte
+			switch value, err := dec.ReadValueUint(8); {
+			case err != nil:
 				return err
+			default:
+				elem = VByte(value)
 			}
-		}
-		var elem VByte
-		{
-			if err := elem.VDLRead(dec); err != nil {
-				return err
+			if tmpMap == nil {
+				tmpMap = make(VMap_VByte_VByte)
 			}
+			tmpMap[VByte(key)] = elem
 		}
-		if tmpMap == nil {
-			tmpMap = make(VMap_VByte_VByte)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -4385,29 +4097,31 @@
 		tmpMap = make(VMap_VEnumAbc_VEnumAbc, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key VEnumAbc
-		{
-			if err := key.VDLRead(dec); err != nil {
+		default:
+			var keyEnum VEnumAbc
+			if err := keyEnum.Set(key); err != nil {
 				return err
 			}
-		}
-		var elem VEnumAbc
-		{
-			if err := elem.VDLRead(dec); err != nil {
+			var elem VEnumAbc
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
+			default:
+				if err := elem.Set(value); err != nil {
+					return err
+				}
 			}
+			if tmpMap == nil {
+				tmpMap = make(VMap_VEnumAbc_VEnumAbc)
+			}
+			tmpMap[keyEnum] = elem
 		}
-		if tmpMap == nil {
-			tmpMap = make(VMap_VEnumAbc_VEnumAbc)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -4455,29 +4169,31 @@
 		tmpMap = make(VMap_VEnumBcd_VEnumBcd, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key VEnumBcd
-		{
-			if err := key.VDLRead(dec); err != nil {
+		default:
+			var keyEnum VEnumBcd
+			if err := keyEnum.Set(key); err != nil {
 				return err
 			}
-		}
-		var elem VEnumBcd
-		{
-			if err := elem.VDLRead(dec); err != nil {
+			var elem VEnumBcd
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
+			default:
+				if err := elem.Set(value); err != nil {
+					return err
+				}
 			}
+			if tmpMap == nil {
+				tmpMap = make(VMap_VEnumBcd_VEnumBcd)
+			}
+			tmpMap[keyEnum] = elem
 		}
-		if tmpMap == nil {
-			tmpMap = make(VMap_VEnumBcd_VEnumBcd)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -4531,23 +4247,20 @@
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key VStructEmpty
-		{
+		default:
+			var key VStructEmpty
 			if err := key.VDLRead(dec); err != nil {
 				return err
 			}
-		}
-		var elem VStructEmpty
-		{
+			var elem VStructEmpty
 			if err := elem.VDLRead(dec); err != nil {
 				return err
 			}
+			if tmpMap == nil {
+				tmpMap = make(VMap_VStructEmpty_VStructEmpty)
+			}
+			tmpMap[key] = elem
 		}
-		if tmpMap == nil {
-			tmpMap = make(VMap_VStructEmpty_VStructEmpty)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -4601,23 +4314,20 @@
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key VNamedError
-		{
+		default:
+			var key VNamedError
 			if err := key.VDLRead(dec); err != nil {
 				return err
 			}
-		}
-		var elem VNamedError
-		{
+			var elem VNamedError
 			if err := elem.VDLRead(dec); err != nil {
 				return err
 			}
+			if tmpMap == nil {
+				tmpMap = make(VMap_VNamedError_VNamedError)
+			}
+			tmpMap[key] = elem
 		}
-		if tmpMap == nil {
-			tmpMap = make(VMap_VNamedError_VNamedError)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -4665,29 +4375,25 @@
 		tmpMap = make(VMap_VUint32_VUint32, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueUint(32); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key VUint32
-		{
-			if err := key.VDLRead(dec); err != nil {
+		default:
+			var elem VUint32
+			switch value, err := dec.ReadValueUint(32); {
+			case err != nil:
 				return err
+			default:
+				elem = VUint32(value)
 			}
-		}
-		var elem VUint32
-		{
-			if err := elem.VDLRead(dec); err != nil {
-				return err
+			if tmpMap == nil {
+				tmpMap = make(VMap_VUint32_VUint32)
 			}
+			tmpMap[VUint32(key)] = elem
 		}
-		if tmpMap == nil {
-			tmpMap = make(VMap_VUint32_VUint32)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -4735,29 +4441,25 @@
 		tmpMap = make(VMap_VInt32_VInt32, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueInt(32); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key VInt32
-		{
-			if err := key.VDLRead(dec); err != nil {
+		default:
+			var elem VInt32
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
+			default:
+				elem = VInt32(value)
 			}
-		}
-		var elem VInt32
-		{
-			if err := elem.VDLRead(dec); err != nil {
-				return err
+			if tmpMap == nil {
+				tmpMap = make(VMap_VInt32_VInt32)
 			}
+			tmpMap[VInt32(key)] = elem
 		}
-		if tmpMap == nil {
-			tmpMap = make(VMap_VInt32_VInt32)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -4817,43 +4519,25 @@
 		tmpMap = make(VMap_Int64_Int64, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueInt(64); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
+		default:
+			var elem int64
+			switch value, err := dec.ReadValueInt(64); {
+			case err != nil:
+				return err
+			default:
+				elem = value
+			}
+			if tmpMap == nil {
+				tmpMap = make(VMap_Int64_Int64)
+			}
+			tmpMap[key] = elem
 		}
-		var key int64
-		{
-			if err := dec.StartValue(vdl.Int64Type); err != nil {
-				return err
-			}
-			var err error
-			if key, err = dec.DecodeInt(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem int64
-		{
-			if err := dec.StartValue(vdl.Int64Type); err != nil {
-				return err
-			}
-			var err error
-			if elem, err = dec.DecodeInt(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		if tmpMap == nil {
-			tmpMap = make(VMap_Int64_Int64)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -5375,69 +5059,71 @@
 			}
 			x.F0 = readAny
 		case "F1":
-			if err := dec.StartValue(vdl.BoolType); err != nil {
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.F1, err = dec.DecodeBool(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F1 = value
 			}
 		case "F2":
-			if err := x.F2.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
 				return err
+			default:
+				x.F2 = VBool(value)
 			}
 		case "F3":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.F3, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F3 = value
 			}
 		case "F4":
-			if err := x.F4.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
+			default:
+				x.F4 = VString(value)
 			}
 		case "F5":
-			if err := dec.StartValue(vdl.TypeObjectType); err != nil {
+			switch value, err := dec.ReadValueTypeObject(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.F5, err = dec.DecodeTypeObject(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F5 = value
 			}
 		case "F6":
-			if err := dec.StartValue(vdl.ByteType); err != nil {
+			switch value, err := dec.ReadValueUint(8); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeUint(8)
-			if err != nil {
-				return err
-			}
-			x.F6 = byte(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F6 = byte(value)
 			}
 		case "F7":
-			if err := x.F7.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueUint(8); {
+			case err != nil:
 				return err
+			default:
+				x.F7 = VByte(value)
 			}
 		case "F8":
-			if err := x.F8.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
+			default:
+				if err := x.F8.Set(value); err != nil {
+					return err
+				}
 			}
 		case "F9":
-			if err := x.F9.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
+			default:
+				if err := x.F9.Set(value); err != nil {
+					return err
+				}
 			}
 		case "F10":
 			if err := x.F10.VDLRead(dec); err != nil {
@@ -5452,145 +5138,130 @@
 				return err
 			}
 		case "F13":
-			if err := dec.StartValue(vdl.Uint16Type); err != nil {
+			switch value, err := dec.ReadValueUint(16); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeUint(16)
-			if err != nil {
-				return err
-			}
-			x.F13 = uint16(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F13 = uint16(value)
 			}
 		case "F14":
-			if err := x.F14.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueUint(16); {
+			case err != nil:
 				return err
+			default:
+				x.F14 = VUint16(value)
 			}
 		case "F15":
-			if err := dec.StartValue(vdl.Uint32Type); err != nil {
+			switch value, err := dec.ReadValueUint(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeUint(32)
-			if err != nil {
-				return err
-			}
-			x.F15 = uint32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F15 = uint32(value)
 			}
 		case "F16":
-			if err := x.F16.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueUint(32); {
+			case err != nil:
 				return err
+			default:
+				x.F16 = VUint32(value)
 			}
 		case "F17":
-			if err := dec.StartValue(vdl.Uint64Type); err != nil {
+			switch value, err := dec.ReadValueUint(64); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.F17, err = dec.DecodeUint(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F17 = value
 			}
 		case "F18":
-			if err := x.F18.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueUint(64); {
+			case err != nil:
 				return err
+			default:
+				x.F18 = VUint64(value)
 			}
 		case "F19":
-			if err := dec.StartValue(vdl.Int8Type); err != nil {
+			switch value, err := dec.ReadValueInt(8); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(8)
-			if err != nil {
-				return err
-			}
-			x.F19 = int8(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F19 = int8(value)
 			}
 		case "F20":
-			if err := x.F20.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueInt(8); {
+			case err != nil:
 				return err
+			default:
+				x.F20 = VInt8(value)
 			}
 		case "F21":
-			if err := dec.StartValue(vdl.Int16Type); err != nil {
+			switch value, err := dec.ReadValueInt(16); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(16)
-			if err != nil {
-				return err
-			}
-			x.F21 = int16(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F21 = int16(value)
 			}
 		case "F22":
-			if err := x.F22.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueInt(16); {
+			case err != nil:
 				return err
+			default:
+				x.F22 = VInt16(value)
 			}
 		case "F23":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F23 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F23 = int32(value)
 			}
 		case "F24":
-			if err := x.F24.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
+			default:
+				x.F24 = VInt32(value)
 			}
 		case "F25":
-			if err := dec.StartValue(vdl.Int64Type); err != nil {
+			switch value, err := dec.ReadValueInt(64); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.F25, err = dec.DecodeInt(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F25 = value
 			}
 		case "F26":
-			if err := x.F26.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueInt(64); {
+			case err != nil:
 				return err
+			default:
+				x.F26 = VInt64(value)
 			}
 		case "F27":
-			if err := dec.StartValue(vdl.Float32Type); err != nil {
+			switch value, err := dec.ReadValueFloat(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeFloat(32)
-			if err != nil {
-				return err
-			}
-			x.F27 = float32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F27 = float32(value)
 			}
 		case "F28":
-			if err := x.F28.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueFloat(32); {
+			case err != nil:
 				return err
+			default:
+				x.F28 = VFloat32(value)
 			}
 		case "F29":
-			if err := dec.StartValue(vdl.Float64Type); err != nil {
+			switch value, err := dec.ReadValueFloat(64); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.F29, err = dec.DecodeFloat(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F29 = value
 			}
 		case "F30":
-			if err := x.F30.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueFloat(64); {
+			case err != nil:
 				return err
+			default:
+				x.F30 = VFloat64(value)
 			}
 		case "F31":
 			if err := dec.StartValue(__VDLType_optional_35); err != nil {
@@ -5741,15 +5412,11 @@
 		case "":
 			return dec.FinishValue()
 		case "F1":
-			if err := dec.StartValue(vdl.BoolType); err != nil {
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.F1, err = dec.DecodeBool(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F1 = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -5804,8 +5471,11 @@
 		case "":
 			return dec.FinishValue()
 		case "F2":
-			if err := x.F2.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
 				return err
+			default:
+				x.F2 = VBool(value)
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -5866,15 +5536,11 @@
 		case "":
 			return dec.FinishValue()
 		case "F3":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.F3, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F3 = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -5929,8 +5595,11 @@
 		case "":
 			return dec.FinishValue()
 		case "F4":
-			if err := x.F4.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
+			default:
+				x.F4 = VString(value)
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -5990,15 +5659,11 @@
 		case "":
 			return dec.FinishValue()
 		case "F5":
-			if err := dec.StartValue(vdl.TypeObjectType); err != nil {
+			switch value, err := dec.ReadValueTypeObject(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.F5, err = dec.DecodeTypeObject(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F5 = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -6059,16 +5724,11 @@
 		case "":
 			return dec.FinishValue()
 		case "F6":
-			if err := dec.StartValue(vdl.ByteType); err != nil {
+			switch value, err := dec.ReadValueUint(8); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeUint(8)
-			if err != nil {
-				return err
-			}
-			x.F6 = byte(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F6 = byte(value)
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -6123,8 +5783,11 @@
 		case "":
 			return dec.FinishValue()
 		case "F7":
-			if err := x.F7.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueUint(8); {
+			case err != nil:
 				return err
+			default:
+				x.F7 = VByte(value)
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -6179,8 +5842,13 @@
 		case "":
 			return dec.FinishValue()
 		case "F8":
-			if err := x.F8.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
+			default:
+				if err := x.F8.Set(value); err != nil {
+					return err
+				}
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -6235,8 +5903,13 @@
 		case "":
 			return dec.FinishValue()
 		case "F9":
-			if err := x.F9.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
+			default:
+				if err := x.F9.Set(value); err != nil {
+					return err
+				}
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -6465,16 +6138,11 @@
 		case "":
 			return dec.FinishValue()
 		case "F13":
-			if err := dec.StartValue(vdl.Uint16Type); err != nil {
+			switch value, err := dec.ReadValueUint(16); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeUint(16)
-			if err != nil {
-				return err
-			}
-			x.F13 = uint16(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F13 = uint16(value)
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -6529,8 +6197,11 @@
 		case "":
 			return dec.FinishValue()
 		case "F14":
-			if err := x.F14.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueUint(16); {
+			case err != nil:
 				return err
+			default:
+				x.F14 = VUint16(value)
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -6591,16 +6262,11 @@
 		case "":
 			return dec.FinishValue()
 		case "F15":
-			if err := dec.StartValue(vdl.Uint32Type); err != nil {
+			switch value, err := dec.ReadValueUint(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeUint(32)
-			if err != nil {
-				return err
-			}
-			x.F15 = uint32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F15 = uint32(value)
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -6655,8 +6321,11 @@
 		case "":
 			return dec.FinishValue()
 		case "F16":
-			if err := x.F16.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueUint(32); {
+			case err != nil:
 				return err
+			default:
+				x.F16 = VUint32(value)
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -6717,15 +6386,11 @@
 		case "":
 			return dec.FinishValue()
 		case "F17":
-			if err := dec.StartValue(vdl.Uint64Type); err != nil {
+			switch value, err := dec.ReadValueUint(64); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.F17, err = dec.DecodeUint(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F17 = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -6780,8 +6445,11 @@
 		case "":
 			return dec.FinishValue()
 		case "F18":
-			if err := x.F18.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueUint(64); {
+			case err != nil:
 				return err
+			default:
+				x.F18 = VUint64(value)
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -6842,16 +6510,11 @@
 		case "":
 			return dec.FinishValue()
 		case "F19":
-			if err := dec.StartValue(vdl.Int8Type); err != nil {
+			switch value, err := dec.ReadValueInt(8); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(8)
-			if err != nil {
-				return err
-			}
-			x.F19 = int8(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F19 = int8(value)
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -6906,8 +6569,11 @@
 		case "":
 			return dec.FinishValue()
 		case "F20":
-			if err := x.F20.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueInt(8); {
+			case err != nil:
 				return err
+			default:
+				x.F20 = VInt8(value)
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -6968,16 +6634,11 @@
 		case "":
 			return dec.FinishValue()
 		case "F21":
-			if err := dec.StartValue(vdl.Int16Type); err != nil {
+			switch value, err := dec.ReadValueInt(16); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(16)
-			if err != nil {
-				return err
-			}
-			x.F21 = int16(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F21 = int16(value)
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -7032,8 +6693,11 @@
 		case "":
 			return dec.FinishValue()
 		case "F22":
-			if err := x.F22.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueInt(16); {
+			case err != nil:
 				return err
+			default:
+				x.F22 = VInt16(value)
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -7094,16 +6758,11 @@
 		case "":
 			return dec.FinishValue()
 		case "F23":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F23 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F23 = int32(value)
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -7158,8 +6817,11 @@
 		case "":
 			return dec.FinishValue()
 		case "F24":
-			if err := x.F24.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
+			default:
+				x.F24 = VInt32(value)
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -7220,15 +6882,11 @@
 		case "":
 			return dec.FinishValue()
 		case "F25":
-			if err := dec.StartValue(vdl.Int64Type); err != nil {
+			switch value, err := dec.ReadValueInt(64); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.F25, err = dec.DecodeInt(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F25 = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -7283,8 +6941,11 @@
 		case "":
 			return dec.FinishValue()
 		case "F26":
-			if err := x.F26.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueInt(64); {
+			case err != nil:
 				return err
+			default:
+				x.F26 = VInt64(value)
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -7345,16 +7006,11 @@
 		case "":
 			return dec.FinishValue()
 		case "F27":
-			if err := dec.StartValue(vdl.Float32Type); err != nil {
+			switch value, err := dec.ReadValueFloat(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeFloat(32)
-			if err != nil {
-				return err
-			}
-			x.F27 = float32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F27 = float32(value)
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -7409,8 +7065,11 @@
 		case "":
 			return dec.FinishValue()
 		case "F28":
-			if err := x.F28.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueFloat(32); {
+			case err != nil:
 				return err
+			default:
+				x.F28 = VFloat32(value)
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -7471,15 +7130,11 @@
 		case "":
 			return dec.FinishValue()
 		case "F29":
-			if err := dec.StartValue(vdl.Float64Type); err != nil {
+			switch value, err := dec.ReadValueFloat(64); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.F29, err = dec.DecodeFloat(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F29 = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -7534,8 +7189,11 @@
 		case "":
 			return dec.FinishValue()
 		case "F30":
-			if err := x.F30.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueFloat(64); {
+			case err != nil:
 				return err
+			default:
+				x.F30 = VFloat64(value)
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -8743,85 +8401,87 @@
 		*x = field
 	case "F1":
 		var field VUnionDepth1_AllF1
-		if err := dec.StartValue(vdl.BoolType); err != nil {
+		switch value, err := dec.ReadValueBool(); {
+		case err != nil:
 			return err
-		}
-		var err error
-		if field.Value, err = dec.DecodeBool(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = value
 		}
 		*x = field
 	case "F2":
 		var field VUnionDepth1_AllF2
-		if err := field.Value.VDLRead(dec); err != nil {
+		switch value, err := dec.ReadValueBool(); {
+		case err != nil:
 			return err
+		default:
+			field.Value = VBool(value)
 		}
 		*x = field
 	case "F3":
 		var field VUnionDepth1_AllF3
-		if err := dec.StartValue(vdl.StringType); err != nil {
+		switch value, err := dec.ReadValueString(); {
+		case err != nil:
 			return err
-		}
-		var err error
-		if field.Value, err = dec.DecodeString(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = value
 		}
 		*x = field
 	case "F4":
 		var field VUnionDepth1_AllF4
-		if err := field.Value.VDLRead(dec); err != nil {
+		switch value, err := dec.ReadValueString(); {
+		case err != nil:
 			return err
+		default:
+			field.Value = VString(value)
 		}
 		*x = field
 	case "F5":
 		var field VUnionDepth1_AllF5
-		if err := dec.StartValue(vdl.TypeObjectType); err != nil {
+		switch value, err := dec.ReadValueTypeObject(); {
+		case err != nil:
 			return err
-		}
-		var err error
-		if field.Value, err = dec.DecodeTypeObject(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = value
 		}
 		*x = field
 	case "F6":
 		var field VUnionDepth1_AllF6
-		if err := dec.StartValue(vdl.ByteType); err != nil {
+		switch value, err := dec.ReadValueUint(8); {
+		case err != nil:
 			return err
-		}
-		tmp, err := dec.DecodeUint(8)
-		if err != nil {
-			return err
-		}
-		field.Value = byte(tmp)
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = byte(value)
 		}
 		*x = field
 	case "F7":
 		var field VUnionDepth1_AllF7
-		if err := field.Value.VDLRead(dec); err != nil {
+		switch value, err := dec.ReadValueUint(8); {
+		case err != nil:
 			return err
+		default:
+			field.Value = VByte(value)
 		}
 		*x = field
 	case "F8":
 		var field VUnionDepth1_AllF8
-		if err := field.Value.VDLRead(dec); err != nil {
+		switch value, err := dec.ReadValueString(); {
+		case err != nil:
 			return err
+		default:
+			if err := field.Value.Set(value); err != nil {
+				return err
+			}
 		}
 		*x = field
 	case "F9":
 		var field VUnionDepth1_AllF9
-		if err := field.Value.VDLRead(dec); err != nil {
+		switch value, err := dec.ReadValueString(); {
+		case err != nil:
 			return err
+		default:
+			if err := field.Value.Set(value); err != nil {
+				return err
+			}
 		}
 		*x = field
 	case "F10":
@@ -8844,179 +8504,164 @@
 		*x = field
 	case "F13":
 		var field VUnionDepth1_AllF13
-		if err := dec.StartValue(vdl.Uint16Type); err != nil {
+		switch value, err := dec.ReadValueUint(16); {
+		case err != nil:
 			return err
-		}
-		tmp, err := dec.DecodeUint(16)
-		if err != nil {
-			return err
-		}
-		field.Value = uint16(tmp)
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = uint16(value)
 		}
 		*x = field
 	case "F14":
 		var field VUnionDepth1_AllF14
-		if err := field.Value.VDLRead(dec); err != nil {
+		switch value, err := dec.ReadValueUint(16); {
+		case err != nil:
 			return err
+		default:
+			field.Value = VUint16(value)
 		}
 		*x = field
 	case "F15":
 		var field VUnionDepth1_AllF15
-		if err := dec.StartValue(vdl.Uint32Type); err != nil {
+		switch value, err := dec.ReadValueUint(32); {
+		case err != nil:
 			return err
-		}
-		tmp, err := dec.DecodeUint(32)
-		if err != nil {
-			return err
-		}
-		field.Value = uint32(tmp)
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = uint32(value)
 		}
 		*x = field
 	case "F16":
 		var field VUnionDepth1_AllF16
-		if err := field.Value.VDLRead(dec); err != nil {
+		switch value, err := dec.ReadValueUint(32); {
+		case err != nil:
 			return err
+		default:
+			field.Value = VUint32(value)
 		}
 		*x = field
 	case "F17":
 		var field VUnionDepth1_AllF17
-		if err := dec.StartValue(vdl.Uint64Type); err != nil {
+		switch value, err := dec.ReadValueUint(64); {
+		case err != nil:
 			return err
-		}
-		var err error
-		if field.Value, err = dec.DecodeUint(64); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = value
 		}
 		*x = field
 	case "F18":
 		var field VUnionDepth1_AllF18
-		if err := field.Value.VDLRead(dec); err != nil {
+		switch value, err := dec.ReadValueUint(64); {
+		case err != nil:
 			return err
+		default:
+			field.Value = VUint64(value)
 		}
 		*x = field
 	case "F19":
 		var field VUnionDepth1_AllF19
-		if err := dec.StartValue(vdl.Int8Type); err != nil {
+		switch value, err := dec.ReadValueInt(8); {
+		case err != nil:
 			return err
-		}
-		tmp, err := dec.DecodeInt(8)
-		if err != nil {
-			return err
-		}
-		field.Value = int8(tmp)
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = int8(value)
 		}
 		*x = field
 	case "F20":
 		var field VUnionDepth1_AllF20
-		if err := field.Value.VDLRead(dec); err != nil {
+		switch value, err := dec.ReadValueInt(8); {
+		case err != nil:
 			return err
+		default:
+			field.Value = VInt8(value)
 		}
 		*x = field
 	case "F21":
 		var field VUnionDepth1_AllF21
-		if err := dec.StartValue(vdl.Int16Type); err != nil {
+		switch value, err := dec.ReadValueInt(16); {
+		case err != nil:
 			return err
-		}
-		tmp, err := dec.DecodeInt(16)
-		if err != nil {
-			return err
-		}
-		field.Value = int16(tmp)
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = int16(value)
 		}
 		*x = field
 	case "F22":
 		var field VUnionDepth1_AllF22
-		if err := field.Value.VDLRead(dec); err != nil {
+		switch value, err := dec.ReadValueInt(16); {
+		case err != nil:
 			return err
+		default:
+			field.Value = VInt16(value)
 		}
 		*x = field
 	case "F23":
 		var field VUnionDepth1_AllF23
-		if err := dec.StartValue(vdl.Int32Type); err != nil {
+		switch value, err := dec.ReadValueInt(32); {
+		case err != nil:
 			return err
-		}
-		tmp, err := dec.DecodeInt(32)
-		if err != nil {
-			return err
-		}
-		field.Value = int32(tmp)
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = int32(value)
 		}
 		*x = field
 	case "F24":
 		var field VUnionDepth1_AllF24
-		if err := field.Value.VDLRead(dec); err != nil {
+		switch value, err := dec.ReadValueInt(32); {
+		case err != nil:
 			return err
+		default:
+			field.Value = VInt32(value)
 		}
 		*x = field
 	case "F25":
 		var field VUnionDepth1_AllF25
-		if err := dec.StartValue(vdl.Int64Type); err != nil {
+		switch value, err := dec.ReadValueInt(64); {
+		case err != nil:
 			return err
-		}
-		var err error
-		if field.Value, err = dec.DecodeInt(64); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = value
 		}
 		*x = field
 	case "F26":
 		var field VUnionDepth1_AllF26
-		if err := field.Value.VDLRead(dec); err != nil {
+		switch value, err := dec.ReadValueInt(64); {
+		case err != nil:
 			return err
+		default:
+			field.Value = VInt64(value)
 		}
 		*x = field
 	case "F27":
 		var field VUnionDepth1_AllF27
-		if err := dec.StartValue(vdl.Float32Type); err != nil {
+		switch value, err := dec.ReadValueFloat(32); {
+		case err != nil:
 			return err
-		}
-		tmp, err := dec.DecodeFloat(32)
-		if err != nil {
-			return err
-		}
-		field.Value = float32(tmp)
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = float32(value)
 		}
 		*x = field
 	case "F28":
 		var field VUnionDepth1_AllF28
-		if err := field.Value.VDLRead(dec); err != nil {
+		switch value, err := dec.ReadValueFloat(32); {
+		case err != nil:
 			return err
+		default:
+			field.Value = VFloat32(value)
 		}
 		*x = field
 	case "F29":
 		var field VUnionDepth1_AllF29
-		if err := dec.StartValue(vdl.Float64Type); err != nil {
+		switch value, err := dec.ReadValueFloat(64); {
+		case err != nil:
 			return err
-		}
-		var err error
-		if field.Value, err = dec.DecodeFloat(64); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = value
 		}
 		*x = field
 	case "F30":
 		var field VUnionDepth1_AllF30
-		if err := field.Value.VDLRead(dec); err != nil {
+		switch value, err := dec.ReadValueFloat(64); {
+		case err != nil:
 			return err
+		default:
+			field.Value = VFloat64(value)
 		}
 		*x = field
 	case "F31":
@@ -9219,15 +8864,11 @@
 	switch f {
 	case "F1":
 		var field VUnionDepth1_BoolF1
-		if err := dec.StartValue(vdl.BoolType); err != nil {
+		switch value, err := dec.ReadValueBool(); {
+		case err != nil:
 			return err
-		}
-		var err error
-		if field.Value, err = dec.DecodeBool(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = value
 		}
 		*x = field
 	case "":
@@ -9306,8 +8947,11 @@
 	switch f {
 	case "F2":
 		var field VUnionDepth1_VBoolF2
-		if err := field.Value.VDLRead(dec); err != nil {
+		switch value, err := dec.ReadValueBool(); {
+		case err != nil:
 			return err
+		default:
+			field.Value = VBool(value)
 		}
 		*x = field
 	case "":
@@ -9392,15 +9036,11 @@
 	switch f {
 	case "F3":
 		var field VUnionDepth1_StringF3
-		if err := dec.StartValue(vdl.StringType); err != nil {
+		switch value, err := dec.ReadValueString(); {
+		case err != nil:
 			return err
-		}
-		var err error
-		if field.Value, err = dec.DecodeString(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = value
 		}
 		*x = field
 	case "":
@@ -9479,8 +9119,11 @@
 	switch f {
 	case "F4":
 		var field VUnionDepth1_VStringF4
-		if err := field.Value.VDLRead(dec); err != nil {
+		switch value, err := dec.ReadValueString(); {
+		case err != nil:
 			return err
+		default:
+			field.Value = VString(value)
 		}
 		*x = field
 	case "":
@@ -9559,15 +9202,11 @@
 	switch f {
 	case "F5":
 		var field VUnionDepth1_TypeObjectF5
-		if err := dec.StartValue(vdl.TypeObjectType); err != nil {
+		switch value, err := dec.ReadValueTypeObject(); {
+		case err != nil:
 			return err
-		}
-		var err error
-		if field.Value, err = dec.DecodeTypeObject(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = value
 		}
 		*x = field
 	case "":
@@ -9652,16 +9291,11 @@
 	switch f {
 	case "F6":
 		var field VUnionDepth1_ByteF6
-		if err := dec.StartValue(vdl.ByteType); err != nil {
+		switch value, err := dec.ReadValueUint(8); {
+		case err != nil:
 			return err
-		}
-		tmp, err := dec.DecodeUint(8)
-		if err != nil {
-			return err
-		}
-		field.Value = byte(tmp)
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = byte(value)
 		}
 		*x = field
 	case "":
@@ -9740,8 +9374,11 @@
 	switch f {
 	case "F7":
 		var field VUnionDepth1_VByteF7
-		if err := field.Value.VDLRead(dec); err != nil {
+		switch value, err := dec.ReadValueUint(8); {
+		case err != nil:
 			return err
+		default:
+			field.Value = VByte(value)
 		}
 		*x = field
 	case "":
@@ -9820,8 +9457,13 @@
 	switch f {
 	case "F8":
 		var field VUnionDepth1_VEnumAbcF8
-		if err := field.Value.VDLRead(dec); err != nil {
+		switch value, err := dec.ReadValueString(); {
+		case err != nil:
 			return err
+		default:
+			if err := field.Value.Set(value); err != nil {
+				return err
+			}
 		}
 		*x = field
 	case "":
@@ -9900,8 +9542,13 @@
 	switch f {
 	case "F9":
 		var field VUnionDepth1_VEnumBcdF9
-		if err := field.Value.VDLRead(dec); err != nil {
+		switch value, err := dec.ReadValueString(); {
+		case err != nil:
 			return err
+		default:
+			if err := field.Value.Set(value); err != nil {
+				return err
+			}
 		}
 		*x = field
 	case "":
@@ -10226,16 +9873,11 @@
 	switch f {
 	case "F13":
 		var field VUnionDepth1_Uint16F13
-		if err := dec.StartValue(vdl.Uint16Type); err != nil {
+		switch value, err := dec.ReadValueUint(16); {
+		case err != nil:
 			return err
-		}
-		tmp, err := dec.DecodeUint(16)
-		if err != nil {
-			return err
-		}
-		field.Value = uint16(tmp)
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = uint16(value)
 		}
 		*x = field
 	case "":
@@ -10314,8 +9956,11 @@
 	switch f {
 	case "F14":
 		var field VUnionDepth1_VUint16F14
-		if err := field.Value.VDLRead(dec); err != nil {
+		switch value, err := dec.ReadValueUint(16); {
+		case err != nil:
 			return err
+		default:
+			field.Value = VUint16(value)
 		}
 		*x = field
 	case "":
@@ -10400,16 +10045,11 @@
 	switch f {
 	case "F15":
 		var field VUnionDepth1_Uint32F15
-		if err := dec.StartValue(vdl.Uint32Type); err != nil {
+		switch value, err := dec.ReadValueUint(32); {
+		case err != nil:
 			return err
-		}
-		tmp, err := dec.DecodeUint(32)
-		if err != nil {
-			return err
-		}
-		field.Value = uint32(tmp)
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = uint32(value)
 		}
 		*x = field
 	case "":
@@ -10488,8 +10128,11 @@
 	switch f {
 	case "F16":
 		var field VUnionDepth1_VUint32F16
-		if err := field.Value.VDLRead(dec); err != nil {
+		switch value, err := dec.ReadValueUint(32); {
+		case err != nil:
 			return err
+		default:
+			field.Value = VUint32(value)
 		}
 		*x = field
 	case "":
@@ -10574,15 +10217,11 @@
 	switch f {
 	case "F17":
 		var field VUnionDepth1_Uint64F17
-		if err := dec.StartValue(vdl.Uint64Type); err != nil {
+		switch value, err := dec.ReadValueUint(64); {
+		case err != nil:
 			return err
-		}
-		var err error
-		if field.Value, err = dec.DecodeUint(64); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = value
 		}
 		*x = field
 	case "":
@@ -10661,8 +10300,11 @@
 	switch f {
 	case "F18":
 		var field VUnionDepth1_VUint64F18
-		if err := field.Value.VDLRead(dec); err != nil {
+		switch value, err := dec.ReadValueUint(64); {
+		case err != nil:
 			return err
+		default:
+			field.Value = VUint64(value)
 		}
 		*x = field
 	case "":
@@ -10747,16 +10389,11 @@
 	switch f {
 	case "F19":
 		var field VUnionDepth1_Int8F19
-		if err := dec.StartValue(vdl.Int8Type); err != nil {
+		switch value, err := dec.ReadValueInt(8); {
+		case err != nil:
 			return err
-		}
-		tmp, err := dec.DecodeInt(8)
-		if err != nil {
-			return err
-		}
-		field.Value = int8(tmp)
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = int8(value)
 		}
 		*x = field
 	case "":
@@ -10835,8 +10472,11 @@
 	switch f {
 	case "F20":
 		var field VUnionDepth1_VInt8F20
-		if err := field.Value.VDLRead(dec); err != nil {
+		switch value, err := dec.ReadValueInt(8); {
+		case err != nil:
 			return err
+		default:
+			field.Value = VInt8(value)
 		}
 		*x = field
 	case "":
@@ -10921,16 +10561,11 @@
 	switch f {
 	case "F21":
 		var field VUnionDepth1_Int16F21
-		if err := dec.StartValue(vdl.Int16Type); err != nil {
+		switch value, err := dec.ReadValueInt(16); {
+		case err != nil:
 			return err
-		}
-		tmp, err := dec.DecodeInt(16)
-		if err != nil {
-			return err
-		}
-		field.Value = int16(tmp)
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = int16(value)
 		}
 		*x = field
 	case "":
@@ -11009,8 +10644,11 @@
 	switch f {
 	case "F22":
 		var field VUnionDepth1_VInt16F22
-		if err := field.Value.VDLRead(dec); err != nil {
+		switch value, err := dec.ReadValueInt(16); {
+		case err != nil:
 			return err
+		default:
+			field.Value = VInt16(value)
 		}
 		*x = field
 	case "":
@@ -11095,16 +10733,11 @@
 	switch f {
 	case "F23":
 		var field VUnionDepth1_Int32F23
-		if err := dec.StartValue(vdl.Int32Type); err != nil {
+		switch value, err := dec.ReadValueInt(32); {
+		case err != nil:
 			return err
-		}
-		tmp, err := dec.DecodeInt(32)
-		if err != nil {
-			return err
-		}
-		field.Value = int32(tmp)
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = int32(value)
 		}
 		*x = field
 	case "":
@@ -11183,8 +10816,11 @@
 	switch f {
 	case "F24":
 		var field VUnionDepth1_VInt32F24
-		if err := field.Value.VDLRead(dec); err != nil {
+		switch value, err := dec.ReadValueInt(32); {
+		case err != nil:
 			return err
+		default:
+			field.Value = VInt32(value)
 		}
 		*x = field
 	case "":
@@ -11269,15 +10905,11 @@
 	switch f {
 	case "F25":
 		var field VUnionDepth1_Int64F25
-		if err := dec.StartValue(vdl.Int64Type); err != nil {
+		switch value, err := dec.ReadValueInt(64); {
+		case err != nil:
 			return err
-		}
-		var err error
-		if field.Value, err = dec.DecodeInt(64); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = value
 		}
 		*x = field
 	case "":
@@ -11356,8 +10988,11 @@
 	switch f {
 	case "F26":
 		var field VUnionDepth1_VInt64F26
-		if err := field.Value.VDLRead(dec); err != nil {
+		switch value, err := dec.ReadValueInt(64); {
+		case err != nil:
 			return err
+		default:
+			field.Value = VInt64(value)
 		}
 		*x = field
 	case "":
@@ -11442,16 +11077,11 @@
 	switch f {
 	case "F27":
 		var field VUnionDepth1_Float32F27
-		if err := dec.StartValue(vdl.Float32Type); err != nil {
+		switch value, err := dec.ReadValueFloat(32); {
+		case err != nil:
 			return err
-		}
-		tmp, err := dec.DecodeFloat(32)
-		if err != nil {
-			return err
-		}
-		field.Value = float32(tmp)
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = float32(value)
 		}
 		*x = field
 	case "":
@@ -11530,8 +11160,11 @@
 	switch f {
 	case "F28":
 		var field VUnionDepth1_VFloat32F28
-		if err := field.Value.VDLRead(dec); err != nil {
+		switch value, err := dec.ReadValueFloat(32); {
+		case err != nil:
 			return err
+		default:
+			field.Value = VFloat32(value)
 		}
 		*x = field
 	case "":
@@ -11616,15 +11249,11 @@
 	switch f {
 	case "F29":
 		var field VUnionDepth1_Float64F29
-		if err := dec.StartValue(vdl.Float64Type); err != nil {
+		switch value, err := dec.ReadValueFloat(64); {
+		case err != nil:
 			return err
-		}
-		var err error
-		if field.Value, err = dec.DecodeFloat(64); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = value
 		}
 		*x = field
 	case "":
@@ -11703,8 +11332,11 @@
 	switch f {
 	case "F30":
 		var field VUnionDepth1_VFloat64F30
-		if err := field.Value.VDLRead(dec); err != nil {
+		switch value, err := dec.ReadValueFloat(64); {
+		case err != nil:
 			return err
+		default:
+			field.Value = VFloat64(value)
 		}
 		*x = field
 	case "":
@@ -11956,21 +11588,25 @@
 	if err := dec.StartValue(__VDLType_array_150); err != nil {
 		return err
 	}
-	index := 0
-	for {
+	for index := 0; index < 1; index++ {
 		switch done, err := dec.NextEntry(); {
 		case err != nil:
 			return err
-		case done != (index >= len(*x)):
-			return fmt.Errorf("array len mismatch, done:%v index:%d len:%d %T)", done, index, len(*x), *x)
 		case done:
-			return dec.FinishValue()
+			return fmt.Errorf("short array, got len %d < 1 %T)", index, *x)
+		default:
+			if err := x[index].VDLRead(dec); err != nil {
+				return err
+			}
 		}
-		if err := x[index].VDLRead(dec); err != nil {
-			return err
-		}
-		index++
 	}
+	switch done, err := dec.NextEntry(); {
+	case err != nil:
+		return err
+	case !done:
+		return fmt.Errorf("long array, got len > 1 %T", *x)
+	}
+	return dec.FinishValue()
 }
 
 type VArray1_VList_Byte [1]VList_Byte
@@ -12011,21 +11647,27 @@
 	if err := dec.StartValue(__VDLType_array_151); err != nil {
 		return err
 	}
-	index := 0
-	for {
+	for index := 0; index < 1; index++ {
 		switch done, err := dec.NextEntry(); {
 		case err != nil:
 			return err
-		case done != (index >= len(*x)):
-			return fmt.Errorf("array len mismatch, done:%v index:%d len:%d %T)", done, index, len(*x), *x)
 		case done:
-			return dec.FinishValue()
+			return fmt.Errorf("short array, got len %d < 1 %T)", index, *x)
+		default:
+			var bytes []byte
+			if err := dec.ReadValueBytes(-1, &bytes); err != nil {
+				return err
+			}
+			x[index] = bytes
 		}
-		if err := x[index].VDLRead(dec); err != nil {
-			return err
-		}
-		index++
 	}
+	switch done, err := dec.NextEntry(); {
+	case err != nil:
+		return err
+	case !done:
+		return fmt.Errorf("long array, got len > 1 %T", *x)
+	}
+	return dec.FinishValue()
 }
 
 type VArray1_Set_VEnumBcd [1]map[VEnumBcd]struct{}
@@ -12087,21 +11729,25 @@
 	if err := dec.StartValue(__VDLType_array_152); err != nil {
 		return err
 	}
-	index := 0
-	for {
+	for index := 0; index < 1; index++ {
 		switch done, err := dec.NextEntry(); {
 		case err != nil:
 			return err
-		case done != (index >= len(*x)):
-			return fmt.Errorf("array len mismatch, done:%v index:%d len:%d %T)", done, index, len(*x), *x)
 		case done:
-			return dec.FinishValue()
+			return fmt.Errorf("short array, got len %d < 1 %T)", index, *x)
+		default:
+			if err := __VDLReadAnon_set_1(dec, &x[index]); err != nil {
+				return err
+			}
 		}
-		if err := __VDLReadAnon_set_1(dec, &x[index]); err != nil {
-			return err
-		}
-		index++
 	}
+	switch done, err := dec.NextEntry(); {
+	case err != nil:
+		return err
+	case !done:
+		return fmt.Errorf("long array, got len > 1 %T", *x)
+	}
+	return dec.FinishValue()
 }
 
 func __VDLReadAnon_set_1(dec vdl.Decoder, x *map[VEnumBcd]struct{}) error {
@@ -12113,23 +11759,22 @@
 		tmpMap = make(map[VEnumBcd]struct{}, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key VEnumBcd
-		{
-			if err := key.VDLRead(dec); err != nil {
+		default:
+			var keyEnum VEnumBcd
+			if err := keyEnum.Set(key); err != nil {
 				return err
 			}
+			if tmpMap == nil {
+				tmpMap = make(map[VEnumBcd]struct{})
+			}
+			tmpMap[keyEnum] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(map[VEnumBcd]struct{})
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -12207,21 +11852,25 @@
 	if err := dec.StartValue(__VDLType_array_154); err != nil {
 		return err
 	}
-	index := 0
-	for {
+	for index := 0; index < 2; index++ {
 		switch done, err := dec.NextEntry(); {
 		case err != nil:
 			return err
-		case done != (index >= len(*x)):
-			return fmt.Errorf("array len mismatch, done:%v index:%d len:%d %T)", done, index, len(*x), *x)
 		case done:
-			return dec.FinishValue()
+			return fmt.Errorf("short array, got len %d < 2 %T)", index, *x)
+		default:
+			if err := __VDLReadAnon_map_2(dec, &x[index]); err != nil {
+				return err
+			}
 		}
-		if err := __VDLReadAnon_map_2(dec, &x[index]); err != nil {
-			return err
-		}
-		index++
 	}
+	switch done, err := dec.NextEntry(); {
+	case err != nil:
+		return err
+	case !done:
+		return fmt.Errorf("long array, got len > 2 %T", *x)
+	}
+	return dec.FinishValue()
 }
 
 func __VDLReadAnon_map_2(dec vdl.Decoder, x *map[byte]byte) error {
@@ -12233,45 +11882,25 @@
 		tmpMap = make(map[byte]byte, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueUint(8); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
+		default:
+			var elem byte
+			switch value, err := dec.ReadValueUint(8); {
+			case err != nil:
+				return err
+			default:
+				elem = byte(value)
+			}
+			if tmpMap == nil {
+				tmpMap = make(map[byte]byte)
+			}
+			tmpMap[byte(key)] = elem
 		}
-		var key byte
-		{
-			if err := dec.StartValue(vdl.ByteType); err != nil {
-				return err
-			}
-			tmp, err := dec.DecodeUint(8)
-			if err != nil {
-				return err
-			}
-			key = byte(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem byte
-		{
-			if err := dec.StartValue(vdl.ByteType); err != nil {
-				return err
-			}
-			tmp, err := dec.DecodeUint(8)
-			if err != nil {
-				return err
-			}
-			elem = byte(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		if tmpMap == nil {
-			tmpMap = make(map[byte]byte)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -12313,21 +11942,25 @@
 	if err := dec.StartValue(__VDLType_array_156); err != nil {
 		return err
 	}
-	index := 0
-	for {
+	for index := 0; index < 2; index++ {
 		switch done, err := dec.NextEntry(); {
 		case err != nil:
 			return err
-		case done != (index >= len(*x)):
-			return fmt.Errorf("array len mismatch, done:%v index:%d len:%d %T)", done, index, len(*x), *x)
 		case done:
-			return dec.FinishValue()
+			return fmt.Errorf("short array, got len %d < 2 %T)", index, *x)
+		default:
+			if err := x[index].VDLRead(dec); err != nil {
+				return err
+			}
 		}
-		if err := x[index].VDLRead(dec); err != nil {
-			return err
-		}
-		index++
 	}
+	switch done, err := dec.NextEntry(); {
+	case err != nil:
+		return err
+	case !done:
+		return fmt.Errorf("long array, got len > 2 %T", *x)
+	}
+	return dec.FinishValue()
 }
 
 type VArray3_VUnionDepth1_All [3]VUnionDepth1_All
@@ -12376,21 +12009,25 @@
 	if err := dec.StartValue(__VDLType_array_157); err != nil {
 		return err
 	}
-	index := 0
-	for {
+	for index := 0; index < 3; index++ {
 		switch done, err := dec.NextEntry(); {
 		case err != nil:
 			return err
-		case done != (index >= len(*x)):
-			return fmt.Errorf("array len mismatch, done:%v index:%d len:%d %T)", done, index, len(*x), *x)
 		case done:
-			return dec.FinishValue()
+			return fmt.Errorf("short array, got len %d < 3 %T)", index, *x)
+		default:
+			if err := VDLReadVUnionDepth1_All(dec, &x[index]); err != nil {
+				return err
+			}
 		}
-		if err := VDLReadVUnionDepth1_All(dec, &x[index]); err != nil {
-			return err
-		}
-		index++
 	}
+	switch done, err := dec.NextEntry(); {
+	case err != nil:
+		return err
+	case !done:
+		return fmt.Errorf("long array, got len > 3 %T", *x)
+	}
+	return dec.FinishValue()
 }
 
 type VArray3_OptVStructDepth1_VFloat32 [3]*VStructDepth1_VFloat32
@@ -12435,33 +12072,37 @@
 	if err := dec.StartValue(__VDLType_array_158); err != nil {
 		return err
 	}
-	index := 0
-	for {
+	for index := 0; index < 3; index++ {
 		switch done, err := dec.NextEntry(); {
 		case err != nil:
 			return err
-		case done != (index >= len(*x)):
-			return fmt.Errorf("array len mismatch, done:%v index:%d len:%d %T)", done, index, len(*x), *x)
 		case done:
-			return dec.FinishValue()
-		}
-		if err := dec.StartValue(__VDLType_optional_159); err != nil {
-			return err
-		}
-		if dec.IsNil() {
-			x[index] = nil
-			if err := dec.FinishValue(); err != nil {
+			return fmt.Errorf("short array, got len %d < 3 %T)", index, *x)
+		default:
+			if err := dec.StartValue(__VDLType_optional_159); err != nil {
 				return err
 			}
-		} else {
-			x[index] = new(VStructDepth1_VFloat32)
-			dec.IgnoreNextStartValue()
-			if err := x[index].VDLRead(dec); err != nil {
-				return err
+			if dec.IsNil() {
+				x[index] = nil
+				if err := dec.FinishValue(); err != nil {
+					return err
+				}
+			} else {
+				x[index] = new(VStructDepth1_VFloat32)
+				dec.IgnoreNextStartValue()
+				if err := x[index].VDLRead(dec); err != nil {
+					return err
+				}
 			}
 		}
-		index++
 	}
+	switch done, err := dec.NextEntry(); {
+	case err != nil:
+		return err
+	case !done:
+		return fmt.Errorf("long array, got len > 3 %T", *x)
+	}
+	return dec.FinishValue()
 }
 
 type VList_VArray1_VStructEmpty []VArray1_VStructEmpty
@@ -12500,10 +12141,9 @@
 	if err := dec.StartValue(__VDLType_list_160); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(VList_VArray1_VStructEmpty, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -12512,12 +12152,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem VArray1_VStructEmpty
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem VArray1_VStructEmpty
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -12578,10 +12219,9 @@
 	if err := dec.StartValue(__VDLType_list_161); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(VList_List_VString, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -12590,12 +12230,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem []VString
+			if err := __VDLReadAnon_list_3(dec, &elem); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem []VString
-		if err := __VDLReadAnon_list_3(dec, &elem); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -12603,24 +12244,20 @@
 	if err := dec.StartValue(__VDLType_list_162); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make([]VString, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, elem, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			*x = append(*x, VString(elem))
 		}
-		var elem VString
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -12681,10 +12318,9 @@
 	if err := dec.StartValue(__VDLType_list_163); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(VList_Set_VBool, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -12693,12 +12329,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem map[VBool]struct{}
+			if err := __VDLReadAnon_set_4(dec, &elem); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem map[VBool]struct{}
-		if err := __VDLReadAnon_set_4(dec, &elem); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -12711,23 +12348,18 @@
 		tmpMap = make(map[VBool]struct{}, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueBool(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key VBool
-		{
-			if err := key.VDLRead(dec); err != nil {
-				return err
+		default:
+			if tmpMap == nil {
+				tmpMap = make(map[VBool]struct{})
 			}
+			tmpMap[VBool(key)] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(map[VBool]struct{})
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -12767,10 +12399,9 @@
 	if err := dec.StartValue(__VDLType_list_165); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(VList_VMap_Byte_Byte, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -12779,12 +12410,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem VMap_Byte_Byte
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem VMap_Byte_Byte
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -12824,10 +12456,9 @@
 	if err := dec.StartValue(__VDLType_list_166); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(VList_VStructDepth1_All, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -12836,12 +12467,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem VStructDepth1_All
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem VStructDepth1_All
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -12889,10 +12521,9 @@
 	if err := dec.StartValue(__VDLType_list_167); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(VList_VUnionDepth1_All, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -12901,12 +12532,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem VUnionDepth1_All
+			if err := VDLReadVUnionDepth1_All(dec, &elem); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem VUnionDepth1_All
-		if err := VDLReadVUnionDepth1_All(dec, &elem); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -12955,10 +12587,9 @@
 	if err := dec.StartValue(__VDLType_list_168); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(VList_OptVStructDepth1_VEnumBcd, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -12967,24 +12598,25 @@
 			return err
 		case done:
 			return dec.FinishValue()
-		}
-		var elem *VStructDepth1_VEnumBcd
-		if err := dec.StartValue(__VDLType_optional_169); err != nil {
-			return err
-		}
-		if dec.IsNil() {
-			elem = nil
-			if err := dec.FinishValue(); err != nil {
+		default:
+			var elem *VStructDepth1_VEnumBcd
+			if err := dec.StartValue(__VDLType_optional_169); err != nil {
 				return err
 			}
-		} else {
-			elem = new(VStructDepth1_VEnumBcd)
-			dec.IgnoreNextStartValue()
-			if err := elem.VDLRead(dec); err != nil {
-				return err
+			if dec.IsNil() {
+				elem = nil
+				if err := dec.FinishValue(); err != nil {
+					return err
+				}
+			} else {
+				elem = new(VStructDepth1_VEnumBcd)
+				dec.IgnoreNextStartValue()
+				if err := elem.VDLRead(dec); err != nil {
+					return err
+				}
 			}
+			*x = append(*x, elem)
 		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -13035,17 +12667,16 @@
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key VArray1_VStructEmpty
-		{
+		default:
+			var key VArray1_VStructEmpty
 			if err := key.VDLRead(dec); err != nil {
 				return err
 			}
+			if tmpMap == nil {
+				tmpMap = make(VSet_VArray1_VStructEmpty)
+			}
+			tmpMap[key] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(VSet_VArray1_VStructEmpty)
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -13096,17 +12727,16 @@
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key VStructDepth1_VFloat64
-		{
+		default:
+			var key VStructDepth1_VFloat64
 			if err := key.VDLRead(dec); err != nil {
 				return err
 			}
+			if tmpMap == nil {
+				tmpMap = make(VSet_VStructDepth1_VFloat64)
+			}
+			tmpMap[key] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(VSet_VStructDepth1_VFloat64)
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -13165,17 +12795,16 @@
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key VUnionDepth1_VInt8
-		{
+		default:
+			var key VUnionDepth1_VInt8
 			if err := VDLReadVUnionDepth1_VInt8(dec, &key); err != nil {
 				return err
 			}
+			if tmpMap == nil {
+				tmpMap = make(VSet_VUnionDepth1_VInt8)
+			}
+			tmpMap[key] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(VSet_VUnionDepth1_VInt8)
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -13229,23 +12858,20 @@
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key VArray3_VBool
-		{
+		default:
+			var key VArray3_VBool
 			if err := key.VDLRead(dec); err != nil {
 				return err
 			}
-		}
-		var elem VArray3_VBool
-		{
+			var elem VArray3_VBool
 			if err := elem.VDLRead(dec); err != nil {
 				return err
 			}
+			if tmpMap == nil {
+				tmpMap = make(VMap_VArray3_VBool_VArray3_VBool)
+			}
+			tmpMap[key] = elem
 		}
-		if tmpMap == nil {
-			tmpMap = make(VMap_VArray3_VBool_VArray3_VBool)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -13299,23 +12925,20 @@
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key VStructDepth1_VBool
-		{
+		default:
+			var key VStructDepth1_VBool
 			if err := key.VDLRead(dec); err != nil {
 				return err
 			}
-		}
-		var elem VStructDepth1_VBool
-		{
+			var elem VStructDepth1_VBool
 			if err := elem.VDLRead(dec); err != nil {
 				return err
 			}
+			if tmpMap == nil {
+				tmpMap = make(VMap_VStructDepth1_VBool_VStructDepth1_VBool)
+			}
+			tmpMap[key] = elem
 		}
-		if tmpMap == nil {
-			tmpMap = make(VMap_VStructDepth1_VBool_VStructDepth1_VBool)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -13385,23 +13008,20 @@
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key VUnionDepth1_VUint64
-		{
+		default:
+			var key VUnionDepth1_VUint64
 			if err := VDLReadVUnionDepth1_VUint64(dec, &key); err != nil {
 				return err
 			}
-		}
-		var elem VUnionDepth1_VUint64
-		{
+			var elem VUnionDepth1_VUint64
 			if err := VDLReadVUnionDepth1_VUint64(dec, &elem); err != nil {
 				return err
 			}
+			if tmpMap == nil {
+				tmpMap = make(VMap_VUnionDepth1_VUint64_VUnionDepth1_VUint64)
+			}
+			tmpMap[key] = elem
 		}
-		if tmpMap == nil {
-			tmpMap = make(VMap_VUnionDepth1_VUint64_VUnionDepth1_VUint64)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -13806,32 +13426,20 @@
 	if err := dec.StartValue(__VDLType_list_177); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make([]int16, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, elem, err := dec.NextEntryValueInt(16); {
 		case err != nil:
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			*x = append(*x, int16(elem))
 		}
-		var elem int16
-		if err := dec.StartValue(vdl.Int16Type); err != nil {
-			return err
-		}
-		tmp, err := dec.DecodeInt(16)
-		if err != nil {
-			return err
-		}
-		elem = int16(tmp)
-		if err := dec.FinishValue(); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -13844,30 +13452,18 @@
 		tmpMap = make(map[float64]struct{}, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueFloat(64); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key float64
-		{
-			if err := dec.StartValue(vdl.Float64Type); err != nil {
-				return err
+		default:
+			if tmpMap == nil {
+				tmpMap = make(map[float64]struct{})
 			}
-			var err error
-			if key, err = dec.DecodeFloat(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
+			tmpMap[key] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(map[float64]struct{})
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -13880,45 +13476,25 @@
 		tmpMap = make(map[uint32]uint32, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueUint(32); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
+		default:
+			var elem uint32
+			switch value, err := dec.ReadValueUint(32); {
+			case err != nil:
+				return err
+			default:
+				elem = uint32(value)
+			}
+			if tmpMap == nil {
+				tmpMap = make(map[uint32]uint32)
+			}
+			tmpMap[uint32(key)] = elem
 		}
-		var key uint32
-		{
-			if err := dec.StartValue(vdl.Uint32Type); err != nil {
-				return err
-			}
-			tmp, err := dec.DecodeUint(32)
-			if err != nil {
-				return err
-			}
-			key = uint32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem uint32
-		{
-			if err := dec.StartValue(vdl.Uint32Type); err != nil {
-				return err
-			}
-			tmp, err := dec.DecodeUint(32)
-			if err != nil {
-				return err
-			}
-			elem = uint32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		if tmpMap == nil {
-			tmpMap = make(map[uint32]uint32)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -15269,15 +14845,18 @@
 		*x = field
 	case "F1":
 		var field VUnionDepth2_AllF1
-		if err := field.Value.VDLRead(dec); err != nil {
+		bytes := reflect.ValueOf(field.Value[:]).Bytes()
+		if err := dec.ReadValueBytes(2, &bytes); err != nil {
 			return err
 		}
 		*x = field
 	case "F2":
 		var field VUnionDepth2_AllF2
-		if err := field.Value.VDLRead(dec); err != nil {
+		var bytes []byte
+		if err := dec.ReadValueBytes(-1, &bytes); err != nil {
 			return err
 		}
+		reflect.ValueOf(&field.Value).Elem().SetBytes(bytes)
 		*x = field
 	case "F3":
 		var field VUnionDepth2_AllF3
@@ -15392,29 +14971,25 @@
 		tmpMap = make(map[VBool]VBool, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueBool(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key VBool
-		{
-			if err := key.VDLRead(dec); err != nil {
+		default:
+			var elem VBool
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
 				return err
+			default:
+				elem = VBool(value)
 			}
-		}
-		var elem VBool
-		{
-			if err := elem.VDLRead(dec); err != nil {
-				return err
+			if tmpMap == nil {
+				tmpMap = make(map[VBool]VBool)
 			}
+			tmpMap[VBool(key)] = elem
 		}
-		if tmpMap == nil {
-			tmpMap = make(map[VBool]VBool)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -15560,7 +15135,8 @@
 	switch f {
 	case "F1":
 		var field VUnionDepth2_VArray2_VByteF1
-		if err := field.Value.VDLRead(dec); err != nil {
+		bytes := reflect.ValueOf(field.Value[:]).Bytes()
+		if err := dec.ReadValueBytes(2, &bytes); err != nil {
 			return err
 		}
 		*x = field
@@ -15640,9 +15216,11 @@
 	switch f {
 	case "F2":
 		var field VUnionDepth2_VList_VByteF2
-		if err := field.Value.VDLRead(dec); err != nil {
+		var bytes []byte
+		if err := dec.ReadValueBytes(-1, &bytes); err != nil {
 			return err
 		}
+		reflect.ValueOf(&field.Value).Elem().SetBytes(bytes)
 		*x = field
 	case "":
 		return fmt.Errorf("missing field in union %T, from %v", x, dec.Type())
@@ -16638,21 +16216,25 @@
 	if err := dec.StartValue(__VDLType_array_211); err != nil {
 		return err
 	}
-	index := 0
-	for {
+	for index := 0; index < 1; index++ {
 		switch done, err := dec.NextEntry(); {
 		case err != nil:
 			return err
-		case done != (index >= len(*x)):
-			return fmt.Errorf("array len mismatch, done:%v index:%d len:%d %T)", done, index, len(*x), *x)
 		case done:
-			return dec.FinishValue()
+			return fmt.Errorf("short array, got len %d < 1 %T)", index, *x)
+		default:
+			if err := x[index].VDLRead(dec); err != nil {
+				return err
+			}
 		}
-		if err := x[index].VDLRead(dec); err != nil {
-			return err
-		}
-		index++
 	}
+	switch done, err := dec.NextEntry(); {
+	case err != nil:
+		return err
+	case !done:
+		return fmt.Errorf("long array, got len > 1 %T", *x)
+	}
+	return dec.FinishValue()
 }
 
 type VArray2_List_VMap_VByte_VByte [2][]VMap_VByte_VByte
@@ -16714,31 +16296,34 @@
 	if err := dec.StartValue(__VDLType_array_212); err != nil {
 		return err
 	}
-	index := 0
-	for {
+	for index := 0; index < 2; index++ {
 		switch done, err := dec.NextEntry(); {
 		case err != nil:
 			return err
-		case done != (index >= len(*x)):
-			return fmt.Errorf("array len mismatch, done:%v index:%d len:%d %T)", done, index, len(*x), *x)
 		case done:
-			return dec.FinishValue()
+			return fmt.Errorf("short array, got len %d < 2 %T)", index, *x)
+		default:
+			if err := __VDLReadAnon_list_9(dec, &x[index]); err != nil {
+				return err
+			}
 		}
-		if err := __VDLReadAnon_list_9(dec, &x[index]); err != nil {
-			return err
-		}
-		index++
 	}
+	switch done, err := dec.NextEntry(); {
+	case err != nil:
+		return err
+	case !done:
+		return fmt.Errorf("long array, got len > 2 %T", *x)
+	}
+	return dec.FinishValue()
 }
 
 func __VDLReadAnon_list_9(dec vdl.Decoder, x *[]VMap_VByte_VByte) error {
 	if err := dec.StartValue(__VDLType_list_213); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make([]VMap_VByte_VByte, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -16747,12 +16332,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem VMap_VByte_VByte
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem VMap_VByte_VByte
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -16823,21 +16409,25 @@
 	if err := dec.StartValue(__VDLType_array_214); err != nil {
 		return err
 	}
-	index := 0
-	for {
+	for index := 0; index < 2; index++ {
 		switch done, err := dec.NextEntry(); {
 		case err != nil:
 			return err
-		case done != (index >= len(*x)):
-			return fmt.Errorf("array len mismatch, done:%v index:%d len:%d %T)", done, index, len(*x), *x)
 		case done:
-			return dec.FinishValue()
+			return fmt.Errorf("short array, got len %d < 2 %T)", index, *x)
+		default:
+			if err := __VDLReadAnon_set_10(dec, &x[index]); err != nil {
+				return err
+			}
 		}
-		if err := __VDLReadAnon_set_10(dec, &x[index]); err != nil {
-			return err
-		}
-		index++
 	}
+	switch done, err := dec.NextEntry(); {
+	case err != nil:
+		return err
+	case !done:
+		return fmt.Errorf("long array, got len > 2 %T", *x)
+	}
+	return dec.FinishValue()
 }
 
 func __VDLReadAnon_set_10(dec vdl.Decoder, x *map[VUnionDepth1_VNamedError]struct{}) error {
@@ -16855,17 +16445,16 @@
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key VUnionDepth1_VNamedError
-		{
+		default:
+			var key VUnionDepth1_VNamedError
 			if err := VDLReadVUnionDepth1_VNamedError(dec, &key); err != nil {
 				return err
 			}
+			if tmpMap == nil {
+				tmpMap = make(map[VUnionDepth1_VNamedError]struct{})
+			}
+			tmpMap[key] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(map[VUnionDepth1_VNamedError]struct{})
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -16947,21 +16536,25 @@
 	if err := dec.StartValue(__VDLType_array_216); err != nil {
 		return err
 	}
-	index := 0
-	for {
+	for index := 0; index < 3; index++ {
 		switch done, err := dec.NextEntry(); {
 		case err != nil:
 			return err
-		case done != (index >= len(*x)):
-			return fmt.Errorf("array len mismatch, done:%v index:%d len:%d %T)", done, index, len(*x), *x)
 		case done:
-			return dec.FinishValue()
+			return fmt.Errorf("short array, got len %d < 3 %T)", index, *x)
+		default:
+			if err := __VDLReadAnon_map_11(dec, &x[index]); err != nil {
+				return err
+			}
 		}
-		if err := __VDLReadAnon_map_11(dec, &x[index]); err != nil {
-			return err
-		}
-		index++
 	}
+	switch done, err := dec.NextEntry(); {
+	case err != nil:
+		return err
+	case !done:
+		return fmt.Errorf("long array, got len > 3 %T", *x)
+	}
+	return dec.FinishValue()
 }
 
 func __VDLReadAnon_map_11(dec vdl.Decoder, x *map[VUnionDepth1_Float64]VUnionDepth1_Float64) error {
@@ -16979,23 +16572,20 @@
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key VUnionDepth1_Float64
-		{
+		default:
+			var key VUnionDepth1_Float64
 			if err := VDLReadVUnionDepth1_Float64(dec, &key); err != nil {
 				return err
 			}
-		}
-		var elem VUnionDepth1_Float64
-		{
+			var elem VUnionDepth1_Float64
 			if err := VDLReadVUnionDepth1_Float64(dec, &elem); err != nil {
 				return err
 			}
+			if tmpMap == nil {
+				tmpMap = make(map[VUnionDepth1_Float64]VUnionDepth1_Float64)
+			}
+			tmpMap[key] = elem
 		}
-		if tmpMap == nil {
-			tmpMap = make(map[VUnionDepth1_Float64]VUnionDepth1_Float64)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -17037,21 +16627,25 @@
 	if err := dec.StartValue(__VDLType_array_218); err != nil {
 		return err
 	}
-	index := 0
-	for {
+	for index := 0; index < 2; index++ {
 		switch done, err := dec.NextEntry(); {
 		case err != nil:
 			return err
-		case done != (index >= len(*x)):
-			return fmt.Errorf("array len mismatch, done:%v index:%d len:%d %T)", done, index, len(*x), *x)
 		case done:
-			return dec.FinishValue()
+			return fmt.Errorf("short array, got len %d < 2 %T)", index, *x)
+		default:
+			if err := x[index].VDLRead(dec); err != nil {
+				return err
+			}
 		}
-		if err := x[index].VDLRead(dec); err != nil {
-			return err
-		}
-		index++
 	}
+	switch done, err := dec.NextEntry(); {
+	case err != nil:
+		return err
+	case !done:
+		return fmt.Errorf("long array, got len > 2 %T", *x)
+	}
+	return dec.FinishValue()
 }
 
 type VArray2_VUnionDepth2_All [2]VUnionDepth2_All
@@ -17100,21 +16694,25 @@
 	if err := dec.StartValue(__VDLType_array_219); err != nil {
 		return err
 	}
-	index := 0
-	for {
+	for index := 0; index < 2; index++ {
 		switch done, err := dec.NextEntry(); {
 		case err != nil:
 			return err
-		case done != (index >= len(*x)):
-			return fmt.Errorf("array len mismatch, done:%v index:%d len:%d %T)", done, index, len(*x), *x)
 		case done:
-			return dec.FinishValue()
+			return fmt.Errorf("short array, got len %d < 2 %T)", index, *x)
+		default:
+			if err := VDLReadVUnionDepth2_All(dec, &x[index]); err != nil {
+				return err
+			}
 		}
-		if err := VDLReadVUnionDepth2_All(dec, &x[index]); err != nil {
-			return err
-		}
-		index++
 	}
+	switch done, err := dec.NextEntry(); {
+	case err != nil:
+		return err
+	case !done:
+		return fmt.Errorf("long array, got len > 2 %T", *x)
+	}
+	return dec.FinishValue()
 }
 
 type VArray3_OptVStructDepth2_Set_Float64 [3]*VStructDepth2_Set_Float64
@@ -17159,33 +16757,37 @@
 	if err := dec.StartValue(__VDLType_array_220); err != nil {
 		return err
 	}
-	index := 0
-	for {
+	for index := 0; index < 3; index++ {
 		switch done, err := dec.NextEntry(); {
 		case err != nil:
 			return err
-		case done != (index >= len(*x)):
-			return fmt.Errorf("array len mismatch, done:%v index:%d len:%d %T)", done, index, len(*x), *x)
 		case done:
-			return dec.FinishValue()
-		}
-		if err := dec.StartValue(__VDLType_optional_221); err != nil {
-			return err
-		}
-		if dec.IsNil() {
-			x[index] = nil
-			if err := dec.FinishValue(); err != nil {
+			return fmt.Errorf("short array, got len %d < 3 %T)", index, *x)
+		default:
+			if err := dec.StartValue(__VDLType_optional_221); err != nil {
 				return err
 			}
-		} else {
-			x[index] = new(VStructDepth2_Set_Float64)
-			dec.IgnoreNextStartValue()
-			if err := x[index].VDLRead(dec); err != nil {
-				return err
+			if dec.IsNil() {
+				x[index] = nil
+				if err := dec.FinishValue(); err != nil {
+					return err
+				}
+			} else {
+				x[index] = new(VStructDepth2_Set_Float64)
+				dec.IgnoreNextStartValue()
+				if err := x[index].VDLRead(dec); err != nil {
+					return err
+				}
 			}
 		}
-		index++
 	}
+	switch done, err := dec.NextEntry(); {
+	case err != nil:
+		return err
+	case !done:
+		return fmt.Errorf("long array, got len > 3 %T", *x)
+	}
+	return dec.FinishValue()
 }
 
 type VList_VArray3_VUnionDepth1_All []VArray3_VUnionDepth1_All
@@ -17224,10 +16826,9 @@
 	if err := dec.StartValue(__VDLType_list_222); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(VList_VArray3_VUnionDepth1_All, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -17236,12 +16837,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem VArray3_VUnionDepth1_All
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem VArray3_VUnionDepth1_All
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -17281,10 +16883,9 @@
 	if err := dec.StartValue(__VDLType_list_223); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(VList_List_VMap_VByte_VByte, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -17293,12 +16894,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem []VMap_VByte_VByte
+			if err := __VDLReadAnon_list_9(dec, &elem); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem []VMap_VByte_VByte
-		if err := __VDLReadAnon_list_9(dec, &elem); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -17338,10 +16940,9 @@
 	if err := dec.StartValue(__VDLType_list_224); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(VList_VSet_VArray1_VStructEmpty, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -17350,12 +16951,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem VSet_VArray1_VStructEmpty
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem VSet_VArray1_VStructEmpty
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -17395,10 +16997,9 @@
 	if err := dec.StartValue(__VDLType_list_225); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(VList_VMap_VArray3_VBool_VArray3_VBool, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -17407,12 +17008,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem VMap_VArray3_VBool_VArray3_VBool
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem VMap_VArray3_VBool_VArray3_VBool
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -17452,10 +17054,9 @@
 	if err := dec.StartValue(__VDLType_list_226); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(VList_VStructDepth2_All, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -17464,12 +17065,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem VStructDepth2_All
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem VStructDepth2_All
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -17517,10 +17119,9 @@
 	if err := dec.StartValue(__VDLType_list_227); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(VList_VUnionDepth2_All, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -17529,12 +17130,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem VUnionDepth2_All
+			if err := VDLReadVUnionDepth2_All(dec, &elem); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem VUnionDepth2_All
-		if err := VDLReadVUnionDepth2_All(dec, &elem); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -17583,10 +17185,9 @@
 	if err := dec.StartValue(__VDLType_list_228); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(VList_OptVStructDepth2_Set_Float64, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -17595,24 +17196,25 @@
 			return err
 		case done:
 			return dec.FinishValue()
-		}
-		var elem *VStructDepth2_Set_Float64
-		if err := dec.StartValue(__VDLType_optional_221); err != nil {
-			return err
-		}
-		if dec.IsNil() {
-			elem = nil
-			if err := dec.FinishValue(); err != nil {
+		default:
+			var elem *VStructDepth2_Set_Float64
+			if err := dec.StartValue(__VDLType_optional_221); err != nil {
 				return err
 			}
-		} else {
-			elem = new(VStructDepth2_Set_Float64)
-			dec.IgnoreNextStartValue()
-			if err := elem.VDLRead(dec); err != nil {
-				return err
+			if dec.IsNil() {
+				elem = nil
+				if err := dec.FinishValue(); err != nil {
+					return err
+				}
+			} else {
+				elem = new(VStructDepth2_Set_Float64)
+				dec.IgnoreNextStartValue()
+				if err := elem.VDLRead(dec); err != nil {
+					return err
+				}
 			}
+			*x = append(*x, elem)
 		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -17663,17 +17265,16 @@
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key VArray1_VArray3_Int64
-		{
+		default:
+			var key VArray1_VArray3_Int64
 			if err := key.VDLRead(dec); err != nil {
 				return err
 			}
+			if tmpMap == nil {
+				tmpMap = make(VSet_VArray1_VArray3_Int64)
+			}
+			tmpMap[key] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(VSet_VArray1_VArray3_Int64)
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -17724,17 +17325,16 @@
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key VStructDepth2_VStructDepth1_Bool
-		{
+		default:
+			var key VStructDepth2_VStructDepth1_Bool
 			if err := key.VDLRead(dec); err != nil {
 				return err
 			}
+			if tmpMap == nil {
+				tmpMap = make(VSet_VStructDepth2_VStructDepth1_Bool)
+			}
+			tmpMap[key] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(VSet_VStructDepth2_VStructDepth1_Bool)
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -17793,17 +17393,16 @@
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key VUnionDepth2_VArray1_String
-		{
+		default:
+			var key VUnionDepth2_VArray1_String
 			if err := VDLReadVUnionDepth2_VArray1_String(dec, &key); err != nil {
 				return err
 			}
+			if tmpMap == nil {
+				tmpMap = make(VSet_VUnionDepth2_VArray1_String)
+			}
+			tmpMap[key] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(VSet_VUnionDepth2_VArray1_String)
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -17857,23 +17456,20 @@
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key VArray1_VArray3_Int64
-		{
+		default:
+			var key VArray1_VArray3_Int64
 			if err := key.VDLRead(dec); err != nil {
 				return err
 			}
-		}
-		var elem VArray1_VArray3_Int64
-		{
+			var elem VArray1_VArray3_Int64
 			if err := elem.VDLRead(dec); err != nil {
 				return err
 			}
+			if tmpMap == nil {
+				tmpMap = make(VMap_VArray1_VArray3_Int64_VArray1_VArray3_Int64)
+			}
+			tmpMap[key] = elem
 		}
-		if tmpMap == nil {
-			tmpMap = make(VMap_VArray1_VArray3_Int64_VArray1_VArray3_Int64)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -17927,23 +17523,20 @@
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key VStructDepth2_VArray1_Uint32
-		{
+		default:
+			var key VStructDepth2_VArray1_Uint32
 			if err := key.VDLRead(dec); err != nil {
 				return err
 			}
-		}
-		var elem VStructDepth2_VArray1_Uint32
-		{
+			var elem VStructDepth2_VArray1_Uint32
 			if err := elem.VDLRead(dec); err != nil {
 				return err
 			}
+			if tmpMap == nil {
+				tmpMap = make(VMap_VStructDepth2_VArray1_Uint32_VStructDepth2_VArray1_Uint32)
+			}
+			tmpMap[key] = elem
 		}
-		if tmpMap == nil {
-			tmpMap = make(VMap_VStructDepth2_VArray1_Uint32_VStructDepth2_VArray1_Uint32)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -18013,23 +17606,20 @@
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key VUnionDepth2_VArray2_VByte
-		{
+		default:
+			var key VUnionDepth2_VArray2_VByte
 			if err := VDLReadVUnionDepth2_VArray2_VByte(dec, &key); err != nil {
 				return err
 			}
-		}
-		var elem VUnionDepth2_VArray2_VByte
-		{
+			var elem VUnionDepth2_VArray2_VByte
 			if err := VDLReadVUnionDepth2_VArray2_VByte(dec, &elem); err != nil {
 				return err
 			}
+			if tmpMap == nil {
+				tmpMap = make(VMap_VUnionDepth2_VArray2_VByte_VUnionDepth2_VArray2_VByte)
+			}
+			tmpMap[key] = elem
 		}
-		if tmpMap == nil {
-			tmpMap = make(VMap_VUnionDepth2_VArray2_VByte_VUnionDepth2_VArray2_VByte)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -18249,10 +17839,9 @@
 	if err := dec.StartValue(__VDLType_list_236); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make([]VUnionDepth1_All, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -18261,12 +17850,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem VUnionDepth1_All
+			if err := VDLReadVUnionDepth1_All(dec, &elem); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem VUnionDepth1_All
-		if err := VDLReadVUnionDepth1_All(dec, &elem); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -19074,10 +18664,9 @@
 	if err := dec.StartValue(__VDLType_list_245); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make([]VList_Error, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -19086,12 +18675,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem VList_Error
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem VList_Error
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -19110,17 +18700,16 @@
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key VStructDepth1_String
-		{
+		default:
+			var key VStructDepth1_String
 			if err := key.VDLRead(dec); err != nil {
 				return err
 			}
+			if tmpMap == nil {
+				tmpMap = make(map[VStructDepth1_String]struct{})
+			}
+			tmpMap[key] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(map[VStructDepth1_String]struct{})
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -19789,15 +19378,11 @@
 		case "":
 			return dec.FinishValue()
 		case "Data":
-			if err := dec.StartValue(vdl.Int64Type); err != nil {
+			switch value, err := dec.ReadValueInt(64); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Data, err = dec.DecodeInt(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Data = value
 			}
 		case "Next":
 			if err := dec.StartValue(__VDLType_optional_255); err != nil {
@@ -19887,15 +19472,11 @@
 		case "":
 			return dec.FinishValue()
 		case "Data":
-			if err := dec.StartValue(vdl.Int64Type); err != nil {
+			switch value, err := dec.ReadValueInt(64); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Data, err = dec.DecodeInt(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Data = value
 			}
 		case "A":
 			if err := dec.StartValue(__VDLType_optional_257); err != nil {
@@ -19985,15 +19566,11 @@
 		case "":
 			return dec.FinishValue()
 		case "Data":
-			if err := dec.StartValue(vdl.Int64Type); err != nil {
+			switch value, err := dec.ReadValueInt(64); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Data, err = dec.DecodeInt(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Data = value
 			}
 		case "B":
 			if err := dec.StartValue(__VDLType_optional_259); err != nil {
@@ -20041,15 +19618,13 @@
 }
 
 func (x *VWireBoolNBool) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_bool_260); err != nil {
+	switch value, err := dec.ReadValueBool(); {
+	case err != nil:
 		return err
+	default:
+		*x = VWireBoolNBool(value)
 	}
-	tmp, err := dec.DecodeBool()
-	if err != nil {
-		return err
-	}
-	*x = VWireBoolNBool(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 type VWireBoolNString bool
@@ -20074,15 +19649,13 @@
 }
 
 func (x *VWireBoolNString) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_bool_261); err != nil {
+	switch value, err := dec.ReadValueBool(); {
+	case err != nil:
 		return err
+	default:
+		*x = VWireBoolNString(value)
 	}
-	tmp, err := dec.DecodeBool()
-	if err != nil {
-		return err
-	}
-	*x = VWireBoolNString(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 type VWireBoolNStruct bool
@@ -20107,15 +19680,13 @@
 }
 
 func (x *VWireBoolNStruct) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_bool_262); err != nil {
+	switch value, err := dec.ReadValueBool(); {
+	case err != nil:
 		return err
+	default:
+		*x = VWireBoolNStruct(value)
 	}
-	tmp, err := dec.DecodeBool()
-	if err != nil {
-		return err
-	}
-	*x = VWireBoolNStruct(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 type VWireIntNInt int32
@@ -20140,15 +19711,13 @@
 }
 
 func (x *VWireIntNInt) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_int32_263); err != nil {
+	switch value, err := dec.ReadValueInt(32); {
+	case err != nil:
 		return err
+	default:
+		*x = VWireIntNInt(value)
 	}
-	tmp, err := dec.DecodeInt(32)
-	if err != nil {
-		return err
-	}
-	*x = VWireIntNInt(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 type VWireIntNString int32
@@ -20173,15 +19742,13 @@
 }
 
 func (x *VWireIntNString) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_int32_264); err != nil {
+	switch value, err := dec.ReadValueInt(32); {
+	case err != nil:
 		return err
+	default:
+		*x = VWireIntNString(value)
 	}
-	tmp, err := dec.DecodeInt(32)
-	if err != nil {
-		return err
-	}
-	*x = VWireIntNString(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 type VWireIntNStruct int32
@@ -20206,15 +19773,13 @@
 }
 
 func (x *VWireIntNStruct) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_int32_265); err != nil {
+	switch value, err := dec.ReadValueInt(32); {
+	case err != nil:
 		return err
+	default:
+		*x = VWireIntNStruct(value)
 	}
-	tmp, err := dec.DecodeInt(32)
-	if err != nil {
-		return err
-	}
-	*x = VWireIntNStruct(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 type VWireStringNString string
@@ -20239,15 +19804,13 @@
 }
 
 func (x *VWireStringNString) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_string_266); err != nil {
+	switch value, err := dec.ReadValueString(); {
+	case err != nil:
 		return err
+	default:
+		*x = VWireStringNString(value)
 	}
-	tmp, err := dec.DecodeString()
-	if err != nil {
-		return err
-	}
-	*x = VWireStringNString(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 type VWireStringNStruct string
@@ -20272,15 +19835,13 @@
 }
 
 func (x *VWireStringNStruct) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_string_267); err != nil {
+	switch value, err := dec.ReadValueString(); {
+	case err != nil:
 		return err
+	default:
+		*x = VWireStringNStruct(value)
 	}
-	tmp, err := dec.DecodeString()
-	if err != nil {
-		return err
-	}
-	*x = VWireStringNStruct(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 type VWireArrayNString [1]string
@@ -20322,28 +19883,23 @@
 	if err := dec.StartValue(__VDLType_array_268); err != nil {
 		return err
 	}
-	index := 0
-	for {
-		switch done, err := dec.NextEntry(); {
+	for index := 0; index < 1; index++ {
+		switch done, elem, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
-		case done != (index >= len(*x)):
-			return fmt.Errorf("array len mismatch, done:%v index:%d len:%d %T)", done, index, len(*x), *x)
 		case done:
-			return dec.FinishValue()
+			return fmt.Errorf("short array, got len %d < 1 %T)", index, *x)
+		default:
+			x[index] = elem
 		}
-		if err := dec.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		var err error
-		if x[index], err = dec.DecodeString(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
-		}
-		index++
 	}
+	switch done, err := dec.NextEntry(); {
+	case err != nil:
+		return err
+	case !done:
+		return fmt.Errorf("long array, got len > 1 %T", *x)
+	}
+	return dec.FinishValue()
 }
 
 type VWireArrayNStruct [1]string
@@ -20385,28 +19941,23 @@
 	if err := dec.StartValue(__VDLType_array_269); err != nil {
 		return err
 	}
-	index := 0
-	for {
-		switch done, err := dec.NextEntry(); {
+	for index := 0; index < 1; index++ {
+		switch done, elem, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
-		case done != (index >= len(*x)):
-			return fmt.Errorf("array len mismatch, done:%v index:%d len:%d %T)", done, index, len(*x), *x)
 		case done:
-			return dec.FinishValue()
+			return fmt.Errorf("short array, got len %d < 1 %T)", index, *x)
+		default:
+			x[index] = elem
 		}
-		if err := dec.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		var err error
-		if x[index], err = dec.DecodeString(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
-		}
-		index++
 	}
+	switch done, err := dec.NextEntry(); {
+	case err != nil:
+		return err
+	case !done:
+		return fmt.Errorf("long array, got len > 1 %T", *x)
+	}
+	return dec.FinishValue()
 }
 
 type VWireListNString []string
@@ -20451,31 +20002,20 @@
 	if err := dec.StartValue(__VDLType_list_270); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(VWireListNString, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, elem, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			*x = append(*x, elem)
 		}
-		var elem string
-		if err := dec.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		var err error
-		if elem, err = dec.DecodeString(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -20521,31 +20061,20 @@
 	if err := dec.StartValue(__VDLType_list_271); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(VWireListNStruct, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, elem, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			*x = append(*x, elem)
 		}
-		var elem string
-		if err := dec.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		var err error
-		if elem, err = dec.DecodeString(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -20600,15 +20129,11 @@
 		case "":
 			return dec.FinishValue()
 		case "X":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.X, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.X = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -20669,15 +20194,11 @@
 		case "":
 			return dec.FinishValue()
 		case "X":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.X, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.X = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -20738,15 +20259,11 @@
 		case "":
 			return dec.FinishValue()
 		case "X":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.X, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.X = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -20807,15 +20324,11 @@
 		case "":
 			return dec.FinishValue()
 		case "X":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.X, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.X = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -20876,15 +20389,11 @@
 		case "":
 			return dec.FinishValue()
 		case "X":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.X, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.X = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -20945,15 +20454,11 @@
 		case "":
 			return dec.FinishValue()
 		case "X":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.X, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.X = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -21031,15 +20536,11 @@
 	switch f {
 	case "X":
 		var field VWireUnionNStringX
-		if err := dec.StartValue(vdl.StringType); err != nil {
+		switch value, err := dec.ReadValueString(); {
+		case err != nil:
 			return err
-		}
-		var err error
-		if field.Value, err = dec.DecodeString(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = value
 		}
 		*x = field
 	case "":
@@ -21124,15 +20625,11 @@
 	switch f {
 	case "X":
 		var field VWireUnionNStructX
-		if err := dec.StartValue(vdl.StringType); err != nil {
+		switch value, err := dec.ReadValueString(); {
+		case err != nil:
 			return err
-		}
-		var err error
-		if field.Value, err = dec.DecodeString(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = value
 		}
 		*x = field
 	case "":
@@ -21217,15 +20714,11 @@
 	switch f {
 	case "X":
 		var field VWireUnionNArrayX
-		if err := dec.StartValue(vdl.StringType); err != nil {
+		switch value, err := dec.ReadValueString(); {
+		case err != nil:
 			return err
-		}
-		var err error
-		if field.Value, err = dec.DecodeString(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = value
 		}
 		*x = field
 	case "":
@@ -21310,15 +20803,11 @@
 	switch f {
 	case "X":
 		var field VWireUnionNSliceX
-		if err := dec.StartValue(vdl.StringType); err != nil {
+		switch value, err := dec.ReadValueString(); {
+		case err != nil:
 			return err
-		}
-		var err error
-		if field.Value, err = dec.DecodeString(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = value
 		}
 		*x = field
 	case "":
@@ -21403,15 +20892,11 @@
 	switch f {
 	case "X":
 		var field VWireUnionNPointerX
-		if err := dec.StartValue(vdl.StringType); err != nil {
+		switch value, err := dec.ReadValueString(); {
+		case err != nil:
 			return err
-		}
-		var err error
-		if field.Value, err = dec.DecodeString(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = value
 		}
 		*x = field
 	case "":
@@ -21496,15 +20981,11 @@
 	switch f {
 	case "X":
 		var field VWireUnionNIfaceX
-		if err := dec.StartValue(vdl.StringType); err != nil {
+		switch value, err := dec.ReadValueString(); {
+		case err != nil:
 			return err
-		}
-		var err error
-		if field.Value, err = dec.DecodeString(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = value
 		}
 		*x = field
 	case "":
diff --git a/vdlroot/math/math.vdl.go b/vdlroot/math/math.vdl.go
index d51e06c..aa91311 100644
--- a/vdlroot/math/math.vdl.go
+++ b/vdlroot/math/math.vdl.go
@@ -83,28 +83,18 @@
 		case "":
 			return dec.FinishValue()
 		case "Real":
-			if err := dec.StartValue(vdl.Float32Type); err != nil {
+			switch value, err := dec.ReadValueFloat(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeFloat(32)
-			if err != nil {
-				return err
-			}
-			x.Real = float32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Real = float32(value)
 			}
 		case "Imag":
-			if err := dec.StartValue(vdl.Float32Type); err != nil {
+			switch value, err := dec.ReadValueFloat(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeFloat(32)
-			if err != nil {
-				return err
-			}
-			x.Imag = float32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Imag = float32(value)
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -181,26 +171,18 @@
 		case "":
 			return dec.FinishValue()
 		case "Real":
-			if err := dec.StartValue(vdl.Float64Type); err != nil {
+			switch value, err := dec.ReadValueFloat(64); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Real, err = dec.DecodeFloat(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Real = value
 			}
 		case "Imag":
-			if err := dec.StartValue(vdl.Float64Type); err != nil {
+			switch value, err := dec.ReadValueFloat(64); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Imag, err = dec.DecodeFloat(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Imag = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
diff --git a/vdlroot/signature/signature.vdl.go b/vdlroot/signature/signature.vdl.go
index ea0dfd2..2929b64 100644
--- a/vdlroot/signature/signature.vdl.go
+++ b/vdlroot/signature/signature.vdl.go
@@ -99,37 +99,25 @@
 		case "":
 			return dec.FinishValue()
 		case "Name":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Name, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Name = value
 			}
 		case "PkgPath":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.PkgPath, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.PkgPath = value
 			}
 		case "Doc":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Doc, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Doc = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -226,37 +214,25 @@
 		case "":
 			return dec.FinishValue()
 		case "Name":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Name, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Name = value
 			}
 		case "Doc":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Doc, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Doc = value
 			}
 		case "Type":
-			if err := dec.StartValue(vdl.TypeObjectType); err != nil {
+			switch value, err := dec.ReadValueTypeObject(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Type, err = dec.DecodeTypeObject(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Type = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -453,26 +429,18 @@
 		case "":
 			return dec.FinishValue()
 		case "Name":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Name, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Name = value
 			}
 		case "Doc":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Doc, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Doc = value
 			}
 		case "InArgs":
 			if err := __VDLReadAnon_list_1(dec, &x.InArgs); err != nil {
@@ -530,10 +498,9 @@
 	if err := dec.StartValue(__VDLType_list_4); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make([]Arg, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -542,12 +509,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem Arg
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem Arg
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -555,10 +523,9 @@
 	if err := dec.StartValue(__VDLType_list_6); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make([]*vdl.Value, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -567,13 +534,14 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem *vdl.Value
+			elem = new(vdl.Value)
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem *vdl.Value
-		elem = new(vdl.Value)
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -734,37 +702,25 @@
 		case "":
 			return dec.FinishValue()
 		case "Name":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Name, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Name = value
 			}
 		case "PkgPath":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.PkgPath, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.PkgPath = value
 			}
 		case "Doc":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Doc, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Doc = value
 			}
 		case "Embeds":
 			if err := __VDLReadAnon_list_3(dec, &x.Embeds); err != nil {
@@ -786,10 +742,9 @@
 	if err := dec.StartValue(__VDLType_list_8); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make([]Embed, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -798,12 +753,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem Embed
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem Embed
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -811,10 +767,9 @@
 	if err := dec.StartValue(__VDLType_list_9); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make([]Method, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -823,12 +778,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem Method
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem Method
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
diff --git a/vdlroot/time/time.vdl.go b/vdlroot/time/time.vdl.go
index f6ea846..02b7768 100644
--- a/vdlroot/time/time.vdl.go
+++ b/vdlroot/time/time.vdl.go
@@ -99,27 +99,18 @@
 		case "":
 			return dec.FinishValue()
 		case "Seconds":
-			if err := dec.StartValue(vdl.Int64Type); err != nil {
+			switch value, err := dec.ReadValueInt(64); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Seconds, err = dec.DecodeInt(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Seconds = value
 			}
 		case "Nanos":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.Nanos = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Nanos = int32(value)
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -210,27 +201,18 @@
 		case "":
 			return dec.FinishValue()
 		case "Seconds":
-			if err := dec.StartValue(vdl.Int64Type); err != nil {
+			switch value, err := dec.ReadValueInt(64); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Seconds, err = dec.DecodeInt(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Seconds = value
 			}
 		case "Nanos":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.Nanos = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Nanos = int32(value)
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
diff --git a/vdlroot/vdltool/vdltool.vdl.go b/vdlroot/vdltool/vdltool.vdl.go
index 61be9b0..5f1d687 100644
--- a/vdlroot/vdltool/vdltool.vdl.go
+++ b/vdlroot/vdltool/vdltool.vdl.go
@@ -94,17 +94,15 @@
 }
 
 func (x *GenLanguage) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_enum_1); err != nil {
+	switch value, err := dec.ReadValueString(); {
+	case err != nil:
 		return err
+	default:
+		if err := x.Set(value); err != nil {
+			return err
+		}
 	}
-	enum, err := dec.DecodeString()
-	if err != nil {
-		return err
-	}
-	if err := x.Set(enum); err != nil {
-		return err
-	}
-	return dec.FinishValue()
+	return nil
 }
 
 // GoKind describes the kind of Go type.
@@ -212,17 +210,15 @@
 }
 
 func (x *GoKind) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_enum_2); err != nil {
+	switch value, err := dec.ReadValueString(); {
+	case err != nil:
 		return err
+	default:
+		if err := x.Set(value); err != nil {
+			return err
+		}
 	}
-	enum, err := dec.DecodeString()
-	if err != nil {
-		return err
-	}
-	if err := x.Set(enum); err != nil {
-		return err
-	}
-	return dec.FinishValue()
+	return nil
 }
 
 // GoZeroMode describes the relationship between the Go zero value of the native
@@ -295,17 +291,15 @@
 }
 
 func (x *GoZeroMode) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_enum_3); err != nil {
+	switch value, err := dec.ReadValueString(); {
+	case err != nil:
 		return err
+	default:
+		if err := x.Set(value); err != nil {
+			return err
+		}
 	}
-	enum, err := dec.DecodeString()
-	if err != nil {
-		return err
-	}
-	if err := x.Set(enum); err != nil {
-		return err
-	}
-	return dec.FinishValue()
+	return nil
 }
 
 // GoZero describes Go zero value behavior.
@@ -384,19 +378,20 @@
 		case "":
 			return dec.FinishValue()
 		case "Mode":
-			if err := x.Mode.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
+			default:
+				if err := x.Mode.Set(value); err != nil {
+					return err
+				}
 			}
 		case "IsZero":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.IsZero, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.IsZero = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -477,26 +472,18 @@
 		case "":
 			return dec.FinishValue()
 		case "Path":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Path, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Path = value
 			}
 		case "Name":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Name, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Name = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -671,45 +658,38 @@
 		case "":
 			return dec.FinishValue()
 		case "Kind":
-			if err := x.Kind.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
+			default:
+				if err := x.Kind.Set(value); err != nil {
+					return err
+				}
 			}
 		case "Type":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Type, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Type = value
 			}
 		case "Zero":
 			if err := x.Zero.VDLRead(dec); err != nil {
 				return err
 			}
 		case "ToNative":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.ToNative, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.ToNative = value
 			}
 		case "FromNative":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.FromNative, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.FromNative = value
 			}
 		case "Imports":
 			if err := __VDLReadAnon_list_1(dec, &x.Imports); err != nil {
@@ -727,10 +707,9 @@
 	if err := dec.StartValue(__VDLType_list_7); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make([]GoImport, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -739,12 +718,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem GoImport
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem GoImport
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -868,36 +848,22 @@
 		tmpMap = make(map[string]GoType, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
-			}
-			var err error
-			if key, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem GoType
-		{
+		default:
+			var elem GoType
 			if err := elem.VDLRead(dec); err != nil {
 				return err
 			}
+			if tmpMap == nil {
+				tmpMap = make(map[string]GoType)
+			}
+			tmpMap[key] = elem
 		}
-		if tmpMap == nil {
-			tmpMap = make(map[string]GoType)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -1052,43 +1018,25 @@
 		tmpMap = make(map[string]string, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
+		default:
+			var elem string
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
+				return err
+			default:
+				elem = value
+			}
+			if tmpMap == nil {
+				tmpMap = make(map[string]string)
+			}
+			tmpMap[key] = elem
 		}
-		var key string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
-			}
-			var err error
-			if key, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
-			}
-			var err error
-			if elem, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		if tmpMap == nil {
-			tmpMap = make(map[string]string)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -1392,23 +1340,22 @@
 		tmpMap = make(map[GenLanguage]struct{}, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key GenLanguage
-		{
-			if err := key.VDLRead(dec); err != nil {
+		default:
+			var keyEnum GenLanguage
+			if err := keyEnum.Set(key); err != nil {
 				return err
 			}
+			if tmpMap == nil {
+				tmpMap = make(map[GenLanguage]struct{})
+			}
+			tmpMap[keyEnum] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(map[GenLanguage]struct{})
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
diff --git a/verror/verror.go b/verror/verror.go
index 130ef55..a7c8c49 100644
--- a/verror/verror.go
+++ b/verror/verror.go
@@ -298,26 +298,17 @@
 		case "":
 			return dec.FinishValue()
 		case "Id":
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
-			}
-			if id, err := dec.DecodeString(); err != nil {
-				return err
-			} else {
-				x.ID = ID(id)
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		case "RetryCode":
-			if err := dec.StartValue(ttWireRetryCode); err != nil {
-				return err
-			}
-			label, err := dec.DecodeString()
+			id, err := dec.ReadValueString()
 			if err != nil {
 				return err
 			}
-			switch label {
+			x.ID = ID(id)
+		case "RetryCode":
+			code, err := dec.ReadValueString()
+			if err != nil {
+				return err
+			}
+			switch code {
 			case "NoRetry":
 				x.Action = NoRetry
 			case "RetryConnection":
@@ -327,22 +318,14 @@
 			case "RetryBackoff":
 				x.Action = RetryBackoff
 			default:
-				return fmt.Errorf("label %s not in enum WireRetryCode", label)
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+				return fmt.Errorf("label %s not in enum WireRetryCode", code)
 			}
 		case "Msg":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			msg, err := dec.ReadValueString()
+			if err != nil {
 				return err
 			}
-			var err error
-			if x.Msg, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
+			x.Msg = msg
 		case "ParamList":
 			if err := dec.StartValue(ttListAny); err != nil {
 				return err
diff --git a/vom/internal/helpers.go b/vom/internal/helpers.go
index c728544..01784e3 100644
--- a/vom/internal/helpers.go
+++ b/vom/internal/helpers.go
@@ -24,7 +24,9 @@
 	}
 	b.ResetTimer()
 	for i := 0; i < b.N; i++ {
-		vom.Encode(value)
+		if _, err := vom.Encode(value); err != nil {
+			b.Fatal(err)
+		}
 	}
 }
 
@@ -39,7 +41,9 @@
 	}
 	b.ResetTimer()
 	for i := 0; i < b.N; i++ {
-		vom.Decode(data, tofill)
+		if err := vom.Decode(data, tofill); err != nil {
+			b.Fatal(err)
+		}
 	}
 }
 
@@ -53,7 +57,9 @@
 	b.ResetTimer()
 	for i := 0; i < b.N; i++ {
 		buf.Reset()
-		enc.Encode(value)
+		if err := enc.Encode(value); err != nil {
+			b.Fatal(err)
+		}
 	}
 }
 
@@ -69,16 +75,22 @@
 	if err := enc.Encode(value); err != nil {
 		b.Fatal(err)
 	}
-	// Decode the type and value once first.
+	// Decode twice to read the type and two values.  We must read both values to
+	// ensure the decoder doesn't have any additional buffered data.
 	reader := bytes.NewReader(buf.Bytes())
 	dec := vom.NewDecoder(reader)
-	if err := dec.Decode(tofill); err != nil {
-		b.Fatal(err)
+	for i := 0; i < 2; i++ {
+		if err := dec.Decode(tofill); err != nil {
+			b.Fatal(err)
+		}
 	}
 	b.ResetTimer()
 	for i := 0; i < b.N; i++ {
 		reader.Seek(valueOffset, 0)
-		dec.Decode(tofill)
+		// TODO(toddw): Change benchmark to create a new value each time.
+		if err := dec.Decode(tofill); err != nil {
+			b.Fatal(err)
+		}
 	}
 }
 
@@ -91,7 +103,9 @@
 	b.ResetTimer()
 	for i := 0; i < b.N; i++ {
 		buf.Reset()
-		gob.NewEncoder(&buf).Encode(value)
+		if err := gob.NewEncoder(&buf).Encode(value); err != nil {
+			b.Fatal(err)
+		}
 	}
 }
 
@@ -108,7 +122,9 @@
 	b.ResetTimer()
 	for i := 0; i < b.N; i++ {
 		reader.Seek(0, 0)
-		gob.NewDecoder(reader).Decode(tofill)
+		if err := gob.NewDecoder(reader).Decode(tofill); err != nil {
+			b.Fatal(err)
+		}
 	}
 }
 
@@ -123,7 +139,9 @@
 	b.ResetTimer()
 	for i := 0; i < b.N; i++ {
 		buf.Reset()
-		enc.Encode(value)
+		if err := enc.Encode(value); err != nil {
+			b.Fatal(err)
+		}
 	}
 }
 
@@ -139,16 +157,21 @@
 	if err := enc.Encode(value); err != nil {
 		b.Fatal(err)
 	}
-	// Decode the type and value once first.
+	// Decode twice to read the type and two values.  We must read both values to
+	// ensure the decoder doesn't have any additional buffered data.
 	reader := bytes.NewReader(buf.Bytes())
 	dec := gob.NewDecoder(reader)
-	if err := dec.Decode(tofill); err != nil {
-		b.Fatal(err)
+	for i := 0; i < 2; i++ {
+		if err := dec.Decode(tofill); err != nil {
+			b.Fatal(err)
+		}
 	}
 	b.ResetTimer()
 	for i := 0; i < b.N; i++ {
 		reader.Seek(valueOffset, 0)
-		dec.Decode(tofill)
+		if err := dec.Decode(tofill); err != nil {
+			b.Fatal(err)
+		}
 	}
 }
 
diff --git a/vom/internal/internal.vdl.go b/vom/internal/internal.vdl.go
index 8234b78..fac76cf 100644
--- a/vom/internal/internal.vdl.go
+++ b/vom/internal/internal.vdl.go
@@ -40,15 +40,13 @@
 }
 
 func (x *VNumber) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_int32_1); err != nil {
+	switch value, err := dec.ReadValueInt(32); {
+	case err != nil:
 		return err
+	default:
+		*x = VNumber(value)
 	}
-	tmp, err := dec.DecodeInt(32)
-	if err != nil {
-		return err
-	}
-	*x = VNumber(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 type VString string
@@ -73,15 +71,13 @@
 }
 
 func (x *VString) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_string_2); err != nil {
+	switch value, err := dec.ReadValueString(); {
+	case err != nil:
 		return err
+	default:
+		*x = VString(value)
 	}
-	tmp, err := dec.DecodeString()
-	if err != nil {
-		return err
-	}
-	*x = VString(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 type VEnum int
@@ -152,17 +148,15 @@
 }
 
 func (x *VEnum) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_enum_3); err != nil {
+	switch value, err := dec.ReadValueString(); {
+	case err != nil:
 		return err
+	default:
+		if err := x.Set(value); err != nil {
+			return err
+		}
 	}
-	enum, err := dec.DecodeString()
-	if err != nil {
-		return err
-	}
-	if err := x.Set(enum); err != nil {
-		return err
-	}
-	return dec.FinishValue()
+	return nil
 }
 
 type VByteList []byte
@@ -187,15 +181,12 @@
 }
 
 func (x *VByteList) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_list_4); err != nil {
-		return err
-	}
 	var bytes []byte
-	if err := dec.DecodeBytes(-1, &bytes); err != nil {
+	if err := dec.ReadValueBytes(-1, &bytes); err != nil {
 		return err
 	}
 	*x = bytes
-	return dec.FinishValue()
+	return nil
 }
 
 type VByteArray [3]byte
@@ -220,14 +211,11 @@
 }
 
 func (x *VByteArray) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_array_5); err != nil {
-		return err
-	}
 	bytes := x[:]
-	if err := dec.DecodeBytes(3, &bytes); err != nil {
+	if err := dec.ReadValueBytes(3, &bytes); err != nil {
 		return err
 	}
-	return dec.FinishValue()
+	return nil
 }
 
 type VArray [3]int32
@@ -269,29 +257,23 @@
 	if err := dec.StartValue(__VDLType_array_6); err != nil {
 		return err
 	}
-	index := 0
-	for {
-		switch done, err := dec.NextEntry(); {
+	for index := 0; index < 3; index++ {
+		switch done, elem, err := dec.NextEntryValueInt(32); {
 		case err != nil:
 			return err
-		case done != (index >= len(*x)):
-			return fmt.Errorf("array len mismatch, done:%v index:%d len:%d %T)", done, index, len(*x), *x)
 		case done:
-			return dec.FinishValue()
+			return fmt.Errorf("short array, got len %d < 3 %T)", index, *x)
+		default:
+			x[index] = int32(elem)
 		}
-		if err := dec.StartValue(vdl.Int32Type); err != nil {
-			return err
-		}
-		tmp, err := dec.DecodeInt(32)
-		if err != nil {
-			return err
-		}
-		x[index] = int32(tmp)
-		if err := dec.FinishValue(); err != nil {
-			return err
-		}
-		index++
 	}
+	switch done, err := dec.NextEntry(); {
+	case err != nil:
+		return err
+	case !done:
+		return fmt.Errorf("long array, got len > 3 %T", *x)
+	}
+	return dec.FinishValue()
 }
 
 type VList []int32
@@ -336,32 +318,20 @@
 	if err := dec.StartValue(__VDLType_list_7); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(VList, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, elem, err := dec.NextEntryValueInt(32); {
 		case err != nil:
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			*x = append(*x, int32(elem))
 		}
-		var elem int32
-		if err := dec.StartValue(vdl.Int32Type); err != nil {
-			return err
-		}
-		tmp, err := dec.DecodeInt(32)
-		if err != nil {
-			return err
-		}
-		elem = int32(tmp)
-		if err := dec.FinishValue(); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -407,10 +377,9 @@
 	if err := dec.StartValue(__VDLType_list_8); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(VListAny, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -419,13 +388,14 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem *vom.RawBytes
+			elem = new(vom.RawBytes)
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem *vom.RawBytes
-		elem = new(vom.RawBytes)
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -476,30 +446,18 @@
 		tmpMap = make(VSet, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
+		default:
+			if tmpMap == nil {
+				tmpMap = make(VSet)
 			}
-			var err error
-			if key, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
+			tmpMap[key] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(VSet)
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -559,43 +517,25 @@
 		tmpMap = make(VMap, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
+		default:
+			var elem bool
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
+				return err
+			default:
+				elem = value
+			}
+			if tmpMap == nil {
+				tmpMap = make(VMap)
+			}
+			tmpMap[key] = elem
 		}
-		var key string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
-			}
-			var err error
-			if key, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem bool
-		{
-			if err := dec.StartValue(vdl.BoolType); err != nil {
-				return err
-			}
-			var err error
-			if elem, err = dec.DecodeBool(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		if tmpMap == nil {
-			tmpMap = make(VMap)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -680,38 +620,25 @@
 		case "":
 			return dec.FinishValue()
 		case "A":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.A = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.A = int32(value)
 			}
 		case "B":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.B, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.B = value
 			}
 		case "C":
-			if err := dec.StartValue(vdl.BoolType); err != nil {
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.C, err = dec.DecodeBool(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.C = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -1507,604 +1434,354 @@
 		case "":
 			return dec.FinishValue()
 		case "F1":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F1 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F1 = int32(value)
 			}
 		case "F2":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F2 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F2 = int32(value)
 			}
 		case "F3":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F3 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F3 = int32(value)
 			}
 		case "F4":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F4 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F4 = int32(value)
 			}
 		case "F5":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F5 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F5 = int32(value)
 			}
 		case "F6":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F6 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F6 = int32(value)
 			}
 		case "F7":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F7 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F7 = int32(value)
 			}
 		case "F8":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F8 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F8 = int32(value)
 			}
 		case "F9":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F9 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F9 = int32(value)
 			}
 		case "F10":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F10 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F10 = int32(value)
 			}
 		case "F11":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F11 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F11 = int32(value)
 			}
 		case "F12":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F12 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F12 = int32(value)
 			}
 		case "F13":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F13 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F13 = int32(value)
 			}
 		case "F14":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F14 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F14 = int32(value)
 			}
 		case "F15":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F15 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F15 = int32(value)
 			}
 		case "F16":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F16 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F16 = int32(value)
 			}
 		case "F17":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F17 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F17 = int32(value)
 			}
 		case "F18":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F18 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F18 = int32(value)
 			}
 		case "F19":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F19 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F19 = int32(value)
 			}
 		case "F20":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F20 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F20 = int32(value)
 			}
 		case "F21":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F21 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F21 = int32(value)
 			}
 		case "F22":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F22 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F22 = int32(value)
 			}
 		case "F23":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F23 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F23 = int32(value)
 			}
 		case "F24":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F24 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F24 = int32(value)
 			}
 		case "F25":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F25 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F25 = int32(value)
 			}
 		case "F26":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F26 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F26 = int32(value)
 			}
 		case "F27":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F27 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F27 = int32(value)
 			}
 		case "F28":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F28 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F28 = int32(value)
 			}
 		case "F29":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F29 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F29 = int32(value)
 			}
 		case "F30":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F30 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F30 = int32(value)
 			}
 		case "F31":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F31 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F31 = int32(value)
 			}
 		case "F32":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F32 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F32 = int32(value)
 			}
 		case "F33":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F33 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F33 = int32(value)
 			}
 		case "F34":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F34 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F34 = int32(value)
 			}
 		case "F35":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F35 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F35 = int32(value)
 			}
 		case "F36":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F36 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F36 = int32(value)
 			}
 		case "F37":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F37 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F37 = int32(value)
 			}
 		case "F38":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F38 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F38 = int32(value)
 			}
 		case "F39":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F39 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F39 = int32(value)
 			}
 		case "F40":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F40 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F40 = int32(value)
 			}
 		case "F41":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F41 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F41 = int32(value)
 			}
 		case "F42":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F42 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F42 = int32(value)
 			}
 		case "F43":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F43 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F43 = int32(value)
 			}
 		case "F44":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F44 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F44 = int32(value)
 			}
 		case "F45":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F45 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F45 = int32(value)
 			}
 		case "F46":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F46 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F46 = int32(value)
 			}
 		case "F47":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F47 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F47 = int32(value)
 			}
 		case "F48":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F48 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F48 = int32(value)
 			}
 		case "F49":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F49 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F49 = int32(value)
 			}
 		case "F50":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.F50 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.F50 = int32(value)
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -2250,42 +1927,29 @@
 	switch f {
 	case "A":
 		var field VSmallUnionA
-		if err := dec.StartValue(vdl.Int32Type); err != nil {
+		switch value, err := dec.ReadValueInt(32); {
+		case err != nil:
 			return err
-		}
-		tmp, err := dec.DecodeInt(32)
-		if err != nil {
-			return err
-		}
-		field.Value = int32(tmp)
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = int32(value)
 		}
 		*x = field
 	case "B":
 		var field VSmallUnionB
-		if err := dec.StartValue(vdl.StringType); err != nil {
+		switch value, err := dec.ReadValueString(); {
+		case err != nil:
 			return err
-		}
-		var err error
-		if field.Value, err = dec.DecodeString(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = value
 		}
 		*x = field
 	case "C":
 		var field VSmallUnionC
-		if err := dec.StartValue(vdl.BoolType); err != nil {
+		switch value, err := dec.ReadValueBool(); {
+		case err != nil:
 			return err
-		}
-		var err error
-		if field.Value, err = dec.DecodeBool(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = value
 		}
 		*x = field
 	case "":
diff --git a/vom/raw_bytes.go b/vom/raw_bytes.go
index ff4276f..d4c81f2 100644
--- a/vom/raw_bytes.go
+++ b/vom/raw_bytes.go
@@ -129,9 +129,16 @@
 		dec.refAnyLens.lens[i] = anyLen
 	}
 	xd := &xDecoder{old: dec}
-	if err := xd.setupValue(rb.Type, rb.Type); err != nil {
-		panic(err)
+	tt, lenHint, flag, err := xd.setupType(rb.Type, nil)
+	if err != nil {
+		panic(err) // TODO(toddw): Change this to not panic.
 	}
+	xd.stack = append(xd.stack, decoderStackEntry{
+		Type:    tt,
+		Index:   -1,
+		LenHint: lenHint,
+		Flag:    flag,
+	})
 	xd.ignoreNextStartValue = true
 	return xd
 }
diff --git a/vom/testdata/types/types.vdl.go b/vom/testdata/types/types.vdl.go
index 56d5c67..97da74c 100644
--- a/vom/testdata/types/types.vdl.go
+++ b/vom/testdata/types/types.vdl.go
@@ -176,15 +176,11 @@
 		case "":
 			return dec.FinishValue()
 		case "Name":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Name, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Name = value
 			}
 		case "Value":
 			x.Value = new(vdl.Value)
@@ -192,59 +188,39 @@
 				return err
 			}
 		case "TypeString":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.TypeString, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.TypeString = value
 			}
 		case "Hex":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Hex, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Hex = value
 			}
 		case "HexVersion":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.HexVersion, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.HexVersion = value
 			}
 		case "HexType":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.HexType, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.HexType = value
 			}
 		case "HexValue":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.HexValue, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.HexValue = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -362,26 +338,18 @@
 		case "":
 			return dec.FinishValue()
 		case "Name":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Name, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Name = value
 			}
 		case "PrimaryType":
-			if err := dec.StartValue(vdl.TypeObjectType); err != nil {
+			switch value, err := dec.ReadValueTypeObject(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.PrimaryType, err = dec.DecodeTypeObject(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.PrimaryType = value
 			}
 		case "Values":
 			if err := __VDLReadAnon_list_1(dec, &x.Values); err != nil {
@@ -399,10 +367,9 @@
 	if err := dec.StartValue(__VDLType_list_3); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make([]*vdl.Value, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -411,13 +378,14 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem *vdl.Value
+			elem = new(vdl.Value)
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem *vdl.Value
-		elem = new(vdl.Value)
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -653,37 +621,22 @@
 		tmpMap = make(map[byte][]*vdl.Value, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueUint(8); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key byte
-		{
-			if err := dec.StartValue(vdl.ByteType); err != nil {
-				return err
-			}
-			tmp, err := dec.DecodeUint(8)
-			if err != nil {
-				return err
-			}
-			key = byte(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem []*vdl.Value
-		{
+		default:
+			var elem []*vdl.Value
 			if err := __VDLReadAnon_list_1(dec, &elem); err != nil {
 				return err
 			}
+			if tmpMap == nil {
+				tmpMap = make(map[byte][]*vdl.Value)
+			}
+			tmpMap[byte(key)] = elem
 		}
-		if tmpMap == nil {
-			tmpMap = make(map[byte][]*vdl.Value)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -696,36 +649,22 @@
 		tmpMap = make(map[string][]*vdl.Type, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
-			}
-			var err error
-			if key, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem []*vdl.Type
-		{
+		default:
+			var elem []*vdl.Type
 			if err := __VDLReadAnon_list_5(dec, &elem); err != nil {
 				return err
 			}
+			if tmpMap == nil {
+				tmpMap = make(map[string][]*vdl.Type)
+			}
+			tmpMap[key] = elem
 		}
-		if tmpMap == nil {
-			tmpMap = make(map[string][]*vdl.Type)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -738,36 +677,22 @@
 		tmpMap = make(map[string][]ConvertGroup, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
-			}
-			var err error
-			if key, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem []ConvertGroup
-		{
+		default:
+			var elem []ConvertGroup
 			if err := __VDLReadAnon_list_6(dec, &elem); err != nil {
 				return err
 			}
+			if tmpMap == nil {
+				tmpMap = make(map[string][]ConvertGroup)
+			}
+			tmpMap[key] = elem
 		}
-		if tmpMap == nil {
-			tmpMap = make(map[string][]ConvertGroup)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -775,31 +700,20 @@
 	if err := dec.StartValue(__VDLType_list_8); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make([]*vdl.Type, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, elem, err := dec.NextEntryValueTypeObject(); {
 		case err != nil:
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			*x = append(*x, elem)
 		}
-		var elem *vdl.Type
-		if err := dec.StartValue(vdl.TypeObjectType); err != nil {
-			return err
-		}
-		var err error
-		if elem, err = dec.DecodeTypeObject(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -807,10 +721,9 @@
 	if err := dec.StartValue(__VDLType_list_9); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make([]ConvertGroup, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -819,12 +732,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem ConvertGroup
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem ConvertGroup
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -851,15 +765,13 @@
 }
 
 func (x *NBool) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_bool_10); err != nil {
+	switch value, err := dec.ReadValueBool(); {
+	case err != nil:
 		return err
+	default:
+		*x = NBool(value)
 	}
-	tmp, err := dec.DecodeBool()
-	if err != nil {
-		return err
-	}
-	*x = NBool(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 type NString string
@@ -884,15 +796,13 @@
 }
 
 func (x *NString) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_string_11); err != nil {
+	switch value, err := dec.ReadValueString(); {
+	case err != nil:
 		return err
+	default:
+		*x = NString(value)
 	}
-	tmp, err := dec.DecodeString()
-	if err != nil {
-		return err
-	}
-	*x = NString(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 type NByteSlice []byte
@@ -917,15 +827,12 @@
 }
 
 func (x *NByteSlice) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_list_12); err != nil {
-		return err
-	}
 	var bytes []byte
-	if err := dec.DecodeBytes(-1, &bytes); err != nil {
+	if err := dec.ReadValueBytes(-1, &bytes); err != nil {
 		return err
 	}
 	*x = bytes
-	return dec.FinishValue()
+	return nil
 }
 
 type NByteArray [4]byte
@@ -950,14 +857,11 @@
 }
 
 func (x *NByteArray) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_array_13); err != nil {
-		return err
-	}
 	bytes := x[:]
-	if err := dec.DecodeBytes(4, &bytes); err != nil {
+	if err := dec.ReadValueBytes(4, &bytes); err != nil {
 		return err
 	}
-	return dec.FinishValue()
+	return nil
 }
 
 type NByte byte
@@ -982,15 +886,13 @@
 }
 
 func (x *NByte) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_byte_14); err != nil {
+	switch value, err := dec.ReadValueUint(8); {
+	case err != nil:
 		return err
+	default:
+		*x = NByte(value)
 	}
-	tmp, err := dec.DecodeUint(8)
-	if err != nil {
-		return err
-	}
-	*x = NByte(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 type NUint16 uint16
@@ -1015,15 +917,13 @@
 }
 
 func (x *NUint16) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_uint16_15); err != nil {
+	switch value, err := dec.ReadValueUint(16); {
+	case err != nil:
 		return err
+	default:
+		*x = NUint16(value)
 	}
-	tmp, err := dec.DecodeUint(16)
-	if err != nil {
-		return err
-	}
-	*x = NUint16(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 type NUint32 uint32
@@ -1048,15 +948,13 @@
 }
 
 func (x *NUint32) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_uint32_16); err != nil {
+	switch value, err := dec.ReadValueUint(32); {
+	case err != nil:
 		return err
+	default:
+		*x = NUint32(value)
 	}
-	tmp, err := dec.DecodeUint(32)
-	if err != nil {
-		return err
-	}
-	*x = NUint32(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 type NUint64 uint64
@@ -1081,15 +979,13 @@
 }
 
 func (x *NUint64) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_uint64_17); err != nil {
+	switch value, err := dec.ReadValueUint(64); {
+	case err != nil:
 		return err
+	default:
+		*x = NUint64(value)
 	}
-	tmp, err := dec.DecodeUint(64)
-	if err != nil {
-		return err
-	}
-	*x = NUint64(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 type NInt8 int8
@@ -1114,15 +1010,13 @@
 }
 
 func (x *NInt8) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_int8_18); err != nil {
+	switch value, err := dec.ReadValueInt(8); {
+	case err != nil:
 		return err
+	default:
+		*x = NInt8(value)
 	}
-	tmp, err := dec.DecodeInt(8)
-	if err != nil {
-		return err
-	}
-	*x = NInt8(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 type NInt16 int16
@@ -1147,15 +1041,13 @@
 }
 
 func (x *NInt16) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_int16_19); err != nil {
+	switch value, err := dec.ReadValueInt(16); {
+	case err != nil:
 		return err
+	default:
+		*x = NInt16(value)
 	}
-	tmp, err := dec.DecodeInt(16)
-	if err != nil {
-		return err
-	}
-	*x = NInt16(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 type NInt32 int32
@@ -1180,15 +1072,13 @@
 }
 
 func (x *NInt32) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_int32_20); err != nil {
+	switch value, err := dec.ReadValueInt(32); {
+	case err != nil:
 		return err
+	default:
+		*x = NInt32(value)
 	}
-	tmp, err := dec.DecodeInt(32)
-	if err != nil {
-		return err
-	}
-	*x = NInt32(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 type NInt64 int64
@@ -1213,15 +1103,13 @@
 }
 
 func (x *NInt64) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_int64_21); err != nil {
+	switch value, err := dec.ReadValueInt(64); {
+	case err != nil:
 		return err
+	default:
+		*x = NInt64(value)
 	}
-	tmp, err := dec.DecodeInt(64)
-	if err != nil {
-		return err
-	}
-	*x = NInt64(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 type NFloat32 float32
@@ -1246,15 +1134,13 @@
 }
 
 func (x *NFloat32) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_float32_22); err != nil {
+	switch value, err := dec.ReadValueFloat(32); {
+	case err != nil:
 		return err
+	default:
+		*x = NFloat32(value)
 	}
-	tmp, err := dec.DecodeFloat(32)
-	if err != nil {
-		return err
-	}
-	*x = NFloat32(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 type NFloat64 float64
@@ -1279,15 +1165,13 @@
 }
 
 func (x *NFloat64) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_float64_23); err != nil {
+	switch value, err := dec.ReadValueFloat(64); {
+	case err != nil:
 		return err
+	default:
+		*x = NFloat64(value)
 	}
-	tmp, err := dec.DecodeFloat(64)
-	if err != nil {
-		return err
-	}
-	*x = NFloat64(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 type NArray2Uint64 [2]uint64
@@ -1329,28 +1213,23 @@
 	if err := dec.StartValue(__VDLType_array_24); err != nil {
 		return err
 	}
-	index := 0
-	for {
-		switch done, err := dec.NextEntry(); {
+	for index := 0; index < 2; index++ {
+		switch done, elem, err := dec.NextEntryValueUint(64); {
 		case err != nil:
 			return err
-		case done != (index >= len(*x)):
-			return fmt.Errorf("array len mismatch, done:%v index:%d len:%d %T)", done, index, len(*x), *x)
 		case done:
-			return dec.FinishValue()
+			return fmt.Errorf("short array, got len %d < 2 %T)", index, *x)
+		default:
+			x[index] = elem
 		}
-		if err := dec.StartValue(vdl.Uint64Type); err != nil {
-			return err
-		}
-		var err error
-		if x[index], err = dec.DecodeUint(64); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
-		}
-		index++
 	}
+	switch done, err := dec.NextEntry(); {
+	case err != nil:
+		return err
+	case !done:
+		return fmt.Errorf("long array, got len > 2 %T", *x)
+	}
+	return dec.FinishValue()
 }
 
 type NListUint64 []uint64
@@ -1395,31 +1274,20 @@
 	if err := dec.StartValue(__VDLType_list_25); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(NListUint64, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, elem, err := dec.NextEntryValueUint(64); {
 		case err != nil:
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			*x = append(*x, elem)
 		}
-		var elem uint64
-		if err := dec.StartValue(vdl.Uint64Type); err != nil {
-			return err
-		}
-		var err error
-		if elem, err = dec.DecodeUint(64); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -1470,30 +1338,18 @@
 		tmpMap = make(NSetUint64, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueUint(64); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key uint64
-		{
-			if err := dec.StartValue(vdl.Uint64Type); err != nil {
-				return err
+		default:
+			if tmpMap == nil {
+				tmpMap = make(NSetUint64)
 			}
-			var err error
-			if key, err = dec.DecodeUint(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
+			tmpMap[key] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(NSetUint64)
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -1553,43 +1409,25 @@
 		tmpMap = make(NMapUint64String, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueUint(64); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
+		default:
+			var elem string
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
+				return err
+			default:
+				elem = value
+			}
+			if tmpMap == nil {
+				tmpMap = make(NMapUint64String)
+			}
+			tmpMap[key] = elem
 		}
-		var key uint64
-		{
-			if err := dec.StartValue(vdl.Uint64Type); err != nil {
-				return err
-			}
-			var err error
-			if key, err = dec.DecodeUint(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
-			}
-			var err error
-			if elem, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		if tmpMap == nil {
-			tmpMap = make(NMapUint64String)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -1674,37 +1512,25 @@
 		case "":
 			return dec.FinishValue()
 		case "A":
-			if err := dec.StartValue(vdl.BoolType); err != nil {
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.A, err = dec.DecodeBool(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.A = value
 			}
 		case "B":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.B, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.B = value
 			}
 		case "C":
-			if err := dec.StartValue(vdl.Int64Type); err != nil {
+			switch value, err := dec.ReadValueInt(64); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.C, err = dec.DecodeInt(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.C = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -1782,17 +1608,15 @@
 }
 
 func (x *NEnum) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_enum_29); err != nil {
+	switch value, err := dec.ReadValueString(); {
+	case err != nil:
 		return err
+	default:
+		if err := x.Set(value); err != nil {
+			return err
+		}
 	}
-	enum, err := dec.DecodeString()
-	if err != nil {
-		return err
-	}
-	if err := x.Set(enum); err != nil {
-		return err
-	}
-	return dec.FinishValue()
+	return nil
 }
 
 type (
@@ -1931,41 +1755,29 @@
 	switch f {
 	case "A":
 		var field NUnionA
-		if err := dec.StartValue(vdl.BoolType); err != nil {
+		switch value, err := dec.ReadValueBool(); {
+		case err != nil:
 			return err
-		}
-		var err error
-		if field.Value, err = dec.DecodeBool(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = value
 		}
 		*x = field
 	case "B":
 		var field NUnionB
-		if err := dec.StartValue(vdl.StringType); err != nil {
+		switch value, err := dec.ReadValueString(); {
+		case err != nil:
 			return err
-		}
-		var err error
-		if field.Value, err = dec.DecodeString(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = value
 		}
 		*x = field
 	case "C":
 		var field NUnionC
-		if err := dec.StartValue(vdl.Int64Type); err != nil {
+		switch value, err := dec.ReadValueInt(64); {
+		case err != nil:
 			return err
-		}
-		var err error
-		if field.Value, err = dec.DecodeInt(64); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = value
 		}
 		*x = field
 	case "":
@@ -2005,15 +1817,13 @@
 }
 
 func (x *MBool) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_bool_31); err != nil {
+	switch value, err := dec.ReadValueBool(); {
+	case err != nil:
 		return err
+	default:
+		*x = MBool(value)
 	}
-	tmp, err := dec.DecodeBool()
-	if err != nil {
-		return err
-	}
-	*x = MBool(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 type MStruct struct {
@@ -2136,23 +1946,25 @@
 		case "":
 			return dec.FinishValue()
 		case "A":
-			if err := dec.StartValue(vdl.BoolType); err != nil {
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.A, err = dec.DecodeBool(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.A = value
 			}
 		case "B":
-			if err := x.B.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
 				return err
+			default:
+				x.B = NBool(value)
 			}
 		case "C":
-			if err := x.C.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
 				return err
+			default:
+				x.C = MBool(value)
 			}
 		case "D":
 			if err := dec.StartValue(__VDLType_optional_33); err != nil {
@@ -2171,15 +1983,11 @@
 				}
 			}
 		case "E":
-			if err := dec.StartValue(vdl.TypeObjectType); err != nil {
+			switch value, err := dec.ReadValueTypeObject(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.E, err = dec.DecodeTypeObject(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.E = value
 			}
 		case "F":
 			x.F = new(vdl.Value)
@@ -2230,10 +2038,9 @@
 	if err := dec.StartValue(__VDLType_list_34); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(MList, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -2242,12 +2049,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem NListUint64
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem NListUint64
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -2295,29 +2103,22 @@
 		tmpMap = make(MMap, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueFloat(32); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key NFloat32
-		{
-			if err := key.VDLRead(dec); err != nil {
-				return err
-			}
-		}
-		var elem NListUint64
-		{
+		default:
+			var elem NListUint64
 			if err := elem.VDLRead(dec); err != nil {
 				return err
 			}
+			if tmpMap == nil {
+				tmpMap = make(MMap)
+			}
+			tmpMap[NFloat32(key)] = elem
 		}
-		if tmpMap == nil {
-			tmpMap = make(MMap)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -2343,15 +2144,12 @@
 }
 
 func (x *MByteSlice) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_list_36); err != nil {
-		return err
-	}
 	var bytes []byte
-	if err := dec.DecodeBytes(-1, &bytes); err != nil {
+	if err := dec.ReadValueBytes(-1, &bytes); err != nil {
 		return err
 	}
 	*x = bytes
-	return dec.FinishValue()
+	return nil
 }
 
 type MInt8Slice []int8
@@ -2396,32 +2194,20 @@
 	if err := dec.StartValue(__VDLType_list_37); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(MInt8Slice, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, elem, err := dec.NextEntryValueInt(8); {
 		case err != nil:
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			*x = append(*x, int8(elem))
 		}
-		var elem int8
-		if err := dec.StartValue(vdl.Int8Type); err != nil {
-			return err
-		}
-		tmp, err := dec.DecodeInt(8)
-		if err != nil {
-			return err
-		}
-		elem = int8(tmp)
-		if err := dec.FinishValue(); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -2462,10 +2248,9 @@
 	if err := dec.StartValue(__VDLType_list_38); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(RecA, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -2474,12 +2259,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem RecA
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem RecA
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -2519,10 +2305,9 @@
 	if err := dec.StartValue(__VDLType_list_39); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(RecY, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -2531,12 +2316,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem RecX
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem RecX
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -2576,10 +2362,9 @@
 	if err := dec.StartValue(__VDLType_list_40); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(RecX, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -2588,12 +2373,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem RecY
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem RecY
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -2633,10 +2419,9 @@
 	if err := dec.StartValue(__VDLType_list_41); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(Rec4, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -2645,12 +2430,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem Rec1
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem Rec1
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -2690,10 +2476,9 @@
 	if err := dec.StartValue(__VDLType_list_43); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(Rec3, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -2702,12 +2487,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem Rec4
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem Rec4
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -2747,10 +2533,9 @@
 	if err := dec.StartValue(__VDLType_list_44); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(Rec2, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -2759,12 +2544,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem Rec3
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem Rec3
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -2804,10 +2590,9 @@
 	if err := dec.StartValue(__VDLType_list_42); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(Rec1, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -2816,12 +2601,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem Rec2
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem Rec2
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -3124,10 +2910,9 @@
 	if err := dec.StartValue(__VDLType_list_49); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make([]Rec1234A, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -3136,12 +2921,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem Rec1234A
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem Rec1234A
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -3149,10 +2935,9 @@
 	if err := dec.StartValue(__VDLType_list_50); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make([]Rec1234, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -3161,12 +2946,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem Rec1234
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem Rec1234
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -3270,10 +3056,9 @@
 	if err := dec.StartValue(__VDLType_list_52); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make([]Rec1234B, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -3282,12 +3067,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem Rec1234B
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem Rec1234B
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -3409,31 +3195,20 @@
 	if err := dec.StartValue(__VDLType_list_54); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(ListString, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, elem, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			*x = append(*x, elem)
 		}
-		var elem string
-		if err := dec.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		var err error
-		if elem, err = dec.DecodeString(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -3476,28 +3251,23 @@
 	if err := dec.StartValue(__VDLType_array_55); err != nil {
 		return err
 	}
-	index := 0
-	for {
-		switch done, err := dec.NextEntry(); {
+	for index := 0; index < 3; index++ {
+		switch done, elem, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
-		case done != (index >= len(*x)):
-			return fmt.Errorf("array len mismatch, done:%v index:%d len:%d %T)", done, index, len(*x), *x)
 		case done:
-			return dec.FinishValue()
+			return fmt.Errorf("short array, got len %d < 3 %T)", index, *x)
+		default:
+			x[index] = elem
 		}
-		if err := dec.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		var err error
-		if x[index], err = dec.DecodeString(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
-		}
-		index++
 	}
+	switch done, err := dec.NextEntry(); {
+	case err != nil:
+		return err
+	case !done:
+		return fmt.Errorf("long array, got len > 3 %T", *x)
+	}
+	return dec.FinishValue()
 }
 
 type Array4String [4]string
@@ -3539,28 +3309,23 @@
 	if err := dec.StartValue(__VDLType_array_56); err != nil {
 		return err
 	}
-	index := 0
-	for {
-		switch done, err := dec.NextEntry(); {
+	for index := 0; index < 4; index++ {
+		switch done, elem, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
-		case done != (index >= len(*x)):
-			return fmt.Errorf("array len mismatch, done:%v index:%d len:%d %T)", done, index, len(*x), *x)
 		case done:
-			return dec.FinishValue()
+			return fmt.Errorf("short array, got len %d < 4 %T)", index, *x)
+		default:
+			x[index] = elem
 		}
-		if err := dec.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		var err error
-		if x[index], err = dec.DecodeString(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
-		}
-		index++
 	}
+	switch done, err := dec.NextEntry(); {
+	case err != nil:
+		return err
+	case !done:
+		return fmt.Errorf("long array, got len > 4 %T", *x)
+	}
+	return dec.FinishValue()
 }
 
 type AbcStruct struct {
@@ -3644,37 +3409,25 @@
 		case "":
 			return dec.FinishValue()
 		case "A":
-			if err := dec.StartValue(vdl.BoolType); err != nil {
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.A, err = dec.DecodeBool(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.A = value
 			}
 		case "B":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.B, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.B = value
 			}
 		case "C":
-			if err := dec.StartValue(vdl.Int64Type); err != nil {
+			switch value, err := dec.ReadValueInt(64); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.C, err = dec.DecodeInt(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.C = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -3765,15 +3518,11 @@
 		case "":
 			return dec.FinishValue()
 		case "A":
-			if err := dec.StartValue(vdl.BoolType); err != nil {
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.A, err = dec.DecodeBool(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.A = value
 			}
 		case "D":
 			x.D = new(vdl.Value)
@@ -3781,15 +3530,11 @@
 				return err
 			}
 		case "E":
-			if err := dec.StartValue(vdl.TypeObjectType); err != nil {
+			switch value, err := dec.ReadValueTypeObject(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.E, err = dec.DecodeTypeObject(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.E = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -3874,30 +3619,25 @@
 		case "":
 			return dec.FinishValue()
 		case "X":
-			if err := dec.StartValue(vdl.BoolType); err != nil {
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.X, err = dec.DecodeBool(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.X = value
 			}
 		case "Y":
-			if err := x.Y.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
 				return err
+			default:
+				x.Y = MBool(value)
 			}
 		case "Z":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Z, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Z = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -3961,12 +3701,18 @@
 		case "":
 			return dec.FinishValue()
 		case "Y":
-			if err := x.Y.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
 				return err
+			default:
+				x.Y = NBool(value)
 			}
 		case "Z":
-			if err := x.Z.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
+			default:
+				x.Z = NString(value)
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -4027,15 +3773,11 @@
 		case "":
 			return dec.FinishValue()
 		case "Z":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Z, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Z = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -4111,27 +3853,18 @@
 		case "":
 			return dec.FinishValue()
 		case "Key1":
-			if err := dec.StartValue(vdl.Int64Type); err != nil {
+			switch value, err := dec.ReadValueInt(64); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Key1, err = dec.DecodeInt(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Key1 = value
 			}
 		case "Key2":
-			if err := dec.StartValue(vdl.Uint32Type); err != nil {
+			switch value, err := dec.ReadValueUint(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeUint(32)
-			if err != nil {
-				return err
-			}
-			x.Key2 = uint32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Key2 = uint32(value)
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -4197,43 +3930,25 @@
 		tmpMap = make(StructOnlyMap, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
+		default:
+			var elem uint64
+			switch value, err := dec.ReadValueUint(64); {
+			case err != nil:
+				return err
+			default:
+				elem = value
+			}
+			if tmpMap == nil {
+				tmpMap = make(StructOnlyMap)
+			}
+			tmpMap[key] = elem
 		}
-		var key string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
-			}
-			var err error
-			if key, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem uint64
-		{
-			if err := dec.StartValue(vdl.Uint64Type); err != nil {
-				return err
-			}
-			var err error
-			if elem, err = dec.DecodeUint(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		if tmpMap == nil {
-			tmpMap = make(StructOnlyMap)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -4318,37 +4033,25 @@
 		case "":
 			return dec.FinishValue()
 		case "Feat":
-			if err := dec.StartValue(vdl.BoolType); err != nil {
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Feat, err = dec.DecodeBool(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Feat = value
 			}
 		case "Tire":
-			if err := dec.StartValue(vdl.BoolType); err != nil {
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Tire, err = dec.DecodeBool(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Tire = value
 			}
 		case "Eel":
-			if err := dec.StartValue(vdl.BoolType); err != nil {
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Eel, err = dec.DecodeBool(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Eel = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -4414,43 +4117,25 @@
 		tmpMap = make(SetStructMap, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
+		default:
+			var elem bool
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
+				return err
+			default:
+				elem = value
+			}
+			if tmpMap == nil {
+				tmpMap = make(SetStructMap)
+			}
+			tmpMap[key] = elem
 		}
-		var key string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
-			}
-			var err error
-			if key, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem bool
-		{
-			if err := dec.StartValue(vdl.BoolType); err != nil {
-				return err
-			}
-			var err error
-			if elem, err = dec.DecodeBool(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		if tmpMap == nil {
-			tmpMap = make(SetStructMap)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -4501,30 +4186,18 @@
 		tmpMap = make(MapStructSet, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
+		default:
+			if tmpMap == nil {
+				tmpMap = make(MapStructSet)
 			}
-			var err error
-			if key, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
+			tmpMap[key] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(MapStructSet)
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -4584,43 +4257,25 @@
 		tmpMap = make(SetOnlyMap, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueFloat(64); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
+		default:
+			var elem bool
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
+				return err
+			default:
+				elem = value
+			}
+			if tmpMap == nil {
+				tmpMap = make(SetOnlyMap)
+			}
+			tmpMap[key] = elem
 		}
-		var key float64
-		{
-			if err := dec.StartValue(vdl.Float64Type); err != nil {
-				return err
-			}
-			var err error
-			if key, err = dec.DecodeFloat(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem bool
-		{
-			if err := dec.StartValue(vdl.BoolType); err != nil {
-				return err
-			}
-			var err error
-			if elem, err = dec.DecodeBool(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		if tmpMap == nil {
-			tmpMap = make(SetOnlyMap)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -4680,37 +4335,23 @@
 		tmpMap = make(SometimesSetMap, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueFloat(64); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key float64
-		{
-			if err := dec.StartValue(vdl.Float64Type); err != nil {
-				return err
-			}
-			var err error
-			if key, err = dec.DecodeFloat(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem *vdl.Value
-		{
+		default:
+			var elem *vdl.Value
 			elem = new(vdl.Value)
 			if err := elem.VDLRead(dec); err != nil {
 				return err
 			}
+			if tmpMap == nil {
+				tmpMap = make(SometimesSetMap)
+			}
+			tmpMap[key] = elem
 		}
-		if tmpMap == nil {
-			tmpMap = make(SometimesSetMap)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -4761,30 +4402,18 @@
 		tmpMap = make(MapOnlySet, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueFloat(64); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key float64
-		{
-			if err := dec.StartValue(vdl.Float64Type); err != nil {
-				return err
+		default:
+			if tmpMap == nil {
+				tmpMap = make(MapOnlySet)
 			}
-			var err error
-			if key, err = dec.DecodeFloat(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
+			tmpMap[key] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(MapOnlySet)
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -4835,30 +4464,18 @@
 		tmpMap = make(SetOnlyA, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueBool(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key bool
-		{
-			if err := dec.StartValue(vdl.BoolType); err != nil {
-				return err
+		default:
+			if tmpMap == nil {
+				tmpMap = make(SetOnlyA)
 			}
-			var err error
-			if key, err = dec.DecodeBool(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
+			tmpMap[key] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(SetOnlyA)
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -4903,23 +4520,18 @@
 		tmpMap = make(SetOnlyA2, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueBool(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key NBool
-		{
-			if err := key.VDLRead(dec); err != nil {
-				return err
+		default:
+			if tmpMap == nil {
+				tmpMap = make(SetOnlyA2)
 			}
+			tmpMap[NBool(key)] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(SetOnlyA2)
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -4970,31 +4582,18 @@
 		tmpMap = make(SetOnlyB, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueInt(16); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key int16
-		{
-			if err := dec.StartValue(vdl.Int16Type); err != nil {
-				return err
+		default:
+			if tmpMap == nil {
+				tmpMap = make(SetOnlyB)
 			}
-			tmp, err := dec.DecodeInt(16)
-			if err != nil {
-				return err
-			}
-			key = int16(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
+			tmpMap[int16(key)] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(SetOnlyB)
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -5039,23 +4638,18 @@
 		tmpMap = make(SetOnlyB2, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueInt(16); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key NInt16
-		{
-			if err := key.VDLRead(dec); err != nil {
-				return err
+		default:
+			if tmpMap == nil {
+				tmpMap = make(SetOnlyB2)
 			}
+			tmpMap[NInt16(key)] = struct{}{}
 		}
-		if tmpMap == nil {
-			tmpMap = make(SetOnlyB2)
-		}
-		tmpMap[key] = struct{}{}
 	}
 }
 
@@ -5115,45 +4709,25 @@
 		tmpMap = make(MapOnlyA, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueUint(32); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
+		default:
+			var elem uint32
+			switch value, err := dec.ReadValueUint(32); {
+			case err != nil:
+				return err
+			default:
+				elem = uint32(value)
+			}
+			if tmpMap == nil {
+				tmpMap = make(MapOnlyA)
+			}
+			tmpMap[uint32(key)] = elem
 		}
-		var key uint32
-		{
-			if err := dec.StartValue(vdl.Uint32Type); err != nil {
-				return err
-			}
-			tmp, err := dec.DecodeUint(32)
-			if err != nil {
-				return err
-			}
-			key = uint32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem uint32
-		{
-			if err := dec.StartValue(vdl.Uint32Type); err != nil {
-				return err
-			}
-			tmp, err := dec.DecodeUint(32)
-			if err != nil {
-				return err
-			}
-			elem = uint32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		if tmpMap == nil {
-			tmpMap = make(MapOnlyA)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -5213,43 +4787,25 @@
 		tmpMap = make(MapOnlyA2, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueInt(64); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
+		default:
+			var elem float64
+			switch value, err := dec.ReadValueFloat(64); {
+			case err != nil:
+				return err
+			default:
+				elem = value
+			}
+			if tmpMap == nil {
+				tmpMap = make(MapOnlyA2)
+			}
+			tmpMap[key] = elem
 		}
-		var key int64
-		{
-			if err := dec.StartValue(vdl.Int64Type); err != nil {
-				return err
-			}
-			var err error
-			if key, err = dec.DecodeInt(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem float64
-		{
-			if err := dec.StartValue(vdl.Float64Type); err != nil {
-				return err
-			}
-			var err error
-			if elem, err = dec.DecodeFloat(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		if tmpMap == nil {
-			tmpMap = make(MapOnlyA2)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -5309,43 +4865,25 @@
 		tmpMap = make(MapOnlyB, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueBool(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
+		default:
+			var elem string
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
+				return err
+			default:
+				elem = value
+			}
+			if tmpMap == nil {
+				tmpMap = make(MapOnlyB)
+			}
+			tmpMap[key] = elem
 		}
-		var key bool
-		{
-			if err := dec.StartValue(vdl.BoolType); err != nil {
-				return err
-			}
-			var err error
-			if key, err = dec.DecodeBool(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem string
-		{
-			if err := dec.StartValue(vdl.StringType); err != nil {
-				return err
-			}
-			var err error
-			if elem, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		if tmpMap == nil {
-			tmpMap = make(MapOnlyB)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -5393,29 +4931,25 @@
 		tmpMap = make(MapOnlyB2, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueBool(); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
-		}
-		var key NBool
-		{
-			if err := key.VDLRead(dec); err != nil {
+		default:
+			var elem NString
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
+			default:
+				elem = NString(value)
 			}
-		}
-		var elem NString
-		{
-			if err := elem.VDLRead(dec); err != nil {
-				return err
+			if tmpMap == nil {
+				tmpMap = make(MapOnlyB2)
 			}
+			tmpMap[NBool(key)] = elem
 		}
-		if tmpMap == nil {
-			tmpMap = make(MapOnlyB2)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -5549,15 +5083,11 @@
 	switch f {
 	case "B":
 		var field BdeUnionB
-		if err := dec.StartValue(vdl.StringType); err != nil {
+		switch value, err := dec.ReadValueString(); {
+		case err != nil:
 			return err
-		}
-		var err error
-		if field.Value, err = dec.DecodeString(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = value
 		}
 		*x = field
 	case "D":
@@ -5569,15 +5099,11 @@
 		*x = field
 	case "E":
 		var field BdeUnionE
-		if err := dec.StartValue(vdl.TypeObjectType); err != nil {
+		switch value, err := dec.ReadValueTypeObject(); {
+		case err != nil:
 			return err
-		}
-		var err error
-		if field.Value, err = dec.DecodeTypeObject(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = value
 		}
 		*x = field
 	case "":
@@ -5662,17 +5188,15 @@
 }
 
 func (x *BrieEnum) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_enum_79); err != nil {
+	switch value, err := dec.ReadValueString(); {
+	case err != nil:
 		return err
+	default:
+		if err := x.Set(value); err != nil {
+			return err
+		}
 	}
-	enum, err := dec.DecodeString()
-	if err != nil {
-		return err
-	}
-	if err := x.Set(enum); err != nil {
-		return err
-	}
-	return dec.FinishValue()
+	return nil
 }
 
 type BeanEnum int
@@ -5731,17 +5255,15 @@
 }
 
 func (x *BeanEnum) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_enum_80); err != nil {
+	switch value, err := dec.ReadValueString(); {
+	case err != nil:
 		return err
+	default:
+		if err := x.Set(value); err != nil {
+			return err
+		}
 	}
-	enum, err := dec.DecodeString()
-	if err != nil {
-		return err
-	}
-	if err := x.Set(enum); err != nil {
-		return err
-	}
-	return dec.FinishValue()
+	return nil
 }
 
 type FoodEnum int
@@ -5812,17 +5334,15 @@
 }
 
 func (x *FoodEnum) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_enum_81); err != nil {
+	switch value, err := dec.ReadValueString(); {
+	case err != nil:
 		return err
+	default:
+		if err := x.Set(value); err != nil {
+			return err
+		}
 	}
-	enum, err := dec.DecodeString()
-	if err != nil {
-		return err
-	}
-	if err := x.Set(enum); err != nil {
-		return err
-	}
-	return dec.FinishValue()
+	return nil
 }
 
 type StructAny struct {
@@ -5991,43 +5511,25 @@
 		tmpMap = make(map[int64]int64, len)
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, key, err := dec.NextEntryValueInt(64); {
 		case err != nil:
 			return err
 		case done:
 			*x = tmpMap
 			return dec.FinishValue()
+		default:
+			var elem int64
+			switch value, err := dec.ReadValueInt(64); {
+			case err != nil:
+				return err
+			default:
+				elem = value
+			}
+			if tmpMap == nil {
+				tmpMap = make(map[int64]int64)
+			}
+			tmpMap[key] = elem
 		}
-		var key int64
-		{
-			if err := dec.StartValue(vdl.Int64Type); err != nil {
-				return err
-			}
-			var err error
-			if key, err = dec.DecodeInt(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		var elem int64
-		{
-			if err := dec.StartValue(vdl.Int64Type); err != nil {
-				return err
-			}
-			var err error
-			if elem, err = dec.DecodeInt(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
-			}
-		}
-		if tmpMap == nil {
-			tmpMap = make(map[int64]int64)
-		}
-		tmpMap[key] = elem
 	}
 }
 
@@ -6408,156 +5910,111 @@
 		case "":
 			return dec.FinishValue()
 		case "Bool":
-			if err := dec.StartValue(vdl.BoolType); err != nil {
+			switch value, err := dec.ReadValueBool(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Bool, err = dec.DecodeBool(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Bool = value
 			}
 		case "AByte":
-			if err := dec.StartValue(vdl.ByteType); err != nil {
+			switch value, err := dec.ReadValueUint(8); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeUint(8)
-			if err != nil {
-				return err
-			}
-			x.AByte = byte(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.AByte = byte(value)
 			}
 		case "Int16":
-			if err := dec.StartValue(vdl.Int16Type); err != nil {
+			switch value, err := dec.ReadValueInt(16); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(16)
-			if err != nil {
-				return err
-			}
-			x.Int16 = int16(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Int16 = int16(value)
 			}
 		case "Int32":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.Int32 = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Int32 = int32(value)
 			}
 		case "Int64":
-			if err := dec.StartValue(vdl.Int64Type); err != nil {
+			switch value, err := dec.ReadValueInt(64); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Int64, err = dec.DecodeInt(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Int64 = value
 			}
 		case "Uint16":
-			if err := dec.StartValue(vdl.Uint16Type); err != nil {
+			switch value, err := dec.ReadValueUint(16); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeUint(16)
-			if err != nil {
-				return err
-			}
-			x.Uint16 = uint16(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Uint16 = uint16(value)
 			}
 		case "Uint32":
-			if err := dec.StartValue(vdl.Uint32Type); err != nil {
+			switch value, err := dec.ReadValueUint(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeUint(32)
-			if err != nil {
-				return err
-			}
-			x.Uint32 = uint32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Uint32 = uint32(value)
 			}
 		case "Uint64":
-			if err := dec.StartValue(vdl.Uint64Type); err != nil {
+			switch value, err := dec.ReadValueUint(64); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Uint64, err = dec.DecodeUint(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Uint64 = value
 			}
 		case "String":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.String, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.String = value
 			}
 		case "Bytes":
-			if err := dec.StartValue(__VDLType_list_86); err != nil {
-				return err
-			}
-			if err := dec.DecodeBytes(-1, &x.Bytes); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
+			if err := dec.ReadValueBytes(-1, &x.Bytes); err != nil {
 				return err
 			}
 		case "Float32":
-			if err := dec.StartValue(vdl.Float32Type); err != nil {
+			switch value, err := dec.ReadValueFloat(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeFloat(32)
-			if err != nil {
-				return err
-			}
-			x.Float32 = float32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Float32 = float32(value)
 			}
 		case "Float64":
-			if err := dec.StartValue(vdl.Float64Type); err != nil {
+			switch value, err := dec.ReadValueFloat(64); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Float64, err = dec.DecodeFloat(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Float64 = value
 			}
 		case "FoodEnum":
-			if err := x.FoodEnum.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
+			default:
+				if err := x.FoodEnum.Set(value); err != nil {
+					return err
+				}
 			}
 		case "NEnum":
-			if err := x.NEnum.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
+			default:
+				if err := x.NEnum.Set(value); err != nil {
+					return err
+				}
 			}
 		case "NListUint64":
 			if err := x.NListUint64.VDLRead(dec); err != nil {
 				return err
 			}
 		case "NByteArray":
-			if err := x.NByteArray.VDLRead(dec); err != nil {
+			bytes := x.NByteArray[:]
+			if err := dec.ReadValueBytes(4, &bytes); err != nil {
 				return err
 			}
 		case "NArray2Uint64":
@@ -6581,15 +6038,11 @@
 				return err
 			}
 		case "TypeObject":
-			if err := dec.StartValue(vdl.TypeObjectType); err != nil {
+			switch value, err := dec.ReadValueTypeObject(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.TypeObject, err = dec.DecodeTypeObject(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.TypeObject = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -6641,10 +6094,9 @@
 	if err := dec.StartValue(__VDLType_list_87); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make(AnySlice, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -6653,13 +6105,14 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem *vdl.Value
+			elem = new(vdl.Value)
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem *vdl.Value
-		elem = new(vdl.Value)
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -6732,13 +6185,7 @@
 		case "":
 			return dec.FinishValue()
 		case "Payload":
-			if err := dec.StartValue(__VDLType_list_86); err != nil {
-				return err
-			}
-			if err := dec.DecodeBytes(-1, &x.Payload); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
+			if err := dec.ReadValueBytes(-1, &x.Payload); err != nil {
 				return err
 			}
 		case "Next":
diff --git a/vom/vom.vdl.go b/vom/vom.vdl.go
index 06ee121..c6a683b 100644
--- a/vom/vom.vdl.go
+++ b/vom/vom.vdl.go
@@ -86,17 +86,15 @@
 }
 
 func (x *ControlKind) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_enum_1); err != nil {
+	switch value, err := dec.ReadValueString(); {
+	case err != nil:
 		return err
+	default:
+		if err := x.Set(value); err != nil {
+			return err
+		}
 	}
-	enum, err := dec.DecodeString()
-	if err != nil {
-		return err
-	}
-	if err := x.Set(enum); err != nil {
-		return err
-	}
-	return dec.FinishValue()
+	return nil
 }
 
 type (
@@ -368,87 +366,67 @@
 	switch f {
 	case "PBool":
 		var field PrimitivePBool
-		if err := dec.StartValue(vdl.BoolType); err != nil {
+		switch value, err := dec.ReadValueBool(); {
+		case err != nil:
 			return err
-		}
-		var err error
-		if field.Value, err = dec.DecodeBool(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = value
 		}
 		*x = field
 	case "PByte":
 		var field PrimitivePByte
-		if err := dec.StartValue(vdl.ByteType); err != nil {
+		switch value, err := dec.ReadValueUint(8); {
+		case err != nil:
 			return err
-		}
-		tmp, err := dec.DecodeUint(8)
-		if err != nil {
-			return err
-		}
-		field.Value = byte(tmp)
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = byte(value)
 		}
 		*x = field
 	case "PUint":
 		var field PrimitivePUint
-		if err := dec.StartValue(vdl.Uint64Type); err != nil {
+		switch value, err := dec.ReadValueUint(64); {
+		case err != nil:
 			return err
-		}
-		var err error
-		if field.Value, err = dec.DecodeUint(64); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = value
 		}
 		*x = field
 	case "PInt":
 		var field PrimitivePInt
-		if err := dec.StartValue(vdl.Int64Type); err != nil {
+		switch value, err := dec.ReadValueInt(64); {
+		case err != nil:
 			return err
-		}
-		var err error
-		if field.Value, err = dec.DecodeInt(64); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = value
 		}
 		*x = field
 	case "PFloat":
 		var field PrimitivePFloat
-		if err := dec.StartValue(vdl.Float64Type); err != nil {
+		switch value, err := dec.ReadValueFloat(64); {
+		case err != nil:
 			return err
-		}
-		var err error
-		if field.Value, err = dec.DecodeFloat(64); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = value
 		}
 		*x = field
 	case "PString":
 		var field PrimitivePString
-		if err := dec.StartValue(vdl.StringType); err != nil {
+		switch value, err := dec.ReadValueString(); {
+		case err != nil:
 			return err
-		}
-		var err error
-		if field.Value, err = dec.DecodeString(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
+		default:
+			field.Value = value
 		}
 		*x = field
 	case "PControl":
 		var field PrimitivePControl
-		if err := field.Value.VDLRead(dec); err != nil {
+		switch value, err := dec.ReadValueString(); {
+		case err != nil:
 			return err
+		default:
+			if err := field.Value.Set(value); err != nil {
+				return err
+			}
 		}
 		*x = field
 	case "":
@@ -606,17 +584,15 @@
 }
 
 func (x *DumpKind) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_enum_3); err != nil {
+	switch value, err := dec.ReadValueString(); {
+	case err != nil:
 		return err
+	default:
+		if err := x.Set(value); err != nil {
+			return err
+		}
 	}
-	enum, err := dec.DecodeString()
-	if err != nil {
-		return err
-	}
-	if err := x.Set(enum); err != nil {
-		return err
-	}
-	return dec.FinishValue()
+	return nil
 }
 
 // DumpAtom describes a single indivisible piece of the vom encoding.  The vom
@@ -719,17 +695,16 @@
 		case "":
 			return dec.FinishValue()
 		case "Kind":
-			if err := x.Kind.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
+			default:
+				if err := x.Kind.Set(value); err != nil {
+					return err
+				}
 			}
 		case "Bytes":
-			if err := dec.StartValue(__VDLType_list_5); err != nil {
-				return err
-			}
-			if err := dec.DecodeBytes(-1, &x.Bytes); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
+			if err := dec.ReadValueBytes(-1, &x.Bytes); err != nil {
 				return err
 			}
 		case "Data":
@@ -737,15 +712,11 @@
 				return err
 			}
 		case "Debug":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Debug, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Debug = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -778,15 +749,13 @@
 }
 
 func (x *Version) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_byte_6); err != nil {
+	switch value, err := dec.ReadValueUint(8); {
+	case err != nil:
 		return err
+	default:
+		*x = Version(value)
 	}
-	tmp, err := dec.DecodeUint(8)
-	if err != nil {
-		return err
-	}
-	*x = Version(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 // TypeId uniquely identifies a type definition within a vom stream.
@@ -812,15 +781,13 @@
 }
 
 func (x *TypeId) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_uint64_7); err != nil {
+	switch value, err := dec.ReadValueUint(64); {
+	case err != nil:
 		return err
+	default:
+		*x = TypeId(value)
 	}
-	tmp, err := dec.DecodeUint(64)
-	if err != nil {
-		return err
-	}
-	*x = TypeId(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 // wireNamed represents a type definition for named primitives.
@@ -884,19 +851,18 @@
 		case "":
 			return dec.FinishValue()
 		case "Name":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Name, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Name = value
 			}
 		case "Base":
-			if err := x.Base.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueUint(64); {
+			case err != nil:
 				return err
+			default:
+				x.Base = TypeId(value)
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -1000,15 +966,11 @@
 		case "":
 			return dec.FinishValue()
 		case "Name":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Name, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Name = value
 			}
 		case "Labels":
 			if err := __VDLReadAnon_list_1(dec, &x.Labels); err != nil {
@@ -1026,31 +988,20 @@
 	if err := dec.StartValue(__VDLType_list_10); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make([]string, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
-		switch done, err := dec.NextEntry(); {
+		switch done, elem, err := dec.NextEntryValueString(); {
 		case err != nil:
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			*x = append(*x, elem)
 		}
-		var elem string
-		if err := dec.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		var err error
-		if elem, err = dec.DecodeString(); err != nil {
-			return err
-		}
-		if err := dec.FinishValue(); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -1130,30 +1081,25 @@
 		case "":
 			return dec.FinishValue()
 		case "Name":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Name, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Name = value
 			}
 		case "Elem":
-			if err := x.Elem.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueUint(64); {
+			case err != nil:
 				return err
+			default:
+				x.Elem = TypeId(value)
 			}
 		case "Len":
-			if err := dec.StartValue(vdl.Uint64Type); err != nil {
+			switch value, err := dec.ReadValueUint(64); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Len, err = dec.DecodeUint(64); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Len = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -1224,19 +1170,18 @@
 		case "":
 			return dec.FinishValue()
 		case "Name":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Name, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Name = value
 			}
 		case "Elem":
-			if err := x.Elem.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueUint(64); {
+			case err != nil:
 				return err
+			default:
+				x.Elem = TypeId(value)
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -1307,19 +1252,18 @@
 		case "":
 			return dec.FinishValue()
 		case "Name":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Name, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Name = value
 			}
 		case "Key":
-			if err := x.Key.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueUint(64); {
+			case err != nil:
 				return err
+			default:
+				x.Key = TypeId(value)
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -1399,23 +1343,25 @@
 		case "":
 			return dec.FinishValue()
 		case "Name":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Name, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Name = value
 			}
 		case "Key":
-			if err := x.Key.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueUint(64); {
+			case err != nil:
 				return err
+			default:
+				x.Key = TypeId(value)
 			}
 		case "Elem":
-			if err := x.Elem.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueUint(64); {
+			case err != nil:
 				return err
+			default:
+				x.Elem = TypeId(value)
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -1486,19 +1432,18 @@
 		case "":
 			return dec.FinishValue()
 		case "Name":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Name, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Name = value
 			}
 		case "Type":
-			if err := x.Type.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueUint(64); {
+			case err != nil:
 				return err
+			default:
+				x.Type = TypeId(value)
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -1596,15 +1541,11 @@
 		case "":
 			return dec.FinishValue()
 		case "Name":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Name, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Name = value
 			}
 		case "Fields":
 			if err := __VDLReadAnon_list_2(dec, &x.Fields); err != nil {
@@ -1622,10 +1563,9 @@
 	if err := dec.StartValue(__VDLType_list_17); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make([]wireField, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -1634,12 +1574,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem wireField
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem wireField
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -1710,15 +1651,11 @@
 		case "":
 			return dec.FinishValue()
 		case "Name":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Name, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Name = value
 			}
 		case "Fields":
 			if err := __VDLReadAnon_list_2(dec, &x.Fields); err != nil {
@@ -1793,19 +1730,18 @@
 		case "":
 			return dec.FinishValue()
 		case "Name":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Name, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Name = value
 			}
 		case "Elem":
-			if err := x.Elem.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueUint(64); {
+			case err != nil:
 				return err
+			default:
+				x.Elem = TypeId(value)
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
diff --git a/vom/vomtest/internal/vomforever/main.go b/vom/vomtest/internal/vomforever/main.go
index 36f93fb..b620e23 100644
--- a/vom/vomtest/internal/vomforever/main.go
+++ b/vom/vomtest/internal/vomforever/main.go
@@ -16,11 +16,11 @@
 	"os/exec"
 	"path"
 	"strings"
-	"v.io/x/lib/textutil"
 
 	"v.io/v23/vdl"
 	"v.io/v23/vdl/vdltest"
 	"v.io/v23/vom"
+	"v.io/x/lib/textutil"
 	"v.io/x/ref/lib/vdl/codegen/vdlgen"
 )
 
@@ -98,9 +98,9 @@
 	fmt.Printf("Testing %v\n", entry.Value)
 	switch mode {
 	case reflect:
-		buildAndRunFromVdlFile(entry.Value, entry.Types, []string{"-skip-gen-old-target", "-skip-gen-write-read"})
+		buildAndRunFromVdlFile(entry.Value, entry.Types, []string{"-skip-go-methods"})
 	case generated:
-		buildAndRunFromVdlFile(entry.Value, entry.Types, []string{"-skip-gen-old-target"})
+		buildAndRunFromVdlFile(entry.Value, entry.Types, nil)
 	case vdlValue:
 		runVdlValue(entry.Value)
 	}
diff --git a/vom/vomtest/vomtest.vdl.go b/vom/vomtest/vomtest.vdl.go
index 7b0b2ef..c37fbb6 100644
--- a/vom/vomtest/vomtest.vdl.go
+++ b/vom/vomtest/vomtest.vdl.go
@@ -137,26 +137,18 @@
 		case "":
 			return dec.FinishValue()
 		case "Label":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Label, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Label = value
 			}
 		case "ValueLabel":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.ValueLabel, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.ValueLabel = value
 			}
 		case "Value":
 			var readAny interface{}
@@ -165,30 +157,25 @@
 			}
 			x.Value = readAny
 		case "Version":
-			if err := x.Version.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueUint(8); {
+			case err != nil:
 				return err
+			default:
+				x.Version = vom.Version(value)
 			}
 		case "HexType":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.HexType, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.HexType = value
 			}
 		case "HexValue":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.HexValue, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.HexValue = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
diff --git a/vom/xdecoder.go b/vom/xdecoder.go
index 0a2de95..c9034ea 100644
--- a/vom/xdecoder.go
+++ b/vom/xdecoder.go
@@ -42,18 +42,33 @@
 type xDecoder struct {
 	old                  *ZDecoder
 	stack                []decoderStackEntry
-	ignoreNextStartValue bool
+	isParentBytes        bool // parent type is []byte or [N]byte
+	ignoreNextStartValue bool // ignore the next start value
 }
 
 type decoderStackEntry struct {
-	Type       *vdl.Type
-	Index      int
-	LenHint    int
-	NumStarted int
-	IsAny      bool
-	IsOptional bool
+	Type          *vdl.Type     // Type of the value that we're decoding.
+	Index         int           // Index of the key, elem or field.
+	LenHint       int           // Length of the value, or -1 for unknown.
+	NextEntryType *vdl.Type     // type for NextEntryValue* methods
+	Flag          decoderFlag   // properties of this stack entry
+	NextEntryData nextEntryData // properties of the next entry
 }
 
+// decoderFlag holds type or value properties of the stack entry.
+type decoderFlag uint
+
+const (
+	decoderFlagIsMapKey   decoderFlag = 0x1 // key or elem for dfsNextType
+	decoderFlagIsAny      decoderFlag = 0x2 // the static type is Any
+	decoderFlagIsOptional decoderFlag = 0x4 // the static type is Optional
+)
+
+func (f decoderFlag) FlipIsMapKey() decoderFlag { return f ^ decoderFlagIsMapKey }
+func (f decoderFlag) IsMapKey() bool            { return f&decoderFlagIsMapKey != 0 }
+func (f decoderFlag) IsAny() bool               { return f&decoderFlagIsAny != 0 }
+func (f decoderFlag) IsOptional() bool          { return f&decoderFlagIsOptional != 0 }
+
 // NewDecoder returns a new Decoder that reads from the given reader.  The
 // Decoder understands all formats generated by the Encoder.
 func NewDecoder(r io.Reader) *Decoder {
@@ -172,19 +187,28 @@
 	if err != nil {
 		return err
 	}
-	return d.setupValue(tt, want)
+	tt, lenHint, flag, err := d.setupType(tt, want)
+	if err != nil {
+		return err
+	}
+	d.stack = append(d.stack, decoderStackEntry{
+		Type:    tt,
+		Index:   -1,
+		LenHint: lenHint,
+		Flag:    flag,
+	})
+	return nil
 }
 
-func (d *xDecoder) setupValue(tt, want *vdl.Type) error {
+func (d *xDecoder) setupType(tt, want *vdl.Type) (_ *vdl.Type, lenHint int, flag decoderFlag, _ error) {
 	// Handle any, which may be nil.  We "dereference" non-nil any to the inner
 	// type.  If that happens to be an optional, it's handled below.
-	isAny := false
 	if tt.Kind() == vdl.Any {
-		isAny = true
+		flag |= decoderFlagIsAny
 		var err error
 		switch tt, _, err = d.old.readAnyHeader(); {
 		case err != nil:
-			return err
+			return nil, 0, 0, err
 		case tt == nil:
 			tt = vdl.AnyType // nil any
 		}
@@ -192,15 +216,14 @@
 	// Handle optional, which may be nil.  Similar to any, we "dereference"
 	// non-nil optional to the inner type, which is never allowed to be another
 	// optional or any type.
-	isOptional := false
 	if tt.Kind() == vdl.Optional {
-		isOptional = true
+		flag |= decoderFlagIsOptional
 		// Read the WireCtrlNil code, but if it's not WireCtrlNil we need to keep
 		// the buffer as-is, since it's the first byte of the value, which may
 		// itself be another control code.
 		switch ctrl, err := binaryPeekControl(d.old.buf); {
 		case err != nil:
-			return err
+			return nil, 0, 0, err
 		case ctrl == WireCtrlNil:
 			d.old.buf.Skip(1) // nil optional
 		default:
@@ -212,47 +235,47 @@
 	// this check for top-level decoded values, and subsequently for decoded any
 	// values.  We skip checking non-composite want types, since those will be
 	// naturally caught by the Decode* calls anyways.
-	if len(d.stack) == 0 || isAny {
+	if want != nil && (len(d.stack) == 0 || flag.IsAny()) {
 		switch want.Kind() {
 		case vdl.Optional, vdl.Array, vdl.List, vdl.Set, vdl.Map, vdl.Struct, vdl.Union:
 			if !vdl.Compatible2(tt, want) {
-				return fmt.Errorf("vom: incompatible decode from %v into %v", tt, want)
+				return nil, 0, 0, errIncompatibleDecode(tt, want)
 			}
 		}
 	}
 	// Initialize LenHint for composite types.
-	entry := decoderStackEntry{
-		Type:       tt,
-		Index:      -1,
-		LenHint:    -1,
-		IsAny:      isAny,
-		IsOptional: isOptional,
-	}
 	switch tt.Kind() {
 	case vdl.Array, vdl.List, vdl.Set, vdl.Map:
 		// TODO(toddw): Handle sentry-terminated collections without a length hint.
 		len, err := binaryDecodeLenOrArrayLen(d.old.buf, tt)
 		if err != nil {
-			return err
+			return nil, 0, 0, err
 		}
-		entry.LenHint = len
+		lenHint = len
 	case vdl.Union:
 		// Union shouldn't have a LenHint, but we abuse it in NextField as a
 		// convenience for detecting when fields are done, so we initialize it here.
 		// It has to be at least 1, since 0 will cause NextField to think that the
 		// union field has already been decoded.
-		entry.LenHint = 1
+		lenHint = 1
 	case vdl.Struct:
 		// Struct shouldn't have a LenHint, but we abuse it in NextField as a
 		// convenience for detecting when fields are done, so we initialize it here.
-		entry.LenHint = tt.NumField()
+		lenHint = tt.NumField()
+	default:
+		lenHint = -1
 	}
-	// Finally push the entry onto our stack.
-	d.stack = append(d.stack, entry)
-	return nil
+	top := d.top()
+	d.isParentBytes = top != nil && top.Type.IsBytes()
+	return tt, lenHint, flag, nil
+}
+
+func errIncompatibleDecode(tt *vdl.Type, want interface{}) error {
+	return fmt.Errorf("vom: incompatible decode from %v into %v", tt, want)
 }
 
 func (d *xDecoder) FinishValue() error {
+	d.isParentBytes = false
 	d.ignoreNextStartValue = false
 	stackTop := len(d.stack) - 1
 	if stackTop == -1 {
@@ -288,16 +311,6 @@
 		}
 		return d.old.typeDec.lookupType(tid)
 	}
-	// Check invariants now, right before we actually walk to the next type, and
-	// before we've incremented NumStarted.
-	//
-	// TODO(toddw): In theory we could check the invariants in more places
-	// (e.g. in NextEntry and NextField after incrementing Index), but that may
-	// get expensive.
-	if err := d.checkInvariants(top); err != nil {
-		return nil, err
-	}
-	top.NumStarted++
 	// Return the next type from our composite types.
 	switch top.Type.Kind() {
 	case vdl.Array, vdl.List:
@@ -305,8 +318,8 @@
 	case vdl.Set:
 		return top.Type.Key(), nil
 	case vdl.Map:
-		// NumStarted is already incremented by the time we check it.
-		if top.NumStarted%2 == 1 {
+		top.Flag = top.Flag.FlipIsMapKey()
+		if top.Flag.IsMapKey() {
 			return top.Type.Key(), nil
 		} else {
 			return top.Type.Elem(), nil
@@ -317,34 +330,6 @@
 	return nil, fmt.Errorf("vom: can't StartValue on %v", top.Type)
 }
 
-func (d *xDecoder) checkInvariants(top *decoderStackEntry) error {
-	switch top.Type.Kind() {
-	case vdl.Array, vdl.List, vdl.Set, vdl.Map, vdl.Union, vdl.Struct:
-		if top.Index < 0 || (top.Index >= top.LenHint && top.LenHint >= 0) {
-			return fmt.Errorf("vom: invalid DFS walk, bad index, check NextEntry, NextField and FinishValue, stack %+v", d.stack)
-		}
-	default:
-		if top.Index != -1 || top.LenHint != -1 {
-			return fmt.Errorf("vom: invalid DFS walk, internal error, stack %+v", d.stack)
-		}
-	}
-	var bad bool
-	switch top.Type.Kind() {
-	case vdl.Array, vdl.List, vdl.Set:
-		bad = top.NumStarted != top.Index
-	case vdl.Map:
-		bad = top.NumStarted/2 != top.Index
-	case vdl.Union:
-		bad = top.NumStarted != 0
-	case vdl.Struct:
-		bad = top.NumStarted >= top.Type.NumField()
-	}
-	if bad {
-		return fmt.Errorf("vom: invalid DFS walk, mismatched NextEntry, NextField and StartValue, stack %+v", d.stack)
-	}
-	return nil
-}
-
 func (d *xDecoder) NextEntry() (bool, error) {
 	// Our strategy is to increment top.Index until it reaches top.LenHint.
 	// Currently the LenHint is always set, so it's stronger than a hint.
@@ -434,14 +419,14 @@
 
 func (d *xDecoder) IsAny() bool {
 	if top := d.top(); top != nil {
-		return top.IsAny
+		return top.Flag.IsAny()
 	}
 	return false
 }
 
 func (d *xDecoder) IsOptional() bool {
 	if top := d.top(); top != nil {
-		return top.IsOptional
+		return top.Flag.IsOptional()
 	}
 	return false
 }
@@ -481,7 +466,32 @@
 	if tt.Kind() == vdl.Bool {
 		return binaryDecodeBool(d.old.buf)
 	}
-	return false, fmt.Errorf("vom: incompatible decode from %v into bool", tt)
+	return false, errIncompatibleDecode(tt, "bool")
+}
+
+func (d *xDecoder) DecodeString() (string, error) {
+	tt := d.Type()
+	if tt == nil {
+		return "", errEmptyDecoderStack
+	}
+	switch tt.Kind() {
+	case vdl.String:
+		return binaryDecodeString(d.old.buf)
+	case vdl.Enum:
+		return d.binaryDecodeEnum(tt)
+	}
+	return "", errIncompatibleDecode(tt, "string")
+}
+
+func (d *xDecoder) binaryDecodeEnum(tt *vdl.Type) (string, error) {
+	index, err := binaryDecodeUint(d.old.buf)
+	switch {
+	case err != nil:
+		return "", err
+	case index >= uint64(tt.NumEnumLabel()):
+		return "", fmt.Errorf("vom: enum index %d out of range, %v", index, tt)
+	}
+	return tt.EnumLabel(int(index)), nil
 }
 
 func (d *xDecoder) binaryDecodeByte() (byte, error) {
@@ -490,21 +500,23 @@
 	// byte contained in a list or array is written out as one byte.  E.g.
 	//   byte(0x81)         -> 0xFF81   : single byte with variable-size
 	//   []byte("\x81\x82") -> 0x028182 : each elem byte encoded as one byte
-	if stackTop2 := len(d.stack) - 2; stackTop2 >= 0 {
-		if top2 := d.stack[stackTop2]; top2.Type.IsBytes() {
-			return d.old.buf.ReadByte()
-		}
+	if d.isParentBytes {
+		return d.old.buf.ReadByte()
 	}
 	x, err := binaryDecodeUint(d.old.buf)
 	return byte(x), err
 }
 
 func (d *xDecoder) DecodeUint(bitlen int) (uint64, error) {
-	const errFmt = "vom: conversion from %v into uint%d loses precision: %v"
-	tt, ubitlen := d.Type(), uint(bitlen)
+	tt := d.Type()
 	if tt == nil {
 		return 0, errEmptyDecoderStack
 	}
+	return d.decodeUint(tt, uint(bitlen))
+}
+
+func (d *xDecoder) decodeUint(tt *vdl.Type, ubitlen uint) (uint64, error) {
+	const errFmt = "vom: conversion from %v into uint%d loses precision: %v"
 	switch tt.Kind() {
 	case vdl.Byte:
 		x, err := d.binaryDecodeByte()
@@ -518,7 +530,7 @@
 			return 0, err
 		}
 		if shift := 64 - ubitlen; x != (x<<shift)>>shift {
-			return 0, fmt.Errorf(errFmt, tt, bitlen, x)
+			return 0, fmt.Errorf(errFmt, tt, ubitlen, x)
 		}
 		return x, nil
 	case vdl.Int8, vdl.Int16, vdl.Int32, vdl.Int64:
@@ -528,7 +540,7 @@
 		}
 		ux := uint64(x)
 		if shift := 64 - ubitlen; x < 0 || ux != (ux<<shift)>>shift {
-			return 0, fmt.Errorf(errFmt, tt, bitlen, x)
+			return 0, fmt.Errorf(errFmt, tt, ubitlen, x)
 		}
 		return ux, nil
 	case vdl.Float32, vdl.Float64:
@@ -538,19 +550,23 @@
 		}
 		ux := uint64(x)
 		if shift := 64 - ubitlen; x != float64(ux) || ux != (ux<<shift)>>shift {
-			return 0, fmt.Errorf(errFmt, tt, bitlen, x)
+			return 0, fmt.Errorf(errFmt, tt, ubitlen, x)
 		}
 		return ux, nil
 	}
-	return 0, fmt.Errorf("vom: incompatible decode from %v into uint%d", tt, bitlen)
+	return 0, errIncompatibleDecode(tt, fmt.Sprintf("uint%d", ubitlen))
 }
 
 func (d *xDecoder) DecodeInt(bitlen int) (int64, error) {
-	const errFmt = "vom: conversion from %v into int%d loses precision: %v"
-	tt, ubitlen := d.Type(), uint(bitlen)
+	tt := d.Type()
 	if tt == nil {
 		return 0, errEmptyDecoderStack
 	}
+	return d.decodeInt(tt, uint(bitlen))
+}
+
+func (d *xDecoder) decodeInt(tt *vdl.Type, ubitlen uint) (int64, error) {
+	const errFmt = "vom: conversion from %v into int%d loses precision: %v"
 	switch tt.Kind() {
 	case vdl.Byte:
 		x, err := d.binaryDecodeByte()
@@ -559,8 +575,8 @@
 		}
 		// The only case that fails is if we're converting byte(x) to int8, and x
 		// uses more than 7 bits (i.e. is greater than 127).
-		if bitlen <= 8 && x > 0x7f {
-			return 0, fmt.Errorf(errFmt, tt, bitlen, x)
+		if ubitlen <= 8 && x > 0x7f {
+			return 0, fmt.Errorf(errFmt, tt, ubitlen, x)
 		}
 		return int64(x), nil
 	case vdl.Uint16, vdl.Uint32, vdl.Uint64:
@@ -572,7 +588,7 @@
 		// The shift uses 65 since the topmost bit is the sign bit.  I.e. 32 bit
 		// numbers should be shifted by 33 rather than 32.
 		if shift := 65 - ubitlen; ix < 0 || x != (x<<shift)>>shift {
-			return 0, fmt.Errorf(errFmt, tt, bitlen, x)
+			return 0, fmt.Errorf(errFmt, tt, ubitlen, x)
 		}
 		return ix, nil
 	case vdl.Int8, vdl.Int16, vdl.Int32, vdl.Int64:
@@ -581,7 +597,7 @@
 			return 0, err
 		}
 		if shift := 64 - ubitlen; x != (x<<shift)>>shift {
-			return 0, fmt.Errorf(errFmt, tt, bitlen, x)
+			return 0, fmt.Errorf(errFmt, tt, ubitlen, x)
 		}
 		return x, nil
 	case vdl.Float32, vdl.Float64:
@@ -591,19 +607,23 @@
 		}
 		ix := int64(x)
 		if shift := 64 - ubitlen; x != float64(ix) || ix != (ix<<shift)>>shift {
-			return 0, fmt.Errorf(errFmt, tt, bitlen, x)
+			return 0, fmt.Errorf(errFmt, tt, ubitlen, x)
 		}
 		return ix, nil
 	}
-	return 0, fmt.Errorf("vom: incompatible decode from %v into int%d", tt, bitlen)
+	return 0, errIncompatibleDecode(tt, fmt.Sprintf("int%d", ubitlen))
 }
 
 func (d *xDecoder) DecodeFloat(bitlen int) (float64, error) {
-	const errFmt = "vom: conversion from %v into float%d loses precision: %v"
 	tt := d.Type()
 	if tt == nil {
 		return 0, errEmptyDecoderStack
 	}
+	return d.decodeFloat(tt, uint(bitlen))
+}
+
+func (d *xDecoder) decodeFloat(tt *vdl.Type, ubitlen uint) (float64, error) {
+	const errFmt = "vom: conversion from %v into float%d loses precision: %v"
 	switch tt.Kind() {
 	case vdl.Byte:
 		x, err := d.binaryDecodeByte()
@@ -617,13 +637,13 @@
 			return 0, err
 		}
 		var max uint64
-		if bitlen > 32 {
+		if ubitlen > 32 {
 			max = float64MaxInt
 		} else {
 			max = float32MaxInt
 		}
 		if x > max {
-			return 0, fmt.Errorf(errFmt, tt, bitlen, x)
+			return 0, fmt.Errorf(errFmt, tt, ubitlen, x)
 		}
 		return float64(x), nil
 	case vdl.Int8, vdl.Int16, vdl.Int32, vdl.Int64:
@@ -632,13 +652,13 @@
 			return 0, err
 		}
 		var min, max int64
-		if bitlen > 32 {
+		if ubitlen > 32 {
 			min, max = float64MinInt, float64MaxInt
 		} else {
 			min, max = float32MinInt, float32MaxInt
 		}
 		if x < min || x > max {
-			return 0, fmt.Errorf(errFmt, tt, bitlen, x)
+			return 0, fmt.Errorf(errFmt, tt, ubitlen, x)
 		}
 		return float64(x), nil
 	case vdl.Float32, vdl.Float64:
@@ -646,57 +666,44 @@
 		if err != nil {
 			return 0, err
 		}
-		if bitlen <= 32 && (x < -math.MaxFloat32 || x > math.MaxFloat32) {
-			return 0, fmt.Errorf(errFmt, tt, bitlen, x)
+		if ubitlen <= 32 && (x < -math.MaxFloat32 || x > math.MaxFloat32) {
+			return 0, fmt.Errorf(errFmt, tt, ubitlen, x)
 		}
 		return x, nil
 	}
-	return 0, fmt.Errorf("vom: incompatible decode from %v into float%d", tt, bitlen)
+	return 0, errIncompatibleDecode(tt, fmt.Sprintf("float%d", ubitlen))
 }
 
-func (d *xDecoder) DecodeBytes(fixedlen int, v *[]byte) error {
+func (d *xDecoder) DecodeBytes(fixedLen int, v *[]byte) error {
 	top := d.top()
 	if top == nil {
 		return errEmptyDecoderStack
 	}
 	tt := top.Type
 	if !tt.IsBytes() {
-		return vdl.DecodeConvertedBytes(d, fixedlen, v)
+		return vdl.DecodeConvertedBytes(d, fixedLen, v)
 	}
-	len := top.LenHint
-	switch {
-	case len == -1:
-		return fmt.Errorf("vom: %v LenHint is currently required", tt)
-	case fixedlen >= 0 && fixedlen != len:
-		return fmt.Errorf("vom: %v got %d bytes, want fixed len %d", tt, len, fixedlen)
-	}
-	if cap(*v) >= len {
-		*v = (*v)[:len]
-	} else {
-		*v = make([]byte, len)
-	}
-	return d.old.buf.ReadIntoBuf(*v)
+	return d.decodeBytes(tt, top.LenHint, fixedLen, v)
 }
 
-func (d *xDecoder) DecodeString() (string, error) {
-	tt := d.Type()
-	if tt == nil {
-		return "", errEmptyDecoderStack
+func (d *xDecoder) decodeBytes(tt *vdl.Type, lenHint, fixedLen int, v *[]byte) error {
+	switch {
+	case lenHint == -1:
+		return fmt.Errorf("vom: LenHint is currently required, %v", tt)
+	case fixedLen >= 0 && fixedLen != lenHint:
+		return fmt.Errorf("vom: got %d bytes, want fixed len %d, %v", lenHint, fixedLen, tt)
+	case lenHint == 0:
+		*v = nil
+		return nil
+	case fixedLen >= 0:
+		// Only re-use the existing buffer if we're filling in an array.  This
+		// sacrifices some performance, but also avoids bugs when repeatedly
+		// decoding into the same value.
+		*v = (*v)[:lenHint]
+	default:
+		*v = make([]byte, lenHint)
 	}
-	switch tt.Kind() {
-	case vdl.String:
-		return binaryDecodeString(d.old.buf)
-	case vdl.Enum:
-		index, err := binaryDecodeUint(d.old.buf)
-		switch {
-		case err != nil:
-			return "", err
-		case index >= uint64(tt.NumEnumLabel()):
-			return "", fmt.Errorf("vom: %v enum index %d out of range", tt, index)
-		}
-		return tt.EnumLabel(int(index)), nil
-	}
-	return "", fmt.Errorf("vom: incompatible decode from %v into string", tt)
+	return d.old.buf.ReadIntoBuf(*v)
 }
 
 func (d *xDecoder) DecodeTypeObject() (*vdl.Type, error) {
@@ -704,19 +711,22 @@
 	if tt == nil {
 		return nil, errEmptyDecoderStack
 	}
-	switch tt.Kind() {
-	case vdl.TypeObject:
-		typeIndex, err := binaryDecodeUint(d.old.buf)
-		if err != nil {
-			return nil, err
-		}
-		tid, err := d.old.refTypes.ReferencedTypeId(typeIndex)
-		if err != nil {
-			return nil, err
-		}
-		return d.old.typeDec.lookupType(tid)
+	if tt != vdl.TypeObjectType {
+		return nil, errIncompatibleDecode(tt, "typeobject")
 	}
-	return nil, fmt.Errorf("vom: incompatible decode from %v into typeobject", tt)
+	return d.binaryDecodeType()
+}
+
+func (d *xDecoder) binaryDecodeType() (*vdl.Type, error) {
+	typeIndex, err := binaryDecodeUint(d.old.buf)
+	if err != nil {
+		return nil, err
+	}
+	tid, err := d.old.refTypes.ReferencedTypeId(typeIndex)
+	if err != nil {
+		return nil, err
+	}
+	return d.old.typeDec.lookupType(tid)
 }
 
 func (d *xDecoder) SkipValue() error {
diff --git a/vom/xdecoder_fast_next.go b/vom/xdecoder_fast_next.go
new file mode 100644
index 0000000..be66870
--- /dev/null
+++ b/vom/xdecoder_fast_next.go
@@ -0,0 +1,357 @@
+// Copyright 2016 The Vanadium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package vom
+
+import (
+	"strconv"
+
+	"v.io/v23/vdl"
+)
+
+// This file contains the NextEntryValue* methods.  The semantics of these
+// methods is the same as if NextEntry, StartValue, Decode*, FinishValue were
+// called in sequence.  The implementation is faster than actually calling that
+// sequence, because we minimize the work done in the inner loop.
+//
+// Here's what the regular sequence of calls looks like, without error handling:
+//   for {
+//     done, _ := dec.NextEntry()    // Increments index
+//     if done {
+//       return nil
+//     }
+//     dec.StartValue()              // Pushes type onto stack
+//     value, _ := dec.DecodeBool()  // Decodes the value
+//     dec.FinishValue()             // Pops type off of stack
+//   }
+//
+// Here's what the NextEntryValue call looks like:
+//   for {
+//     done, value, _ := dec.NextEntryValueBool()
+//     if done {
+//       return nil
+//     }
+//   }
+//
+// So far, we've reduced the 4 calls through the Decoder interface into 1 call,
+// but if we just implemented exactly the same logic it wouldn't be much faster.
+// The real speedup comes because in the common case, the type of the entry is
+// static (i.e. not Any), so we can skip pushing and popping the stack, and also
+// skip checking compatibility.  Instead we only perform this once, the first
+// time through the loop, and each subsequent call has a fastpath.
+//
+// Each method as the same pattern:
+//
+// NextEntry:
+//   Increments the index, and check if we're done.
+// Check fastpath:
+//   The NextEntryType field on the containing collection tells us whether the
+//   fastpath has been enabled.  E.g. if []int32 is at the top of the stack, its
+//   NextEntryType field will be Int32Type.  We initialize this on the first
+//   call, by running the equivalent of StartValue and checking compatibility.
+//   There's no need to push the stack, since we have the NextEntryType field to
+//   remind us that all this work has been done.  We can't use the fastpath for
+//   Any types, since we'll always need to decode the Any header and check
+//   compatibility
+// Decode:
+//   We implement common-case fastpaths; e.g. avoiding unnecessary conversions.
+
+type nextEntryData int
+
+const (
+	// We store extra information about the next type in the decoder flags, so we
+	// don't need to recompute it for each entry.
+	//
+	// For number types, bits [8,15] store the bitlen, and we have two special
+	// sentry flags.  The sentries must be > any valid bitlen.
+	nextEntryMustConvert nextEntryData = 0x0100 // must convert value
+	nextEntryParentBytes nextEntryData = 0x0200 // parent is []byte
+
+	// TODO(toddw): VDL currently doesn't support Optional scalars, but if we were
+	// to add this support, we'd need to set an extra bit in nextEntryData to
+	// remind us to decode the Optional header.
+)
+
+func (d *xDecoder) NextEntryValueBool() (done bool, value bool, err error) {
+	// NextEntry
+	top := d.top()
+	if top == nil {
+		return false, false, errEmptyDecoderStack
+	}
+	top.Index++
+	if top.Index == top.LenHint {
+		return true, false, nil
+	}
+	// Check fastpath
+	if top.NextEntryType != nil {
+		if top.Type.Kind() == vdl.Map {
+			top.Flag = top.Flag.FlipIsMapKey()
+		}
+	} else {
+		// StartValue
+		var ttNext *vdl.Type
+		if ttNext, err = d.dfsNextType(); err != nil {
+			return false, false, err
+		}
+		var flag decoderFlag
+		if ttNext, _, flag, err = d.setupType(ttNext, nil); err != nil {
+			return false, false, err
+		}
+		if !flag.IsAny() { // can't enable fastpath for Any types.
+			top.NextEntryType = ttNext
+		}
+		// Check compatibility
+		switch ttNext.Kind() {
+		case vdl.Bool:
+		default:
+			return false, false, errIncompatibleDecode(ttNext, "bool")
+		}
+	}
+	// Decode
+	value, err = binaryDecodeBool(d.old.buf)
+	return false, value, err
+}
+
+func (d *xDecoder) NextEntryValueString() (done bool, value string, err error) {
+	// NextEntry
+	top := d.top()
+	if top == nil {
+		return false, "", errEmptyDecoderStack
+	}
+	top.Index++
+	if top.Index == top.LenHint {
+		return true, "", nil
+	}
+	// Check fastpath
+	var ttNext *vdl.Type
+	if top.NextEntryType != nil {
+		ttNext = top.NextEntryType
+		if top.Type.Kind() == vdl.Map {
+			top.Flag = top.Flag.FlipIsMapKey()
+		}
+	} else {
+		// StartValue
+		if ttNext, err = d.dfsNextType(); err != nil {
+			return false, "", err
+		}
+		var flag decoderFlag
+		if ttNext, _, flag, err = d.setupType(ttNext, nil); err != nil {
+			return false, "", err
+		}
+		if !flag.IsAny() { // can't enable fastpath for Any types.
+			top.NextEntryType = ttNext
+		}
+		// Check compatibility
+		switch ttNext.Kind() {
+		case vdl.String, vdl.Enum:
+		default:
+			return false, "", errIncompatibleDecode(ttNext, "string")
+		}
+	}
+	// Decode
+	switch ttNext.Kind() {
+	case vdl.String:
+		value, err = binaryDecodeString(d.old.buf)
+	case vdl.Enum:
+		value, err = d.binaryDecodeEnum(ttNext)
+	}
+	return false, value, err
+}
+
+func (d *xDecoder) NextEntryValueUint(bitlen int) (done bool, value uint64, err error) {
+	// NextEntry
+	top := d.top()
+	if top == nil {
+		return false, 0, errEmptyDecoderStack
+	}
+	top.Index++
+	if top.Index == top.LenHint {
+		return true, 0, nil
+	}
+	// Check fastpath
+	var ttNext *vdl.Type
+	if top.NextEntryType != nil {
+		ttNext = top.NextEntryType
+		if top.Type.Kind() == vdl.Map {
+			top.Flag = top.Flag.FlipIsMapKey()
+		}
+	} else {
+		// StartValue
+		if ttNext, err = d.dfsNextType(); err != nil {
+			return false, 0, err
+		}
+		var flag decoderFlag
+		if ttNext, _, flag, err = d.setupType(ttNext, nil); err != nil {
+			return false, 0, err
+		}
+		if !flag.IsAny() { // can't enable fastpath for Any types.
+			top.NextEntryType = ttNext
+		}
+		// Check compatibility, and set NextEntryData.
+		switch ttNext.Kind() {
+		case vdl.Uint16, vdl.Uint32, vdl.Uint64:
+			top.NextEntryData = nextEntryData(ttNext.Kind().BitLen())
+		case vdl.Int8, vdl.Int16, vdl.Int32, vdl.Int64, vdl.Float32, vdl.Float64:
+			top.NextEntryData = nextEntryMustConvert
+		case vdl.Byte:
+			if d.isParentBytes {
+				top.NextEntryData = nextEntryParentBytes
+			} else {
+				top.NextEntryData = 8 // byte is 8 bits
+			}
+		default:
+			return false, 0, errIncompatibleDecode(ttNext, "uint"+strconv.Itoa(bitlen))
+		}
+	}
+	// Decode, avoiding unnecessary number conversions.
+	switch flag := top.NextEntryData; {
+	case flag <= nextEntryData(bitlen):
+		value, err = binaryDecodeUint(d.old.buf)
+	case flag == nextEntryParentBytes:
+		var b byte
+		b, err = d.old.buf.ReadByte()
+		value = uint64(b)
+	default: // must convert
+		value, err = d.decodeUint(ttNext, uint(bitlen))
+	}
+	return false, value, err
+}
+
+func (d *xDecoder) NextEntryValueInt(bitlen int) (done bool, value int64, err error) {
+	// NextEntry
+	top := d.top()
+	if top == nil {
+		return false, 0, errEmptyDecoderStack
+	}
+	top.Index++
+	if top.Index == top.LenHint {
+		return true, 0, nil
+	}
+	// Check fastpath
+	var ttNext *vdl.Type
+	if top.NextEntryType != nil {
+		ttNext = top.NextEntryType
+		if top.Type.Kind() == vdl.Map {
+			top.Flag = top.Flag.FlipIsMapKey()
+		}
+	} else {
+		// StartValue
+		if ttNext, err = d.dfsNextType(); err != nil {
+			return false, 0, err
+		}
+		var flag decoderFlag
+		if ttNext, _, flag, err = d.setupType(ttNext, nil); err != nil {
+			return false, 0, err
+		}
+		if !flag.IsAny() { // can't enable fastpath for Any types.
+			top.NextEntryType = ttNext
+		}
+		// Check compatibility, and set NextEntryData.
+		switch ttNext.Kind() {
+		case vdl.Int8, vdl.Int16, vdl.Int32, vdl.Int64:
+			top.NextEntryData = nextEntryData(ttNext.Kind().BitLen())
+		case vdl.Byte, vdl.Uint16, vdl.Uint32, vdl.Uint64, vdl.Float32, vdl.Float64:
+			top.NextEntryData = nextEntryMustConvert
+		default:
+			return false, 0, errIncompatibleDecode(ttNext, "int"+strconv.Itoa(bitlen))
+		}
+	}
+	// Decode, avoiding unnecessary number conversions.
+	switch flag := top.NextEntryData; {
+	case flag <= nextEntryData(bitlen):
+		value, err = binaryDecodeInt(d.old.buf)
+	default: // must convert
+		value, err = d.decodeInt(ttNext, uint(bitlen))
+	}
+	return false, value, err
+}
+
+func (d *xDecoder) NextEntryValueFloat(bitlen int) (done bool, value float64, err error) {
+	// NextEntry
+	top := d.top()
+	if top == nil {
+		return false, 0, errEmptyDecoderStack
+	}
+	top.Index++
+	if top.Index == top.LenHint {
+		return true, 0, nil
+	}
+	// Check fastpath
+	var ttNext *vdl.Type
+	if top.NextEntryType != nil {
+		ttNext = top.NextEntryType
+		if top.Type.Kind() == vdl.Map {
+			top.Flag = top.Flag.FlipIsMapKey()
+		}
+	} else {
+		// StartValue
+		if ttNext, err = d.dfsNextType(); err != nil {
+			return false, 0, err
+		}
+		var flag decoderFlag
+		if ttNext, _, flag, err = d.setupType(ttNext, nil); err != nil {
+			return false, 0, err
+		}
+		if !flag.IsAny() { // can't enable fastpath for Any types.
+			top.NextEntryType = ttNext
+		}
+		// Check compatibility, and set NextEntryData.
+		switch ttNext.Kind() {
+		case vdl.Float32, vdl.Float64:
+			top.NextEntryData = nextEntryData(ttNext.Kind().BitLen())
+		case vdl.Byte, vdl.Uint16, vdl.Uint32, vdl.Uint64, vdl.Int8, vdl.Int16, vdl.Int32, vdl.Int64:
+			top.NextEntryData = nextEntryMustConvert
+		default:
+			return false, 0, errIncompatibleDecode(ttNext, "float"+strconv.Itoa(bitlen))
+		}
+	}
+	// Decode, avoiding unnecessary number conversions.
+	switch flag := top.NextEntryData; {
+	case flag <= nextEntryData(bitlen):
+		value, err = binaryDecodeFloat(d.old.buf)
+	default: // must convert
+		value, err = d.decodeFloat(ttNext, uint(bitlen))
+	}
+	return false, value, err
+}
+
+func (d *xDecoder) NextEntryValueTypeObject() (done bool, value *vdl.Type, err error) {
+	// NextEntry
+	top := d.top()
+	if top == nil {
+		return false, nil, errEmptyDecoderStack
+	}
+	top.Index++
+	if top.Index == top.LenHint {
+		return true, nil, nil
+	}
+	// Check fastpath
+	if top.NextEntryType != nil {
+		if top.Type.Kind() == vdl.Map {
+			top.Flag = top.Flag.FlipIsMapKey()
+		}
+	} else {
+		// StartValue
+		var ttNext *vdl.Type
+		if ttNext, err = d.dfsNextType(); err != nil {
+			return false, nil, err
+		}
+		var flag decoderFlag
+		if ttNext, _, flag, err = d.setupType(ttNext, nil); err != nil {
+			return false, nil, err
+		}
+		if !flag.IsAny() { // can't enable fastpath for Any types.
+			top.NextEntryType = ttNext
+		}
+		// Check compatibility
+		switch ttNext.Kind() {
+		case vdl.TypeObject:
+		default:
+			return false, nil, errIncompatibleDecode(ttNext, "typeobject")
+		}
+	}
+	// Decode
+	value, err = d.binaryDecodeType()
+	return false, value, err
+}
diff --git a/vom/xdecoder_fast_read.go b/vom/xdecoder_fast_read.go
new file mode 100644
index 0000000..9e0f508
--- /dev/null
+++ b/vom/xdecoder_fast_read.go
@@ -0,0 +1,340 @@
+// Copyright 2016 The Vanadium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package vom
+
+import (
+	"strconv"
+
+	"v.io/v23/vdl"
+)
+
+// This file contains the ReadValue* methods.  The semantics of these methods is
+// the same as if StartValue, Decode*, FinishValue were called in sequence.  The
+// implementation is faster than actually calling that sequence, because we can
+// avoid pushing and popping the decoder stack and also avoid unnecessary
+// compatibility checks.  We also get a minor improvement by avoiding extra
+// method calls indirected through the Decoder interface.
+//
+// Each method has the same pattern:
+//
+// StartValue:
+//   If d.ignoreNextStarValue is set, the type is already on the stack.
+//   Otherwise setup the type to process Any and Optional headers.  We pass nil
+//   to d.setupType to avoid the compatibility check, since the decode step will
+//   naturally let us perform that check.
+// Decode:
+//   We implement common-case fastpaths; e.g. avoiding unnecessary conversions.
+// FinishValue:
+//   Mirrors StartValue, only pop the stack if necessary.
+
+func (d *xDecoder) ReadValueBool() (value bool, err error) {
+	// StartValue
+	var tt *vdl.Type
+	if d.ignoreNextStartValue {
+		tt = d.stack[len(d.stack)-1].Type
+	} else {
+		if tt, err = d.dfsNextType(); err != nil {
+			return false, err
+		}
+		if tt, _, _, err = d.setupType(tt, nil); err != nil {
+			return false, err
+		}
+	}
+	// Decode
+	switch tt.Kind() {
+	case vdl.Bool:
+		value, err = binaryDecodeBool(d.old.buf)
+	default:
+		return false, errIncompatibleDecode(tt, "bool")
+	}
+	// FinishValue
+	if d.ignoreNextStartValue {
+		if err := d.FinishValue(); err != nil {
+			return false, err
+		}
+	} else {
+		d.isParentBytes = false
+		d.ignoreNextStartValue = false
+		if len(d.stack) == 0 {
+			if err := d.old.endMessage(); err != nil {
+				return false, err
+			}
+		}
+	}
+	return value, err
+}
+
+func (d *xDecoder) ReadValueString() (value string, err error) {
+	// StartValue
+	var tt *vdl.Type
+	if d.ignoreNextStartValue {
+		tt = d.stack[len(d.stack)-1].Type
+	} else {
+		if tt, err = d.dfsNextType(); err != nil {
+			return "", err
+		}
+		if tt, _, _, err = d.setupType(tt, nil); err != nil {
+			return "", err
+		}
+	}
+	// Decode
+	switch tt.Kind() {
+	case vdl.String:
+		value, err = binaryDecodeString(d.old.buf)
+	case vdl.Enum:
+		value, err = d.binaryDecodeEnum(tt)
+	default:
+		return "", errIncompatibleDecode(tt, "string")
+	}
+	// FinishValue
+	if d.ignoreNextStartValue {
+		if err := d.FinishValue(); err != nil {
+			return "", err
+		}
+	} else {
+		d.isParentBytes = false
+		d.ignoreNextStartValue = false
+		if len(d.stack) == 0 {
+			if err := d.old.endMessage(); err != nil {
+				return "", err
+			}
+		}
+	}
+	return value, err
+}
+
+func (d *xDecoder) ReadValueUint(bitlen int) (value uint64, err error) {
+	// StartValue
+	var tt *vdl.Type
+	if d.ignoreNextStartValue {
+		tt = d.stack[len(d.stack)-1].Type
+	} else {
+		if tt, err = d.dfsNextType(); err != nil {
+			return 0, err
+		}
+		if tt, _, _, err = d.setupType(tt, nil); err != nil {
+			return 0, err
+		}
+	}
+	// Decode, avoiding unnecessary number conversions.
+	switch kind := tt.Kind(); kind {
+	case vdl.Uint16, vdl.Uint32, vdl.Uint64:
+		if kind.BitLen() <= bitlen {
+			value, err = binaryDecodeUint(d.old.buf)
+		} else {
+			value, err = d.decodeUint(tt, uint(bitlen))
+		}
+	case vdl.Int8, vdl.Int16, vdl.Int32, vdl.Int64, vdl.Float32, vdl.Float64:
+		value, err = d.decodeUint(tt, uint(bitlen))
+	case vdl.Byte:
+		var b byte
+		b, err = d.binaryDecodeByte()
+		value = uint64(b)
+	default:
+		return 0, errIncompatibleDecode(tt, "uint"+strconv.Itoa(bitlen))
+	}
+	// FinishValue
+	if d.ignoreNextStartValue {
+		if err := d.FinishValue(); err != nil {
+			return 0, err
+		}
+	} else {
+		d.isParentBytes = false
+		d.ignoreNextStartValue = false
+		if len(d.stack) == 0 {
+			if err := d.old.endMessage(); err != nil {
+				return 0, err
+			}
+		}
+	}
+	return value, err
+}
+
+func (d *xDecoder) ReadValueInt(bitlen int) (value int64, err error) {
+	// StartValue
+	var tt *vdl.Type
+	if d.ignoreNextStartValue {
+		tt = d.stack[len(d.stack)-1].Type
+	} else {
+		if tt, err = d.dfsNextType(); err != nil {
+			return 0, err
+		}
+		if tt, _, _, err = d.setupType(tt, nil); err != nil {
+			return 0, err
+		}
+	}
+	// Decode, avoiding unnecessary number conversions.
+	switch kind := tt.Kind(); kind {
+	case vdl.Int8, vdl.Int16, vdl.Int32, vdl.Int64:
+		if kind.BitLen() <= bitlen {
+			value, err = binaryDecodeInt(d.old.buf)
+		} else {
+			value, err = d.decodeInt(tt, uint(bitlen))
+		}
+	case vdl.Byte, vdl.Uint16, vdl.Uint32, vdl.Uint64, vdl.Float32, vdl.Float64:
+		value, err = d.decodeInt(tt, uint(bitlen))
+	default:
+		return 0, errIncompatibleDecode(tt, "int"+strconv.Itoa(bitlen))
+	}
+	// FinishValue
+	if d.ignoreNextStartValue {
+		if err := d.FinishValue(); err != nil {
+			return 0, err
+		}
+	} else {
+		d.isParentBytes = false
+		d.ignoreNextStartValue = false
+		if len(d.stack) == 0 {
+			if err := d.old.endMessage(); err != nil {
+				return 0, err
+			}
+		}
+	}
+	return value, err
+}
+
+func (d *xDecoder) ReadValueFloat(bitlen int) (value float64, err error) {
+	// StartValue
+	var tt *vdl.Type
+	if d.ignoreNextStartValue {
+		tt = d.stack[len(d.stack)-1].Type
+	} else {
+		if tt, err = d.dfsNextType(); err != nil {
+			return 0, err
+		}
+		if tt, _, _, err = d.setupType(tt, nil); err != nil {
+			return 0, err
+		}
+	}
+	// Decode, avoiding unnecessary number conversions.
+	switch kind := tt.Kind(); kind {
+	case vdl.Byte, vdl.Uint16, vdl.Uint32, vdl.Uint64, vdl.Int8, vdl.Int16, vdl.Int32, vdl.Int64, vdl.Float32, vdl.Float64:
+		value, err = d.decodeFloat(tt, uint(bitlen))
+	default:
+		return 0, errIncompatibleDecode(tt, "float"+strconv.Itoa(bitlen))
+	}
+	// FinishValue
+	if d.ignoreNextStartValue {
+		if err := d.FinishValue(); err != nil {
+			return 0, err
+		}
+	} else {
+		d.isParentBytes = false
+		d.ignoreNextStartValue = false
+		if len(d.stack) == 0 {
+			if err := d.old.endMessage(); err != nil {
+				return 0, err
+			}
+		}
+	}
+	return value, err
+}
+
+func (d *xDecoder) ReadValueTypeObject() (value *vdl.Type, err error) {
+	// StartValue
+	var tt *vdl.Type
+	if d.ignoreNextStartValue {
+		tt = d.stack[len(d.stack)-1].Type
+	} else {
+		if tt, err = d.dfsNextType(); err != nil {
+			return nil, err
+		}
+		if tt, _, _, err = d.setupType(tt, nil); err != nil {
+			return nil, err
+		}
+	}
+	// Decode
+	switch tt.Kind() {
+	case vdl.TypeObject:
+		value, err = d.binaryDecodeType()
+	default:
+		return nil, errIncompatibleDecode(tt, "typeobject")
+	}
+	// FinishValue
+	if d.ignoreNextStartValue {
+		if err := d.FinishValue(); err != nil {
+			return nil, err
+		}
+	} else {
+		d.isParentBytes = false
+		d.ignoreNextStartValue = false
+		if len(d.stack) == 0 {
+			if err := d.old.endMessage(); err != nil {
+				return nil, err
+			}
+		}
+	}
+	return value, err
+}
+
+// ReadValueBytes is more complicated than the other ReadValue* methods, since
+// []byte lists and [n]byte arrays aren't scalar, and may need more complicated
+// conversions
+func (d *xDecoder) ReadValueBytes(fixedLen int, x *[]byte) (err error) {
+	// StartValue.  Initialize tt and lenHint, and track whether the []byte type
+	// is already on the stack via isOnStack.
+	isOnStack := d.ignoreNextStartValue
+	d.ignoreNextStartValue = false
+	var tt *vdl.Type
+	var lenHint int
+	if isOnStack {
+		top := d.top()
+		tt, lenHint = top.Type, top.LenHint
+	} else {
+		if tt, err = d.dfsNextType(); err != nil {
+			return err
+		}
+		var flag decoderFlag
+		if tt, lenHint, flag, err = d.setupType(tt, nil); err != nil {
+			return err
+		}
+		// If tt isn't []byte or [n]byte (or a named variant of these), we need to
+		// perform conversion byte-by-byte.  This is complicated, and can't be
+		// really fast, so we just push an entry onto the stack and handle this via
+		// DecodeConvertedBytes below.
+		//
+		// We also need to perform the compatibility check, to make sure tt is
+		// compatible with []byte.  The check is fairly expensive, so skipping it
+		// when tt is actually a bytes type makes the the common case faster.
+		if !tt.IsBytes() {
+			if !vdl.Compatible2(tt, ttByteList) {
+				return errIncompatibleDecode(tt, "bytes")
+			}
+			d.stack = append(d.stack, decoderStackEntry{
+				Type:    tt,
+				Index:   -1,
+				LenHint: lenHint,
+				Flag:    flag,
+			})
+			isOnStack = true
+		}
+	}
+	// Decode.  The common-case fastpath reads directly from the buffer.
+	if tt.IsBytes() {
+		if err := d.decodeBytes(tt, lenHint, fixedLen, x); err != nil {
+			return err
+		}
+	} else {
+		if err := vdl.DecodeConvertedBytes(d, fixedLen, x); err != nil {
+			return err
+		}
+	}
+	// FinishValue
+	if isOnStack {
+		if err := d.FinishValue(); err != nil {
+			return err
+		}
+	} else {
+		d.isParentBytes = false
+		if len(d.stack) == 0 {
+			if err := d.old.endMessage(); err != nil {
+				return err
+			}
+		}
+	}
+	return nil
+}
+
+var ttByteList = vdl.ListType(vdl.ByteType)
diff --git a/vtrace/vtrace.vdl.go b/vtrace/vtrace.vdl.go
index 87afc28..3c34285 100644
--- a/vtrace/vtrace.vdl.go
+++ b/vtrace/vtrace.vdl.go
@@ -102,15 +102,11 @@
 				return err
 			}
 		case "Message":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Message, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Message = value
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -265,23 +261,21 @@
 		case "":
 			return dec.FinishValue()
 		case "Id":
-			if err := x.Id.VDLRead(dec); err != nil {
+			bytes := x.Id[:]
+			if err := dec.ReadValueBytes(16, &bytes); err != nil {
 				return err
 			}
 		case "Parent":
-			if err := x.Parent.VDLRead(dec); err != nil {
+			bytes := x.Parent[:]
+			if err := dec.ReadValueBytes(16, &bytes); err != nil {
 				return err
 			}
 		case "Name":
-			if err := dec.StartValue(vdl.StringType); err != nil {
+			switch value, err := dec.ReadValueString(); {
+			case err != nil:
 				return err
-			}
-			var err error
-			if x.Name, err = dec.DecodeString(); err != nil {
-				return err
-			}
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.Name = value
 			}
 		case "Start":
 			var wire vdltime.Time
@@ -315,10 +309,9 @@
 	if err := dec.StartValue(__VDLType_list_5); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make([]Annotation, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -327,12 +320,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem Annotation
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem Annotation
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -417,7 +411,8 @@
 		case "":
 			return dec.FinishValue()
 		case "Id":
-			if err := x.Id.VDLRead(dec); err != nil {
+			bytes := x.Id[:]
+			if err := dec.ReadValueBytes(16, &bytes); err != nil {
 				return err
 			}
 		case "Spans":
@@ -436,10 +431,9 @@
 	if err := dec.StartValue(__VDLType_list_7); err != nil {
 		return err
 	}
-	switch len := dec.LenHint(); {
-	case len > 0:
+	if len := dec.LenHint(); len > 0 {
 		*x = make([]SpanRecord, 0, len)
-	default:
+	} else {
 		*x = nil
 	}
 	for {
@@ -448,12 +442,13 @@
 			return err
 		case done:
 			return dec.FinishValue()
+		default:
+			var elem SpanRecord
+			if err := elem.VDLRead(dec); err != nil {
+				return err
+			}
+			*x = append(*x, elem)
 		}
-		var elem SpanRecord
-		if err := elem.VDLRead(dec); err != nil {
-			return err
-		}
-		*x = append(*x, elem)
 	}
 }
 
@@ -479,15 +474,13 @@
 }
 
 func (x *TraceFlags) VDLRead(dec vdl.Decoder) error {
-	if err := dec.StartValue(__VDLType_int32_8); err != nil {
+	switch value, err := dec.ReadValueInt(32); {
+	case err != nil:
 		return err
+	default:
+		*x = TraceFlags(value)
 	}
-	tmp, err := dec.DecodeInt(32)
-	if err != nil {
-		return err
-	}
-	*x = TraceFlags(tmp)
-	return dec.FinishValue()
+	return nil
 }
 
 // Request is the object that carries trace informtion between processes.
@@ -569,28 +562,28 @@
 		case "":
 			return dec.FinishValue()
 		case "SpanId":
-			if err := x.SpanId.VDLRead(dec); err != nil {
+			bytes := x.SpanId[:]
+			if err := dec.ReadValueBytes(16, &bytes); err != nil {
 				return err
 			}
 		case "TraceId":
-			if err := x.TraceId.VDLRead(dec); err != nil {
+			bytes := x.TraceId[:]
+			if err := dec.ReadValueBytes(16, &bytes); err != nil {
 				return err
 			}
 		case "Flags":
-			if err := x.Flags.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
+			default:
+				x.Flags = TraceFlags(value)
 			}
 		case "LogLevel":
-			if err := dec.StartValue(vdl.Int32Type); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
-			}
-			tmp, err := dec.DecodeInt(32)
-			if err != nil {
-				return err
-			}
-			x.LogLevel = int32(tmp)
-			if err := dec.FinishValue(); err != nil {
-				return err
+			default:
+				x.LogLevel = int32(value)
 			}
 		default:
 			if err := dec.SkipValue(); err != nil {
@@ -664,8 +657,11 @@
 		case "":
 			return dec.FinishValue()
 		case "Flags":
-			if err := x.Flags.VDLRead(dec); err != nil {
+			switch value, err := dec.ReadValueInt(32); {
+			case err != nil:
 				return err
+			default:
+				x.Flags = TraceFlags(value)
 			}
 		case "Trace":
 			if err := x.Trace.VDLRead(dec); err != nil {