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
-			}
 		}
 	}
 }
