diff --git a/go/src/v.io/x/sensorlog/internal/sbmodel/sbmodel.vdl.go b/go/src/v.io/x/sensorlog/internal/sbmodel/sbmodel.vdl.go
index a0f7371..28075dd 100644
--- a/go/src/v.io/x/sensorlog/internal/sbmodel/sbmodel.vdl.go
+++ b/go/src/v.io/x/sensorlog/internal/sbmodel/sbmodel.vdl.go
@@ -20,6 +20,11 @@
 	time_2 "v.io/v23/vdlroot/time"
 )
 
+var _ = __VDLInit() // Must be first; see __VDLInit comments for details.
+
+//////////////////////////////////////////////////
+// Type definitions
+
 // devicecfg : <DevId>
 // Measuring device handle. Master only.
 type VDeviceCfg struct {
@@ -35,9 +40,6 @@
 }
 
 func (m *VDeviceCfg) FillVDLTarget(t vdl.Target, tt *vdl.Type) error {
-	if __VDLType_v_io_x_sensorlog_internal_sbmodel_VDeviceCfg == nil || __VDLType0 == nil {
-		panic("Initialization order error: types generated for FillVDLTarget not initialized. Consider moving caller to an init() block.")
-	}
 	fieldsTarget1, err := t.StartFields(tt)
 	if err != nil {
 		return err
@@ -48,7 +50,7 @@
 		return err
 	}
 	if err != vdl.ErrFieldNoExist {
-		if err := fieldTarget3.FromString(string(m.Desc), vdl.StringType); err != nil {
+		if err := fieldTarget3.FromString(string(m.Desc), tt.NonOptional().Field(0).Type); err != nil {
 			return err
 		}
 		if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
@@ -60,7 +62,7 @@
 		return err
 	}
 	if err != vdl.ErrFieldNoExist {
-		if err := fieldTarget5.FromString(string(m.SgPublishSb), vdl.StringType); err != nil {
+		if err := fieldTarget5.FromString(string(m.SgPublishSb), tt.NonOptional().Field(1).Type); err != nil {
 			return err
 		}
 		if err := fieldsTarget1.FinishField(keyTarget4, fieldTarget5); err != nil {
@@ -87,8 +89,8 @@
 
 func (t *VDeviceCfgTarget) StartFields(tt *vdl.Type) (vdl.FieldsTarget, error) {
 
-	if !vdl.Compatible(tt, __VDLType_v_io_x_sensorlog_internal_sbmodel_VDeviceCfg) {
-		return nil, fmt.Errorf("type %v incompatible with %v", tt, __VDLType_v_io_x_sensorlog_internal_sbmodel_VDeviceCfg)
+	if ttWant := vdl.TypeOf((*VDeviceCfg)(nil)).Elem(); !vdl.Compatible(tt, ttWant) {
+		return nil, fmt.Errorf("type %v incompatible with %v", tt, ttWant)
 	}
 	return t, nil
 }
@@ -103,7 +105,7 @@
 		target, err := &t.sgPublishSbTarget, error(nil)
 		return nil, target, err
 	default:
-		return nil, nil, fmt.Errorf("field %s not in struct %v", name, __VDLType_v_io_x_sensorlog_internal_sbmodel_VDeviceCfg)
+		return nil, nil, fmt.Errorf("field %s not in struct v.io/x/sensorlog/internal/sbmodel.VDeviceCfg", name)
 	}
 }
 func (t *VDeviceCfgTarget) FinishField(_, _ vdl.Target) error {
@@ -124,9 +126,6 @@
 }
 
 func (m *KDeviceCfg) FillVDLTarget(t vdl.Target, tt *vdl.Type) error {
-	if __VDLType_v_io_x_sensorlog_internal_sbmodel_KDeviceCfg == nil || __VDLType1 == nil {
-		panic("Initialization order error: types generated for FillVDLTarget not initialized. Consider moving caller to an init() block.")
-	}
 	fieldsTarget1, err := t.StartFields(tt)
 	if err != nil {
 		return err
@@ -137,7 +136,7 @@
 		return err
 	}
 	if err != vdl.ErrFieldNoExist {
-		if err := fieldTarget3.FromString(string(m.DevId), vdl.StringType); err != nil {
+		if err := fieldTarget3.FromString(string(m.DevId), tt.NonOptional().Field(0).Type); err != nil {
 			return err
 		}
 		if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
@@ -163,8 +162,8 @@
 
 func (t *KDeviceCfgTarget) StartFields(tt *vdl.Type) (vdl.FieldsTarget, error) {
 
-	if !vdl.Compatible(tt, __VDLType_v_io_x_sensorlog_internal_sbmodel_KDeviceCfg) {
-		return nil, fmt.Errorf("type %v incompatible with %v", tt, __VDLType_v_io_x_sensorlog_internal_sbmodel_KDeviceCfg)
+	if ttWant := vdl.TypeOf((*KDeviceCfg)(nil)).Elem(); !vdl.Compatible(tt, ttWant) {
+		return nil, fmt.Errorf("type %v incompatible with %v", tt, ttWant)
 	}
 	return t, nil
 }
@@ -175,7 +174,7 @@
 		target, err := &t.devIdTarget, error(nil)
 		return nil, target, err
 	default:
-		return nil, nil, fmt.Errorf("field %s not in struct %v", name, __VDLType_v_io_x_sensorlog_internal_sbmodel_KDeviceCfg)
+		return nil, nil, fmt.Errorf("field %s not in struct v.io/x/sensorlog/internal/sbmodel.KDeviceCfg", name)
 	}
 }
 func (t *KDeviceCfgTarget) FinishField(_, _ vdl.Target) error {
@@ -186,6 +185,127 @@
 	return nil
 }
 
+// Sampling script and polling frequency.
+type SamplerDef struct {
+	// Shell script executed after every Interval, starting from Start.
+	// It should output a single data point, if available. A non-zero exit
+	// status or failure to parse the value will produce an error instead.
+	Script   string
+	Start    time.Time
+	Interval time.Duration
+}
+
+func (SamplerDef) __VDLReflect(struct {
+	Name string `vdl:"v.io/x/sensorlog/internal/sbmodel.SamplerDef"`
+}) {
+}
+
+func (m *SamplerDef) FillVDLTarget(t vdl.Target, tt *vdl.Type) error {
+	fieldsTarget1, err := t.StartFields(tt)
+	if err != nil {
+		return err
+	}
+
+	keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("Script")
+	if err != vdl.ErrFieldNoExist && err != nil {
+		return err
+	}
+	if err != vdl.ErrFieldNoExist {
+		if err := fieldTarget3.FromString(string(m.Script), tt.NonOptional().Field(0).Type); err != nil {
+			return err
+		}
+		if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
+			return err
+		}
+	}
+	var wireValue4 time_2.Time
+	if err := time_2.TimeFromNative(&wireValue4, m.Start); err != nil {
+		return err
+	}
+
+	keyTarget5, fieldTarget6, err := fieldsTarget1.StartField("Start")
+	if err != vdl.ErrFieldNoExist && err != nil {
+		return err
+	}
+	if err != vdl.ErrFieldNoExist {
+
+		if err := wireValue4.FillVDLTarget(fieldTarget6, tt.NonOptional().Field(1).Type); err != nil {
+			return err
+		}
+		if err := fieldsTarget1.FinishField(keyTarget5, fieldTarget6); err != nil {
+			return err
+		}
+	}
+	var wireValue7 time_2.Duration
+	if err := time_2.DurationFromNative(&wireValue7, m.Interval); err != nil {
+		return err
+	}
+
+	keyTarget8, fieldTarget9, err := fieldsTarget1.StartField("Interval")
+	if err != vdl.ErrFieldNoExist && err != nil {
+		return err
+	}
+	if err != vdl.ErrFieldNoExist {
+
+		if err := wireValue7.FillVDLTarget(fieldTarget9, tt.NonOptional().Field(2).Type); err != nil {
+			return err
+		}
+		if err := fieldsTarget1.FinishField(keyTarget8, fieldTarget9); err != nil {
+			return err
+		}
+	}
+	if err := t.FinishFields(fieldsTarget1); err != nil {
+		return err
+	}
+	return nil
+}
+
+func (m *SamplerDef) MakeVDLTarget() vdl.Target {
+	return &SamplerDefTarget{Value: m}
+}
+
+type SamplerDefTarget struct {
+	Value          *SamplerDef
+	scriptTarget   vdl.StringTarget
+	startTarget    time_2.TimeTarget
+	intervalTarget time_2.DurationTarget
+	vdl.TargetBase
+	vdl.FieldsTargetBase
+}
+
+func (t *SamplerDefTarget) StartFields(tt *vdl.Type) (vdl.FieldsTarget, error) {
+
+	if ttWant := vdl.TypeOf((*SamplerDef)(nil)).Elem(); !vdl.Compatible(tt, ttWant) {
+		return nil, fmt.Errorf("type %v incompatible with %v", tt, ttWant)
+	}
+	return t, nil
+}
+func (t *SamplerDefTarget) StartField(name string) (key, field vdl.Target, _ error) {
+	switch name {
+	case "Script":
+		t.scriptTarget.Value = &t.Value.Script
+		target, err := &t.scriptTarget, error(nil)
+		return nil, target, err
+	case "Start":
+		t.startTarget.Value = &t.Value.Start
+		target, err := &t.startTarget, error(nil)
+		return nil, target, err
+	case "Interval":
+		t.intervalTarget.Value = &t.Value.Interval
+		target, err := &t.intervalTarget, error(nil)
+		return nil, target, err
+	default:
+		return nil, nil, fmt.Errorf("field %s not in struct v.io/x/sensorlog/internal/sbmodel.SamplerDef", name)
+	}
+}
+func (t *SamplerDefTarget) FinishField(_, _ vdl.Target) error {
+	return nil
+}
+func (t *SamplerDefTarget) FinishFields(_ vdl.FieldsTarget) error {
+
+	return nil
+}
+
 // streamdef : <DevId>/<StreamId>
 // Configures a stream of data to be measured.
 type VStreamDef struct {
@@ -203,7 +323,6 @@
 }
 
 func (m *VStreamDef) FillVDLTarget(t vdl.Target, tt *vdl.Type) error {
-	__VDLEnsureNativeBuilt()
 	fieldsTarget1, err := t.StartFields(tt)
 	if err != nil {
 		return err
@@ -214,7 +333,7 @@
 		return err
 	}
 	if err != vdl.ErrFieldNoExist {
-		if err := fieldTarget3.FromString(string(m.Desc), vdl.StringType); err != nil {
+		if err := fieldTarget3.FromString(string(m.Desc), tt.NonOptional().Field(0).Type); err != nil {
 			return err
 		}
 		if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
@@ -227,7 +346,7 @@
 	}
 	if err != vdl.ErrFieldNoExist {
 
-		if err := m.Sampler.FillVDLTarget(fieldTarget5, __VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDef); err != nil {
+		if err := m.Sampler.FillVDLTarget(fieldTarget5, tt.NonOptional().Field(1).Type); err != nil {
 			return err
 		}
 		if err := fieldsTarget1.FinishField(keyTarget4, fieldTarget5); err != nil {
@@ -239,7 +358,7 @@
 		return err
 	}
 	if err != vdl.ErrFieldNoExist {
-		if err := fieldTarget7.FromBool(bool(m.Enabled), vdl.BoolType); err != nil {
+		if err := fieldTarget7.FromBool(bool(m.Enabled), tt.NonOptional().Field(2).Type); err != nil {
 			return err
 		}
 		if err := fieldsTarget1.FinishField(keyTarget6, fieldTarget7); err != nil {
@@ -267,8 +386,8 @@
 
 func (t *VStreamDefTarget) StartFields(tt *vdl.Type) (vdl.FieldsTarget, error) {
 
-	if !vdl.Compatible(tt, __VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef) {
-		return nil, fmt.Errorf("type %v incompatible with %v", tt, __VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef)
+	if ttWant := vdl.TypeOf((*VStreamDef)(nil)).Elem(); !vdl.Compatible(tt, ttWant) {
+		return nil, fmt.Errorf("type %v incompatible with %v", tt, ttWant)
 	}
 	return t, nil
 }
@@ -287,7 +406,7 @@
 		target, err := &t.enabledTarget, error(nil)
 		return nil, target, err
 	default:
-		return nil, nil, fmt.Errorf("field %s not in struct %v", name, __VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef)
+		return nil, nil, fmt.Errorf("field %s not in struct v.io/x/sensorlog/internal/sbmodel.VStreamDef", name)
 	}
 }
 func (t *VStreamDefTarget) FinishField(_, _ vdl.Target) error {
@@ -298,48 +417,6 @@
 	return nil
 }
 
-type SamplerDefTarget struct {
-	Value          *SamplerDef
-	scriptTarget   vdl.StringTarget
-	startTarget    time_2.TimeTarget
-	intervalTarget time_2.DurationTarget
-	vdl.TargetBase
-	vdl.FieldsTargetBase
-}
-
-func (t *SamplerDefTarget) StartFields(tt *vdl.Type) (vdl.FieldsTarget, error) {
-
-	if !vdl.Compatible(tt, __VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDef) {
-		return nil, fmt.Errorf("type %v incompatible with %v", tt, __VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDef)
-	}
-	return t, nil
-}
-func (t *SamplerDefTarget) StartField(name string) (key, field vdl.Target, _ error) {
-	switch name {
-	case "Script":
-		t.scriptTarget.Value = &t.Value.Script
-		target, err := &t.scriptTarget, error(nil)
-		return nil, target, err
-	case "Start":
-		t.startTarget.Value = &t.Value.Start
-		target, err := &t.startTarget, error(nil)
-		return nil, target, err
-	case "Interval":
-		t.intervalTarget.Value = &t.Value.Interval
-		target, err := &t.intervalTarget, error(nil)
-		return nil, target, err
-	default:
-		return nil, nil, fmt.Errorf("field %s not in struct %v", name, __VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDef)
-	}
-}
-func (t *SamplerDefTarget) FinishField(_, _ vdl.Target) error {
-	return nil
-}
-func (t *SamplerDefTarget) FinishFields(_ vdl.FieldsTarget) error {
-
-	return nil
-}
-
 type KStreamDef struct {
 	DevId    string
 	StreamId string
@@ -351,9 +428,6 @@
 }
 
 func (m *KStreamDef) FillVDLTarget(t vdl.Target, tt *vdl.Type) error {
-	if __VDLType_v_io_x_sensorlog_internal_sbmodel_KStreamDef == nil || __VDLType3 == nil {
-		panic("Initialization order error: types generated for FillVDLTarget not initialized. Consider moving caller to an init() block.")
-	}
 	fieldsTarget1, err := t.StartFields(tt)
 	if err != nil {
 		return err
@@ -364,7 +438,7 @@
 		return err
 	}
 	if err != vdl.ErrFieldNoExist {
-		if err := fieldTarget3.FromString(string(m.DevId), vdl.StringType); err != nil {
+		if err := fieldTarget3.FromString(string(m.DevId), tt.NonOptional().Field(0).Type); err != nil {
 			return err
 		}
 		if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
@@ -376,7 +450,7 @@
 		return err
 	}
 	if err != vdl.ErrFieldNoExist {
-		if err := fieldTarget5.FromString(string(m.StreamId), vdl.StringType); err != nil {
+		if err := fieldTarget5.FromString(string(m.StreamId), tt.NonOptional().Field(1).Type); err != nil {
 			return err
 		}
 		if err := fieldsTarget1.FinishField(keyTarget4, fieldTarget5); err != nil {
@@ -403,8 +477,8 @@
 
 func (t *KStreamDefTarget) StartFields(tt *vdl.Type) (vdl.FieldsTarget, error) {
 
-	if !vdl.Compatible(tt, __VDLType_v_io_x_sensorlog_internal_sbmodel_KStreamDef) {
-		return nil, fmt.Errorf("type %v incompatible with %v", tt, __VDLType_v_io_x_sensorlog_internal_sbmodel_KStreamDef)
+	if ttWant := vdl.TypeOf((*KStreamDef)(nil)).Elem(); !vdl.Compatible(tt, ttWant) {
+		return nil, fmt.Errorf("type %v incompatible with %v", tt, ttWant)
 	}
 	return t, nil
 }
@@ -419,7 +493,7 @@
 		target, err := &t.streamIdTarget, error(nil)
 		return nil, target, err
 	default:
-		return nil, nil, fmt.Errorf("field %s not in struct %v", name, __VDLType_v_io_x_sensorlog_internal_sbmodel_KStreamDef)
+		return nil, nil, fmt.Errorf("field %s not in struct v.io/x/sensorlog/internal/sbmodel.KStreamDef", name)
 	}
 }
 func (t *KStreamDefTarget) FinishField(_, _ vdl.Target) error {
@@ -430,86 +504,6 @@
 	return nil
 }
 
-// Sampling script and polling frequency.
-type SamplerDef struct {
-	// Shell script executed after every Interval, starting from Start.
-	// It should output a single data point, if available. A non-zero exit
-	// status or failure to parse the value will produce an error instead.
-	Script   string
-	Start    time.Time
-	Interval time.Duration
-}
-
-func (SamplerDef) __VDLReflect(struct {
-	Name string `vdl:"v.io/x/sensorlog/internal/sbmodel.SamplerDef"`
-}) {
-}
-
-func (m *SamplerDef) FillVDLTarget(t vdl.Target, tt *vdl.Type) error {
-	__VDLEnsureNativeBuilt()
-	fieldsTarget1, err := t.StartFields(tt)
-	if err != nil {
-		return err
-	}
-
-	keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("Script")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
-	}
-	if err != vdl.ErrFieldNoExist {
-		if err := fieldTarget3.FromString(string(m.Script), vdl.StringType); err != nil {
-			return err
-		}
-		if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
-			return err
-		}
-	}
-	var wireValue4 time_2.Time
-	if err := time_2.TimeFromNative(&wireValue4, m.Start); err != nil {
-		return err
-	}
-
-	keyTarget5, fieldTarget6, err := fieldsTarget1.StartField("Start")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
-	}
-	if err != vdl.ErrFieldNoExist {
-
-		if err := wireValue4.FillVDLTarget(fieldTarget6, __VDLType_time_Time); err != nil {
-			return err
-		}
-		if err := fieldsTarget1.FinishField(keyTarget5, fieldTarget6); err != nil {
-			return err
-		}
-	}
-	var wireValue7 time_2.Duration
-	if err := time_2.DurationFromNative(&wireValue7, m.Interval); err != nil {
-		return err
-	}
-
-	keyTarget8, fieldTarget9, err := fieldsTarget1.StartField("Interval")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
-	}
-	if err != vdl.ErrFieldNoExist {
-
-		if err := wireValue7.FillVDLTarget(fieldTarget9, __VDLType_time_Duration); err != nil {
-			return err
-		}
-		if err := fieldsTarget1.FinishField(keyTarget8, fieldTarget9); err != nil {
-			return err
-		}
-	}
-	if err := t.FinishFields(fieldsTarget1); err != nil {
-		return err
-	}
-	return nil
-}
-
-func (m *SamplerDef) MakeVDLTarget() vdl.Target {
-	return &SamplerDefTarget{Value: m}
-}
-
 // sdata : <DevId>/<StreamId>/<Timestamp>
 // Measured data value or error.
 type KDataPoint struct {
@@ -524,7 +518,6 @@
 }
 
 func (m *KDataPoint) FillVDLTarget(t vdl.Target, tt *vdl.Type) error {
-	__VDLEnsureNativeBuilt()
 	fieldsTarget1, err := t.StartFields(tt)
 	if err != nil {
 		return err
@@ -535,7 +528,7 @@
 		return err
 	}
 	if err != vdl.ErrFieldNoExist {
-		if err := fieldTarget3.FromString(string(m.DevId), vdl.StringType); err != nil {
+		if err := fieldTarget3.FromString(string(m.DevId), tt.NonOptional().Field(0).Type); err != nil {
 			return err
 		}
 		if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
@@ -547,7 +540,7 @@
 		return err
 	}
 	if err != vdl.ErrFieldNoExist {
-		if err := fieldTarget5.FromString(string(m.StreamId), vdl.StringType); err != nil {
+		if err := fieldTarget5.FromString(string(m.StreamId), tt.NonOptional().Field(1).Type); err != nil {
 			return err
 		}
 		if err := fieldsTarget1.FinishField(keyTarget4, fieldTarget5); err != nil {
@@ -565,7 +558,7 @@
 	}
 	if err != vdl.ErrFieldNoExist {
 
-		if err := wireValue6.FillVDLTarget(fieldTarget8, __VDLType_time_Time); err != nil {
+		if err := wireValue6.FillVDLTarget(fieldTarget8, tt.NonOptional().Field(2).Type); err != nil {
 			return err
 		}
 		if err := fieldsTarget1.FinishField(keyTarget7, fieldTarget8); err != nil {
@@ -593,8 +586,8 @@
 
 func (t *KDataPointTarget) StartFields(tt *vdl.Type) (vdl.FieldsTarget, error) {
 
-	if !vdl.Compatible(tt, __VDLType_v_io_x_sensorlog_internal_sbmodel_KDataPoint) {
-		return nil, fmt.Errorf("type %v incompatible with %v", tt, __VDLType_v_io_x_sensorlog_internal_sbmodel_KDataPoint)
+	if ttWant := vdl.TypeOf((*KDataPoint)(nil)).Elem(); !vdl.Compatible(tt, ttWant) {
+		return nil, fmt.Errorf("type %v incompatible with %v", tt, ttWant)
 	}
 	return t, nil
 }
@@ -613,7 +606,7 @@
 		target, err := &t.timestampTarget, error(nil)
 		return nil, target, err
 	default:
-		return nil, nil, fmt.Errorf("field %s not in struct %v", name, __VDLType_v_io_x_sensorlog_internal_sbmodel_KDataPoint)
+		return nil, nil, fmt.Errorf("field %s not in struct v.io/x/sensorlog/internal/sbmodel.KDataPoint", name)
 	}
 }
 func (t *KDataPointTarget) FinishField(_, _ vdl.Target) error {
@@ -658,7 +651,7 @@
 func (x VDataPointValue) __VDLReflect(__VDataPointReflect) {}
 
 func (m VDataPointValue) FillVDLTarget(t vdl.Target, tt *vdl.Type) error {
-	fieldsTarget1, err := t.StartFields(__VDLType_v_io_x_sensorlog_internal_sbmodel_VDataPoint)
+	fieldsTarget1, err := t.StartFields(tt)
 	if err != nil {
 		return err
 	}
@@ -666,7 +659,7 @@
 	if err != nil {
 		return err
 	}
-	if err := fieldTarget3.FromFloat(float64(m.Value), vdl.Float64Type); err != nil {
+	if err := fieldTarget3.FromFloat(float64(m.Value), tt.NonOptional().Field(0).Type); err != nil {
 		return err
 	}
 	if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
@@ -689,7 +682,7 @@
 func (x VDataPointError) __VDLReflect(__VDataPointReflect) {}
 
 func (m VDataPointError) FillVDLTarget(t vdl.Target, tt *vdl.Type) error {
-	fieldsTarget1, err := t.StartFields(__VDLType_v_io_x_sensorlog_internal_sbmodel_VDataPoint)
+	fieldsTarget1, err := t.StartFields(tt)
 	if err != nil {
 		return err
 	}
@@ -697,7 +690,7 @@
 	if err != nil {
 		return err
 	}
-	if err := fieldTarget3.FromString(string(m.Value), vdl.StringType); err != nil {
+	if err := fieldTarget3.FromString(string(m.Value), tt.NonOptional().Field(1).Type); err != nil {
 		return err
 	}
 	if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
@@ -714,291 +707,34 @@
 	return nil
 }
 
-func init() {
+var __VDLInitCalled bool
+
+// __VDLInit performs vdl initialization.  It is safe to call multiple times.
+// If you have an init ordering issue, just insert the following line verbatim
+// into your source files in this package, right after the "package foo" clause:
+//
+//    var _ = __VDLInit()
+//
+// The purpose of this function is to ensure that vdl initialization occurs in
+// the right order, and very early in the init sequence.  In particular, vdl
+// registration and package variable initialization needs to occur before
+// functions like vdl.TypeOf will work properly.
+//
+// This function returns a dummy value, so that it can be used to initialize the
+// first var in the file, to take advantage of Go's defined init order.
+func __VDLInit() struct{} {
+	if __VDLInitCalled {
+		return struct{}{}
+	}
+
+	// Register types.
 	vdl.Register((*VDeviceCfg)(nil))
 	vdl.Register((*KDeviceCfg)(nil))
+	vdl.Register((*SamplerDef)(nil))
 	vdl.Register((*VStreamDef)(nil))
 	vdl.Register((*KStreamDef)(nil))
-	vdl.Register((*SamplerDef)(nil))
 	vdl.Register((*KDataPoint)(nil))
 	vdl.Register((*VDataPoint)(nil))
-}
 
-var __VDLType5 *vdl.Type
-
-func __VDLType5_gen() *vdl.Type {
-	__VDLType5Builder := vdl.TypeBuilder{}
-
-	__VDLType51 := __VDLType5Builder.Optional()
-	__VDLType52 := __VDLType5Builder.Struct()
-	__VDLType53 := __VDLType5Builder.Named("v.io/x/sensorlog/internal/sbmodel.KDataPoint").AssignBase(__VDLType52)
-	__VDLType54 := vdl.StringType
-	__VDLType52.AppendField("DevId", __VDLType54)
-	__VDLType52.AppendField("StreamId", __VDLType54)
-	__VDLType55 := __VDLType5Builder.Struct()
-	__VDLType56 := __VDLType5Builder.Named("time.Time").AssignBase(__VDLType55)
-	__VDLType57 := vdl.Int64Type
-	__VDLType55.AppendField("Seconds", __VDLType57)
-	__VDLType58 := vdl.Int32Type
-	__VDLType55.AppendField("Nanos", __VDLType58)
-	__VDLType52.AppendField("Timestamp", __VDLType56)
-	__VDLType51.AssignElem(__VDLType53)
-	__VDLType5Builder.Build()
-	__VDLType5v, err := __VDLType51.Built()
-	if err != nil {
-		panic(err)
-	}
-	return __VDLType5v
-}
-func init() {
-	__VDLType5 = __VDLType5_gen()
-}
-
-var __VDLType1 *vdl.Type = vdl.TypeOf((*KDeviceCfg)(nil))
-var __VDLType3 *vdl.Type = vdl.TypeOf((*KStreamDef)(nil))
-var __VDLType4 *vdl.Type
-
-func __VDLType4_gen() *vdl.Type {
-	__VDLType4Builder := vdl.TypeBuilder{}
-
-	__VDLType41 := __VDLType4Builder.Optional()
-	__VDLType42 := __VDLType4Builder.Struct()
-	__VDLType43 := __VDLType4Builder.Named("v.io/x/sensorlog/internal/sbmodel.SamplerDef").AssignBase(__VDLType42)
-	__VDLType44 := vdl.StringType
-	__VDLType42.AppendField("Script", __VDLType44)
-	__VDLType45 := __VDLType4Builder.Struct()
-	__VDLType46 := __VDLType4Builder.Named("time.Time").AssignBase(__VDLType45)
-	__VDLType47 := vdl.Int64Type
-	__VDLType45.AppendField("Seconds", __VDLType47)
-	__VDLType48 := vdl.Int32Type
-	__VDLType45.AppendField("Nanos", __VDLType48)
-	__VDLType42.AppendField("Start", __VDLType46)
-	__VDLType49 := __VDLType4Builder.Struct()
-	__VDLType410 := __VDLType4Builder.Named("time.Duration").AssignBase(__VDLType49)
-	__VDLType49.AppendField("Seconds", __VDLType47)
-	__VDLType49.AppendField("Nanos", __VDLType48)
-	__VDLType42.AppendField("Interval", __VDLType410)
-	__VDLType41.AssignElem(__VDLType43)
-	__VDLType4Builder.Build()
-	__VDLType4v, err := __VDLType41.Built()
-	if err != nil {
-		panic(err)
-	}
-	return __VDLType4v
-}
-func init() {
-	__VDLType4 = __VDLType4_gen()
-}
-
-var __VDLType0 *vdl.Type = vdl.TypeOf((*VDeviceCfg)(nil))
-var __VDLType2 *vdl.Type
-
-func __VDLType2_gen() *vdl.Type {
-	__VDLType2Builder := vdl.TypeBuilder{}
-
-	__VDLType21 := __VDLType2Builder.Optional()
-	__VDLType22 := __VDLType2Builder.Struct()
-	__VDLType23 := __VDLType2Builder.Named("v.io/x/sensorlog/internal/sbmodel.VStreamDef").AssignBase(__VDLType22)
-	__VDLType24 := vdl.StringType
-	__VDLType22.AppendField("Desc", __VDLType24)
-	__VDLType25 := __VDLType2Builder.Struct()
-	__VDLType26 := __VDLType2Builder.Named("v.io/x/sensorlog/internal/sbmodel.SamplerDef").AssignBase(__VDLType25)
-	__VDLType25.AppendField("Script", __VDLType24)
-	__VDLType27 := __VDLType2Builder.Struct()
-	__VDLType28 := __VDLType2Builder.Named("time.Time").AssignBase(__VDLType27)
-	__VDLType29 := vdl.Int64Type
-	__VDLType27.AppendField("Seconds", __VDLType29)
-	__VDLType210 := vdl.Int32Type
-	__VDLType27.AppendField("Nanos", __VDLType210)
-	__VDLType25.AppendField("Start", __VDLType28)
-	__VDLType211 := __VDLType2Builder.Struct()
-	__VDLType212 := __VDLType2Builder.Named("time.Duration").AssignBase(__VDLType211)
-	__VDLType211.AppendField("Seconds", __VDLType29)
-	__VDLType211.AppendField("Nanos", __VDLType210)
-	__VDLType25.AppendField("Interval", __VDLType212)
-	__VDLType22.AppendField("Sampler", __VDLType26)
-	__VDLType213 := vdl.BoolType
-	__VDLType22.AppendField("Enabled", __VDLType213)
-	__VDLType21.AssignElem(__VDLType23)
-	__VDLType2Builder.Build()
-	__VDLType2v, err := __VDLType21.Built()
-	if err != nil {
-		panic(err)
-	}
-	return __VDLType2v
-}
-func init() {
-	__VDLType2 = __VDLType2_gen()
-}
-
-var __VDLType_time_Duration *vdl.Type
-
-func __VDLType_time_Duration_gen() *vdl.Type {
-	__VDLType_time_DurationBuilder := vdl.TypeBuilder{}
-
-	__VDLType_time_Duration1 := __VDLType_time_DurationBuilder.Struct()
-	__VDLType_time_Duration2 := __VDLType_time_DurationBuilder.Named("time.Duration").AssignBase(__VDLType_time_Duration1)
-	__VDLType_time_Duration3 := vdl.Int64Type
-	__VDLType_time_Duration1.AppendField("Seconds", __VDLType_time_Duration3)
-	__VDLType_time_Duration4 := vdl.Int32Type
-	__VDLType_time_Duration1.AppendField("Nanos", __VDLType_time_Duration4)
-	__VDLType_time_DurationBuilder.Build()
-	__VDLType_time_Durationv, err := __VDLType_time_Duration2.Built()
-	if err != nil {
-		panic(err)
-	}
-	return __VDLType_time_Durationv
-}
-func init() {
-	__VDLType_time_Duration = __VDLType_time_Duration_gen()
-}
-
-var __VDLType_time_Time *vdl.Type
-
-func __VDLType_time_Time_gen() *vdl.Type {
-	__VDLType_time_TimeBuilder := vdl.TypeBuilder{}
-
-	__VDLType_time_Time1 := __VDLType_time_TimeBuilder.Struct()
-	__VDLType_time_Time2 := __VDLType_time_TimeBuilder.Named("time.Time").AssignBase(__VDLType_time_Time1)
-	__VDLType_time_Time3 := vdl.Int64Type
-	__VDLType_time_Time1.AppendField("Seconds", __VDLType_time_Time3)
-	__VDLType_time_Time4 := vdl.Int32Type
-	__VDLType_time_Time1.AppendField("Nanos", __VDLType_time_Time4)
-	__VDLType_time_TimeBuilder.Build()
-	__VDLType_time_Timev, err := __VDLType_time_Time2.Built()
-	if err != nil {
-		panic(err)
-	}
-	return __VDLType_time_Timev
-}
-func init() {
-	__VDLType_time_Time = __VDLType_time_Time_gen()
-}
-
-var __VDLType_v_io_x_sensorlog_internal_sbmodel_KDataPoint *vdl.Type
-
-func __VDLType_v_io_x_sensorlog_internal_sbmodel_KDataPoint_gen() *vdl.Type {
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_KDataPointBuilder := vdl.TypeBuilder{}
-
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_KDataPoint1 := __VDLType_v_io_x_sensorlog_internal_sbmodel_KDataPointBuilder.Struct()
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_KDataPoint2 := __VDLType_v_io_x_sensorlog_internal_sbmodel_KDataPointBuilder.Named("v.io/x/sensorlog/internal/sbmodel.KDataPoint").AssignBase(__VDLType_v_io_x_sensorlog_internal_sbmodel_KDataPoint1)
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_KDataPoint3 := vdl.StringType
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_KDataPoint1.AppendField("DevId", __VDLType_v_io_x_sensorlog_internal_sbmodel_KDataPoint3)
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_KDataPoint1.AppendField("StreamId", __VDLType_v_io_x_sensorlog_internal_sbmodel_KDataPoint3)
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_KDataPoint4 := __VDLType_v_io_x_sensorlog_internal_sbmodel_KDataPointBuilder.Struct()
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_KDataPoint5 := __VDLType_v_io_x_sensorlog_internal_sbmodel_KDataPointBuilder.Named("time.Time").AssignBase(__VDLType_v_io_x_sensorlog_internal_sbmodel_KDataPoint4)
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_KDataPoint6 := vdl.Int64Type
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_KDataPoint4.AppendField("Seconds", __VDLType_v_io_x_sensorlog_internal_sbmodel_KDataPoint6)
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_KDataPoint7 := vdl.Int32Type
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_KDataPoint4.AppendField("Nanos", __VDLType_v_io_x_sensorlog_internal_sbmodel_KDataPoint7)
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_KDataPoint1.AppendField("Timestamp", __VDLType_v_io_x_sensorlog_internal_sbmodel_KDataPoint5)
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_KDataPointBuilder.Build()
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_KDataPointv, err := __VDLType_v_io_x_sensorlog_internal_sbmodel_KDataPoint2.Built()
-	if err != nil {
-		panic(err)
-	}
-	return __VDLType_v_io_x_sensorlog_internal_sbmodel_KDataPointv
-}
-func init() {
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_KDataPoint = __VDLType_v_io_x_sensorlog_internal_sbmodel_KDataPoint_gen()
-}
-
-var __VDLType_v_io_x_sensorlog_internal_sbmodel_KDeviceCfg *vdl.Type = vdl.TypeOf(KDeviceCfg{})
-var __VDLType_v_io_x_sensorlog_internal_sbmodel_KStreamDef *vdl.Type = vdl.TypeOf(KStreamDef{})
-var __VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDef *vdl.Type
-
-func __VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDef_gen() *vdl.Type {
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDefBuilder := vdl.TypeBuilder{}
-
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDef1 := __VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDefBuilder.Struct()
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDef2 := __VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDefBuilder.Named("v.io/x/sensorlog/internal/sbmodel.SamplerDef").AssignBase(__VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDef1)
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDef3 := vdl.StringType
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDef1.AppendField("Script", __VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDef3)
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDef4 := __VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDefBuilder.Struct()
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDef5 := __VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDefBuilder.Named("time.Time").AssignBase(__VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDef4)
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDef6 := vdl.Int64Type
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDef4.AppendField("Seconds", __VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDef6)
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDef7 := vdl.Int32Type
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDef4.AppendField("Nanos", __VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDef7)
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDef1.AppendField("Start", __VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDef5)
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDef8 := __VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDefBuilder.Struct()
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDef9 := __VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDefBuilder.Named("time.Duration").AssignBase(__VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDef8)
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDef8.AppendField("Seconds", __VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDef6)
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDef8.AppendField("Nanos", __VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDef7)
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDef1.AppendField("Interval", __VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDef9)
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDefBuilder.Build()
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDefv, err := __VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDef2.Built()
-	if err != nil {
-		panic(err)
-	}
-	return __VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDefv
-}
-func init() {
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDef = __VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDef_gen()
-}
-
-var __VDLType_v_io_x_sensorlog_internal_sbmodel_VDataPoint *vdl.Type = vdl.TypeOf(VDataPoint(VDataPointValue{float64(0)}))
-var __VDLType_v_io_x_sensorlog_internal_sbmodel_VDeviceCfg *vdl.Type = vdl.TypeOf(VDeviceCfg{})
-var __VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef *vdl.Type
-
-func __VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef_gen() *vdl.Type {
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDefBuilder := vdl.TypeBuilder{}
-
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef1 := __VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDefBuilder.Struct()
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef2 := __VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDefBuilder.Named("v.io/x/sensorlog/internal/sbmodel.VStreamDef").AssignBase(__VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef1)
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef3 := vdl.StringType
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef1.AppendField("Desc", __VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef3)
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef4 := __VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDefBuilder.Struct()
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef5 := __VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDefBuilder.Named("v.io/x/sensorlog/internal/sbmodel.SamplerDef").AssignBase(__VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef4)
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef4.AppendField("Script", __VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef3)
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef6 := __VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDefBuilder.Struct()
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef7 := __VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDefBuilder.Named("time.Time").AssignBase(__VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef6)
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef8 := vdl.Int64Type
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef6.AppendField("Seconds", __VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef8)
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef9 := vdl.Int32Type
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef6.AppendField("Nanos", __VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef9)
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef4.AppendField("Start", __VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef7)
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef10 := __VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDefBuilder.Struct()
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef11 := __VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDefBuilder.Named("time.Duration").AssignBase(__VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef10)
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef10.AppendField("Seconds", __VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef8)
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef10.AppendField("Nanos", __VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef9)
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef4.AppendField("Interval", __VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef11)
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef1.AppendField("Sampler", __VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef5)
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef12 := vdl.BoolType
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef1.AppendField("Enabled", __VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef12)
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDefBuilder.Build()
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDefv, err := __VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef2.Built()
-	if err != nil {
-		panic(err)
-	}
-	return __VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDefv
-}
-func init() {
-	__VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef = __VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef_gen()
-}
-func __VDLEnsureNativeBuilt() {
-	if __VDLType5 == nil {
-		__VDLType5 = __VDLType5_gen()
-	}
-	if __VDLType4 == nil {
-		__VDLType4 = __VDLType4_gen()
-	}
-	if __VDLType2 == nil {
-		__VDLType2 = __VDLType2_gen()
-	}
-	if __VDLType_time_Duration == nil {
-		__VDLType_time_Duration = __VDLType_time_Duration_gen()
-	}
-	if __VDLType_time_Time == nil {
-		__VDLType_time_Time = __VDLType_time_Time_gen()
-	}
-	if __VDLType_v_io_x_sensorlog_internal_sbmodel_KDataPoint == nil {
-		__VDLType_v_io_x_sensorlog_internal_sbmodel_KDataPoint = __VDLType_v_io_x_sensorlog_internal_sbmodel_KDataPoint_gen()
-	}
-	if __VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDef == nil {
-		__VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDef = __VDLType_v_io_x_sensorlog_internal_sbmodel_SamplerDef_gen()
-	}
-	if __VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef == nil {
-		__VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef = __VDLType_v_io_x_sensorlog_internal_sbmodel_VStreamDef_gen()
-	}
+	return struct{}{}
 }
