diff --git a/go/src/v.io/x/js.core/stress/stress.vdl.go b/go/src/v.io/x/js.core/stress/stress.vdl.go
index 813e43a..eec281d 100644
--- a/go/src/v.io/x/js.core/stress/stress.vdl.go
+++ b/go/src/v.io/x/js.core/stress/stress.vdl.go
@@ -8,6 +8,7 @@
 package stress
 
 import (
+	"fmt"
 	"time"
 	"v.io/v23"
 	"v.io/v23/context"
@@ -29,7 +30,6 @@
 }
 
 func (m *StressResults) FillVDLTarget(t vdl.Target, tt *vdl.Type) error {
-
 	if __VDLType_stress_v_io_x_js_core_stress_StressResults == nil || __VDLTypestress0 == nil {
 		panic("Initialization order error: types generated for FillVDLTarget not initialized. Consider moving caller to an init() block.")
 	}
@@ -81,6 +81,40 @@
 }
 
 func (m *StressResults) MakeVDLTarget() vdl.Target {
+	return &StressResultsTarget{Value: m}
+}
+
+type StressResultsTarget struct {
+	Value *StressResults
+	vdl.TargetBase
+	vdl.FieldsTargetBase
+}
+
+func (t *StressResultsTarget) StartFields(tt *vdl.Type) (vdl.FieldsTarget, error) {
+	if !vdl.Compatible(tt, __VDLType_stress_v_io_x_js_core_stress_StressResults) {
+		return nil, fmt.Errorf("type %v incompatible with %v", tt, __VDLType_stress_v_io_x_js_core_stress_StressResults)
+	}
+	return t, nil
+}
+func (t *StressResultsTarget) StartField(name string) (key, field vdl.Target, _ error) {
+	switch name {
+	case "Iterations":
+		val, err := &vdl.Int64Target{Value: &t.Value.Iterations}, error(nil)
+		return nil, val, err
+	case "Qps":
+		val, err := &vdl.Float64Target{Value: &t.Value.Qps}, error(nil)
+		return nil, val, err
+	case "MsecsPerRpc":
+		val, err := &vdl.Float64Target{Value: &t.Value.MsecsPerRpc}, error(nil)
+		return nil, val, err
+	default:
+		return nil, nil, fmt.Errorf("field %s not in struct %v", name, __VDLType_stress_v_io_x_js_core_stress_StressResults)
+	}
+}
+func (t *StressResultsTarget) FinishField(_, _ vdl.Target) error {
+	return nil
+}
+func (t *StressResultsTarget) FinishFields(_ vdl.FieldsTarget) error {
 	return nil
 }
 
diff --git a/go/src/v.io/x/js.core/test_service/cache.vdl.go b/go/src/v.io/x/js.core/test_service/cache.vdl.go
index 1b9f7c2..867be1b 100644
--- a/go/src/v.io/x/js.core/test_service/cache.vdl.go
+++ b/go/src/v.io/x/js.core/test_service/cache.vdl.go
@@ -8,7 +8,9 @@
 package test_service
 
 import (
+	"fmt"
 	"io"
+	"reflect"
 	"v.io/v23"
 	"v.io/v23/context"
 	"v.io/v23/rpc"
@@ -24,13 +26,12 @@
 }) {
 }
 
-func (m KeyPageResult) FillVDLTarget(t vdl.Target, tt *vdl.Type) error {
-
+func (m *KeyPageResult) FillVDLTarget(t vdl.Target, tt *vdl.Type) error {
 	listTarget1, err := t.StartList(__VDLType_cache_v_io_x_js_core_test_service_KeyPageResult, 10)
 	if err != nil {
 		return err
 	}
-	for i, elem3 := range m {
+	for i, elem3 := range *m {
 		elemTarget2, err := listTarget1.StartElem(i)
 		if err != nil {
 			return err
@@ -48,7 +49,29 @@
 	return nil
 }
 
-func (m KeyPageResult) MakeVDLTarget() vdl.Target {
+func (m *KeyPageResult) MakeVDLTarget() vdl.Target {
+	return &KeyPageResultTarget{Value: m}
+}
+
+type KeyPageResultTarget struct {
+	Value *KeyPageResult
+	vdl.TargetBase
+	vdl.ListTargetBase
+}
+
+func (t *KeyPageResultTarget) StartList(tt *vdl.Type, len int) (vdl.ListTarget, error) {
+	if !vdl.Compatible(tt, __VDLType_cache_v_io_x_js_core_test_service_KeyPageResult) {
+		return nil, fmt.Errorf("type %v incompatible with %v", tt, __VDLType_cache_v_io_x_js_core_test_service_KeyPageResult)
+	}
+	return t, nil
+}
+func (t *KeyPageResultTarget) StartElem(index int) (elem vdl.Target, _ error) {
+	return &vdl.StringTarget{Value: &(*t.Value)[index]}, error(nil)
+}
+func (t *KeyPageResultTarget) FinishElem(elem vdl.Target) error {
+	return nil
+}
+func (t *KeyPageResultTarget) FinishList(elem vdl.ListTarget) error {
 	return nil
 }
 
@@ -64,7 +87,6 @@
 }
 
 func (m *KeyValuePair) FillVDLTarget(t vdl.Target, tt *vdl.Type) error {
-
 	if __VDLType_cache_v_io_x_js_core_test_service_KeyValuePair == nil || __VDLTypecache0 == nil {
 		panic("Initialization order error: types generated for FillVDLTarget not initialized. Consider moving caller to an init() block.")
 	}
@@ -111,6 +133,37 @@
 }
 
 func (m *KeyValuePair) MakeVDLTarget() vdl.Target {
+	return &KeyValuePairTarget{Value: m}
+}
+
+type KeyValuePairTarget struct {
+	Value *KeyValuePair
+	vdl.TargetBase
+	vdl.FieldsTargetBase
+}
+
+func (t *KeyValuePairTarget) StartFields(tt *vdl.Type) (vdl.FieldsTarget, error) {
+	if !vdl.Compatible(tt, __VDLType_cache_v_io_x_js_core_test_service_KeyValuePair) {
+		return nil, fmt.Errorf("type %v incompatible with %v", tt, __VDLType_cache_v_io_x_js_core_test_service_KeyValuePair)
+	}
+	return t, nil
+}
+func (t *KeyValuePairTarget) StartField(name string) (key, field vdl.Target, _ error) {
+	switch name {
+	case "Key":
+		val, err := &vdl.StringTarget{Value: &t.Value.Key}, error(nil)
+		return nil, val, err
+	case "Value":
+		val, err := vdl.ReflectTarget(reflect.ValueOf(&t.Value.Value))
+		return nil, val, err
+	default:
+		return nil, nil, fmt.Errorf("field %s not in struct %v", name, __VDLType_cache_v_io_x_js_core_test_service_KeyValuePair)
+	}
+}
+func (t *KeyValuePairTarget) FinishField(_, _ vdl.Target) error {
+	return nil
+}
+func (t *KeyValuePairTarget) FinishFields(_ vdl.FieldsTarget) error {
 	return nil
 }
 
diff --git a/go/src/v.io/x/js.core/test_service/invoke_method_caveat_id.vdl.go b/go/src/v.io/x/js.core/test_service/invoke_method_caveat_id.vdl.go
index 5a316df..50310f3 100644
--- a/go/src/v.io/x/js.core/test_service/invoke_method_caveat_id.vdl.go
+++ b/go/src/v.io/x/js.core/test_service/invoke_method_caveat_id.vdl.go
@@ -8,6 +8,8 @@
 package test_service
 
 import (
+	"fmt"
+	"reflect"
 	"v.io/v23"
 	"v.io/v23/context"
 	"v.io/v23/rpc"
@@ -28,7 +30,6 @@
 }
 
 func (m *TestCaveatData) FillVDLTarget(t vdl.Target, tt *vdl.Type) error {
-
 	if __VDLType_invoke_method_caveat_id_v_io_x_js_core_test_service_TestCaveatData == nil || __VDLTypeinvoke_method_caveat_id0 == nil {
 		panic("Initialization order error: types generated for FillVDLTarget not initialized. Consider moving caller to an init() block.")
 	}
@@ -75,6 +76,37 @@
 }
 
 func (m *TestCaveatData) MakeVDLTarget() vdl.Target {
+	return &TestCaveatDataTarget{Value: m}
+}
+
+type TestCaveatDataTarget struct {
+	Value *TestCaveatData
+	vdl.TargetBase
+	vdl.FieldsTargetBase
+}
+
+func (t *TestCaveatDataTarget) StartFields(tt *vdl.Type) (vdl.FieldsTarget, error) {
+	if !vdl.Compatible(tt, __VDLType_invoke_method_caveat_id_v_io_x_js_core_test_service_TestCaveatData) {
+		return nil, fmt.Errorf("type %v incompatible with %v", tt, __VDLType_invoke_method_caveat_id_v_io_x_js_core_test_service_TestCaveatData)
+	}
+	return t, nil
+}
+func (t *TestCaveatDataTarget) StartField(name string) (key, field vdl.Target, _ error) {
+	switch name {
+	case "A":
+		val, err := &vdl.StringTarget{Value: &t.Value.A}, error(nil)
+		return nil, val, err
+	case "B":
+		val, err := vdl.ReflectTarget(reflect.ValueOf(&t.Value.B))
+		return nil, val, err
+	default:
+		return nil, nil, fmt.Errorf("field %s not in struct %v", name, __VDLType_invoke_method_caveat_id_v_io_x_js_core_test_service_TestCaveatData)
+	}
+}
+func (t *TestCaveatDataTarget) FinishField(_, _ vdl.Target) error {
+	return nil
+}
+func (t *TestCaveatDataTarget) FinishFields(_ vdl.FieldsTarget) error {
 	return nil
 }
 
