Speedup and cleanup vom encoder, some bugfixes.

This brings the vom Encoder implementation into a reasonable
state, performance-wise.  The technique is the same as on the
decoder side:
https://vanadium-review.googlesource.com/#/q/topic:toddw-fastdec

Also fixed a bug in the handling of bytes in vdl.newPipe.  Added
a bunch of comments in v.io/v23/vdl/pipe.go to describe the
general mechanism.

The important files to look at are under:
  v.io/v23/vdl
  v.io/v23/vom
  v.io/v23/verror
  v.io/x/ref/lib/vdl/codegen/golang

Here are the encoding benchmarks.  Note that there is higher
variance for these numbers than the decoder numbers, since
encoding requires allocations on the output buffer.  Our solution
to that will be chunked encoding, which isn't implemented here.

benchmark                          old ns/op  new ns/op    delta
Vom___Encode_____XNumber                6647       4216  -36.57%
Vom___EncodeMany_XNumber                 472        428   -9.32%
Vom___Encode_____VNumber                6482       5542  -14.50%
Vom___EncodeMany_VNumber                 176        174   -1.14%
Vom___Encode_____XStringSmall           6862       6531   -4.82%
Vom___EncodeMany_XStringSmall            527        460  -12.71%
Vom___Encode_____VStringSmall           6257       5685   -9.14%
Vom___EncodeMany_VStringSmall            196        188   -4.08%
Vom___Encode_____XStringLarge         133510     120660   -9.62%
Vom___EncodeMany_XStringLarge          55130      52237   -5.25%
Vom___Encode_____VStringLarge         130751     129680   -0.82%
Vom___EncodeMany_VStringLarge          53851      51242   -4.84%
Vom___Encode_____VEnum                  7093       6172  -12.98%
Vom___EncodeMany_VEnum                   191        183   -4.19%
Vom___Encode_____XByteListSmall         7351       6873   -6.50%
Vom___EncodeMany_XByteListSmall          579        472  -18.48%
Vom___Encode_____VByteListSmall         6623       6157   -7.04%
Vom___EncodeMany_VByteListSmall          187        177   -5.35%
Vom___Encode_____XByteListLarge       104355     104017   -0.32%
Vom___EncodeMany_XByteListLarge         8676       8696   +0.23%
Vom___Encode_____VByteListLarge        97597     100401   +2.87%
Vom___EncodeMany_VByteListLarge         8052       8231   +2.22%
Vom___Encode_____XByteArray             7364       7530   +2.25%
Vom___EncodeMany_XByteArray              745        749   +0.54%
Vom___Encode_____VByteArray             6595       6139   -6.91%
Vom___EncodeMany_VByteArray              215        202   -6.05%
Vom___Encode_____XArray                 8624       7307  -15.27%
Vom___EncodeMany_XArray                 1266        630  -50.24%
Vom___Encode_____VArray                 7358       6523  -11.35%
Vom___EncodeMany_VArray                  370        274  -25.95%
Vom___Encode_____XListSmall             8184       6991  -14.58%
Vom___EncodeMany_XListSmall             1505        688  -54.29%
Vom___Encode_____VListSmall             7000       6308   -9.89%
Vom___EncodeMany_VListSmall              390        288  -26.15%
Vom___Encode_____XListLarge         21629416    4103590  -81.03%
Vom___EncodeMany_XListLarge         20971508    3440893  -83.59%
Vom___Encode_____VListLarge          4816700    2821262  -41.43%
Vom___EncodeMany_VListLarge          4226822    2257347  -46.59%
Vom___Encode_____XListAnySmall         20538      20456   -0.40%
Vom___EncodeMany_XListAnySmall         11473      10555   -8.00%
Vom___Encode_____VListAnySmall         17542      13722  -21.78%
Vom___EncodeMany_VListAnySmall          9502       5963  -37.24%
Vom___Encode_____XListAnyLarge     242633472  186445853  -23.16%
Vom___EncodeMany_XListAnyLarge     231676344  184135888  -20.52%
Vom___Encode_____VListAnyLarge     243393646  232625450   -4.42%
Vom___EncodeMany_VListAnyLarge     204297618  208020229   +1.82%
Vom___Encode_____VSet                   7379       6520  -11.64%
Vom___EncodeMany_VSet                    539        435  -19.29%
Vom___Encode_____XMap                  10599       9060  -14.52%
Vom___EncodeMany_XMap                   3338       2743  -17.83%
Vom___Encode_____VMap                   6516       7004   +7.49%
Vom___EncodeMany_VMap                    719        527  -26.70%
Vom___Encode_____XSmallStruct          11613      10277  -11.50%
Vom___EncodeMany_XSmallStruct           2094       1630  -22.16%
Vom___Encode_____VSmallStruct           9404       8227  -12.52%
Vom___EncodeMany_VSmallStruct            470        405  -13.83%
Vom___Encode_____XLargeStruct          63816      51583  -19.17%
Vom___EncodeMany_XLargeStruct          37361      28332  -24.17%
Vom___Encode_____VLargeStruct          37287      32095  -13.92%
Vom___EncodeMany_VLargeStruct          11101       9271  -16.49%
Vom___Encode_____XLargeStructZero      43606      40770   -6.50%
Vom___EncodeMany_XLargeStructZero      19131      17869   -6.60%
Vom___Encode_____VLargeStructZero      23724      23690   -0.14%
Vom___EncodeMany_VLargeStructZero        224        217   -3.12%
Vom___Encode_____VSmallUnion            9225       7531  -18.36%
Vom___EncodeMany_VSmallUnion             266        227  -14.66%
Vom___Encode_____Time                   9340      10026   +7.34%
Vom___EncodeMany_Time                   1794       1732   -3.46%
Vom___Encode_____Blessings             41833      38908   -6.99%
Vom___EncodeMany_Blessings              5743       5291   -7.87%
Vom___Encode_____RPCRequestZero        50452      47035   -6.77%
Vom___EncodeMany_RPCRequestZero          217        208   -4.15%
Vom___Encode_____RPCRequestFull        63186      56772  -10.15%
Vom___EncodeMany_RPCRequestFull         5448       4803  -11.84%
Vom___Encode_____RPCResponseZero       51641      45973  -10.98%
Vom___EncodeMany_RPCResponseZero         809        831   +2.72%
Vom___Encode_____RPCResponseFull      101767     105144   +3.32%
Vom___EncodeMany_RPCResponseFull       57135      55317   -3.18%

MultiPart: 3/5
Change-Id: I2d407d1affa272083c9290dbd182b0c769fc2968
diff --git a/cmd/sb/internal/demodb/demodb.vdl.go b/cmd/sb/internal/demodb/demodb.vdl.go
index 90e4370..a2c3940 100644
--- a/cmd/sb/internal/demodb/demodb.vdl.go
+++ b/cmd/sb/internal/demodb/demodb.vdl.go
@@ -41,58 +41,22 @@
 		return err
 	}
 	if x.Street != "" {
-		if err := enc.NextField("Street"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.Street); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("Street", vdl.StringType, x.Street); err != nil {
 			return err
 		}
 	}
 	if x.City != "" {
-		if err := enc.NextField("City"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.City); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("City", vdl.StringType, x.City); err != nil {
 			return err
 		}
 	}
 	if x.State != "" {
-		if err := enc.NextField("State"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.State); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("State", vdl.StringType, x.State); err != nil {
 			return err
 		}
 	}
 	if x.Zip != "" {
-		if err := enc.NextField("Zip"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.Zip); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("Zip", vdl.StringType, x.Zip); err != nil {
 			return err
 		}
 	}
@@ -209,13 +173,10 @@
 }
 
 func (x CreditAgency) VDLWrite(enc vdl.Encoder) error {
-	if err := enc.StartValue(__VDLType_enum_2); err != nil {
+	if err := enc.WriteValueString(__VDLType_enum_2, x.String()); err != nil {
 		return err
 	}
-	if err := enc.EncodeString(x.String()); err != nil {
-		return err
-	}
-	return enc.FinishValue()
+	return nil
 }
 
 func (x *CreditAgency) VDLRead(dec vdl.Decoder) error {
@@ -282,13 +243,10 @@
 }
 
 func (x ExperianRating) VDLWrite(enc vdl.Encoder) error {
-	if err := enc.StartValue(__VDLType_enum_3); err != nil {
+	if err := enc.WriteValueString(__VDLType_enum_3, x.String()); err != nil {
 		return err
 	}
-	if err := enc.EncodeString(x.String()); err != nil {
-		return err
-	}
-	return enc.FinishValue()
+	return nil
 }
 
 func (x *ExperianRating) VDLRead(dec vdl.Decoder) error {
@@ -321,16 +279,7 @@
 		return err
 	}
 	if x.Rating != 0 {
-		if err := enc.NextField("Rating"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.ByteType); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(uint64(x.Rating)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("Rating", vdl.ByteType, uint64(x.Rating)); err != nil {
 			return err
 		}
 	}
@@ -386,10 +335,7 @@
 		return err
 	}
 	if x.Rating != ExperianRatingGood {
-		if err := enc.NextField("Rating"); err != nil {
-			return err
-		}
-		if err := x.Rating.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueString("Rating", __VDLType_enum_3, x.Rating.String()); err != nil {
 			return err
 		}
 	}
@@ -447,16 +393,7 @@
 		return err
 	}
 	if x.Rating != 0 {
-		if err := enc.NextField("Rating"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Int16Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeInt(int64(x.Rating)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueInt("Rating", vdl.Int16Type, int64(x.Rating)); err != nil {
 			return err
 		}
 	}
@@ -667,10 +604,7 @@
 		return err
 	}
 	if x.Agency != CreditAgencyEquifax {
-		if err := enc.NextField("Agency"); err != nil {
-			return err
-		}
-		if err := x.Agency.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueString("Agency", __VDLType_enum_2, x.Agency.String()); err != nil {
 			return err
 		}
 	}
@@ -761,44 +695,17 @@
 		return err
 	}
 	if x.Name != "" {
-		if err := enc.NextField("Name"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.Name); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("Name", vdl.StringType, x.Name); err != nil {
 			return err
 		}
 	}
 	if x.Id != 0 {
-		if err := enc.NextField("Id"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Int64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeInt(x.Id); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueInt("Id", vdl.Int64Type, x.Id); err != nil {
 			return err
 		}
 	}
 	if x.Active {
-		if err := enc.NextField("Active"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.BoolType); err != nil {
-			return err
-		}
-		if err := enc.EncodeBool(x.Active); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueBool("Active", vdl.BoolType, x.Active); err != nil {
 			return err
 		}
 	}
@@ -899,44 +806,17 @@
 		return err
 	}
 	if x.CustId != 0 {
-		if err := enc.NextField("CustId"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Int64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeInt(x.CustId); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueInt("CustId", vdl.Int64Type, x.CustId); err != nil {
 			return err
 		}
 	}
 	if x.InvoiceNum != 0 {
-		if err := enc.NextField("InvoiceNum"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Int64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeInt(x.InvoiceNum); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueInt("InvoiceNum", vdl.Int64Type, x.InvoiceNum); err != nil {
 			return err
 		}
 	}
 	if x.Amount != 0 {
-		if err := enc.NextField("Amount"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Int64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeInt(x.Amount); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueInt("Amount", vdl.Int64Type, x.Amount); err != nil {
 			return err
 		}
 	}
@@ -1026,128 +906,47 @@
 		return err
 	}
 	if x.B != 0 {
-		if err := enc.NextField("B"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.ByteType); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(uint64(x.B)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("B", vdl.ByteType, uint64(x.B)); err != nil {
 			return err
 		}
 	}
 	if x.Ui16 != 0 {
-		if err := enc.NextField("Ui16"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint16Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(uint64(x.Ui16)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("Ui16", vdl.Uint16Type, uint64(x.Ui16)); err != nil {
 			return err
 		}
 	}
 	if x.Ui32 != 0 {
-		if err := enc.NextField("Ui32"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint32Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(uint64(x.Ui32)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("Ui32", vdl.Uint32Type, uint64(x.Ui32)); err != nil {
 			return err
 		}
 	}
 	if x.Ui64 != 0 {
-		if err := enc.NextField("Ui64"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(x.Ui64); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("Ui64", vdl.Uint64Type, x.Ui64); err != nil {
 			return err
 		}
 	}
 	if x.I16 != 0 {
-		if err := enc.NextField("I16"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Int16Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeInt(int64(x.I16)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueInt("I16", vdl.Int16Type, int64(x.I16)); err != nil {
 			return err
 		}
 	}
 	if x.I32 != 0 {
-		if err := enc.NextField("I32"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Int32Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeInt(int64(x.I32)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueInt("I32", vdl.Int32Type, int64(x.I32)); err != nil {
 			return err
 		}
 	}
 	if x.I64 != 0 {
-		if err := enc.NextField("I64"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Int64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeInt(x.I64); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueInt("I64", vdl.Int64Type, x.I64); err != nil {
 			return err
 		}
 	}
 	if x.F32 != 0 {
-		if err := enc.NextField("F32"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Float32Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeFloat(float64(x.F32)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueFloat("F32", vdl.Float32Type, float64(x.F32)); err != nil {
 			return err
 		}
 	}
 	if x.F64 != 0 {
-		if err := enc.NextField("F64"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Float64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeFloat(x.F64); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueFloat("F64", vdl.Float64Type, x.F64); err != nil {
 			return err
 		}
 	}
@@ -1292,16 +1091,7 @@
 	if err := enc.StartValue(__VDLType_union_12); err != nil {
 		return err
 	}
-	if err := enc.NextField("Title"); err != nil {
-		return err
-	}
-	if err := enc.StartValue(vdl.StringType); err != nil {
-		return err
-	}
-	if err := enc.EncodeString(x.Value); err != nil {
-		return err
-	}
-	if err := enc.FinishValue(); err != nil {
+	if err := enc.NextFieldValueString("Title", vdl.StringType, x.Value); err != nil {
 		return err
 	}
 	if err := enc.NextField(""); err != nil {
@@ -1314,16 +1104,7 @@
 	if err := enc.StartValue(__VDLType_union_12); err != nil {
 		return err
 	}
-	if err := enc.NextField("Value"); err != nil {
-		return err
-	}
-	if err := enc.StartValue(vdl.Int64Type); err != nil {
-		return err
-	}
-	if err := enc.EncodeInt(x.Value); err != nil {
-		return err
-	}
-	if err := enc.FinishValue(); err != nil {
+	if err := enc.NextFieldValueInt("Value", vdl.Int64Type, x.Value); err != nil {
 		return err
 	}
 	if err := enc.NextField(""); err != nil {
@@ -1398,16 +1179,7 @@
 		return err
 	}
 	if x.Name != "" {
-		if err := enc.NextField("Name"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.Name); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("Name", vdl.StringType, x.Name); err != nil {
 			return err
 		}
 	}
@@ -1602,17 +1374,8 @@
 	if err := enc.StartValue(__VDLType_array_16); err != nil {
 		return err
 	}
-	for i := 0; i < 2; i++ {
-		if err := enc.NextEntry(false); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x[i]); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+	for _, elem := range x {
+		if err := enc.NextEntryValueString(vdl.StringType, elem); err != nil {
 			return err
 		}
 	}
@@ -1722,17 +1485,8 @@
 	if err := enc.SetLenHint(len(x)); err != nil {
 		return err
 	}
-	for i := 0; i < len(x); i++ {
-		if err := enc.NextEntry(false); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Int32Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeInt(int64(x[i])); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+	for _, elem := range x {
+		if err := enc.NextEntryValueInt(vdl.Int32Type, int64(elem)); err != nil {
 			return err
 		}
 	}
@@ -1750,16 +1504,7 @@
 		return err
 	}
 	for key := range x {
-		if err := enc.NextEntry(false); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Int32Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeInt(int64(key)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextEntryValueInt(vdl.Int32Type, int64(key)); err != nil {
 			return err
 		}
 	}
@@ -1777,25 +1522,10 @@
 		return err
 	}
 	for key, elem := range x {
-		if err := enc.NextEntry(false); err != nil {
+		if err := enc.NextEntryValueString(vdl.StringType, key); err != nil {
 			return err
 		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(key); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Int32Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeInt(int64(elem)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.WriteValueInt(vdl.Int32Type, int64(elem)); err != nil {
 			return err
 		}
 	}
@@ -2050,11 +1780,9 @@
 			return err
 		}
 		enc.SetNextStartValueIsOptional()
-
 		if err := x.Maybe.VDLWrite(enc); err != nil {
 			return err
 		}
-
 	}
 	if len(x.Rec) != 0 {
 		if err := enc.NextField("Rec"); err != nil {
@@ -2225,16 +1953,7 @@
 	if err := enc.StartValue(__VDLType_union_27); err != nil {
 		return err
 	}
-	if err := enc.NextField("ActScore"); err != nil {
-		return err
-	}
-	if err := enc.StartValue(vdl.Uint16Type); err != nil {
-		return err
-	}
-	if err := enc.EncodeUint(uint64(x.Value)); err != nil {
-		return err
-	}
-	if err := enc.FinishValue(); err != nil {
+	if err := enc.NextFieldValueUint("ActScore", vdl.Uint16Type, uint64(x.Value)); err != nil {
 		return err
 	}
 	if err := enc.NextField(""); err != nil {
@@ -2247,16 +1966,7 @@
 	if err := enc.StartValue(__VDLType_union_27); err != nil {
 		return err
 	}
-	if err := enc.NextField("SatScore"); err != nil {
-		return err
-	}
-	if err := enc.StartValue(vdl.Uint16Type); err != nil {
-		return err
-	}
-	if err := enc.EncodeUint(uint64(x.Value)); err != nil {
-		return err
-	}
-	if err := enc.FinishValue(); err != nil {
+	if err := enc.NextFieldValueUint("SatScore", vdl.Uint16Type, uint64(x.Value)); err != nil {
 		return err
 	}
 	if err := enc.NextField(""); err != nil {
@@ -2335,16 +2045,7 @@
 		return err
 	}
 	if x.Name != "" {
-		if err := enc.NextField("Name"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.Name); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("Name", vdl.StringType, x.Name); err != nil {
 			return err
 		}
 	}
@@ -2441,16 +2142,7 @@
 		return err
 	}
 	if x.NameOfType != "" {
-		if err := enc.NextField("NameOfType"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.NameOfType); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("NameOfType", vdl.StringType, x.NameOfType); err != nil {
 			return err
 		}
 	}
diff --git a/cmd/vom/main.vdl.go b/cmd/vom/main.vdl.go
index 5489c71..a94cc4e 100644
--- a/cmd/vom/main.vdl.go
+++ b/cmd/vom/main.vdl.go
@@ -69,13 +69,10 @@
 }
 
 func (x dataRep) VDLWrite(enc vdl.Encoder) error {
-	if err := enc.StartValue(__VDLType_enum_1); err != nil {
+	if err := enc.WriteValueString(__VDLType_enum_1, x.String()); err != nil {
 		return err
 	}
-	if err := enc.EncodeString(x.String()); err != nil {
-		return err
-	}
-	return enc.FinishValue()
+	return nil
 }
 
 func (x *dataRep) VDLRead(dec vdl.Decoder) error {
diff --git a/cmd/vrpc/internal/internal.vdl.go b/cmd/vrpc/internal/internal.vdl.go
index 0e9a5a6..dbe5a69 100644
--- a/cmd/vrpc/internal/internal.vdl.go
+++ b/cmd/vrpc/internal/internal.vdl.go
@@ -40,30 +40,12 @@
 		return err
 	}
 	if x.X != 0 {
-		if err := enc.NextField("X"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Int32Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeInt(int64(x.X)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueInt("X", vdl.Int32Type, int64(x.X)); err != nil {
 			return err
 		}
 	}
 	if x.Y != 0 {
-		if err := enc.NextField("Y"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Int32Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeInt(int64(x.Y)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueInt("Y", vdl.Int32Type, int64(x.Y)); err != nil {
 			return err
 		}
 	}
@@ -123,17 +105,8 @@
 	if err := enc.StartValue(__VDLType_array_2); err != nil {
 		return err
 	}
-	for i := 0; i < 2; i++ {
-		if err := enc.NextEntry(false); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Int32Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeInt(int64(x[i])); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+	for _, elem := range x {
+		if err := enc.NextEntryValueInt(vdl.Int32Type, int64(elem)); err != nil {
 			return err
 		}
 	}
diff --git a/examples/rps/rps.vdl.go b/examples/rps/rps.vdl.go
index 66f0dad..760a8bf 100644
--- a/examples/rps/rps.vdl.go
+++ b/examples/rps/rps.vdl.go
@@ -59,16 +59,7 @@
 		return err
 	}
 	if x.Id != "" {
-		if err := enc.NextField("Id"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.Id); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("Id", vdl.StringType, x.Id); err != nil {
 			return err
 		}
 	}
@@ -118,13 +109,10 @@
 }
 
 func (x GameTypeTag) VDLWrite(enc vdl.Encoder) error {
-	if err := enc.StartValue(__VDLType_byte_2); err != nil {
+	if err := enc.WriteValueUint(__VDLType_byte_2, uint64(x)); err != nil {
 		return err
 	}
-	if err := enc.EncodeUint(uint64(x)); err != nil {
-		return err
-	}
-	return enc.FinishValue()
+	return nil
 }
 
 func (x *GameTypeTag) VDLRead(dec vdl.Decoder) error {
@@ -157,24 +145,12 @@
 		return err
 	}
 	if x.NumRounds != 0 {
-		if err := enc.NextField("NumRounds"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Int32Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeInt(int64(x.NumRounds)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueInt("NumRounds", vdl.Int32Type, int64(x.NumRounds)); err != nil {
 			return err
 		}
 	}
 	if x.GameType != 0 {
-		if err := enc.NextField("GameType"); err != nil {
-			return err
-		}
-		if err := x.GameType.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueUint("GameType", __VDLType_byte_2, uint64(x.GameType)); err != nil {
 			return err
 		}
 	}
@@ -314,16 +290,7 @@
 	if err := enc.StartValue(__VDLType_union_5); err != nil {
 		return err
 	}
-	if err := enc.NextField("Move"); err != nil {
-		return err
-	}
-	if err := enc.StartValue(vdl.StringType); err != nil {
-		return err
-	}
-	if err := enc.EncodeString(x.Value); err != nil {
-		return err
-	}
-	if err := enc.FinishValue(); err != nil {
+	if err := enc.NextFieldValueString("Move", vdl.StringType, x.Value); err != nil {
 		return err
 	}
 	if err := enc.NextField(""); err != nil {
@@ -401,17 +368,8 @@
 	if err := enc.StartValue(__VDLType_array_6); err != nil {
 		return err
 	}
-	for i := 0; i < 2; i++ {
-		if err := enc.NextEntry(false); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x[i]); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+	for _, elem := range x {
+		if err := enc.NextEntryValueString(vdl.StringType, elem); err != nil {
 			return err
 		}
 	}
@@ -458,13 +416,10 @@
 }
 
 func (x WinnerTag) VDLWrite(enc vdl.Encoder) error {
-	if err := enc.StartValue(__VDLType_byte_7); err != nil {
+	if err := enc.WriteValueUint(__VDLType_byte_7, uint64(x)); err != nil {
 		return err
 	}
-	if err := enc.EncodeUint(uint64(x)); err != nil {
-		return err
-	}
-	return enc.FinishValue()
+	return nil
 }
 
 func (x *WinnerTag) VDLRead(dec vdl.Decoder) error {
@@ -523,24 +478,12 @@
 		}
 	}
 	if x.Comment != "" {
-		if err := enc.NextField("Comment"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.Comment); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("Comment", vdl.StringType, x.Comment); err != nil {
 			return err
 		}
 	}
 	if x.Winner != 0 {
-		if err := enc.NextField("Winner"); err != nil {
-			return err
-		}
-		if err := x.Winner.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueUint("Winner", __VDLType_byte_7, uint64(x.Winner)); err != nil {
 			return err
 		}
 	}
@@ -682,16 +625,7 @@
 		}
 	}
 	if x.Judge != "" {
-		if err := enc.NextField("Judge"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.Judge); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("Judge", vdl.StringType, x.Judge); err != nil {
 			return err
 		}
 	}
@@ -736,10 +670,7 @@
 		}
 	}
 	if x.Winner != 0 {
-		if err := enc.NextField("Winner"); err != nil {
-			return err
-		}
-		if err := x.Winner.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueUint("Winner", __VDLType_byte_7, uint64(x.Winner)); err != nil {
 			return err
 		}
 	}
@@ -756,17 +687,8 @@
 	if err := enc.SetLenHint(len(x)); err != nil {
 		return err
 	}
-	for i := 0; i < len(x); i++ {
-		if err := enc.NextEntry(false); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x[i]); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+	for _, elem := range x {
+		if err := enc.NextEntryValueString(vdl.StringType, elem); err != nil {
 			return err
 		}
 	}
@@ -783,11 +705,11 @@
 	if err := enc.SetLenHint(len(x)); err != nil {
 		return err
 	}
-	for i := 0; i < len(x); i++ {
+	for _, elem := range x {
 		if err := enc.NextEntry(false); err != nil {
 			return err
 		}
-		if err := x[i].VDLWrite(enc); err != nil {
+		if err := elem.VDLWrite(enc); err != nil {
 			return err
 		}
 	}
@@ -993,16 +915,7 @@
 	if err := enc.StartValue(__VDLType_union_13); err != nil {
 		return err
 	}
-	if err := enc.NextField("PlayerNum"); err != nil {
-		return err
-	}
-	if err := enc.StartValue(vdl.Int32Type); err != nil {
-		return err
-	}
-	if err := enc.EncodeInt(int64(x.Value)); err != nil {
-		return err
-	}
-	if err := enc.FinishValue(); err != nil {
+	if err := enc.NextFieldValueInt("PlayerNum", vdl.Int32Type, int64(x.Value)); err != nil {
 		return err
 	}
 	if err := enc.NextField(""); err != nil {
@@ -1015,16 +928,7 @@
 	if err := enc.StartValue(__VDLType_union_13); err != nil {
 		return err
 	}
-	if err := enc.NextField("OpponentName"); err != nil {
-		return err
-	}
-	if err := enc.StartValue(vdl.StringType); err != nil {
-		return err
-	}
-	if err := enc.EncodeString(x.Value); err != nil {
-		return err
-	}
-	if err := enc.FinishValue(); err != nil {
+	if err := enc.NextFieldValueString("OpponentName", vdl.StringType, x.Value); err != nil {
 		return err
 	}
 	if err := enc.NextField(""); err != nil {
@@ -1159,16 +1063,7 @@
 		return err
 	}
 	if x.YouWon {
-		if err := enc.NextField("YouWon"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.BoolType); err != nil {
-			return err
-		}
-		if err := enc.EncodeBool(x.YouWon); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueBool("YouWon", vdl.BoolType, x.YouWon); err != nil {
 			return err
 		}
 	}
diff --git a/examples/tunnel/tunnel.vdl.go b/examples/tunnel/tunnel.vdl.go
index 64b600b..397c070 100644
--- a/examples/tunnel/tunnel.vdl.go
+++ b/examples/tunnel/tunnel.vdl.go
@@ -43,30 +43,12 @@
 		return err
 	}
 	if x.Rows != 0 {
-		if err := enc.NextField("Rows"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint16Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(uint64(x.Rows)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("Rows", vdl.Uint16Type, uint64(x.Rows)); err != nil {
 			return err
 		}
 	}
 	if x.Cols != 0 {
-		if err := enc.NextField("Cols"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint16Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(uint64(x.Cols)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("Cols", vdl.Uint16Type, uint64(x.Cols)); err != nil {
 			return err
 		}
 	}
@@ -140,16 +122,7 @@
 		return err
 	}
 	if x.UsePty {
-		if err := enc.NextField("UsePty"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.BoolType); err != nil {
-			return err
-		}
-		if err := enc.EncodeBool(x.UsePty); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueBool("UsePty", vdl.BoolType, x.UsePty); err != nil {
 			return err
 		}
 	}
@@ -182,17 +155,8 @@
 	if err := enc.SetLenHint(len(x)); err != nil {
 		return err
 	}
-	for i := 0; i < len(x); i++ {
-		if err := enc.NextEntry(false); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x[i]); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+	for _, elem := range x {
+		if err := enc.NextEntryValueString(vdl.StringType, elem); err != nil {
 			return err
 		}
 	}
@@ -373,16 +337,7 @@
 	if err := enc.StartValue(__VDLType_union_6); err != nil {
 		return err
 	}
-	if err := enc.NextField("Stdin"); err != nil {
-		return err
-	}
-	if err := enc.StartValue(__VDLType_list_5); err != nil {
-		return err
-	}
-	if err := enc.EncodeBytes(x.Value); err != nil {
-		return err
-	}
-	if err := enc.FinishValue(); err != nil {
+	if err := enc.NextFieldValueBytes("Stdin", __VDLType_list_5, x.Value); err != nil {
 		return err
 	}
 	if err := enc.NextField(""); err != nil {
@@ -519,16 +474,7 @@
 	if err := enc.StartValue(__VDLType_union_7); err != nil {
 		return err
 	}
-	if err := enc.NextField("Stdout"); err != nil {
-		return err
-	}
-	if err := enc.StartValue(__VDLType_list_5); err != nil {
-		return err
-	}
-	if err := enc.EncodeBytes(x.Value); err != nil {
-		return err
-	}
-	if err := enc.FinishValue(); err != nil {
+	if err := enc.NextFieldValueBytes("Stdout", __VDLType_list_5, x.Value); err != nil {
 		return err
 	}
 	if err := enc.NextField(""); err != nil {
@@ -541,16 +487,7 @@
 	if err := enc.StartValue(__VDLType_union_7); err != nil {
 		return err
 	}
-	if err := enc.NextField("Stderr"); err != nil {
-		return err
-	}
-	if err := enc.StartValue(__VDLType_list_5); err != nil {
-		return err
-	}
-	if err := enc.EncodeBytes(x.Value); err != nil {
-		return err
-	}
-	if err := enc.FinishValue(); err != nil {
+	if err := enc.NextFieldValueBytes("Stderr", __VDLType_list_5, x.Value); err != nil {
 		return err
 	}
 	if err := enc.NextField(""); err != nil {
diff --git a/lib/discovery/discovery.vdl.go b/lib/discovery/discovery.vdl.go
index 3c99e3a..652a9fb 100644
--- a/lib/discovery/discovery.vdl.go
+++ b/lib/discovery/discovery.vdl.go
@@ -35,13 +35,10 @@
 }
 
 func (x Uuid) VDLWrite(enc vdl.Encoder) error {
-	if err := enc.StartValue(__VDLType_list_1); err != nil {
+	if err := enc.WriteValueBytes(__VDLType_list_1, []byte(x)); err != nil {
 		return err
 	}
-	if err := enc.EncodeBytes([]byte(x)); err != nil {
-		return err
-	}
-	return enc.FinishValue()
+	return nil
 }
 
 func (x *Uuid) VDLRead(dec vdl.Decoder) error {
@@ -65,13 +62,10 @@
 }
 
 func (x EncryptionAlgorithm) VDLWrite(enc vdl.Encoder) error {
-	if err := enc.StartValue(__VDLType_int32_2); err != nil {
+	if err := enc.WriteValueInt(__VDLType_int32_2, int64(x)); err != nil {
 		return err
 	}
-	if err := enc.EncodeInt(int64(x)); err != nil {
-		return err
-	}
-	return enc.FinishValue()
+	return nil
 }
 
 func (x *EncryptionAlgorithm) VDLRead(dec vdl.Decoder) error {
@@ -96,13 +90,10 @@
 }
 
 func (x EncryptionKey) VDLWrite(enc vdl.Encoder) error {
-	if err := enc.StartValue(__VDLType_list_3); err != nil {
+	if err := enc.WriteValueBytes(__VDLType_list_3, []byte(x)); err != nil {
 		return err
 	}
-	if err := enc.EncodeBytes([]byte(x)); err != nil {
-		return err
-	}
-	return enc.FinishValue()
+	return nil
 }
 
 func (x *EncryptionKey) VDLRead(dec vdl.Decoder) error {
@@ -126,13 +117,10 @@
 }
 
 func (x AdStatus) VDLWrite(enc vdl.Encoder) error {
-	if err := enc.StartValue(__VDLType_byte_4); err != nil {
+	if err := enc.WriteValueUint(__VDLType_byte_4, uint64(x)); err != nil {
 		return err
 	}
-	if err := enc.EncodeUint(uint64(x)); err != nil {
-		return err
-	}
-	return enc.FinishValue()
+	return nil
 }
 
 func (x *AdStatus) VDLRead(dec vdl.Decoder) error {
@@ -158,13 +146,10 @@
 }
 
 func (x AdHash) VDLWrite(enc vdl.Encoder) error {
-	if err := enc.StartValue(__VDLType_array_5); err != nil {
+	if err := enc.WriteValueBytes(__VDLType_array_5, x[:]); err != nil {
 		return err
 	}
-	if err := enc.EncodeBytes([]byte(x[:])); err != nil {
-		return err
-	}
-	return enc.FinishValue()
+	return nil
 }
 
 func (x *AdHash) VDLRead(dec vdl.Decoder) error {
@@ -244,10 +229,7 @@
 		}
 	}
 	if x.EncryptionAlgorithm != 0 {
-		if err := enc.NextField("EncryptionAlgorithm"); err != nil {
-			return err
-		}
-		if err := x.EncryptionAlgorithm.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueInt("EncryptionAlgorithm", __VDLType_int32_2, int64(x.EncryptionAlgorithm)); err != nil {
 			return err
 		}
 	}
@@ -260,24 +242,12 @@
 		}
 	}
 	if x.Hash != (AdHash{}) {
-		if err := enc.NextField("Hash"); err != nil {
-			return err
-		}
-		if err := x.Hash.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueBytes("Hash", __VDLType_array_5, x.Hash[:]); err != nil {
 			return err
 		}
 	}
 	if x.TimestampNs != 0 {
-		if err := enc.NextField("TimestampNs"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Int64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeInt(x.TimestampNs); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueInt("TimestampNs", vdl.Int64Type, x.TimestampNs); err != nil {
 			return err
 		}
 	}
@@ -290,24 +260,12 @@
 		}
 	}
 	if x.Status != 0 {
-		if err := enc.NextField("Status"); err != nil {
-			return err
-		}
-		if err := x.Status.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueUint("Status", __VDLType_byte_4, uint64(x.Status)); err != nil {
 			return err
 		}
 	}
 	if x.Lost {
-		if err := enc.NextField("Lost"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.BoolType); err != nil {
-			return err
-		}
-		if err := enc.EncodeBool(x.Lost); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueBool("Lost", vdl.BoolType, x.Lost); err != nil {
 			return err
 		}
 	}
@@ -324,11 +282,8 @@
 	if err := enc.SetLenHint(len(x)); err != nil {
 		return err
 	}
-	for i := 0; i < len(x); i++ {
-		if err := enc.NextEntry(false); err != nil {
-			return err
-		}
-		if err := x[i].VDLWrite(enc); err != nil {
+	for _, elem := range x {
+		if err := enc.NextEntryValueBytes(__VDLType_list_3, []byte(elem)); err != nil {
 			return err
 		}
 	}
@@ -345,17 +300,8 @@
 	if err := enc.SetLenHint(len(x)); err != nil {
 		return err
 	}
-	for i := 0; i < len(x); i++ {
-		if err := enc.NextEntry(false); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x[i]); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+	for _, elem := range x {
+		if err := enc.NextEntryValueString(vdl.StringType, elem); err != nil {
 			return err
 		}
 	}
diff --git a/lib/discovery/testdata/testdata.vdl.go b/lib/discovery/testdata/testdata.vdl.go
index 29dd48a..7ad0f1d 100644
--- a/lib/discovery/testdata/testdata.vdl.go
+++ b/lib/discovery/testdata/testdata.vdl.go
@@ -53,16 +53,7 @@
 		}
 	}
 	if len(x.Packed) != 0 {
-		if err := enc.NextField("Packed"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(__VDLType_list_3); err != nil {
-			return err
-		}
-		if err := enc.EncodeBytes(x.Packed); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueBytes("Packed", __VDLType_list_3, x.Packed); err != nil {
 			return err
 		}
 	}
@@ -79,17 +70,8 @@
 	if err := enc.SetLenHint(len(x)); err != nil {
 		return err
 	}
-	for i := 0; i < len(x); i++ {
-		if err := enc.NextEntry(false); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x[i]); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+	for _, elem := range x {
+		if err := enc.NextEntryValueString(vdl.StringType, elem); err != nil {
 			return err
 		}
 	}
@@ -184,10 +166,7 @@
 		return err
 	}
 	if x.Algo != 0 {
-		if err := enc.NextField("Algo"); err != nil {
-			return err
-		}
-		if err := x.Algo.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueInt("Algo", __VDLType_int32_5, int64(x.Algo)); err != nil {
 			return err
 		}
 	}
@@ -200,16 +179,7 @@
 		}
 	}
 	if len(x.Packed) != 0 {
-		if err := enc.NextField("Packed"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(__VDLType_list_3); err != nil {
-			return err
-		}
-		if err := enc.EncodeBytes(x.Packed); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueBytes("Packed", __VDLType_list_3, x.Packed); err != nil {
 			return err
 		}
 	}
@@ -226,11 +196,8 @@
 	if err := enc.SetLenHint(len(x)); err != nil {
 		return err
 	}
-	for i := 0; i < len(x); i++ {
-		if err := enc.NextEntry(false); err != nil {
-			return err
-		}
-		if err := x[i].VDLWrite(enc); err != nil {
+	for _, elem := range x {
+		if err := enc.NextEntryValueBytes(__VDLType_list_7, []byte(elem)); err != nil {
 			return err
 		}
 	}
@@ -325,30 +292,12 @@
 		return err
 	}
 	if x.In != "" {
-		if err := enc.NextField("In"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.In); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("In", vdl.StringType, x.In); err != nil {
 			return err
 		}
 	}
 	if x.Want != "" {
-		if err := enc.NextField("Want"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.Want); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("Want", vdl.StringType, x.Want); err != nil {
 			return err
 		}
 	}
diff --git a/lib/raft/raft.vdl.go b/lib/raft/raft.vdl.go
index 20f346f..0dddf77 100644
--- a/lib/raft/raft.vdl.go
+++ b/lib/raft/raft.vdl.go
@@ -34,13 +34,10 @@
 }
 
 func (x Term) VDLWrite(enc vdl.Encoder) error {
-	if err := enc.StartValue(__VDLType_uint64_1); err != nil {
+	if err := enc.WriteValueUint(__VDLType_uint64_1, uint64(x)); err != nil {
 		return err
 	}
-	if err := enc.EncodeUint(uint64(x)); err != nil {
-		return err
-	}
-	return enc.FinishValue()
+	return nil
 }
 
 func (x *Term) VDLRead(dec vdl.Decoder) error {
@@ -69,13 +66,10 @@
 }
 
 func (x Index) VDLWrite(enc vdl.Encoder) error {
-	if err := enc.StartValue(__VDLType_uint64_2); err != nil {
+	if err := enc.WriteValueUint(__VDLType_uint64_2, uint64(x)); err != nil {
 		return err
 	}
-	if err := enc.EncodeUint(uint64(x)); err != nil {
-		return err
-	}
-	return enc.FinishValue()
+	return nil
 }
 
 func (x *Index) VDLRead(dec vdl.Decoder) error {
@@ -124,46 +118,22 @@
 		return err
 	}
 	if x.Term != 0 {
-		if err := enc.NextField("Term"); err != nil {
-			return err
-		}
-		if err := x.Term.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueUint("Term", __VDLType_uint64_1, uint64(x.Term)); err != nil {
 			return err
 		}
 	}
 	if x.Index != 0 {
-		if err := enc.NextField("Index"); err != nil {
-			return err
-		}
-		if err := x.Index.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueUint("Index", __VDLType_uint64_2, uint64(x.Index)); err != nil {
 			return err
 		}
 	}
 	if len(x.Cmd) != 0 {
-		if err := enc.NextField("Cmd"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(__VDLType_list_4); err != nil {
-			return err
-		}
-		if err := enc.EncodeBytes(x.Cmd); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueBytes("Cmd", __VDLType_list_4, x.Cmd); err != nil {
 			return err
 		}
 	}
 	if x.Type != 0 {
-		if err := enc.NextField("Type"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.ByteType); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(uint64(x.Type)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("Type", vdl.ByteType, uint64(x.Type)); err != nil {
 			return err
 		}
 	}
diff --git a/lib/security/bcrypter/bcrypter.vdl.go b/lib/security/bcrypter/bcrypter.vdl.go
index 140d792..ca7f9de 100644
--- a/lib/security/bcrypter/bcrypter.vdl.go
+++ b/lib/security/bcrypter/bcrypter.vdl.go
@@ -55,16 +55,7 @@
 		return err
 	}
 	if x.PatternId != "" {
-		if err := enc.NextField("PatternId"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.PatternId); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("PatternId", vdl.StringType, x.PatternId); err != nil {
 			return err
 		}
 	}
@@ -90,25 +81,10 @@
 		return err
 	}
 	for key, elem := range x {
-		if err := enc.NextEntry(false); err != nil {
+		if err := enc.NextEntryValueString(vdl.StringType, key); err != nil {
 			return err
 		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(key); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
-			return err
-		}
-		if err := enc.StartValue(__VDLType_list_3); err != nil {
-			return err
-		}
-		if err := enc.EncodeBytes(elem); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.WriteValueBytes(__VDLType_list_3, elem); err != nil {
 			return err
 		}
 	}
@@ -210,30 +186,12 @@
 		return err
 	}
 	if x.Blessing != "" {
-		if err := enc.NextField("Blessing"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.Blessing); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("Blessing", vdl.StringType, x.Blessing); err != nil {
 			return err
 		}
 	}
 	if len(x.Params) != 0 {
-		if err := enc.NextField("Params"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(__VDLType_list_3); err != nil {
-			return err
-		}
-		if err := enc.EncodeBytes(x.Params); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueBytes("Params", __VDLType_list_3, x.Params); err != nil {
 			return err
 		}
 	}
@@ -323,16 +281,7 @@
 		return err
 	}
 	if x.Blessing != "" {
-		if err := enc.NextField("Blessing"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.Blessing); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("Blessing", vdl.StringType, x.Blessing); err != nil {
 			return err
 		}
 	}
@@ -365,17 +314,8 @@
 	if err := enc.SetLenHint(len(x)); err != nil {
 		return err
 	}
-	for i := 0; i < len(x); i++ {
-		if err := enc.NextEntry(false); err != nil {
-			return err
-		}
-		if err := enc.StartValue(__VDLType_list_3); err != nil {
-			return err
-		}
-		if err := enc.EncodeBytes(x[i]); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+	for _, elem := range x {
+		if err := enc.NextEntryValueBytes(__VDLType_list_3, elem); err != nil {
 			return err
 		}
 	}
diff --git a/lib/security/security.vdl.go b/lib/security/security.vdl.go
index a4388c9..a28624a 100644
--- a/lib/security/security.vdl.go
+++ b/lib/security/security.vdl.go
@@ -38,16 +38,7 @@
 		return err
 	}
 	for key, elem := range x {
-		if err := enc.NextEntry(false); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(key); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextEntryValueString(vdl.StringType, key); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_list_1(enc, elem); err != nil {
@@ -67,11 +58,8 @@
 	if err := enc.SetLenHint(len(x)); err != nil {
 		return err
 	}
-	for i := 0; i < len(x); i++ {
-		if err := enc.NextEntry(false); err != nil {
-			return err
-		}
-		if err := x[i].VDLWrite(enc); err != nil {
+	for _, elem := range x {
+		if err := enc.NextEntryValueString(__VDLType_string_3, string(elem)); err != nil {
 			return err
 		}
 	}
@@ -142,13 +130,10 @@
 }
 
 func (x dischargeCacheKey) VDLWrite(enc vdl.Encoder) error {
-	if err := enc.StartValue(__VDLType_array_4); err != nil {
+	if err := enc.WriteValueBytes(__VDLType_array_4, x[:]); err != nil {
 		return err
 	}
-	if err := enc.EncodeBytes([]byte(x[:])); err != nil {
-		return err
-	}
-	return enc.FinishValue()
+	return nil
 }
 
 func (x *dischargeCacheKey) VDLRead(dec vdl.Decoder) error {
@@ -336,16 +321,7 @@
 		}
 	}
 	if x.CacheKeyFormat != 0 {
-		if err := enc.NextField("CacheKeyFormat"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint32Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(uint64(x.CacheKeyFormat)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("CacheKeyFormat", vdl.Uint32Type, uint64(x.CacheKeyFormat)); err != nil {
 			return err
 		}
 	}
@@ -363,10 +339,7 @@
 		return err
 	}
 	for key, elem := range x {
-		if err := enc.NextEntry(false); err != nil {
-			return err
-		}
-		if err := key.VDLWrite(enc); err != nil {
+		if err := enc.NextEntryValueString(__VDLType_string_3, string(key)); err != nil {
 			return err
 		}
 		var wire security.WireBlessings
@@ -391,10 +364,7 @@
 		return err
 	}
 	for key, elem := range x {
-		if err := enc.NextEntry(false); err != nil {
-			return err
-		}
-		if err := key.VDLWrite(enc); err != nil {
+		if err := enc.NextEntryValueBytes(__VDLType_array_4, key[:]); err != nil {
 			return err
 		}
 		var wire security.WireDischarge
@@ -427,10 +397,7 @@
 		return err
 	}
 	for key, elem := range x {
-		if err := enc.NextEntry(false); err != nil {
-			return err
-		}
-		if err := key.VDLWrite(enc); err != nil {
+		if err := enc.NextEntryValueBytes(__VDLType_array_4, key[:]); err != nil {
 			return err
 		}
 		if err := elem.VDLWrite(enc); err != nil {
diff --git a/lib/security/serialization/serialization.vdl.go b/lib/security/serialization/serialization.vdl.go
index 804732c..93e6e32 100644
--- a/lib/security/serialization/serialization.vdl.go
+++ b/lib/security/serialization/serialization.vdl.go
@@ -36,16 +36,7 @@
 		return err
 	}
 	if x.ChunkSizeBytes != 0 {
-		if err := enc.NextField("ChunkSizeBytes"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Int64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeInt(x.ChunkSizeBytes); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueInt("ChunkSizeBytes", vdl.Int64Type, x.ChunkSizeBytes); err != nil {
 			return err
 		}
 	}
@@ -95,13 +86,10 @@
 }
 
 func (x HashCode) VDLWrite(enc vdl.Encoder) error {
-	if err := enc.StartValue(__VDLType_array_2); err != nil {
+	if err := enc.WriteValueBytes(__VDLType_array_2, x[:]); err != nil {
 		return err
 	}
-	if err := enc.EncodeBytes([]byte(x[:])); err != nil {
-		return err
-	}
-	return enc.FinishValue()
+	return nil
 }
 
 func (x *HashCode) VDLRead(dec vdl.Decoder) error {
@@ -181,10 +169,7 @@
 	if err := enc.StartValue(__VDLType_union_4); err != nil {
 		return err
 	}
-	if err := enc.NextField("Hash"); err != nil {
-		return err
-	}
-	if err := x.Value.VDLWrite(enc); err != nil {
+	if err := enc.NextFieldValueBytes("Hash", __VDLType_array_2, x.Value[:]); err != nil {
 		return err
 	}
 	if err := enc.NextField(""); err != nil {
diff --git a/lib/vdl/codegen/golang/reader.go b/lib/vdl/codegen/golang/reader.go
index 129bf47..89fbb04 100644
--- a/lib/vdl/codegen/golang/reader.go
+++ b/lib/vdl/codegen/golang/reader.go
@@ -133,7 +133,7 @@
 		// types to avoid an extra VDLRead method call, and appears before anonymous
 		// lists to avoid slow byte-at-a-time decoding.
 		return g.bodyBytes(tt, arg) + retnil
-	case !topLevel && tt.Name() != "" && !hasScalarInfo(tt):
+	case !topLevel && tt.Name() != "" && !g.hasScalarInfo(tt):
 		// Non-top-level named types call the VDLRead method defined on the arg.
 		// The top-level type is always named, and needs a real body generated.
 		// We let scalars drop through, to avoid the extra method call.
@@ -146,7 +146,7 @@
 		return g.bodyAnon(tt, arg)
 	}
 	// Handle each kind of type.
-	if hasScalarInfo(tt) {
+	if g.hasScalarInfo(tt) {
 		return g.bodyScalar(tt, arg) + retnil
 	}
 	switch kind {
@@ -216,12 +216,14 @@
 	}`, g.anonReaderName(tt), arg.Ptr())
 }
 
-func hasScalarInfo(tt *vdl.Type) bool {
-	_, _, exact := scalarInfo(tt)
+func (g *genRead) hasScalarInfo(tt *vdl.Type) bool {
+	_, _, exact := g.scalarInfo(tt)
 	return exact != nil
 }
 
-func scalarInfo(tt *vdl.Type) (method, params string, exact *vdl.Type) {
+// TODO(toddw): Change this to fastpathInfo and handle Bytes here as well, just
+// like the writer.  Also add Decoder.NextEntryValueBytes for symmetry.
+func (g *genRead) scalarInfo(tt *vdl.Type) (method, params string, exact *vdl.Type) {
 	bitlen := strconv.Itoa(tt.Kind().BitLen())
 	switch tt.Kind() {
 	case vdl.Bool:
@@ -240,7 +242,7 @@
 	return "", "", nil
 }
 
-func setEnum(argEnum, argLabel string) string {
+func (g *genRead) setEnum(argEnum, argLabel string) string {
 	return fmt.Sprintf(`
 	if err := %[1]s.Set(%[2]s); err != nil {
 		return err
@@ -248,7 +250,7 @@
 }
 
 func (g *genRead) bodyScalar(tt *vdl.Type, arg namedArg) string {
-	method, params, exact := scalarInfo(tt)
+	method, params, exact := g.scalarInfo(tt)
 	valueCast := "value"
 	if tt != exact {
 		// The types don't have an exact match, so we need a conversion.  This
@@ -271,7 +273,7 @@
 		return err
 	default:`, method, params)
 	if tt.Kind() == vdl.Enum {
-		s += setEnum(arg.Name, "value")
+		s += g.setEnum(arg.Name, "value")
 	} else {
 		s += fmt.Sprintf(`
 		%[1]s = %[2]s`, arg.Ref(), valueCast)
@@ -319,11 +321,12 @@
 	return s
 }
 
-func nextEntrySwitch(varName string, ttEntry *vdl.Type) (string, *vdl.Type) {
+func (g *genRead) nextEntrySwitch(varName string, ttEntry *vdl.Type) (string, *vdl.Type) {
 	s := `
 	switch done, err := dec.NextEntry(); {`
-	method, params, exact := scalarInfo(ttEntry)
-	if exact != nil {
+	method, params, exact := g.scalarInfo(ttEntry)
+	// TODO(toddw): Add fastpath support for native types with scalar wire types.
+	if exact != nil && !isNativeType(g.Env, ttEntry) {
 		s = fmt.Sprintf(`
 	switch done, %[1]s, err := dec.NextEntryValue%[2]s(%[3]s); {`, varName, method, params)
 	}
@@ -334,7 +337,7 @@
 	s := fmt.Sprintf(`
 	for index := 0; index < %[1]d; index++ {`, tt.Len())
 	elem := "elem"
-	switchLine, exact := nextEntrySwitch(elem, tt.Elem())
+	switchLine, exact := g.nextEntrySwitch(elem, tt.Elem())
 	s += switchLine + fmt.Sprintf(`
 		case err != nil:
 			return err
@@ -346,7 +349,7 @@
 	case exact == nil:
 		s += g.body(tt.Elem(), elemArg, false)
 	case tt.Elem().Kind() == vdl.Enum:
-		s += setEnum(elemArg.Name, elem)
+		s += g.setEnum(elemArg.Name, elem)
 	default:
 		if tt.Elem() != exact {
 			elem = typeGoWire(g.goData, tt.Elem()) + "(" + elem + ")"
@@ -374,7 +377,7 @@
 	}
 	for {`, arg.Ref(), typeGoWire(g.goData, tt))
 	elem := "elem"
-	switchLine, exact := nextEntrySwitch(elem, tt.Elem())
+	switchLine, exact := g.nextEntrySwitch(elem, tt.Elem())
 	s += switchLine + `
 		case err != nil:
 			return err
@@ -389,7 +392,7 @@
 			var %[1]s %[2]s%[3]s`, elem, typeGo(g.goData, tt.Elem()), elemBody)
 	case tt.Elem().Kind() == vdl.Enum:
 		s += fmt.Sprintf(`
-			var enum %[1]s%[2]s`, typeGo(g.goData, tt.Elem()), setEnum("enum", elem))
+			var enum %[1]s%[2]s`, typeGo(g.goData, tt.Elem()), g.setEnum("enum", elem))
 		elem = "enum"
 	case tt.Elem() != exact:
 		elem = typeGoWire(g.goData, tt.Elem()) + "(" + elem + ")"
@@ -408,7 +411,7 @@
   }
 	for {`, typeGoWire(g.goData, tt))
 	key := "key"
-	switchLine, exact := nextEntrySwitch(key, tt.Key())
+	switchLine, exact := g.nextEntrySwitch(key, tt.Key())
 	s += switchLine + fmt.Sprintf(`
 		case err != nil:
 			return err
@@ -424,7 +427,7 @@
 			var %[1]s %[2]s%[3]s`, key, typeGo(g.goData, tt.Key()), keyBody)
 	case tt.Key().Kind() == vdl.Enum:
 		s += fmt.Sprintf(`
-			var keyEnum %[1]s%[2]s`, typeGo(g.goData, tt.Key()), setEnum("keyEnum", key))
+			var keyEnum %[1]s%[2]s`, typeGo(g.goData, tt.Key()), g.setEnum("keyEnum", key))
 		key = "keyEnum"
 	case tt.Key() != exact:
 		key = typeGoWire(g.goData, tt.Key()) + "(" + key + ")"
diff --git a/lib/vdl/codegen/golang/writer.go b/lib/vdl/codegen/golang/writer.go
index 1191121..87ce8cc 100644
--- a/lib/vdl/codegen/golang/writer.go
+++ b/lib/vdl/codegen/golang/writer.go
@@ -6,6 +6,7 @@
 
 import (
 	"fmt"
+	"strings"
 
 	"v.io/v23/vdl"
 	"v.io/x/ref/lib/vdl/compile"
@@ -94,9 +95,12 @@
 	if err := enc.FinishValue(); err != nil {
 		return err
 	}`
+	retnil := ""
 	if topLevel {
 		fin = `
 	return enc.FinishValue()`
+		retnil = `
+	return nil`
 	}
 	// Handle special cases.  The ordering of the cases is very important.
 	switch {
@@ -115,16 +119,16 @@
 		// wire type.  Appears as early as possible, so that all subsequent cases
 		// have nativity handled correctly.
 		return g.bodyNative(tt, arg, skipNilCheck)
-	case !topLevel && tt.Name() != "":
+	case tt.IsBytes():
+		// Bytes call the fast Encoder.WriteValueBytes method.  Appears before named
+		// types to avoid an extra VDLWrite method call, and appears before
+		// anonymous lists to avoid slow byte-at-a-time encoding.
+		return g.bodyFastpath(tt, arg, false) + retnil
+	case !topLevel && tt.Name() != "" && !g.hasFastpath(tt, false):
 		// Non-top-level named types call the VDLWrite method defined on the arg.
 		// The top-level type is always named, and needs a real body generated.
-		// Appears before bytes, so that we use the defined method rather than
-		// re-generating extra code.
+		// We let fastpath types drop through, to avoid the extra method call.
 		return g.bodyCallVDLWrite(tt, arg, skipNilCheck)
-	case tt.IsBytes() && tt.Elem() == vdl.ByteType:
-		// Bytes use the special Encoder.EncodeBytes method.  Appears before
-		// anonymous types, to avoid processing bytes as a list or array.
-		return sta + g.bodyBytes(tt, arg) + fin
 	case !topLevel && (kind == vdl.List || kind == vdl.Set || kind == vdl.Map):
 		// Non-top-level anonymous types call the unexported __VDLWrite* functions
 		// generated in g.Gen, after the main VDLWrite method has been generated.
@@ -133,21 +137,12 @@
 		return g.bodyAnon(tt, arg)
 	}
 	// Handle each kind of type.
+	if g.hasFastpath(tt, false) {
+		// Don't perform native conversions, since they were already performed above.
+		// All scalar types have a fastpath.
+		return g.bodyFastpath(tt, arg, false) + retnil
+	}
 	switch kind {
-	case vdl.Bool:
-		return sta + g.bodyScalar(tt, vdl.BoolType, arg, "Bool") + fin
-	case vdl.String:
-		return sta + g.bodyScalar(tt, vdl.StringType, arg, "String") + fin
-	case vdl.Byte, vdl.Uint16, vdl.Uint32, vdl.Uint64:
-		return sta + g.bodyScalar(tt, vdl.Uint64Type, arg, "Uint") + fin
-	case vdl.Int8, vdl.Int16, vdl.Int32, vdl.Int64:
-		return sta + g.bodyScalar(tt, vdl.Int64Type, arg, "Int") + fin
-	case vdl.Float32, vdl.Float64:
-		return sta + g.bodyScalar(tt, vdl.Float64Type, arg, "Float") + fin
-	case vdl.TypeObject:
-		return g.bodyCallVDLWrite(tt, arg, skipNilCheck)
-	case vdl.Enum:
-		return sta + g.bodyEnum(tt, arg) + fin
 	case vdl.Array:
 		return sta + g.bodyArray(tt, arg) + fin
 	case vdl.List:
@@ -225,31 +220,89 @@
 	}`, g.anonWriterName(tt), arg.Ref())
 }
 
-func (g *genWrite) bodyScalar(tt, exact *vdl.Type, arg namedArg, method string) string {
-	param := arg.Ref()
+func (g *genWrite) hasFastpath(tt *vdl.Type, nativeConv bool) bool {
+	method, _, _ := g.fastpathInfo(tt, namedArg{}, nativeConv)
+	return method != ""
+}
+
+func (g *genWrite) fastpathInfo(tt *vdl.Type, arg namedArg, nativeConv bool) (method string, params []string, init string) {
+	kind := tt.Kind()
+	p1, p2 := "", ""
+	// When fastpathInfo is called in order to produce NextEntry* or NextField*
+	// methods, we must perform the native conversion if tt is a native type.
+	if nativeConv && isNativeType(g.Env, tt) {
+		init = fmt.Sprintf(`
+	var wire %[1]s
+	if err := %[1]sFromNative(&wire, %[2]s); err != nil {
+		return err
+	}`, typeGoWire(g.goData, tt), arg.Ref())
+		arg = typedArg("wire", tt)
+	}
+	// Handle bytes fastpath.  Go doesn't allow type conversions from []MyByte to
+	// []byte, but the reflect package does let us perform this conversion.
+	if tt.IsBytes() {
+		method, p1 = "Bytes", g.TypeOf(tt)
+		switch {
+		case tt.Elem() != vdl.ByteType:
+			slice := arg.Ref()
+			if kind == vdl.Array {
+				slice = arg.Name + "[:]"
+			}
+			p2 = fmt.Sprintf(`%sValueOf(%s).Bytes()`, g.Pkg("reflect"), slice)
+		case kind == vdl.Array:
+			p2 = arg.Name + "[:]"
+		default:
+			p2 = g.cast(arg.Ref(), tt, vdl.ListType(vdl.ByteType))
+		}
+	}
+	// Handle scalar fastpaths.
+	switch kind {
+	case vdl.Bool:
+		method, p1, p2 = "Bool", g.TypeOf(tt), g.cast(arg.Ref(), tt, vdl.BoolType)
+	case vdl.String:
+		method, p1, p2 = "String", g.TypeOf(tt), g.cast(arg.Ref(), tt, vdl.StringType)
+	case vdl.Enum:
+		method, p1, p2 = "String", g.TypeOf(tt), arg.Name+".String()"
+	case vdl.Byte, vdl.Uint16, vdl.Uint32, vdl.Uint64:
+		method, p1, p2 = "Uint", g.TypeOf(tt), g.cast(arg.Ref(), tt, vdl.Uint64Type)
+	case vdl.Int8, vdl.Int16, vdl.Int32, vdl.Int64:
+		method, p1, p2 = "Int", g.TypeOf(tt), g.cast(arg.Ref(), tt, vdl.Int64Type)
+	case vdl.Float32, vdl.Float64:
+		method, p1, p2 = "Float", g.TypeOf(tt), g.cast(arg.Ref(), tt, vdl.Float64Type)
+	case vdl.TypeObject:
+		method, p2 = "TypeObject", arg.Ref()
+	}
+	if method == "" {
+		return "", nil, ""
+	}
+	if p1 != "" {
+		params = append(params, p1)
+	}
+	params = append(params, p2)
+	return
+}
+
+func (g *genWrite) cast(value string, tt, exact *vdl.Type) string {
 	if tt != exact {
-		param = typeGo(g.goData, exact) + "(" + arg.Ref() + ")"
+		// The types don't have an exact match, so we need a conversion.  This
+		// occurs for all named types, as well as numeric types where the bitlen
+		// isn't exactly the same.  E.g.
+		//
+		//   type Foo uint16
+		//
+		//   x := Foo(123)
+		//   enc.WriteValueUint(tt, uint64(x))
+		return typeGoWire(g.goData, exact) + "(" + value + ")"
 	}
-	return fmt.Sprintf(`
-	if err := enc.Encode%[1]s(%[2]s); err != nil {
-		return err
-	}`, method, param)
+	return value
 }
 
-var ttBytes = vdl.ListType(vdl.ByteType)
-
-func (g *genWrite) bodyBytes(tt *vdl.Type, arg namedArg) string {
-	if tt.Kind() == vdl.Array {
-		arg = arg.ArrayIndex(":", ttBytes)
-	}
-	return g.bodyScalar(tt, ttBytes, arg, "Bytes")
-}
-
-func (g *genWrite) bodyEnum(tt *vdl.Type, arg namedArg) string {
-	return fmt.Sprintf(`
-	if err := enc.EncodeString(%[1]s.String()); err != nil {
+func (g *genWrite) bodyFastpath(tt *vdl.Type, arg namedArg, nativeConv bool) string {
+	method, params, init := g.fastpathInfo(tt, arg, nativeConv)
+	return fmt.Sprintf(`%[1]s
+	if err := enc.WriteValue%[2]s(%[3]s); err != nil {
 		return err
-	}`, arg.Name)
+	}`, init, method, strings.Join(params, ", "))
 }
 
 const (
@@ -268,25 +321,41 @@
 )
 
 func (g *genWrite) bodyArray(tt *vdl.Type, arg namedArg) string {
-	elemArg := arg.ArrayIndex("i", tt.Elem())
+	elemArg := typedArg("elem", tt.Elem())
 	s := fmt.Sprintf(`
-	for i := 0; i < %[1]d; i++ {`, tt.Len())
-	s += encNextEntry
-	s += g.body(tt.Elem(), elemArg, false, false)
+	for _, elem := range %[1]s {`, arg.Ref())
+	method, params, init := g.fastpathInfo(tt.Elem(), elemArg, true)
+	if method != "" {
+		s += fmt.Sprintf(`%[1]s
+	if err := enc.NextEntryValue%[2]s(%[3]s); err != nil {
+		return err
+	}`, init, method, strings.Join(params, ", "))
+	} else {
+		s += encNextEntry
+		s += g.body(tt.Elem(), elemArg, false, false)
+	}
 	s += `
 	}` + encNextEntryDone
 	return s
 }
 
 func (g *genWrite) bodyList(tt *vdl.Type, arg namedArg) string {
-	elemArg := arg.Index("i", tt.Elem())
+	elemArg := typedArg("elem", tt.Elem())
 	s := fmt.Sprintf(`
 	if err := enc.SetLenHint(len(%[1]s)); err != nil {
 		return err
 	}
-	for i := 0; i < len(%[1]s); i++ {`, arg.Ref())
-	s += encNextEntry
-	s += g.body(tt.Elem(), elemArg, false, false)
+	for _, elem := range %[1]s {`, arg.Ref())
+	method, params, init := g.fastpathInfo(tt.Elem(), elemArg, true)
+	if method != "" {
+		s += fmt.Sprintf(`%[1]s
+	if err := enc.NextEntryValue%[2]s(%[3]s); err != nil {
+		return err
+	}`, init, method, strings.Join(params, ", "))
+	} else {
+		s += encNextEntry
+		s += g.body(tt.Elem(), elemArg, false, false)
+	}
 	s += `
 	}` + encNextEntryDone
 	return s
@@ -299,8 +368,16 @@
 		return err
 	}
 	for key := range %[1]s {`, arg.Ref())
-	s += encNextEntry
-	s += g.body(tt.Key(), keyArg, false, false)
+	method, params, init := g.fastpathInfo(tt.Key(), keyArg, true)
+	if method != "" {
+		s += fmt.Sprintf(`%[1]s
+	if err := enc.NextEntryValue%[2]s(%[3]s); err != nil {
+		return err
+	}`, init, method, strings.Join(params, ", "))
+	} else {
+		s += encNextEntry
+		s += g.body(tt.Key(), keyArg, false, false)
+	}
 	s += `
 	}` + encNextEntryDone
 	return s
@@ -313,8 +390,16 @@
 		return err
 	}
 	for key, elem := range %[1]s {`, arg.Ref())
-	s += encNextEntry
-	s += g.body(tt.Key(), keyArg, false, false)
+	method, params, init := g.fastpathInfo(tt.Key(), keyArg, true)
+	if method != "" {
+		s += fmt.Sprintf(`%[1]s
+	if err := enc.NextEntryValue%[2]s(%[3]s); err != nil {
+		return err
+	}`, init, method, strings.Join(params, ", "))
+	} else {
+		s += encNextEntry
+		s += g.body(tt.Key(), keyArg, false, false)
+	}
 	s += g.body(tt.Elem(), elemArg, false, false)
 	s += `
 	}` + encNextEntryDone
@@ -328,37 +413,55 @@
 		fieldArg := arg.Field(field)
 		zero := genIsZero{g.goData}
 		expr := zero.Expr(ifNeZero, field.Type, fieldArg, field.Name)
-		// The second-to-last true parameter indicates that nil checks can be
-		// skipped, since we've already ensured the field isn't zero here.
-		fieldBody := g.body(field.Type, fieldArg, true, false)
 		s += fmt.Sprintf(`
-	if %[1]s {
-		if err := enc.NextField(%[2]q); err != nil {
+	if %[1]s {`, expr)
+		method, params, init := g.fastpathInfo(field.Type, fieldArg, true)
+		if method != "" {
+			params = append([]string{`"` + field.Name + `"`}, params...)
+			s += fmt.Sprintf(`%[1]s
+		if err := enc.NextFieldValue%[2]s(%[3]s); err != nil {
 			return err
-		}%[3]s
-	}`, expr, field.Name, fieldBody)
+		}`, init, method, strings.Join(params, ", "))
+		} else {
+			// The second-to-last true parameter indicates that nil checks can be
+			// skipped, since we've already ensured the field isn't zero here.
+			fieldBody := g.body(field.Type, fieldArg, true, false)
+			s += fmt.Sprintf(`
+		if err := enc.NextField(%[1]q); err != nil {
+			return err
+		}%[2]s`, field.Name, fieldBody)
+		}
+		s += `
+	}`
 	}
 	s += encNextFieldDone
 	return s
 }
 
 func (g *genWrite) bodyUnion(field vdl.Field, arg namedArg) string {
+	var s string
 	fieldArg := typedArg(arg.Name+".Value", field.Type)
-	s := fmt.Sprintf(`
+	method, params, init := g.fastpathInfo(field.Type, fieldArg, true)
+	if method != "" {
+		params = append([]string{`"` + field.Name + `"`}, params...)
+		s += fmt.Sprintf(`%[1]s
+	if err := enc.NextFieldValue%[2]s(%[3]s); err != nil {
+		return err
+	}`, init, method, strings.Join(params, ", "))
+	} else {
+		s += fmt.Sprintf(`
 	if err := enc.NextField(%[1]q); err != nil {
 			return err
 	}`, field.Name)
-	s += g.body(field.Type, fieldArg, false, false)
+		s += g.body(field.Type, fieldArg, false, false)
+	}
 	s += encNextFieldDone
 	return s
 }
 
 func (g *genWrite) bodyOptional(tt *vdl.Type, arg namedArg, skipNilCheck bool) string {
-	body := g.body(tt.Elem(), arg, false, false)
-	s := fmt.Sprintf(`
-	enc.SetNextStartValueIsOptional()
-	%[1]s
-	`, body)
+	s := `
+	enc.SetNextStartValueIsOptional()` + g.body(tt.Elem(), arg, false, false)
 	if !skipNilCheck {
 		s = fmt.Sprintf(`
 	if %[1]s == nil {
diff --git a/lib/vdl/testdata/base/base.vdl.go b/lib/vdl/testdata/base/base.vdl.go
index 46202d4..7d6160b 100644
--- a/lib/vdl/testdata/base/base.vdl.go
+++ b/lib/vdl/testdata/base/base.vdl.go
@@ -37,13 +37,10 @@
 }
 
 func (x NamedBool) VDLWrite(enc vdl.Encoder) error {
-	if err := enc.StartValue(__VDLType_bool_1); err != nil {
+	if err := enc.WriteValueBool(__VDLType_bool_1, bool(x)); err != nil {
 		return err
 	}
-	if err := enc.EncodeBool(bool(x)); err != nil {
-		return err
-	}
-	return enc.FinishValue()
+	return nil
 }
 
 func (x *NamedBool) VDLRead(dec vdl.Decoder) error {
@@ -68,13 +65,10 @@
 }
 
 func (x NamedByte) VDLWrite(enc vdl.Encoder) error {
-	if err := enc.StartValue(__VDLType_byte_2); err != nil {
+	if err := enc.WriteValueUint(__VDLType_byte_2, uint64(x)); err != nil {
 		return err
 	}
-	if err := enc.EncodeUint(uint64(x)); err != nil {
-		return err
-	}
-	return enc.FinishValue()
+	return nil
 }
 
 func (x *NamedByte) VDLRead(dec vdl.Decoder) error {
@@ -99,13 +93,10 @@
 }
 
 func (x NamedUint16) VDLWrite(enc vdl.Encoder) error {
-	if err := enc.StartValue(__VDLType_uint16_3); err != nil {
+	if err := enc.WriteValueUint(__VDLType_uint16_3, uint64(x)); err != nil {
 		return err
 	}
-	if err := enc.EncodeUint(uint64(x)); err != nil {
-		return err
-	}
-	return enc.FinishValue()
+	return nil
 }
 
 func (x *NamedUint16) VDLRead(dec vdl.Decoder) error {
@@ -130,13 +121,10 @@
 }
 
 func (x NamedUint32) VDLWrite(enc vdl.Encoder) error {
-	if err := enc.StartValue(__VDLType_uint32_4); err != nil {
+	if err := enc.WriteValueUint(__VDLType_uint32_4, uint64(x)); err != nil {
 		return err
 	}
-	if err := enc.EncodeUint(uint64(x)); err != nil {
-		return err
-	}
-	return enc.FinishValue()
+	return nil
 }
 
 func (x *NamedUint32) VDLRead(dec vdl.Decoder) error {
@@ -161,13 +149,10 @@
 }
 
 func (x NamedUint64) VDLWrite(enc vdl.Encoder) error {
-	if err := enc.StartValue(__VDLType_uint64_5); err != nil {
+	if err := enc.WriteValueUint(__VDLType_uint64_5, uint64(x)); err != nil {
 		return err
 	}
-	if err := enc.EncodeUint(uint64(x)); err != nil {
-		return err
-	}
-	return enc.FinishValue()
+	return nil
 }
 
 func (x *NamedUint64) VDLRead(dec vdl.Decoder) error {
@@ -192,13 +177,10 @@
 }
 
 func (x NamedInt8) VDLWrite(enc vdl.Encoder) error {
-	if err := enc.StartValue(__VDLType_int8_6); err != nil {
+	if err := enc.WriteValueInt(__VDLType_int8_6, int64(x)); err != nil {
 		return err
 	}
-	if err := enc.EncodeInt(int64(x)); err != nil {
-		return err
-	}
-	return enc.FinishValue()
+	return nil
 }
 
 func (x *NamedInt8) VDLRead(dec vdl.Decoder) error {
@@ -223,13 +205,10 @@
 }
 
 func (x NamedInt16) VDLWrite(enc vdl.Encoder) error {
-	if err := enc.StartValue(__VDLType_int16_7); err != nil {
+	if err := enc.WriteValueInt(__VDLType_int16_7, int64(x)); err != nil {
 		return err
 	}
-	if err := enc.EncodeInt(int64(x)); err != nil {
-		return err
-	}
-	return enc.FinishValue()
+	return nil
 }
 
 func (x *NamedInt16) VDLRead(dec vdl.Decoder) error {
@@ -254,13 +233,10 @@
 }
 
 func (x NamedInt32) VDLWrite(enc vdl.Encoder) error {
-	if err := enc.StartValue(__VDLType_int32_8); err != nil {
+	if err := enc.WriteValueInt(__VDLType_int32_8, int64(x)); err != nil {
 		return err
 	}
-	if err := enc.EncodeInt(int64(x)); err != nil {
-		return err
-	}
-	return enc.FinishValue()
+	return nil
 }
 
 func (x *NamedInt32) VDLRead(dec vdl.Decoder) error {
@@ -285,13 +261,10 @@
 }
 
 func (x NamedInt64) VDLWrite(enc vdl.Encoder) error {
-	if err := enc.StartValue(__VDLType_int64_9); err != nil {
+	if err := enc.WriteValueInt(__VDLType_int64_9, int64(x)); err != nil {
 		return err
 	}
-	if err := enc.EncodeInt(int64(x)); err != nil {
-		return err
-	}
-	return enc.FinishValue()
+	return nil
 }
 
 func (x *NamedInt64) VDLRead(dec vdl.Decoder) error {
@@ -316,13 +289,10 @@
 }
 
 func (x NamedFloat32) VDLWrite(enc vdl.Encoder) error {
-	if err := enc.StartValue(__VDLType_float32_10); err != nil {
+	if err := enc.WriteValueFloat(__VDLType_float32_10, float64(x)); err != nil {
 		return err
 	}
-	if err := enc.EncodeFloat(float64(x)); err != nil {
-		return err
-	}
-	return enc.FinishValue()
+	return nil
 }
 
 func (x *NamedFloat32) VDLRead(dec vdl.Decoder) error {
@@ -347,13 +317,10 @@
 }
 
 func (x NamedFloat64) VDLWrite(enc vdl.Encoder) error {
-	if err := enc.StartValue(__VDLType_float64_11); err != nil {
+	if err := enc.WriteValueFloat(__VDLType_float64_11, float64(x)); err != nil {
 		return err
 	}
-	if err := enc.EncodeFloat(float64(x)); err != nil {
-		return err
-	}
-	return enc.FinishValue()
+	return nil
 }
 
 func (x *NamedFloat64) VDLRead(dec vdl.Decoder) error {
@@ -378,13 +345,10 @@
 }
 
 func (x NamedString) VDLWrite(enc vdl.Encoder) error {
-	if err := enc.StartValue(__VDLType_string_12); err != nil {
+	if err := enc.WriteValueString(__VDLType_string_12, string(x)); err != nil {
 		return err
 	}
-	if err := enc.EncodeString(string(x)); err != nil {
-		return err
-	}
-	return enc.FinishValue()
+	return nil
 }
 
 func (x *NamedString) VDLRead(dec vdl.Decoder) error {
@@ -455,13 +419,10 @@
 }
 
 func (x NamedEnum) VDLWrite(enc vdl.Encoder) error {
-	if err := enc.StartValue(__VDLType_enum_13); err != nil {
+	if err := enc.WriteValueString(__VDLType_enum_13, x.String()); err != nil {
 		return err
 	}
-	if err := enc.EncodeString(x.String()); err != nil {
-		return err
-	}
-	return enc.FinishValue()
+	return nil
 }
 
 func (x *NamedEnum) VDLRead(dec vdl.Decoder) error {
@@ -491,17 +452,8 @@
 	if err := enc.StartValue(__VDLType_array_14); err != nil {
 		return err
 	}
-	for i := 0; i < 2; i++ {
-		if err := enc.NextEntry(false); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.BoolType); err != nil {
-			return err
-		}
-		if err := enc.EncodeBool(x[i]); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+	for _, elem := range x {
+		if err := enc.NextEntryValueBool(vdl.BoolType, elem); err != nil {
 			return err
 		}
 	}
@@ -552,17 +504,8 @@
 	if err := enc.SetLenHint(len(x)); err != nil {
 		return err
 	}
-	for i := 0; i < len(x); i++ {
-		if err := enc.NextEntry(false); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint32Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(uint64(x[i])); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+	for _, elem := range x {
+		if err := enc.NextEntryValueUint(vdl.Uint32Type, uint64(elem)); err != nil {
 			return err
 		}
 	}
@@ -612,16 +555,7 @@
 		return err
 	}
 	for key := range x {
-		if err := enc.NextEntry(false); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(key); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextEntryValueString(vdl.StringType, key); err != nil {
 			return err
 		}
 	}
@@ -674,25 +608,10 @@
 		return err
 	}
 	for key, elem := range x {
-		if err := enc.NextEntry(false); err != nil {
+		if err := enc.NextEntryValueString(vdl.StringType, key); err != nil {
 			return err
 		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(key); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Float32Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeFloat(float64(elem)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.WriteValueFloat(vdl.Float32Type, float64(elem)); err != nil {
 			return err
 		}
 	}
@@ -753,44 +672,17 @@
 		return err
 	}
 	if x.A {
-		if err := enc.NextField("A"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.BoolType); err != nil {
-			return err
-		}
-		if err := enc.EncodeBool(x.A); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueBool("A", vdl.BoolType, x.A); err != nil {
 			return err
 		}
 	}
 	if x.B != "" {
-		if err := enc.NextField("B"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.B); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("B", vdl.StringType, x.B); err != nil {
 			return err
 		}
 	}
 	if x.C != 0 {
-		if err := enc.NextField("C"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Int32Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeInt(int64(x.C)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueInt("C", vdl.Int32Type, int64(x.C)); err != nil {
 			return err
 		}
 	}
@@ -905,16 +797,7 @@
 	if err := enc.StartValue(__VDLType_union_19); err != nil {
 		return err
 	}
-	if err := enc.NextField("A"); err != nil {
-		return err
-	}
-	if err := enc.StartValue(vdl.BoolType); err != nil {
-		return err
-	}
-	if err := enc.EncodeBool(x.Value); err != nil {
-		return err
-	}
-	if err := enc.FinishValue(); err != nil {
+	if err := enc.NextFieldValueBool("A", vdl.BoolType, x.Value); err != nil {
 		return err
 	}
 	if err := enc.NextField(""); err != nil {
@@ -927,16 +810,7 @@
 	if err := enc.StartValue(__VDLType_union_19); err != nil {
 		return err
 	}
-	if err := enc.NextField("B"); err != nil {
-		return err
-	}
-	if err := enc.StartValue(vdl.StringType); err != nil {
-		return err
-	}
-	if err := enc.EncodeString(x.Value); err != nil {
-		return err
-	}
-	if err := enc.FinishValue(); err != nil {
+	if err := enc.NextFieldValueString("B", vdl.StringType, x.Value); err != nil {
 		return err
 	}
 	if err := enc.NextField(""); err != nil {
@@ -949,16 +823,7 @@
 	if err := enc.StartValue(__VDLType_union_19); err != nil {
 		return err
 	}
-	if err := enc.NextField("C"); err != nil {
-		return err
-	}
-	if err := enc.StartValue(vdl.Int32Type); err != nil {
-		return err
-	}
-	if err := enc.EncodeInt(int64(x.Value)); err != nil {
-		return err
-	}
-	if err := enc.FinishValue(); err != nil {
+	if err := enc.NextFieldValueInt("C", vdl.Int32Type, int64(x.Value)); err != nil {
 		return err
 	}
 	if err := enc.NextField(""); err != nil {
@@ -1150,170 +1015,62 @@
 		return err
 	}
 	if x.A0 {
-		if err := enc.NextField("A0"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.BoolType); err != nil {
-			return err
-		}
-		if err := enc.EncodeBool(x.A0); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueBool("A0", vdl.BoolType, x.A0); err != nil {
 			return err
 		}
 	}
 	if x.A1 != 0 {
-		if err := enc.NextField("A1"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.ByteType); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(uint64(x.A1)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("A1", vdl.ByteType, uint64(x.A1)); err != nil {
 			return err
 		}
 	}
 	if x.A2 != 0 {
-		if err := enc.NextField("A2"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint16Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(uint64(x.A2)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("A2", vdl.Uint16Type, uint64(x.A2)); err != nil {
 			return err
 		}
 	}
 	if x.A3 != 0 {
-		if err := enc.NextField("A3"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint32Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(uint64(x.A3)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("A3", vdl.Uint32Type, uint64(x.A3)); err != nil {
 			return err
 		}
 	}
 	if x.A4 != 0 {
-		if err := enc.NextField("A4"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(x.A4); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("A4", vdl.Uint64Type, x.A4); err != nil {
 			return err
 		}
 	}
 	if x.A5 != 0 {
-		if err := enc.NextField("A5"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Int8Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeInt(int64(x.A5)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueInt("A5", vdl.Int8Type, int64(x.A5)); err != nil {
 			return err
 		}
 	}
 	if x.A6 != 0 {
-		if err := enc.NextField("A6"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Int16Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeInt(int64(x.A6)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueInt("A6", vdl.Int16Type, int64(x.A6)); err != nil {
 			return err
 		}
 	}
 	if x.A7 != 0 {
-		if err := enc.NextField("A7"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Int32Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeInt(int64(x.A7)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueInt("A7", vdl.Int32Type, int64(x.A7)); err != nil {
 			return err
 		}
 	}
 	if x.A8 != 0 {
-		if err := enc.NextField("A8"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Int64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeInt(x.A8); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueInt("A8", vdl.Int64Type, x.A8); err != nil {
 			return err
 		}
 	}
 	if x.A9 != 0 {
-		if err := enc.NextField("A9"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Float32Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeFloat(float64(x.A9)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueFloat("A9", vdl.Float32Type, float64(x.A9)); err != nil {
 			return err
 		}
 	}
 	if x.A10 != 0 {
-		if err := enc.NextField("A10"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Float64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeFloat(x.A10); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueFloat("A10", vdl.Float64Type, x.A10); err != nil {
 			return err
 		}
 	}
 	if x.A11 != "" {
-		if err := enc.NextField("A11"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.A11); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("A11", vdl.StringType, x.A11); err != nil {
 			return err
 		}
 	}
@@ -1334,114 +1091,72 @@
 		}
 	}
 	if x.A14 != nil && x.A14 != vdl.AnyType {
-		if err := enc.NextField("A14"); err != nil {
-			return err
-		}
-		if err := x.A14.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueTypeObject("A14", x.A14); err != nil {
 			return err
 		}
 	}
 	if x.B0 {
-		if err := enc.NextField("B0"); err != nil {
-			return err
-		}
-		if err := x.B0.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueBool("B0", __VDLType_bool_1, bool(x.B0)); err != nil {
 			return err
 		}
 	}
 	if x.B1 != 0 {
-		if err := enc.NextField("B1"); err != nil {
-			return err
-		}
-		if err := x.B1.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueUint("B1", __VDLType_byte_2, uint64(x.B1)); err != nil {
 			return err
 		}
 	}
 	if x.B2 != 0 {
-		if err := enc.NextField("B2"); err != nil {
-			return err
-		}
-		if err := x.B2.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueUint("B2", __VDLType_uint16_3, uint64(x.B2)); err != nil {
 			return err
 		}
 	}
 	if x.B3 != 0 {
-		if err := enc.NextField("B3"); err != nil {
-			return err
-		}
-		if err := x.B3.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueUint("B3", __VDLType_uint32_4, uint64(x.B3)); err != nil {
 			return err
 		}
 	}
 	if x.B4 != 0 {
-		if err := enc.NextField("B4"); err != nil {
-			return err
-		}
-		if err := x.B4.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueUint("B4", __VDLType_uint64_5, uint64(x.B4)); err != nil {
 			return err
 		}
 	}
 	if x.B5 != 0 {
-		if err := enc.NextField("B5"); err != nil {
-			return err
-		}
-		if err := x.B5.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueInt("B5", __VDLType_int8_6, int64(x.B5)); err != nil {
 			return err
 		}
 	}
 	if x.B6 != 0 {
-		if err := enc.NextField("B6"); err != nil {
-			return err
-		}
-		if err := x.B6.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueInt("B6", __VDLType_int16_7, int64(x.B6)); err != nil {
 			return err
 		}
 	}
 	if x.B7 != 0 {
-		if err := enc.NextField("B7"); err != nil {
-			return err
-		}
-		if err := x.B7.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueInt("B7", __VDLType_int32_8, int64(x.B7)); err != nil {
 			return err
 		}
 	}
 	if x.B8 != 0 {
-		if err := enc.NextField("B8"); err != nil {
-			return err
-		}
-		if err := x.B8.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueInt("B8", __VDLType_int64_9, int64(x.B8)); err != nil {
 			return err
 		}
 	}
 	if x.B9 != 0 {
-		if err := enc.NextField("B9"); err != nil {
-			return err
-		}
-		if err := x.B9.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueFloat("B9", __VDLType_float32_10, float64(x.B9)); err != nil {
 			return err
 		}
 	}
 	if x.B10 != 0 {
-		if err := enc.NextField("B10"); err != nil {
-			return err
-		}
-		if err := x.B10.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueFloat("B10", __VDLType_float64_11, float64(x.B10)); err != nil {
 			return err
 		}
 	}
 	if x.B11 != "" {
-		if err := enc.NextField("B11"); err != nil {
-			return err
-		}
-		if err := x.B11.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueString("B11", __VDLType_string_12, string(x.B11)); err != nil {
 			return err
 		}
 	}
 	if x.B12 != NamedEnumA {
-		if err := enc.NextField("B12"); err != nil {
-			return err
-		}
-		if err := x.B12.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueString("B12", __VDLType_enum_13, x.B12.String()); err != nil {
 			return err
 		}
 	}
@@ -1723,266 +1438,122 @@
 		return err
 	}
 	if x.A0 {
-		if err := enc.NextField("A0"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.BoolType); err != nil {
-			return err
-		}
-		if err := enc.EncodeBool(x.A0); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueBool("A0", vdl.BoolType, x.A0); err != nil {
 			return err
 		}
 	}
 	if x.A1 != 0 {
-		if err := enc.NextField("A1"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.ByteType); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(uint64(x.A1)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("A1", vdl.ByteType, uint64(x.A1)); err != nil {
 			return err
 		}
 	}
 	if x.A2 != 0 {
-		if err := enc.NextField("A2"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint16Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(uint64(x.A2)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("A2", vdl.Uint16Type, uint64(x.A2)); err != nil {
 			return err
 		}
 	}
 	if x.A3 != 0 {
-		if err := enc.NextField("A3"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint32Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(uint64(x.A3)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("A3", vdl.Uint32Type, uint64(x.A3)); err != nil {
 			return err
 		}
 	}
 	if x.A4 != 0 {
-		if err := enc.NextField("A4"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(x.A4); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("A4", vdl.Uint64Type, x.A4); err != nil {
 			return err
 		}
 	}
 	if x.A5 != 0 {
-		if err := enc.NextField("A5"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Int8Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeInt(int64(x.A5)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueInt("A5", vdl.Int8Type, int64(x.A5)); err != nil {
 			return err
 		}
 	}
 	if x.A6 != 0 {
-		if err := enc.NextField("A6"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Int16Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeInt(int64(x.A6)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueInt("A6", vdl.Int16Type, int64(x.A6)); err != nil {
 			return err
 		}
 	}
 	if x.A7 != 0 {
-		if err := enc.NextField("A7"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Int32Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeInt(int64(x.A7)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueInt("A7", vdl.Int32Type, int64(x.A7)); err != nil {
 			return err
 		}
 	}
 	if x.A8 != 0 {
-		if err := enc.NextField("A8"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Int64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeInt(x.A8); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueInt("A8", vdl.Int64Type, x.A8); err != nil {
 			return err
 		}
 	}
 	if x.A9 != 0 {
-		if err := enc.NextField("A9"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Float32Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeFloat(float64(x.A9)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueFloat("A9", vdl.Float32Type, float64(x.A9)); err != nil {
 			return err
 		}
 	}
 	if x.A10 != 0 {
-		if err := enc.NextField("A10"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Float64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeFloat(x.A10); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueFloat("A10", vdl.Float64Type, x.A10); err != nil {
 			return err
 		}
 	}
 	if x.A11 != "" {
-		if err := enc.NextField("A11"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.A11); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("A11", vdl.StringType, x.A11); err != nil {
 			return err
 		}
 	}
 	if x.B0 {
-		if err := enc.NextField("B0"); err != nil {
-			return err
-		}
-		if err := x.B0.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueBool("B0", __VDLType_bool_1, bool(x.B0)); err != nil {
 			return err
 		}
 	}
 	if x.B1 != 0 {
-		if err := enc.NextField("B1"); err != nil {
-			return err
-		}
-		if err := x.B1.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueUint("B1", __VDLType_byte_2, uint64(x.B1)); err != nil {
 			return err
 		}
 	}
 	if x.B2 != 0 {
-		if err := enc.NextField("B2"); err != nil {
-			return err
-		}
-		if err := x.B2.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueUint("B2", __VDLType_uint16_3, uint64(x.B2)); err != nil {
 			return err
 		}
 	}
 	if x.B3 != 0 {
-		if err := enc.NextField("B3"); err != nil {
-			return err
-		}
-		if err := x.B3.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueUint("B3", __VDLType_uint32_4, uint64(x.B3)); err != nil {
 			return err
 		}
 	}
 	if x.B4 != 0 {
-		if err := enc.NextField("B4"); err != nil {
-			return err
-		}
-		if err := x.B4.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueUint("B4", __VDLType_uint64_5, uint64(x.B4)); err != nil {
 			return err
 		}
 	}
 	if x.B5 != 0 {
-		if err := enc.NextField("B5"); err != nil {
-			return err
-		}
-		if err := x.B5.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueInt("B5", __VDLType_int8_6, int64(x.B5)); err != nil {
 			return err
 		}
 	}
 	if x.B6 != 0 {
-		if err := enc.NextField("B6"); err != nil {
-			return err
-		}
-		if err := x.B6.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueInt("B6", __VDLType_int16_7, int64(x.B6)); err != nil {
 			return err
 		}
 	}
 	if x.B7 != 0 {
-		if err := enc.NextField("B7"); err != nil {
-			return err
-		}
-		if err := x.B7.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueInt("B7", __VDLType_int32_8, int64(x.B7)); err != nil {
 			return err
 		}
 	}
 	if x.B8 != 0 {
-		if err := enc.NextField("B8"); err != nil {
-			return err
-		}
-		if err := x.B8.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueInt("B8", __VDLType_int64_9, int64(x.B8)); err != nil {
 			return err
 		}
 	}
 	if x.B9 != 0 {
-		if err := enc.NextField("B9"); err != nil {
-			return err
-		}
-		if err := x.B9.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueFloat("B9", __VDLType_float32_10, float64(x.B9)); err != nil {
 			return err
 		}
 	}
 	if x.B10 != 0 {
-		if err := enc.NextField("B10"); err != nil {
-			return err
-		}
-		if err := x.B10.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueFloat("B10", __VDLType_float64_11, float64(x.B10)); err != nil {
 			return err
 		}
 	}
 	if x.B13 != "" {
-		if err := enc.NextField("B13"); err != nil {
-			return err
-		}
-		if err := x.B13.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueString("B13", __VDLType_string_12, string(x.B13)); err != nil {
 			return err
 		}
 	}
@@ -2201,11 +1772,11 @@
 	if err := enc.StartValue(__VDLType_array_22); err != nil {
 		return err
 	}
-	for i := 0; i < 2; i++ {
+	for _, elem := range x {
 		if err := enc.NextEntry(false); err != nil {
 			return err
 		}
-		if err := x[i].VDLWrite(enc); err != nil {
+		if err := elem.VDLWrite(enc); err != nil {
 			return err
 		}
 	}
@@ -2329,11 +1900,11 @@
 	if err := enc.SetLenHint(len(x)); err != nil {
 		return err
 	}
-	for i := 0; i < len(x); i++ {
+	for _, elem := range x {
 		if err := enc.NextEntry(false); err != nil {
 			return err
 		}
-		if err := x[i].VDLWrite(enc); err != nil {
+		if err := elem.VDLWrite(enc); err != nil {
 			return err
 		}
 	}
@@ -2372,16 +1943,7 @@
 		return err
 	}
 	for key, elem := range x {
-		if err := enc.NextEntry(false); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(key); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextEntryValueString(vdl.StringType, key); err != nil {
 			return err
 		}
 		if err := elem.VDLWrite(enc); err != nil {
@@ -2554,11 +2116,11 @@
 	if err := enc.StartValue(__VDLType_array_27); err != nil {
 		return err
 	}
-	for i := 0; i < 2; i++ {
+	for _, elem := range x {
 		if err := enc.NextEntry(false); err != nil {
 			return err
 		}
-		if err := x[i].VDLWrite(enc); err != nil {
+		if err := elem.VDLWrite(enc); err != nil {
 			return err
 		}
 	}
@@ -2682,11 +2244,11 @@
 	if err := enc.SetLenHint(len(x)); err != nil {
 		return err
 	}
-	for i := 0; i < len(x); i++ {
+	for _, elem := range x {
 		if err := enc.NextEntry(false); err != nil {
 			return err
 		}
-		if err := x[i].VDLWrite(enc); err != nil {
+		if err := elem.VDLWrite(enc); err != nil {
 			return err
 		}
 	}
@@ -2704,16 +2266,7 @@
 		return err
 	}
 	for key, elem := range x {
-		if err := enc.NextEntry(false); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(key); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextEntryValueString(vdl.StringType, key); err != nil {
 			return err
 		}
 		if err := elem.VDLWrite(enc); err != nil {
@@ -2757,11 +2310,11 @@
 	if err := enc.SetLenHint(len(x)); err != nil {
 		return err
 	}
-	for i := 0; i < len(x); i++ {
+	for _, elem := range x {
 		if err := enc.NextEntry(false); err != nil {
 			return err
 		}
-		if err := __VDLWriteAnon_map_5(enc, x[i]); err != nil {
+		if err := __VDLWriteAnon_map_5(enc, elem); err != nil {
 			return err
 		}
 	}
@@ -3002,30 +2555,12 @@
 		return err
 	}
 	if x.A != 0 {
-		if err := enc.NextField("A"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Int32Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeInt(int64(x.A)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueInt("A", vdl.Int32Type, int64(x.A)); err != nil {
 			return err
 		}
 	}
 	if x.B != 0 {
-		if err := enc.NextField("B"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Int32Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeInt(int64(x.B)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueInt("B", vdl.Int32Type, int64(x.B)); err != nil {
 			return err
 		}
 	}
diff --git a/lib/vdl/testdata/nativedep/nativedep.vdl.go b/lib/vdl/testdata/nativedep/nativedep.vdl.go
index d918c24..7a82dd0 100644
--- a/lib/vdl/testdata/nativedep/nativedep.vdl.go
+++ b/lib/vdl/testdata/nativedep/nativedep.vdl.go
@@ -52,50 +52,38 @@
 		return err
 	}
 	if x.A != "" {
-		if err := enc.NextField("A"); err != nil {
-			return err
-		}
 		var wire nativetest_2.WireString
 		if err := nativetest_2.WireStringFromNative(&wire, x.A); err != nil {
 			return err
 		}
-		if err := wire.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueInt("A", __VDLType_int32_2, int64(wire)); err != nil {
 			return err
 		}
 	}
 	if !x.B.IsZero() {
-		if err := enc.NextField("B"); err != nil {
-			return err
-		}
 		var wire nativetest_2.WireTime
 		if err := nativetest_2.WireTimeFromNative(&wire, x.B); err != nil {
 			return err
 		}
-		if err := wire.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueInt("B", __VDLType_int32_3, int64(wire)); err != nil {
 			return err
 		}
 	}
 	if x.C != "" {
-		if err := enc.NextField("C"); err != nil {
-			return err
-		}
 		var wire nativetest_2.WireSamePkg
 		if err := nativetest_2.WireSamePkgFromNative(&wire, x.C); err != nil {
 			return err
 		}
-		if err := wire.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueInt("C", __VDLType_int32_4, int64(wire)); err != nil {
 			return err
 		}
 	}
 	if x.D != nil {
-		if err := enc.NextField("D"); err != nil {
-			return err
-		}
 		var wire nativetest_2.WireMultiImport
 		if err := nativetest_2.WireMultiImportFromNative(&wire, x.D); err != nil {
 			return err
 		}
-		if err := wire.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueInt("D", __VDLType_int32_5, int64(wire)); err != nil {
 			return err
 		}
 	}
diff --git a/lib/vdl/testdata/nativedep2/nativedep2.vdl.go b/lib/vdl/testdata/nativedep2/nativedep2.vdl.go
index 151041e..e54df92 100644
--- a/lib/vdl/testdata/nativedep2/nativedep2.vdl.go
+++ b/lib/vdl/testdata/nativedep2/nativedep2.vdl.go
@@ -30,13 +30,10 @@
 }
 
 func (x MyTime) VDLWrite(enc vdl.Encoder) error {
-	if err := enc.StartValue(__VDLType_int32_1); err != nil {
+	if err := enc.WriteValueInt(__VDLType_int32_1, int64(x)); err != nil {
 		return err
 	}
-	if err := enc.EncodeInt(int64(x)); err != nil {
-		return err
-	}
-	return enc.FinishValue()
+	return nil
 }
 
 func (x *MyTime) VDLRead(dec vdl.Decoder) error {
diff --git a/lib/vdl/testdata/nativetest/nativetest.vdl.go b/lib/vdl/testdata/nativetest/nativetest.vdl.go
index 04b85fd..de68a53 100644
--- a/lib/vdl/testdata/nativetest/nativetest.vdl.go
+++ b/lib/vdl/testdata/nativetest/nativetest.vdl.go
@@ -31,13 +31,10 @@
 }
 
 func (x WireString) VDLWrite(enc vdl.Encoder) error {
-	if err := enc.StartValue(__VDLType_int32_1); err != nil {
+	if err := enc.WriteValueInt(__VDLType_int32_1, int64(x)); err != nil {
 		return err
 	}
-	if err := enc.EncodeInt(int64(x)); err != nil {
-		return err
-	}
-	return enc.FinishValue()
+	return nil
 }
 
 func (x *WireString) VDLRead(dec vdl.Decoder) error {
@@ -62,13 +59,10 @@
 }
 
 func (x WireTime) VDLWrite(enc vdl.Encoder) error {
-	if err := enc.StartValue(__VDLType_int32_2); err != nil {
+	if err := enc.WriteValueInt(__VDLType_int32_2, int64(x)); err != nil {
 		return err
 	}
-	if err := enc.EncodeInt(int64(x)); err != nil {
-		return err
-	}
-	return enc.FinishValue()
+	return nil
 }
 
 func (x *WireTime) VDLRead(dec vdl.Decoder) error {
@@ -93,13 +87,10 @@
 }
 
 func (x WireSamePkg) VDLWrite(enc vdl.Encoder) error {
-	if err := enc.StartValue(__VDLType_int32_3); err != nil {
+	if err := enc.WriteValueInt(__VDLType_int32_3, int64(x)); err != nil {
 		return err
 	}
-	if err := enc.EncodeInt(int64(x)); err != nil {
-		return err
-	}
-	return enc.FinishValue()
+	return nil
 }
 
 func (x *WireSamePkg) VDLRead(dec vdl.Decoder) error {
@@ -124,13 +115,10 @@
 }
 
 func (x WireMultiImport) VDLWrite(enc vdl.Encoder) error {
-	if err := enc.StartValue(__VDLType_int32_4); err != nil {
+	if err := enc.WriteValueInt(__VDLType_int32_4, int64(x)); err != nil {
 		return err
 	}
-	if err := enc.EncodeInt(int64(x)); err != nil {
-		return err
-	}
-	return enc.FinishValue()
+	return nil
 }
 
 func (x *WireMultiImport) VDLRead(dec vdl.Decoder) error {
@@ -155,13 +143,10 @@
 }
 
 func (x WireRenameMe) VDLWrite(enc vdl.Encoder) error {
-	if err := enc.StartValue(__VDLType_int32_5); err != nil {
+	if err := enc.WriteValueInt(__VDLType_int32_5, int64(x)); err != nil {
 		return err
 	}
-	if err := enc.EncodeInt(int64(x)); err != nil {
-		return err
-	}
-	return enc.FinishValue()
+	return nil
 }
 
 func (x *WireRenameMe) VDLRead(dec vdl.Decoder) error {
@@ -211,58 +196,43 @@
 		return err
 	}
 	if x.A != "" {
-		if err := enc.NextField("A"); err != nil {
-			return err
-		}
 		var wire WireString
 		if err := WireStringFromNative(&wire, x.A); err != nil {
 			return err
 		}
-		if err := wire.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueInt("A", __VDLType_int32_1, int64(wire)); err != nil {
 			return err
 		}
 	}
 	if !x.B.IsZero() {
-		if err := enc.NextField("B"); err != nil {
-			return err
-		}
 		var wire WireTime
 		if err := WireTimeFromNative(&wire, x.B); err != nil {
 			return err
 		}
-		if err := wire.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueInt("B", __VDLType_int32_2, int64(wire)); err != nil {
 			return err
 		}
 	}
 	if x.C != "" {
-		if err := enc.NextField("C"); err != nil {
-			return err
-		}
 		var wire WireSamePkg
 		if err := WireSamePkgFromNative(&wire, x.C); err != nil {
 			return err
 		}
-		if err := wire.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueInt("C", __VDLType_int32_3, int64(wire)); err != nil {
 			return err
 		}
 	}
 	if x.D != nil {
-		if err := enc.NextField("D"); err != nil {
-			return err
-		}
 		var wire WireMultiImport
 		if err := WireMultiImportFromNative(&wire, x.D); err != nil {
 			return err
 		}
-		if err := wire.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueInt("D", __VDLType_int32_4, int64(wire)); err != nil {
 			return err
 		}
 	}
 	if x.E != 0 {
-		if err := enc.NextField("E"); err != nil {
-			return err
-		}
-		if err := x.E.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueInt("E", __VDLType_int32_5, int64(x.E)); err != nil {
 			return err
 		}
 	}
@@ -344,13 +314,10 @@
 }
 
 func (x ignoreme) VDLWrite(enc vdl.Encoder) error {
-	if err := enc.StartValue(__VDLType_string_7); err != nil {
+	if err := enc.WriteValueString(__VDLType_string_7, string(x)); err != nil {
 		return err
 	}
-	if err := enc.EncodeString(string(x)); err != nil {
-		return err
-	}
-	return enc.FinishValue()
+	return nil
 }
 
 func (x *ignoreme) VDLRead(dec vdl.Decoder) error {
diff --git a/runtime/internal/flow/conn/conn.vdl.go b/runtime/internal/flow/conn/conn.vdl.go
index c116e01..9af7f6e 100644
--- a/runtime/internal/flow/conn/conn.vdl.go
+++ b/runtime/internal/flow/conn/conn.vdl.go
@@ -63,16 +63,7 @@
 		}
 	}
 	if x.BKey != 0 {
-		if err := enc.NextField("BKey"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(x.BKey); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("BKey", vdl.Uint64Type, x.BKey); err != nil {
 			return err
 		}
 	}
@@ -157,16 +148,7 @@
 		}
 	}
 	if x.BKey != 0 {
-		if err := enc.NextField("BKey"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(x.BKey); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("BKey", vdl.Uint64Type, x.BKey); err != nil {
 			return err
 		}
 	}
@@ -183,11 +165,11 @@
 	if err := enc.SetLenHint(len(x)); err != nil {
 		return err
 	}
-	for i := 0; i < len(x); i++ {
+	for _, elem := range x {
 		if err := enc.NextEntry(false); err != nil {
 			return err
 		}
-		if err := x[i].VDLWrite(enc); err != nil {
+		if err := elem.VDLWrite(enc); err != nil {
 			return err
 		}
 	}
@@ -297,30 +279,12 @@
 		}
 	}
 	if x.DKey != 0 {
-		if err := enc.NextField("DKey"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(x.DKey); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("DKey", vdl.Uint64Type, x.DKey); err != nil {
 			return err
 		}
 	}
 	if x.BKey != 0 {
-		if err := enc.NextField("BKey"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(x.BKey); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("BKey", vdl.Uint64Type, x.BKey); err != nil {
 			return err
 		}
 	}
@@ -337,12 +301,12 @@
 	if err := enc.SetLenHint(len(x)); err != nil {
 		return err
 	}
-	for i := 0; i < len(x); i++ {
+	for _, elem := range x {
 		if err := enc.NextEntry(false); err != nil {
 			return err
 		}
 		var wire security.WireDischarge
-		if err := security.WireDischargeFromNative(&wire, x[i]); err != nil {
+		if err := security.WireDischargeFromNative(&wire, elem); err != nil {
 			return err
 		}
 		switch {
@@ -476,30 +440,12 @@
 		}
 	}
 	if x.DKey != 0 {
-		if err := enc.NextField("DKey"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(x.DKey); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("DKey", vdl.Uint64Type, x.DKey); err != nil {
 			return err
 		}
 	}
 	if x.BKey != 0 {
-		if err := enc.NextField("BKey"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(x.BKey); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("BKey", vdl.Uint64Type, x.BKey); err != nil {
 			return err
 		}
 	}
diff --git a/runtime/internal/rpc/stress/stress.vdl.go b/runtime/internal/rpc/stress/stress.vdl.go
index 784129a..a49195f 100644
--- a/runtime/internal/rpc/stress/stress.vdl.go
+++ b/runtime/internal/rpc/stress/stress.vdl.go
@@ -50,44 +50,17 @@
 		return err
 	}
 	if x.ABool {
-		if err := enc.NextField("ABool"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.BoolType); err != nil {
-			return err
-		}
-		if err := enc.EncodeBool(x.ABool); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueBool("ABool", vdl.BoolType, x.ABool); err != nil {
 			return err
 		}
 	}
 	if x.AInt64 != 0 {
-		if err := enc.NextField("AInt64"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Int64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeInt(x.AInt64); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueInt("AInt64", vdl.Int64Type, x.AInt64); err != nil {
 			return err
 		}
 	}
 	if len(x.AListOfBytes) != 0 {
-		if err := enc.NextField("AListOfBytes"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(__VDLType_list_2); err != nil {
-			return err
-		}
-		if err := enc.EncodeBytes(x.AListOfBytes); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueBytes("AListOfBytes", __VDLType_list_2, x.AListOfBytes); err != nil {
 			return err
 		}
 	}
@@ -157,58 +130,22 @@
 		return err
 	}
 	if x.SumCount != 0 {
-		if err := enc.NextField("SumCount"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(x.SumCount); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("SumCount", vdl.Uint64Type, x.SumCount); err != nil {
 			return err
 		}
 	}
 	if x.SumStreamCount != 0 {
-		if err := enc.NextField("SumStreamCount"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(x.SumStreamCount); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("SumStreamCount", vdl.Uint64Type, x.SumStreamCount); err != nil {
 			return err
 		}
 	}
 	if x.BytesRecv != 0 {
-		if err := enc.NextField("BytesRecv"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(x.BytesRecv); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("BytesRecv", vdl.Uint64Type, x.BytesRecv); err != nil {
 			return err
 		}
 	}
 	if x.BytesSent != 0 {
-		if err := enc.NextField("BytesSent"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(x.BytesSent); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("BytesSent", vdl.Uint64Type, x.BytesSent); err != nil {
 			return err
 		}
 	}
diff --git a/runtime/protocols/vine/vine.vdl.go b/runtime/protocols/vine/vine.vdl.go
index eb70949..8c066d8 100644
--- a/runtime/protocols/vine/vine.vdl.go
+++ b/runtime/protocols/vine/vine.vdl.go
@@ -41,30 +41,12 @@
 		return err
 	}
 	if x.Dialer != "" {
-		if err := enc.NextField("Dialer"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.Dialer); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("Dialer", vdl.StringType, x.Dialer); err != nil {
 			return err
 		}
 	}
 	if x.Acceptor != "" {
-		if err := enc.NextField("Acceptor"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.Acceptor); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("Acceptor", vdl.StringType, x.Acceptor); err != nil {
 			return err
 		}
 	}
@@ -136,30 +118,12 @@
 		return err
 	}
 	if x.Reachable {
-		if err := enc.NextField("Reachable"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.BoolType); err != nil {
-			return err
-		}
-		if err := enc.EncodeBool(x.Reachable); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueBool("Reachable", vdl.BoolType, x.Reachable); err != nil {
 			return err
 		}
 	}
 	if x.Discoverable {
-		if err := enc.NextField("Discoverable"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.BoolType); err != nil {
-			return err
-		}
-		if err := enc.EncodeBool(x.Discoverable); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueBool("Discoverable", vdl.BoolType, x.Discoverable); err != nil {
 			return err
 		}
 	}
diff --git a/services/agent/agent.vdl.go b/services/agent/agent.vdl.go
index 79e1556..be243ef 100644
--- a/services/agent/agent.vdl.go
+++ b/services/agent/agent.vdl.go
@@ -70,30 +70,12 @@
 		return err
 	}
 	if x.MinVersion != 0 {
-		if err := enc.NextField("MinVersion"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Int32Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeInt(int64(x.MinVersion)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueInt("MinVersion", vdl.Int32Type, int64(x.MinVersion)); err != nil {
 			return err
 		}
 	}
 	if x.MaxVersion != 0 {
-		if err := enc.NextField("MaxVersion"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Int32Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeInt(int64(x.MaxVersion)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueInt("MaxVersion", vdl.Int32Type, int64(x.MaxVersion)); err != nil {
 			return err
 		}
 	}
@@ -158,44 +140,17 @@
 		return err
 	}
 	if x.Id != 0 {
-		if err := enc.NextField("Id"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(x.Id); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("Id", vdl.Uint64Type, x.Id); err != nil {
 			return err
 		}
 	}
 	if x.Method != "" {
-		if err := enc.NextField("Method"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.Method); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("Method", vdl.StringType, x.Method); err != nil {
 			return err
 		}
 	}
 	if x.NumArgs != 0 {
-		if err := enc.NextField("NumArgs"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint32Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(uint64(x.NumArgs)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("NumArgs", vdl.Uint32Type, uint64(x.NumArgs)); err != nil {
 			return err
 		}
 	}
@@ -267,16 +222,7 @@
 		return err
 	}
 	if x.Id != 0 {
-		if err := enc.NextField("Id"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(x.Id); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("Id", vdl.Uint64Type, x.Id); err != nil {
 			return err
 		}
 	}
@@ -289,16 +235,7 @@
 		}
 	}
 	if x.NumArgs != 0 {
-		if err := enc.NextField("NumArgs"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint32Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(uint64(x.NumArgs)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("NumArgs", vdl.Uint32Type, uint64(x.NumArgs)); err != nil {
 			return err
 		}
 	}
diff --git a/services/ben/ben.vdl.go b/services/ben/ben.vdl.go
index 4914aee..74cc45a 100644
--- a/services/ben/ben.vdl.go
+++ b/services/ben/ben.vdl.go
@@ -41,44 +41,17 @@
 		return err
 	}
 	if x.Architecture != "" {
-		if err := enc.NextField("Architecture"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.Architecture); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("Architecture", vdl.StringType, x.Architecture); err != nil {
 			return err
 		}
 	}
 	if x.Description != "" {
-		if err := enc.NextField("Description"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.Description); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("Description", vdl.StringType, x.Description); err != nil {
 			return err
 		}
 	}
 	if x.ClockSpeedMhz != 0 {
-		if err := enc.NextField("ClockSpeedMhz"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint32Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(uint64(x.ClockSpeedMhz)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("ClockSpeedMhz", vdl.Uint32Type, uint64(x.ClockSpeedMhz)); err != nil {
 			return err
 		}
 	}
@@ -150,30 +123,12 @@
 		return err
 	}
 	if x.Name != "" {
-		if err := enc.NextField("Name"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.Name); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("Name", vdl.StringType, x.Name); err != nil {
 			return err
 		}
 	}
 	if x.Version != "" {
-		if err := enc.NextField("Version"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.Version); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("Version", vdl.StringType, x.Version); err != nil {
 			return err
 		}
 	}
@@ -255,16 +210,7 @@
 		}
 	}
 	if x.Label != "" {
-		if err := enc.NextField("Label"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.Label); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("Label", vdl.StringType, x.Label); err != nil {
 			return err
 		}
 	}
@@ -328,13 +274,10 @@
 }
 
 func (x SourceCode) VDLWrite(enc vdl.Encoder) error {
-	if err := enc.StartValue(__VDLType_string_4); err != nil {
+	if err := enc.WriteValueString(__VDLType_string_4, string(x)); err != nil {
 		return err
 	}
-	if err := enc.EncodeString(string(x)); err != nil {
-		return err
-	}
-	return enc.FinishValue()
+	return nil
 }
 
 func (x *SourceCode) VDLRead(dec vdl.Decoder) error {
@@ -372,100 +315,37 @@
 		return err
 	}
 	if x.Name != "" {
-		if err := enc.NextField("Name"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.Name); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("Name", vdl.StringType, x.Name); err != nil {
 			return err
 		}
 	}
 	if x.Iterations != 0 {
-		if err := enc.NextField("Iterations"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(x.Iterations); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("Iterations", vdl.Uint64Type, x.Iterations); err != nil {
 			return err
 		}
 	}
 	if x.NanoSecsPerOp != 0 {
-		if err := enc.NextField("NanoSecsPerOp"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Float64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeFloat(x.NanoSecsPerOp); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueFloat("NanoSecsPerOp", vdl.Float64Type, x.NanoSecsPerOp); err != nil {
 			return err
 		}
 	}
 	if x.AllocsPerOp != 0 {
-		if err := enc.NextField("AllocsPerOp"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(x.AllocsPerOp); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("AllocsPerOp", vdl.Uint64Type, x.AllocsPerOp); err != nil {
 			return err
 		}
 	}
 	if x.AllocedBytesPerOp != 0 {
-		if err := enc.NextField("AllocedBytesPerOp"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(x.AllocedBytesPerOp); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("AllocedBytesPerOp", vdl.Uint64Type, x.AllocedBytesPerOp); err != nil {
 			return err
 		}
 	}
 	if x.MegaBytesPerSec != 0 {
-		if err := enc.NextField("MegaBytesPerSec"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Float64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeFloat(x.MegaBytesPerSec); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueFloat("MegaBytesPerSec", vdl.Float64Type, x.MegaBytesPerSec); err != nil {
 			return err
 		}
 	}
 	if x.Parallelism != 0 {
-		if err := enc.NextField("Parallelism"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint32Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(uint64(x.Parallelism)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("Parallelism", vdl.Uint32Type, uint64(x.Parallelism)); err != nil {
 			return err
 		}
 	}
diff --git a/services/groups/internal/server/server.vdl.go b/services/groups/internal/server/server.vdl.go
index 4703d82..bb8fbd9 100644
--- a/services/groups/internal/server/server.vdl.go
+++ b/services/groups/internal/server/server.vdl.go
@@ -74,10 +74,7 @@
 		return err
 	}
 	for key := range x {
-		if err := enc.NextEntry(false); err != nil {
-			return err
-		}
-		if err := key.VDLWrite(enc); err != nil {
+		if err := enc.NextEntryValueString(__VDLType_string_4, string(key)); err != nil {
 			return err
 		}
 	}
diff --git a/services/identity/identity.vdl.go b/services/identity/identity.vdl.go
index 3f0e99b6..22150e1 100644
--- a/services/identity/identity.vdl.go
+++ b/services/identity/identity.vdl.go
@@ -58,16 +58,7 @@
 		}
 	}
 	if x.PublicKey != "" {
-		if err := enc.NextField("PublicKey"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.PublicKey); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("PublicKey", vdl.StringType, x.PublicKey); err != nil {
 			return err
 		}
 	}
@@ -84,17 +75,8 @@
 	if err := enc.SetLenHint(len(x)); err != nil {
 		return err
 	}
-	for i := 0; i < len(x); i++ {
-		if err := enc.NextEntry(false); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x[i]); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+	for _, elem := range x {
+		if err := enc.NextEntryValueString(vdl.StringType, elem); err != nil {
 			return err
 		}
 	}
diff --git a/services/profile/profile.vdl.go b/services/profile/profile.vdl.go
index f22bcb2..c63ecfe 100644
--- a/services/profile/profile.vdl.go
+++ b/services/profile/profile.vdl.go
@@ -42,44 +42,17 @@
 		return err
 	}
 	if x.Name != "" {
-		if err := enc.NextField("Name"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.Name); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("Name", vdl.StringType, x.Name); err != nil {
 			return err
 		}
 	}
 	if x.MajorVersion != "" {
-		if err := enc.NextField("MajorVersion"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.MajorVersion); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("MajorVersion", vdl.StringType, x.MajorVersion); err != nil {
 			return err
 		}
 	}
 	if x.MinorVersion != "" {
-		if err := enc.NextField("MinorVersion"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.MinorVersion); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("MinorVersion", vdl.StringType, x.MinorVersion); err != nil {
 			return err
 		}
 	}
@@ -181,54 +154,27 @@
 		return err
 	}
 	if x.Label != "" {
-		if err := enc.NextField("Label"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.Label); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("Label", vdl.StringType, x.Label); err != nil {
 			return err
 		}
 	}
 	if x.Description != "" {
-		if err := enc.NextField("Description"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.Description); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("Description", vdl.StringType, x.Description); err != nil {
 			return err
 		}
 	}
 	if x.Arch != build.ArchitectureAmd64 {
-		if err := enc.NextField("Arch"); err != nil {
-			return err
-		}
-		if err := x.Arch.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueString("Arch", __VDLType_enum_3, x.Arch.String()); err != nil {
 			return err
 		}
 	}
 	if x.Os != build.OperatingSystemDarwin {
-		if err := enc.NextField("Os"); err != nil {
-			return err
-		}
-		if err := x.Os.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueString("Os", __VDLType_enum_4, x.Os.String()); err != nil {
 			return err
 		}
 	}
 	if x.Format != build.FormatElf {
-		if err := enc.NextField("Format"); err != nil {
-			return err
-		}
-		if err := x.Format.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueString("Format", __VDLType_enum_5, x.Format.String()); err != nil {
 			return err
 		}
 	}
diff --git a/services/role/roled/internal/internal.vdl.go b/services/role/roled/internal/internal.vdl.go
index 16f720c..f3334e3 100644
--- a/services/role/roled/internal/internal.vdl.go
+++ b/services/role/roled/internal/internal.vdl.go
@@ -94,44 +94,17 @@
 		}
 	}
 	if x.Extend {
-		if err := enc.NextField("Extend"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.BoolType); err != nil {
-			return err
-		}
-		if err := enc.EncodeBool(x.Extend); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueBool("Extend", vdl.BoolType, x.Extend); err != nil {
 			return err
 		}
 	}
 	if x.Audit {
-		if err := enc.NextField("Audit"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.BoolType); err != nil {
-			return err
-		}
-		if err := enc.EncodeBool(x.Audit); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueBool("Audit", vdl.BoolType, x.Audit); err != nil {
 			return err
 		}
 	}
 	if x.Expiry != "" {
-		if err := enc.NextField("Expiry"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.Expiry); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("Expiry", vdl.StringType, x.Expiry); err != nil {
 			return err
 		}
 	}
@@ -156,17 +129,8 @@
 	if err := enc.SetLenHint(len(x)); err != nil {
 		return err
 	}
-	for i := 0; i < len(x); i++ {
-		if err := enc.NextEntry(false); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x[i]); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+	for _, elem := range x {
+		if err := enc.NextEntryValueString(vdl.StringType, elem); err != nil {
 			return err
 		}
 	}
@@ -183,11 +147,8 @@
 	if err := enc.SetLenHint(len(x)); err != nil {
 		return err
 	}
-	for i := 0; i < len(x); i++ {
-		if err := enc.NextEntry(false); err != nil {
-			return err
-		}
-		if err := x[i].VDLWrite(enc); err != nil {
+	for _, elem := range x {
+		if err := enc.NextEntryValueString(__VDLType_string_4, string(elem)); err != nil {
 			return err
 		}
 	}
diff --git a/services/stats/stats.vdl.go b/services/stats/stats.vdl.go
index 6378b82..fb699ec 100644
--- a/services/stats/stats.vdl.go
+++ b/services/stats/stats.vdl.go
@@ -39,30 +39,12 @@
 		return err
 	}
 	if x.LowBound != 0 {
-		if err := enc.NextField("LowBound"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Int64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeInt(x.LowBound); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueInt("LowBound", vdl.Int64Type, x.LowBound); err != nil {
 			return err
 		}
 	}
 	if x.Count != 0 {
-		if err := enc.NextField("Count"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Int64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeInt(x.Count); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueInt("Count", vdl.Int64Type, x.Count); err != nil {
 			return err
 		}
 	}
@@ -150,58 +132,22 @@
 		return err
 	}
 	if x.Count != 0 {
-		if err := enc.NextField("Count"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Int64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeInt(x.Count); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueInt("Count", vdl.Int64Type, x.Count); err != nil {
 			return err
 		}
 	}
 	if x.Sum != 0 {
-		if err := enc.NextField("Sum"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Int64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeInt(x.Sum); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueInt("Sum", vdl.Int64Type, x.Sum); err != nil {
 			return err
 		}
 	}
 	if x.Min != 0 {
-		if err := enc.NextField("Min"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Int64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeInt(x.Min); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueInt("Min", vdl.Int64Type, x.Min); err != nil {
 			return err
 		}
 	}
 	if x.Max != 0 {
-		if err := enc.NextField("Max"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Int64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeInt(x.Max); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueInt("Max", vdl.Int64Type, x.Max); err != nil {
 			return err
 		}
 	}
@@ -226,11 +172,11 @@
 	if err := enc.SetLenHint(len(x)); err != nil {
 		return err
 	}
-	for i := 0; i < len(x); i++ {
+	for _, elem := range x {
 		if err := enc.NextEntry(false); err != nil {
 			return err
 		}
-		if err := x[i].VDLWrite(enc); err != nil {
+		if err := elem.VDLWrite(enc); err != nil {
 			return err
 		}
 	}
diff --git a/services/syncbase/server/interfaces/interfaces.vdl.go b/services/syncbase/server/interfaces/interfaces.vdl.go
index c1f7cb3..22bc11f 100644
--- a/services/syncbase/server/interfaces/interfaces.vdl.go
+++ b/services/syncbase/server/interfaces/interfaces.vdl.go
@@ -49,25 +49,10 @@
 		return err
 	}
 	for key, elem := range x {
-		if err := enc.NextEntry(false); err != nil {
+		if err := enc.NextEntryValueUint(vdl.Uint64Type, key); err != nil {
 			return err
 		}
-		if err := enc.StartValue(vdl.Uint64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(key); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(elem); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.WriteValueUint(vdl.Uint64Type, elem); err != nil {
 			return err
 		}
 	}
@@ -130,16 +115,7 @@
 		return err
 	}
 	for key, elem := range x {
-		if err := enc.NextEntry(false); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(key); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextEntryValueString(vdl.StringType, key); err != nil {
 			return err
 		}
 		if err := elem.VDLWrite(enc); err != nil {
@@ -247,72 +223,27 @@
 		return err
 	}
 	if x.Id != 0 {
-		if err := enc.NextField("Id"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(x.Id); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("Id", vdl.Uint64Type, x.Id); err != nil {
 			return err
 		}
 	}
 	if x.Gen != 0 {
-		if err := enc.NextField("Gen"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(x.Gen); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("Gen", vdl.Uint64Type, x.Gen); err != nil {
 			return err
 		}
 	}
 	if x.RecType != 0 {
-		if err := enc.NextField("RecType"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.ByteType); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(uint64(x.RecType)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("RecType", vdl.ByteType, uint64(x.RecType)); err != nil {
 			return err
 		}
 	}
 	if x.ObjId != "" {
-		if err := enc.NextField("ObjId"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.ObjId); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("ObjId", vdl.StringType, x.ObjId); err != nil {
 			return err
 		}
 	}
 	if x.CurVers != "" {
-		if err := enc.NextField("CurVers"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.CurVers); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("CurVers", vdl.StringType, x.CurVers); err != nil {
 			return err
 		}
 	}
@@ -337,44 +268,17 @@
 		}
 	}
 	if x.Delete {
-		if err := enc.NextField("Delete"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.BoolType); err != nil {
-			return err
-		}
-		if err := enc.EncodeBool(x.Delete); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueBool("Delete", vdl.BoolType, x.Delete); err != nil {
 			return err
 		}
 	}
 	if x.BatchId != 0 {
-		if err := enc.NextField("BatchId"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(x.BatchId); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("BatchId", vdl.Uint64Type, x.BatchId); err != nil {
 			return err
 		}
 	}
 	if x.BatchCount != 0 {
-		if err := enc.NextField("BatchCount"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(x.BatchCount); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("BatchCount", vdl.Uint64Type, x.BatchCount); err != nil {
 			return err
 		}
 	}
@@ -391,17 +295,8 @@
 	if err := enc.SetLenHint(len(x)); err != nil {
 		return err
 	}
-	for i := 0; i < len(x); i++ {
-		if err := enc.NextEntry(false); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x[i]); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+	for _, elem := range x {
+		if err := enc.NextEntryValueString(vdl.StringType, elem); err != nil {
 			return err
 		}
 	}
@@ -615,13 +510,10 @@
 }
 
 func (x GroupId) VDLWrite(enc vdl.Encoder) error {
-	if err := enc.StartValue(__VDLType_string_7); err != nil {
+	if err := enc.WriteValueString(__VDLType_string_7, string(x)); err != nil {
 		return err
 	}
-	if err := enc.EncodeString(string(x)); err != nil {
-		return err
-	}
-	return enc.FinishValue()
+	return nil
 }
 
 func (x *GroupId) VDLRead(dec vdl.Decoder) error {
@@ -693,13 +585,10 @@
 }
 
 func (x SyncgroupStatus) VDLWrite(enc vdl.Encoder) error {
-	if err := enc.StartValue(__VDLType_enum_8); err != nil {
+	if err := enc.WriteValueString(__VDLType_enum_8, x.String()); err != nil {
 		return err
 	}
-	if err := enc.EncodeString(x.String()); err != nil {
-		return err
-	}
-	return enc.FinishValue()
+	return nil
 }
 
 func (x *SyncgroupStatus) VDLRead(dec vdl.Decoder) error {
@@ -768,16 +657,7 @@
 		}
 	}
 	if x.SpecVersion != "" {
-		if err := enc.NextField("SpecVersion"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.SpecVersion); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("SpecVersion", vdl.StringType, x.SpecVersion); err != nil {
 			return err
 		}
 	}
@@ -790,16 +670,7 @@
 		}
 	}
 	if x.Creator != "" {
-		if err := enc.NextField("Creator"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.Creator); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("Creator", vdl.StringType, x.Creator); err != nil {
 			return err
 		}
 	}
@@ -812,10 +683,7 @@
 		}
 	}
 	if x.Status != SyncgroupStatusPublishPending {
-		if err := enc.NextField("Status"); err != nil {
-			return err
-		}
-		if err := x.Status.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueString("Status", __VDLType_enum_8, x.Status.String()); err != nil {
 			return err
 		}
 	}
@@ -841,16 +709,7 @@
 		return err
 	}
 	for key, elem := range x {
-		if err := enc.NextEntry(false); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(key); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextEntryValueString(vdl.StringType, key); err != nil {
 			return err
 		}
 		if err := elem.VDLWrite(enc); err != nil {
@@ -979,16 +838,7 @@
 		return err
 	}
 	for key, elem := range x {
-		if err := enc.NextEntry(false); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(key); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextEntryValueString(vdl.StringType, key); err != nil {
 			return err
 		}
 		if err := elem.VDLWrite(enc); err != nil {
@@ -1174,10 +1024,7 @@
 		return err
 	}
 	for key := range x {
-		if err := enc.NextEntry(false); err != nil {
-			return err
-		}
-		if err := key.VDLWrite(enc); err != nil {
+		if err := enc.NextEntryValueString(__VDLType_string_7, string(key)); err != nil {
 			return err
 		}
 	}
@@ -1509,30 +1356,12 @@
 		return err
 	}
 	if x.DevType != 0 {
-		if err := enc.NextField("DevType"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Int32Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeInt(int64(x.DevType)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueInt("DevType", vdl.Int32Type, int64(x.DevType)); err != nil {
 			return err
 		}
 	}
 	if x.Distance != 0 {
-		if err := enc.NextField("Distance"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Float32Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeFloat(float64(x.Distance)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueFloat("Distance", vdl.Float32Type, float64(x.Distance)); err != nil {
 			return err
 		}
 	}
@@ -1619,10 +1448,7 @@
 		return err
 	}
 	for key, elem := range x {
-		if err := enc.NextEntry(false); err != nil {
-			return err
-		}
-		if err := key.VDLWrite(enc); err != nil {
+		if err := enc.NextEntryValueString(__VDLType_string_7, string(key)); err != nil {
 			return err
 		}
 		if err := elem.VDLWrite(enc); err != nil {
@@ -1745,16 +1571,7 @@
 		return err
 	}
 	if len(x.Hash) != 0 {
-		if err := enc.NextField("Hash"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(__VDLType_list_25); err != nil {
-			return err
-		}
-		if err := enc.EncodeBytes(x.Hash); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueBytes("Hash", __VDLType_list_25, x.Hash); err != nil {
 			return err
 		}
 	}
@@ -1811,16 +1628,7 @@
 		return err
 	}
 	if len(x.Data) != 0 {
-		if err := enc.NextField("Data"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(__VDLType_list_25); err != nil {
-			return err
-		}
-		if err := enc.EncodeBytes(x.Data); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueBytes("Data", __VDLType_list_25, x.Data); err != nil {
 			return err
 		}
 	}
@@ -2020,30 +1828,12 @@
 		}
 	}
 	if x.NumReboots != 0 {
-		if err := enc.NextField("NumReboots"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint16Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(uint64(x.NumReboots)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("NumReboots", vdl.Uint16Type, uint64(x.NumReboots)); err != nil {
 			return err
 		}
 	}
 	if x.NumHops != 0 {
-		if err := enc.NextField("NumHops"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint16Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(uint64(x.NumHops)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("NumHops", vdl.Uint16Type, uint64(x.NumHops)); err != nil {
 			return err
 		}
 	}
@@ -2141,19 +1931,10 @@
 		return err
 	}
 	for key, elem := range x {
-		if err := enc.NextEntry(false); err != nil {
+		if err := enc.NextEntryValueString(__VDLType_string_7, string(key)); err != nil {
 			return err
 		}
-		if err := key.VDLWrite(enc); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Int32Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeInt(int64(elem)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.WriteValueInt(vdl.Int32Type, int64(elem)); err != nil {
 			return err
 		}
 	}
@@ -2237,30 +2018,12 @@
 		}
 	}
 	if x.IsProxy {
-		if err := enc.NextField("IsProxy"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.BoolType); err != nil {
-			return err
-		}
-		if err := enc.EncodeBool(x.IsProxy); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueBool("IsProxy", vdl.BoolType, x.IsProxy); err != nil {
 			return err
 		}
 	}
 	if x.IsServer {
-		if err := enc.NextField("IsServer"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.BoolType); err != nil {
-			return err
-		}
-		if err := enc.EncodeBool(x.IsServer); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueBool("IsServer", vdl.BoolType, x.IsServer); err != nil {
 			return err
 		}
 	}
@@ -2333,16 +2096,7 @@
 		return err
 	}
 	for key, elem := range x {
-		if err := enc.NextEntry(false); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(key); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextEntryValueString(vdl.StringType, key); err != nil {
 			return err
 		}
 		if err := elem.VDLWrite(enc); err != nil {
diff --git a/services/syncbase/server/server.vdl.go b/services/syncbase/server/server.vdl.go
index 8eba6d5..6461580 100644
--- a/services/syncbase/server/server.vdl.go
+++ b/services/syncbase/server/server.vdl.go
@@ -44,16 +44,7 @@
 		return err
 	}
 	if x.Version != 0 {
-		if err := enc.NextField("Version"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(x.Version); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("Version", vdl.Uint64Type, x.Version); err != nil {
 			return err
 		}
 	}
@@ -135,30 +126,12 @@
 		}
 	}
 	if x.RootDir != "" {
-		if err := enc.NextField("RootDir"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.RootDir); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("RootDir", vdl.StringType, x.RootDir); err != nil {
 			return err
 		}
 	}
 	if x.Engine != "" {
-		if err := enc.NextField("Engine"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.Engine); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("Engine", vdl.StringType, x.Engine); err != nil {
 			return err
 		}
 	}
@@ -250,16 +223,7 @@
 		}
 	}
 	if x.Version != 0 {
-		if err := enc.NextField("Version"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(x.Version); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("Version", vdl.Uint64Type, x.Version); err != nil {
 			return err
 		}
 	}
@@ -276,11 +240,9 @@
 			return err
 		}
 		enc.SetNextStartValueIsOptional()
-
 		if err := x.SchemaMetadata.VDLWrite(enc); err != nil {
 			return err
 		}
-
 	}
 	if err := enc.NextField(""); err != nil {
 		return err
diff --git a/services/syncbase/signing/signing.vdl.go b/services/syncbase/signing/signing.vdl.go
index 40a8c7b..f8a1f94 100644
--- a/services/syncbase/signing/signing.vdl.go
+++ b/services/syncbase/signing/signing.vdl.go
@@ -81,16 +81,7 @@
 	if err := enc.StartValue(__VDLType_union_2); err != nil {
 		return err
 	}
-	if err := enc.NextField("Data"); err != nil {
-		return err
-	}
-	if err := enc.StartValue(__VDLType_list_1); err != nil {
-		return err
-	}
-	if err := enc.EncodeBytes(x.Value); err != nil {
-		return err
-	}
-	if err := enc.FinishValue(); err != nil {
+	if err := enc.NextFieldValueBytes("Data", __VDLType_list_1, x.Value); err != nil {
 		return err
 	}
 	if err := enc.NextField(""); err != nil {
@@ -103,16 +94,7 @@
 	if err := enc.StartValue(__VDLType_union_2); err != nil {
 		return err
 	}
-	if err := enc.NextField("Hash"); err != nil {
-		return err
-	}
-	if err := enc.StartValue(__VDLType_list_1); err != nil {
-		return err
-	}
-	if err := enc.EncodeBytes(x.Value); err != nil {
-		return err
-	}
-	if err := enc.FinishValue(); err != nil {
+	if err := enc.NextFieldValueBytes("Hash", __VDLType_list_1, x.Value); err != nil {
 		return err
 	}
 	if err := enc.NextField(""); err != nil {
@@ -236,16 +218,7 @@
 		}
 	}
 	if len(x.BlessingsHash) != 0 {
-		if err := enc.NextField("BlessingsHash"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(__VDLType_list_1); err != nil {
-			return err
-		}
-		if err := enc.EncodeBytes(x.BlessingsHash); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueBytes("BlessingsHash", __VDLType_list_1, x.BlessingsHash); err != nil {
 			return err
 		}
 	}
@@ -258,30 +231,12 @@
 		}
 	}
 	if x.IsValidated {
-		if err := enc.NextField("IsValidated"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.BoolType); err != nil {
-			return err
-		}
-		if err := enc.EncodeBool(x.IsValidated); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueBool("IsValidated", vdl.BoolType, x.IsValidated); err != nil {
 			return err
 		}
 	}
 	if len(x.ValidatorDataHash) != 0 {
-		if err := enc.NextField("ValidatorDataHash"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(__VDLType_list_1); err != nil {
-			return err
-		}
-		if err := enc.EncodeBytes(x.ValidatorDataHash); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueBytes("ValidatorDataHash", __VDLType_list_1, x.ValidatorDataHash); err != nil {
 			return err
 		}
 	}
@@ -306,18 +261,18 @@
 	if err := enc.SetLenHint(len(x)); err != nil {
 		return err
 	}
-	for i := 0; i < len(x); i++ {
+	for _, elem := range x {
 		if err := enc.NextEntry(false); err != nil {
 			return err
 		}
 		switch {
-		case x[i] == nil:
+		case elem == nil:
 			// Write the zero value of the union type.
 			if err := vdl.ZeroValue(__VDLType_union_2).VDLWrite(enc); err != nil {
 				return err
 			}
 		default:
-			if err := x[i].VDLWrite(enc); err != nil {
+			if err := elem.VDLWrite(enc); err != nil {
 				return err
 			}
 		}
@@ -436,16 +391,7 @@
 		}
 	}
 	if len(x.MarshalledPublicKey) != 0 {
-		if err := enc.NextField("MarshalledPublicKey"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(__VDLType_list_1); err != nil {
-			return err
-		}
-		if err := enc.EncodeBytes(x.MarshalledPublicKey); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueBytes("MarshalledPublicKey", __VDLType_list_1, x.MarshalledPublicKey); err != nil {
 			return err
 		}
 	}
@@ -462,17 +408,8 @@
 	if err := enc.SetLenHint(len(x)); err != nil {
 		return err
 	}
-	for i := 0; i < len(x); i++ {
-		if err := enc.NextEntry(false); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x[i]); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+	for _, elem := range x {
+		if err := enc.NextEntryValueString(vdl.StringType, elem); err != nil {
 			return err
 		}
 	}
diff --git a/services/syncbase/store/watchable/watchable.vdl.go b/services/syncbase/store/watchable/watchable.vdl.go
index fd0ea26..a2b7b2a 100644
--- a/services/syncbase/store/watchable/watchable.vdl.go
+++ b/services/syncbase/store/watchable/watchable.vdl.go
@@ -39,16 +39,7 @@
 		return err
 	}
 	if len(x.Key) != 0 {
-		if err := enc.NextField("Key"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(__VDLType_list_2); err != nil {
-			return err
-		}
-		if err := enc.EncodeBytes(x.Key); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueBytes("Key", __VDLType_list_2, x.Key); err != nil {
 			return err
 		}
 	}
@@ -109,30 +100,12 @@
 		return err
 	}
 	if len(x.Start) != 0 {
-		if err := enc.NextField("Start"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(__VDLType_list_2); err != nil {
-			return err
-		}
-		if err := enc.EncodeBytes(x.Start); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueBytes("Start", __VDLType_list_2, x.Start); err != nil {
 			return err
 		}
 	}
 	if len(x.Limit) != 0 {
-		if err := enc.NextField("Limit"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(__VDLType_list_2); err != nil {
-			return err
-		}
-		if err := enc.EncodeBytes(x.Limit); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueBytes("Limit", __VDLType_list_2, x.Limit); err != nil {
 			return err
 		}
 	}
@@ -199,30 +172,12 @@
 		return err
 	}
 	if len(x.Key) != 0 {
-		if err := enc.NextField("Key"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(__VDLType_list_2); err != nil {
-			return err
-		}
-		if err := enc.EncodeBytes(x.Key); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueBytes("Key", __VDLType_list_2, x.Key); err != nil {
 			return err
 		}
 	}
 	if len(x.Version) != 0 {
-		if err := enc.NextField("Version"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(__VDLType_list_2); err != nil {
-			return err
-		}
-		if err := enc.EncodeBytes(x.Version); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueBytes("Version", __VDLType_list_2, x.Version); err != nil {
 			return err
 		}
 	}
@@ -283,16 +238,7 @@
 		return err
 	}
 	if len(x.Key) != 0 {
-		if err := enc.NextField("Key"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(__VDLType_list_2); err != nil {
-			return err
-		}
-		if err := enc.EncodeBytes(x.Key); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueBytes("Key", __VDLType_list_2, x.Key); err != nil {
 			return err
 		}
 	}
@@ -380,44 +326,17 @@
 		}
 	}
 	if x.CommitTimestamp != 0 {
-		if err := enc.NextField("CommitTimestamp"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Int64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeInt(x.CommitTimestamp); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueInt("CommitTimestamp", vdl.Int64Type, x.CommitTimestamp); err != nil {
 			return err
 		}
 	}
 	if x.FromSync {
-		if err := enc.NextField("FromSync"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.BoolType); err != nil {
-			return err
-		}
-		if err := enc.EncodeBool(x.FromSync); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueBool("FromSync", vdl.BoolType, x.FromSync); err != nil {
 			return err
 		}
 	}
 	if x.Continued {
-		if err := enc.NextField("Continued"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.BoolType); err != nil {
-			return err
-		}
-		if err := enc.EncodeBool(x.Continued); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueBool("Continued", vdl.BoolType, x.Continued); err != nil {
 			return err
 		}
 	}
diff --git a/services/syncbase/vclock/vclock.vdl.go b/services/syncbase/vclock/vclock.vdl.go
index 71cba63..c0d7430 100644
--- a/services/syncbase/vclock/vclock.vdl.go
+++ b/services/syncbase/vclock/vclock.vdl.go
@@ -119,30 +119,12 @@
 		}
 	}
 	if x.NumReboots != 0 {
-		if err := enc.NextField("NumReboots"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint16Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(uint64(x.NumReboots)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("NumReboots", vdl.Uint16Type, uint64(x.NumReboots)); err != nil {
 			return err
 		}
 	}
 	if x.NumHops != 0 {
-		if err := enc.NextField("NumHops"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint16Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(uint64(x.NumHops)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("NumHops", vdl.Uint16Type, uint64(x.NumHops)); err != nil {
 			return err
 		}
 	}
diff --git a/services/syncbase/vsync/testdata/blobtestsvdl.vdl.go b/services/syncbase/vsync/testdata/blobtestsvdl.vdl.go
index 835dee9..cf407e1 100644
--- a/services/syncbase/vsync/testdata/blobtestsvdl.vdl.go
+++ b/services/syncbase/vsync/testdata/blobtestsvdl.vdl.go
@@ -38,24 +38,12 @@
 		return err
 	}
 	if x.Info != "" {
-		if err := enc.NextField("Info"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.Info); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("Info", vdl.StringType, x.Info); err != nil {
 			return err
 		}
 	}
 	if x.Br != "" {
-		if err := enc.NextField("Br"); err != nil {
-			return err
-		}
-		if err := x.Br.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueString("Br", __VDLType_string_2, string(x.Br)); err != nil {
 			return err
 		}
 	}
@@ -151,16 +139,7 @@
 	if err := enc.StartValue(__VDLType_union_3); err != nil {
 		return err
 	}
-	if err := enc.NextField("Num"); err != nil {
-		return err
-	}
-	if err := enc.StartValue(vdl.Int32Type); err != nil {
-		return err
-	}
-	if err := enc.EncodeInt(int64(x.Value)); err != nil {
-		return err
-	}
-	if err := enc.FinishValue(); err != nil {
+	if err := enc.NextFieldValueInt("Num", vdl.Int32Type, int64(x.Value)); err != nil {
 		return err
 	}
 	if err := enc.NextField(""); err != nil {
@@ -248,16 +227,7 @@
 		return err
 	}
 	if x.Info != "" {
-		if err := enc.NextField("Info"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.Info); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("Info", vdl.StringType, x.Info); err != nil {
 			return err
 		}
 	}
@@ -283,10 +253,7 @@
 		return err
 	}
 	for key := range x {
-		if err := enc.NextEntry(false); err != nil {
-			return err
-		}
-		if err := key.VDLWrite(enc); err != nil {
+		if err := enc.NextEntryValueString(__VDLType_string_2, string(key)); err != nil {
 			return err
 		}
 	}
@@ -377,16 +344,7 @@
 		return err
 	}
 	if x.Info != "" {
-		if err := enc.NextField("Info"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.Info); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("Info", vdl.StringType, x.Info); err != nil {
 			return err
 		}
 	}
@@ -411,16 +369,16 @@
 	if err := enc.SetLenHint(len(x)); err != nil {
 		return err
 	}
-	for i := 0; i < len(x); i++ {
+	for _, elem := range x {
 		if err := enc.NextEntry(false); err != nil {
 			return err
 		}
-		if x[i] == nil {
+		if elem == nil {
 			if err := enc.NilValue(vdl.AnyType); err != nil {
 				return err
 			}
 		} else {
-			if err := x[i].VDLWrite(enc); err != nil {
+			if err := elem.VDLWrite(enc); err != nil {
 				return err
 			}
 		}
@@ -514,16 +472,7 @@
 		return err
 	}
 	if x.Info != "" {
-		if err := enc.NextField("Info"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.Info); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("Info", vdl.StringType, x.Info); err != nil {
 			return err
 		}
 	}
@@ -549,16 +498,7 @@
 		return err
 	}
 	for key := range x {
-		if err := enc.NextEntry(false); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(key); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextEntryValueString(vdl.StringType, key); err != nil {
 			return err
 		}
 	}
@@ -643,16 +583,7 @@
 		return err
 	}
 	if x.Info != "" {
-		if err := enc.NextField("Info"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.Info); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("Info", vdl.StringType, x.Info); err != nil {
 			return err
 		}
 	}
@@ -661,11 +592,9 @@
 			return err
 		}
 		enc.SetNextStartValueIsOptional()
-
 		if err := x.Bo.VDLWrite(enc); err != nil {
 			return err
 		}
-
 	}
 	if err := enc.NextField(""); err != nil {
 		return err
diff --git a/services/syncbase/vsync/vsync.vdl.go b/services/syncbase/vsync/vsync.vdl.go
index 9640dcd..f66c573 100644
--- a/services/syncbase/vsync/vsync.vdl.go
+++ b/services/syncbase/vsync/vsync.vdl.go
@@ -36,16 +36,7 @@
 		return err
 	}
 	if x.Id != 0 {
-		if err := enc.NextField("Id"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(x.Id); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("Id", vdl.Uint64Type, x.Id); err != nil {
 			return err
 		}
 	}
@@ -129,16 +120,7 @@
 		}
 	}
 	if x.IsPaused {
-		if err := enc.NextField("IsPaused"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.BoolType); err != nil {
-			return err
-		}
-		if err := enc.EncodeBool(x.IsPaused); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueBool("IsPaused", vdl.BoolType, x.IsPaused); err != nil {
 			return err
 		}
 	}
@@ -219,16 +201,7 @@
 		}
 	}
 	if x.Pos != 0 {
-		if err := enc.NextField("Pos"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(x.Pos); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("Pos", vdl.Uint64Type, x.Pos); err != nil {
 			return err
 		}
 	}
@@ -337,58 +310,22 @@
 		return err
 	}
 	if x.NumLocalJoiners != 0 {
-		if err := enc.NextField("NumLocalJoiners"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint32Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(uint64(x.NumLocalJoiners)); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("NumLocalJoiners", vdl.Uint32Type, uint64(x.NumLocalJoiners)); err != nil {
 			return err
 		}
 	}
 	if x.Watched {
-		if err := enc.NextField("Watched"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.BoolType); err != nil {
-			return err
-		}
-		if err := enc.EncodeBool(x.Watched); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueBool("Watched", vdl.BoolType, x.Watched); err != nil {
 			return err
 		}
 	}
 	if x.RemotePublisher != "" {
-		if err := enc.NextField("RemotePublisher"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.RemotePublisher); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("RemotePublisher", vdl.StringType, x.RemotePublisher); err != nil {
 			return err
 		}
 	}
 	if x.SyncPending {
-		if err := enc.NextField("SyncPending"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.BoolType); err != nil {
-			return err
-		}
-		if err := enc.EncodeBool(x.SyncPending); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueBool("SyncPending", vdl.BoolType, x.SyncPending); err != nil {
 			return err
 		}
 	}
@@ -508,16 +445,7 @@
 		return err
 	}
 	if x.Level != 0 {
-		if err := enc.NextField("Level"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(x.Level); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("Level", vdl.Uint64Type, x.Level); err != nil {
 			return err
 		}
 	}
@@ -530,72 +458,27 @@
 		}
 	}
 	if x.Logrec != "" {
-		if err := enc.NextField("Logrec"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.Logrec); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("Logrec", vdl.StringType, x.Logrec); err != nil {
 			return err
 		}
 	}
 	if x.BatchId != 0 {
-		if err := enc.NextField("BatchId"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(x.BatchId); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("BatchId", vdl.Uint64Type, x.BatchId); err != nil {
 			return err
 		}
 	}
 	if x.Deleted {
-		if err := enc.NextField("Deleted"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.BoolType); err != nil {
-			return err
-		}
-		if err := enc.EncodeBool(x.Deleted); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueBool("Deleted", vdl.BoolType, x.Deleted); err != nil {
 			return err
 		}
 	}
 	if x.PermId != "" {
-		if err := enc.NextField("PermId"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.PermId); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("PermId", vdl.StringType, x.PermId); err != nil {
 			return err
 		}
 	}
 	if x.PermVers != "" {
-		if err := enc.NextField("PermVers"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x.PermVers); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueString("PermVers", vdl.StringType, x.PermVers); err != nil {
 			return err
 		}
 	}
@@ -612,17 +495,8 @@
 	if err := enc.SetLenHint(len(x)); err != nil {
 		return err
 	}
-	for i := 0; i < len(x); i++ {
-		if err := enc.NextEntry(false); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x[i]); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+	for _, elem := range x {
+		if err := enc.NextEntryValueString(vdl.StringType, elem); err != nil {
 			return err
 		}
 	}
@@ -776,16 +650,7 @@
 		}
 	}
 	if x.Count != 0 {
-		if err := enc.NextField("Count"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.Uint64Type); err != nil {
-			return err
-		}
-		if err := enc.EncodeUint(x.Count); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueUint("Count", vdl.Uint64Type, x.Count); err != nil {
 			return err
 		}
 	}
@@ -803,25 +668,10 @@
 		return err
 	}
 	for key, elem := range x {
-		if err := enc.NextEntry(false); err != nil {
+		if err := enc.NextEntryValueString(vdl.StringType, key); err != nil {
 			return err
 		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(key); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(elem); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.WriteValueString(vdl.StringType, elem); err != nil {
 			return err
 		}
 	}
diff --git a/services/syncbase/watchable/watchable.vdl.go b/services/syncbase/watchable/watchable.vdl.go
index 343d622..03b49b7 100644
--- a/services/syncbase/watchable/watchable.vdl.go
+++ b/services/syncbase/watchable/watchable.vdl.go
@@ -51,10 +51,7 @@
 		return err
 	}
 	if x.SgId != "" {
-		if err := enc.NextField("SgId"); err != nil {
-			return err
-		}
-		if err := x.SgId.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueString("SgId", __VDLType_string_2, string(x.SgId)); err != nil {
 			return err
 		}
 	}
@@ -67,16 +64,7 @@
 		}
 	}
 	if x.Remove {
-		if err := enc.NextField("Remove"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.BoolType); err != nil {
-			return err
-		}
-		if err := enc.EncodeBool(x.Remove); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueBool("Remove", vdl.BoolType, x.Remove); err != nil {
 			return err
 		}
 	}
@@ -93,17 +81,8 @@
 	if err := enc.SetLenHint(len(x)); err != nil {
 		return err
 	}
-	for i := 0; i < len(x); i++ {
-		if err := enc.NextEntry(false); err != nil {
-			return err
-		}
-		if err := enc.StartValue(vdl.StringType); err != nil {
-			return err
-		}
-		if err := enc.EncodeString(x[i]); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+	for _, elem := range x {
+		if err := enc.NextEntryValueString(vdl.StringType, elem); err != nil {
 			return err
 		}
 	}
@@ -205,30 +184,12 @@
 		return err
 	}
 	if len(x.Key) != 0 {
-		if err := enc.NextField("Key"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(__VDLType_list_5); err != nil {
-			return err
-		}
-		if err := enc.EncodeBytes(x.Key); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueBytes("Key", __VDLType_list_5, x.Key); err != nil {
 			return err
 		}
 	}
 	if len(x.Version) != 0 {
-		if err := enc.NextField("Version"); err != nil {
-			return err
-		}
-		if err := enc.StartValue(__VDLType_list_5); err != nil {
-			return err
-		}
-		if err := enc.EncodeBytes(x.Version); err != nil {
-			return err
-		}
-		if err := enc.FinishValue(); err != nil {
+		if err := enc.NextFieldValueBytes("Version", __VDLType_list_5, x.Version); err != nil {
 			return err
 		}
 	}
@@ -320,13 +281,10 @@
 }
 
 func (x StateChange) VDLWrite(enc vdl.Encoder) error {
-	if err := enc.StartValue(__VDLType_enum_6); err != nil {
+	if err := enc.WriteValueString(__VDLType_enum_6, x.String()); err != nil {
 		return err
 	}
-	if err := enc.EncodeString(x.String()); err != nil {
-		return err
-	}
-	return enc.FinishValue()
+	return nil
 }
 
 func (x *StateChange) VDLRead(dec vdl.Decoder) error {
@@ -364,10 +322,7 @@
 		return err
 	}
 	if x.RequestType != StateChangePauseSync {
-		if err := enc.NextField("RequestType"); err != nil {
-			return err
-		}
-		if err := x.RequestType.VDLWrite(enc); err != nil {
+		if err := enc.NextFieldValueString("RequestType", __VDLType_enum_6, x.RequestType.String()); err != nil {
 			return err
 		}
 	}