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 4aad326..c7e5a64 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
@@ -17,7 +17,7 @@
 	"fmt"
 	"time"
 	"v.io/v23/vdl"
-	time_2 "v.io/v23/vdlroot/time"
+	vdltime "v.io/v23/vdlroot/time"
 )
 
 var _ = __VDLInit() // Must be first; see __VDLInit comments for details.
@@ -141,8 +141,8 @@
 	return nil
 }
 
-func (x VDeviceCfg) VDLIsZero() (bool, error) {
-	return x == VDeviceCfg{}, nil
+func (x VDeviceCfg) VDLIsZero() bool {
+	return x == VDeviceCfg{}
 }
 
 func (x VDeviceCfg) VDLWrite(enc vdl.Encoder) error {
@@ -153,7 +153,7 @@
 		if err := enc.NextField("Desc"); err != nil {
 			return err
 		}
-		if err := enc.StartValue(vdl.TypeOf((*string)(nil))); err != nil {
+		if err := enc.StartValue(vdl.StringType); err != nil {
 			return err
 		}
 		if err := enc.EncodeString(x.Desc); err != nil {
@@ -167,7 +167,7 @@
 		if err := enc.NextField("SgPublishSb"); err != nil {
 			return err
 		}
-		if err := enc.StartValue(vdl.TypeOf((*string)(nil))); err != nil {
+		if err := enc.StartValue(vdl.StringType); err != nil {
 			return err
 		}
 		if err := enc.EncodeString(x.SgPublishSb); err != nil {
@@ -313,8 +313,8 @@
 	return nil
 }
 
-func (x KDeviceCfg) VDLIsZero() (bool, error) {
-	return x == KDeviceCfg{}, nil
+func (x KDeviceCfg) VDLIsZero() bool {
+	return x == KDeviceCfg{}
 }
 
 func (x KDeviceCfg) VDLWrite(enc vdl.Encoder) error {
@@ -325,7 +325,7 @@
 		if err := enc.NextField("DevId"); err != nil {
 			return err
 		}
-		if err := enc.StartValue(vdl.TypeOf((*string)(nil))); err != nil {
+		if err := enc.StartValue(vdl.StringType); err != nil {
 			return err
 		}
 		if err := enc.EncodeString(x.DevId); err != nil {
@@ -415,12 +415,12 @@
 			}
 		}
 	}
-	var wireValue5 time_2.Time
-	if err := time_2.TimeFromNative(&wireValue5, m.Start); err != nil {
+	var wireValue5 vdltime.Time
+	if err := vdltime.TimeFromNative(&wireValue5, m.Start); err != nil {
 		return err
 	}
 
-	var8 := (wireValue5 == time_2.Time{})
+	var8 := (wireValue5 == vdltime.Time{})
 	if var8 {
 		if err := fieldsTarget1.ZeroField("Start"); err != nil && err != vdl.ErrFieldNoExist {
 			return err
@@ -440,12 +440,12 @@
 			}
 		}
 	}
-	var wireValue9 time_2.Duration
-	if err := time_2.DurationFromNative(&wireValue9, m.Interval); err != nil {
+	var wireValue9 vdltime.Duration
+	if err := vdltime.DurationFromNative(&wireValue9, m.Interval); err != nil {
 		return err
 	}
 
-	var12 := (wireValue9 == time_2.Duration{})
+	var12 := (wireValue9 == vdltime.Duration{})
 	if var12 {
 		if err := fieldsTarget1.ZeroField("Interval"); err != nil && err != vdl.ErrFieldNoExist {
 			return err
@@ -478,8 +478,8 @@
 type SamplerDefTarget struct {
 	Value          *SamplerDef
 	scriptTarget   vdl.StringTarget
-	startTarget    time_2.TimeTarget
-	intervalTarget time_2.DurationTarget
+	startTarget    vdltime.TimeTarget
+	intervalTarget vdltime.DurationTarget
 	vdl.TargetBase
 	vdl.FieldsTargetBase
 }
@@ -518,22 +518,10 @@
 		t.Value.Script = ""
 		return nil
 	case "Start":
-		t.Value.Start = func() time.Time {
-			var native time.Time
-			if err := vdl.Convert(&native, time_2.Time{}); err != nil {
-				panic(err)
-			}
-			return native
-		}()
+		t.Value.Start = time.Time{}
 		return nil
 	case "Interval":
-		t.Value.Interval = func() time.Duration {
-			var native time.Duration
-			if err := vdl.Convert(&native, time_2.Duration{}); err != nil {
-				panic(err)
-			}
-			return native
-		}()
+		t.Value.Interval = time.Duration(0)
 		return nil
 	default:
 		return fmt.Errorf("field %s not in struct v.io/x/sensorlog/internal/sbmodel.SamplerDef", name)
@@ -544,25 +532,17 @@
 	return nil
 }
 
-func (x SamplerDef) VDLIsZero() (bool, error) {
+func (x SamplerDef) VDLIsZero() bool {
 	if x.Script != "" {
-		return false, nil
+		return false
 	}
-	var wireStart time_2.Time
-	if err := time_2.TimeFromNative(&wireStart, x.Start); err != nil {
-		return false, err
+	if !x.Start.IsZero() {
+		return false
 	}
-	if wireStart != (time_2.Time{}) {
-		return false, nil
+	if x.Interval != time.Duration(0) {
+		return false
 	}
-	var wireInterval time_2.Duration
-	if err := time_2.DurationFromNative(&wireInterval, x.Interval); err != nil {
-		return false, err
-	}
-	if wireInterval != (time_2.Duration{}) {
-		return false, nil
-	}
-	return true, nil
+	return true
 }
 
 func (x SamplerDef) VDLWrite(enc vdl.Encoder) error {
@@ -573,7 +553,7 @@
 		if err := enc.NextField("Script"); err != nil {
 			return err
 		}
-		if err := enc.StartValue(vdl.TypeOf((*string)(nil))); err != nil {
+		if err := enc.StartValue(vdl.StringType); err != nil {
 			return err
 		}
 		if err := enc.EncodeString(x.Script); err != nil {
@@ -583,27 +563,27 @@
 			return err
 		}
 	}
-	var wireStart time_2.Time
-	if err := time_2.TimeFromNative(&wireStart, x.Start); err != nil {
-		return err
-	}
-	if wireStart != (time_2.Time{}) {
+	if !x.Start.IsZero() {
 		if err := enc.NextField("Start"); err != nil {
 			return err
 		}
-		if err := wireStart.VDLWrite(enc); err != nil {
+		var wire vdltime.Time
+		if err := vdltime.TimeFromNative(&wire, x.Start); err != nil {
+			return err
+		}
+		if err := wire.VDLWrite(enc); err != nil {
 			return err
 		}
 	}
-	var wireInterval time_2.Duration
-	if err := time_2.DurationFromNative(&wireInterval, x.Interval); err != nil {
-		return err
-	}
-	if wireInterval != (time_2.Duration{}) {
+	if x.Interval != time.Duration(0) {
 		if err := enc.NextField("Interval"); err != nil {
 			return err
 		}
-		if err := wireInterval.VDLWrite(enc); err != nil {
+		var wire vdltime.Duration
+		if err := vdltime.DurationFromNative(&wire, x.Interval); err != nil {
+			return err
+		}
+		if err := wire.VDLWrite(enc); err != nil {
 			return err
 		}
 	}
@@ -641,19 +621,19 @@
 				return err
 			}
 		case "Start":
-			var wire time_2.Time
+			var wire vdltime.Time
 			if err := wire.VDLRead(dec); err != nil {
 				return err
 			}
-			if err := time_2.TimeToNative(wire, &x.Start); err != nil {
+			if err := vdltime.TimeToNative(wire, &x.Start); err != nil {
 				return err
 			}
 		case "Interval":
-			var wire time_2.Duration
+			var wire vdltime.Duration
 			if err := wire.VDLRead(dec); err != nil {
 				return err
 			}
-			if err := time_2.DurationToNative(wire, &x.Interval); err != nil {
+			if err := vdltime.DurationToNative(wire, &x.Interval); err != nil {
 				return err
 			}
 		default:
@@ -810,21 +790,17 @@
 	return nil
 }
 
-func (x VStreamDef) VDLIsZero() (bool, error) {
+func (x VStreamDef) VDLIsZero() bool {
 	if x.Desc != "" {
-		return false, nil
+		return false
 	}
-	isZeroSampler, err := x.Sampler.VDLIsZero()
-	if err != nil {
-		return false, err
-	}
-	if !isZeroSampler {
-		return false, nil
+	if !x.Sampler.VDLIsZero() {
+		return false
 	}
 	if x.Enabled {
-		return false, nil
+		return false
 	}
-	return true, nil
+	return true
 }
 
 func (x VStreamDef) VDLWrite(enc vdl.Encoder) error {
@@ -835,7 +811,7 @@
 		if err := enc.NextField("Desc"); err != nil {
 			return err
 		}
-		if err := enc.StartValue(vdl.TypeOf((*string)(nil))); err != nil {
+		if err := enc.StartValue(vdl.StringType); err != nil {
 			return err
 		}
 		if err := enc.EncodeString(x.Desc); err != nil {
@@ -845,11 +821,7 @@
 			return err
 		}
 	}
-	isZeroSampler, err := x.Sampler.VDLIsZero()
-	if err != nil {
-		return err
-	}
-	if !isZeroSampler {
+	if !x.Sampler.VDLIsZero() {
 		if err := enc.NextField("Sampler"); err != nil {
 			return err
 		}
@@ -861,7 +833,7 @@
 		if err := enc.NextField("Enabled"); err != nil {
 			return err
 		}
-		if err := enc.StartValue(vdl.TypeOf((*bool)(nil))); err != nil {
+		if err := enc.StartValue(vdl.BoolType); err != nil {
 			return err
 		}
 		if err := enc.EncodeBool(x.Enabled); err != nil {
@@ -1039,8 +1011,8 @@
 	return nil
 }
 
-func (x KStreamDef) VDLIsZero() (bool, error) {
-	return x == KStreamDef{}, nil
+func (x KStreamDef) VDLIsZero() bool {
+	return x == KStreamDef{}
 }
 
 func (x KStreamDef) VDLWrite(enc vdl.Encoder) error {
@@ -1051,7 +1023,7 @@
 		if err := enc.NextField("DevId"); err != nil {
 			return err
 		}
-		if err := enc.StartValue(vdl.TypeOf((*string)(nil))); err != nil {
+		if err := enc.StartValue(vdl.StringType); err != nil {
 			return err
 		}
 		if err := enc.EncodeString(x.DevId); err != nil {
@@ -1065,7 +1037,7 @@
 		if err := enc.NextField("StreamId"); err != nil {
 			return err
 		}
-		if err := enc.StartValue(vdl.TypeOf((*string)(nil))); err != nil {
+		if err := enc.StartValue(vdl.StringType); err != nil {
 			return err
 		}
 		if err := enc.EncodeString(x.StreamId); err != nil {
@@ -1183,12 +1155,12 @@
 			}
 		}
 	}
-	var wireValue8 time_2.Time
-	if err := time_2.TimeFromNative(&wireValue8, m.Timestamp); err != nil {
+	var wireValue8 vdltime.Time
+	if err := vdltime.TimeFromNative(&wireValue8, m.Timestamp); err != nil {
 		return err
 	}
 
-	var11 := (wireValue8 == time_2.Time{})
+	var11 := (wireValue8 == vdltime.Time{})
 	if var11 {
 		if err := fieldsTarget1.ZeroField("Timestamp"); err != nil && err != vdl.ErrFieldNoExist {
 			return err
@@ -1222,7 +1194,7 @@
 	Value           *KDataPoint
 	devIdTarget     vdl.StringTarget
 	streamIdTarget  vdl.StringTarget
-	timestampTarget time_2.TimeTarget
+	timestampTarget vdltime.TimeTarget
 	vdl.TargetBase
 	vdl.FieldsTargetBase
 }
@@ -1264,13 +1236,7 @@
 		t.Value.StreamId = ""
 		return nil
 	case "Timestamp":
-		t.Value.Timestamp = func() time.Time {
-			var native time.Time
-			if err := vdl.Convert(&native, time_2.Time{}); err != nil {
-				panic(err)
-			}
-			return native
-		}()
+		t.Value.Timestamp = time.Time{}
 		return nil
 	default:
 		return fmt.Errorf("field %s not in struct v.io/x/sensorlog/internal/sbmodel.KDataPoint", name)
@@ -1281,21 +1247,17 @@
 	return nil
 }
 
-func (x KDataPoint) VDLIsZero() (bool, error) {
+func (x KDataPoint) VDLIsZero() bool {
 	if x.DevId != "" {
-		return false, nil
+		return false
 	}
 	if x.StreamId != "" {
-		return false, nil
+		return false
 	}
-	var wireTimestamp time_2.Time
-	if err := time_2.TimeFromNative(&wireTimestamp, x.Timestamp); err != nil {
-		return false, err
+	if !x.Timestamp.IsZero() {
+		return false
 	}
-	if wireTimestamp != (time_2.Time{}) {
-		return false, nil
-	}
-	return true, nil
+	return true
 }
 
 func (x KDataPoint) VDLWrite(enc vdl.Encoder) error {
@@ -1306,7 +1268,7 @@
 		if err := enc.NextField("DevId"); err != nil {
 			return err
 		}
-		if err := enc.StartValue(vdl.TypeOf((*string)(nil))); err != nil {
+		if err := enc.StartValue(vdl.StringType); err != nil {
 			return err
 		}
 		if err := enc.EncodeString(x.DevId); err != nil {
@@ -1320,7 +1282,7 @@
 		if err := enc.NextField("StreamId"); err != nil {
 			return err
 		}
-		if err := enc.StartValue(vdl.TypeOf((*string)(nil))); err != nil {
+		if err := enc.StartValue(vdl.StringType); err != nil {
 			return err
 		}
 		if err := enc.EncodeString(x.StreamId); err != nil {
@@ -1330,15 +1292,15 @@
 			return err
 		}
 	}
-	var wireTimestamp time_2.Time
-	if err := time_2.TimeFromNative(&wireTimestamp, x.Timestamp); err != nil {
-		return err
-	}
-	if wireTimestamp != (time_2.Time{}) {
+	if !x.Timestamp.IsZero() {
 		if err := enc.NextField("Timestamp"); err != nil {
 			return err
 		}
-		if err := wireTimestamp.VDLWrite(enc); err != nil {
+		var wire vdltime.Time
+		if err := vdltime.TimeFromNative(&wire, x.Timestamp); err != nil {
+			return err
+		}
+		if err := wire.VDLWrite(enc); err != nil {
 			return err
 		}
 	}
@@ -1387,11 +1349,11 @@
 				return err
 			}
 		case "Timestamp":
-			var wire time_2.Time
+			var wire vdltime.Time
 			if err := wire.VDLRead(dec); err != nil {
 				return err
 			}
-			if err := time_2.TimeToNative(wire, &x.Timestamp); err != nil {
+			if err := vdltime.TimeToNative(wire, &x.Timestamp); err != nil {
 				return err
 			}
 		default:
@@ -1414,7 +1376,7 @@
 		// __VDLReflect describes the VDataPoint union type.
 		__VDLReflect(__VDataPointReflect)
 		FillVDLTarget(vdl.Target, *vdl.Type) error
-		VDLIsZero() (bool, error)
+		VDLIsZero() bool
 		VDLWrite(vdl.Encoder) error
 	}
 	// VDataPointValue represents field Value of the VDataPoint union type.
@@ -1546,12 +1508,12 @@
 	return nil, fmt.Errorf("got %T, want *VDataPoint", union)
 }
 
-func (x VDataPointValue) VDLIsZero() (bool, error) {
-	return x.Value == 0, nil
+func (x VDataPointValue) VDLIsZero() bool {
+	return x.Value == 0
 }
 
-func (x VDataPointError) VDLIsZero() (bool, error) {
-	return false, nil
+func (x VDataPointError) VDLIsZero() bool {
+	return false
 }
 
 func (x VDataPointValue) VDLWrite(enc vdl.Encoder) error {
@@ -1561,7 +1523,7 @@
 	if err := enc.NextField("Value"); err != nil {
 		return err
 	}
-	if err := enc.StartValue(vdl.TypeOf((*float64)(nil))); err != nil {
+	if err := enc.StartValue(vdl.Float64Type); err != nil {
 		return err
 	}
 	if err := enc.EncodeFloat(x.Value); err != nil {
@@ -1583,7 +1545,7 @@
 	if err := enc.NextField("Error"); err != nil {
 		return err
 	}
-	if err := enc.StartValue(vdl.TypeOf((*string)(nil))); err != nil {
+	if err := enc.StartValue(vdl.StringType); err != nil {
 		return err
 	}
 	if err := enc.EncodeString(x.Value); err != nil {
