diff --git a/go/src/v.io/x/sensorlog/internal/sbmodel/types.vdl.go b/go/src/v.io/x/sensorlog/internal/sbmodel/types.vdl.go
index 4d9a94e..c7d9539 100644
--- a/go/src/v.io/x/sensorlog/internal/sbmodel/types.vdl.go
+++ b/go/src/v.io/x/sensorlog/internal/sbmodel/types.vdl.go
@@ -14,6 +14,8 @@
 package sbmodel
 
 import (
+	"fmt"
+	"reflect"
 	"time"
 	"v.io/v23/vdl"
 	time_2 "v.io/v23/vdlroot/time"
@@ -34,7 +36,6 @@
 }
 
 func (m *VDeviceCfg) FillVDLTarget(t vdl.Target, tt *vdl.Type) error {
-
 	if __VDLType_types_v_io_x_sensorlog_internal_sbmodel_VDeviceCfg == nil || __VDLTypetypes0 == nil {
 		panic("Initialization order error: types generated for FillVDLTarget not initialized. Consider moving caller to an init() block.")
 	}
@@ -74,6 +75,37 @@
 }
 
 func (m *VDeviceCfg) MakeVDLTarget() vdl.Target {
+	return &VDeviceCfgTarget{Value: m}
+}
+
+type VDeviceCfgTarget struct {
+	Value *VDeviceCfg
+	vdl.TargetBase
+	vdl.FieldsTargetBase
+}
+
+func (t *VDeviceCfgTarget) StartFields(tt *vdl.Type) (vdl.FieldsTarget, error) {
+	if !vdl.Compatible(tt, __VDLType_types_v_io_x_sensorlog_internal_sbmodel_VDeviceCfg) {
+		return nil, fmt.Errorf("type %v incompatible with %v", tt, __VDLType_types_v_io_x_sensorlog_internal_sbmodel_VDeviceCfg)
+	}
+	return t, nil
+}
+func (t *VDeviceCfgTarget) StartField(name string) (key, field vdl.Target, _ error) {
+	switch name {
+	case "Desc":
+		val, err := &vdl.StringTarget{Value: &t.Value.Desc}, error(nil)
+		return nil, val, err
+	case "SgPublishSb":
+		val, err := &vdl.StringTarget{Value: &t.Value.SgPublishSb}, error(nil)
+		return nil, val, err
+	default:
+		return nil, nil, fmt.Errorf("field %s not in struct %v", name, __VDLType_types_v_io_x_sensorlog_internal_sbmodel_VDeviceCfg)
+	}
+}
+func (t *VDeviceCfgTarget) FinishField(_, _ vdl.Target) error {
+	return nil
+}
+func (t *VDeviceCfgTarget) FinishFields(_ vdl.FieldsTarget) error {
 	return nil
 }
 
@@ -87,7 +119,6 @@
 }
 
 func (m *KDeviceCfg) FillVDLTarget(t vdl.Target, tt *vdl.Type) error {
-
 	if __VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDeviceCfg == nil || __VDLTypetypes1 == nil {
 		panic("Initialization order error: types generated for FillVDLTarget not initialized. Consider moving caller to an init() block.")
 	}
@@ -115,6 +146,34 @@
 }
 
 func (m *KDeviceCfg) MakeVDLTarget() vdl.Target {
+	return &KDeviceCfgTarget{Value: m}
+}
+
+type KDeviceCfgTarget struct {
+	Value *KDeviceCfg
+	vdl.TargetBase
+	vdl.FieldsTargetBase
+}
+
+func (t *KDeviceCfgTarget) StartFields(tt *vdl.Type) (vdl.FieldsTarget, error) {
+	if !vdl.Compatible(tt, __VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDeviceCfg) {
+		return nil, fmt.Errorf("type %v incompatible with %v", tt, __VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDeviceCfg)
+	}
+	return t, nil
+}
+func (t *KDeviceCfgTarget) StartField(name string) (key, field vdl.Target, _ error) {
+	switch name {
+	case "DevId":
+		val, err := &vdl.StringTarget{Value: &t.Value.DevId}, error(nil)
+		return nil, val, err
+	default:
+		return nil, nil, fmt.Errorf("field %s not in struct %v", name, __VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDeviceCfg)
+	}
+}
+func (t *KDeviceCfgTarget) FinishField(_, _ vdl.Target) error {
+	return nil
+}
+func (t *KDeviceCfgTarget) FinishFields(_ vdl.FieldsTarget) error {
 	return nil
 }
 
@@ -135,7 +194,6 @@
 }
 
 func (m *VStreamDef) FillVDLTarget(t vdl.Target, tt *vdl.Type) error {
-
 	__VDLEnsureNativeBuilt_types()
 	fieldsTarget1, err := t.StartFields(tt)
 	if err != nil {
@@ -186,6 +244,74 @@
 }
 
 func (m *VStreamDef) MakeVDLTarget() vdl.Target {
+	return &VStreamDefTarget{Value: m}
+}
+
+type VStreamDefTarget struct {
+	Value *VStreamDef
+	vdl.TargetBase
+	vdl.FieldsTargetBase
+}
+
+func (t *VStreamDefTarget) StartFields(tt *vdl.Type) (vdl.FieldsTarget, error) {
+	if !vdl.Compatible(tt, __VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef) {
+		return nil, fmt.Errorf("type %v incompatible with %v", tt, __VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef)
+	}
+	return t, nil
+}
+func (t *VStreamDefTarget) StartField(name string) (key, field vdl.Target, _ error) {
+	switch name {
+	case "Desc":
+		val, err := &vdl.StringTarget{Value: &t.Value.Desc}, error(nil)
+		return nil, val, err
+	case "Sampler":
+		val, err := &SamplerDefTarget{Value: &t.Value.Sampler}, error(nil)
+		return nil, val, err
+	case "Enabled":
+		val, err := &vdl.BoolTarget{Value: &t.Value.Enabled}, error(nil)
+		return nil, val, err
+	default:
+		return nil, nil, fmt.Errorf("field %s not in struct %v", name, __VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef)
+	}
+}
+func (t *VStreamDefTarget) FinishField(_, _ vdl.Target) error {
+	return nil
+}
+func (t *VStreamDefTarget) FinishFields(_ vdl.FieldsTarget) error {
+	return nil
+}
+
+type SamplerDefTarget struct {
+	Value *SamplerDef
+	vdl.TargetBase
+	vdl.FieldsTargetBase
+}
+
+func (t *SamplerDefTarget) StartFields(tt *vdl.Type) (vdl.FieldsTarget, error) {
+	if !vdl.Compatible(tt, __VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDef) {
+		return nil, fmt.Errorf("type %v incompatible with %v", tt, __VDLType_types_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":
+		val, err := &vdl.StringTarget{Value: &t.Value.Script}, error(nil)
+		return nil, val, err
+	case "Start":
+		val, err := vdl.ReflectTarget(reflect.ValueOf(&t.Value.Start))
+		return nil, val, err
+	case "Interval":
+		val, err := vdl.ReflectTarget(reflect.ValueOf(&t.Value.Interval))
+		return nil, val, err
+	default:
+		return nil, nil, fmt.Errorf("field %s not in struct %v", name, __VDLType_types_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
 }
 
@@ -200,7 +326,6 @@
 }
 
 func (m *KStreamDef) FillVDLTarget(t vdl.Target, tt *vdl.Type) error {
-
 	if __VDLType_types_v_io_x_sensorlog_internal_sbmodel_KStreamDef == nil || __VDLTypetypes3 == nil {
 		panic("Initialization order error: types generated for FillVDLTarget not initialized. Consider moving caller to an init() block.")
 	}
@@ -240,6 +365,37 @@
 }
 
 func (m *KStreamDef) MakeVDLTarget() vdl.Target {
+	return &KStreamDefTarget{Value: m}
+}
+
+type KStreamDefTarget struct {
+	Value *KStreamDef
+	vdl.TargetBase
+	vdl.FieldsTargetBase
+}
+
+func (t *KStreamDefTarget) StartFields(tt *vdl.Type) (vdl.FieldsTarget, error) {
+	if !vdl.Compatible(tt, __VDLType_types_v_io_x_sensorlog_internal_sbmodel_KStreamDef) {
+		return nil, fmt.Errorf("type %v incompatible with %v", tt, __VDLType_types_v_io_x_sensorlog_internal_sbmodel_KStreamDef)
+	}
+	return t, nil
+}
+func (t *KStreamDefTarget) StartField(name string) (key, field vdl.Target, _ error) {
+	switch name {
+	case "DevId":
+		val, err := &vdl.StringTarget{Value: &t.Value.DevId}, error(nil)
+		return nil, val, err
+	case "StreamId":
+		val, err := &vdl.StringTarget{Value: &t.Value.StreamId}, error(nil)
+		return nil, val, err
+	default:
+		return nil, nil, fmt.Errorf("field %s not in struct %v", name, __VDLType_types_v_io_x_sensorlog_internal_sbmodel_KStreamDef)
+	}
+}
+func (t *KStreamDefTarget) FinishField(_, _ vdl.Target) error {
+	return nil
+}
+func (t *KStreamDefTarget) FinishFields(_ vdl.FieldsTarget) error {
 	return nil
 }
 
@@ -259,7 +415,6 @@
 }
 
 func (m *SamplerDef) FillVDLTarget(t vdl.Target, tt *vdl.Type) error {
-
 	__VDLEnsureNativeBuilt_types()
 	fieldsTarget1, err := t.StartFields(tt)
 	if err != nil {
@@ -321,7 +476,7 @@
 }
 
 func (m *SamplerDef) MakeVDLTarget() vdl.Target {
-	return nil
+	return &SamplerDefTarget{Value: m}
 }
 
 // sdata : <DevId>/<StreamId>/<Timestamp>
@@ -338,7 +493,6 @@
 }
 
 func (m *KDataPoint) FillVDLTarget(t vdl.Target, tt *vdl.Type) error {
-
 	__VDLEnsureNativeBuilt_types()
 	fieldsTarget1, err := t.StartFields(tt)
 	if err != nil {
@@ -394,6 +548,40 @@
 }
 
 func (m *KDataPoint) MakeVDLTarget() vdl.Target {
+	return &KDataPointTarget{Value: m}
+}
+
+type KDataPointTarget struct {
+	Value *KDataPoint
+	vdl.TargetBase
+	vdl.FieldsTargetBase
+}
+
+func (t *KDataPointTarget) StartFields(tt *vdl.Type) (vdl.FieldsTarget, error) {
+	if !vdl.Compatible(tt, __VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDataPoint) {
+		return nil, fmt.Errorf("type %v incompatible with %v", tt, __VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDataPoint)
+	}
+	return t, nil
+}
+func (t *KDataPointTarget) StartField(name string) (key, field vdl.Target, _ error) {
+	switch name {
+	case "DevId":
+		val, err := &vdl.StringTarget{Value: &t.Value.DevId}, error(nil)
+		return nil, val, err
+	case "StreamId":
+		val, err := &vdl.StringTarget{Value: &t.Value.StreamId}, error(nil)
+		return nil, val, err
+	case "Timestamp":
+		val, err := vdl.ReflectTarget(reflect.ValueOf(&t.Value.Timestamp))
+		return nil, val, err
+	default:
+		return nil, nil, fmt.Errorf("field %s not in struct %v", name, __VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDataPoint)
+	}
+}
+func (t *KDataPointTarget) FinishField(_, _ vdl.Target) error {
+	return nil
+}
+func (t *KDataPointTarget) FinishFields(_ vdl.FieldsTarget) error {
 	return nil
 }
 
@@ -431,7 +619,6 @@
 func (x VDataPointValue) __VDLReflect(__VDataPointReflect) {}
 
 func (m VDataPointValue) FillVDLTarget(t vdl.Target, tt *vdl.Type) error {
-
 	fieldsTarget1, err := t.StartFields(__VDLType_types_v_io_x_sensorlog_internal_sbmodel_VDataPoint)
 	if err != nil {
 		return err
@@ -463,7 +650,6 @@
 func (x VDataPointError) __VDLReflect(__VDataPointReflect) {}
 
 func (m VDataPointError) FillVDLTarget(t vdl.Target, tt *vdl.Type) error {
-
 	fieldsTarget1, err := t.StartFields(__VDLType_types_v_io_x_sensorlog_internal_sbmodel_VDataPoint)
 	if err != nil {
 		return err
