Faster vom encoding and decoding.

This CL implements a collection of changes that speeds up both
vom encoding and decoding:

1) Use struct field indices rather than names.  This avoids map
lookups in the common case, which gives a big win.

2) Cleanup and simplify the core uint decoding routines.  We had
added many variants of these routines to handle control codes,
peeking rather than reading, and decoding from byte slices rather
than decbuf.  This CL boils it down to a much smaller set of
methods, and speeds up each of those by using the new decbuf API
described next.

3) Faster decbuf API.  Go only inlines short functions that don't
themselves call other functions, and inlining makes a huge
difference for the core decoding routines.  The new API factors
things such that all of the common-case code is inlined.

4) Add a better fastpath for ReadValue* for decoding.  This is
the codepath taken for decoding struct and union fields, and in
the common case where the type of the serialized bytes is
identical to the type we're decoding into, we can avoid all
extraneous work.

5) Use the unsafe package to avoid a copy when decoding strings.

There are more optimizations to be made for the encoder, and we
might consider using enum label indices rather than strings for a
similar gain.  Those will come separately.

The numbers are below.  Note that some of the "Zero" cases got
much worse; I'm not worrying about it since the absolute times
are still pretty low, and we can deal with specific Zero
optimizations separately.

benchmark                           old ns/op   new ns/op   delta
Vom___DecodeMany_XNumber                 516         532   +3.10%
Vom___DecodeMany_VNumber                 290         262   -9.66%
Vom___DecodeMany_XStringSmall            744         643  -13.58%
Vom___DecodeMany_VStringSmall            409         358  -12.47%
Vom___DecodeMany_XStringLarge          32310       18983  -41.25%
Vom___DecodeMany_VStringLarge          31709       18030  -43.14%
Vom___DecodeMany_VEnum                   330         293  -11.21%
Vom___DecodeMany_XByteListSmall          821         774   -5.72%
Vom___DecodeMany_VByteListSmall          468         464   -0.85%
Vom___DecodeMany_XByteListLarge        19163       19376   +1.11%
Vom___DecodeMany_VByteListLarge        18061       18388   +1.81%
Vom___DecodeMany_XByteArray              796         759   -4.65%
Vom___DecodeMany_VByteArray              387         376   -2.84%
Vom___DecodeMany_XArray                  848         789   -6.96%
Vom___DecodeMany_VArray                  481         434   -9.77%
Vom___DecodeMany_XListSmall             1157        1151   -0.52%
Vom___DecodeMany_VListSmall              570         498  -12.63%
Vom___DecodeMany_XListLarge          3522243     2550194  -27.60%
Vom___DecodeMany_VListLarge          2453626     1267771  -48.33%
Vom___DecodeMany_XListAnySmall          2913        2872   -1.41%
Vom___DecodeMany_VListAnySmall          1634        1547   -5.32%
Vom___DecodeMany_XListAnyLarge      35741635    34369621   -3.84%
Vom___DecodeMany_VListAnyLarge      24464561    26419889   +7.99%
Vom___DecodeMany_VSet                   1148        1003  -12.63%
Vom___DecodeMany_XMap                   3175        2792  -12.06%
Vom___DecodeMany_VMap                   1312        1104  -15.85%
Vom___DecodeMany_XSmallStruct           2534        1594  -37.10%
Vom___DecodeMany_VSmallStruct            856         602  -29.67%
Vom___DecodeMany_XLargeStruct          30923        8442  -72.70%
Vom___DecodeMany_VLargeStruct           5944        2740  -53.90%
Vom___DecodeMany_XLargeStructZero        878         860   -2.05%
Vom___DecodeMany_VLargeStructZero        424         391   -7.78%
Vom___DecodeMany_VSmallUnion            1355        1168  -13.80%
Vom___DecodeMany_Time                   1755        1677   -4.44%
Vom___DecodeMany_Blessings             54516       53270   -2.29%
Vom___DecodeMany_RPCRequestZero          492         565  +14.84%
Vom___DecodeMany_RPCRequestFull        55682       53923   -3.16%
Vom___DecodeMany_RPCResponseZero         481         590  +22.66%
Vom___DecodeMany_RPCResponseFull       41434       39328   -5.08%
Vom___Decode_____XNumber                1301        1309   +0.61%
Vom___Decode_____VNumber                 881         880   -0.11%
Vom___Decode_____XStringSmall           1429        1396   -2.31%
Vom___Decode_____VStringSmall           1039         954   -8.18%
Vom___Decode_____XStringLarge          33067       19657  -40.55%
Vom___Decode_____VStringLarge          32185       18628  -42.12%
Vom___Decode_____VEnum                   907         882   -2.76%
Vom___Decode_____XByteListSmall         1575        1525   -3.17%
Vom___Decode_____VByteListSmall         1082        1087   +0.46%
Vom___Decode_____XByteListLarge        19933       19912   -0.11%
Vom___Decode_____VByteListLarge        18839       18905   +0.35%
Vom___Decode_____XByteArray             1581        1522   -3.73%
Vom___Decode_____VByteArray              966         948   -1.86%
Vom___Decode_____XArray                 1831        1711   -6.55%
Vom___Decode_____VArray                 1227        1160   -5.46%
Vom___Decode_____XListSmall             2122        2113   -0.42%
Vom___Decode_____VListSmall             1307        1200   -8.19%
Vom___Decode_____XListLarge          3380767     2520905  -25.43%
Vom___Decode_____VListLarge          2453680     1251395  -49.00%
Vom___Decode_____XListAnySmall          4210        4113   -2.30%
Vom___Decode_____VListAnySmall          2701        2617   -3.11%
Vom___Decode_____XListAnyLarge      37350228    36966199   -1.03%
Vom___Decode_____VListAnyLarge      26369538    25015060   -5.14%
Vom___Decode_____VSet                   1956        1794   -8.28%
Vom___Decode_____XMap                   4132        3798   -8.08%
Vom___Decode_____VMap                   2156        1910  -11.41%
Vom___Decode_____XSmallStruct           3542        2536  -28.40%
Vom___Decode_____VSmallStruct           1684        1406  -16.51%
Vom___Decode_____XLargeStruct          33490        9621  -71.27%
Vom___Decode_____VLargeStruct           7075        3747  -47.04%
Vom___Decode_____XLargeStructZero       2120        2004   -5.47%
Vom___Decode_____VLargeStructZero       1426        1352   -5.19%
Vom___Decode_____VSmallUnion            2444        2180  -10.80%
Vom___Decode_____Time                   2662        2570   -3.46%
Vom___Decode_____Blessings             57429       55326   -3.66%
Vom___Decode_____RPCRequestZero         1883        1938   +2.92%
Vom___Decode_____RPCRequestFull        58022       56356   -2.87%
Vom___Decode_____RPCResponseZero        1877        2040   +8.68%
Vom___Decode_____RPCResponseFull       45224       42712   -5.55%

Vom___EncodeMany_XNumber                 419         414   -1.19%
Vom___EncodeMany_VNumber                 155         155   +0.00%
Vom___EncodeMany_XStringSmall            429         437   +1.86%
Vom___EncodeMany_VStringSmall            172         160   -6.98%
Vom___EncodeMany_XStringLarge          23602        8093  -65.71%
Vom___EncodeMany_VStringLarge          23084        8007  -65.31%
Vom___EncodeMany_VEnum                   165         165   +0.00%
Vom___EncodeMany_XByteListSmall          451         440   -2.44%
Vom___EncodeMany_VByteListSmall          166         162   -2.41%
Vom___EncodeMany_XByteListLarge         8084        7798   -3.54%
Vom___EncodeMany_VByteListLarge         7648        7723   +0.98%
Vom___EncodeMany_XByteArray              669         658   -1.64%
Vom___EncodeMany_VByteArray              182         184   +1.10%
Vom___EncodeMany_XArray                  592         610   +3.04%
Vom___EncodeMany_VArray                  257         260   +1.17%
Vom___EncodeMany_XListSmall              621         631   +1.61%
Vom___EncodeMany_VListSmall              270         271   +0.37%
Vom___EncodeMany_XListLarge          3153432     3169541   +0.51%
Vom___EncodeMany_VListLarge          2110173     2096758   -0.64%
Vom___EncodeMany_XListAnySmall          6186        6067   -1.92%
Vom___EncodeMany_VListAnySmall          5047        4895   -3.01%
Vom___EncodeMany_XListAnyLarge     144857440   141422491   -2.37%
Vom___EncodeMany_VListAnyLarge     134381574   134091980   -0.22%
Vom___EncodeMany_VSet                    408         385   -5.64%
Vom___EncodeMany_XMap                   2382        2306   -3.19%
Vom___EncodeMany_VMap                    493         487   -1.22%
Vom___EncodeMany_XSmallStruct           1518        1319  -13.11%
Vom___EncodeMany_VSmallStruct            375         329  -12.27%
Vom___EncodeMany_XLargeStruct          25430       11837  -53.45%
Vom___EncodeMany_VLargeStruct           8621        2293  -73.40%
Vom___EncodeMany_XLargeStructZero      15917        9064  -43.05%
Vom___EncodeMany_VLargeStructZero        204         205   +0.49%
Vom___EncodeMany_VSmallUnion             210         210   +0.00%
Vom___EncodeMany_Time                   1582        1583   +0.06%
Vom___EncodeMany_Blessings              4870        4295  -11.81%
Vom___EncodeMany_RPCRequestZero          194         200   +3.09%
Vom___EncodeMany_RPCRequestFull         4542        3863  -14.95%
Vom___EncodeMany_RPCResponseZero         549         593   +8.01%
Vom___EncodeMany_RPCResponseFull       39815       40801   +2.48%
Vom___Encode_____XNumber                3969        3785   -4.64%
Vom___Encode_____VNumber                3338        3201   -4.10%
Vom___Encode_____XStringSmall           3958        3787   -4.32%
Vom___Encode_____VStringSmall           3354        3209   -4.32%
Vom___Encode_____XStringLarge          59871       45504  -24.00%
Vom___Encode_____VStringLarge          59339       44453  -25.09%
Vom___Encode_____VEnum                  4081        3842   -5.86%
Vom___Encode_____XByteListSmall         4210        4059   -3.59%
Vom___Encode_____VByteListSmall         3484        3397   -2.50%
Vom___Encode_____XByteListLarge        45808       46017   +0.46%
Vom___Encode_____VByteListLarge        44811       44857   +0.10%
Vom___Encode_____XByteArray             4536        4375   -3.55%
Vom___Encode_____VByteArray             3580        3483   -2.71%
Vom___Encode_____XArray                 4539        4393   -3.22%
Vom___Encode_____VArray                 3785        3647   -3.65%
Vom___Encode_____XListSmall             4522        4374   -3.27%
Vom___Encode_____VListSmall             3750        3625   -3.33%
Vom___Encode_____XListLarge          3344065     3333010   -0.33%
Vom___Encode_____VListLarge          2294181     2296135   +0.09%
Vom___Encode_____XListAnySmall         10908       10596   -2.86%
Vom___Encode_____VListAnySmall          9623        9218   -4.21%
Vom___Encode_____XListAnyLarge     150154031   148440574   -1.14%
Vom___Encode_____VListAnyLarge     140397260   141110872   +0.51%
Vom___Encode_____VSet                   3990        4115   +3.13%
Vom___Encode_____XMap                   6847        6517   -4.82%
Vom___Encode_____VMap                   4385        4147   -5.43%
Vom___Encode_____XSmallStruct           7481        6904   -7.71%
Vom___Encode_____VSmallStruct           5740        5315   -7.40%
Vom___Encode_____XLargeStruct          44549       29674  -33.39%
Vom___Encode_____VLargeStruct          26891       18749  -30.28%
Vom___Encode_____XLargeStructZero      34969       25891  -25.96%
Vom___Encode_____VLargeStructZero      18380       16568   -9.86%
Vom___Encode_____VSmallUnion            5218        4916   -5.79%
Vom___Encode_____Time                   6901        6610   -4.22%
Vom___Encode_____Blessings             31926       30306   -5.07%
Vom___Encode_____RPCRequestZero        38502       36148   -6.11%
Vom___Encode_____RPCRequestFull        46935       43710   -6.87%
Vom___Encode_____RPCResponseZero       39865       37641   -5.58%
Vom___Encode_____RPCResponseFull       89045       92906   +4.34%

MultiPart: 3/4
Change-Id: I935df8e8d2bbbe83bc90292e887aaca38ca7f7b1
diff --git a/cmd/sb/internal/demodb/demodb.vdl.go b/cmd/sb/internal/demodb/demodb.vdl.go
index a2c3940..8097750 100644
--- a/cmd/sb/internal/demodb/demodb.vdl.go
+++ b/cmd/sb/internal/demodb/demodb.vdl.go
@@ -41,26 +41,26 @@
 		return err
 	}
 	if x.Street != "" {
-		if err := enc.NextFieldValueString("Street", vdl.StringType, x.Street); err != nil {
+		if err := enc.NextFieldValueString(0, vdl.StringType, x.Street); err != nil {
 			return err
 		}
 	}
 	if x.City != "" {
-		if err := enc.NextFieldValueString("City", vdl.StringType, x.City); err != nil {
+		if err := enc.NextFieldValueString(1, vdl.StringType, x.City); err != nil {
 			return err
 		}
 	}
 	if x.State != "" {
-		if err := enc.NextFieldValueString("State", vdl.StringType, x.State); err != nil {
+		if err := enc.NextFieldValueString(2, vdl.StringType, x.State); err != nil {
 			return err
 		}
 	}
 	if x.Zip != "" {
-		if err := enc.NextFieldValueString("Zip", vdl.StringType, x.Zip); err != nil {
+		if err := enc.NextFieldValueString(3, vdl.StringType, x.Zip); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -71,46 +71,53 @@
 	if err := dec.StartValue(__VDLType_struct_1); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Street":
+		}
+		if decType != __VDLType_struct_1 {
+			index = __VDLType_struct_1.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.Street = value
 			}
-		case "City":
+		case 1:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.City = value
 			}
-		case "State":
+		case 2:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.State = value
 			}
-		case "Zip":
+		case 3:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.Zip = value
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -279,11 +286,11 @@
 		return err
 	}
 	if x.Rating != 0 {
-		if err := enc.NextFieldValueUint("Rating", vdl.ByteType, uint64(x.Rating)); err != nil {
+		if err := enc.NextFieldValueUint(0, vdl.ByteType, uint64(x.Rating)); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -294,25 +301,32 @@
 	if err := dec.StartValue(__VDLType_struct_4); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Rating":
+		}
+		if decType != __VDLType_struct_4 {
+			index = __VDLType_struct_4.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueUint(8); {
 			case err != nil:
 				return err
 			default:
 				x.Rating = byte(value)
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -335,11 +349,11 @@
 		return err
 	}
 	if x.Rating != ExperianRatingGood {
-		if err := enc.NextFieldValueString("Rating", __VDLType_enum_3, x.Rating.String()); err != nil {
+		if err := enc.NextFieldValueString(0, __VDLType_enum_3, x.Rating.String()); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -350,15 +364,26 @@
 	if err := dec.StartValue(__VDLType_struct_5); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Rating":
+		}
+		if decType != __VDLType_struct_5 {
+			index = __VDLType_struct_5.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
@@ -367,10 +392,6 @@
 					return err
 				}
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -393,11 +414,11 @@
 		return err
 	}
 	if x.Rating != 0 {
-		if err := enc.NextFieldValueInt("Rating", vdl.Int16Type, int64(x.Rating)); err != nil {
+		if err := enc.NextFieldValueInt(0, vdl.Int16Type, int64(x.Rating)); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -408,25 +429,32 @@
 	if err := dec.StartValue(__VDLType_struct_6); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Rating":
+		}
+		if decType != __VDLType_struct_6 {
+			index = __VDLType_struct_6.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueInt(16); {
 			case err != nil:
 				return err
 			default:
 				x.Rating = int16(value)
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -494,13 +522,13 @@
 	if err := enc.StartValue(__VDLType_union_7); err != nil {
 		return err
 	}
-	if err := enc.NextField("EquifaxReport"); err != nil {
+	if err := enc.NextField(0); err != nil {
 		return err
 	}
 	if err := x.Value.VDLWrite(enc); err != nil {
 		return err
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -510,13 +538,13 @@
 	if err := enc.StartValue(__VDLType_union_7); err != nil {
 		return err
 	}
-	if err := enc.NextField("ExperianReport"); err != nil {
+	if err := enc.NextField(1); err != nil {
 		return err
 	}
 	if err := x.Value.VDLWrite(enc); err != nil {
 		return err
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -526,13 +554,13 @@
 	if err := enc.StartValue(__VDLType_union_7); err != nil {
 		return err
 	}
-	if err := enc.NextField("TransUnionReport"); err != nil {
+	if err := enc.NextField(2); err != nil {
 		return err
 	}
 	if err := x.Value.VDLWrite(enc); err != nil {
 		return err
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -542,39 +570,46 @@
 	if err := dec.StartValue(__VDLType_union_7); err != nil {
 		return err
 	}
-	f, err := dec.NextField()
-	if err != nil {
+	decType := dec.Type()
+	index, err := dec.NextField()
+	switch {
+	case err != nil:
 		return err
+	case index == -1:
+		return fmt.Errorf("missing field in union %T, from %v", x, decType)
 	}
-	switch f {
-	case "EquifaxReport":
+	if decType != __VDLType_union_7 {
+		name := decType.Field(index).Name
+		index = __VDLType_union_7.FieldIndexByName(name)
+		if index == -1 {
+			return fmt.Errorf("field %q not in union %T, from %v", name, x, decType)
+		}
+	}
+	switch index {
+	case 0:
 		var field AgencyReportEquifaxReport
 		if err := field.Value.VDLRead(dec); err != nil {
 			return err
 		}
 		*x = field
-	case "ExperianReport":
+	case 1:
 		var field AgencyReportExperianReport
 		if err := field.Value.VDLRead(dec); err != nil {
 			return err
 		}
 		*x = field
-	case "TransUnionReport":
+	case 2:
 		var field AgencyReportTransUnionReport
 		if err := field.Value.VDLRead(dec); err != nil {
 			return err
 		}
 		*x = field
-	case "":
-		return fmt.Errorf("missing field in union %T, from %v", x, dec.Type())
-	default:
-		return fmt.Errorf("field %q not in union %T, from %v", f, x, dec.Type())
 	}
-	switch f, err := dec.NextField(); {
+	switch index, err := dec.NextField(); {
 	case err != nil:
 		return err
-	case f != "":
-		return fmt.Errorf("extra field %q in union %T, from %v", f, x, dec.Type())
+	case index != -1:
+		return fmt.Errorf("extra field %d in union %T, from %v", index, x, dec.Type())
 	}
 	return dec.FinishValue()
 }
@@ -604,19 +639,19 @@
 		return err
 	}
 	if x.Agency != CreditAgencyEquifax {
-		if err := enc.NextFieldValueString("Agency", __VDLType_enum_2, x.Agency.String()); err != nil {
+		if err := enc.NextFieldValueString(0, __VDLType_enum_2, x.Agency.String()); err != nil {
 			return err
 		}
 	}
 	if x.Report != nil && !x.Report.VDLIsZero() {
-		if err := enc.NextField("Report"); err != nil {
+		if err := enc.NextField(1); err != nil {
 			return err
 		}
 		if err := x.Report.VDLWrite(enc); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -629,15 +664,26 @@
 	if err := dec.StartValue(__VDLType_struct_8); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Agency":
+		}
+		if decType != __VDLType_struct_8 {
+			index = __VDLType_struct_8.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
@@ -646,14 +692,10 @@
 					return err
 				}
 			}
-		case "Report":
+		case 1:
 			if err := VDLReadAgencyReport(dec, &x.Report); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -695,22 +737,22 @@
 		return err
 	}
 	if x.Name != "" {
-		if err := enc.NextFieldValueString("Name", vdl.StringType, x.Name); err != nil {
+		if err := enc.NextFieldValueString(0, vdl.StringType, x.Name); err != nil {
 			return err
 		}
 	}
 	if x.Id != 0 {
-		if err := enc.NextFieldValueInt("Id", vdl.Int64Type, x.Id); err != nil {
+		if err := enc.NextFieldValueInt(1, vdl.Int64Type, x.Id); err != nil {
 			return err
 		}
 	}
 	if x.Active {
-		if err := enc.NextFieldValueBool("Active", vdl.BoolType, x.Active); err != nil {
+		if err := enc.NextFieldValueBool(2, vdl.BoolType, x.Active); err != nil {
 			return err
 		}
 	}
 	if x.Address != (AddressInfo{}) {
-		if err := enc.NextField("Address"); err != nil {
+		if err := enc.NextField(3); err != nil {
 			return err
 		}
 		if err := x.Address.VDLWrite(enc); err != nil {
@@ -718,14 +760,14 @@
 		}
 	}
 	if !x.Credit.VDLIsZero() {
-		if err := enc.NextField("Credit"); err != nil {
+		if err := enc.NextField(4); err != nil {
 			return err
 		}
 		if err := x.Credit.VDLWrite(enc); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -740,47 +782,54 @@
 	if err := dec.StartValue(__VDLType_struct_9); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Name":
+		}
+		if decType != __VDLType_struct_9 {
+			index = __VDLType_struct_9.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.Name = value
 			}
-		case "Id":
+		case 1:
 			switch value, err := dec.ReadValueInt(64); {
 			case err != nil:
 				return err
 			default:
 				x.Id = value
 			}
-		case "Active":
+		case 2:
 			switch value, err := dec.ReadValueBool(); {
 			case err != nil:
 				return err
 			default:
 				x.Active = value
 			}
-		case "Address":
+		case 3:
 			if err := x.Address.VDLRead(dec); err != nil {
 				return err
 			}
-		case "Credit":
+		case 4:
 			if err := x.Credit.VDLRead(dec); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -806,29 +855,29 @@
 		return err
 	}
 	if x.CustId != 0 {
-		if err := enc.NextFieldValueInt("CustId", vdl.Int64Type, x.CustId); err != nil {
+		if err := enc.NextFieldValueInt(0, vdl.Int64Type, x.CustId); err != nil {
 			return err
 		}
 	}
 	if x.InvoiceNum != 0 {
-		if err := enc.NextFieldValueInt("InvoiceNum", vdl.Int64Type, x.InvoiceNum); err != nil {
+		if err := enc.NextFieldValueInt(1, vdl.Int64Type, x.InvoiceNum); err != nil {
 			return err
 		}
 	}
 	if x.Amount != 0 {
-		if err := enc.NextFieldValueInt("Amount", vdl.Int64Type, x.Amount); err != nil {
+		if err := enc.NextFieldValueInt(2, vdl.Int64Type, x.Amount); err != nil {
 			return err
 		}
 	}
 	if x.ShipTo != (AddressInfo{}) {
-		if err := enc.NextField("ShipTo"); err != nil {
+		if err := enc.NextField(3); err != nil {
 			return err
 		}
 		if err := x.ShipTo.VDLWrite(enc); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -839,43 +888,50 @@
 	if err := dec.StartValue(__VDLType_struct_10); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "CustId":
+		}
+		if decType != __VDLType_struct_10 {
+			index = __VDLType_struct_10.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueInt(64); {
 			case err != nil:
 				return err
 			default:
 				x.CustId = value
 			}
-		case "InvoiceNum":
+		case 1:
 			switch value, err := dec.ReadValueInt(64); {
 			case err != nil:
 				return err
 			default:
 				x.InvoiceNum = value
 			}
-		case "Amount":
+		case 2:
 			switch value, err := dec.ReadValueInt(64); {
 			case err != nil:
 				return err
 			default:
 				x.Amount = value
 			}
-		case "ShipTo":
+		case 3:
 			if err := x.ShipTo.VDLRead(dec); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -906,51 +962,51 @@
 		return err
 	}
 	if x.B != 0 {
-		if err := enc.NextFieldValueUint("B", vdl.ByteType, uint64(x.B)); err != nil {
+		if err := enc.NextFieldValueUint(0, vdl.ByteType, uint64(x.B)); err != nil {
 			return err
 		}
 	}
 	if x.Ui16 != 0 {
-		if err := enc.NextFieldValueUint("Ui16", vdl.Uint16Type, uint64(x.Ui16)); err != nil {
+		if err := enc.NextFieldValueUint(1, vdl.Uint16Type, uint64(x.Ui16)); err != nil {
 			return err
 		}
 	}
 	if x.Ui32 != 0 {
-		if err := enc.NextFieldValueUint("Ui32", vdl.Uint32Type, uint64(x.Ui32)); err != nil {
+		if err := enc.NextFieldValueUint(2, vdl.Uint32Type, uint64(x.Ui32)); err != nil {
 			return err
 		}
 	}
 	if x.Ui64 != 0 {
-		if err := enc.NextFieldValueUint("Ui64", vdl.Uint64Type, x.Ui64); err != nil {
+		if err := enc.NextFieldValueUint(3, vdl.Uint64Type, x.Ui64); err != nil {
 			return err
 		}
 	}
 	if x.I16 != 0 {
-		if err := enc.NextFieldValueInt("I16", vdl.Int16Type, int64(x.I16)); err != nil {
+		if err := enc.NextFieldValueInt(4, vdl.Int16Type, int64(x.I16)); err != nil {
 			return err
 		}
 	}
 	if x.I32 != 0 {
-		if err := enc.NextFieldValueInt("I32", vdl.Int32Type, int64(x.I32)); err != nil {
+		if err := enc.NextFieldValueInt(5, vdl.Int32Type, int64(x.I32)); err != nil {
 			return err
 		}
 	}
 	if x.I64 != 0 {
-		if err := enc.NextFieldValueInt("I64", vdl.Int64Type, x.I64); err != nil {
+		if err := enc.NextFieldValueInt(6, vdl.Int64Type, x.I64); err != nil {
 			return err
 		}
 	}
 	if x.F32 != 0 {
-		if err := enc.NextFieldValueFloat("F32", vdl.Float32Type, float64(x.F32)); err != nil {
+		if err := enc.NextFieldValueFloat(7, vdl.Float32Type, float64(x.F32)); err != nil {
 			return err
 		}
 	}
 	if x.F64 != 0 {
-		if err := enc.NextFieldValueFloat("F64", vdl.Float64Type, x.F64); err != nil {
+		if err := enc.NextFieldValueFloat(8, vdl.Float64Type, x.F64); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -961,81 +1017,88 @@
 	if err := dec.StartValue(__VDLType_struct_11); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "B":
+		}
+		if decType != __VDLType_struct_11 {
+			index = __VDLType_struct_11.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueUint(8); {
 			case err != nil:
 				return err
 			default:
 				x.B = byte(value)
 			}
-		case "Ui16":
+		case 1:
 			switch value, err := dec.ReadValueUint(16); {
 			case err != nil:
 				return err
 			default:
 				x.Ui16 = uint16(value)
 			}
-		case "Ui32":
+		case 2:
 			switch value, err := dec.ReadValueUint(32); {
 			case err != nil:
 				return err
 			default:
 				x.Ui32 = uint32(value)
 			}
-		case "Ui64":
+		case 3:
 			switch value, err := dec.ReadValueUint(64); {
 			case err != nil:
 				return err
 			default:
 				x.Ui64 = value
 			}
-		case "I16":
+		case 4:
 			switch value, err := dec.ReadValueInt(16); {
 			case err != nil:
 				return err
 			default:
 				x.I16 = int16(value)
 			}
-		case "I32":
+		case 5:
 			switch value, err := dec.ReadValueInt(32); {
 			case err != nil:
 				return err
 			default:
 				x.I32 = int32(value)
 			}
-		case "I64":
+		case 6:
 			switch value, err := dec.ReadValueInt(64); {
 			case err != nil:
 				return err
 			default:
 				x.I64 = value
 			}
-		case "F32":
+		case 7:
 			switch value, err := dec.ReadValueFloat(32); {
 			case err != nil:
 				return err
 			default:
 				x.F32 = float32(value)
 			}
-		case "F64":
+		case 8:
 			switch value, err := dec.ReadValueFloat(64); {
 			case err != nil:
 				return err
 			default:
 				x.F64 = value
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -1091,10 +1154,10 @@
 	if err := enc.StartValue(__VDLType_union_12); err != nil {
 		return err
 	}
-	if err := enc.NextFieldValueString("Title", vdl.StringType, x.Value); err != nil {
+	if err := enc.NextFieldValueString(0, vdl.StringType, x.Value); err != nil {
 		return err
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -1104,10 +1167,10 @@
 	if err := enc.StartValue(__VDLType_union_12); err != nil {
 		return err
 	}
-	if err := enc.NextFieldValueInt("Value", vdl.Int64Type, x.Value); err != nil {
+	if err := enc.NextFieldValueInt(1, vdl.Int64Type, x.Value); err != nil {
 		return err
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -1117,12 +1180,23 @@
 	if err := dec.StartValue(__VDLType_union_12); err != nil {
 		return err
 	}
-	f, err := dec.NextField()
-	if err != nil {
+	decType := dec.Type()
+	index, err := dec.NextField()
+	switch {
+	case err != nil:
 		return err
+	case index == -1:
+		return fmt.Errorf("missing field in union %T, from %v", x, decType)
 	}
-	switch f {
-	case "Title":
+	if decType != __VDLType_union_12 {
+		name := decType.Field(index).Name
+		index = __VDLType_union_12.FieldIndexByName(name)
+		if index == -1 {
+			return fmt.Errorf("field %q not in union %T, from %v", name, x, decType)
+		}
+	}
+	switch index {
+	case 0:
 		var field TitleOrValueTypeTitle
 		switch value, err := dec.ReadValueString(); {
 		case err != nil:
@@ -1131,7 +1205,7 @@
 			field.Value = value
 		}
 		*x = field
-	case "Value":
+	case 1:
 		var field TitleOrValueTypeValue
 		switch value, err := dec.ReadValueInt(64); {
 		case err != nil:
@@ -1140,16 +1214,12 @@
 			field.Value = value
 		}
 		*x = field
-	case "":
-		return fmt.Errorf("missing field in union %T, from %v", x, dec.Type())
-	default:
-		return fmt.Errorf("field %q not in union %T, from %v", f, x, dec.Type())
 	}
-	switch f, err := dec.NextField(); {
+	switch index, err := dec.NextField(); {
 	case err != nil:
 		return err
-	case f != "":
-		return fmt.Errorf("extra field %q in union %T, from %v", f, x, dec.Type())
+	case index != -1:
+		return fmt.Errorf("extra field %d in union %T, from %v", index, x, dec.Type())
 	}
 	return dec.FinishValue()
 }
@@ -1179,19 +1249,19 @@
 		return err
 	}
 	if x.Name != "" {
-		if err := enc.NextFieldValueString("Name", vdl.StringType, x.Name); err != nil {
+		if err := enc.NextFieldValueString(0, vdl.StringType, x.Name); err != nil {
 			return err
 		}
 	}
 	if x.TitleOrValue != nil && !x.TitleOrValue.VDLIsZero() {
-		if err := enc.NextField("TitleOrValue"); err != nil {
+		if err := enc.NextField(1); err != nil {
 			return err
 		}
 		if err := x.TitleOrValue.VDLWrite(enc); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -1204,29 +1274,36 @@
 	if err := dec.StartValue(__VDLType_struct_13); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Name":
+		}
+		if decType != __VDLType_struct_13 {
+			index = __VDLType_struct_13.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.Name = value
 			}
-		case "TitleOrValue":
+		case 1:
 			if err := VDLReadTitleOrValueType(dec, &x.TitleOrValue); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -1252,14 +1329,14 @@
 		return err
 	}
 	if !x.Baz.VDLIsZero() {
-		if err := enc.NextField("Baz"); err != nil {
+		if err := enc.NextField(0); err != nil {
 			return err
 		}
 		if err := x.Baz.VDLWrite(enc); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -1274,20 +1351,27 @@
 	if err := dec.StartValue(__VDLType_struct_14); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Baz":
-			if err := x.Baz.VDLRead(dec); err != nil {
-				return err
+		}
+		if decType != __VDLType_struct_14 {
+			index = __VDLType_struct_14.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
+		}
+		switch index {
+		case 0:
+			if err := x.Baz.VDLRead(dec); err != nil {
 				return err
 			}
 		}
@@ -1315,14 +1399,14 @@
 		return err
 	}
 	if !x.Bar.VDLIsZero() {
-		if err := enc.NextField("Bar"); err != nil {
+		if err := enc.NextField(0); err != nil {
 			return err
 		}
 		if err := x.Bar.VDLWrite(enc); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -1339,20 +1423,27 @@
 	if err := dec.StartValue(__VDLType_struct_15); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Bar":
-			if err := x.Bar.VDLRead(dec); err != nil {
-				return err
+		}
+		if decType != __VDLType_struct_15 {
+			index = __VDLType_struct_15.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
+		}
+		switch index {
+		case 0:
+			if err := x.Bar.VDLRead(dec); err != nil {
 				return err
 			}
 		}
@@ -1441,7 +1532,7 @@
 		return err
 	}
 	if x.Arr != (Array2String{}) {
-		if err := enc.NextField("Arr"); err != nil {
+		if err := enc.NextField(0); err != nil {
 			return err
 		}
 		if err := x.Arr.VDLWrite(enc); err != nil {
@@ -1449,7 +1540,7 @@
 		}
 	}
 	if len(x.ListInt) != 0 {
-		if err := enc.NextField("ListInt"); err != nil {
+		if err := enc.NextField(1); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_list_1(enc, x.ListInt); err != nil {
@@ -1457,7 +1548,7 @@
 		}
 	}
 	if len(x.MySet) != 0 {
-		if err := enc.NextField("MySet"); err != nil {
+		if err := enc.NextField(2); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_set_2(enc, x.MySet); err != nil {
@@ -1465,14 +1556,14 @@
 		}
 	}
 	if len(x.Map) != 0 {
-		if err := enc.NextField("Map"); err != nil {
+		if err := enc.NextField(3); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_map_3(enc, x.Map); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -1540,34 +1631,41 @@
 	if err := dec.StartValue(__VDLType_struct_17); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Arr":
+		}
+		if decType != __VDLType_struct_17 {
+			index = __VDLType_struct_17.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			if err := x.Arr.VDLRead(dec); err != nil {
 				return err
 			}
-		case "ListInt":
+		case 1:
 			if err := __VDLReadAnon_list_1(dec, &x.ListInt); err != nil {
 				return err
 			}
-		case "MySet":
+		case 2:
 			if err := __VDLReadAnon_set_2(dec, &x.MySet); err != nil {
 				return err
 			}
-		case "Map":
+		case 3:
 			if err := __VDLReadAnon_map_3(dec, &x.Map); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -1673,7 +1771,7 @@
 		return err
 	}
 	if !x.Stamp.IsZero() {
-		if err := enc.NextField("Stamp"); err != nil {
+		if err := enc.NextField(0); err != nil {
 			return err
 		}
 		var wire vdltime.Time
@@ -1685,7 +1783,7 @@
 		}
 	}
 	if x.Interval != 0 {
-		if err := enc.NextField("Interval"); err != nil {
+		if err := enc.NextField(1); err != nil {
 			return err
 		}
 		var wire vdltime.Duration
@@ -1696,7 +1794,7 @@
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -1707,15 +1805,26 @@
 	if err := dec.StartValue(__VDLType_struct_21); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Stamp":
+		}
+		if decType != __VDLType_struct_21 {
+			index = __VDLType_struct_21.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			var wire vdltime.Time
 			if err := wire.VDLRead(dec); err != nil {
 				return err
@@ -1723,7 +1832,7 @@
 			if err := vdltime.TimeToNative(wire, &x.Stamp); err != nil {
 				return err
 			}
-		case "Interval":
+		case 1:
 			var wire vdltime.Duration
 			if err := wire.VDLRead(dec); err != nil {
 				return err
@@ -1731,10 +1840,6 @@
 			if err := vdltime.DurationToNative(wire, &x.Interval); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -1768,7 +1873,7 @@
 		return err
 	}
 	if x.Any != nil && !x.Any.VDLIsZero() {
-		if err := enc.NextField("Any"); err != nil {
+		if err := enc.NextField(0); err != nil {
 			return err
 		}
 		if err := x.Any.VDLWrite(enc); err != nil {
@@ -1776,7 +1881,7 @@
 		}
 	}
 	if x.Maybe != nil {
-		if err := enc.NextField("Maybe"); err != nil {
+		if err := enc.NextField(1); err != nil {
 			return err
 		}
 		enc.SetNextStartValueIsOptional()
@@ -1785,14 +1890,14 @@
 		}
 	}
 	if len(x.Rec) != 0 {
-		if err := enc.NextField("Rec"); err != nil {
+		if err := enc.NextField(2); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_map_4(enc, x.Rec); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -1829,20 +1934,31 @@
 	if err := dec.StartValue(__VDLType_struct_24); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Any":
+		}
+		if decType != __VDLType_struct_24 {
+			index = __VDLType_struct_24.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			x.Any = new(vom.RawBytes)
 			if err := x.Any.VDLRead(dec); err != nil {
 				return err
 			}
-		case "Maybe":
+		case 1:
 			if err := dec.StartValue(__VDLType_optional_25); err != nil {
 				return err
 			}
@@ -1858,14 +1974,10 @@
 					return err
 				}
 			}
-		case "Rec":
+		case 2:
 			if err := __VDLReadAnon_map_4(dec, &x.Rec); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -1953,10 +2065,10 @@
 	if err := enc.StartValue(__VDLType_union_27); err != nil {
 		return err
 	}
-	if err := enc.NextFieldValueUint("ActScore", vdl.Uint16Type, uint64(x.Value)); err != nil {
+	if err := enc.NextFieldValueUint(0, vdl.Uint16Type, uint64(x.Value)); err != nil {
 		return err
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -1966,10 +2078,10 @@
 	if err := enc.StartValue(__VDLType_union_27); err != nil {
 		return err
 	}
-	if err := enc.NextFieldValueUint("SatScore", vdl.Uint16Type, uint64(x.Value)); err != nil {
+	if err := enc.NextFieldValueUint(1, vdl.Uint16Type, uint64(x.Value)); err != nil {
 		return err
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -1979,12 +2091,23 @@
 	if err := dec.StartValue(__VDLType_union_27); err != nil {
 		return err
 	}
-	f, err := dec.NextField()
-	if err != nil {
+	decType := dec.Type()
+	index, err := dec.NextField()
+	switch {
+	case err != nil:
 		return err
+	case index == -1:
+		return fmt.Errorf("missing field in union %T, from %v", x, decType)
 	}
-	switch f {
-	case "ActScore":
+	if decType != __VDLType_union_27 {
+		name := decType.Field(index).Name
+		index = __VDLType_union_27.FieldIndexByName(name)
+		if index == -1 {
+			return fmt.Errorf("field %q not in union %T, from %v", name, x, decType)
+		}
+	}
+	switch index {
+	case 0:
 		var field ActOrSatScoreActScore
 		switch value, err := dec.ReadValueUint(16); {
 		case err != nil:
@@ -1993,7 +2116,7 @@
 			field.Value = uint16(value)
 		}
 		*x = field
-	case "SatScore":
+	case 1:
 		var field ActOrSatScoreSatScore
 		switch value, err := dec.ReadValueUint(16); {
 		case err != nil:
@@ -2002,16 +2125,12 @@
 			field.Value = uint16(value)
 		}
 		*x = field
-	case "":
-		return fmt.Errorf("missing field in union %T, from %v", x, dec.Type())
-	default:
-		return fmt.Errorf("field %q not in union %T, from %v", f, x, dec.Type())
 	}
-	switch f, err := dec.NextField(); {
+	switch index, err := dec.NextField(); {
 	case err != nil:
 		return err
-	case f != "":
-		return fmt.Errorf("extra field %q in union %T, from %v", f, x, dec.Type())
+	case index != -1:
+		return fmt.Errorf("extra field %d in union %T, from %v", index, x, dec.Type())
 	}
 	return dec.FinishValue()
 }
@@ -2045,12 +2164,12 @@
 		return err
 	}
 	if x.Name != "" {
-		if err := enc.NextFieldValueString("Name", vdl.StringType, x.Name); err != nil {
+		if err := enc.NextFieldValueString(0, vdl.StringType, x.Name); err != nil {
 			return err
 		}
 	}
 	if !x.TestTime.IsZero() {
-		if err := enc.NextField("TestTime"); err != nil {
+		if err := enc.NextField(1); err != nil {
 			return err
 		}
 		var wire vdltime.Time
@@ -2062,14 +2181,14 @@
 		}
 	}
 	if x.Score != nil && !x.Score.VDLIsZero() {
-		if err := enc.NextField("Score"); err != nil {
+		if err := enc.NextField(2); err != nil {
 			return err
 		}
 		if err := x.Score.VDLWrite(enc); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -2082,22 +2201,33 @@
 	if err := dec.StartValue(__VDLType_struct_28); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Name":
+		}
+		if decType != __VDLType_struct_28 {
+			index = __VDLType_struct_28.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.Name = value
 			}
-		case "TestTime":
+		case 1:
 			var wire vdltime.Time
 			if err := wire.VDLRead(dec); err != nil {
 				return err
@@ -2105,14 +2235,10 @@
 			if err := vdltime.TimeToNative(wire, &x.TestTime); err != nil {
 				return err
 			}
-		case "Score":
+		case 2:
 			if err := VDLReadActOrSatScore(dec, &x.Score); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -2142,19 +2268,19 @@
 		return err
 	}
 	if x.NameOfType != "" {
-		if err := enc.NextFieldValueString("NameOfType", vdl.StringType, x.NameOfType); err != nil {
+		if err := enc.NextFieldValueString(0, vdl.StringType, x.NameOfType); err != nil {
 			return err
 		}
 	}
 	if x.Anything != nil && !x.Anything.VDLIsZero() {
-		if err := enc.NextField("Anything"); err != nil {
+		if err := enc.NextField(1); err != nil {
 			return err
 		}
 		if err := x.Anything.VDLWrite(enc); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -2167,30 +2293,37 @@
 	if err := dec.StartValue(__VDLType_struct_29); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "NameOfType":
+		}
+		if decType != __VDLType_struct_29 {
+			index = __VDLType_struct_29.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.NameOfType = value
 			}
-		case "Anything":
+		case 1:
 			x.Anything = new(vom.RawBytes)
 			if err := x.Anything.VDLRead(dec); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
diff --git a/cmd/vrpc/internal/internal.vdl.go b/cmd/vrpc/internal/internal.vdl.go
index dbe5a69..367ee71 100644
--- a/cmd/vrpc/internal/internal.vdl.go
+++ b/cmd/vrpc/internal/internal.vdl.go
@@ -40,16 +40,16 @@
 		return err
 	}
 	if x.X != 0 {
-		if err := enc.NextFieldValueInt("X", vdl.Int32Type, int64(x.X)); err != nil {
+		if err := enc.NextFieldValueInt(0, vdl.Int32Type, int64(x.X)); err != nil {
 			return err
 		}
 	}
 	if x.Y != 0 {
-		if err := enc.NextFieldValueInt("Y", vdl.Int32Type, int64(x.Y)); err != nil {
+		if err := enc.NextFieldValueInt(1, vdl.Int32Type, int64(x.Y)); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -60,32 +60,39 @@
 	if err := dec.StartValue(__VDLType_struct_1); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "X":
+		}
+		if decType != __VDLType_struct_1 {
+			index = __VDLType_struct_1.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueInt(32); {
 			case err != nil:
 				return err
 			default:
 				x.X = int32(value)
 			}
-		case "Y":
+		case 1:
 			switch value, err := dec.ReadValueInt(32); {
 			case err != nil:
 				return err
 			default:
 				x.Y = int32(value)
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
diff --git a/examples/rps/rps.vdl.go b/examples/rps/rps.vdl.go
index 760a8bf..d3d4b68 100644
--- a/examples/rps/rps.vdl.go
+++ b/examples/rps/rps.vdl.go
@@ -59,11 +59,11 @@
 		return err
 	}
 	if x.Id != "" {
-		if err := enc.NextFieldValueString("Id", vdl.StringType, x.Id); err != nil {
+		if err := enc.NextFieldValueString(0, vdl.StringType, x.Id); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -74,25 +74,32 @@
 	if err := dec.StartValue(__VDLType_struct_1); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Id":
+		}
+		if decType != __VDLType_struct_1 {
+			index = __VDLType_struct_1.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.Id = value
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -145,16 +152,16 @@
 		return err
 	}
 	if x.NumRounds != 0 {
-		if err := enc.NextFieldValueInt("NumRounds", vdl.Int32Type, int64(x.NumRounds)); err != nil {
+		if err := enc.NextFieldValueInt(0, vdl.Int32Type, int64(x.NumRounds)); err != nil {
 			return err
 		}
 	}
 	if x.GameType != 0 {
-		if err := enc.NextFieldValueUint("GameType", __VDLType_byte_2, uint64(x.GameType)); err != nil {
+		if err := enc.NextFieldValueUint(1, __VDLType_byte_2, uint64(x.GameType)); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -165,32 +172,39 @@
 	if err := dec.StartValue(__VDLType_struct_3); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "NumRounds":
+		}
+		if decType != __VDLType_struct_3 {
+			index = __VDLType_struct_3.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueInt(32); {
 			case err != nil:
 				return err
 			default:
 				x.NumRounds = int32(value)
 			}
-		case "GameType":
+		case 1:
 			switch value, err := dec.ReadValueUint(8); {
 			case err != nil:
 				return err
 			default:
 				x.GameType = GameTypeTag(value)
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -212,7 +226,7 @@
 	if err := enc.StartValue(__VDLType_struct_4); err != nil {
 		return err
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -223,19 +237,26 @@
 	if err := dec.StartValue(__VDLType_struct_4); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
+		}
+		if decType != __VDLType_struct_4 {
+			index = __VDLType_struct_4.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
 			}
 		}
+		switch index {
+		}
 	}
 }
 
@@ -290,10 +311,10 @@
 	if err := enc.StartValue(__VDLType_union_5); err != nil {
 		return err
 	}
-	if err := enc.NextFieldValueString("Move", vdl.StringType, x.Value); err != nil {
+	if err := enc.NextFieldValueString(0, vdl.StringType, x.Value); err != nil {
 		return err
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -303,13 +324,13 @@
 	if err := enc.StartValue(__VDLType_union_5); err != nil {
 		return err
 	}
-	if err := enc.NextField("Quit"); err != nil {
+	if err := enc.NextField(1); err != nil {
 		return err
 	}
 	if err := x.Value.VDLWrite(enc); err != nil {
 		return err
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -319,12 +340,23 @@
 	if err := dec.StartValue(__VDLType_union_5); err != nil {
 		return err
 	}
-	f, err := dec.NextField()
-	if err != nil {
+	decType := dec.Type()
+	index, err := dec.NextField()
+	switch {
+	case err != nil:
 		return err
+	case index == -1:
+		return fmt.Errorf("missing field in union %T, from %v", x, decType)
 	}
-	switch f {
-	case "Move":
+	if decType != __VDLType_union_5 {
+		name := decType.Field(index).Name
+		index = __VDLType_union_5.FieldIndexByName(name)
+		if index == -1 {
+			return fmt.Errorf("field %q not in union %T, from %v", name, x, decType)
+		}
+	}
+	switch index {
+	case 0:
 		var field PlayerActionMove
 		switch value, err := dec.ReadValueString(); {
 		case err != nil:
@@ -333,22 +365,18 @@
 			field.Value = value
 		}
 		*x = field
-	case "Quit":
+	case 1:
 		var field PlayerActionQuit
 		if err := field.Value.VDLRead(dec); err != nil {
 			return err
 		}
 		*x = field
-	case "":
-		return fmt.Errorf("missing field in union %T, from %v", x, dec.Type())
-	default:
-		return fmt.Errorf("field %q not in union %T, from %v", f, x, dec.Type())
 	}
-	switch f, err := dec.NextField(); {
+	switch index, err := dec.NextField(); {
 	case err != nil:
 		return err
-	case f != "":
-		return fmt.Errorf("extra field %q in union %T, from %v", f, x, dec.Type())
+	case index != -1:
+		return fmt.Errorf("extra field %d in union %T, from %v", index, x, dec.Type())
 	}
 	return dec.FinishValue()
 }
@@ -470,7 +498,7 @@
 		return err
 	}
 	if x.Moves != (PlayersMoves{}) {
-		if err := enc.NextField("Moves"); err != nil {
+		if err := enc.NextField(0); err != nil {
 			return err
 		}
 		if err := x.Moves.VDLWrite(enc); err != nil {
@@ -478,17 +506,17 @@
 		}
 	}
 	if x.Comment != "" {
-		if err := enc.NextFieldValueString("Comment", vdl.StringType, x.Comment); err != nil {
+		if err := enc.NextFieldValueString(1, vdl.StringType, x.Comment); err != nil {
 			return err
 		}
 	}
 	if x.Winner != 0 {
-		if err := enc.NextFieldValueUint("Winner", __VDLType_byte_7, uint64(x.Winner)); err != nil {
+		if err := enc.NextFieldValueUint(2, __VDLType_byte_7, uint64(x.Winner)); err != nil {
 			return err
 		}
 	}
 	if !x.StartTime.IsZero() {
-		if err := enc.NextField("StartTime"); err != nil {
+		if err := enc.NextField(3); err != nil {
 			return err
 		}
 		var wire vdltime.Time
@@ -500,7 +528,7 @@
 		}
 	}
 	if !x.EndTime.IsZero() {
-		if err := enc.NextField("EndTime"); err != nil {
+		if err := enc.NextField(4); err != nil {
 			return err
 		}
 		var wire vdltime.Time
@@ -511,7 +539,7 @@
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -522,33 +550,44 @@
 	if err := dec.StartValue(__VDLType_struct_8); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Moves":
+		}
+		if decType != __VDLType_struct_8 {
+			index = __VDLType_struct_8.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			if err := x.Moves.VDLRead(dec); err != nil {
 				return err
 			}
-		case "Comment":
+		case 1:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.Comment = value
 			}
-		case "Winner":
+		case 2:
 			switch value, err := dec.ReadValueUint(8); {
 			case err != nil:
 				return err
 			default:
 				x.Winner = WinnerTag(value)
 			}
-		case "StartTime":
+		case 3:
 			var wire vdltime.Time
 			if err := wire.VDLRead(dec); err != nil {
 				return err
@@ -556,7 +595,7 @@
 			if err := vdltime.TimeToNative(wire, &x.StartTime); err != nil {
 				return err
 			}
-		case "EndTime":
+		case 4:
 			var wire vdltime.Time
 			if err := wire.VDLRead(dec); err != nil {
 				return err
@@ -564,10 +603,6 @@
 			if err := vdltime.TimeToNative(wire, &x.EndTime); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -617,7 +652,7 @@
 		return err
 	}
 	if x.Opts != (GameOptions{}) {
-		if err := enc.NextField("Opts"); err != nil {
+		if err := enc.NextField(0); err != nil {
 			return err
 		}
 		if err := x.Opts.VDLWrite(enc); err != nil {
@@ -625,12 +660,12 @@
 		}
 	}
 	if x.Judge != "" {
-		if err := enc.NextFieldValueString("Judge", vdl.StringType, x.Judge); err != nil {
+		if err := enc.NextFieldValueString(1, vdl.StringType, x.Judge); err != nil {
 			return err
 		}
 	}
 	if len(x.Players) != 0 {
-		if err := enc.NextField("Players"); err != nil {
+		if err := enc.NextField(2); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_list_1(enc, x.Players); err != nil {
@@ -638,7 +673,7 @@
 		}
 	}
 	if len(x.Rounds) != 0 {
-		if err := enc.NextField("Rounds"); err != nil {
+		if err := enc.NextField(3); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_list_2(enc, x.Rounds); err != nil {
@@ -646,7 +681,7 @@
 		}
 	}
 	if !x.StartTime.IsZero() {
-		if err := enc.NextField("StartTime"); err != nil {
+		if err := enc.NextField(4); err != nil {
 			return err
 		}
 		var wire vdltime.Time
@@ -658,7 +693,7 @@
 		}
 	}
 	if !x.EndTime.IsZero() {
-		if err := enc.NextField("EndTime"); err != nil {
+		if err := enc.NextField(5); err != nil {
 			return err
 		}
 		var wire vdltime.Time
@@ -670,11 +705,11 @@
 		}
 	}
 	if x.Winner != 0 {
-		if err := enc.NextFieldValueUint("Winner", __VDLType_byte_7, uint64(x.Winner)); err != nil {
+		if err := enc.NextFieldValueUint(6, __VDLType_byte_7, uint64(x.Winner)); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -724,34 +759,45 @@
 	if err := dec.StartValue(__VDLType_struct_10); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Opts":
+		}
+		if decType != __VDLType_struct_10 {
+			index = __VDLType_struct_10.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			if err := x.Opts.VDLRead(dec); err != nil {
 				return err
 			}
-		case "Judge":
+		case 1:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.Judge = value
 			}
-		case "Players":
+		case 2:
 			if err := __VDLReadAnon_list_1(dec, &x.Players); err != nil {
 				return err
 			}
-		case "Rounds":
+		case 3:
 			if err := __VDLReadAnon_list_2(dec, &x.Rounds); err != nil {
 				return err
 			}
-		case "StartTime":
+		case 4:
 			var wire vdltime.Time
 			if err := wire.VDLRead(dec); err != nil {
 				return err
@@ -759,7 +805,7 @@
 			if err := vdltime.TimeToNative(wire, &x.StartTime); err != nil {
 				return err
 			}
-		case "EndTime":
+		case 5:
 			var wire vdltime.Time
 			if err := wire.VDLRead(dec); err != nil {
 				return err
@@ -767,17 +813,13 @@
 			if err := vdltime.TimeToNative(wire, &x.EndTime); err != nil {
 				return err
 			}
-		case "Winner":
+		case 6:
 			switch value, err := dec.ReadValueUint(8); {
 			case err != nil:
 				return err
 			default:
 				x.Winner = WinnerTag(value)
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -915,10 +957,10 @@
 	if err := enc.StartValue(__VDLType_union_13); err != nil {
 		return err
 	}
-	if err := enc.NextFieldValueInt("PlayerNum", vdl.Int32Type, int64(x.Value)); err != nil {
+	if err := enc.NextFieldValueInt(0, vdl.Int32Type, int64(x.Value)); err != nil {
 		return err
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -928,10 +970,10 @@
 	if err := enc.StartValue(__VDLType_union_13); err != nil {
 		return err
 	}
-	if err := enc.NextFieldValueString("OpponentName", vdl.StringType, x.Value); err != nil {
+	if err := enc.NextFieldValueString(1, vdl.StringType, x.Value); err != nil {
 		return err
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -941,13 +983,13 @@
 	if err := enc.StartValue(__VDLType_union_13); err != nil {
 		return err
 	}
-	if err := enc.NextField("MoveOptions"); err != nil {
+	if err := enc.NextField(2); err != nil {
 		return err
 	}
 	if err := __VDLWriteAnon_list_1(enc, x.Value); err != nil {
 		return err
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -957,13 +999,13 @@
 	if err := enc.StartValue(__VDLType_union_13); err != nil {
 		return err
 	}
-	if err := enc.NextField("RoundResult"); err != nil {
+	if err := enc.NextField(3); err != nil {
 		return err
 	}
 	if err := x.Value.VDLWrite(enc); err != nil {
 		return err
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -973,13 +1015,13 @@
 	if err := enc.StartValue(__VDLType_union_13); err != nil {
 		return err
 	}
-	if err := enc.NextField("Score"); err != nil {
+	if err := enc.NextField(4); err != nil {
 		return err
 	}
 	if err := x.Value.VDLWrite(enc); err != nil {
 		return err
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -989,12 +1031,23 @@
 	if err := dec.StartValue(__VDLType_union_13); err != nil {
 		return err
 	}
-	f, err := dec.NextField()
-	if err != nil {
+	decType := dec.Type()
+	index, err := dec.NextField()
+	switch {
+	case err != nil:
 		return err
+	case index == -1:
+		return fmt.Errorf("missing field in union %T, from %v", x, decType)
 	}
-	switch f {
-	case "PlayerNum":
+	if decType != __VDLType_union_13 {
+		name := decType.Field(index).Name
+		index = __VDLType_union_13.FieldIndexByName(name)
+		if index == -1 {
+			return fmt.Errorf("field %q not in union %T, from %v", name, x, decType)
+		}
+	}
+	switch index {
+	case 0:
 		var field JudgeActionPlayerNum
 		switch value, err := dec.ReadValueInt(32); {
 		case err != nil:
@@ -1003,7 +1056,7 @@
 			field.Value = int32(value)
 		}
 		*x = field
-	case "OpponentName":
+	case 1:
 		var field JudgeActionOpponentName
 		switch value, err := dec.ReadValueString(); {
 		case err != nil:
@@ -1012,34 +1065,30 @@
 			field.Value = value
 		}
 		*x = field
-	case "MoveOptions":
+	case 2:
 		var field JudgeActionMoveOptions
 		if err := __VDLReadAnon_list_1(dec, &field.Value); err != nil {
 			return err
 		}
 		*x = field
-	case "RoundResult":
+	case 3:
 		var field JudgeActionRoundResult
 		if err := field.Value.VDLRead(dec); err != nil {
 			return err
 		}
 		*x = field
-	case "Score":
+	case 4:
 		var field JudgeActionScore
 		if err := field.Value.VDLRead(dec); err != nil {
 			return err
 		}
 		*x = field
-	case "":
-		return fmt.Errorf("missing field in union %T, from %v", x, dec.Type())
-	default:
-		return fmt.Errorf("field %q not in union %T, from %v", f, x, dec.Type())
 	}
-	switch f, err := dec.NextField(); {
+	switch index, err := dec.NextField(); {
 	case err != nil:
 		return err
-	case f != "":
-		return fmt.Errorf("extra field %q in union %T, from %v", f, x, dec.Type())
+	case index != -1:
+		return fmt.Errorf("extra field %d in union %T, from %v", index, x, dec.Type())
 	}
 	return dec.FinishValue()
 }
@@ -1063,11 +1112,11 @@
 		return err
 	}
 	if x.YouWon {
-		if err := enc.NextFieldValueBool("YouWon", vdl.BoolType, x.YouWon); err != nil {
+		if err := enc.NextFieldValueBool(0, vdl.BoolType, x.YouWon); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -1078,25 +1127,32 @@
 	if err := dec.StartValue(__VDLType_struct_14); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "YouWon":
+		}
+		if decType != __VDLType_struct_14 {
+			index = __VDLType_struct_14.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueBool(); {
 			case err != nil:
 				return err
 			default:
 				x.YouWon = value
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
diff --git a/examples/tunnel/tunnel.vdl.go b/examples/tunnel/tunnel.vdl.go
index 397c070..a6139c3 100644
--- a/examples/tunnel/tunnel.vdl.go
+++ b/examples/tunnel/tunnel.vdl.go
@@ -43,16 +43,16 @@
 		return err
 	}
 	if x.Rows != 0 {
-		if err := enc.NextFieldValueUint("Rows", vdl.Uint16Type, uint64(x.Rows)); err != nil {
+		if err := enc.NextFieldValueUint(0, vdl.Uint16Type, uint64(x.Rows)); err != nil {
 			return err
 		}
 	}
 	if x.Cols != 0 {
-		if err := enc.NextFieldValueUint("Cols", vdl.Uint16Type, uint64(x.Cols)); err != nil {
+		if err := enc.NextFieldValueUint(1, vdl.Uint16Type, uint64(x.Cols)); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -63,32 +63,39 @@
 	if err := dec.StartValue(__VDLType_struct_1); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Rows":
+		}
+		if decType != __VDLType_struct_1 {
+			index = __VDLType_struct_1.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueUint(16); {
 			case err != nil:
 				return err
 			default:
 				x.Rows = uint16(value)
 			}
-		case "Cols":
+		case 1:
 			switch value, err := dec.ReadValueUint(16); {
 			case err != nil:
 				return err
 			default:
 				x.Cols = uint16(value)
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -122,12 +129,12 @@
 		return err
 	}
 	if x.UsePty {
-		if err := enc.NextFieldValueBool("UsePty", vdl.BoolType, x.UsePty); err != nil {
+		if err := enc.NextFieldValueBool(0, vdl.BoolType, x.UsePty); err != nil {
 			return err
 		}
 	}
 	if len(x.Environment) != 0 {
-		if err := enc.NextField("Environment"); err != nil {
+		if err := enc.NextField(1); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_list_1(enc, x.Environment); err != nil {
@@ -135,14 +142,14 @@
 		}
 	}
 	if x.WinSize != (WindowSize{}) {
-		if err := enc.NextField("WinSize"); err != nil {
+		if err := enc.NextField(2); err != nil {
 			return err
 		}
 		if err := x.WinSize.VDLWrite(enc); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -171,33 +178,40 @@
 	if err := dec.StartValue(__VDLType_struct_2); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "UsePty":
+		}
+		if decType != __VDLType_struct_2 {
+			index = __VDLType_struct_2.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueBool(); {
 			case err != nil:
 				return err
 			default:
 				x.UsePty = value
 			}
-		case "Environment":
+		case 1:
 			if err := __VDLReadAnon_list_1(dec, &x.Environment); err != nil {
 				return err
 			}
-		case "WinSize":
+		case 2:
 			if err := x.WinSize.VDLRead(dec); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -240,7 +254,7 @@
 	if err := enc.StartValue(__VDLType_struct_4); err != nil {
 		return err
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -251,19 +265,26 @@
 	if err := dec.StartValue(__VDLType_struct_4); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
+		}
+		if decType != __VDLType_struct_4 {
+			index = __VDLType_struct_4.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
 			}
 		}
+		switch index {
+		}
 	}
 }
 
@@ -337,10 +358,10 @@
 	if err := enc.StartValue(__VDLType_union_6); err != nil {
 		return err
 	}
-	if err := enc.NextFieldValueBytes("Stdin", __VDLType_list_5, x.Value); err != nil {
+	if err := enc.NextFieldValueBytes(0, __VDLType_list_5, x.Value); err != nil {
 		return err
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -350,13 +371,13 @@
 	if err := enc.StartValue(__VDLType_union_6); err != nil {
 		return err
 	}
-	if err := enc.NextField("EndOfFile"); err != nil {
+	if err := enc.NextField(1); err != nil {
 		return err
 	}
 	if err := x.Value.VDLWrite(enc); err != nil {
 		return err
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -366,13 +387,13 @@
 	if err := enc.StartValue(__VDLType_union_6); err != nil {
 		return err
 	}
-	if err := enc.NextField("WinSize"); err != nil {
+	if err := enc.NextField(2); err != nil {
 		return err
 	}
 	if err := x.Value.VDLWrite(enc); err != nil {
 		return err
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -382,39 +403,46 @@
 	if err := dec.StartValue(__VDLType_union_6); err != nil {
 		return err
 	}
-	f, err := dec.NextField()
-	if err != nil {
+	decType := dec.Type()
+	index, err := dec.NextField()
+	switch {
+	case err != nil:
 		return err
+	case index == -1:
+		return fmt.Errorf("missing field in union %T, from %v", x, decType)
 	}
-	switch f {
-	case "Stdin":
+	if decType != __VDLType_union_6 {
+		name := decType.Field(index).Name
+		index = __VDLType_union_6.FieldIndexByName(name)
+		if index == -1 {
+			return fmt.Errorf("field %q not in union %T, from %v", name, x, decType)
+		}
+	}
+	switch index {
+	case 0:
 		var field ClientShellPacketStdin
 		if err := dec.ReadValueBytes(-1, &field.Value); err != nil {
 			return err
 		}
 		*x = field
-	case "EndOfFile":
+	case 1:
 		var field ClientShellPacketEndOfFile
 		if err := field.Value.VDLRead(dec); err != nil {
 			return err
 		}
 		*x = field
-	case "WinSize":
+	case 2:
 		var field ClientShellPacketWinSize
 		if err := field.Value.VDLRead(dec); err != nil {
 			return err
 		}
 		*x = field
-	case "":
-		return fmt.Errorf("missing field in union %T, from %v", x, dec.Type())
-	default:
-		return fmt.Errorf("field %q not in union %T, from %v", f, x, dec.Type())
 	}
-	switch f, err := dec.NextField(); {
+	switch index, err := dec.NextField(); {
 	case err != nil:
 		return err
-	case f != "":
-		return fmt.Errorf("extra field %q in union %T, from %v", f, x, dec.Type())
+	case index != -1:
+		return fmt.Errorf("extra field %d in union %T, from %v", index, x, dec.Type())
 	}
 	return dec.FinishValue()
 }
@@ -474,10 +502,10 @@
 	if err := enc.StartValue(__VDLType_union_7); err != nil {
 		return err
 	}
-	if err := enc.NextFieldValueBytes("Stdout", __VDLType_list_5, x.Value); err != nil {
+	if err := enc.NextFieldValueBytes(0, __VDLType_list_5, x.Value); err != nil {
 		return err
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -487,10 +515,10 @@
 	if err := enc.StartValue(__VDLType_union_7); err != nil {
 		return err
 	}
-	if err := enc.NextFieldValueBytes("Stderr", __VDLType_list_5, x.Value); err != nil {
+	if err := enc.NextFieldValueBytes(1, __VDLType_list_5, x.Value); err != nil {
 		return err
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -500,33 +528,40 @@
 	if err := dec.StartValue(__VDLType_union_7); err != nil {
 		return err
 	}
-	f, err := dec.NextField()
-	if err != nil {
+	decType := dec.Type()
+	index, err := dec.NextField()
+	switch {
+	case err != nil:
 		return err
+	case index == -1:
+		return fmt.Errorf("missing field in union %T, from %v", x, decType)
 	}
-	switch f {
-	case "Stdout":
+	if decType != __VDLType_union_7 {
+		name := decType.Field(index).Name
+		index = __VDLType_union_7.FieldIndexByName(name)
+		if index == -1 {
+			return fmt.Errorf("field %q not in union %T, from %v", name, x, decType)
+		}
+	}
+	switch index {
+	case 0:
 		var field ServerShellPacketStdout
 		if err := dec.ReadValueBytes(-1, &field.Value); err != nil {
 			return err
 		}
 		*x = field
-	case "Stderr":
+	case 1:
 		var field ServerShellPacketStderr
 		if err := dec.ReadValueBytes(-1, &field.Value); err != nil {
 			return err
 		}
 		*x = field
-	case "":
-		return fmt.Errorf("missing field in union %T, from %v", x, dec.Type())
-	default:
-		return fmt.Errorf("field %q not in union %T, from %v", f, x, dec.Type())
 	}
-	switch f, err := dec.NextField(); {
+	switch index, err := dec.NextField(); {
 	case err != nil:
 		return err
-	case f != "":
-		return fmt.Errorf("extra field %q in union %T, from %v", f, x, dec.Type())
+	case index != -1:
+		return fmt.Errorf("extra field %d in union %T, from %v", index, x, dec.Type())
 	}
 	return dec.FinishValue()
 }
diff --git a/lib/discovery/discovery.vdl.go b/lib/discovery/discovery.vdl.go
index 1bd9fbb..b8a734f 100644
--- a/lib/discovery/discovery.vdl.go
+++ b/lib/discovery/discovery.vdl.go
@@ -221,7 +221,7 @@
 		return err
 	}
 	if !x.Ad.VDLIsZero() {
-		if err := enc.NextField("Ad"); err != nil {
+		if err := enc.NextField(0); err != nil {
 			return err
 		}
 		if err := x.Ad.VDLWrite(enc); err != nil {
@@ -229,12 +229,12 @@
 		}
 	}
 	if x.EncryptionAlgorithm != 0 {
-		if err := enc.NextFieldValueInt("EncryptionAlgorithm", __VDLType_int32_2, int64(x.EncryptionAlgorithm)); err != nil {
+		if err := enc.NextFieldValueInt(1, __VDLType_int32_2, int64(x.EncryptionAlgorithm)); err != nil {
 			return err
 		}
 	}
 	if len(x.EncryptionKeys) != 0 {
-		if err := enc.NextField("EncryptionKeys"); err != nil {
+		if err := enc.NextField(2); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_list_1(enc, x.EncryptionKeys); err != nil {
@@ -242,17 +242,17 @@
 		}
 	}
 	if x.Hash != (AdHash{}) {
-		if err := enc.NextFieldValueBytes("Hash", __VDLType_array_5, x.Hash[:]); err != nil {
+		if err := enc.NextFieldValueBytes(3, __VDLType_array_5, x.Hash[:]); err != nil {
 			return err
 		}
 	}
 	if x.TimestampNs != 0 {
-		if err := enc.NextFieldValueInt("TimestampNs", vdl.Int64Type, x.TimestampNs); err != nil {
+		if err := enc.NextFieldValueInt(4, vdl.Int64Type, x.TimestampNs); err != nil {
 			return err
 		}
 	}
 	if len(x.DirAddrs) != 0 {
-		if err := enc.NextField("DirAddrs"); err != nil {
+		if err := enc.NextField(5); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_list_2(enc, x.DirAddrs); err != nil {
@@ -260,16 +260,16 @@
 		}
 	}
 	if x.Status != 0 {
-		if err := enc.NextFieldValueUint("Status", __VDLType_byte_4, uint64(x.Status)); err != nil {
+		if err := enc.NextFieldValueUint(6, __VDLType_byte_4, uint64(x.Status)); err != nil {
 			return err
 		}
 	}
 	if x.Lost {
-		if err := enc.NextFieldValueBool("Lost", vdl.BoolType, x.Lost); err != nil {
+		if err := enc.NextFieldValueBool(7, vdl.BoolType, x.Lost); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -316,63 +316,70 @@
 	if err := dec.StartValue(__VDLType_struct_6); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Ad":
+		}
+		if decType != __VDLType_struct_6 {
+			index = __VDLType_struct_6.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			if err := x.Ad.VDLRead(dec); err != nil {
 				return err
 			}
-		case "EncryptionAlgorithm":
+		case 1:
 			switch value, err := dec.ReadValueInt(32); {
 			case err != nil:
 				return err
 			default:
 				x.EncryptionAlgorithm = EncryptionAlgorithm(value)
 			}
-		case "EncryptionKeys":
+		case 2:
 			if err := __VDLReadAnon_list_1(dec, &x.EncryptionKeys); err != nil {
 				return err
 			}
-		case "Hash":
+		case 3:
 			bytes := x.Hash[:]
 			if err := dec.ReadValueBytes(8, &bytes); err != nil {
 				return err
 			}
-		case "TimestampNs":
+		case 4:
 			switch value, err := dec.ReadValueInt(64); {
 			case err != nil:
 				return err
 			default:
 				x.TimestampNs = value
 			}
-		case "DirAddrs":
+		case 5:
 			if err := __VDLReadAnon_list_2(dec, &x.DirAddrs); err != nil {
 				return err
 			}
-		case "Status":
+		case 6:
 			switch value, err := dec.ReadValueUint(8); {
 			case err != nil:
 				return err
 			default:
 				x.Status = AdStatus(value)
 			}
-		case "Lost":
+		case 7:
 			switch value, err := dec.ReadValueBool(); {
 			case err != nil:
 				return err
 			default:
 				x.Lost = value
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
diff --git a/lib/discovery/testdata/testdata.vdl.go b/lib/discovery/testdata/testdata.vdl.go
index 7ad0f1d..8e36553 100644
--- a/lib/discovery/testdata/testdata.vdl.go
+++ b/lib/discovery/testdata/testdata.vdl.go
@@ -45,7 +45,7 @@
 		return err
 	}
 	if len(x.In) != 0 {
-		if err := enc.NextField("In"); err != nil {
+		if err := enc.NextField(0); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_list_1(enc, x.In); err != nil {
@@ -53,11 +53,11 @@
 		}
 	}
 	if len(x.Packed) != 0 {
-		if err := enc.NextFieldValueBytes("Packed", __VDLType_list_3, x.Packed); err != nil {
+		if err := enc.NextFieldValueBytes(1, __VDLType_list_3, x.Packed); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -86,26 +86,33 @@
 	if err := dec.StartValue(__VDLType_struct_1); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "In":
+		}
+		if decType != __VDLType_struct_1 {
+			index = __VDLType_struct_1.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			if err := __VDLReadAnon_list_1(dec, &x.In); err != nil {
 				return err
 			}
-		case "Packed":
+		case 1:
 			if err := dec.ReadValueBytes(-1, &x.Packed); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -166,12 +173,12 @@
 		return err
 	}
 	if x.Algo != 0 {
-		if err := enc.NextFieldValueInt("Algo", __VDLType_int32_5, int64(x.Algo)); err != nil {
+		if err := enc.NextFieldValueInt(0, __VDLType_int32_5, int64(x.Algo)); err != nil {
 			return err
 		}
 	}
 	if len(x.Keys) != 0 {
-		if err := enc.NextField("Keys"); err != nil {
+		if err := enc.NextField(1); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_list_2(enc, x.Keys); err != nil {
@@ -179,11 +186,11 @@
 		}
 	}
 	if len(x.Packed) != 0 {
-		if err := enc.NextFieldValueBytes("Packed", __VDLType_list_3, x.Packed); err != nil {
+		if err := enc.NextFieldValueBytes(2, __VDLType_list_3, x.Packed); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -212,33 +219,40 @@
 	if err := dec.StartValue(__VDLType_struct_4); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Algo":
+		}
+		if decType != __VDLType_struct_4 {
+			index = __VDLType_struct_4.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueInt(32); {
 			case err != nil:
 				return err
 			default:
 				x.Algo = discovery.EncryptionAlgorithm(value)
 			}
-		case "Keys":
+		case 1:
 			if err := __VDLReadAnon_list_2(dec, &x.Keys); err != nil {
 				return err
 			}
-		case "Packed":
+		case 2:
 			if err := dec.ReadValueBytes(-1, &x.Packed); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -292,16 +306,16 @@
 		return err
 	}
 	if x.In != "" {
-		if err := enc.NextFieldValueString("In", vdl.StringType, x.In); err != nil {
+		if err := enc.NextFieldValueString(0, vdl.StringType, x.In); err != nil {
 			return err
 		}
 	}
 	if x.Want != "" {
-		if err := enc.NextFieldValueString("Want", vdl.StringType, x.Want); err != nil {
+		if err := enc.NextFieldValueString(1, vdl.StringType, x.Want); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -312,32 +326,39 @@
 	if err := dec.StartValue(__VDLType_struct_8); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "In":
+		}
+		if decType != __VDLType_struct_8 {
+			index = __VDLType_struct_8.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.In = value
 			}
-		case "Want":
+		case 1:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.Want = value
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
diff --git a/lib/raft/raft.vdl.go b/lib/raft/raft.vdl.go
index 0dddf77..0f5f025 100644
--- a/lib/raft/raft.vdl.go
+++ b/lib/raft/raft.vdl.go
@@ -118,26 +118,26 @@
 		return err
 	}
 	if x.Term != 0 {
-		if err := enc.NextFieldValueUint("Term", __VDLType_uint64_1, uint64(x.Term)); err != nil {
+		if err := enc.NextFieldValueUint(0, __VDLType_uint64_1, uint64(x.Term)); err != nil {
 			return err
 		}
 	}
 	if x.Index != 0 {
-		if err := enc.NextFieldValueUint("Index", __VDLType_uint64_2, uint64(x.Index)); err != nil {
+		if err := enc.NextFieldValueUint(1, __VDLType_uint64_2, uint64(x.Index)); err != nil {
 			return err
 		}
 	}
 	if len(x.Cmd) != 0 {
-		if err := enc.NextFieldValueBytes("Cmd", __VDLType_list_4, x.Cmd); err != nil {
+		if err := enc.NextFieldValueBytes(2, __VDLType_list_4, x.Cmd); err != nil {
 			return err
 		}
 	}
 	if x.Type != 0 {
-		if err := enc.NextFieldValueUint("Type", vdl.ByteType, uint64(x.Type)); err != nil {
+		if err := enc.NextFieldValueUint(3, vdl.ByteType, uint64(x.Type)); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -148,43 +148,50 @@
 	if err := dec.StartValue(__VDLType_struct_3); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Term":
+		}
+		if decType != __VDLType_struct_3 {
+			index = __VDLType_struct_3.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueUint(64); {
 			case err != nil:
 				return err
 			default:
 				x.Term = Term(value)
 			}
-		case "Index":
+		case 1:
 			switch value, err := dec.ReadValueUint(64); {
 			case err != nil:
 				return err
 			default:
 				x.Index = Index(value)
 			}
-		case "Cmd":
+		case 2:
 			if err := dec.ReadValueBytes(-1, &x.Cmd); err != nil {
 				return err
 			}
-		case "Type":
+		case 3:
 			switch value, err := dec.ReadValueUint(8); {
 			case err != nil:
 				return err
 			default:
 				x.Type = byte(value)
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
diff --git a/lib/security/bcrypter/bcrypter.vdl.go b/lib/security/bcrypter/bcrypter.vdl.go
index ca7f9de..f0872c2 100644
--- a/lib/security/bcrypter/bcrypter.vdl.go
+++ b/lib/security/bcrypter/bcrypter.vdl.go
@@ -55,19 +55,19 @@
 		return err
 	}
 	if x.PatternId != "" {
-		if err := enc.NextFieldValueString("PatternId", vdl.StringType, x.PatternId); err != nil {
+		if err := enc.NextFieldValueString(0, vdl.StringType, x.PatternId); err != nil {
 			return err
 		}
 	}
 	if len(x.Bytes) != 0 {
-		if err := enc.NextField("Bytes"); err != nil {
+		if err := enc.NextField(1); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_map_1(enc, x.Bytes); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -99,29 +99,36 @@
 	if err := dec.StartValue(__VDLType_struct_1); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "PatternId":
+		}
+		if decType != __VDLType_struct_1 {
+			index = __VDLType_struct_1.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.PatternId = value
 			}
-		case "Bytes":
+		case 1:
 			if err := __VDLReadAnon_map_1(dec, &x.Bytes); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -186,16 +193,16 @@
 		return err
 	}
 	if x.Blessing != "" {
-		if err := enc.NextFieldValueString("Blessing", vdl.StringType, x.Blessing); err != nil {
+		if err := enc.NextFieldValueString(0, vdl.StringType, x.Blessing); err != nil {
 			return err
 		}
 	}
 	if len(x.Params) != 0 {
-		if err := enc.NextFieldValueBytes("Params", __VDLType_list_3, x.Params); err != nil {
+		if err := enc.NextFieldValueBytes(1, __VDLType_list_3, x.Params); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -206,29 +213,36 @@
 	if err := dec.StartValue(__VDLType_struct_4); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Blessing":
+		}
+		if decType != __VDLType_struct_4 {
+			index = __VDLType_struct_4.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.Blessing = value
 			}
-		case "Params":
+		case 1:
 			if err := dec.ReadValueBytes(-1, &x.Params); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -281,12 +295,12 @@
 		return err
 	}
 	if x.Blessing != "" {
-		if err := enc.NextFieldValueString("Blessing", vdl.StringType, x.Blessing); err != nil {
+		if err := enc.NextFieldValueString(0, vdl.StringType, x.Blessing); err != nil {
 			return err
 		}
 	}
 	if !x.Params.VDLIsZero() {
-		if err := enc.NextField("Params"); err != nil {
+		if err := enc.NextField(1); err != nil {
 			return err
 		}
 		if err := x.Params.VDLWrite(enc); err != nil {
@@ -294,14 +308,14 @@
 		}
 	}
 	if len(x.Keys) != 0 {
-		if err := enc.NextField("Keys"); err != nil {
+		if err := enc.NextField(2); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_list_2(enc, x.Keys); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -330,33 +344,40 @@
 	if err := dec.StartValue(__VDLType_struct_5); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Blessing":
+		}
+		if decType != __VDLType_struct_5 {
+			index = __VDLType_struct_5.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.Blessing = value
 			}
-		case "Params":
+		case 1:
 			if err := x.Params.VDLRead(dec); err != nil {
 				return err
 			}
-		case "Keys":
+		case 2:
 			if err := __VDLReadAnon_list_2(dec, &x.Keys); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
diff --git a/lib/security/security.vdl.go b/lib/security/security.vdl.go
index a28624a..c2b5a85 100644
--- a/lib/security/security.vdl.go
+++ b/lib/security/security.vdl.go
@@ -170,7 +170,7 @@
 		return err
 	}
 	if !x.Discharge.VDLIsZero() {
-		if err := enc.NextField("Discharge"); err != nil {
+		if err := enc.NextField(0); err != nil {
 			return err
 		}
 		var wire security.WireDischarge
@@ -182,7 +182,7 @@
 		}
 	}
 	if !x.CacheTime.IsZero() {
-		if err := enc.NextField("CacheTime"); err != nil {
+		if err := enc.NextField(1); err != nil {
 			return err
 		}
 		var wire vdltime.Time
@@ -193,7 +193,7 @@
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -204,15 +204,26 @@
 	if err := dec.StartValue(__VDLType_struct_5); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Discharge":
+		}
+		if decType != __VDLType_struct_5 {
+			index = __VDLType_struct_5.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			var wire security.WireDischarge
 			if err := security.VDLReadWireDischarge(dec, &wire); err != nil {
 				return err
@@ -220,7 +231,7 @@
 			if err := security.WireDischargeToNative(wire, &x.Discharge); err != nil {
 				return err
 			}
-		case "CacheTime":
+		case 1:
 			var wire vdltime.Time
 			if err := wire.VDLRead(dec); err != nil {
 				return err
@@ -228,10 +239,6 @@
 			if err := vdltime.TimeToNative(wire, &x.CacheTime); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -285,7 +292,7 @@
 		return err
 	}
 	if len(x.PeerBlessings) != 0 {
-		if err := enc.NextField("PeerBlessings"); err != nil {
+		if err := enc.NextField(0); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_map_2(enc, x.PeerBlessings); err != nil {
@@ -293,7 +300,7 @@
 		}
 	}
 	if !x.DefaultBlessings.IsZero() {
-		if err := enc.NextField("DefaultBlessings"); err != nil {
+		if err := enc.NextField(1); err != nil {
 			return err
 		}
 		var wire security.WireBlessings
@@ -305,7 +312,7 @@
 		}
 	}
 	if len(x.DischargeCache) != 0 {
-		if err := enc.NextField("DischargeCache"); err != nil {
+		if err := enc.NextField(2); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_map_3(enc, x.DischargeCache); err != nil {
@@ -313,7 +320,7 @@
 		}
 	}
 	if len(x.Discharges) != 0 {
-		if err := enc.NextField("Discharges"); err != nil {
+		if err := enc.NextField(3); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_map_4(enc, x.Discharges); err != nil {
@@ -321,11 +328,11 @@
 		}
 	}
 	if x.CacheKeyFormat != 0 {
-		if err := enc.NextFieldValueUint("CacheKeyFormat", vdl.Uint32Type, uint64(x.CacheKeyFormat)); err != nil {
+		if err := enc.NextFieldValueUint(4, vdl.Uint32Type, uint64(x.CacheKeyFormat)); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -415,19 +422,30 @@
 	if err := dec.StartValue(__VDLType_struct_8); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "PeerBlessings":
+		}
+		if decType != __VDLType_struct_8 {
+			index = __VDLType_struct_8.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			if err := __VDLReadAnon_map_2(dec, &x.PeerBlessings); err != nil {
 				return err
 			}
-		case "DefaultBlessings":
+		case 1:
 			var wire security.WireBlessings
 			if err := wire.VDLRead(dec); err != nil {
 				return err
@@ -435,25 +453,21 @@
 			if err := security.WireBlessingsToNative(wire, &x.DefaultBlessings); err != nil {
 				return err
 			}
-		case "DischargeCache":
+		case 2:
 			if err := __VDLReadAnon_map_3(dec, &x.DischargeCache); err != nil {
 				return err
 			}
-		case "Discharges":
+		case 3:
 			if err := __VDLReadAnon_map_4(dec, &x.Discharges); err != nil {
 				return err
 			}
-		case "CacheKeyFormat":
+		case 4:
 			switch value, err := dec.ReadValueUint(32); {
 			case err != nil:
 				return err
 			default:
 				x.CacheKeyFormat = uint32(value)
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
diff --git a/lib/security/serialization/serialization.vdl.go b/lib/security/serialization/serialization.vdl.go
index 93e6e32..8390f5a 100644
--- a/lib/security/serialization/serialization.vdl.go
+++ b/lib/security/serialization/serialization.vdl.go
@@ -36,11 +36,11 @@
 		return err
 	}
 	if x.ChunkSizeBytes != 0 {
-		if err := enc.NextFieldValueInt("ChunkSizeBytes", vdl.Int64Type, x.ChunkSizeBytes); err != nil {
+		if err := enc.NextFieldValueInt(0, vdl.Int64Type, x.ChunkSizeBytes); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -51,25 +51,32 @@
 	if err := dec.StartValue(__VDLType_struct_1); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "ChunkSizeBytes":
+		}
+		if decType != __VDLType_struct_1 {
+			index = __VDLType_struct_1.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueInt(64); {
 			case err != nil:
 				return err
 			default:
 				x.ChunkSizeBytes = value
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -153,13 +160,13 @@
 	if err := enc.StartValue(__VDLType_union_4); err != nil {
 		return err
 	}
-	if err := enc.NextField("Signature"); err != nil {
+	if err := enc.NextField(0); err != nil {
 		return err
 	}
 	if err := x.Value.VDLWrite(enc); err != nil {
 		return err
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -169,10 +176,10 @@
 	if err := enc.StartValue(__VDLType_union_4); err != nil {
 		return err
 	}
-	if err := enc.NextFieldValueBytes("Hash", __VDLType_array_2, x.Value[:]); err != nil {
+	if err := enc.NextFieldValueBytes(1, __VDLType_array_2, x.Value[:]); err != nil {
 		return err
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -182,34 +189,41 @@
 	if err := dec.StartValue(__VDLType_union_4); err != nil {
 		return err
 	}
-	f, err := dec.NextField()
-	if err != nil {
+	decType := dec.Type()
+	index, err := dec.NextField()
+	switch {
+	case err != nil:
 		return err
+	case index == -1:
+		return fmt.Errorf("missing field in union %T, from %v", x, decType)
 	}
-	switch f {
-	case "Signature":
+	if decType != __VDLType_union_4 {
+		name := decType.Field(index).Name
+		index = __VDLType_union_4.FieldIndexByName(name)
+		if index == -1 {
+			return fmt.Errorf("field %q not in union %T, from %v", name, x, decType)
+		}
+	}
+	switch index {
+	case 0:
 		var field SignedDataSignature
 		if err := field.Value.VDLRead(dec); err != nil {
 			return err
 		}
 		*x = field
-	case "Hash":
+	case 1:
 		var field SignedDataHash
 		bytes := field.Value[:]
 		if err := dec.ReadValueBytes(32, &bytes); err != nil {
 			return err
 		}
 		*x = field
-	case "":
-		return fmt.Errorf("missing field in union %T, from %v", x, dec.Type())
-	default:
-		return fmt.Errorf("field %q not in union %T, from %v", f, x, dec.Type())
 	}
-	switch f, err := dec.NextField(); {
+	switch index, err := dec.NextField(); {
 	case err != nil:
 		return err
-	case f != "":
-		return fmt.Errorf("extra field %q in union %T, from %v", f, x, dec.Type())
+	case index != -1:
+		return fmt.Errorf("extra field %d in union %T, from %v", index, x, dec.Type())
 	}
 	return dec.FinishValue()
 }
diff --git a/lib/vdl/codegen/golang/reader.go b/lib/vdl/codegen/golang/reader.go
index 89fbb04..894d49d 100644
--- a/lib/vdl/codegen/golang/reader.go
+++ b/lib/vdl/codegen/golang/reader.go
@@ -450,59 +450,73 @@
 }
 
 func (g *genRead) bodyStruct(tt *vdl.Type, arg namedArg) string {
-	s := `
+	s := fmt.Sprintf(`
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
+		case index == -1:
+			return dec.FinishValue()
 		}
-		switch f {
-		case "":
-			return dec.FinishValue()`
-	for f := 0; f < tt.NumField(); f++ {
-		field := tt.Field(f)
+		if decType != %[1]s {
+			index = %[1]s.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {`, g.TypeOf(tt))
+	for index := 0; index < tt.NumField(); index++ {
+		field := tt.Field(index)
 		fieldBody := g.body(field.Type, arg.Field(field), false)
 		s += fmt.Sprintf(`
-		case %[1]q:%[2]s`, field.Name, fieldBody)
+		case %[1]d:%[2]s`, index, fieldBody)
 	}
 	return s + `
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}`
 }
 
 func (g *genRead) bodyUnion(tt *vdl.Type, arg namedArg) string {
-	s := `
-	f, err := dec.NextField()
-	if err != nil {
+	s := fmt.Sprintf(`
+	decType := dec.Type()
+	index, err := dec.NextField()
+	switch {
+	case err != nil:
 		return err
+	case index == -1:
+		return %[1]sErrorf("missing field in union %%T, from %%v", %[2]s, decType)
 	}
-  switch f {`
-	for f := 0; f < tt.NumField(); f++ {
+	if decType != %[3]s {
+		name := decType.Field(index).Name
+		index = %[3]s.FieldIndexByName(name)
+		if index == -1 {
+			return %[1]sErrorf("field %%q not in union %%T, from %%v", name, %[2]s, decType)
+		}
+	}
+  switch index {`, g.Pkg("fmt"), arg.Ptr(), g.TypeOf(tt))
+	for index := 0; index < tt.NumField(); index++ {
 		// TODO(toddw): Change to using pointers to the union field structs, to
 		// resolve https://v.io/i/455
-		field := tt.Field(f)
+		field := tt.Field(index)
 		fieldArg := typedArg("field.Value", field.Type)
 		fieldBody := g.body(field.Type, fieldArg, false)
 		s += fmt.Sprintf(`
-	case %[1]q:
-		var field %[2]s%[1]s%[3]s
-		%[4]s = field`, field.Name, typeGoWire(g.goData, tt), fieldBody, arg.Ref())
+	case %[1]d:
+		var field %[2]s%[3]s%[4]s
+		%[5]s = field`, index, typeGoWire(g.goData, tt), field.Name, fieldBody, arg.Ref())
 	}
 	return s + fmt.Sprintf(`
-	case "":
-		return %[1]sErrorf("missing field in union %%T, from %%v", %[2]s, dec.Type())
-	default:
-		return %[1]sErrorf("field %%q not in union %%T, from %%v", f, %[2]s, dec.Type())
 	}
-	switch f, err := dec.NextField(); {
+	switch index, err := dec.NextField(); {
 	case err != nil:
 		return err
-	case f != "":
-		return %[1]sErrorf("extra field %%q in union %%T, from %%v", f, %[2]s, dec.Type())
+	case index != -1:
+		return %[1]sErrorf("extra field %%d in union %%T, from %%v", index, %[2]s, dec.Type())
 	}`, g.Pkg("fmt"), arg.Ptr())
 }
 
diff --git a/lib/vdl/codegen/golang/writer.go b/lib/vdl/codegen/golang/writer.go
index 87ce8cc..27f8496 100644
--- a/lib/vdl/codegen/golang/writer.go
+++ b/lib/vdl/codegen/golang/writer.go
@@ -6,6 +6,7 @@
 
 import (
 	"fmt"
+	"strconv"
 	"strings"
 
 	"v.io/v23/vdl"
@@ -49,9 +50,9 @@
 // concrete union struct.
 func (g *genWrite) genUnionDef(def *compile.TypeDef) string {
 	var s string
-	for ix := 0; ix < def.Type.NumField(); ix++ {
-		field := def.Type.Field(ix)
-		body := g.bodyUnion(field, namedArg{"x", false})
+	for index := 0; index < def.Type.NumField(); index++ {
+		field := def.Type.Field(index)
+		body := g.bodyUnion(index, field, namedArg{"x", false})
 		s += fmt.Sprintf(`
 func (x %[1]s%[2]s) VDLWrite(enc %[3]sEncoder) error {
 	if err := enc.StartValue(%[4]s); err != nil {
@@ -315,7 +316,7 @@
 		return err
 	}`
 	encNextFieldDone = `
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}`
 )
@@ -408,8 +409,8 @@
 
 func (g *genWrite) bodyStruct(tt *vdl.Type, arg namedArg) string {
 	var s string
-	for i := 0; i < tt.NumField(); i++ {
-		field := tt.Field(i)
+	for index := 0; index < tt.NumField(); index++ {
+		field := tt.Field(index)
 		fieldArg := arg.Field(field)
 		zero := genIsZero{g.goData}
 		expr := zero.Expr(ifNeZero, field.Type, fieldArg, field.Name)
@@ -417,7 +418,7 @@
 	if %[1]s {`, expr)
 		method, params, init := g.fastpathInfo(field.Type, fieldArg, true)
 		if method != "" {
-			params = append([]string{`"` + field.Name + `"`}, params...)
+			params = append([]string{strconv.Itoa(index)}, params...)
 			s += fmt.Sprintf(`%[1]s
 		if err := enc.NextFieldValue%[2]s(%[3]s); err != nil {
 			return err
@@ -427,9 +428,9 @@
 			// 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 {
+		if err := enc.NextField(%[1]d); err != nil {
 			return err
-		}%[2]s`, field.Name, fieldBody)
+		}%[2]s`, index, fieldBody)
 		}
 		s += `
 	}`
@@ -438,21 +439,21 @@
 	return s
 }
 
-func (g *genWrite) bodyUnion(field vdl.Field, arg namedArg) string {
+func (g *genWrite) bodyUnion(index int, field vdl.Field, arg namedArg) string {
 	var s string
 	fieldArg := typedArg(arg.Name+".Value", field.Type)
 	method, params, init := g.fastpathInfo(field.Type, fieldArg, true)
 	if method != "" {
-		params = append([]string{`"` + field.Name + `"`}, params...)
+		params = append([]string{strconv.Itoa(index)}, 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 {
+	if err := enc.NextField(%[1]d); err != nil {
 			return err
-	}`, field.Name)
+	}`, index)
 		s += g.body(field.Type, fieldArg, false, false)
 	}
 	s += encNextFieldDone
diff --git a/lib/vdl/testdata/base/base.vdl.go b/lib/vdl/testdata/base/base.vdl.go
index 7d6160b..d201fb9 100644
--- a/lib/vdl/testdata/base/base.vdl.go
+++ b/lib/vdl/testdata/base/base.vdl.go
@@ -672,21 +672,21 @@
 		return err
 	}
 	if x.A {
-		if err := enc.NextFieldValueBool("A", vdl.BoolType, x.A); err != nil {
+		if err := enc.NextFieldValueBool(0, vdl.BoolType, x.A); err != nil {
 			return err
 		}
 	}
 	if x.B != "" {
-		if err := enc.NextFieldValueString("B", vdl.StringType, x.B); err != nil {
+		if err := enc.NextFieldValueString(1, vdl.StringType, x.B); err != nil {
 			return err
 		}
 	}
 	if x.C != 0 {
-		if err := enc.NextFieldValueInt("C", vdl.Int32Type, int64(x.C)); err != nil {
+		if err := enc.NextFieldValueInt(2, vdl.Int32Type, int64(x.C)); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -697,39 +697,46 @@
 	if err := dec.StartValue(__VDLType_struct_18); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "A":
+		}
+		if decType != __VDLType_struct_18 {
+			index = __VDLType_struct_18.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueBool(); {
 			case err != nil:
 				return err
 			default:
 				x.A = value
 			}
-		case "B":
+		case 1:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.B = value
 			}
-		case "C":
+		case 2:
 			switch value, err := dec.ReadValueInt(32); {
 			case err != nil:
 				return err
 			default:
 				x.C = int32(value)
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -797,10 +804,10 @@
 	if err := enc.StartValue(__VDLType_union_19); err != nil {
 		return err
 	}
-	if err := enc.NextFieldValueBool("A", vdl.BoolType, x.Value); err != nil {
+	if err := enc.NextFieldValueBool(0, vdl.BoolType, x.Value); err != nil {
 		return err
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -810,10 +817,10 @@
 	if err := enc.StartValue(__VDLType_union_19); err != nil {
 		return err
 	}
-	if err := enc.NextFieldValueString("B", vdl.StringType, x.Value); err != nil {
+	if err := enc.NextFieldValueString(1, vdl.StringType, x.Value); err != nil {
 		return err
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -823,10 +830,10 @@
 	if err := enc.StartValue(__VDLType_union_19); err != nil {
 		return err
 	}
-	if err := enc.NextFieldValueInt("C", vdl.Int32Type, int64(x.Value)); err != nil {
+	if err := enc.NextFieldValueInt(2, vdl.Int32Type, int64(x.Value)); err != nil {
 		return err
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -836,12 +843,23 @@
 	if err := dec.StartValue(__VDLType_union_19); err != nil {
 		return err
 	}
-	f, err := dec.NextField()
-	if err != nil {
+	decType := dec.Type()
+	index, err := dec.NextField()
+	switch {
+	case err != nil:
 		return err
+	case index == -1:
+		return fmt.Errorf("missing field in union %T, from %v", x, decType)
 	}
-	switch f {
-	case "A":
+	if decType != __VDLType_union_19 {
+		name := decType.Field(index).Name
+		index = __VDLType_union_19.FieldIndexByName(name)
+		if index == -1 {
+			return fmt.Errorf("field %q not in union %T, from %v", name, x, decType)
+		}
+	}
+	switch index {
+	case 0:
 		var field NamedUnionA
 		switch value, err := dec.ReadValueBool(); {
 		case err != nil:
@@ -850,7 +868,7 @@
 			field.Value = value
 		}
 		*x = field
-	case "B":
+	case 1:
 		var field NamedUnionB
 		switch value, err := dec.ReadValueString(); {
 		case err != nil:
@@ -859,7 +877,7 @@
 			field.Value = value
 		}
 		*x = field
-	case "C":
+	case 2:
 		var field NamedUnionC
 		switch value, err := dec.ReadValueInt(32); {
 		case err != nil:
@@ -868,16 +886,12 @@
 			field.Value = int32(value)
 		}
 		*x = field
-	case "":
-		return fmt.Errorf("missing field in union %T, from %v", x, dec.Type())
-	default:
-		return fmt.Errorf("field %q not in union %T, from %v", f, x, dec.Type())
 	}
-	switch f, err := dec.NextField(); {
+	switch index, err := dec.NextField(); {
 	case err != nil:
 		return err
-	case f != "":
-		return fmt.Errorf("extra field %q in union %T, from %v", f, x, dec.Type())
+	case index != -1:
+		return fmt.Errorf("extra field %d in union %T, from %v", index, x, dec.Type())
 	}
 	return dec.FinishValue()
 }
@@ -1015,67 +1029,67 @@
 		return err
 	}
 	if x.A0 {
-		if err := enc.NextFieldValueBool("A0", vdl.BoolType, x.A0); err != nil {
+		if err := enc.NextFieldValueBool(0, vdl.BoolType, x.A0); err != nil {
 			return err
 		}
 	}
 	if x.A1 != 0 {
-		if err := enc.NextFieldValueUint("A1", vdl.ByteType, uint64(x.A1)); err != nil {
+		if err := enc.NextFieldValueUint(1, vdl.ByteType, uint64(x.A1)); err != nil {
 			return err
 		}
 	}
 	if x.A2 != 0 {
-		if err := enc.NextFieldValueUint("A2", vdl.Uint16Type, uint64(x.A2)); err != nil {
+		if err := enc.NextFieldValueUint(2, vdl.Uint16Type, uint64(x.A2)); err != nil {
 			return err
 		}
 	}
 	if x.A3 != 0 {
-		if err := enc.NextFieldValueUint("A3", vdl.Uint32Type, uint64(x.A3)); err != nil {
+		if err := enc.NextFieldValueUint(3, vdl.Uint32Type, uint64(x.A3)); err != nil {
 			return err
 		}
 	}
 	if x.A4 != 0 {
-		if err := enc.NextFieldValueUint("A4", vdl.Uint64Type, x.A4); err != nil {
+		if err := enc.NextFieldValueUint(4, vdl.Uint64Type, x.A4); err != nil {
 			return err
 		}
 	}
 	if x.A5 != 0 {
-		if err := enc.NextFieldValueInt("A5", vdl.Int8Type, int64(x.A5)); err != nil {
+		if err := enc.NextFieldValueInt(5, vdl.Int8Type, int64(x.A5)); err != nil {
 			return err
 		}
 	}
 	if x.A6 != 0 {
-		if err := enc.NextFieldValueInt("A6", vdl.Int16Type, int64(x.A6)); err != nil {
+		if err := enc.NextFieldValueInt(6, vdl.Int16Type, int64(x.A6)); err != nil {
 			return err
 		}
 	}
 	if x.A7 != 0 {
-		if err := enc.NextFieldValueInt("A7", vdl.Int32Type, int64(x.A7)); err != nil {
+		if err := enc.NextFieldValueInt(7, vdl.Int32Type, int64(x.A7)); err != nil {
 			return err
 		}
 	}
 	if x.A8 != 0 {
-		if err := enc.NextFieldValueInt("A8", vdl.Int64Type, x.A8); err != nil {
+		if err := enc.NextFieldValueInt(8, vdl.Int64Type, x.A8); err != nil {
 			return err
 		}
 	}
 	if x.A9 != 0 {
-		if err := enc.NextFieldValueFloat("A9", vdl.Float32Type, float64(x.A9)); err != nil {
+		if err := enc.NextFieldValueFloat(9, vdl.Float32Type, float64(x.A9)); err != nil {
 			return err
 		}
 	}
 	if x.A10 != 0 {
-		if err := enc.NextFieldValueFloat("A10", vdl.Float64Type, x.A10); err != nil {
+		if err := enc.NextFieldValueFloat(10, vdl.Float64Type, x.A10); err != nil {
 			return err
 		}
 	}
 	if x.A11 != "" {
-		if err := enc.NextFieldValueString("A11", vdl.StringType, x.A11); err != nil {
+		if err := enc.NextFieldValueString(11, vdl.StringType, x.A11); err != nil {
 			return err
 		}
 	}
 	if x.A12 != nil {
-		if err := enc.NextField("A12"); err != nil {
+		if err := enc.NextField(12); err != nil {
 			return err
 		}
 		if err := verror.VDLWrite(enc, x.A12); err != nil {
@@ -1083,7 +1097,7 @@
 		}
 	}
 	if x.A13 != nil && !x.A13.VDLIsZero() {
-		if err := enc.NextField("A13"); err != nil {
+		if err := enc.NextField(13); err != nil {
 			return err
 		}
 		if err := x.A13.VDLWrite(enc); err != nil {
@@ -1091,84 +1105,84 @@
 		}
 	}
 	if x.A14 != nil && x.A14 != vdl.AnyType {
-		if err := enc.NextFieldValueTypeObject("A14", x.A14); err != nil {
+		if err := enc.NextFieldValueTypeObject(14, x.A14); err != nil {
 			return err
 		}
 	}
 	if x.B0 {
-		if err := enc.NextFieldValueBool("B0", __VDLType_bool_1, bool(x.B0)); err != nil {
+		if err := enc.NextFieldValueBool(15, __VDLType_bool_1, bool(x.B0)); err != nil {
 			return err
 		}
 	}
 	if x.B1 != 0 {
-		if err := enc.NextFieldValueUint("B1", __VDLType_byte_2, uint64(x.B1)); err != nil {
+		if err := enc.NextFieldValueUint(16, __VDLType_byte_2, uint64(x.B1)); err != nil {
 			return err
 		}
 	}
 	if x.B2 != 0 {
-		if err := enc.NextFieldValueUint("B2", __VDLType_uint16_3, uint64(x.B2)); err != nil {
+		if err := enc.NextFieldValueUint(17, __VDLType_uint16_3, uint64(x.B2)); err != nil {
 			return err
 		}
 	}
 	if x.B3 != 0 {
-		if err := enc.NextFieldValueUint("B3", __VDLType_uint32_4, uint64(x.B3)); err != nil {
+		if err := enc.NextFieldValueUint(18, __VDLType_uint32_4, uint64(x.B3)); err != nil {
 			return err
 		}
 	}
 	if x.B4 != 0 {
-		if err := enc.NextFieldValueUint("B4", __VDLType_uint64_5, uint64(x.B4)); err != nil {
+		if err := enc.NextFieldValueUint(19, __VDLType_uint64_5, uint64(x.B4)); err != nil {
 			return err
 		}
 	}
 	if x.B5 != 0 {
-		if err := enc.NextFieldValueInt("B5", __VDLType_int8_6, int64(x.B5)); err != nil {
+		if err := enc.NextFieldValueInt(20, __VDLType_int8_6, int64(x.B5)); err != nil {
 			return err
 		}
 	}
 	if x.B6 != 0 {
-		if err := enc.NextFieldValueInt("B6", __VDLType_int16_7, int64(x.B6)); err != nil {
+		if err := enc.NextFieldValueInt(21, __VDLType_int16_7, int64(x.B6)); err != nil {
 			return err
 		}
 	}
 	if x.B7 != 0 {
-		if err := enc.NextFieldValueInt("B7", __VDLType_int32_8, int64(x.B7)); err != nil {
+		if err := enc.NextFieldValueInt(22, __VDLType_int32_8, int64(x.B7)); err != nil {
 			return err
 		}
 	}
 	if x.B8 != 0 {
-		if err := enc.NextFieldValueInt("B8", __VDLType_int64_9, int64(x.B8)); err != nil {
+		if err := enc.NextFieldValueInt(23, __VDLType_int64_9, int64(x.B8)); err != nil {
 			return err
 		}
 	}
 	if x.B9 != 0 {
-		if err := enc.NextFieldValueFloat("B9", __VDLType_float32_10, float64(x.B9)); err != nil {
+		if err := enc.NextFieldValueFloat(24, __VDLType_float32_10, float64(x.B9)); err != nil {
 			return err
 		}
 	}
 	if x.B10 != 0 {
-		if err := enc.NextFieldValueFloat("B10", __VDLType_float64_11, float64(x.B10)); err != nil {
+		if err := enc.NextFieldValueFloat(25, __VDLType_float64_11, float64(x.B10)); err != nil {
 			return err
 		}
 	}
 	if x.B11 != "" {
-		if err := enc.NextFieldValueString("B11", __VDLType_string_12, string(x.B11)); err != nil {
+		if err := enc.NextFieldValueString(26, __VDLType_string_12, string(x.B11)); err != nil {
 			return err
 		}
 	}
 	if x.B12 != NamedEnumA {
-		if err := enc.NextFieldValueString("B12", __VDLType_enum_13, x.B12.String()); err != nil {
+		if err := enc.NextFieldValueString(27, __VDLType_enum_13, x.B12.String()); err != nil {
 			return err
 		}
 	}
 	if x.B13 != nil && !x.B13.VDLIsZero() {
-		if err := enc.NextField("B13"); err != nil {
+		if err := enc.NextField(28); err != nil {
 			return err
 		}
 		if err := x.B13.VDLWrite(enc); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -1183,199 +1197,210 @@
 	if err := dec.StartValue(__VDLType_struct_20); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "A0":
+		}
+		if decType != __VDLType_struct_20 {
+			index = __VDLType_struct_20.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueBool(); {
 			case err != nil:
 				return err
 			default:
 				x.A0 = value
 			}
-		case "A1":
+		case 1:
 			switch value, err := dec.ReadValueUint(8); {
 			case err != nil:
 				return err
 			default:
 				x.A1 = byte(value)
 			}
-		case "A2":
+		case 2:
 			switch value, err := dec.ReadValueUint(16); {
 			case err != nil:
 				return err
 			default:
 				x.A2 = uint16(value)
 			}
-		case "A3":
+		case 3:
 			switch value, err := dec.ReadValueUint(32); {
 			case err != nil:
 				return err
 			default:
 				x.A3 = uint32(value)
 			}
-		case "A4":
+		case 4:
 			switch value, err := dec.ReadValueUint(64); {
 			case err != nil:
 				return err
 			default:
 				x.A4 = value
 			}
-		case "A5":
+		case 5:
 			switch value, err := dec.ReadValueInt(8); {
 			case err != nil:
 				return err
 			default:
 				x.A5 = int8(value)
 			}
-		case "A6":
+		case 6:
 			switch value, err := dec.ReadValueInt(16); {
 			case err != nil:
 				return err
 			default:
 				x.A6 = int16(value)
 			}
-		case "A7":
+		case 7:
 			switch value, err := dec.ReadValueInt(32); {
 			case err != nil:
 				return err
 			default:
 				x.A7 = int32(value)
 			}
-		case "A8":
+		case 8:
 			switch value, err := dec.ReadValueInt(64); {
 			case err != nil:
 				return err
 			default:
 				x.A8 = value
 			}
-		case "A9":
+		case 9:
 			switch value, err := dec.ReadValueFloat(32); {
 			case err != nil:
 				return err
 			default:
 				x.A9 = float32(value)
 			}
-		case "A10":
+		case 10:
 			switch value, err := dec.ReadValueFloat(64); {
 			case err != nil:
 				return err
 			default:
 				x.A10 = value
 			}
-		case "A11":
+		case 11:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.A11 = value
 			}
-		case "A12":
+		case 12:
 			if err := verror.VDLRead(dec, &x.A12); err != nil {
 				return err
 			}
-		case "A13":
+		case 13:
 			x.A13 = new(vom.RawBytes)
 			if err := x.A13.VDLRead(dec); err != nil {
 				return err
 			}
-		case "A14":
+		case 14:
 			switch value, err := dec.ReadValueTypeObject(); {
 			case err != nil:
 				return err
 			default:
 				x.A14 = value
 			}
-		case "B0":
+		case 15:
 			switch value, err := dec.ReadValueBool(); {
 			case err != nil:
 				return err
 			default:
 				x.B0 = NamedBool(value)
 			}
-		case "B1":
+		case 16:
 			switch value, err := dec.ReadValueUint(8); {
 			case err != nil:
 				return err
 			default:
 				x.B1 = NamedByte(value)
 			}
-		case "B2":
+		case 17:
 			switch value, err := dec.ReadValueUint(16); {
 			case err != nil:
 				return err
 			default:
 				x.B2 = NamedUint16(value)
 			}
-		case "B3":
+		case 18:
 			switch value, err := dec.ReadValueUint(32); {
 			case err != nil:
 				return err
 			default:
 				x.B3 = NamedUint32(value)
 			}
-		case "B4":
+		case 19:
 			switch value, err := dec.ReadValueUint(64); {
 			case err != nil:
 				return err
 			default:
 				x.B4 = NamedUint64(value)
 			}
-		case "B5":
+		case 20:
 			switch value, err := dec.ReadValueInt(8); {
 			case err != nil:
 				return err
 			default:
 				x.B5 = NamedInt8(value)
 			}
-		case "B6":
+		case 21:
 			switch value, err := dec.ReadValueInt(16); {
 			case err != nil:
 				return err
 			default:
 				x.B6 = NamedInt16(value)
 			}
-		case "B7":
+		case 22:
 			switch value, err := dec.ReadValueInt(32); {
 			case err != nil:
 				return err
 			default:
 				x.B7 = NamedInt32(value)
 			}
-		case "B8":
+		case 23:
 			switch value, err := dec.ReadValueInt(64); {
 			case err != nil:
 				return err
 			default:
 				x.B8 = NamedInt64(value)
 			}
-		case "B9":
+		case 24:
 			switch value, err := dec.ReadValueFloat(32); {
 			case err != nil:
 				return err
 			default:
 				x.B9 = NamedFloat32(value)
 			}
-		case "B10":
+		case 25:
 			switch value, err := dec.ReadValueFloat(64); {
 			case err != nil:
 				return err
 			default:
 				x.B10 = NamedFloat64(value)
 			}
-		case "B11":
+		case 26:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.B11 = NamedString(value)
 			}
-		case "B12":
+		case 27:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
@@ -1384,14 +1409,10 @@
 					return err
 				}
 			}
-		case "B13":
+		case 28:
 			if err := VDLReadNamedUnion(dec, &x.B13); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -1438,126 +1459,126 @@
 		return err
 	}
 	if x.A0 {
-		if err := enc.NextFieldValueBool("A0", vdl.BoolType, x.A0); err != nil {
+		if err := enc.NextFieldValueBool(0, vdl.BoolType, x.A0); err != nil {
 			return err
 		}
 	}
 	if x.A1 != 0 {
-		if err := enc.NextFieldValueUint("A1", vdl.ByteType, uint64(x.A1)); err != nil {
+		if err := enc.NextFieldValueUint(1, vdl.ByteType, uint64(x.A1)); err != nil {
 			return err
 		}
 	}
 	if x.A2 != 0 {
-		if err := enc.NextFieldValueUint("A2", vdl.Uint16Type, uint64(x.A2)); err != nil {
+		if err := enc.NextFieldValueUint(2, vdl.Uint16Type, uint64(x.A2)); err != nil {
 			return err
 		}
 	}
 	if x.A3 != 0 {
-		if err := enc.NextFieldValueUint("A3", vdl.Uint32Type, uint64(x.A3)); err != nil {
+		if err := enc.NextFieldValueUint(3, vdl.Uint32Type, uint64(x.A3)); err != nil {
 			return err
 		}
 	}
 	if x.A4 != 0 {
-		if err := enc.NextFieldValueUint("A4", vdl.Uint64Type, x.A4); err != nil {
+		if err := enc.NextFieldValueUint(4, vdl.Uint64Type, x.A4); err != nil {
 			return err
 		}
 	}
 	if x.A5 != 0 {
-		if err := enc.NextFieldValueInt("A5", vdl.Int8Type, int64(x.A5)); err != nil {
+		if err := enc.NextFieldValueInt(5, vdl.Int8Type, int64(x.A5)); err != nil {
 			return err
 		}
 	}
 	if x.A6 != 0 {
-		if err := enc.NextFieldValueInt("A6", vdl.Int16Type, int64(x.A6)); err != nil {
+		if err := enc.NextFieldValueInt(6, vdl.Int16Type, int64(x.A6)); err != nil {
 			return err
 		}
 	}
 	if x.A7 != 0 {
-		if err := enc.NextFieldValueInt("A7", vdl.Int32Type, int64(x.A7)); err != nil {
+		if err := enc.NextFieldValueInt(7, vdl.Int32Type, int64(x.A7)); err != nil {
 			return err
 		}
 	}
 	if x.A8 != 0 {
-		if err := enc.NextFieldValueInt("A8", vdl.Int64Type, x.A8); err != nil {
+		if err := enc.NextFieldValueInt(8, vdl.Int64Type, x.A8); err != nil {
 			return err
 		}
 	}
 	if x.A9 != 0 {
-		if err := enc.NextFieldValueFloat("A9", vdl.Float32Type, float64(x.A9)); err != nil {
+		if err := enc.NextFieldValueFloat(9, vdl.Float32Type, float64(x.A9)); err != nil {
 			return err
 		}
 	}
 	if x.A10 != 0 {
-		if err := enc.NextFieldValueFloat("A10", vdl.Float64Type, x.A10); err != nil {
+		if err := enc.NextFieldValueFloat(10, vdl.Float64Type, x.A10); err != nil {
 			return err
 		}
 	}
 	if x.A11 != "" {
-		if err := enc.NextFieldValueString("A11", vdl.StringType, x.A11); err != nil {
+		if err := enc.NextFieldValueString(11, vdl.StringType, x.A11); err != nil {
 			return err
 		}
 	}
 	if x.B0 {
-		if err := enc.NextFieldValueBool("B0", __VDLType_bool_1, bool(x.B0)); err != nil {
+		if err := enc.NextFieldValueBool(12, __VDLType_bool_1, bool(x.B0)); err != nil {
 			return err
 		}
 	}
 	if x.B1 != 0 {
-		if err := enc.NextFieldValueUint("B1", __VDLType_byte_2, uint64(x.B1)); err != nil {
+		if err := enc.NextFieldValueUint(13, __VDLType_byte_2, uint64(x.B1)); err != nil {
 			return err
 		}
 	}
 	if x.B2 != 0 {
-		if err := enc.NextFieldValueUint("B2", __VDLType_uint16_3, uint64(x.B2)); err != nil {
+		if err := enc.NextFieldValueUint(14, __VDLType_uint16_3, uint64(x.B2)); err != nil {
 			return err
 		}
 	}
 	if x.B3 != 0 {
-		if err := enc.NextFieldValueUint("B3", __VDLType_uint32_4, uint64(x.B3)); err != nil {
+		if err := enc.NextFieldValueUint(15, __VDLType_uint32_4, uint64(x.B3)); err != nil {
 			return err
 		}
 	}
 	if x.B4 != 0 {
-		if err := enc.NextFieldValueUint("B4", __VDLType_uint64_5, uint64(x.B4)); err != nil {
+		if err := enc.NextFieldValueUint(16, __VDLType_uint64_5, uint64(x.B4)); err != nil {
 			return err
 		}
 	}
 	if x.B5 != 0 {
-		if err := enc.NextFieldValueInt("B5", __VDLType_int8_6, int64(x.B5)); err != nil {
+		if err := enc.NextFieldValueInt(17, __VDLType_int8_6, int64(x.B5)); err != nil {
 			return err
 		}
 	}
 	if x.B6 != 0 {
-		if err := enc.NextFieldValueInt("B6", __VDLType_int16_7, int64(x.B6)); err != nil {
+		if err := enc.NextFieldValueInt(18, __VDLType_int16_7, int64(x.B6)); err != nil {
 			return err
 		}
 	}
 	if x.B7 != 0 {
-		if err := enc.NextFieldValueInt("B7", __VDLType_int32_8, int64(x.B7)); err != nil {
+		if err := enc.NextFieldValueInt(19, __VDLType_int32_8, int64(x.B7)); err != nil {
 			return err
 		}
 	}
 	if x.B8 != 0 {
-		if err := enc.NextFieldValueInt("B8", __VDLType_int64_9, int64(x.B8)); err != nil {
+		if err := enc.NextFieldValueInt(20, __VDLType_int64_9, int64(x.B8)); err != nil {
 			return err
 		}
 	}
 	if x.B9 != 0 {
-		if err := enc.NextFieldValueFloat("B9", __VDLType_float32_10, float64(x.B9)); err != nil {
+		if err := enc.NextFieldValueFloat(21, __VDLType_float32_10, float64(x.B9)); err != nil {
 			return err
 		}
 	}
 	if x.B10 != 0 {
-		if err := enc.NextFieldValueFloat("B10", __VDLType_float64_11, float64(x.B10)); err != nil {
+		if err := enc.NextFieldValueFloat(22, __VDLType_float64_11, float64(x.B10)); err != nil {
 			return err
 		}
 	}
 	if x.B13 != "" {
-		if err := enc.NextFieldValueString("B13", __VDLType_string_12, string(x.B13)); err != nil {
+		if err := enc.NextFieldValueString(23, __VDLType_string_12, string(x.B13)); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -1568,186 +1589,193 @@
 	if err := dec.StartValue(__VDLType_struct_21); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "A0":
+		}
+		if decType != __VDLType_struct_21 {
+			index = __VDLType_struct_21.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueBool(); {
 			case err != nil:
 				return err
 			default:
 				x.A0 = value
 			}
-		case "A1":
+		case 1:
 			switch value, err := dec.ReadValueUint(8); {
 			case err != nil:
 				return err
 			default:
 				x.A1 = byte(value)
 			}
-		case "A2":
+		case 2:
 			switch value, err := dec.ReadValueUint(16); {
 			case err != nil:
 				return err
 			default:
 				x.A2 = uint16(value)
 			}
-		case "A3":
+		case 3:
 			switch value, err := dec.ReadValueUint(32); {
 			case err != nil:
 				return err
 			default:
 				x.A3 = uint32(value)
 			}
-		case "A4":
+		case 4:
 			switch value, err := dec.ReadValueUint(64); {
 			case err != nil:
 				return err
 			default:
 				x.A4 = value
 			}
-		case "A5":
+		case 5:
 			switch value, err := dec.ReadValueInt(8); {
 			case err != nil:
 				return err
 			default:
 				x.A5 = int8(value)
 			}
-		case "A6":
+		case 6:
 			switch value, err := dec.ReadValueInt(16); {
 			case err != nil:
 				return err
 			default:
 				x.A6 = int16(value)
 			}
-		case "A7":
+		case 7:
 			switch value, err := dec.ReadValueInt(32); {
 			case err != nil:
 				return err
 			default:
 				x.A7 = int32(value)
 			}
-		case "A8":
+		case 8:
 			switch value, err := dec.ReadValueInt(64); {
 			case err != nil:
 				return err
 			default:
 				x.A8 = value
 			}
-		case "A9":
+		case 9:
 			switch value, err := dec.ReadValueFloat(32); {
 			case err != nil:
 				return err
 			default:
 				x.A9 = float32(value)
 			}
-		case "A10":
+		case 10:
 			switch value, err := dec.ReadValueFloat(64); {
 			case err != nil:
 				return err
 			default:
 				x.A10 = value
 			}
-		case "A11":
+		case 11:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.A11 = value
 			}
-		case "B0":
+		case 12:
 			switch value, err := dec.ReadValueBool(); {
 			case err != nil:
 				return err
 			default:
 				x.B0 = NamedBool(value)
 			}
-		case "B1":
+		case 13:
 			switch value, err := dec.ReadValueUint(8); {
 			case err != nil:
 				return err
 			default:
 				x.B1 = NamedByte(value)
 			}
-		case "B2":
+		case 14:
 			switch value, err := dec.ReadValueUint(16); {
 			case err != nil:
 				return err
 			default:
 				x.B2 = NamedUint16(value)
 			}
-		case "B3":
+		case 15:
 			switch value, err := dec.ReadValueUint(32); {
 			case err != nil:
 				return err
 			default:
 				x.B3 = NamedUint32(value)
 			}
-		case "B4":
+		case 16:
 			switch value, err := dec.ReadValueUint(64); {
 			case err != nil:
 				return err
 			default:
 				x.B4 = NamedUint64(value)
 			}
-		case "B5":
+		case 17:
 			switch value, err := dec.ReadValueInt(8); {
 			case err != nil:
 				return err
 			default:
 				x.B5 = NamedInt8(value)
 			}
-		case "B6":
+		case 18:
 			switch value, err := dec.ReadValueInt(16); {
 			case err != nil:
 				return err
 			default:
 				x.B6 = NamedInt16(value)
 			}
-		case "B7":
+		case 19:
 			switch value, err := dec.ReadValueInt(32); {
 			case err != nil:
 				return err
 			default:
 				x.B7 = NamedInt32(value)
 			}
-		case "B8":
+		case 20:
 			switch value, err := dec.ReadValueInt(64); {
 			case err != nil:
 				return err
 			default:
 				x.B8 = NamedInt64(value)
 			}
-		case "B9":
+		case 21:
 			switch value, err := dec.ReadValueFloat(32); {
 			case err != nil:
 				return err
 			default:
 				x.B9 = NamedFloat32(value)
 			}
-		case "B10":
+		case 22:
 			switch value, err := dec.ReadValueFloat(64); {
 			case err != nil:
 				return err
 			default:
 				x.B10 = NamedFloat64(value)
 			}
-		case "B13":
+		case 23:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.B13 = NamedString(value)
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -1848,7 +1876,7 @@
 		return err
 	}
 	if !x.A0.VDLIsZero() {
-		if err := enc.NextField("A0"); err != nil {
+		if err := enc.NextField(0); err != nil {
 			return err
 		}
 		if err := x.A0.VDLWrite(enc); err != nil {
@@ -1856,7 +1884,7 @@
 		}
 	}
 	if !x.A1.VDLIsZero() {
-		if err := enc.NextField("A1"); err != nil {
+		if err := enc.NextField(1); err != nil {
 			return err
 		}
 		if err := x.A1.VDLWrite(enc); err != nil {
@@ -1864,7 +1892,7 @@
 		}
 	}
 	if len(x.A2) != 0 {
-		if err := enc.NextField("A2"); err != nil {
+		if err := enc.NextField(2); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_list_1(enc, x.A2); err != nil {
@@ -1872,7 +1900,7 @@
 		}
 	}
 	if len(x.A3) != 0 {
-		if err := enc.NextField("A3"); err != nil {
+		if err := enc.NextField(3); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_set_2(enc, x.A3); err != nil {
@@ -1880,14 +1908,14 @@
 		}
 	}
 	if len(x.A4) != 0 {
-		if err := enc.NextField("A4"); err != nil {
+		if err := enc.NextField(4); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_map_3(enc, x.A4); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -1979,38 +2007,45 @@
 	if err := dec.StartValue(__VDLType_struct_23); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "A0":
+		}
+		if decType != __VDLType_struct_23 {
+			index = __VDLType_struct_23.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			if err := x.A0.VDLRead(dec); err != nil {
 				return err
 			}
-		case "A1":
+		case 1:
 			if err := x.A1.VDLRead(dec); err != nil {
 				return err
 			}
-		case "A2":
+		case 2:
 			if err := __VDLReadAnon_list_1(dec, &x.A2); err != nil {
 				return err
 			}
-		case "A3":
+		case 3:
 			if err := __VDLReadAnon_set_2(dec, &x.A3); err != nil {
 				return err
 			}
-		case "A4":
+		case 4:
 			if err := __VDLReadAnon_map_3(dec, &x.A4); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -2192,7 +2227,7 @@
 		return err
 	}
 	if !x.A0.VDLIsZero() {
-		if err := enc.NextField("A0"); err != nil {
+		if err := enc.NextField(0); err != nil {
 			return err
 		}
 		if err := x.A0.VDLWrite(enc); err != nil {
@@ -2200,7 +2235,7 @@
 		}
 	}
 	if !x.A1.VDLIsZero() {
-		if err := enc.NextField("A1"); err != nil {
+		if err := enc.NextField(1); err != nil {
 			return err
 		}
 		if err := x.A1.VDLWrite(enc); err != nil {
@@ -2208,7 +2243,7 @@
 		}
 	}
 	if len(x.A2) != 0 {
-		if err := enc.NextField("A2"); err != nil {
+		if err := enc.NextField(2); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_list_4(enc, x.A2); err != nil {
@@ -2216,7 +2251,7 @@
 		}
 	}
 	if len(x.A3) != 0 {
-		if err := enc.NextField("A3"); err != nil {
+		if err := enc.NextField(3); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_map_5(enc, x.A3); err != nil {
@@ -2224,14 +2259,14 @@
 		}
 	}
 	if len(x.A4) != 0 {
-		if err := enc.NextField("A4"); err != nil {
+		if err := enc.NextField(4); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_map_6(enc, x.A4); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -2389,38 +2424,45 @@
 	if err := dec.StartValue(__VDLType_struct_28); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "A0":
+		}
+		if decType != __VDLType_struct_28 {
+			index = __VDLType_struct_28.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			if err := x.A0.VDLRead(dec); err != nil {
 				return err
 			}
-		case "A1":
+		case 1:
 			if err := x.A1.VDLRead(dec); err != nil {
 				return err
 			}
-		case "A2":
+		case 2:
 			if err := __VDLReadAnon_list_4(dec, &x.A2); err != nil {
 				return err
 			}
-		case "A3":
+		case 3:
 			if err := __VDLReadAnon_map_5(dec, &x.A3); err != nil {
 				return err
 			}
-		case "A4":
+		case 4:
 			if err := __VDLReadAnon_map_6(dec, &x.A4); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -2555,16 +2597,16 @@
 		return err
 	}
 	if x.A != 0 {
-		if err := enc.NextFieldValueInt("A", vdl.Int32Type, int64(x.A)); err != nil {
+		if err := enc.NextFieldValueInt(0, vdl.Int32Type, int64(x.A)); err != nil {
 			return err
 		}
 	}
 	if x.B != 0 {
-		if err := enc.NextFieldValueInt("B", vdl.Int32Type, int64(x.B)); err != nil {
+		if err := enc.NextFieldValueInt(1, vdl.Int32Type, int64(x.B)); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -2575,32 +2617,39 @@
 	if err := dec.StartValue(__VDLType_struct_33); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "A":
+		}
+		if decType != __VDLType_struct_33 {
+			index = __VDLType_struct_33.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueInt(32); {
 			case err != nil:
 				return err
 			default:
 				x.A = int32(value)
 			}
-		case "B":
+		case 1:
 			switch value, err := dec.ReadValueInt(32); {
 			case err != nil:
 				return err
 			default:
 				x.B = int32(value)
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -2626,14 +2675,14 @@
 		return err
 	}
 	if x.Args != (Args{}) {
-		if err := enc.NextField("Args"); err != nil {
+		if err := enc.NextField(0); err != nil {
 			return err
 		}
 		if err := x.Args.VDLWrite(enc); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -2644,20 +2693,27 @@
 	if err := dec.StartValue(__VDLType_struct_34); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Args":
-			if err := x.Args.VDLRead(dec); err != nil {
-				return err
+		}
+		if decType != __VDLType_struct_34 {
+			index = __VDLType_struct_34.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
+		}
+		switch index {
+		case 0:
+			if err := x.Args.VDLRead(dec); err != nil {
 				return err
 			}
 		}
diff --git a/lib/vdl/testdata/nativedep/nativedep.vdl.go b/lib/vdl/testdata/nativedep/nativedep.vdl.go
index 7a82dd0..d85e6fa 100644
--- a/lib/vdl/testdata/nativedep/nativedep.vdl.go
+++ b/lib/vdl/testdata/nativedep/nativedep.vdl.go
@@ -56,7 +56,7 @@
 		if err := nativetest_2.WireStringFromNative(&wire, x.A); err != nil {
 			return err
 		}
-		if err := enc.NextFieldValueInt("A", __VDLType_int32_2, int64(wire)); err != nil {
+		if err := enc.NextFieldValueInt(0, __VDLType_int32_2, int64(wire)); err != nil {
 			return err
 		}
 	}
@@ -65,7 +65,7 @@
 		if err := nativetest_2.WireTimeFromNative(&wire, x.B); err != nil {
 			return err
 		}
-		if err := enc.NextFieldValueInt("B", __VDLType_int32_3, int64(wire)); err != nil {
+		if err := enc.NextFieldValueInt(1, __VDLType_int32_3, int64(wire)); err != nil {
 			return err
 		}
 	}
@@ -74,7 +74,7 @@
 		if err := nativetest_2.WireSamePkgFromNative(&wire, x.C); err != nil {
 			return err
 		}
-		if err := enc.NextFieldValueInt("C", __VDLType_int32_4, int64(wire)); err != nil {
+		if err := enc.NextFieldValueInt(2, __VDLType_int32_4, int64(wire)); err != nil {
 			return err
 		}
 	}
@@ -83,11 +83,11 @@
 		if err := nativetest_2.WireMultiImportFromNative(&wire, x.D); err != nil {
 			return err
 		}
-		if err := enc.NextFieldValueInt("D", __VDLType_int32_5, int64(wire)); err != nil {
+		if err := enc.NextFieldValueInt(3, __VDLType_int32_5, int64(wire)); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -98,15 +98,26 @@
 	if err := dec.StartValue(__VDLType_struct_1); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "A":
+		}
+		if decType != __VDLType_struct_1 {
+			index = __VDLType_struct_1.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			var wire nativetest_2.WireString
 			if err := wire.VDLRead(dec); err != nil {
 				return err
@@ -114,7 +125,7 @@
 			if err := nativetest_2.WireStringToNative(wire, &x.A); err != nil {
 				return err
 			}
-		case "B":
+		case 1:
 			var wire nativetest_2.WireTime
 			if err := wire.VDLRead(dec); err != nil {
 				return err
@@ -122,7 +133,7 @@
 			if err := nativetest_2.WireTimeToNative(wire, &x.B); err != nil {
 				return err
 			}
-		case "C":
+		case 2:
 			var wire nativetest_2.WireSamePkg
 			if err := wire.VDLRead(dec); err != nil {
 				return err
@@ -130,7 +141,7 @@
 			if err := nativetest_2.WireSamePkgToNative(wire, &x.C); err != nil {
 				return err
 			}
-		case "D":
+		case 3:
 			var wire nativetest_2.WireMultiImport
 			if err := wire.VDLRead(dec); err != nil {
 				return err
@@ -138,10 +149,6 @@
 			if err := nativetest_2.WireMultiImportToNative(wire, &x.D); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
diff --git a/lib/vdl/testdata/nativetest/nativetest.vdl.go b/lib/vdl/testdata/nativetest/nativetest.vdl.go
index de68a53..f569a75 100644
--- a/lib/vdl/testdata/nativetest/nativetest.vdl.go
+++ b/lib/vdl/testdata/nativetest/nativetest.vdl.go
@@ -200,7 +200,7 @@
 		if err := WireStringFromNative(&wire, x.A); err != nil {
 			return err
 		}
-		if err := enc.NextFieldValueInt("A", __VDLType_int32_1, int64(wire)); err != nil {
+		if err := enc.NextFieldValueInt(0, __VDLType_int32_1, int64(wire)); err != nil {
 			return err
 		}
 	}
@@ -209,7 +209,7 @@
 		if err := WireTimeFromNative(&wire, x.B); err != nil {
 			return err
 		}
-		if err := enc.NextFieldValueInt("B", __VDLType_int32_2, int64(wire)); err != nil {
+		if err := enc.NextFieldValueInt(1, __VDLType_int32_2, int64(wire)); err != nil {
 			return err
 		}
 	}
@@ -218,7 +218,7 @@
 		if err := WireSamePkgFromNative(&wire, x.C); err != nil {
 			return err
 		}
-		if err := enc.NextFieldValueInt("C", __VDLType_int32_3, int64(wire)); err != nil {
+		if err := enc.NextFieldValueInt(2, __VDLType_int32_3, int64(wire)); err != nil {
 			return err
 		}
 	}
@@ -227,16 +227,16 @@
 		if err := WireMultiImportFromNative(&wire, x.D); err != nil {
 			return err
 		}
-		if err := enc.NextFieldValueInt("D", __VDLType_int32_4, int64(wire)); err != nil {
+		if err := enc.NextFieldValueInt(3, __VDLType_int32_4, int64(wire)); err != nil {
 			return err
 		}
 	}
 	if x.E != 0 {
-		if err := enc.NextFieldValueInt("E", __VDLType_int32_5, int64(x.E)); err != nil {
+		if err := enc.NextFieldValueInt(4, __VDLType_int32_5, int64(x.E)); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -247,15 +247,26 @@
 	if err := dec.StartValue(__VDLType_struct_6); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "A":
+		}
+		if decType != __VDLType_struct_6 {
+			index = __VDLType_struct_6.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			var wire WireString
 			if err := wire.VDLRead(dec); err != nil {
 				return err
@@ -263,7 +274,7 @@
 			if err := WireStringToNative(wire, &x.A); err != nil {
 				return err
 			}
-		case "B":
+		case 1:
 			var wire WireTime
 			if err := wire.VDLRead(dec); err != nil {
 				return err
@@ -271,7 +282,7 @@
 			if err := WireTimeToNative(wire, &x.B); err != nil {
 				return err
 			}
-		case "C":
+		case 2:
 			var wire WireSamePkg
 			if err := wire.VDLRead(dec); err != nil {
 				return err
@@ -279,7 +290,7 @@
 			if err := WireSamePkgToNative(wire, &x.C); err != nil {
 				return err
 			}
-		case "D":
+		case 3:
 			var wire WireMultiImport
 			if err := wire.VDLRead(dec); err != nil {
 				return err
@@ -287,17 +298,13 @@
 			if err := WireMultiImportToNative(wire, &x.D); err != nil {
 				return err
 			}
-		case "E":
+		case 4:
 			switch value, err := dec.ReadValueInt(32); {
 			case err != nil:
 				return err
 			default:
 				x.E = WireRenameMe(value)
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
diff --git a/runtime/internal/flow/conn/conn.vdl.go b/runtime/internal/flow/conn/conn.vdl.go
index 9af7f6e..22f4774 100644
--- a/runtime/internal/flow/conn/conn.vdl.go
+++ b/runtime/internal/flow/conn/conn.vdl.go
@@ -51,7 +51,7 @@
 		return err
 	}
 	if !x.Blessings.IsZero() {
-		if err := enc.NextField("Blessings"); err != nil {
+		if err := enc.NextField(0); err != nil {
 			return err
 		}
 		var wire security.WireBlessings
@@ -63,11 +63,11 @@
 		}
 	}
 	if x.BKey != 0 {
-		if err := enc.NextFieldValueUint("BKey", vdl.Uint64Type, x.BKey); err != nil {
+		if err := enc.NextFieldValueUint(1, vdl.Uint64Type, x.BKey); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -78,15 +78,26 @@
 	if err := dec.StartValue(__VDLType_struct_1); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Blessings":
+		}
+		if decType != __VDLType_struct_1 {
+			index = __VDLType_struct_1.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			var wire security.WireBlessings
 			if err := wire.VDLRead(dec); err != nil {
 				return err
@@ -94,17 +105,13 @@
 			if err := security.WireBlessingsToNative(wire, &x.Blessings); err != nil {
 				return err
 			}
-		case "BKey":
+		case 1:
 			switch value, err := dec.ReadValueUint(64); {
 			case err != nil:
 				return err
 			default:
 				x.BKey = value
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -140,7 +147,7 @@
 		return err
 	}
 	if len(x.Ciphertexts) != 0 {
-		if err := enc.NextField("Ciphertexts"); err != nil {
+		if err := enc.NextField(0); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_list_1(enc, x.Ciphertexts); err != nil {
@@ -148,11 +155,11 @@
 		}
 	}
 	if x.BKey != 0 {
-		if err := enc.NextFieldValueUint("BKey", vdl.Uint64Type, x.BKey); err != nil {
+		if err := enc.NextFieldValueUint(1, vdl.Uint64Type, x.BKey); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -184,29 +191,36 @@
 	if err := dec.StartValue(__VDLType_struct_3); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Ciphertexts":
+		}
+		if decType != __VDLType_struct_3 {
+			index = __VDLType_struct_3.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			if err := __VDLReadAnon_list_1(dec, &x.Ciphertexts); err != nil {
 				return err
 			}
-		case "BKey":
+		case 1:
 			switch value, err := dec.ReadValueUint(64); {
 			case err != nil:
 				return err
 			default:
 				x.BKey = value
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -271,7 +285,7 @@
 		return err
 	}
 	if len(x.Discharges) != 0 {
-		if err := enc.NextField("Discharges"); err != nil {
+		if err := enc.NextField(0); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_list_2(enc, x.Discharges); err != nil {
@@ -279,16 +293,16 @@
 		}
 	}
 	if x.DKey != 0 {
-		if err := enc.NextFieldValueUint("DKey", vdl.Uint64Type, x.DKey); err != nil {
+		if err := enc.NextFieldValueUint(1, vdl.Uint64Type, x.DKey); err != nil {
 			return err
 		}
 	}
 	if x.BKey != 0 {
-		if err := enc.NextFieldValueUint("BKey", vdl.Uint64Type, x.BKey); err != nil {
+		if err := enc.NextFieldValueUint(2, vdl.Uint64Type, x.BKey); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -332,36 +346,43 @@
 	if err := dec.StartValue(__VDLType_struct_6); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Discharges":
+		}
+		if decType != __VDLType_struct_6 {
+			index = __VDLType_struct_6.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			if err := __VDLReadAnon_list_2(dec, &x.Discharges); err != nil {
 				return err
 			}
-		case "DKey":
+		case 1:
 			switch value, err := dec.ReadValueUint(64); {
 			case err != nil:
 				return err
 			default:
 				x.DKey = value
 			}
-		case "BKey":
+		case 2:
 			switch value, err := dec.ReadValueUint(64); {
 			case err != nil:
 				return err
 			default:
 				x.BKey = value
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -432,7 +453,7 @@
 		return err
 	}
 	if len(x.Ciphertexts) != 0 {
-		if err := enc.NextField("Ciphertexts"); err != nil {
+		if err := enc.NextField(0); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_list_1(enc, x.Ciphertexts); err != nil {
@@ -440,16 +461,16 @@
 		}
 	}
 	if x.DKey != 0 {
-		if err := enc.NextFieldValueUint("DKey", vdl.Uint64Type, x.DKey); err != nil {
+		if err := enc.NextFieldValueUint(1, vdl.Uint64Type, x.DKey); err != nil {
 			return err
 		}
 	}
 	if x.BKey != 0 {
-		if err := enc.NextFieldValueUint("BKey", vdl.Uint64Type, x.BKey); err != nil {
+		if err := enc.NextFieldValueUint(2, vdl.Uint64Type, x.BKey); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -460,36 +481,43 @@
 	if err := dec.StartValue(__VDLType_struct_9); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Ciphertexts":
+		}
+		if decType != __VDLType_struct_9 {
+			index = __VDLType_struct_9.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			if err := __VDLReadAnon_list_1(dec, &x.Ciphertexts); err != nil {
 				return err
 			}
-		case "DKey":
+		case 1:
 			switch value, err := dec.ReadValueUint(64); {
 			case err != nil:
 				return err
 			default:
 				x.DKey = value
 			}
-		case "BKey":
+		case 2:
 			switch value, err := dec.ReadValueUint(64); {
 			case err != nil:
 				return err
 			default:
 				x.BKey = value
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -572,13 +600,13 @@
 	if err := enc.StartValue(__VDLType_union_10); err != nil {
 		return err
 	}
-	if err := enc.NextField("Blessings"); err != nil {
+	if err := enc.NextField(0); err != nil {
 		return err
 	}
 	if err := x.Value.VDLWrite(enc); err != nil {
 		return err
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -588,13 +616,13 @@
 	if err := enc.StartValue(__VDLType_union_10); err != nil {
 		return err
 	}
-	if err := enc.NextField("Discharges"); err != nil {
+	if err := enc.NextField(1); err != nil {
 		return err
 	}
 	if err := x.Value.VDLWrite(enc); err != nil {
 		return err
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -604,13 +632,13 @@
 	if err := enc.StartValue(__VDLType_union_10); err != nil {
 		return err
 	}
-	if err := enc.NextField("EncryptedBlessings"); err != nil {
+	if err := enc.NextField(2); err != nil {
 		return err
 	}
 	if err := x.Value.VDLWrite(enc); err != nil {
 		return err
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -620,13 +648,13 @@
 	if err := enc.StartValue(__VDLType_union_10); err != nil {
 		return err
 	}
-	if err := enc.NextField("EncryptedDischarges"); err != nil {
+	if err := enc.NextField(3); err != nil {
 		return err
 	}
 	if err := x.Value.VDLWrite(enc); err != nil {
 		return err
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -636,45 +664,52 @@
 	if err := dec.StartValue(__VDLType_union_10); err != nil {
 		return err
 	}
-	f, err := dec.NextField()
-	if err != nil {
+	decType := dec.Type()
+	index, err := dec.NextField()
+	switch {
+	case err != nil:
 		return err
+	case index == -1:
+		return fmt.Errorf("missing field in union %T, from %v", x, decType)
 	}
-	switch f {
-	case "Blessings":
+	if decType != __VDLType_union_10 {
+		name := decType.Field(index).Name
+		index = __VDLType_union_10.FieldIndexByName(name)
+		if index == -1 {
+			return fmt.Errorf("field %q not in union %T, from %v", name, x, decType)
+		}
+	}
+	switch index {
+	case 0:
 		var field BlessingsFlowMessageBlessings
 		if err := field.Value.VDLRead(dec); err != nil {
 			return err
 		}
 		*x = field
-	case "Discharges":
+	case 1:
 		var field BlessingsFlowMessageDischarges
 		if err := field.Value.VDLRead(dec); err != nil {
 			return err
 		}
 		*x = field
-	case "EncryptedBlessings":
+	case 2:
 		var field BlessingsFlowMessageEncryptedBlessings
 		if err := field.Value.VDLRead(dec); err != nil {
 			return err
 		}
 		*x = field
-	case "EncryptedDischarges":
+	case 3:
 		var field BlessingsFlowMessageEncryptedDischarges
 		if err := field.Value.VDLRead(dec); err != nil {
 			return err
 		}
 		*x = field
-	case "":
-		return fmt.Errorf("missing field in union %T, from %v", x, dec.Type())
-	default:
-		return fmt.Errorf("field %q not in union %T, from %v", f, x, dec.Type())
 	}
-	switch f, err := dec.NextField(); {
+	switch index, err := dec.NextField(); {
 	case err != nil:
 		return err
-	case f != "":
-		return fmt.Errorf("extra field %q in union %T, from %v", f, x, dec.Type())
+	case index != -1:
+		return fmt.Errorf("extra field %d in union %T, from %v", index, x, dec.Type())
 	}
 	return dec.FinishValue()
 }
diff --git a/runtime/internal/rpc/stress/stress.vdl.go b/runtime/internal/rpc/stress/stress.vdl.go
index a49195f..b61b160 100644
--- a/runtime/internal/rpc/stress/stress.vdl.go
+++ b/runtime/internal/rpc/stress/stress.vdl.go
@@ -50,21 +50,21 @@
 		return err
 	}
 	if x.ABool {
-		if err := enc.NextFieldValueBool("ABool", vdl.BoolType, x.ABool); err != nil {
+		if err := enc.NextFieldValueBool(0, vdl.BoolType, x.ABool); err != nil {
 			return err
 		}
 	}
 	if x.AInt64 != 0 {
-		if err := enc.NextFieldValueInt("AInt64", vdl.Int64Type, x.AInt64); err != nil {
+		if err := enc.NextFieldValueInt(1, vdl.Int64Type, x.AInt64); err != nil {
 			return err
 		}
 	}
 	if len(x.AListOfBytes) != 0 {
-		if err := enc.NextFieldValueBytes("AListOfBytes", __VDLType_list_2, x.AListOfBytes); err != nil {
+		if err := enc.NextFieldValueBytes(2, __VDLType_list_2, x.AListOfBytes); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -75,36 +75,43 @@
 	if err := dec.StartValue(__VDLType_struct_1); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "ABool":
+		}
+		if decType != __VDLType_struct_1 {
+			index = __VDLType_struct_1.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueBool(); {
 			case err != nil:
 				return err
 			default:
 				x.ABool = value
 			}
-		case "AInt64":
+		case 1:
 			switch value, err := dec.ReadValueInt(64); {
 			case err != nil:
 				return err
 			default:
 				x.AInt64 = value
 			}
-		case "AListOfBytes":
+		case 2:
 			if err := dec.ReadValueBytes(-1, &x.AListOfBytes); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -130,26 +137,26 @@
 		return err
 	}
 	if x.SumCount != 0 {
-		if err := enc.NextFieldValueUint("SumCount", vdl.Uint64Type, x.SumCount); err != nil {
+		if err := enc.NextFieldValueUint(0, vdl.Uint64Type, x.SumCount); err != nil {
 			return err
 		}
 	}
 	if x.SumStreamCount != 0 {
-		if err := enc.NextFieldValueUint("SumStreamCount", vdl.Uint64Type, x.SumStreamCount); err != nil {
+		if err := enc.NextFieldValueUint(1, vdl.Uint64Type, x.SumStreamCount); err != nil {
 			return err
 		}
 	}
 	if x.BytesRecv != 0 {
-		if err := enc.NextFieldValueUint("BytesRecv", vdl.Uint64Type, x.BytesRecv); err != nil {
+		if err := enc.NextFieldValueUint(2, vdl.Uint64Type, x.BytesRecv); err != nil {
 			return err
 		}
 	}
 	if x.BytesSent != 0 {
-		if err := enc.NextFieldValueUint("BytesSent", vdl.Uint64Type, x.BytesSent); err != nil {
+		if err := enc.NextFieldValueUint(3, vdl.Uint64Type, x.BytesSent); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -160,46 +167,53 @@
 	if err := dec.StartValue(__VDLType_struct_3); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "SumCount":
+		}
+		if decType != __VDLType_struct_3 {
+			index = __VDLType_struct_3.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueUint(64); {
 			case err != nil:
 				return err
 			default:
 				x.SumCount = value
 			}
-		case "SumStreamCount":
+		case 1:
 			switch value, err := dec.ReadValueUint(64); {
 			case err != nil:
 				return err
 			default:
 				x.SumStreamCount = value
 			}
-		case "BytesRecv":
+		case 2:
 			switch value, err := dec.ReadValueUint(64); {
 			case err != nil:
 				return err
 			default:
 				x.BytesRecv = value
 			}
-		case "BytesSent":
+		case 3:
 			switch value, err := dec.ReadValueUint(64); {
 			case err != nil:
 				return err
 			default:
 				x.BytesSent = value
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
diff --git a/runtime/protocols/vine/vine.vdl.go b/runtime/protocols/vine/vine.vdl.go
index 8c066d8..62eed02 100644
--- a/runtime/protocols/vine/vine.vdl.go
+++ b/runtime/protocols/vine/vine.vdl.go
@@ -41,16 +41,16 @@
 		return err
 	}
 	if x.Dialer != "" {
-		if err := enc.NextFieldValueString("Dialer", vdl.StringType, x.Dialer); err != nil {
+		if err := enc.NextFieldValueString(0, vdl.StringType, x.Dialer); err != nil {
 			return err
 		}
 	}
 	if x.Acceptor != "" {
-		if err := enc.NextFieldValueString("Acceptor", vdl.StringType, x.Acceptor); err != nil {
+		if err := enc.NextFieldValueString(1, vdl.StringType, x.Acceptor); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -61,32 +61,39 @@
 	if err := dec.StartValue(__VDLType_struct_1); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Dialer":
+		}
+		if decType != __VDLType_struct_1 {
+			index = __VDLType_struct_1.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.Dialer = value
 			}
-		case "Acceptor":
+		case 1:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.Acceptor = value
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -118,16 +125,16 @@
 		return err
 	}
 	if x.Reachable {
-		if err := enc.NextFieldValueBool("Reachable", vdl.BoolType, x.Reachable); err != nil {
+		if err := enc.NextFieldValueBool(0, vdl.BoolType, x.Reachable); err != nil {
 			return err
 		}
 	}
 	if x.Discoverable {
-		if err := enc.NextFieldValueBool("Discoverable", vdl.BoolType, x.Discoverable); err != nil {
+		if err := enc.NextFieldValueBool(1, vdl.BoolType, x.Discoverable); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -138,32 +145,39 @@
 	if err := dec.StartValue(__VDLType_struct_2); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Reachable":
+		}
+		if decType != __VDLType_struct_2 {
+			index = __VDLType_struct_2.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueBool(); {
 			case err != nil:
 				return err
 			default:
 				x.Reachable = value
 			}
-		case "Discoverable":
+		case 1:
 			switch value, err := dec.ReadValueBool(); {
 			case err != nil:
 				return err
 			default:
 				x.Discoverable = value
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
diff --git a/services/agent/agent.vdl.go b/services/agent/agent.vdl.go
index be243ef..1fc189f 100644
--- a/services/agent/agent.vdl.go
+++ b/services/agent/agent.vdl.go
@@ -70,16 +70,16 @@
 		return err
 	}
 	if x.MinVersion != 0 {
-		if err := enc.NextFieldValueInt("MinVersion", vdl.Int32Type, int64(x.MinVersion)); err != nil {
+		if err := enc.NextFieldValueInt(0, vdl.Int32Type, int64(x.MinVersion)); err != nil {
 			return err
 		}
 	}
 	if x.MaxVersion != 0 {
-		if err := enc.NextFieldValueInt("MaxVersion", vdl.Int32Type, int64(x.MaxVersion)); err != nil {
+		if err := enc.NextFieldValueInt(1, vdl.Int32Type, int64(x.MaxVersion)); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -90,32 +90,39 @@
 	if err := dec.StartValue(__VDLType_struct_1); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "MinVersion":
+		}
+		if decType != __VDLType_struct_1 {
+			index = __VDLType_struct_1.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueInt(32); {
 			case err != nil:
 				return err
 			default:
 				x.MinVersion = int32(value)
 			}
-		case "MaxVersion":
+		case 1:
 			switch value, err := dec.ReadValueInt(32); {
 			case err != nil:
 				return err
 			default:
 				x.MaxVersion = int32(value)
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -140,21 +147,21 @@
 		return err
 	}
 	if x.Id != 0 {
-		if err := enc.NextFieldValueUint("Id", vdl.Uint64Type, x.Id); err != nil {
+		if err := enc.NextFieldValueUint(0, vdl.Uint64Type, x.Id); err != nil {
 			return err
 		}
 	}
 	if x.Method != "" {
-		if err := enc.NextFieldValueString("Method", vdl.StringType, x.Method); err != nil {
+		if err := enc.NextFieldValueString(1, vdl.StringType, x.Method); err != nil {
 			return err
 		}
 	}
 	if x.NumArgs != 0 {
-		if err := enc.NextFieldValueUint("NumArgs", vdl.Uint32Type, uint64(x.NumArgs)); err != nil {
+		if err := enc.NextFieldValueUint(2, vdl.Uint32Type, uint64(x.NumArgs)); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -165,39 +172,46 @@
 	if err := dec.StartValue(__VDLType_struct_2); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Id":
+		}
+		if decType != __VDLType_struct_2 {
+			index = __VDLType_struct_2.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueUint(64); {
 			case err != nil:
 				return err
 			default:
 				x.Id = value
 			}
-		case "Method":
+		case 1:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.Method = value
 			}
-		case "NumArgs":
+		case 2:
 			switch value, err := dec.ReadValueUint(32); {
 			case err != nil:
 				return err
 			default:
 				x.NumArgs = uint32(value)
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -222,12 +236,12 @@
 		return err
 	}
 	if x.Id != 0 {
-		if err := enc.NextFieldValueUint("Id", vdl.Uint64Type, x.Id); err != nil {
+		if err := enc.NextFieldValueUint(0, vdl.Uint64Type, x.Id); err != nil {
 			return err
 		}
 	}
 	if x.Err != nil {
-		if err := enc.NextField("Err"); err != nil {
+		if err := enc.NextField(1); err != nil {
 			return err
 		}
 		if err := verror.VDLWrite(enc, x.Err); err != nil {
@@ -235,11 +249,11 @@
 		}
 	}
 	if x.NumArgs != 0 {
-		if err := enc.NextFieldValueUint("NumArgs", vdl.Uint32Type, uint64(x.NumArgs)); err != nil {
+		if err := enc.NextFieldValueUint(2, vdl.Uint32Type, uint64(x.NumArgs)); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -250,36 +264,43 @@
 	if err := dec.StartValue(__VDLType_struct_3); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Id":
+		}
+		if decType != __VDLType_struct_3 {
+			index = __VDLType_struct_3.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueUint(64); {
 			case err != nil:
 				return err
 			default:
 				x.Id = value
 			}
-		case "Err":
+		case 1:
 			if err := verror.VDLRead(dec, &x.Err); err != nil {
 				return err
 			}
-		case "NumArgs":
+		case 2:
 			switch value, err := dec.ReadValueUint(32); {
 			case err != nil:
 				return err
 			default:
 				x.NumArgs = uint32(value)
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -335,13 +356,13 @@
 	if err := enc.StartValue(__VDLType_union_4); err != nil {
 		return err
 	}
-	if err := enc.NextField("Req"); err != nil {
+	if err := enc.NextField(0); err != nil {
 		return err
 	}
 	if err := x.Value.VDLWrite(enc); err != nil {
 		return err
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -351,13 +372,13 @@
 	if err := enc.StartValue(__VDLType_union_4); err != nil {
 		return err
 	}
-	if err := enc.NextField("Resp"); err != nil {
+	if err := enc.NextField(1); err != nil {
 		return err
 	}
 	if err := x.Value.VDLWrite(enc); err != nil {
 		return err
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -367,33 +388,40 @@
 	if err := dec.StartValue(__VDLType_union_4); err != nil {
 		return err
 	}
-	f, err := dec.NextField()
-	if err != nil {
+	decType := dec.Type()
+	index, err := dec.NextField()
+	switch {
+	case err != nil:
 		return err
+	case index == -1:
+		return fmt.Errorf("missing field in union %T, from %v", x, decType)
 	}
-	switch f {
-	case "Req":
+	if decType != __VDLType_union_4 {
+		name := decType.Field(index).Name
+		index = __VDLType_union_4.FieldIndexByName(name)
+		if index == -1 {
+			return fmt.Errorf("field %q not in union %T, from %v", name, x, decType)
+		}
+	}
+	switch index {
+	case 0:
 		var field RpcMessageReq
 		if err := field.Value.VDLRead(dec); err != nil {
 			return err
 		}
 		*x = field
-	case "Resp":
+	case 1:
 		var field RpcMessageResp
 		if err := field.Value.VDLRead(dec); err != nil {
 			return err
 		}
 		*x = field
-	case "":
-		return fmt.Errorf("missing field in union %T, from %v", x, dec.Type())
-	default:
-		return fmt.Errorf("field %q not in union %T, from %v", f, x, dec.Type())
 	}
-	switch f, err := dec.NextField(); {
+	switch index, err := dec.NextField(); {
 	case err != nil:
 		return err
-	case f != "":
-		return fmt.Errorf("extra field %q in union %T, from %v", f, x, dec.Type())
+	case index != -1:
+		return fmt.Errorf("extra field %d in union %T, from %v", index, x, dec.Type())
 	}
 	return dec.FinishValue()
 }
diff --git a/services/allocator/allocator.vdl.go b/services/allocator/allocator.vdl.go
index e4989eb..4b0a6cd 100644
--- a/services/allocator/allocator.vdl.go
+++ b/services/allocator/allocator.vdl.go
@@ -63,17 +63,17 @@
 		return err
 	}
 	if x.Handle != "" {
-		if err := enc.NextFieldValueString("Handle", vdl.StringType, x.Handle); err != nil {
+		if err := enc.NextFieldValueString(0, vdl.StringType, x.Handle); err != nil {
 			return err
 		}
 	}
 	if x.MountName != "" {
-		if err := enc.NextFieldValueString("MountName", vdl.StringType, x.MountName); err != nil {
+		if err := enc.NextFieldValueString(1, vdl.StringType, x.MountName); err != nil {
 			return err
 		}
 	}
 	if len(x.BlessingNames) != 0 {
-		if err := enc.NextField("BlessingNames"); err != nil {
+		if err := enc.NextField(2); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_list_1(enc, x.BlessingNames); err != nil {
@@ -81,7 +81,7 @@
 		}
 	}
 	if !x.CreationTime.IsZero() {
-		if err := enc.NextField("CreationTime"); err != nil {
+		if err := enc.NextField(3); err != nil {
 			return err
 		}
 		var wire vdltime.Time
@@ -93,16 +93,16 @@
 		}
 	}
 	if x.Replicas != 0 {
-		if err := enc.NextFieldValueInt("Replicas", vdl.Int32Type, int64(x.Replicas)); err != nil {
+		if err := enc.NextFieldValueInt(4, vdl.Int32Type, int64(x.Replicas)); err != nil {
 			return err
 		}
 	}
 	if x.Version != "" {
-		if err := enc.NextFieldValueString("Version", vdl.StringType, x.Version); err != nil {
+		if err := enc.NextFieldValueString(5, vdl.StringType, x.Version); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -131,33 +131,44 @@
 	if err := dec.StartValue(__VDLType_struct_1); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Handle":
+		}
+		if decType != __VDLType_struct_1 {
+			index = __VDLType_struct_1.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.Handle = value
 			}
-		case "MountName":
+		case 1:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.MountName = value
 			}
-		case "BlessingNames":
+		case 2:
 			if err := __VDLReadAnon_list_1(dec, &x.BlessingNames); err != nil {
 				return err
 			}
-		case "CreationTime":
+		case 3:
 			var wire vdltime.Time
 			if err := wire.VDLRead(dec); err != nil {
 				return err
@@ -165,24 +176,20 @@
 			if err := vdltime.TimeToNative(wire, &x.CreationTime); err != nil {
 				return err
 			}
-		case "Replicas":
+		case 4:
 			switch value, err := dec.ReadValueInt(32); {
 			case err != nil:
 				return err
 			default:
 				x.Replicas = int32(value)
 			}
-		case "Version":
+		case 5:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.Version = value
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
diff --git a/services/ben/ben.vdl.go b/services/ben/ben.vdl.go
index 74cc45a..93a0709 100644
--- a/services/ben/ben.vdl.go
+++ b/services/ben/ben.vdl.go
@@ -41,21 +41,21 @@
 		return err
 	}
 	if x.Architecture != "" {
-		if err := enc.NextFieldValueString("Architecture", vdl.StringType, x.Architecture); err != nil {
+		if err := enc.NextFieldValueString(0, vdl.StringType, x.Architecture); err != nil {
 			return err
 		}
 	}
 	if x.Description != "" {
-		if err := enc.NextFieldValueString("Description", vdl.StringType, x.Description); err != nil {
+		if err := enc.NextFieldValueString(1, vdl.StringType, x.Description); err != nil {
 			return err
 		}
 	}
 	if x.ClockSpeedMhz != 0 {
-		if err := enc.NextFieldValueUint("ClockSpeedMhz", vdl.Uint32Type, uint64(x.ClockSpeedMhz)); err != nil {
+		if err := enc.NextFieldValueUint(2, vdl.Uint32Type, uint64(x.ClockSpeedMhz)); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -66,39 +66,46 @@
 	if err := dec.StartValue(__VDLType_struct_1); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Architecture":
+		}
+		if decType != __VDLType_struct_1 {
+			index = __VDLType_struct_1.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.Architecture = value
 			}
-		case "Description":
+		case 1:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.Description = value
 			}
-		case "ClockSpeedMhz":
+		case 2:
 			switch value, err := dec.ReadValueUint(32); {
 			case err != nil:
 				return err
 			default:
 				x.ClockSpeedMhz = uint32(value)
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -123,16 +130,16 @@
 		return err
 	}
 	if x.Name != "" {
-		if err := enc.NextFieldValueString("Name", vdl.StringType, x.Name); err != nil {
+		if err := enc.NextFieldValueString(0, vdl.StringType, x.Name); err != nil {
 			return err
 		}
 	}
 	if x.Version != "" {
-		if err := enc.NextFieldValueString("Version", vdl.StringType, x.Version); err != nil {
+		if err := enc.NextFieldValueString(1, vdl.StringType, x.Version); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -143,32 +150,39 @@
 	if err := dec.StartValue(__VDLType_struct_2); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Name":
+		}
+		if decType != __VDLType_struct_2 {
+			index = __VDLType_struct_2.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.Name = value
 			}
-		case "Version":
+		case 1:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.Version = value
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -194,7 +208,7 @@
 		return err
 	}
 	if x.Cpu != (Cpu{}) {
-		if err := enc.NextField("Cpu"); err != nil {
+		if err := enc.NextField(0); err != nil {
 			return err
 		}
 		if err := x.Cpu.VDLWrite(enc); err != nil {
@@ -202,7 +216,7 @@
 		}
 	}
 	if x.Os != (Os{}) {
-		if err := enc.NextField("Os"); err != nil {
+		if err := enc.NextField(1); err != nil {
 			return err
 		}
 		if err := x.Os.VDLWrite(enc); err != nil {
@@ -210,11 +224,11 @@
 		}
 	}
 	if x.Label != "" {
-		if err := enc.NextFieldValueString("Label", vdl.StringType, x.Label); err != nil {
+		if err := enc.NextFieldValueString(2, vdl.StringType, x.Label); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -225,33 +239,40 @@
 	if err := dec.StartValue(__VDLType_struct_3); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Cpu":
+		}
+		if decType != __VDLType_struct_3 {
+			index = __VDLType_struct_3.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			if err := x.Cpu.VDLRead(dec); err != nil {
 				return err
 			}
-		case "Os":
+		case 1:
 			if err := x.Os.VDLRead(dec); err != nil {
 				return err
 			}
-		case "Label":
+		case 2:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.Label = value
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -315,41 +336,41 @@
 		return err
 	}
 	if x.Name != "" {
-		if err := enc.NextFieldValueString("Name", vdl.StringType, x.Name); err != nil {
+		if err := enc.NextFieldValueString(0, vdl.StringType, x.Name); err != nil {
 			return err
 		}
 	}
 	if x.Iterations != 0 {
-		if err := enc.NextFieldValueUint("Iterations", vdl.Uint64Type, x.Iterations); err != nil {
+		if err := enc.NextFieldValueUint(1, vdl.Uint64Type, x.Iterations); err != nil {
 			return err
 		}
 	}
 	if x.NanoSecsPerOp != 0 {
-		if err := enc.NextFieldValueFloat("NanoSecsPerOp", vdl.Float64Type, x.NanoSecsPerOp); err != nil {
+		if err := enc.NextFieldValueFloat(2, vdl.Float64Type, x.NanoSecsPerOp); err != nil {
 			return err
 		}
 	}
 	if x.AllocsPerOp != 0 {
-		if err := enc.NextFieldValueUint("AllocsPerOp", vdl.Uint64Type, x.AllocsPerOp); err != nil {
+		if err := enc.NextFieldValueUint(3, vdl.Uint64Type, x.AllocsPerOp); err != nil {
 			return err
 		}
 	}
 	if x.AllocedBytesPerOp != 0 {
-		if err := enc.NextFieldValueUint("AllocedBytesPerOp", vdl.Uint64Type, x.AllocedBytesPerOp); err != nil {
+		if err := enc.NextFieldValueUint(4, vdl.Uint64Type, x.AllocedBytesPerOp); err != nil {
 			return err
 		}
 	}
 	if x.MegaBytesPerSec != 0 {
-		if err := enc.NextFieldValueFloat("MegaBytesPerSec", vdl.Float64Type, x.MegaBytesPerSec); err != nil {
+		if err := enc.NextFieldValueFloat(5, vdl.Float64Type, x.MegaBytesPerSec); err != nil {
 			return err
 		}
 	}
 	if x.Parallelism != 0 {
-		if err := enc.NextFieldValueUint("Parallelism", vdl.Uint32Type, uint64(x.Parallelism)); err != nil {
+		if err := enc.NextFieldValueUint(6, vdl.Uint32Type, uint64(x.Parallelism)); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -360,67 +381,74 @@
 	if err := dec.StartValue(__VDLType_struct_5); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Name":
+		}
+		if decType != __VDLType_struct_5 {
+			index = __VDLType_struct_5.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.Name = value
 			}
-		case "Iterations":
+		case 1:
 			switch value, err := dec.ReadValueUint(64); {
 			case err != nil:
 				return err
 			default:
 				x.Iterations = value
 			}
-		case "NanoSecsPerOp":
+		case 2:
 			switch value, err := dec.ReadValueFloat(64); {
 			case err != nil:
 				return err
 			default:
 				x.NanoSecsPerOp = value
 			}
-		case "AllocsPerOp":
+		case 3:
 			switch value, err := dec.ReadValueUint(64); {
 			case err != nil:
 				return err
 			default:
 				x.AllocsPerOp = value
 			}
-		case "AllocedBytesPerOp":
+		case 4:
 			switch value, err := dec.ReadValueUint(64); {
 			case err != nil:
 				return err
 			default:
 				x.AllocedBytesPerOp = value
 			}
-		case "MegaBytesPerSec":
+		case 5:
 			switch value, err := dec.ReadValueFloat(64); {
 			case err != nil:
 				return err
 			default:
 				x.MegaBytesPerSec = value
 			}
-		case "Parallelism":
+		case 6:
 			switch value, err := dec.ReadValueUint(32); {
 			case err != nil:
 				return err
 			default:
 				x.Parallelism = uint32(value)
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
diff --git a/services/groups/internal/server/server.vdl.go b/services/groups/internal/server/server.vdl.go
index bb8fbd9..03e3723 100644
--- a/services/groups/internal/server/server.vdl.go
+++ b/services/groups/internal/server/server.vdl.go
@@ -45,7 +45,7 @@
 		return err
 	}
 	if len(x.Perms) != 0 {
-		if err := enc.NextField("Perms"); err != nil {
+		if err := enc.NextField(0); err != nil {
 			return err
 		}
 		if err := x.Perms.VDLWrite(enc); err != nil {
@@ -53,14 +53,14 @@
 		}
 	}
 	if len(x.Entries) != 0 {
-		if err := enc.NextField("Entries"); err != nil {
+		if err := enc.NextField(1); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_set_1(enc, x.Entries); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -89,26 +89,33 @@
 	if err := dec.StartValue(__VDLType_struct_1); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Perms":
+		}
+		if decType != __VDLType_struct_1 {
+			index = __VDLType_struct_1.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			if err := x.Perms.VDLRead(dec); err != nil {
 				return err
 			}
-		case "Entries":
+		case 1:
 			if err := __VDLReadAnon_set_1(dec, &x.Entries); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
diff --git a/services/identity/identity.vdl.go b/services/identity/identity.vdl.go
index 22150e1..357500d 100644
--- a/services/identity/identity.vdl.go
+++ b/services/identity/identity.vdl.go
@@ -50,7 +50,7 @@
 		return err
 	}
 	if len(x.Names) != 0 {
-		if err := enc.NextField("Names"); err != nil {
+		if err := enc.NextField(0); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_list_1(enc, x.Names); err != nil {
@@ -58,11 +58,11 @@
 		}
 	}
 	if x.PublicKey != "" {
-		if err := enc.NextFieldValueString("PublicKey", vdl.StringType, x.PublicKey); err != nil {
+		if err := enc.NextFieldValueString(1, vdl.StringType, x.PublicKey); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -91,29 +91,36 @@
 	if err := dec.StartValue(__VDLType_struct_1); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Names":
+		}
+		if decType != __VDLType_struct_1 {
+			index = __VDLType_struct_1.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			if err := __VDLReadAnon_list_1(dec, &x.Names); err != nil {
 				return err
 			}
-		case "PublicKey":
+		case 1:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.PublicKey = value
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
diff --git a/services/profile/profile.vdl.go b/services/profile/profile.vdl.go
index c63ecfe..7e8c48f 100644
--- a/services/profile/profile.vdl.go
+++ b/services/profile/profile.vdl.go
@@ -42,21 +42,21 @@
 		return err
 	}
 	if x.Name != "" {
-		if err := enc.NextFieldValueString("Name", vdl.StringType, x.Name); err != nil {
+		if err := enc.NextFieldValueString(0, vdl.StringType, x.Name); err != nil {
 			return err
 		}
 	}
 	if x.MajorVersion != "" {
-		if err := enc.NextFieldValueString("MajorVersion", vdl.StringType, x.MajorVersion); err != nil {
+		if err := enc.NextFieldValueString(1, vdl.StringType, x.MajorVersion); err != nil {
 			return err
 		}
 	}
 	if x.MinorVersion != "" {
-		if err := enc.NextFieldValueString("MinorVersion", vdl.StringType, x.MinorVersion); err != nil {
+		if err := enc.NextFieldValueString(2, vdl.StringType, x.MinorVersion); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -67,39 +67,46 @@
 	if err := dec.StartValue(__VDLType_struct_1); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Name":
+		}
+		if decType != __VDLType_struct_1 {
+			index = __VDLType_struct_1.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.Name = value
 			}
-		case "MajorVersion":
+		case 1:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.MajorVersion = value
 			}
-		case "MinorVersion":
+		case 2:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.MinorVersion = value
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -154,39 +161,39 @@
 		return err
 	}
 	if x.Label != "" {
-		if err := enc.NextFieldValueString("Label", vdl.StringType, x.Label); err != nil {
+		if err := enc.NextFieldValueString(0, vdl.StringType, x.Label); err != nil {
 			return err
 		}
 	}
 	if x.Description != "" {
-		if err := enc.NextFieldValueString("Description", vdl.StringType, x.Description); err != nil {
+		if err := enc.NextFieldValueString(1, vdl.StringType, x.Description); err != nil {
 			return err
 		}
 	}
 	if x.Arch != build.ArchitectureAmd64 {
-		if err := enc.NextFieldValueString("Arch", __VDLType_enum_3, x.Arch.String()); err != nil {
+		if err := enc.NextFieldValueString(2, __VDLType_enum_3, x.Arch.String()); err != nil {
 			return err
 		}
 	}
 	if x.Os != build.OperatingSystemDarwin {
-		if err := enc.NextFieldValueString("Os", __VDLType_enum_4, x.Os.String()); err != nil {
+		if err := enc.NextFieldValueString(3, __VDLType_enum_4, x.Os.String()); err != nil {
 			return err
 		}
 	}
 	if x.Format != build.FormatElf {
-		if err := enc.NextFieldValueString("Format", __VDLType_enum_5, x.Format.String()); err != nil {
+		if err := enc.NextFieldValueString(4, __VDLType_enum_5, x.Format.String()); err != nil {
 			return err
 		}
 	}
 	if len(x.Libraries) != 0 {
-		if err := enc.NextField("Libraries"); err != nil {
+		if err := enc.NextField(5); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_set_1(enc, x.Libraries); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -218,29 +225,40 @@
 	if err := dec.StartValue(__VDLType_struct_2); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Label":
+		}
+		if decType != __VDLType_struct_2 {
+			index = __VDLType_struct_2.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.Label = value
 			}
-		case "Description":
+		case 1:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.Description = value
 			}
-		case "Arch":
+		case 2:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
@@ -249,7 +267,7 @@
 					return err
 				}
 			}
-		case "Os":
+		case 3:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
@@ -258,7 +276,7 @@
 					return err
 				}
 			}
-		case "Format":
+		case 4:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
@@ -267,14 +285,10 @@
 					return err
 				}
 			}
-		case "Libraries":
+		case 5:
 			if err := __VDLReadAnon_set_1(dec, &x.Libraries); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
diff --git a/services/role/roled/internal/internal.vdl.go b/services/role/roled/internal/internal.vdl.go
index f3334e3..f9cdd6a 100644
--- a/services/role/roled/internal/internal.vdl.go
+++ b/services/role/roled/internal/internal.vdl.go
@@ -78,7 +78,7 @@
 		return err
 	}
 	if len(x.ImportMembers) != 0 {
-		if err := enc.NextField("ImportMembers"); err != nil {
+		if err := enc.NextField(0); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_list_1(enc, x.ImportMembers); err != nil {
@@ -86,7 +86,7 @@
 		}
 	}
 	if len(x.Members) != 0 {
-		if err := enc.NextField("Members"); err != nil {
+		if err := enc.NextField(1); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_list_2(enc, x.Members); err != nil {
@@ -94,29 +94,29 @@
 		}
 	}
 	if x.Extend {
-		if err := enc.NextFieldValueBool("Extend", vdl.BoolType, x.Extend); err != nil {
+		if err := enc.NextFieldValueBool(2, vdl.BoolType, x.Extend); err != nil {
 			return err
 		}
 	}
 	if x.Audit {
-		if err := enc.NextFieldValueBool("Audit", vdl.BoolType, x.Audit); err != nil {
+		if err := enc.NextFieldValueBool(3, vdl.BoolType, x.Audit); err != nil {
 			return err
 		}
 	}
 	if x.Expiry != "" {
-		if err := enc.NextFieldValueString("Expiry", vdl.StringType, x.Expiry); err != nil {
+		if err := enc.NextFieldValueString(4, vdl.StringType, x.Expiry); err != nil {
 			return err
 		}
 	}
 	if len(x.Peers) != 0 {
-		if err := enc.NextField("Peers"); err != nil {
+		if err := enc.NextField(5); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_list_2(enc, x.Peers); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -163,51 +163,58 @@
 	if err := dec.StartValue(__VDLType_struct_1); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "ImportMembers":
+		}
+		if decType != __VDLType_struct_1 {
+			index = __VDLType_struct_1.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			if err := __VDLReadAnon_list_1(dec, &x.ImportMembers); err != nil {
 				return err
 			}
-		case "Members":
+		case 1:
 			if err := __VDLReadAnon_list_2(dec, &x.Members); err != nil {
 				return err
 			}
-		case "Extend":
+		case 2:
 			switch value, err := dec.ReadValueBool(); {
 			case err != nil:
 				return err
 			default:
 				x.Extend = value
 			}
-		case "Audit":
+		case 3:
 			switch value, err := dec.ReadValueBool(); {
 			case err != nil:
 				return err
 			default:
 				x.Audit = value
 			}
-		case "Expiry":
+		case 4:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.Expiry = value
 			}
-		case "Peers":
+		case 5:
 			if err := __VDLReadAnon_list_2(dec, &x.Peers); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
diff --git a/services/stats/stats.vdl.go b/services/stats/stats.vdl.go
index fb699ec..725c16e 100644
--- a/services/stats/stats.vdl.go
+++ b/services/stats/stats.vdl.go
@@ -39,16 +39,16 @@
 		return err
 	}
 	if x.LowBound != 0 {
-		if err := enc.NextFieldValueInt("LowBound", vdl.Int64Type, x.LowBound); err != nil {
+		if err := enc.NextFieldValueInt(0, vdl.Int64Type, x.LowBound); err != nil {
 			return err
 		}
 	}
 	if x.Count != 0 {
-		if err := enc.NextFieldValueInt("Count", vdl.Int64Type, x.Count); err != nil {
+		if err := enc.NextFieldValueInt(1, vdl.Int64Type, x.Count); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -59,32 +59,39 @@
 	if err := dec.StartValue(__VDLType_struct_1); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "LowBound":
+		}
+		if decType != __VDLType_struct_1 {
+			index = __VDLType_struct_1.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueInt(64); {
 			case err != nil:
 				return err
 			default:
 				x.LowBound = value
 			}
-		case "Count":
+		case 1:
 			switch value, err := dec.ReadValueInt(64); {
 			case err != nil:
 				return err
 			default:
 				x.Count = value
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -132,34 +139,34 @@
 		return err
 	}
 	if x.Count != 0 {
-		if err := enc.NextFieldValueInt("Count", vdl.Int64Type, x.Count); err != nil {
+		if err := enc.NextFieldValueInt(0, vdl.Int64Type, x.Count); err != nil {
 			return err
 		}
 	}
 	if x.Sum != 0 {
-		if err := enc.NextFieldValueInt("Sum", vdl.Int64Type, x.Sum); err != nil {
+		if err := enc.NextFieldValueInt(1, vdl.Int64Type, x.Sum); err != nil {
 			return err
 		}
 	}
 	if x.Min != 0 {
-		if err := enc.NextFieldValueInt("Min", vdl.Int64Type, x.Min); err != nil {
+		if err := enc.NextFieldValueInt(2, vdl.Int64Type, x.Min); err != nil {
 			return err
 		}
 	}
 	if x.Max != 0 {
-		if err := enc.NextFieldValueInt("Max", vdl.Int64Type, x.Max); err != nil {
+		if err := enc.NextFieldValueInt(3, vdl.Int64Type, x.Max); err != nil {
 			return err
 		}
 	}
 	if len(x.Buckets) != 0 {
-		if err := enc.NextField("Buckets"); err != nil {
+		if err := enc.NextField(4); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_list_1(enc, x.Buckets); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -191,50 +198,57 @@
 	if err := dec.StartValue(__VDLType_struct_2); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Count":
+		}
+		if decType != __VDLType_struct_2 {
+			index = __VDLType_struct_2.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueInt(64); {
 			case err != nil:
 				return err
 			default:
 				x.Count = value
 			}
-		case "Sum":
+		case 1:
 			switch value, err := dec.ReadValueInt(64); {
 			case err != nil:
 				return err
 			default:
 				x.Sum = value
 			}
-		case "Min":
+		case 2:
 			switch value, err := dec.ReadValueInt(64); {
 			case err != nil:
 				return err
 			default:
 				x.Min = value
 			}
-		case "Max":
+		case 3:
 			switch value, err := dec.ReadValueInt(64); {
 			case err != nil:
 				return err
 			default:
 				x.Max = value
 			}
-		case "Buckets":
+		case 4:
 			if err := __VDLReadAnon_list_1(dec, &x.Buckets); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
diff --git a/services/syncbase/localblobstore/localblobstore.vdl.go b/services/syncbase/localblobstore/localblobstore.vdl.go
index 40d3b82..2563f33 100644
--- a/services/syncbase/localblobstore/localblobstore.vdl.go
+++ b/services/syncbase/localblobstore/localblobstore.vdl.go
@@ -54,7 +54,7 @@
 		return err
 	}
 	if len(x.OwnerShares) != 0 {
-		if err := enc.NextField("OwnerShares"); err != nil {
+		if err := enc.NextField(0); err != nil {
 			return err
 		}
 		if err := x.OwnerShares.VDLWrite(enc); err != nil {
@@ -62,7 +62,7 @@
 		}
 	}
 	if !x.Referenced.IsZero() {
-		if err := enc.NextField("Referenced"); err != nil {
+		if err := enc.NextField(1); err != nil {
 			return err
 		}
 		var wire vdltime.Time
@@ -74,7 +74,7 @@
 		}
 	}
 	if !x.Accessed.IsZero() {
-		if err := enc.NextField("Accessed"); err != nil {
+		if err := enc.NextField(2); err != nil {
 			return err
 		}
 		var wire vdltime.Time
@@ -85,7 +85,7 @@
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -96,19 +96,30 @@
 	if err := dec.StartValue(__VDLType_struct_1); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "OwnerShares":
+		}
+		if decType != __VDLType_struct_1 {
+			index = __VDLType_struct_1.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			if err := x.OwnerShares.VDLRead(dec); err != nil {
 				return err
 			}
-		case "Referenced":
+		case 1:
 			var wire vdltime.Time
 			if err := wire.VDLRead(dec); err != nil {
 				return err
@@ -116,7 +127,7 @@
 			if err := vdltime.TimeToNative(wire, &x.Referenced); err != nil {
 				return err
 			}
-		case "Accessed":
+		case 2:
 			var wire vdltime.Time
 			if err := wire.VDLRead(dec); err != nil {
 				return err
@@ -124,10 +135,6 @@
 			if err := vdltime.TimeToNative(wire, &x.Accessed); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -156,14 +163,14 @@
 		return err
 	}
 	if !x.Priority.VDLIsZero() {
-		if err := enc.NextField("Priority"); err != nil {
+		if err := enc.NextField(0); err != nil {
 			return err
 		}
 		if err := x.Priority.VDLWrite(enc); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -174,20 +181,27 @@
 	if err := dec.StartValue(__VDLType_struct_4); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Priority":
-			if err := x.Priority.VDLRead(dec); err != nil {
-				return err
+		}
+		if decType != __VDLType_struct_4 {
+			index = __VDLType_struct_4.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
+		}
+		switch index {
+		case 0:
+			if err := x.Priority.VDLRead(dec); err != nil {
 				return err
 			}
 		}
diff --git a/services/syncbase/server/interfaces/interfaces.vdl.go b/services/syncbase/server/interfaces/interfaces.vdl.go
index f9557cc..6cc6dda 100644
--- a/services/syncbase/server/interfaces/interfaces.vdl.go
+++ b/services/syncbase/server/interfaces/interfaces.vdl.go
@@ -223,32 +223,32 @@
 		return err
 	}
 	if x.Id != 0 {
-		if err := enc.NextFieldValueUint("Id", vdl.Uint64Type, x.Id); err != nil {
+		if err := enc.NextFieldValueUint(0, vdl.Uint64Type, x.Id); err != nil {
 			return err
 		}
 	}
 	if x.Gen != 0 {
-		if err := enc.NextFieldValueUint("Gen", vdl.Uint64Type, x.Gen); err != nil {
+		if err := enc.NextFieldValueUint(1, vdl.Uint64Type, x.Gen); err != nil {
 			return err
 		}
 	}
 	if x.RecType != 0 {
-		if err := enc.NextFieldValueUint("RecType", vdl.ByteType, uint64(x.RecType)); err != nil {
+		if err := enc.NextFieldValueUint(2, vdl.ByteType, uint64(x.RecType)); err != nil {
 			return err
 		}
 	}
 	if x.ObjId != "" {
-		if err := enc.NextFieldValueString("ObjId", vdl.StringType, x.ObjId); err != nil {
+		if err := enc.NextFieldValueString(3, vdl.StringType, x.ObjId); err != nil {
 			return err
 		}
 	}
 	if x.CurVers != "" {
-		if err := enc.NextFieldValueString("CurVers", vdl.StringType, x.CurVers); err != nil {
+		if err := enc.NextFieldValueString(4, vdl.StringType, x.CurVers); err != nil {
 			return err
 		}
 	}
 	if len(x.Parents) != 0 {
-		if err := enc.NextField("Parents"); err != nil {
+		if err := enc.NextField(5); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_list_1(enc, x.Parents); err != nil {
@@ -256,7 +256,7 @@
 		}
 	}
 	if !x.UpdTime.IsZero() {
-		if err := enc.NextField("UpdTime"); err != nil {
+		if err := enc.NextField(6); err != nil {
 			return err
 		}
 		var wire vdltime.Time
@@ -268,21 +268,21 @@
 		}
 	}
 	if x.Delete {
-		if err := enc.NextFieldValueBool("Delete", vdl.BoolType, x.Delete); err != nil {
+		if err := enc.NextFieldValueBool(7, vdl.BoolType, x.Delete); err != nil {
 			return err
 		}
 	}
 	if x.BatchId != 0 {
-		if err := enc.NextFieldValueUint("BatchId", vdl.Uint64Type, x.BatchId); err != nil {
+		if err := enc.NextFieldValueUint(8, vdl.Uint64Type, x.BatchId); err != nil {
 			return err
 		}
 	}
 	if x.BatchCount != 0 {
-		if err := enc.NextFieldValueUint("BatchCount", vdl.Uint64Type, x.BatchCount); err != nil {
+		if err := enc.NextFieldValueUint(9, vdl.Uint64Type, x.BatchCount); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -311,54 +311,65 @@
 	if err := dec.StartValue(__VDLType_struct_3); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Id":
+		}
+		if decType != __VDLType_struct_3 {
+			index = __VDLType_struct_3.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueUint(64); {
 			case err != nil:
 				return err
 			default:
 				x.Id = value
 			}
-		case "Gen":
+		case 1:
 			switch value, err := dec.ReadValueUint(64); {
 			case err != nil:
 				return err
 			default:
 				x.Gen = value
 			}
-		case "RecType":
+		case 2:
 			switch value, err := dec.ReadValueUint(8); {
 			case err != nil:
 				return err
 			default:
 				x.RecType = byte(value)
 			}
-		case "ObjId":
+		case 3:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.ObjId = value
 			}
-		case "CurVers":
+		case 4:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.CurVers = value
 			}
-		case "Parents":
+		case 5:
 			if err := __VDLReadAnon_list_1(dec, &x.Parents); err != nil {
 				return err
 			}
-		case "UpdTime":
+		case 6:
 			var wire vdltime.Time
 			if err := wire.VDLRead(dec); err != nil {
 				return err
@@ -366,31 +377,27 @@
 			if err := vdltime.TimeToNative(wire, &x.UpdTime); err != nil {
 				return err
 			}
-		case "Delete":
+		case 7:
 			switch value, err := dec.ReadValueBool(); {
 			case err != nil:
 				return err
 			default:
 				x.Delete = value
 			}
-		case "BatchId":
+		case 8:
 			switch value, err := dec.ReadValueUint(64); {
 			case err != nil:
 				return err
 			default:
 				x.BatchId = value
 			}
-		case "BatchCount":
+		case 9:
 			switch value, err := dec.ReadValueUint(64); {
 			case err != nil:
 				return err
 			default:
 				x.BatchCount = value
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -443,7 +450,7 @@
 		return err
 	}
 	if !x.Metadata.VDLIsZero() {
-		if err := enc.NextField("Metadata"); err != nil {
+		if err := enc.NextField(0); err != nil {
 			return err
 		}
 		if err := x.Metadata.VDLWrite(enc); err != nil {
@@ -451,14 +458,14 @@
 		}
 	}
 	if x.Value != nil && !x.Value.VDLIsZero() {
-		if err := enc.NextField("Value"); err != nil {
+		if err := enc.NextField(1); err != nil {
 			return err
 		}
 		if err := x.Value.VDLWrite(enc); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -471,27 +478,34 @@
 	if err := dec.StartValue(__VDLType_struct_6); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Metadata":
+		}
+		if decType != __VDLType_struct_6 {
+			index = __VDLType_struct_6.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			if err := x.Metadata.VDLRead(dec); err != nil {
 				return err
 			}
-		case "Value":
+		case 1:
 			x.Value = new(vom.RawBytes)
 			if err := x.Value.VDLRead(dec); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -632,24 +646,24 @@
 		return err
 	}
 	if x.WhenUpdated != 0 {
-		if err := enc.NextFieldValueInt("WhenUpdated", vdl.Int64Type, x.WhenUpdated); err != nil {
+		if err := enc.NextFieldValueInt(0, vdl.Int64Type, x.WhenUpdated); err != nil {
 			return err
 		}
 	}
 	if x.HasLeft {
-		if err := enc.NextFieldValueBool("HasLeft", vdl.BoolType, x.HasLeft); err != nil {
+		if err := enc.NextFieldValueBool(1, vdl.BoolType, x.HasLeft); err != nil {
 			return err
 		}
 	}
 	if x.MemberInfo != (syncbase.SyncgroupMemberInfo{}) {
-		if err := enc.NextField("MemberInfo"); err != nil {
+		if err := enc.NextField(2); err != nil {
 			return err
 		}
 		if err := x.MemberInfo.VDLWrite(enc); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -660,36 +674,43 @@
 	if err := dec.StartValue(__VDLType_struct_9); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "WhenUpdated":
+		}
+		if decType != __VDLType_struct_9 {
+			index = __VDLType_struct_9.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueInt(64); {
 			case err != nil:
 				return err
 			default:
 				x.WhenUpdated = value
 			}
-		case "HasLeft":
+		case 1:
 			switch value, err := dec.ReadValueBool(); {
 			case err != nil:
 				return err
 			default:
 				x.HasLeft = value
 			}
-		case "MemberInfo":
+		case 2:
 			if err := x.MemberInfo.VDLRead(dec); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -740,7 +761,7 @@
 		return err
 	}
 	if x.Id != (syncbase.Id{}) {
-		if err := enc.NextField("Id"); err != nil {
+		if err := enc.NextField(0); err != nil {
 			return err
 		}
 		if err := x.Id.VDLWrite(enc); err != nil {
@@ -748,12 +769,12 @@
 		}
 	}
 	if x.SpecVersion != "" {
-		if err := enc.NextFieldValueString("SpecVersion", vdl.StringType, x.SpecVersion); err != nil {
+		if err := enc.NextFieldValueString(1, vdl.StringType, x.SpecVersion); err != nil {
 			return err
 		}
 	}
 	if !x.Spec.VDLIsZero() {
-		if err := enc.NextField("Spec"); err != nil {
+		if err := enc.NextField(2); err != nil {
 			return err
 		}
 		if err := x.Spec.VDLWrite(enc); err != nil {
@@ -761,12 +782,12 @@
 		}
 	}
 	if x.Creator != "" {
-		if err := enc.NextFieldValueString("Creator", vdl.StringType, x.Creator); err != nil {
+		if err := enc.NextFieldValueString(3, vdl.StringType, x.Creator); err != nil {
 			return err
 		}
 	}
 	if x.DbId != (syncbase.Id{}) {
-		if err := enc.NextField("DbId"); err != nil {
+		if err := enc.NextField(4); err != nil {
 			return err
 		}
 		if err := x.DbId.VDLWrite(enc); err != nil {
@@ -774,19 +795,19 @@
 		}
 	}
 	if x.Status != SyncgroupStatusPublishPending {
-		if err := enc.NextFieldValueString("Status", __VDLType_enum_8, x.Status.String()); err != nil {
+		if err := enc.NextFieldValueString(5, __VDLType_enum_8, x.Status.String()); err != nil {
 			return err
 		}
 	}
 	if len(x.Joiners) != 0 {
-		if err := enc.NextField("Joiners"); err != nil {
+		if err := enc.NextField(6); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_map_2(enc, x.Joiners); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -818,41 +839,52 @@
 	if err := dec.StartValue(__VDLType_struct_11); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Id":
+		}
+		if decType != __VDLType_struct_11 {
+			index = __VDLType_struct_11.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			if err := x.Id.VDLRead(dec); err != nil {
 				return err
 			}
-		case "SpecVersion":
+		case 1:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.SpecVersion = value
 			}
-		case "Spec":
+		case 2:
 			if err := x.Spec.VDLRead(dec); err != nil {
 				return err
 			}
-		case "Creator":
+		case 3:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.Creator = value
 			}
-		case "DbId":
+		case 4:
 			if err := x.DbId.VDLRead(dec); err != nil {
 				return err
 			}
-		case "Status":
+		case 5:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
@@ -861,14 +893,10 @@
 					return err
 				}
 			}
-		case "Joiners":
+		case 6:
 			if err := __VDLReadAnon_map_2(dec, &x.Joiners); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -997,7 +1025,7 @@
 		return err
 	}
 	if x.DbId != (syncbase.Id{}) {
-		if err := enc.NextField("DbId"); err != nil {
+		if err := enc.NextField(0); err != nil {
 			return err
 		}
 		if err := x.DbId.VDLWrite(enc); err != nil {
@@ -1005,14 +1033,14 @@
 		}
 	}
 	if len(x.Gvs) != 0 {
-		if err := enc.NextField("Gvs"); err != nil {
+		if err := enc.NextField(1); err != nil {
 			return err
 		}
 		if err := x.Gvs.VDLWrite(enc); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -1023,26 +1051,33 @@
 	if err := dec.StartValue(__VDLType_struct_17); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "DbId":
+		}
+		if decType != __VDLType_struct_17 {
+			index = __VDLType_struct_17.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			if err := x.DbId.VDLRead(dec); err != nil {
 				return err
 			}
-		case "Gvs":
+		case 1:
 			if err := x.Gvs.VDLRead(dec); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -1078,7 +1113,7 @@
 		return err
 	}
 	if x.DbId != (syncbase.Id{}) {
-		if err := enc.NextField("DbId"); err != nil {
+		if err := enc.NextField(0); err != nil {
 			return err
 		}
 		if err := x.DbId.VDLWrite(enc); err != nil {
@@ -1086,7 +1121,7 @@
 		}
 	}
 	if len(x.SgIds) != 0 {
-		if err := enc.NextField("SgIds"); err != nil {
+		if err := enc.NextField(1); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_set_3(enc, x.SgIds); err != nil {
@@ -1094,14 +1129,14 @@
 		}
 	}
 	if len(x.Gvs) != 0 {
-		if err := enc.NextField("Gvs"); err != nil {
+		if err := enc.NextField(2); err != nil {
 			return err
 		}
 		if err := x.Gvs.VDLWrite(enc); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -1130,30 +1165,37 @@
 	if err := dec.StartValue(__VDLType_struct_18); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "DbId":
+		}
+		if decType != __VDLType_struct_18 {
+			index = __VDLType_struct_18.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			if err := x.DbId.VDLRead(dec); err != nil {
 				return err
 			}
-		case "SgIds":
+		case 1:
 			if err := __VDLReadAnon_set_3(dec, &x.SgIds); err != nil {
 				return err
 			}
-		case "Gvs":
+		case 2:
 			if err := x.Gvs.VDLRead(dec); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -1236,13 +1278,13 @@
 	if err := enc.StartValue(__VDLType_union_20); err != nil {
 		return err
 	}
-	if err := enc.NextField("Sgs"); err != nil {
+	if err := enc.NextField(0); err != nil {
 		return err
 	}
 	if err := x.Value.VDLWrite(enc); err != nil {
 		return err
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -1252,13 +1294,13 @@
 	if err := enc.StartValue(__VDLType_union_20); err != nil {
 		return err
 	}
-	if err := enc.NextField("Data"); err != nil {
+	if err := enc.NextField(1); err != nil {
 		return err
 	}
 	if err := x.Value.VDLWrite(enc); err != nil {
 		return err
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -1268,33 +1310,40 @@
 	if err := dec.StartValue(__VDLType_union_20); err != nil {
 		return err
 	}
-	f, err := dec.NextField()
-	if err != nil {
+	decType := dec.Type()
+	index, err := dec.NextField()
+	switch {
+	case err != nil:
 		return err
+	case index == -1:
+		return fmt.Errorf("missing field in union %T, from %v", x, decType)
 	}
-	switch f {
-	case "Sgs":
+	if decType != __VDLType_union_20 {
+		name := decType.Field(index).Name
+		index = __VDLType_union_20.FieldIndexByName(name)
+		if index == -1 {
+			return fmt.Errorf("field %q not in union %T, from %v", name, x, decType)
+		}
+	}
+	switch index {
+	case 0:
 		var field DeltaReqSgs
 		if err := field.Value.VDLRead(dec); err != nil {
 			return err
 		}
 		*x = field
-	case "Data":
+	case 1:
 		var field DeltaReqData
 		if err := field.Value.VDLRead(dec); err != nil {
 			return err
 		}
 		*x = field
-	case "":
-		return fmt.Errorf("missing field in union %T, from %v", x, dec.Type())
-	default:
-		return fmt.Errorf("field %q not in union %T, from %v", f, x, dec.Type())
 	}
-	switch f, err := dec.NextField(); {
+	switch index, err := dec.NextField(); {
 	case err != nil:
 		return err
-	case f != "":
-		return fmt.Errorf("extra field %q in union %T, from %v", f, x, dec.Type())
+	case index != -1:
+		return fmt.Errorf("extra field %d in union %T, from %v", index, x, dec.Type())
 	}
 	return dec.FinishValue()
 }
@@ -1353,13 +1402,13 @@
 	if err := enc.StartValue(__VDLType_union_21); err != nil {
 		return err
 	}
-	if err := enc.NextField("Rec"); err != nil {
+	if err := enc.NextField(0); err != nil {
 		return err
 	}
 	if err := x.Value.VDLWrite(enc); err != nil {
 		return err
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -1369,13 +1418,13 @@
 	if err := enc.StartValue(__VDLType_union_21); err != nil {
 		return err
 	}
-	if err := enc.NextField("Gvs"); err != nil {
+	if err := enc.NextField(1); err != nil {
 		return err
 	}
 	if err := x.Value.VDLWrite(enc); err != nil {
 		return err
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -1385,33 +1434,40 @@
 	if err := dec.StartValue(__VDLType_union_21); err != nil {
 		return err
 	}
-	f, err := dec.NextField()
-	if err != nil {
+	decType := dec.Type()
+	index, err := dec.NextField()
+	switch {
+	case err != nil:
 		return err
+	case index == -1:
+		return fmt.Errorf("missing field in union %T, from %v", x, decType)
 	}
-	switch f {
-	case "Rec":
+	if decType != __VDLType_union_21 {
+		name := decType.Field(index).Name
+		index = __VDLType_union_21.FieldIndexByName(name)
+		if index == -1 {
+			return fmt.Errorf("field %q not in union %T, from %v", name, x, decType)
+		}
+	}
+	switch index {
+	case 0:
 		var field DeltaRespRec
 		if err := field.Value.VDLRead(dec); err != nil {
 			return err
 		}
 		*x = field
-	case "Gvs":
+	case 1:
 		var field DeltaRespGvs
 		if err := field.Value.VDLRead(dec); err != nil {
 			return err
 		}
 		*x = field
-	case "":
-		return fmt.Errorf("missing field in union %T, from %v", x, dec.Type())
-	default:
-		return fmt.Errorf("field %q not in union %T, from %v", f, x, dec.Type())
 	}
-	switch f, err := dec.NextField(); {
+	switch index, err := dec.NextField(); {
 	case err != nil:
 		return err
-	case f != "":
-		return fmt.Errorf("extra field %q in union %T, from %v", f, x, dec.Type())
+	case index != -1:
+		return fmt.Errorf("extra field %d in union %T, from %v", index, x, dec.Type())
 	}
 	return dec.FinishValue()
 }
@@ -1447,17 +1503,17 @@
 		return err
 	}
 	if x.DevType != 0 {
-		if err := enc.NextFieldValueInt("DevType", vdl.Int32Type, int64(x.DevType)); err != nil {
+		if err := enc.NextFieldValueInt(0, vdl.Int32Type, int64(x.DevType)); err != nil {
 			return err
 		}
 	}
 	if x.Distance != 0 {
-		if err := enc.NextFieldValueFloat("Distance", vdl.Float32Type, float64(x.Distance)); err != nil {
+		if err := enc.NextFieldValueFloat(1, vdl.Float32Type, float64(x.Distance)); err != nil {
 			return err
 		}
 	}
 	if !x.ServerTime.IsZero() {
-		if err := enc.NextField("ServerTime"); err != nil {
+		if err := enc.NextField(2); err != nil {
 			return err
 		}
 		var wire vdltime.Time
@@ -1468,7 +1524,7 @@
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -1479,29 +1535,40 @@
 	if err := dec.StartValue(__VDLType_struct_22); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "DevType":
+		}
+		if decType != __VDLType_struct_22 {
+			index = __VDLType_struct_22.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueInt(32); {
 			case err != nil:
 				return err
 			default:
 				x.DevType = int32(value)
 			}
-		case "Distance":
+		case 1:
 			switch value, err := dec.ReadValueFloat(32); {
 			case err != nil:
 				return err
 			default:
 				x.Distance = float32(value)
 			}
-		case "ServerTime":
+		case 2:
 			var wire vdltime.Time
 			if err := wire.VDLRead(dec); err != nil {
 				return err
@@ -1509,10 +1576,6 @@
 			if err := vdltime.TimeToNative(wire, &x.ServerTime); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -1602,14 +1665,14 @@
 		return err
 	}
 	if len(x.SgPriorities) != 0 {
-		if err := enc.NextField("SgPriorities"); err != nil {
+		if err := enc.NextField(0); err != nil {
 			return err
 		}
 		if err := x.SgPriorities.VDLWrite(enc); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -1620,20 +1683,27 @@
 	if err := dec.StartValue(__VDLType_struct_24); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "SgPriorities":
-			if err := x.SgPriorities.VDLRead(dec); err != nil {
-				return err
+		}
+		if decType != __VDLType_struct_24 {
+			index = __VDLType_struct_24.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
+		}
+		switch index {
+		case 0:
+			if err := x.SgPriorities.VDLRead(dec); err != nil {
 				return err
 			}
 		}
@@ -1662,11 +1732,11 @@
 		return err
 	}
 	if len(x.Hash) != 0 {
-		if err := enc.NextFieldValueBytes("Hash", __VDLType_list_26, x.Hash); err != nil {
+		if err := enc.NextFieldValueBytes(0, __VDLType_list_26, x.Hash); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -1677,20 +1747,27 @@
 	if err := dec.StartValue(__VDLType_struct_25); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Hash":
-			if err := dec.ReadValueBytes(-1, &x.Hash); err != nil {
-				return err
+		}
+		if decType != __VDLType_struct_25 {
+			index = __VDLType_struct_25.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
+		}
+		switch index {
+		case 0:
+			if err := dec.ReadValueBytes(-1, &x.Hash); err != nil {
 				return err
 			}
 		}
@@ -1719,11 +1796,11 @@
 		return err
 	}
 	if len(x.Data) != 0 {
-		if err := enc.NextFieldValueBytes("Data", __VDLType_list_26, x.Data); err != nil {
+		if err := enc.NextFieldValueBytes(0, __VDLType_list_26, x.Data); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -1734,20 +1811,27 @@
 	if err := dec.StartValue(__VDLType_struct_27); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Data":
-			if err := dec.ReadValueBytes(-1, &x.Data); err != nil {
-				return err
+		}
+		if decType != __VDLType_struct_27 {
+			index = __VDLType_struct_27.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
+		}
+		switch index {
+		case 0:
+			if err := dec.ReadValueBytes(-1, &x.Data); err != nil {
 				return err
 			}
 		}
@@ -1776,7 +1860,7 @@
 		return err
 	}
 	if !x.SendTs.IsZero() {
-		if err := enc.NextField("SendTs"); err != nil {
+		if err := enc.NextField(0); err != nil {
 			return err
 		}
 		var wire vdltime.Time
@@ -1787,7 +1871,7 @@
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -1798,15 +1882,26 @@
 	if err := dec.StartValue(__VDLType_struct_28); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "SendTs":
+		}
+		if decType != __VDLType_struct_28 {
+			index = __VDLType_struct_28.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			var wire vdltime.Time
 			if err := wire.VDLRead(dec); err != nil {
 				return err
@@ -1814,10 +1909,6 @@
 			if err := vdltime.TimeToNative(wire, &x.SendTs); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -1871,7 +1962,7 @@
 		return err
 	}
 	if !x.OrigTs.IsZero() {
-		if err := enc.NextField("OrigTs"); err != nil {
+		if err := enc.NextField(0); err != nil {
 			return err
 		}
 		var wire vdltime.Time
@@ -1883,7 +1974,7 @@
 		}
 	}
 	if !x.RecvTs.IsZero() {
-		if err := enc.NextField("RecvTs"); err != nil {
+		if err := enc.NextField(1); err != nil {
 			return err
 		}
 		var wire vdltime.Time
@@ -1895,7 +1986,7 @@
 		}
 	}
 	if !x.SendTs.IsZero() {
-		if err := enc.NextField("SendTs"); err != nil {
+		if err := enc.NextField(2); err != nil {
 			return err
 		}
 		var wire vdltime.Time
@@ -1907,7 +1998,7 @@
 		}
 	}
 	if !x.LastNtpTs.IsZero() {
-		if err := enc.NextField("LastNtpTs"); err != nil {
+		if err := enc.NextField(3); err != nil {
 			return err
 		}
 		var wire vdltime.Time
@@ -1919,16 +2010,16 @@
 		}
 	}
 	if x.NumReboots != 0 {
-		if err := enc.NextFieldValueUint("NumReboots", vdl.Uint16Type, uint64(x.NumReboots)); err != nil {
+		if err := enc.NextFieldValueUint(4, vdl.Uint16Type, uint64(x.NumReboots)); err != nil {
 			return err
 		}
 	}
 	if x.NumHops != 0 {
-		if err := enc.NextFieldValueUint("NumHops", vdl.Uint16Type, uint64(x.NumHops)); err != nil {
+		if err := enc.NextFieldValueUint(5, vdl.Uint16Type, uint64(x.NumHops)); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -1939,15 +2030,26 @@
 	if err := dec.StartValue(__VDLType_struct_29); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "OrigTs":
+		}
+		if decType != __VDLType_struct_29 {
+			index = __VDLType_struct_29.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			var wire vdltime.Time
 			if err := wire.VDLRead(dec); err != nil {
 				return err
@@ -1955,7 +2057,7 @@
 			if err := vdltime.TimeToNative(wire, &x.OrigTs); err != nil {
 				return err
 			}
-		case "RecvTs":
+		case 1:
 			var wire vdltime.Time
 			if err := wire.VDLRead(dec); err != nil {
 				return err
@@ -1963,7 +2065,7 @@
 			if err := vdltime.TimeToNative(wire, &x.RecvTs); err != nil {
 				return err
 			}
-		case "SendTs":
+		case 2:
 			var wire vdltime.Time
 			if err := wire.VDLRead(dec); err != nil {
 				return err
@@ -1971,7 +2073,7 @@
 			if err := vdltime.TimeToNative(wire, &x.SendTs); err != nil {
 				return err
 			}
-		case "LastNtpTs":
+		case 3:
 			var wire vdltime.Time
 			if err := wire.VDLRead(dec); err != nil {
 				return err
@@ -1979,24 +2081,20 @@
 			if err := vdltime.TimeToNative(wire, &x.LastNtpTs); err != nil {
 				return err
 			}
-		case "NumReboots":
+		case 4:
 			switch value, err := dec.ReadValueUint(16); {
 			case err != nil:
 				return err
 			default:
 				x.NumReboots = uint16(value)
 			}
-		case "NumHops":
+		case 5:
 			switch value, err := dec.ReadValueUint(16); {
 			case err != nil:
 				return err
 			default:
 				x.NumHops = uint16(value)
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -2097,7 +2195,7 @@
 		return err
 	}
 	if !x.WhenSeen.IsZero() {
-		if err := enc.NextField("WhenSeen"); err != nil {
+		if err := enc.NextField(0); err != nil {
 			return err
 		}
 		var wire vdltime.Time
@@ -2109,16 +2207,16 @@
 		}
 	}
 	if x.IsProxy {
-		if err := enc.NextFieldValueBool("IsProxy", vdl.BoolType, x.IsProxy); err != nil {
+		if err := enc.NextFieldValueBool(1, vdl.BoolType, x.IsProxy); err != nil {
 			return err
 		}
 	}
 	if x.IsServer {
-		if err := enc.NextFieldValueBool("IsServer", vdl.BoolType, x.IsServer); err != nil {
+		if err := enc.NextFieldValueBool(2, vdl.BoolType, x.IsServer); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -2129,15 +2227,26 @@
 	if err := dec.StartValue(__VDLType_struct_31); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "WhenSeen":
+		}
+		if decType != __VDLType_struct_31 {
+			index = __VDLType_struct_31.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			var wire vdltime.Time
 			if err := wire.VDLRead(dec); err != nil {
 				return err
@@ -2145,24 +2254,20 @@
 			if err := vdltime.TimeToNative(wire, &x.WhenSeen); err != nil {
 				return err
 			}
-		case "IsProxy":
+		case 1:
 			switch value, err := dec.ReadValueBool(); {
 			case err != nil:
 				return err
 			default:
 				x.IsProxy = value
 			}
-		case "IsServer":
+		case 2:
 			switch value, err := dec.ReadValueBool(); {
 			case err != nil:
 				return err
 			default:
 				x.IsServer = value
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -2256,7 +2361,7 @@
 		return err
 	}
 	if len(x.Locations) != 0 {
-		if err := enc.NextField("Locations"); err != nil {
+		if err := enc.NextField(0); err != nil {
 			return err
 		}
 		if err := x.Locations.VDLWrite(enc); err != nil {
@@ -2264,14 +2369,14 @@
 		}
 	}
 	if len(x.SgIds) != 0 {
-		if err := enc.NextField("SgIds"); err != nil {
+		if err := enc.NextField(1); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_set_3(enc, x.SgIds); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -2282,26 +2387,33 @@
 	if err := dec.StartValue(__VDLType_struct_33); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Locations":
+		}
+		if decType != __VDLType_struct_33 {
+			index = __VDLType_struct_33.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			if err := x.Locations.VDLRead(dec); err != nil {
 				return err
 			}
-		case "SgIds":
+		case 1:
 			if err := __VDLReadAnon_set_3(dec, &x.SgIds); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
diff --git a/services/syncbase/server/server.vdl.go b/services/syncbase/server/server.vdl.go
index 6461580..c8a3e2a 100644
--- a/services/syncbase/server/server.vdl.go
+++ b/services/syncbase/server/server.vdl.go
@@ -44,19 +44,19 @@
 		return err
 	}
 	if x.Version != 0 {
-		if err := enc.NextFieldValueUint("Version", vdl.Uint64Type, x.Version); err != nil {
+		if err := enc.NextFieldValueUint(0, vdl.Uint64Type, x.Version); err != nil {
 			return err
 		}
 	}
 	if len(x.Perms) != 0 {
-		if err := enc.NextField("Perms"); err != nil {
+		if err := enc.NextField(1); err != nil {
 			return err
 		}
 		if err := x.Perms.VDLWrite(enc); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -67,29 +67,36 @@
 	if err := dec.StartValue(__VDLType_struct_1); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Version":
+		}
+		if decType != __VDLType_struct_1 {
+			index = __VDLType_struct_1.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueUint(64); {
 			case err != nil:
 				return err
 			default:
 				x.Version = value
 			}
-		case "Perms":
+		case 1:
 			if err := x.Perms.VDLRead(dec); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -118,7 +125,7 @@
 		return err
 	}
 	if x.Id != (syncbase.Id{}) {
-		if err := enc.NextField("Id"); err != nil {
+		if err := enc.NextField(0); err != nil {
 			return err
 		}
 		if err := x.Id.VDLWrite(enc); err != nil {
@@ -126,16 +133,16 @@
 		}
 	}
 	if x.RootDir != "" {
-		if err := enc.NextFieldValueString("RootDir", vdl.StringType, x.RootDir); err != nil {
+		if err := enc.NextFieldValueString(1, vdl.StringType, x.RootDir); err != nil {
 			return err
 		}
 	}
 	if x.Engine != "" {
-		if err := enc.NextFieldValueString("Engine", vdl.StringType, x.Engine); err != nil {
+		if err := enc.NextFieldValueString(2, vdl.StringType, x.Engine); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -146,36 +153,43 @@
 	if err := dec.StartValue(__VDLType_struct_3); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Id":
+		}
+		if decType != __VDLType_struct_3 {
+			index = __VDLType_struct_3.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			if err := x.Id.VDLRead(dec); err != nil {
 				return err
 			}
-		case "RootDir":
+		case 1:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.RootDir = value
 			}
-		case "Engine":
+		case 2:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.Engine = value
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -215,7 +229,7 @@
 		return err
 	}
 	if x.Id != (syncbase.Id{}) {
-		if err := enc.NextField("Id"); err != nil {
+		if err := enc.NextField(0); err != nil {
 			return err
 		}
 		if err := x.Id.VDLWrite(enc); err != nil {
@@ -223,12 +237,12 @@
 		}
 	}
 	if x.Version != 0 {
-		if err := enc.NextFieldValueUint("Version", vdl.Uint64Type, x.Version); err != nil {
+		if err := enc.NextFieldValueUint(1, vdl.Uint64Type, x.Version); err != nil {
 			return err
 		}
 	}
 	if len(x.Perms) != 0 {
-		if err := enc.NextField("Perms"); err != nil {
+		if err := enc.NextField(2); err != nil {
 			return err
 		}
 		if err := x.Perms.VDLWrite(enc); err != nil {
@@ -236,7 +250,7 @@
 		}
 	}
 	if x.SchemaMetadata != nil {
-		if err := enc.NextField("SchemaMetadata"); err != nil {
+		if err := enc.NextField(3); err != nil {
 			return err
 		}
 		enc.SetNextStartValueIsOptional()
@@ -244,7 +258,7 @@
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -255,30 +269,41 @@
 	if err := dec.StartValue(__VDLType_struct_5); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Id":
+		}
+		if decType != __VDLType_struct_5 {
+			index = __VDLType_struct_5.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			if err := x.Id.VDLRead(dec); err != nil {
 				return err
 			}
-		case "Version":
+		case 1:
 			switch value, err := dec.ReadValueUint(64); {
 			case err != nil:
 				return err
 			default:
 				x.Version = value
 			}
-		case "Perms":
+		case 2:
 			if err := x.Perms.VDLRead(dec); err != nil {
 				return err
 			}
-		case "SchemaMetadata":
+		case 3:
 			if err := dec.StartValue(__VDLType_optional_6); err != nil {
 				return err
 			}
@@ -294,10 +319,6 @@
 					return err
 				}
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
diff --git a/services/syncbase/signing/signing.vdl.go b/services/syncbase/signing/signing.vdl.go
index f8a1f94..8b61634 100644
--- a/services/syncbase/signing/signing.vdl.go
+++ b/services/syncbase/signing/signing.vdl.go
@@ -81,10 +81,10 @@
 	if err := enc.StartValue(__VDLType_union_2); err != nil {
 		return err
 	}
-	if err := enc.NextFieldValueBytes("Data", __VDLType_list_1, x.Value); err != nil {
+	if err := enc.NextFieldValueBytes(0, __VDLType_list_1, x.Value); err != nil {
 		return err
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -94,10 +94,10 @@
 	if err := enc.StartValue(__VDLType_union_2); err != nil {
 		return err
 	}
-	if err := enc.NextFieldValueBytes("Hash", __VDLType_list_1, x.Value); err != nil {
+	if err := enc.NextFieldValueBytes(1, __VDLType_list_1, x.Value); err != nil {
 		return err
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -107,33 +107,40 @@
 	if err := dec.StartValue(__VDLType_union_2); err != nil {
 		return err
 	}
-	f, err := dec.NextField()
-	if err != nil {
+	decType := dec.Type()
+	index, err := dec.NextField()
+	switch {
+	case err != nil:
 		return err
+	case index == -1:
+		return fmt.Errorf("missing field in union %T, from %v", x, decType)
 	}
-	switch f {
-	case "Data":
+	if decType != __VDLType_union_2 {
+		name := decType.Field(index).Name
+		index = __VDLType_union_2.FieldIndexByName(name)
+		if index == -1 {
+			return fmt.Errorf("field %q not in union %T, from %v", name, x, decType)
+		}
+	}
+	switch index {
+	case 0:
 		var field ItemData
 		if err := dec.ReadValueBytes(-1, &field.Value); err != nil {
 			return err
 		}
 		*x = field
-	case "Hash":
+	case 1:
 		var field ItemHash
 		if err := dec.ReadValueBytes(-1, &field.Value); err != nil {
 			return err
 		}
 		*x = field
-	case "":
-		return fmt.Errorf("missing field in union %T, from %v", x, dec.Type())
-	default:
-		return fmt.Errorf("field %q not in union %T, from %v", f, x, dec.Type())
 	}
-	switch f, err := dec.NextField(); {
+	switch index, err := dec.NextField(); {
 	case err != nil:
 		return err
-	case f != "":
-		return fmt.Errorf("extra field %q in union %T, from %v", f, x, dec.Type())
+	case index != -1:
+		return fmt.Errorf("extra field %d in union %T, from %v", index, x, dec.Type())
 	}
 	return dec.FinishValue()
 }
@@ -210,7 +217,7 @@
 		return err
 	}
 	if len(x.Data) != 0 {
-		if err := enc.NextField("Data"); err != nil {
+		if err := enc.NextField(0); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_list_1(enc, x.Data); err != nil {
@@ -218,12 +225,12 @@
 		}
 	}
 	if len(x.BlessingsHash) != 0 {
-		if err := enc.NextFieldValueBytes("BlessingsHash", __VDLType_list_1, x.BlessingsHash); err != nil {
+		if err := enc.NextFieldValueBytes(1, __VDLType_list_1, x.BlessingsHash); err != nil {
 			return err
 		}
 	}
 	if !x.AuthorSigned.VDLIsZero() {
-		if err := enc.NextField("AuthorSigned"); err != nil {
+		if err := enc.NextField(2); err != nil {
 			return err
 		}
 		if err := x.AuthorSigned.VDLWrite(enc); err != nil {
@@ -231,24 +238,24 @@
 		}
 	}
 	if x.IsValidated {
-		if err := enc.NextFieldValueBool("IsValidated", vdl.BoolType, x.IsValidated); err != nil {
+		if err := enc.NextFieldValueBool(3, vdl.BoolType, x.IsValidated); err != nil {
 			return err
 		}
 	}
 	if len(x.ValidatorDataHash) != 0 {
-		if err := enc.NextFieldValueBytes("ValidatorDataHash", __VDLType_list_1, x.ValidatorDataHash); err != nil {
+		if err := enc.NextFieldValueBytes(4, __VDLType_list_1, x.ValidatorDataHash); err != nil {
 			return err
 		}
 	}
 	if !x.ValidatorSigned.VDLIsZero() {
-		if err := enc.NextField("ValidatorSigned"); err != nil {
+		if err := enc.NextField(5); err != nil {
 			return err
 		}
 		if err := x.ValidatorSigned.VDLWrite(enc); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -288,45 +295,52 @@
 	if err := dec.StartValue(__VDLType_struct_3); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Data":
+		}
+		if decType != __VDLType_struct_3 {
+			index = __VDLType_struct_3.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			if err := __VDLReadAnon_list_1(dec, &x.Data); err != nil {
 				return err
 			}
-		case "BlessingsHash":
+		case 1:
 			if err := dec.ReadValueBytes(-1, &x.BlessingsHash); err != nil {
 				return err
 			}
-		case "AuthorSigned":
+		case 2:
 			if err := x.AuthorSigned.VDLRead(dec); err != nil {
 				return err
 			}
-		case "IsValidated":
+		case 3:
 			switch value, err := dec.ReadValueBool(); {
 			case err != nil:
 				return err
 			default:
 				x.IsValidated = value
 			}
-		case "ValidatorDataHash":
+		case 4:
 			if err := dec.ReadValueBytes(-1, &x.ValidatorDataHash); err != nil {
 				return err
 			}
-		case "ValidatorSigned":
+		case 5:
 			if err := x.ValidatorSigned.VDLRead(dec); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -383,7 +397,7 @@
 		return err
 	}
 	if len(x.Names) != 0 {
-		if err := enc.NextField("Names"); err != nil {
+		if err := enc.NextField(0); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_list_2(enc, x.Names); err != nil {
@@ -391,11 +405,11 @@
 		}
 	}
 	if len(x.MarshalledPublicKey) != 0 {
-		if err := enc.NextFieldValueBytes("MarshalledPublicKey", __VDLType_list_1, x.MarshalledPublicKey); err != nil {
+		if err := enc.NextFieldValueBytes(1, __VDLType_list_1, x.MarshalledPublicKey); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -424,26 +438,33 @@
 	if err := dec.StartValue(__VDLType_struct_6); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Names":
+		}
+		if decType != __VDLType_struct_6 {
+			index = __VDLType_struct_6.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			if err := __VDLReadAnon_list_2(dec, &x.Names); err != nil {
 				return err
 			}
-		case "MarshalledPublicKey":
+		case 1:
 			if err := dec.ReadValueBytes(-1, &x.MarshalledPublicKey); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
diff --git a/services/syncbase/store/watchable/watchable.vdl.go b/services/syncbase/store/watchable/watchable.vdl.go
index a2b7b2a..2c1b6e6 100644
--- a/services/syncbase/store/watchable/watchable.vdl.go
+++ b/services/syncbase/store/watchable/watchable.vdl.go
@@ -39,11 +39,11 @@
 		return err
 	}
 	if len(x.Key) != 0 {
-		if err := enc.NextFieldValueBytes("Key", __VDLType_list_2, x.Key); err != nil {
+		if err := enc.NextFieldValueBytes(0, __VDLType_list_2, x.Key); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -54,20 +54,27 @@
 	if err := dec.StartValue(__VDLType_struct_1); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Key":
-			if err := dec.ReadValueBytes(-1, &x.Key); err != nil {
-				return err
+		}
+		if decType != __VDLType_struct_1 {
+			index = __VDLType_struct_1.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
+		}
+		switch index {
+		case 0:
+			if err := dec.ReadValueBytes(-1, &x.Key); err != nil {
 				return err
 			}
 		}
@@ -100,16 +107,16 @@
 		return err
 	}
 	if len(x.Start) != 0 {
-		if err := enc.NextFieldValueBytes("Start", __VDLType_list_2, x.Start); err != nil {
+		if err := enc.NextFieldValueBytes(0, __VDLType_list_2, x.Start); err != nil {
 			return err
 		}
 	}
 	if len(x.Limit) != 0 {
-		if err := enc.NextFieldValueBytes("Limit", __VDLType_list_2, x.Limit); err != nil {
+		if err := enc.NextFieldValueBytes(1, __VDLType_list_2, x.Limit); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -120,26 +127,33 @@
 	if err := dec.StartValue(__VDLType_struct_3); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Start":
+		}
+		if decType != __VDLType_struct_3 {
+			index = __VDLType_struct_3.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			if err := dec.ReadValueBytes(-1, &x.Start); err != nil {
 				return err
 			}
-		case "Limit":
+		case 1:
 			if err := dec.ReadValueBytes(-1, &x.Limit); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -172,16 +186,16 @@
 		return err
 	}
 	if len(x.Key) != 0 {
-		if err := enc.NextFieldValueBytes("Key", __VDLType_list_2, x.Key); err != nil {
+		if err := enc.NextFieldValueBytes(0, __VDLType_list_2, x.Key); err != nil {
 			return err
 		}
 	}
 	if len(x.Version) != 0 {
-		if err := enc.NextFieldValueBytes("Version", __VDLType_list_2, x.Version); err != nil {
+		if err := enc.NextFieldValueBytes(1, __VDLType_list_2, x.Version); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -192,26 +206,33 @@
 	if err := dec.StartValue(__VDLType_struct_4); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Key":
+		}
+		if decType != __VDLType_struct_4 {
+			index = __VDLType_struct_4.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			if err := dec.ReadValueBytes(-1, &x.Key); err != nil {
 				return err
 			}
-		case "Version":
+		case 1:
 			if err := dec.ReadValueBytes(-1, &x.Version); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -238,11 +259,11 @@
 		return err
 	}
 	if len(x.Key) != 0 {
-		if err := enc.NextFieldValueBytes("Key", __VDLType_list_2, x.Key); err != nil {
+		if err := enc.NextFieldValueBytes(0, __VDLType_list_2, x.Key); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -253,20 +274,27 @@
 	if err := dec.StartValue(__VDLType_struct_5); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Key":
-			if err := dec.ReadValueBytes(-1, &x.Key); err != nil {
-				return err
+		}
+		if decType != __VDLType_struct_5 {
+			index = __VDLType_struct_5.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
+		}
+		switch index {
+		case 0:
+			if err := dec.ReadValueBytes(-1, &x.Key); err != nil {
 				return err
 			}
 		}
@@ -318,7 +346,7 @@
 		return err
 	}
 	if x.Op != nil && !x.Op.VDLIsZero() {
-		if err := enc.NextField("Op"); err != nil {
+		if err := enc.NextField(0); err != nil {
 			return err
 		}
 		if err := x.Op.VDLWrite(enc); err != nil {
@@ -326,21 +354,21 @@
 		}
 	}
 	if x.CommitTimestamp != 0 {
-		if err := enc.NextFieldValueInt("CommitTimestamp", vdl.Int64Type, x.CommitTimestamp); err != nil {
+		if err := enc.NextFieldValueInt(1, vdl.Int64Type, x.CommitTimestamp); err != nil {
 			return err
 		}
 	}
 	if x.FromSync {
-		if err := enc.NextFieldValueBool("FromSync", vdl.BoolType, x.FromSync); err != nil {
+		if err := enc.NextFieldValueBool(2, vdl.BoolType, x.FromSync); err != nil {
 			return err
 		}
 	}
 	if x.Continued {
-		if err := enc.NextFieldValueBool("Continued", vdl.BoolType, x.Continued); err != nil {
+		if err := enc.NextFieldValueBool(3, vdl.BoolType, x.Continued); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -353,44 +381,51 @@
 	if err := dec.StartValue(__VDLType_struct_6); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Op":
+		}
+		if decType != __VDLType_struct_6 {
+			index = __VDLType_struct_6.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			x.Op = new(vom.RawBytes)
 			if err := x.Op.VDLRead(dec); err != nil {
 				return err
 			}
-		case "CommitTimestamp":
+		case 1:
 			switch value, err := dec.ReadValueInt(64); {
 			case err != nil:
 				return err
 			default:
 				x.CommitTimestamp = value
 			}
-		case "FromSync":
+		case 2:
 			switch value, err := dec.ReadValueBool(); {
 			case err != nil:
 				return err
 			default:
 				x.FromSync = value
 			}
-		case "Continued":
+		case 3:
 			switch value, err := dec.ReadValueBool(); {
 			case err != nil:
 				return err
 			default:
 				x.Continued = value
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
diff --git a/services/syncbase/vclock/vclock.vdl.go b/services/syncbase/vclock/vclock.vdl.go
index c0d7430..dc8fc08 100644
--- a/services/syncbase/vclock/vclock.vdl.go
+++ b/services/syncbase/vclock/vclock.vdl.go
@@ -71,7 +71,7 @@
 		return err
 	}
 	if !x.SystemTimeAtBoot.IsZero() {
-		if err := enc.NextField("SystemTimeAtBoot"); err != nil {
+		if err := enc.NextField(0); err != nil {
 			return err
 		}
 		var wire vdltime.Time
@@ -83,7 +83,7 @@
 		}
 	}
 	if x.Skew != 0 {
-		if err := enc.NextField("Skew"); err != nil {
+		if err := enc.NextField(1); err != nil {
 			return err
 		}
 		var wire vdltime.Duration
@@ -95,7 +95,7 @@
 		}
 	}
 	if x.ElapsedTimeSinceBoot != 0 {
-		if err := enc.NextField("ElapsedTimeSinceBoot"); err != nil {
+		if err := enc.NextField(2); err != nil {
 			return err
 		}
 		var wire vdltime.Duration
@@ -107,7 +107,7 @@
 		}
 	}
 	if !x.LastNtpTs.IsZero() {
-		if err := enc.NextField("LastNtpTs"); err != nil {
+		if err := enc.NextField(3); err != nil {
 			return err
 		}
 		var wire vdltime.Time
@@ -119,16 +119,16 @@
 		}
 	}
 	if x.NumReboots != 0 {
-		if err := enc.NextFieldValueUint("NumReboots", vdl.Uint16Type, uint64(x.NumReboots)); err != nil {
+		if err := enc.NextFieldValueUint(4, vdl.Uint16Type, uint64(x.NumReboots)); err != nil {
 			return err
 		}
 	}
 	if x.NumHops != 0 {
-		if err := enc.NextFieldValueUint("NumHops", vdl.Uint16Type, uint64(x.NumHops)); err != nil {
+		if err := enc.NextFieldValueUint(5, vdl.Uint16Type, uint64(x.NumHops)); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -139,15 +139,26 @@
 	if err := dec.StartValue(__VDLType_struct_1); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "SystemTimeAtBoot":
+		}
+		if decType != __VDLType_struct_1 {
+			index = __VDLType_struct_1.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			var wire vdltime.Time
 			if err := wire.VDLRead(dec); err != nil {
 				return err
@@ -155,7 +166,7 @@
 			if err := vdltime.TimeToNative(wire, &x.SystemTimeAtBoot); err != nil {
 				return err
 			}
-		case "Skew":
+		case 1:
 			var wire vdltime.Duration
 			if err := wire.VDLRead(dec); err != nil {
 				return err
@@ -163,7 +174,7 @@
 			if err := vdltime.DurationToNative(wire, &x.Skew); err != nil {
 				return err
 			}
-		case "ElapsedTimeSinceBoot":
+		case 2:
 			var wire vdltime.Duration
 			if err := wire.VDLRead(dec); err != nil {
 				return err
@@ -171,7 +182,7 @@
 			if err := vdltime.DurationToNative(wire, &x.ElapsedTimeSinceBoot); err != nil {
 				return err
 			}
-		case "LastNtpTs":
+		case 3:
 			var wire vdltime.Time
 			if err := wire.VDLRead(dec); err != nil {
 				return err
@@ -179,24 +190,20 @@
 			if err := vdltime.TimeToNative(wire, &x.LastNtpTs); err != nil {
 				return err
 			}
-		case "NumReboots":
+		case 4:
 			switch value, err := dec.ReadValueUint(16); {
 			case err != nil:
 				return err
 			default:
 				x.NumReboots = uint16(value)
 			}
-		case "NumHops":
+		case 5:
 			switch value, err := dec.ReadValueUint(16); {
 			case err != nil:
 				return err
 			default:
 				x.NumHops = uint16(value)
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
diff --git a/services/syncbase/vsync/testdata/blobtestsvdl.vdl.go b/services/syncbase/vsync/testdata/blobtestsvdl.vdl.go
index cf407e1..7ea0fbc 100644
--- a/services/syncbase/vsync/testdata/blobtestsvdl.vdl.go
+++ b/services/syncbase/vsync/testdata/blobtestsvdl.vdl.go
@@ -38,16 +38,16 @@
 		return err
 	}
 	if x.Info != "" {
-		if err := enc.NextFieldValueString("Info", vdl.StringType, x.Info); err != nil {
+		if err := enc.NextFieldValueString(0, vdl.StringType, x.Info); err != nil {
 			return err
 		}
 	}
 	if x.Br != "" {
-		if err := enc.NextFieldValueString("Br", __VDLType_string_2, string(x.Br)); err != nil {
+		if err := enc.NextFieldValueString(1, __VDLType_string_2, string(x.Br)); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -58,32 +58,39 @@
 	if err := dec.StartValue(__VDLType_struct_1); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Info":
+		}
+		if decType != __VDLType_struct_1 {
+			index = __VDLType_struct_1.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.Info = value
 			}
-		case "Br":
+		case 1:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.Br = syncbase.BlobRef(value)
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -139,10 +146,10 @@
 	if err := enc.StartValue(__VDLType_union_3); err != nil {
 		return err
 	}
-	if err := enc.NextFieldValueInt("Num", vdl.Int32Type, int64(x.Value)); err != nil {
+	if err := enc.NextFieldValueInt(0, vdl.Int32Type, int64(x.Value)); err != nil {
 		return err
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -152,13 +159,13 @@
 	if err := enc.StartValue(__VDLType_union_3); err != nil {
 		return err
 	}
-	if err := enc.NextField("Bi"); err != nil {
+	if err := enc.NextField(1); err != nil {
 		return err
 	}
 	if err := x.Value.VDLWrite(enc); err != nil {
 		return err
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -168,12 +175,23 @@
 	if err := dec.StartValue(__VDLType_union_3); err != nil {
 		return err
 	}
-	f, err := dec.NextField()
-	if err != nil {
+	decType := dec.Type()
+	index, err := dec.NextField()
+	switch {
+	case err != nil:
 		return err
+	case index == -1:
+		return fmt.Errorf("missing field in union %T, from %v", x, decType)
 	}
-	switch f {
-	case "Num":
+	if decType != __VDLType_union_3 {
+		name := decType.Field(index).Name
+		index = __VDLType_union_3.FieldIndexByName(name)
+		if index == -1 {
+			return fmt.Errorf("field %q not in union %T, from %v", name, x, decType)
+		}
+	}
+	switch index {
+	case 0:
 		var field BlobUnionNum
 		switch value, err := dec.ReadValueInt(32); {
 		case err != nil:
@@ -182,22 +200,18 @@
 			field.Value = int32(value)
 		}
 		*x = field
-	case "Bi":
+	case 1:
 		var field BlobUnionBi
 		if err := field.Value.VDLRead(dec); err != nil {
 			return err
 		}
 		*x = field
-	case "":
-		return fmt.Errorf("missing field in union %T, from %v", x, dec.Type())
-	default:
-		return fmt.Errorf("field %q not in union %T, from %v", f, x, dec.Type())
 	}
-	switch f, err := dec.NextField(); {
+	switch index, err := dec.NextField(); {
 	case err != nil:
 		return err
-	case f != "":
-		return fmt.Errorf("extra field %q in union %T, from %v", f, x, dec.Type())
+	case index != -1:
+		return fmt.Errorf("extra field %d in union %T, from %v", index, x, dec.Type())
 	}
 	return dec.FinishValue()
 }
@@ -227,19 +241,19 @@
 		return err
 	}
 	if x.Info != "" {
-		if err := enc.NextFieldValueString("Info", vdl.StringType, x.Info); err != nil {
+		if err := enc.NextFieldValueString(0, vdl.StringType, x.Info); err != nil {
 			return err
 		}
 	}
 	if len(x.Bs) != 0 {
-		if err := enc.NextField("Bs"); err != nil {
+		if err := enc.NextField(1); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_set_1(enc, x.Bs); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -268,29 +282,36 @@
 	if err := dec.StartValue(__VDLType_struct_4); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Info":
+		}
+		if decType != __VDLType_struct_4 {
+			index = __VDLType_struct_4.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.Info = value
 			}
-		case "Bs":
+		case 1:
 			if err := __VDLReadAnon_set_1(dec, &x.Bs); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -344,19 +365,19 @@
 		return err
 	}
 	if x.Info != "" {
-		if err := enc.NextFieldValueString("Info", vdl.StringType, x.Info); err != nil {
+		if err := enc.NextFieldValueString(0, vdl.StringType, x.Info); err != nil {
 			return err
 		}
 	}
 	if len(x.Baa) != 0 {
-		if err := enc.NextField("Baa"); err != nil {
+		if err := enc.NextField(1); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_list_2(enc, x.Baa); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -394,29 +415,36 @@
 	if err := dec.StartValue(__VDLType_struct_6); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Info":
+		}
+		if decType != __VDLType_struct_6 {
+			index = __VDLType_struct_6.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.Info = value
 			}
-		case "Baa":
+		case 1:
 			if err := __VDLReadAnon_list_2(dec, &x.Baa); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -472,19 +500,19 @@
 		return err
 	}
 	if x.Info != "" {
-		if err := enc.NextFieldValueString("Info", vdl.StringType, x.Info); err != nil {
+		if err := enc.NextFieldValueString(0, vdl.StringType, x.Info); err != nil {
 			return err
 		}
 	}
 	if len(x.S) != 0 {
-		if err := enc.NextField("S"); err != nil {
+		if err := enc.NextField(1); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_set_3(enc, x.S); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -513,29 +541,36 @@
 	if err := dec.StartValue(__VDLType_struct_8); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Info":
+		}
+		if decType != __VDLType_struct_8 {
+			index = __VDLType_struct_8.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.Info = value
 			}
-		case "S":
+		case 1:
 			if err := __VDLReadAnon_set_3(dec, &x.S); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -583,12 +618,12 @@
 		return err
 	}
 	if x.Info != "" {
-		if err := enc.NextFieldValueString("Info", vdl.StringType, x.Info); err != nil {
+		if err := enc.NextFieldValueString(0, vdl.StringType, x.Info); err != nil {
 			return err
 		}
 	}
 	if x.Bo != nil {
-		if err := enc.NextField("Bo"); err != nil {
+		if err := enc.NextField(1); err != nil {
 			return err
 		}
 		enc.SetNextStartValueIsOptional()
@@ -596,7 +631,7 @@
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -607,22 +642,33 @@
 	if err := dec.StartValue(__VDLType_struct_10); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Info":
+		}
+		if decType != __VDLType_struct_10 {
+			index = __VDLType_struct_10.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.Info = value
 			}
-		case "Bo":
+		case 1:
 			if err := dec.StartValue(__VDLType_optional_11); err != nil {
 				return err
 			}
@@ -638,10 +684,6 @@
 					return err
 				}
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
diff --git a/services/syncbase/vsync/vsync.vdl.go b/services/syncbase/vsync/vsync.vdl.go
index f66c573..d71c1ea 100644
--- a/services/syncbase/vsync/vsync.vdl.go
+++ b/services/syncbase/vsync/vsync.vdl.go
@@ -36,11 +36,11 @@
 		return err
 	}
 	if x.Id != 0 {
-		if err := enc.NextFieldValueUint("Id", vdl.Uint64Type, x.Id); err != nil {
+		if err := enc.NextFieldValueUint(0, vdl.Uint64Type, x.Id); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -51,25 +51,32 @@
 	if err := dec.StartValue(__VDLType_struct_1); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Id":
+		}
+		if decType != __VDLType_struct_1 {
+			index = __VDLType_struct_1.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueUint(64); {
 			case err != nil:
 				return err
 			default:
 				x.Id = value
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -104,7 +111,7 @@
 		return err
 	}
 	if len(x.GenVecs) != 0 {
-		if err := enc.NextField("GenVecs"); err != nil {
+		if err := enc.NextField(0); err != nil {
 			return err
 		}
 		if err := x.GenVecs.VDLWrite(enc); err != nil {
@@ -112,7 +119,7 @@
 		}
 	}
 	if len(x.SgGenVecs) != 0 {
-		if err := enc.NextField("SgGenVecs"); err != nil {
+		if err := enc.NextField(1); err != nil {
 			return err
 		}
 		if err := x.SgGenVecs.VDLWrite(enc); err != nil {
@@ -120,11 +127,11 @@
 		}
 	}
 	if x.IsPaused {
-		if err := enc.NextFieldValueBool("IsPaused", vdl.BoolType, x.IsPaused); err != nil {
+		if err := enc.NextFieldValueBool(2, vdl.BoolType, x.IsPaused); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -135,33 +142,40 @@
 	if err := dec.StartValue(__VDLType_struct_2); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "GenVecs":
+		}
+		if decType != __VDLType_struct_2 {
+			index = __VDLType_struct_2.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			if err := x.GenVecs.VDLRead(dec); err != nil {
 				return err
 			}
-		case "SgGenVecs":
+		case 1:
 			if err := x.SgGenVecs.VDLRead(dec); err != nil {
 				return err
 			}
-		case "IsPaused":
+		case 2:
 			switch value, err := dec.ReadValueBool(); {
 			case err != nil:
 				return err
 			default:
 				x.IsPaused = value
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -193,7 +207,7 @@
 		return err
 	}
 	if !x.Metadata.VDLIsZero() {
-		if err := enc.NextField("Metadata"); err != nil {
+		if err := enc.NextField(0); err != nil {
 			return err
 		}
 		if err := x.Metadata.VDLWrite(enc); err != nil {
@@ -201,11 +215,11 @@
 		}
 	}
 	if x.Pos != 0 {
-		if err := enc.NextFieldValueUint("Pos", vdl.Uint64Type, x.Pos); err != nil {
+		if err := enc.NextFieldValueUint(1, vdl.Uint64Type, x.Pos); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -216,29 +230,36 @@
 	if err := dec.StartValue(__VDLType_struct_4); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Metadata":
+		}
+		if decType != __VDLType_struct_4 {
+			index = __VDLType_struct_4.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			if err := x.Metadata.VDLRead(dec); err != nil {
 				return err
 			}
-		case "Pos":
+		case 1:
 			switch value, err := dec.ReadValueUint(64); {
 			case err != nil:
 				return err
 			default:
 				x.Pos = value
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -310,34 +331,34 @@
 		return err
 	}
 	if x.NumLocalJoiners != 0 {
-		if err := enc.NextFieldValueUint("NumLocalJoiners", vdl.Uint32Type, uint64(x.NumLocalJoiners)); err != nil {
+		if err := enc.NextFieldValueUint(0, vdl.Uint32Type, uint64(x.NumLocalJoiners)); err != nil {
 			return err
 		}
 	}
 	if x.Watched {
-		if err := enc.NextFieldValueBool("Watched", vdl.BoolType, x.Watched); err != nil {
+		if err := enc.NextFieldValueBool(1, vdl.BoolType, x.Watched); err != nil {
 			return err
 		}
 	}
 	if x.RemotePublisher != "" {
-		if err := enc.NextFieldValueString("RemotePublisher", vdl.StringType, x.RemotePublisher); err != nil {
+		if err := enc.NextFieldValueString(2, vdl.StringType, x.RemotePublisher); err != nil {
 			return err
 		}
 	}
 	if x.SyncPending {
-		if err := enc.NextFieldValueBool("SyncPending", vdl.BoolType, x.SyncPending); err != nil {
+		if err := enc.NextFieldValueBool(3, vdl.BoolType, x.SyncPending); err != nil {
 			return err
 		}
 	}
 	if len(x.PendingGenVec) != 0 {
-		if err := enc.NextField("PendingGenVec"); err != nil {
+		if err := enc.NextField(4); err != nil {
 			return err
 		}
 		if err := x.PendingGenVec.VDLWrite(enc); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -348,50 +369,57 @@
 	if err := dec.StartValue(__VDLType_struct_6); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "NumLocalJoiners":
+		}
+		if decType != __VDLType_struct_6 {
+			index = __VDLType_struct_6.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueUint(32); {
 			case err != nil:
 				return err
 			default:
 				x.NumLocalJoiners = uint32(value)
 			}
-		case "Watched":
+		case 1:
 			switch value, err := dec.ReadValueBool(); {
 			case err != nil:
 				return err
 			default:
 				x.Watched = value
 			}
-		case "RemotePublisher":
+		case 2:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.RemotePublisher = value
 			}
-		case "SyncPending":
+		case 3:
 			switch value, err := dec.ReadValueBool(); {
 			case err != nil:
 				return err
 			default:
 				x.SyncPending = value
 			}
-		case "PendingGenVec":
+		case 4:
 			if err := x.PendingGenVec.VDLRead(dec); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -445,12 +473,12 @@
 		return err
 	}
 	if x.Level != 0 {
-		if err := enc.NextFieldValueUint("Level", vdl.Uint64Type, x.Level); err != nil {
+		if err := enc.NextFieldValueUint(0, vdl.Uint64Type, x.Level); err != nil {
 			return err
 		}
 	}
 	if len(x.Parents) != 0 {
-		if err := enc.NextField("Parents"); err != nil {
+		if err := enc.NextField(1); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_list_1(enc, x.Parents); err != nil {
@@ -458,31 +486,31 @@
 		}
 	}
 	if x.Logrec != "" {
-		if err := enc.NextFieldValueString("Logrec", vdl.StringType, x.Logrec); err != nil {
+		if err := enc.NextFieldValueString(2, vdl.StringType, x.Logrec); err != nil {
 			return err
 		}
 	}
 	if x.BatchId != 0 {
-		if err := enc.NextFieldValueUint("BatchId", vdl.Uint64Type, x.BatchId); err != nil {
+		if err := enc.NextFieldValueUint(3, vdl.Uint64Type, x.BatchId); err != nil {
 			return err
 		}
 	}
 	if x.Deleted {
-		if err := enc.NextFieldValueBool("Deleted", vdl.BoolType, x.Deleted); err != nil {
+		if err := enc.NextFieldValueBool(4, vdl.BoolType, x.Deleted); err != nil {
 			return err
 		}
 	}
 	if x.PermId != "" {
-		if err := enc.NextFieldValueString("PermId", vdl.StringType, x.PermId); err != nil {
+		if err := enc.NextFieldValueString(5, vdl.StringType, x.PermId); err != nil {
 			return err
 		}
 	}
 	if x.PermVers != "" {
-		if err := enc.NextFieldValueString("PermVers", vdl.StringType, x.PermVers); err != nil {
+		if err := enc.NextFieldValueString(6, vdl.StringType, x.PermVers); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -511,64 +539,71 @@
 	if err := dec.StartValue(__VDLType_struct_8); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Level":
+		}
+		if decType != __VDLType_struct_8 {
+			index = __VDLType_struct_8.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueUint(64); {
 			case err != nil:
 				return err
 			default:
 				x.Level = value
 			}
-		case "Parents":
+		case 1:
 			if err := __VDLReadAnon_list_1(dec, &x.Parents); err != nil {
 				return err
 			}
-		case "Logrec":
+		case 2:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.Logrec = value
 			}
-		case "BatchId":
+		case 3:
 			switch value, err := dec.ReadValueUint(64); {
 			case err != nil:
 				return err
 			default:
 				x.BatchId = value
 			}
-		case "Deleted":
+		case 4:
 			switch value, err := dec.ReadValueBool(); {
 			case err != nil:
 				return err
 			default:
 				x.Deleted = value
 			}
-		case "PermId":
+		case 5:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.PermId = value
 			}
-		case "PermVers":
+		case 6:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.PermVers = value
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -634,7 +669,7 @@
 		return err
 	}
 	if len(x.Objects) != 0 {
-		if err := enc.NextField("Objects"); err != nil {
+		if err := enc.NextField(0); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_map_2(enc, x.Objects); err != nil {
@@ -642,7 +677,7 @@
 		}
 	}
 	if len(x.LinkedObjects) != 0 {
-		if err := enc.NextField("LinkedObjects"); err != nil {
+		if err := enc.NextField(1); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_map_2(enc, x.LinkedObjects); err != nil {
@@ -650,11 +685,11 @@
 		}
 	}
 	if x.Count != 0 {
-		if err := enc.NextFieldValueUint("Count", vdl.Uint64Type, x.Count); err != nil {
+		if err := enc.NextFieldValueUint(2, vdl.Uint64Type, x.Count); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -686,33 +721,40 @@
 	if err := dec.StartValue(__VDLType_struct_10); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Objects":
+		}
+		if decType != __VDLType_struct_10 {
+			index = __VDLType_struct_10.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			if err := __VDLReadAnon_map_2(dec, &x.Objects); err != nil {
 				return err
 			}
-		case "LinkedObjects":
+		case 1:
 			if err := __VDLReadAnon_map_2(dec, &x.LinkedObjects); err != nil {
 				return err
 			}
-		case "Count":
+		case 2:
 			switch value, err := dec.ReadValueUint(64); {
 			case err != nil:
 				return err
 			default:
 				x.Count = value
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
diff --git a/services/syncbase/watchable/watchable.vdl.go b/services/syncbase/watchable/watchable.vdl.go
index 03b49b7..549883a 100644
--- a/services/syncbase/watchable/watchable.vdl.go
+++ b/services/syncbase/watchable/watchable.vdl.go
@@ -51,12 +51,12 @@
 		return err
 	}
 	if x.SgId != "" {
-		if err := enc.NextFieldValueString("SgId", __VDLType_string_2, string(x.SgId)); err != nil {
+		if err := enc.NextFieldValueString(0, __VDLType_string_2, string(x.SgId)); err != nil {
 			return err
 		}
 	}
 	if len(x.Prefixes) != 0 {
-		if err := enc.NextField("Prefixes"); err != nil {
+		if err := enc.NextField(1); err != nil {
 			return err
 		}
 		if err := __VDLWriteAnon_list_1(enc, x.Prefixes); err != nil {
@@ -64,11 +64,11 @@
 		}
 	}
 	if x.Remove {
-		if err := enc.NextFieldValueBool("Remove", vdl.BoolType, x.Remove); err != nil {
+		if err := enc.NextFieldValueBool(2, vdl.BoolType, x.Remove); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -97,36 +97,43 @@
 	if err := dec.StartValue(__VDLType_struct_1); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "SgId":
+		}
+		if decType != __VDLType_struct_1 {
+			index = __VDLType_struct_1.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
 			default:
 				x.SgId = interfaces.GroupId(value)
 			}
-		case "Prefixes":
+		case 1:
 			if err := __VDLReadAnon_list_1(dec, &x.Prefixes); err != nil {
 				return err
 			}
-		case "Remove":
+		case 2:
 			switch value, err := dec.ReadValueBool(); {
 			case err != nil:
 				return err
 			default:
 				x.Remove = value
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -184,16 +191,16 @@
 		return err
 	}
 	if len(x.Key) != 0 {
-		if err := enc.NextFieldValueBytes("Key", __VDLType_list_5, x.Key); err != nil {
+		if err := enc.NextFieldValueBytes(0, __VDLType_list_5, x.Key); err != nil {
 			return err
 		}
 	}
 	if len(x.Version) != 0 {
-		if err := enc.NextFieldValueBytes("Version", __VDLType_list_5, x.Version); err != nil {
+		if err := enc.NextFieldValueBytes(1, __VDLType_list_5, x.Version); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -204,26 +211,33 @@
 	if err := dec.StartValue(__VDLType_struct_4); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "Key":
+		}
+		if decType != __VDLType_struct_4 {
+			index = __VDLType_struct_4.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			if err := dec.ReadValueBytes(-1, &x.Key); err != nil {
 				return err
 			}
-		case "Version":
+		case 1:
 			if err := dec.ReadValueBytes(-1, &x.Version); err != nil {
 				return err
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }
@@ -322,11 +336,11 @@
 		return err
 	}
 	if x.RequestType != StateChangePauseSync {
-		if err := enc.NextFieldValueString("RequestType", __VDLType_enum_6, x.RequestType.String()); err != nil {
+		if err := enc.NextFieldValueString(0, __VDLType_enum_6, x.RequestType.String()); err != nil {
 			return err
 		}
 	}
-	if err := enc.NextField(""); err != nil {
+	if err := enc.NextField(-1); err != nil {
 		return err
 	}
 	return enc.FinishValue()
@@ -337,15 +351,26 @@
 	if err := dec.StartValue(__VDLType_struct_7); err != nil {
 		return err
 	}
+	decType := dec.Type()
 	for {
-		f, err := dec.NextField()
-		if err != nil {
+		index, err := dec.NextField()
+		switch {
+		case err != nil:
 			return err
-		}
-		switch f {
-		case "":
+		case index == -1:
 			return dec.FinishValue()
-		case "RequestType":
+		}
+		if decType != __VDLType_struct_7 {
+			index = __VDLType_struct_7.FieldIndexByName(decType.Field(index).Name)
+			if index == -1 {
+				if err := dec.SkipValue(); err != nil {
+					return err
+				}
+				continue
+			}
+		}
+		switch index {
+		case 0:
 			switch value, err := dec.ReadValueString(); {
 			case err != nil:
 				return err
@@ -354,10 +379,6 @@
 					return err
 				}
 			}
-		default:
-			if err := dec.SkipValue(); err != nil {
-				return err
-			}
 		}
 	}
 }