v23proxy: update transcoder for simplified zero

MultiPart: 6/7
Change-Id: Id382bec66e9aad351214fa241d30088f84411076
diff --git a/go/src/v.io/x/mojo/transcoder/from_mojom.go b/go/src/v.io/x/mojo/transcoder/from_mojom.go
index 7ee6faf..1e8ec0b 100644
--- a/go/src/v.io/x/mojo/transcoder/from_mojom.go
+++ b/go/src/v.io/x/mojo/transcoder/from_mojom.go
@@ -134,7 +134,7 @@
 		case err != nil:
 			return err
 		case ptr == 0 && isNullable:
-			return target.FromZero(vdl.OptionalType(vt))
+			return target.FromNil(vdl.OptionalType(vt))
 		case ptr == 0 && !isNullable:
 			return fmt.Errorf("invalid null struct pointer")
 		}
@@ -212,7 +212,7 @@
 		case err != nil:
 			return err
 		case ptr == 0 && isNullable:
-			return target.FromZero(vdl.OptionalType(vt))
+			return target.FromNil(vdl.OptionalType(vt))
 		case ptr == 0 && !isNullable:
 			return fmt.Errorf("invalid null struct pointer")
 		}
@@ -278,7 +278,7 @@
 			case err != nil:
 				return err
 			case ptr == 0 && isNullable:
-				return target.FromZero(vdl.OptionalType(vt))
+				return target.FromNil(vdl.OptionalType(vt))
 			case ptr == 0 && !isNullable:
 				return fmt.Errorf("invalid null struct pointer")
 			}
@@ -318,7 +318,7 @@
 		}
 		if size == 0 {
 			mtv.modec.SkipUnionValue()
-			return target.FromZero(vdl.OptionalType(vt))
+			return target.FromNil(vdl.OptionalType(vt))
 		}
 		if int(tag) >= vt.NumField() {
 			return fmt.Errorf("union tag out of bounds")
@@ -337,7 +337,7 @@
 			case err != nil:
 				return err
 			case ptr == 0 && isNullable:
-				return target.FromZero(vdl.OptionalType(fld.Type))
+				return target.FromNil(vdl.OptionalType(fld.Type))
 			case ptr == 0 && !isNullable:
 				return fmt.Errorf("invalid null union pointer")
 			}
diff --git a/go/src/v.io/x/mojo/transcoder/internal/internal.vdl.go b/go/src/v.io/x/mojo/transcoder/internal/internal.vdl.go
index 77225a3..83fb2a3 100644
--- a/go/src/v.io/x/mojo/transcoder/internal/internal.vdl.go
+++ b/go/src/v.io/x/mojo/transcoder/internal/internal.vdl.go
@@ -34,84 +34,80 @@
 	if err != nil {
 		return err
 	}
-	keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("Street")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
-	}
-	if err != vdl.ErrFieldNoExist {
-
-		var4 := (m.Street == "")
-		if var4 {
-			if err := fieldTarget3.FromZero(tt.NonOptional().Field(0).Type); err != nil {
+	var4 := (m.Street == "")
+	if var4 {
+		if err := fieldsTarget1.ZeroField("Street"); err != nil && err != vdl.ErrFieldNoExist {
+			return err
+		}
+	} else {
+		keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("Street")
+		if err != vdl.ErrFieldNoExist {
+			if err != nil {
 				return err
 			}
-		} else {
 			if err := fieldTarget3.FromString(string(m.Street), tt.NonOptional().Field(0).Type); err != nil {
 				return err
 			}
-		}
-		if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
-			return err
-		}
-	}
-	keyTarget5, fieldTarget6, err := fieldsTarget1.StartField("City")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
-	}
-	if err != vdl.ErrFieldNoExist {
-
-		var7 := (m.City == "")
-		if var7 {
-			if err := fieldTarget6.FromZero(tt.NonOptional().Field(1).Type); err != nil {
+			if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
 				return err
 			}
-		} else {
+		}
+	}
+	var7 := (m.City == "")
+	if var7 {
+		if err := fieldsTarget1.ZeroField("City"); err != nil && err != vdl.ErrFieldNoExist {
+			return err
+		}
+	} else {
+		keyTarget5, fieldTarget6, err := fieldsTarget1.StartField("City")
+		if err != vdl.ErrFieldNoExist {
+			if err != nil {
+				return err
+			}
 			if err := fieldTarget6.FromString(string(m.City), tt.NonOptional().Field(1).Type); err != nil {
 				return err
 			}
-		}
-		if err := fieldsTarget1.FinishField(keyTarget5, fieldTarget6); err != nil {
-			return err
-		}
-	}
-	keyTarget8, fieldTarget9, err := fieldsTarget1.StartField("State")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
-	}
-	if err != vdl.ErrFieldNoExist {
-
-		var10 := (m.State == "")
-		if var10 {
-			if err := fieldTarget9.FromZero(tt.NonOptional().Field(2).Type); err != nil {
+			if err := fieldsTarget1.FinishField(keyTarget5, fieldTarget6); err != nil {
 				return err
 			}
-		} else {
+		}
+	}
+	var10 := (m.State == "")
+	if var10 {
+		if err := fieldsTarget1.ZeroField("State"); err != nil && err != vdl.ErrFieldNoExist {
+			return err
+		}
+	} else {
+		keyTarget8, fieldTarget9, err := fieldsTarget1.StartField("State")
+		if err != vdl.ErrFieldNoExist {
+			if err != nil {
+				return err
+			}
 			if err := fieldTarget9.FromString(string(m.State), tt.NonOptional().Field(2).Type); err != nil {
 				return err
 			}
-		}
-		if err := fieldsTarget1.FinishField(keyTarget8, fieldTarget9); err != nil {
-			return err
-		}
-	}
-	keyTarget11, fieldTarget12, err := fieldsTarget1.StartField("Zip")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
-	}
-	if err != vdl.ErrFieldNoExist {
-
-		var13 := (m.Zip == "")
-		if var13 {
-			if err := fieldTarget12.FromZero(tt.NonOptional().Field(3).Type); err != nil {
+			if err := fieldsTarget1.FinishField(keyTarget8, fieldTarget9); err != nil {
 				return err
 			}
-		} else {
+		}
+	}
+	var13 := (m.Zip == "")
+	if var13 {
+		if err := fieldsTarget1.ZeroField("Zip"); err != nil && err != vdl.ErrFieldNoExist {
+			return err
+		}
+	} else {
+		keyTarget11, fieldTarget12, err := fieldsTarget1.StartField("Zip")
+		if err != vdl.ErrFieldNoExist {
+			if err != nil {
+				return err
+			}
 			if err := fieldTarget12.FromString(string(m.Zip), tt.NonOptional().Field(3).Type); err != nil {
 				return err
 			}
-		}
-		if err := fieldsTarget1.FinishField(keyTarget11, fieldTarget12); err != nil {
-			return err
+			if err := fieldsTarget1.FinishField(keyTarget11, fieldTarget12); err != nil {
+				return err
+			}
 		}
 	}
 	if err := t.FinishFields(fieldsTarget1); err != nil {
@@ -166,14 +162,28 @@
 func (t *AddressInfoTarget) FinishField(_, _ vdl.Target) error {
 	return nil
 }
+func (t *AddressInfoTarget) ZeroField(name string) error {
+	switch name {
+	case "Street":
+		t.Value.Street = ""
+		return nil
+	case "City":
+		t.Value.City = ""
+		return nil
+	case "State":
+		t.Value.State = ""
+		return nil
+	case "Zip":
+		t.Value.Zip = ""
+		return nil
+	default:
+		return fmt.Errorf("field %s not in struct src/v.io/x/mojo/transcoder/internal.AddressInfo", name)
+	}
+}
 func (t *AddressInfoTarget) FinishFields(_ vdl.FieldsTarget) error {
 
 	return nil
 }
-func (t *AddressInfoTarget) FromZero(tt *vdl.Type) error {
-	*t.Value = AddressInfo{}
-	return nil
-}
 
 type CreditAgency int
 
@@ -262,10 +272,6 @@
 
 	return nil
 }
-func (t *CreditAgencyTarget) FromZero(tt *vdl.Type) error {
-	*t.Value = CreditAgencyEquifax
-	return nil
-}
 
 type ExperianRating int
 
@@ -346,10 +352,6 @@
 
 	return nil
 }
-func (t *ExperianRatingTarget) FromZero(tt *vdl.Type) error {
-	*t.Value = ExperianRatingGood
-	return nil
-}
 
 type EquifaxCreditReport struct {
 	Rating byte
@@ -365,24 +367,23 @@
 	if err != nil {
 		return err
 	}
-	keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("Rating")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
-	}
-	if err != vdl.ErrFieldNoExist {
-
-		var4 := (m.Rating == byte(0))
-		if var4 {
-			if err := fieldTarget3.FromZero(tt.NonOptional().Field(0).Type); err != nil {
+	var4 := (m.Rating == byte(0))
+	if var4 {
+		if err := fieldsTarget1.ZeroField("Rating"); err != nil && err != vdl.ErrFieldNoExist {
+			return err
+		}
+	} else {
+		keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("Rating")
+		if err != vdl.ErrFieldNoExist {
+			if err != nil {
 				return err
 			}
-		} else {
 			if err := fieldTarget3.FromUint(uint64(m.Rating), tt.NonOptional().Field(0).Type); err != nil {
 				return err
 			}
-		}
-		if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
-			return err
+			if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
+				return err
+			}
 		}
 	}
 	if err := t.FinishFields(fieldsTarget1); err != nil {
@@ -422,14 +423,19 @@
 func (t *EquifaxCreditReportTarget) FinishField(_, _ vdl.Target) error {
 	return nil
 }
+func (t *EquifaxCreditReportTarget) ZeroField(name string) error {
+	switch name {
+	case "Rating":
+		t.Value.Rating = byte(0)
+		return nil
+	default:
+		return fmt.Errorf("field %s not in struct src/v.io/x/mojo/transcoder/internal.EquifaxCreditReport", name)
+	}
+}
 func (t *EquifaxCreditReportTarget) FinishFields(_ vdl.FieldsTarget) error {
 
 	return nil
 }
-func (t *EquifaxCreditReportTarget) FromZero(tt *vdl.Type) error {
-	*t.Value = EquifaxCreditReport{}
-	return nil
-}
 
 type ExperianCreditReport struct {
 	Rating ExperianRating
@@ -445,25 +451,24 @@
 	if err != nil {
 		return err
 	}
-	keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("Rating")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
-	}
-	if err != vdl.ErrFieldNoExist {
-
-		var4 := (m.Rating == ExperianRatingGood)
-		if var4 {
-			if err := fieldTarget3.FromZero(tt.NonOptional().Field(0).Type); err != nil {
+	var4 := (m.Rating == ExperianRatingGood)
+	if var4 {
+		if err := fieldsTarget1.ZeroField("Rating"); err != nil && err != vdl.ErrFieldNoExist {
+			return err
+		}
+	} else {
+		keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("Rating")
+		if err != vdl.ErrFieldNoExist {
+			if err != nil {
 				return err
 			}
-		} else {
 
 			if err := m.Rating.FillVDLTarget(fieldTarget3, tt.NonOptional().Field(0).Type); err != nil {
 				return err
 			}
-		}
-		if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
-			return err
+			if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
+				return err
+			}
 		}
 	}
 	if err := t.FinishFields(fieldsTarget1); err != nil {
@@ -503,14 +508,19 @@
 func (t *ExperianCreditReportTarget) FinishField(_, _ vdl.Target) error {
 	return nil
 }
+func (t *ExperianCreditReportTarget) ZeroField(name string) error {
+	switch name {
+	case "Rating":
+		t.Value.Rating = ExperianRatingGood
+		return nil
+	default:
+		return fmt.Errorf("field %s not in struct src/v.io/x/mojo/transcoder/internal.ExperianCreditReport", name)
+	}
+}
 func (t *ExperianCreditReportTarget) FinishFields(_ vdl.FieldsTarget) error {
 
 	return nil
 }
-func (t *ExperianCreditReportTarget) FromZero(tt *vdl.Type) error {
-	*t.Value = ExperianCreditReport{}
-	return nil
-}
 
 type TransUnionCreditReport struct {
 	Rating int16
@@ -526,24 +536,23 @@
 	if err != nil {
 		return err
 	}
-	keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("Rating")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
-	}
-	if err != vdl.ErrFieldNoExist {
-
-		var4 := (m.Rating == int16(0))
-		if var4 {
-			if err := fieldTarget3.FromZero(tt.NonOptional().Field(0).Type); err != nil {
+	var4 := (m.Rating == int16(0))
+	if var4 {
+		if err := fieldsTarget1.ZeroField("Rating"); err != nil && err != vdl.ErrFieldNoExist {
+			return err
+		}
+	} else {
+		keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("Rating")
+		if err != vdl.ErrFieldNoExist {
+			if err != nil {
 				return err
 			}
-		} else {
 			if err := fieldTarget3.FromInt(int64(m.Rating), tt.NonOptional().Field(0).Type); err != nil {
 				return err
 			}
-		}
-		if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
-			return err
+			if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
+				return err
+			}
 		}
 	}
 	if err := t.FinishFields(fieldsTarget1); err != nil {
@@ -583,14 +592,19 @@
 func (t *TransUnionCreditReportTarget) FinishField(_, _ vdl.Target) error {
 	return nil
 }
+func (t *TransUnionCreditReportTarget) ZeroField(name string) error {
+	switch name {
+	case "Rating":
+		t.Value.Rating = int16(0)
+		return nil
+	default:
+		return fmt.Errorf("field %s not in struct src/v.io/x/mojo/transcoder/internal.TransUnionCreditReport", name)
+	}
+}
 func (t *TransUnionCreditReportTarget) FinishFields(_ vdl.FieldsTarget) error {
 
 	return nil
 }
-func (t *TransUnionCreditReportTarget) FromZero(tt *vdl.Type) error {
-	*t.Value = TransUnionCreditReport{}
-	return nil
-}
 
 type (
 	// AgencyReport represents any single field of the AgencyReport union type.
@@ -766,10 +780,6 @@
 
 	return nil
 }
-func (t *AgencyReportTarget) FromZero(tt *vdl.Type) error {
-	*t.Value = AgencyReport(AgencyReportEquifaxReport{})
-	return nil
-}
 
 type agencyReportTargetFactory struct{}
 
@@ -795,44 +805,42 @@
 	if err != nil {
 		return err
 	}
-	keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("Agency")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
-	}
-	if err != vdl.ErrFieldNoExist {
-
-		var4 := (m.Agency == CreditAgencyEquifax)
-		if var4 {
-			if err := fieldTarget3.FromZero(tt.NonOptional().Field(0).Type); err != nil {
+	var4 := (m.Agency == CreditAgencyEquifax)
+	if var4 {
+		if err := fieldsTarget1.ZeroField("Agency"); err != nil && err != vdl.ErrFieldNoExist {
+			return err
+		}
+	} else {
+		keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("Agency")
+		if err != vdl.ErrFieldNoExist {
+			if err != nil {
 				return err
 			}
-		} else {
 
 			if err := m.Agency.FillVDLTarget(fieldTarget3, tt.NonOptional().Field(0).Type); err != nil {
 				return err
 			}
-		}
-		if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
-			return err
-		}
-	}
-	keyTarget5, fieldTarget6, err := fieldsTarget1.StartField("Report")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
-	}
-	if err != vdl.ErrFieldNoExist {
-
-		var var7 bool
-		if field, ok := m.Report.(AgencyReportEquifaxReport); ok {
-
-			var8 := (field.Value == EquifaxCreditReport{})
-			var7 = var8
-		}
-		if var7 {
-			if err := fieldTarget6.FromZero(tt.NonOptional().Field(1).Type); err != nil {
+			if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
 				return err
 			}
-		} else {
+		}
+	}
+	var var7 bool
+	if field, ok := m.Report.(AgencyReportEquifaxReport); ok {
+
+		var8 := (field.Value == EquifaxCreditReport{})
+		var7 = var8
+	}
+	if var7 {
+		if err := fieldsTarget1.ZeroField("Report"); err != nil && err != vdl.ErrFieldNoExist {
+			return err
+		}
+	} else {
+		keyTarget5, fieldTarget6, err := fieldsTarget1.StartField("Report")
+		if err != vdl.ErrFieldNoExist {
+			if err != nil {
+				return err
+			}
 
 			unionValue9 := m.Report
 			if unionValue9 == nil {
@@ -841,9 +849,9 @@
 			if err := unionValue9.FillVDLTarget(fieldTarget6, tt.NonOptional().Field(1).Type); err != nil {
 				return err
 			}
-		}
-		if err := fieldsTarget1.FinishField(keyTarget5, fieldTarget6); err != nil {
-			return err
+			if err := fieldsTarget1.FinishField(keyTarget5, fieldTarget6); err != nil {
+				return err
+			}
 		}
 	}
 	if err := t.FinishFields(fieldsTarget1); err != nil {
@@ -888,16 +896,22 @@
 func (t *CreditReportTarget) FinishField(_, _ vdl.Target) error {
 	return nil
 }
+func (t *CreditReportTarget) ZeroField(name string) error {
+	switch name {
+	case "Agency":
+		t.Value.Agency = CreditAgencyEquifax
+		return nil
+	case "Report":
+		t.Value.Report = AgencyReport(AgencyReportEquifaxReport{})
+		return nil
+	default:
+		return fmt.Errorf("field %s not in struct src/v.io/x/mojo/transcoder/internal.CreditReport", name)
+	}
+}
 func (t *CreditReportTarget) FinishFields(_ vdl.FieldsTarget) error {
 
 	return nil
 }
-func (t *CreditReportTarget) FromZero(tt *vdl.Type) error {
-	*t.Value = CreditReport{
-		Report: AgencyReportEquifaxReport{},
-	}
-	return nil
-}
 
 type Customer struct {
 	Name    string
@@ -917,108 +931,103 @@
 	if err != nil {
 		return err
 	}
-	keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("Name")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
-	}
-	if err != vdl.ErrFieldNoExist {
-
-		var4 := (m.Name == "")
-		if var4 {
-			if err := fieldTarget3.FromZero(tt.NonOptional().Field(0).Type); err != nil {
+	var4 := (m.Name == "")
+	if var4 {
+		if err := fieldsTarget1.ZeroField("Name"); err != nil && err != vdl.ErrFieldNoExist {
+			return err
+		}
+	} else {
+		keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("Name")
+		if err != vdl.ErrFieldNoExist {
+			if err != nil {
 				return err
 			}
-		} else {
 			if err := fieldTarget3.FromString(string(m.Name), tt.NonOptional().Field(0).Type); err != nil {
 				return err
 			}
-		}
-		if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
-			return err
-		}
-	}
-	keyTarget5, fieldTarget6, err := fieldsTarget1.StartField("Id")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
-	}
-	if err != vdl.ErrFieldNoExist {
-
-		var7 := (m.Id == int64(0))
-		if var7 {
-			if err := fieldTarget6.FromZero(tt.NonOptional().Field(1).Type); err != nil {
+			if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
 				return err
 			}
-		} else {
+		}
+	}
+	var7 := (m.Id == int64(0))
+	if var7 {
+		if err := fieldsTarget1.ZeroField("Id"); err != nil && err != vdl.ErrFieldNoExist {
+			return err
+		}
+	} else {
+		keyTarget5, fieldTarget6, err := fieldsTarget1.StartField("Id")
+		if err != vdl.ErrFieldNoExist {
+			if err != nil {
+				return err
+			}
 			if err := fieldTarget6.FromInt(int64(m.Id), tt.NonOptional().Field(1).Type); err != nil {
 				return err
 			}
-		}
-		if err := fieldsTarget1.FinishField(keyTarget5, fieldTarget6); err != nil {
-			return err
-		}
-	}
-	keyTarget8, fieldTarget9, err := fieldsTarget1.StartField("Active")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
-	}
-	if err != vdl.ErrFieldNoExist {
-
-		var10 := (m.Active == false)
-		if var10 {
-			if err := fieldTarget9.FromZero(tt.NonOptional().Field(2).Type); err != nil {
+			if err := fieldsTarget1.FinishField(keyTarget5, fieldTarget6); err != nil {
 				return err
 			}
-		} else {
+		}
+	}
+	var10 := (m.Active == false)
+	if var10 {
+		if err := fieldsTarget1.ZeroField("Active"); err != nil && err != vdl.ErrFieldNoExist {
+			return err
+		}
+	} else {
+		keyTarget8, fieldTarget9, err := fieldsTarget1.StartField("Active")
+		if err != vdl.ErrFieldNoExist {
+			if err != nil {
+				return err
+			}
 			if err := fieldTarget9.FromBool(bool(m.Active), tt.NonOptional().Field(2).Type); err != nil {
 				return err
 			}
-		}
-		if err := fieldsTarget1.FinishField(keyTarget8, fieldTarget9); err != nil {
-			return err
-		}
-	}
-	keyTarget11, fieldTarget12, err := fieldsTarget1.StartField("Address")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
-	}
-	if err != vdl.ErrFieldNoExist {
-
-		var13 := (m.Address == AddressInfo{})
-		if var13 {
-			if err := fieldTarget12.FromZero(tt.NonOptional().Field(3).Type); err != nil {
+			if err := fieldsTarget1.FinishField(keyTarget8, fieldTarget9); err != nil {
 				return err
 			}
-		} else {
+		}
+	}
+	var13 := (m.Address == AddressInfo{})
+	if var13 {
+		if err := fieldsTarget1.ZeroField("Address"); err != nil && err != vdl.ErrFieldNoExist {
+			return err
+		}
+	} else {
+		keyTarget11, fieldTarget12, err := fieldsTarget1.StartField("Address")
+		if err != vdl.ErrFieldNoExist {
+			if err != nil {
+				return err
+			}
 
 			if err := m.Address.FillVDLTarget(fieldTarget12, tt.NonOptional().Field(3).Type); err != nil {
 				return err
 			}
-		}
-		if err := fieldsTarget1.FinishField(keyTarget11, fieldTarget12); err != nil {
-			return err
-		}
-	}
-	keyTarget14, fieldTarget15, err := fieldsTarget1.StartField("Credit")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
-	}
-	if err != vdl.ErrFieldNoExist {
-
-		var16 := (m.Credit == CreditReport{
-			Report: AgencyReportEquifaxReport{},
-		})
-		if var16 {
-			if err := fieldTarget15.FromZero(tt.NonOptional().Field(4).Type); err != nil {
+			if err := fieldsTarget1.FinishField(keyTarget11, fieldTarget12); err != nil {
 				return err
 			}
-		} else {
+		}
+	}
+	var16 := (m.Credit == CreditReport{
+		Report: AgencyReportEquifaxReport{},
+	})
+	if var16 {
+		if err := fieldsTarget1.ZeroField("Credit"); err != nil && err != vdl.ErrFieldNoExist {
+			return err
+		}
+	} else {
+		keyTarget14, fieldTarget15, err := fieldsTarget1.StartField("Credit")
+		if err != vdl.ErrFieldNoExist {
+			if err != nil {
+				return err
+			}
 
 			if err := m.Credit.FillVDLTarget(fieldTarget15, tt.NonOptional().Field(4).Type); err != nil {
 				return err
 			}
-		}
-		if err := fieldsTarget1.FinishField(keyTarget14, fieldTarget15); err != nil {
-			return err
+			if err := fieldsTarget1.FinishField(keyTarget14, fieldTarget15); err != nil {
+				return err
+			}
 		}
 	}
 	if err := t.FinishFields(fieldsTarget1); err != nil {
@@ -1078,18 +1087,33 @@
 func (t *CustomerTarget) FinishField(_, _ vdl.Target) error {
 	return nil
 }
+func (t *CustomerTarget) ZeroField(name string) error {
+	switch name {
+	case "Name":
+		t.Value.Name = ""
+		return nil
+	case "Id":
+		t.Value.Id = int64(0)
+		return nil
+	case "Active":
+		t.Value.Active = false
+		return nil
+	case "Address":
+		t.Value.Address = AddressInfo{}
+		return nil
+	case "Credit":
+		t.Value.Credit = CreditReport{
+			Report: AgencyReportEquifaxReport{},
+		}
+		return nil
+	default:
+		return fmt.Errorf("field %s not in struct src/v.io/x/mojo/transcoder/internal.Customer", name)
+	}
+}
 func (t *CustomerTarget) FinishFields(_ vdl.FieldsTarget) error {
 
 	return nil
 }
-func (t *CustomerTarget) FromZero(tt *vdl.Type) error {
-	*t.Value = Customer{
-		Credit: CreditReport{
-			Report: AgencyReportEquifaxReport{},
-		},
-	}
-	return nil
-}
 
 var __VDLInitCalled bool
 
diff --git a/go/src/v.io/x/mojo/transcoder/target.go b/go/src/v.io/x/mojo/transcoder/target.go
index 1d45b19..23b4066 100644
--- a/go/src/v.io/x/mojo/transcoder/target.go
+++ b/go/src/v.io/x/mojo/transcoder/target.go
@@ -93,7 +93,13 @@
 	panic("UNIMPLEMENTED")
 
 }
-func (t target) FromZero(tt *vdl.Type) error {
+func (t target) FromNil(tt *vdl.Type) error {
+	if tt.Kind() == vdl.Optional || tt.Kind() == vdl.Any {
+		return t.fromZero(tt)
+	}
+	return fmt.Errorf("FromNil called on non-nillable type")
+}
+func (t target) fromZero(tt *vdl.Type) error {
 	if tt.IsBytes() {
 		return t.FromBytes(nil, tt)
 	}
@@ -139,7 +145,7 @@
 			if err != nil {
 				return err
 			}
-			if err := targ.FromZero(tt.Elem()); err != nil {
+			if err := targ.(target).fromZero(tt.Elem()); err != nil {
 				return err
 			}
 			if err := lt.FinishElem(targ); err != nil {
@@ -170,7 +176,7 @@
 			if err != nil {
 				return err
 			}
-			if err := ft.FromZero(fld.Type); err != nil {
+			if err := ft.(target).fromZero(fld.Type); err != nil {
 				return err
 			}
 			if err := st.FinishField(kt, ft); err != nil {
@@ -188,7 +194,7 @@
 		if err != nil {
 			return err
 		}
-		if err := ft.FromZero(fld.Type); err != nil {
+		if err := ft.(target).fromZero(fld.Type); err != nil {
 			return err
 		}
 		if err := st.FinishField(kt, ft); err != nil {
diff --git a/go/src/v.io/x/mojo/transcoder/testtypes/testtypes.vdl.go b/go/src/v.io/x/mojo/transcoder/testtypes/testtypes.vdl.go
index 3836112..fae9534 100644
--- a/go/src/v.io/x/mojo/transcoder/testtypes/testtypes.vdl.go
+++ b/go/src/v.io/x/mojo/transcoder/testtypes/testtypes.vdl.go
@@ -96,10 +96,6 @@
 
 	return nil
 }
-func (t *AnEnumTarget) FromZero(tt *vdl.Type) error {
-	*t.Value = AnEnumFirst
-	return nil
-}
 
 type (
 	// PodUnion represents any single field of the PodUnion union type.
@@ -663,10 +659,6 @@
 
 	return nil
 }
-func (t *PodUnionTarget) FromZero(tt *vdl.Type) error {
-	*t.Value = PodUnion(PodUnionFInt8{})
-	return nil
-}
 
 type podUnionTargetFactory struct{}
 
@@ -691,23 +683,22 @@
 	if err != nil {
 		return err
 	}
-	keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("PodUnion")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
+	var var4 bool
+	if field, ok := m.PodUnion.(PodUnionFInt8); ok {
+
+		var5 := (field.Value == int8(0))
+		var4 = var5
 	}
-	if err != vdl.ErrFieldNoExist {
-
-		var var4 bool
-		if field, ok := m.PodUnion.(PodUnionFInt8); ok {
-
-			var5 := (field.Value == int8(0))
-			var4 = var5
+	if var4 {
+		if err := fieldsTarget1.ZeroField("PodUnion"); err != nil && err != vdl.ErrFieldNoExist {
+			return err
 		}
-		if var4 {
-			if err := fieldTarget3.FromZero(tt.NonOptional().Field(0).Type); err != nil {
+	} else {
+		keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("PodUnion")
+		if err != vdl.ErrFieldNoExist {
+			if err != nil {
 				return err
 			}
-		} else {
 
 			unionValue6 := m.PodUnion
 			if unionValue6 == nil {
@@ -716,9 +707,9 @@
 			if err := unionValue6.FillVDLTarget(fieldTarget3, tt.NonOptional().Field(0).Type); err != nil {
 				return err
 			}
-		}
-		if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
-			return err
+			if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
+				return err
+			}
 		}
 	}
 	if err := t.FinishFields(fieldsTarget1); err != nil {
@@ -758,16 +749,19 @@
 func (t *PodUnionWrapperTarget) FinishField(_, _ vdl.Target) error {
 	return nil
 }
+func (t *PodUnionWrapperTarget) ZeroField(name string) error {
+	switch name {
+	case "PodUnion":
+		t.Value.PodUnion = PodUnion(PodUnionFInt8{})
+		return nil
+	default:
+		return fmt.Errorf("field %s not in struct src/v.io/x/mojo/transcoder/testtypes.PodUnionWrapper", name)
+	}
+}
 func (t *PodUnionWrapperTarget) FinishFields(_ vdl.FieldsTarget) error {
 
 	return nil
 }
-func (t *PodUnionWrapperTarget) FromZero(tt *vdl.Type) error {
-	*t.Value = PodUnionWrapper{
-		PodUnion: PodUnionFInt8{},
-	}
-	return nil
-}
 
 type DummyStruct struct {
 	FInt8 int8
@@ -783,24 +777,23 @@
 	if err != nil {
 		return err
 	}
-	keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("FInt8")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
-	}
-	if err != vdl.ErrFieldNoExist {
-
-		var4 := (m.FInt8 == int8(0))
-		if var4 {
-			if err := fieldTarget3.FromZero(tt.NonOptional().Field(0).Type); err != nil {
+	var4 := (m.FInt8 == int8(0))
+	if var4 {
+		if err := fieldsTarget1.ZeroField("FInt8"); err != nil && err != vdl.ErrFieldNoExist {
+			return err
+		}
+	} else {
+		keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("FInt8")
+		if err != vdl.ErrFieldNoExist {
+			if err != nil {
 				return err
 			}
-		} else {
 			if err := fieldTarget3.FromInt(int64(m.FInt8), tt.NonOptional().Field(0).Type); err != nil {
 				return err
 			}
-		}
-		if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
-			return err
+			if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
+				return err
+			}
 		}
 	}
 	if err := t.FinishFields(fieldsTarget1); err != nil {
@@ -840,14 +833,19 @@
 func (t *DummyStructTarget) FinishField(_, _ vdl.Target) error {
 	return nil
 }
+func (t *DummyStructTarget) ZeroField(name string) error {
+	switch name {
+	case "FInt8":
+		t.Value.FInt8 = int8(0)
+		return nil
+	default:
+		return fmt.Errorf("field %s not in struct src/v.io/x/mojo/transcoder/testtypes.DummyStruct", name)
+	}
+}
 func (t *DummyStructTarget) FinishFields(_ vdl.FieldsTarget) error {
 
 	return nil
 }
-func (t *DummyStructTarget) FromZero(tt *vdl.Type) error {
-	*t.Value = DummyStruct{}
-	return nil
-}
 
 type (
 	// ObjectUnion represents any single field of the ObjectUnion union type.
@@ -1224,10 +1222,6 @@
 
 	return nil
 }
-func (t *ObjectUnionTarget) FromZero(tt *vdl.Type) error {
-	*t.Value = ObjectUnion(ObjectUnionFInt8{})
-	return nil
-}
 
 type objectUnionTargetFactory struct{}
 
@@ -1262,7 +1256,7 @@
 
 	return nil
 }
-func (t *__VDLTarget1_optional) FromZero(tt *vdl.Type) error {
+func (t *__VDLTarget1_optional) FromNil(tt *vdl.Type) error {
 	*t.Value = (*DummyStruct)(nil)
 	return nil
 }
@@ -1299,10 +1293,6 @@
 
 	return nil
 }
-func (t *__VDLTarget2_list) FromZero(tt *vdl.Type) error {
-	*t.Value = []int8(nil)
-	return nil
-}
 
 // map[string]int8
 type __VDLTarget3_map struct {
@@ -1346,10 +1336,6 @@
 
 	return nil
 }
-func (t *__VDLTarget3_map) FromZero(tt *vdl.Type) error {
-	*t.Value = map[string]int8(nil)
-	return nil
-}
 
 type ObjectUnionWrapper struct {
 	ObjectUnion ObjectUnion
@@ -1365,23 +1351,22 @@
 	if err != nil {
 		return err
 	}
-	keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("ObjectUnion")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
+	var var4 bool
+	if field, ok := m.ObjectUnion.(ObjectUnionFInt8); ok {
+
+		var5 := (field.Value == int8(0))
+		var4 = var5
 	}
-	if err != vdl.ErrFieldNoExist {
-
-		var var4 bool
-		if field, ok := m.ObjectUnion.(ObjectUnionFInt8); ok {
-
-			var5 := (field.Value == int8(0))
-			var4 = var5
+	if var4 {
+		if err := fieldsTarget1.ZeroField("ObjectUnion"); err != nil && err != vdl.ErrFieldNoExist {
+			return err
 		}
-		if var4 {
-			if err := fieldTarget3.FromZero(tt.NonOptional().Field(0).Type); err != nil {
+	} else {
+		keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("ObjectUnion")
+		if err != vdl.ErrFieldNoExist {
+			if err != nil {
 				return err
 			}
-		} else {
 
 			unionValue6 := m.ObjectUnion
 			if unionValue6 == nil {
@@ -1390,9 +1375,9 @@
 			if err := unionValue6.FillVDLTarget(fieldTarget3, tt.NonOptional().Field(0).Type); err != nil {
 				return err
 			}
-		}
-		if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
-			return err
+			if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
+				return err
+			}
 		}
 	}
 	if err := t.FinishFields(fieldsTarget1); err != nil {
@@ -1432,16 +1417,19 @@
 func (t *ObjectUnionWrapperTarget) FinishField(_, _ vdl.Target) error {
 	return nil
 }
+func (t *ObjectUnionWrapperTarget) ZeroField(name string) error {
+	switch name {
+	case "ObjectUnion":
+		t.Value.ObjectUnion = ObjectUnion(ObjectUnionFInt8{})
+		return nil
+	default:
+		return fmt.Errorf("field %s not in struct src/v.io/x/mojo/transcoder/testtypes.ObjectUnionWrapper", name)
+	}
+}
 func (t *ObjectUnionWrapperTarget) FinishFields(_ vdl.FieldsTarget) error {
 
 	return nil
 }
-func (t *ObjectUnionWrapperTarget) FromZero(tt *vdl.Type) error {
-	*t.Value = ObjectUnionWrapper{
-		ObjectUnion: ObjectUnionFInt8{},
-	}
-	return nil
-}
 
 type Rect struct {
 	X      int32
@@ -1460,84 +1448,80 @@
 	if err != nil {
 		return err
 	}
-	keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("X")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
-	}
-	if err != vdl.ErrFieldNoExist {
-
-		var4 := (m.X == int32(0))
-		if var4 {
-			if err := fieldTarget3.FromZero(tt.NonOptional().Field(0).Type); err != nil {
+	var4 := (m.X == int32(0))
+	if var4 {
+		if err := fieldsTarget1.ZeroField("X"); err != nil && err != vdl.ErrFieldNoExist {
+			return err
+		}
+	} else {
+		keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("X")
+		if err != vdl.ErrFieldNoExist {
+			if err != nil {
 				return err
 			}
-		} else {
 			if err := fieldTarget3.FromInt(int64(m.X), tt.NonOptional().Field(0).Type); err != nil {
 				return err
 			}
-		}
-		if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
-			return err
-		}
-	}
-	keyTarget5, fieldTarget6, err := fieldsTarget1.StartField("Y")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
-	}
-	if err != vdl.ErrFieldNoExist {
-
-		var7 := (m.Y == int32(0))
-		if var7 {
-			if err := fieldTarget6.FromZero(tt.NonOptional().Field(1).Type); err != nil {
+			if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
 				return err
 			}
-		} else {
+		}
+	}
+	var7 := (m.Y == int32(0))
+	if var7 {
+		if err := fieldsTarget1.ZeroField("Y"); err != nil && err != vdl.ErrFieldNoExist {
+			return err
+		}
+	} else {
+		keyTarget5, fieldTarget6, err := fieldsTarget1.StartField("Y")
+		if err != vdl.ErrFieldNoExist {
+			if err != nil {
+				return err
+			}
 			if err := fieldTarget6.FromInt(int64(m.Y), tt.NonOptional().Field(1).Type); err != nil {
 				return err
 			}
-		}
-		if err := fieldsTarget1.FinishField(keyTarget5, fieldTarget6); err != nil {
-			return err
-		}
-	}
-	keyTarget8, fieldTarget9, err := fieldsTarget1.StartField("Width")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
-	}
-	if err != vdl.ErrFieldNoExist {
-
-		var10 := (m.Width == int32(0))
-		if var10 {
-			if err := fieldTarget9.FromZero(tt.NonOptional().Field(2).Type); err != nil {
+			if err := fieldsTarget1.FinishField(keyTarget5, fieldTarget6); err != nil {
 				return err
 			}
-		} else {
+		}
+	}
+	var10 := (m.Width == int32(0))
+	if var10 {
+		if err := fieldsTarget1.ZeroField("Width"); err != nil && err != vdl.ErrFieldNoExist {
+			return err
+		}
+	} else {
+		keyTarget8, fieldTarget9, err := fieldsTarget1.StartField("Width")
+		if err != vdl.ErrFieldNoExist {
+			if err != nil {
+				return err
+			}
 			if err := fieldTarget9.FromInt(int64(m.Width), tt.NonOptional().Field(2).Type); err != nil {
 				return err
 			}
-		}
-		if err := fieldsTarget1.FinishField(keyTarget8, fieldTarget9); err != nil {
-			return err
-		}
-	}
-	keyTarget11, fieldTarget12, err := fieldsTarget1.StartField("Height")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
-	}
-	if err != vdl.ErrFieldNoExist {
-
-		var13 := (m.Height == int32(0))
-		if var13 {
-			if err := fieldTarget12.FromZero(tt.NonOptional().Field(3).Type); err != nil {
+			if err := fieldsTarget1.FinishField(keyTarget8, fieldTarget9); err != nil {
 				return err
 			}
-		} else {
+		}
+	}
+	var13 := (m.Height == int32(0))
+	if var13 {
+		if err := fieldsTarget1.ZeroField("Height"); err != nil && err != vdl.ErrFieldNoExist {
+			return err
+		}
+	} else {
+		keyTarget11, fieldTarget12, err := fieldsTarget1.StartField("Height")
+		if err != vdl.ErrFieldNoExist {
+			if err != nil {
+				return err
+			}
 			if err := fieldTarget12.FromInt(int64(m.Height), tt.NonOptional().Field(3).Type); err != nil {
 				return err
 			}
-		}
-		if err := fieldsTarget1.FinishField(keyTarget11, fieldTarget12); err != nil {
-			return err
+			if err := fieldsTarget1.FinishField(keyTarget11, fieldTarget12); err != nil {
+				return err
+			}
 		}
 	}
 	if err := t.FinishFields(fieldsTarget1); err != nil {
@@ -1592,14 +1576,28 @@
 func (t *RectTarget) FinishField(_, _ vdl.Target) error {
 	return nil
 }
+func (t *RectTarget) ZeroField(name string) error {
+	switch name {
+	case "X":
+		t.Value.X = int32(0)
+		return nil
+	case "Y":
+		t.Value.Y = int32(0)
+		return nil
+	case "Width":
+		t.Value.Width = int32(0)
+		return nil
+	case "Height":
+		t.Value.Height = int32(0)
+		return nil
+	default:
+		return fmt.Errorf("field %s not in struct src/v.io/x/mojo/transcoder/testtypes.Rect", name)
+	}
+}
 func (t *RectTarget) FinishFields(_ vdl.FieldsTarget) error {
 
 	return nil
 }
-func (t *RectTarget) FromZero(tt *vdl.Type) error {
-	*t.Value = Rect{}
-	return nil
-}
 
 type MultiVersionStruct struct {
 	FInt32  int32
@@ -1620,82 +1618,78 @@
 	if err != nil {
 		return err
 	}
-	keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("FInt32")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
-	}
-	if err != vdl.ErrFieldNoExist {
-
-		var4 := (m.FInt32 == int32(0))
-		if var4 {
-			if err := fieldTarget3.FromZero(tt.NonOptional().Field(0).Type); err != nil {
+	var4 := (m.FInt32 == int32(0))
+	if var4 {
+		if err := fieldsTarget1.ZeroField("FInt32"); err != nil && err != vdl.ErrFieldNoExist {
+			return err
+		}
+	} else {
+		keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("FInt32")
+		if err != vdl.ErrFieldNoExist {
+			if err != nil {
 				return err
 			}
-		} else {
 			if err := fieldTarget3.FromInt(int64(m.FInt32), tt.NonOptional().Field(0).Type); err != nil {
 				return err
 			}
-		}
-		if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
-			return err
-		}
-	}
-	keyTarget5, fieldTarget6, err := fieldsTarget1.StartField("FRect")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
-	}
-	if err != vdl.ErrFieldNoExist {
-
-		var7 := (m.FRect == Rect{})
-		if var7 {
-			if err := fieldTarget6.FromZero(tt.NonOptional().Field(1).Type); err != nil {
+			if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
 				return err
 			}
-		} else {
+		}
+	}
+	var7 := (m.FRect == Rect{})
+	if var7 {
+		if err := fieldsTarget1.ZeroField("FRect"); err != nil && err != vdl.ErrFieldNoExist {
+			return err
+		}
+	} else {
+		keyTarget5, fieldTarget6, err := fieldsTarget1.StartField("FRect")
+		if err != vdl.ErrFieldNoExist {
+			if err != nil {
+				return err
+			}
 
 			if err := m.FRect.FillVDLTarget(fieldTarget6, tt.NonOptional().Field(1).Type); err != nil {
 				return err
 			}
-		}
-		if err := fieldsTarget1.FinishField(keyTarget5, fieldTarget6); err != nil {
-			return err
-		}
-	}
-	keyTarget8, fieldTarget9, err := fieldsTarget1.StartField("FString")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
-	}
-	if err != vdl.ErrFieldNoExist {
-
-		var10 := (m.FString == "")
-		if var10 {
-			if err := fieldTarget9.FromZero(tt.NonOptional().Field(2).Type); err != nil {
+			if err := fieldsTarget1.FinishField(keyTarget5, fieldTarget6); err != nil {
 				return err
 			}
-		} else {
+		}
+	}
+	var10 := (m.FString == "")
+	if var10 {
+		if err := fieldsTarget1.ZeroField("FString"); err != nil && err != vdl.ErrFieldNoExist {
+			return err
+		}
+	} else {
+		keyTarget8, fieldTarget9, err := fieldsTarget1.StartField("FString")
+		if err != vdl.ErrFieldNoExist {
+			if err != nil {
+				return err
+			}
 			if err := fieldTarget9.FromString(string(m.FString), tt.NonOptional().Field(2).Type); err != nil {
 				return err
 			}
-		}
-		if err := fieldsTarget1.FinishField(keyTarget8, fieldTarget9); err != nil {
-			return err
-		}
-	}
-	keyTarget11, fieldTarget12, err := fieldsTarget1.StartField("FArray")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
-	}
-	if err != vdl.ErrFieldNoExist {
-
-		var var13 bool
-		if len(m.FArray) == 0 {
-			var13 = true
-		}
-		if var13 {
-			if err := fieldTarget12.FromZero(tt.NonOptional().Field(3).Type); err != nil {
+			if err := fieldsTarget1.FinishField(keyTarget8, fieldTarget9); err != nil {
 				return err
 			}
-		} else {
+		}
+	}
+	var var13 bool
+	if len(m.FArray) == 0 {
+		var13 = true
+	}
+	if var13 {
+		if err := fieldsTarget1.ZeroField("FArray"); err != nil && err != vdl.ErrFieldNoExist {
+			return err
+		}
+	} else {
+		keyTarget11, fieldTarget12, err := fieldsTarget1.StartField("FArray")
+		if err != vdl.ErrFieldNoExist {
+			if err != nil {
+				return err
+			}
 
 			listTarget14, err := fieldTarget12.StartList(tt.NonOptional().Field(3).Type, len(m.FArray))
 			if err != nil {
@@ -1716,49 +1710,47 @@
 			if err := fieldTarget12.FinishList(listTarget14); err != nil {
 				return err
 			}
-		}
-		if err := fieldsTarget1.FinishField(keyTarget11, fieldTarget12); err != nil {
-			return err
-		}
-	}
-	keyTarget17, fieldTarget18, err := fieldsTarget1.StartField("FBool")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
-	}
-	if err != vdl.ErrFieldNoExist {
-
-		var19 := (m.FBool == false)
-		if var19 {
-			if err := fieldTarget18.FromZero(tt.NonOptional().Field(4).Type); err != nil {
+			if err := fieldsTarget1.FinishField(keyTarget11, fieldTarget12); err != nil {
 				return err
 			}
-		} else {
+		}
+	}
+	var19 := (m.FBool == false)
+	if var19 {
+		if err := fieldsTarget1.ZeroField("FBool"); err != nil && err != vdl.ErrFieldNoExist {
+			return err
+		}
+	} else {
+		keyTarget17, fieldTarget18, err := fieldsTarget1.StartField("FBool")
+		if err != vdl.ErrFieldNoExist {
+			if err != nil {
+				return err
+			}
 			if err := fieldTarget18.FromBool(bool(m.FBool), tt.NonOptional().Field(4).Type); err != nil {
 				return err
 			}
-		}
-		if err := fieldsTarget1.FinishField(keyTarget17, fieldTarget18); err != nil {
-			return err
-		}
-	}
-	keyTarget20, fieldTarget21, err := fieldsTarget1.StartField("FInt16")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
-	}
-	if err != vdl.ErrFieldNoExist {
-
-		var22 := (m.FInt16 == int16(0))
-		if var22 {
-			if err := fieldTarget21.FromZero(tt.NonOptional().Field(5).Type); err != nil {
+			if err := fieldsTarget1.FinishField(keyTarget17, fieldTarget18); err != nil {
 				return err
 			}
-		} else {
+		}
+	}
+	var22 := (m.FInt16 == int16(0))
+	if var22 {
+		if err := fieldsTarget1.ZeroField("FInt16"); err != nil && err != vdl.ErrFieldNoExist {
+			return err
+		}
+	} else {
+		keyTarget20, fieldTarget21, err := fieldsTarget1.StartField("FInt16")
+		if err != vdl.ErrFieldNoExist {
+			if err != nil {
+				return err
+			}
 			if err := fieldTarget21.FromInt(int64(m.FInt16), tt.NonOptional().Field(5).Type); err != nil {
 				return err
 			}
-		}
-		if err := fieldsTarget1.FinishField(keyTarget20, fieldTarget21); err != nil {
-			return err
+			if err := fieldsTarget1.FinishField(keyTarget20, fieldTarget21); err != nil {
+				return err
+			}
 		}
 	}
 	if err := t.FinishFields(fieldsTarget1); err != nil {
@@ -1823,14 +1815,34 @@
 func (t *MultiVersionStructTarget) FinishField(_, _ vdl.Target) error {
 	return nil
 }
+func (t *MultiVersionStructTarget) ZeroField(name string) error {
+	switch name {
+	case "FInt32":
+		t.Value.FInt32 = int32(0)
+		return nil
+	case "FRect":
+		t.Value.FRect = Rect{}
+		return nil
+	case "FString":
+		t.Value.FString = ""
+		return nil
+	case "FArray":
+		t.Value.FArray = []int8(nil)
+		return nil
+	case "FBool":
+		t.Value.FBool = false
+		return nil
+	case "FInt16":
+		t.Value.FInt16 = int16(0)
+		return nil
+	default:
+		return fmt.Errorf("field %s not in struct src/v.io/x/mojo/transcoder/testtypes.MultiVersionStruct", name)
+	}
+}
 func (t *MultiVersionStructTarget) FinishFields(_ vdl.FieldsTarget) error {
 
 	return nil
 }
-func (t *MultiVersionStructTarget) FromZero(tt *vdl.Type) error {
-	*t.Value = MultiVersionStruct{}
-	return nil
-}
 
 type MultiVersionStructV3 struct {
 	FInt32  int32
@@ -1848,65 +1860,62 @@
 	if err != nil {
 		return err
 	}
-	keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("FInt32")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
-	}
-	if err != vdl.ErrFieldNoExist {
-
-		var4 := (m.FInt32 == int32(0))
-		if var4 {
-			if err := fieldTarget3.FromZero(tt.NonOptional().Field(0).Type); err != nil {
+	var4 := (m.FInt32 == int32(0))
+	if var4 {
+		if err := fieldsTarget1.ZeroField("FInt32"); err != nil && err != vdl.ErrFieldNoExist {
+			return err
+		}
+	} else {
+		keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("FInt32")
+		if err != vdl.ErrFieldNoExist {
+			if err != nil {
 				return err
 			}
-		} else {
 			if err := fieldTarget3.FromInt(int64(m.FInt32), tt.NonOptional().Field(0).Type); err != nil {
 				return err
 			}
-		}
-		if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
-			return err
-		}
-	}
-	keyTarget5, fieldTarget6, err := fieldsTarget1.StartField("FRect")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
-	}
-	if err != vdl.ErrFieldNoExist {
-
-		var7 := (m.FRect == Rect{})
-		if var7 {
-			if err := fieldTarget6.FromZero(tt.NonOptional().Field(1).Type); err != nil {
+			if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
 				return err
 			}
-		} else {
+		}
+	}
+	var7 := (m.FRect == Rect{})
+	if var7 {
+		if err := fieldsTarget1.ZeroField("FRect"); err != nil && err != vdl.ErrFieldNoExist {
+			return err
+		}
+	} else {
+		keyTarget5, fieldTarget6, err := fieldsTarget1.StartField("FRect")
+		if err != vdl.ErrFieldNoExist {
+			if err != nil {
+				return err
+			}
 
 			if err := m.FRect.FillVDLTarget(fieldTarget6, tt.NonOptional().Field(1).Type); err != nil {
 				return err
 			}
-		}
-		if err := fieldsTarget1.FinishField(keyTarget5, fieldTarget6); err != nil {
-			return err
-		}
-	}
-	keyTarget8, fieldTarget9, err := fieldsTarget1.StartField("FString")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
-	}
-	if err != vdl.ErrFieldNoExist {
-
-		var10 := (m.FString == "")
-		if var10 {
-			if err := fieldTarget9.FromZero(tt.NonOptional().Field(2).Type); err != nil {
+			if err := fieldsTarget1.FinishField(keyTarget5, fieldTarget6); err != nil {
 				return err
 			}
-		} else {
+		}
+	}
+	var10 := (m.FString == "")
+	if var10 {
+		if err := fieldsTarget1.ZeroField("FString"); err != nil && err != vdl.ErrFieldNoExist {
+			return err
+		}
+	} else {
+		keyTarget8, fieldTarget9, err := fieldsTarget1.StartField("FString")
+		if err != vdl.ErrFieldNoExist {
+			if err != nil {
+				return err
+			}
 			if err := fieldTarget9.FromString(string(m.FString), tt.NonOptional().Field(2).Type); err != nil {
 				return err
 			}
-		}
-		if err := fieldsTarget1.FinishField(keyTarget8, fieldTarget9); err != nil {
-			return err
+			if err := fieldsTarget1.FinishField(keyTarget8, fieldTarget9); err != nil {
+				return err
+			}
 		}
 	}
 	if err := t.FinishFields(fieldsTarget1); err != nil {
@@ -1956,14 +1965,25 @@
 func (t *MultiVersionStructV3Target) FinishField(_, _ vdl.Target) error {
 	return nil
 }
+func (t *MultiVersionStructV3Target) ZeroField(name string) error {
+	switch name {
+	case "FInt32":
+		t.Value.FInt32 = int32(0)
+		return nil
+	case "FRect":
+		t.Value.FRect = Rect{}
+		return nil
+	case "FString":
+		t.Value.FString = ""
+		return nil
+	default:
+		return fmt.Errorf("field %s not in struct src/v.io/x/mojo/transcoder/testtypes.MultiVersionStructV3", name)
+	}
+}
 func (t *MultiVersionStructV3Target) FinishFields(_ vdl.FieldsTarget) error {
 
 	return nil
 }
-func (t *MultiVersionStructV3Target) FromZero(tt *vdl.Type) error {
-	*t.Value = MultiVersionStructV3{}
-	return nil
-}
 
 var __VDLInitCalled bool
 
diff --git a/go/src/v.io/x/mojo/transcoder/to_mojom.go b/go/src/v.io/x/mojo/transcoder/to_mojom.go
index 73196de..677d9de 100644
--- a/go/src/v.io/x/mojo/transcoder/to_mojom.go
+++ b/go/src/v.io/x/mojo/transcoder/to_mojom.go
@@ -59,29 +59,6 @@
 func (vtm *targetToMojomTranscoder) FromTypeObject(src *vdl.Type) error {
 	panic("cannot encode top level type object")
 }
-func (vtm *targetToMojomTranscoder) FromZero(tt *vdl.Type) error {
-	if tt.Kind() == vdl.Struct {
-		st, err := vtm.StartFields(tt)
-		if err != nil {
-			return err
-		}
-		for i := 0; i < tt.NumField(); i++ {
-			fld := tt.Field(i)
-			kt, ft, err := st.StartField(fld.Name)
-			if err != nil {
-				return err
-			}
-			if err := ft.FromZero(fld.Type); err != nil {
-				return err
-			}
-			if err := st.FinishField(kt, ft); err != nil {
-				return err
-			}
-		}
-		return vtm.FinishFields(st)
-	}
-	panic("UNIMPLEMENTED")
-}
 
 func (vtm *targetToMojomTranscoder) StartList(tt *vdl.Type, len int) (vdl.ListTarget, error) {
 	panic("UNIMPLEMENTED")
@@ -117,3 +94,7 @@
 func (vtm *targetToMojomTranscoder) FinishFields(x vdl.FieldsTarget) error {
 	return nil
 }
+
+func (vtm *targetToMojomTranscoder) FromNil(tt *vdl.Type) error {
+	panic("UNIMPLEMENTED")
+}
diff --git a/go/src/v.io/x/mojo/transcoder/typed_targets.go b/go/src/v.io/x/mojo/transcoder/typed_targets.go
index 6d209f3..8813e1b 100644
--- a/go/src/v.io/x/mojo/transcoder/typed_targets.go
+++ b/go/src/v.io/x/mojo/transcoder/typed_targets.go
@@ -32,6 +32,20 @@
 func (fieldsTarget) FinishField(key, field vdl.Target) error {
 	return nil
 }
+func (fe fieldsTarget) ZeroField(name string) error {
+	key, field, err := fe.StartField(name)
+	if err != nil {
+		return err
+	}
+	fld, index := fe.vdlType.FieldByName(name)
+	if index < 0 {
+		return vdl.ErrFieldNoExist
+	}
+	if err := field.(target).fromZero(fld.Type); err != nil {
+		return err
+	}
+	return fe.FinishField(key, field)
+}
 
 type unionFieldsTarget struct {
 	vdlType *vdl.Type
@@ -62,6 +76,20 @@
 func (unionFieldsTarget) FinishField(key, field vdl.Target) error {
 	return nil
 }
+func (ufe unionFieldsTarget) ZeroField(name string) error {
+	key, field, err := ufe.StartField(name)
+	if err != nil {
+		return err
+	}
+	fld, index := ufe.vdlType.FieldByName(name)
+	if index < 0 {
+		return vdl.ErrFieldNoExist
+	}
+	if err := field.(target).fromZero(fld.Type); err != nil {
+		return err
+	}
+	return ufe.FinishField(key, field)
+}
 
 // doubles as set target
 type listTarget struct {