diff --git a/Makefile b/Makefile
index a3240c5..010712f 100644
--- a/Makefile
+++ b/Makefile
@@ -20,6 +20,7 @@
 endef
 
 V23_GO_FILES := $(shell find $(JIRI_ROOT) -name "*.go")
+PYTHONPATH := $(MOJO_SDK)/src/mojo/public/third_party:$(PYTHONPATH)
 
 all: build
 
diff --git a/go/src/mojom/vanadium/discovery/discovery.mojom.go b/go/src/mojom/vanadium/discovery/discovery.mojom.go
index ebc0dbf..44df270 100644
--- a/go/src/mojom/vanadium/discovery/discovery.mojom.go
+++ b/go/src/mojom/vanadium/discovery/discovery.mojom.go
@@ -19,85 +19,6 @@
 	sort "sort"
 )
 
-// These IDs are the Mojom Identifiers / Type Keys.
-// Mojom libraries importing this one will use these identifiers when building
-// TypeReference objects.
-var ID_discovery_UpdateType__ string = "discovery_UpdateType__"
-var ID_discovery_Service__ string = "discovery_Service__"
-var ID_discovery_Update__ string = "discovery_Update__"
-var ID_discovery_Error__ string = "discovery_Error__"
-var ID_discovery_Advertiser__ string = "discovery_Advertiser__"
-var ID_discovery_Scanner__ string = "discovery_Scanner__"
-var ID_discovery_ScanHandler__ string = "discovery_ScanHandler__"
-
-var discoveryDesc__ = make(map[string]mojom_types.UserDefinedType)
-
-func init() {
-	discoveryDesc__["discovery_UpdateType__"] = &mojom_types.UserDefinedTypeEnumType{
-		Value: discovery_UpdateType__(),
-	}
-	discoveryDesc__["discovery_Service__"] = &mojom_types.UserDefinedTypeStructType{
-		Value: discovery_Service__(),
-	}
-
-	discoveryDesc__["discovery_Update__"] = &mojom_types.UserDefinedTypeStructType{
-		Value: discovery_Update__(),
-	}
-
-	discoveryDesc__["discovery_Error__"] = &mojom_types.UserDefinedTypeStructType{
-		Value: discovery_Error__(),
-	}
-
-	discoveryDesc__["discovery_Advertiser__"] = &mojom_types.UserDefinedTypeInterfaceType{
-		Value: discovery_Advertiser__(),
-	}
-	discoveryDesc__["discovery_Advertiser_Advertise_Params__"] = &mojom_types.UserDefinedTypeStructType{
-		Value: discovery_Advertiser_Advertise_Params__(),
-	}
-
-	discoveryDesc__["discovery_Advertiser_Advertise_ResponseParams__"] = &mojom_types.UserDefinedTypeStructType{
-		Value: discovery_Advertiser_Advertise_ResponseParams__(),
-	}
-
-	discoveryDesc__["discovery_Advertiser_Stop_Params__"] = &mojom_types.UserDefinedTypeStructType{
-		Value: discovery_Advertiser_Stop_Params__(),
-	}
-
-	discoveryDesc__["discovery_Advertiser_Stop_ResponseParams__"] = &mojom_types.UserDefinedTypeStructType{
-		Value: discovery_Advertiser_Stop_ResponseParams__(),
-	}
-
-	discoveryDesc__["discovery_Scanner__"] = &mojom_types.UserDefinedTypeInterfaceType{
-		Value: discovery_Scanner__(),
-	}
-	discoveryDesc__["discovery_Scanner_Scan_Params__"] = &mojom_types.UserDefinedTypeStructType{
-		Value: discovery_Scanner_Scan_Params__(),
-	}
-
-	discoveryDesc__["discovery_ScanHandler__"] = &mojom_types.UserDefinedTypeInterfaceType{
-		Value: discovery_ScanHandler__(),
-	}
-	discoveryDesc__["discovery_ScanHandler_Update_Params__"] = &mojom_types.UserDefinedTypeStructType{
-		Value: discovery_ScanHandler_Update_Params__(),
-	}
-
-	discoveryDesc__["discovery_Scanner_Scan_ResponseParams__"] = &mojom_types.UserDefinedTypeStructType{
-		Value: discovery_Scanner_Scan_ResponseParams__(),
-	}
-
-	discoveryDesc__["discovery_Scanner_Stop_Params__"] = &mojom_types.UserDefinedTypeStructType{
-		Value: discovery_Scanner_Stop_Params__(),
-	}
-
-	discoveryDesc__["discovery_Scanner_Stop_ResponseParams__"] = &mojom_types.UserDefinedTypeStructType{
-		Value: discovery_Scanner_Stop_ResponseParams__(),
-	}
-
-}
-func GetAllMojomTypeDefinitions() map[string]mojom_types.UserDefinedType {
-	return discoveryDesc__
-}
-
 type UpdateType int32
 
 const (
@@ -105,36 +26,6 @@
 	UpdateType_Lost  = UpdateType_Found + 1
 )
 
-// String names and labels used by the MojomEnum types.
-var (
-	enumName_UpdateType            = "UpdateType"
-	enumFullIdentifier_UpdateType  = "discovery.UpdateType"
-	enumFieldName_UpdateType_Found = "Found"
-	enumFieldName_UpdateType_Lost  = "Lost"
-)
-
-func discovery_UpdateType__() mojom_types.MojomEnum {
-	return mojom_types.MojomEnum{
-		DeclData: &mojom_types.DeclarationData{
-			ShortName:      &enumName_UpdateType,
-			FullIdentifier: &enumFullIdentifier_UpdateType,
-		},
-		Values: []mojom_types.EnumValue{mojom_types.EnumValue{
-			DeclData: &mojom_types.DeclarationData{
-				ShortName: &enumFieldName_UpdateType_Found,
-			},
-			EnumTypeKey: ID_discovery_UpdateType__,
-			IntValue:    int32(1),
-		}, mojom_types.EnumValue{
-			DeclData: &mojom_types.DeclarationData{
-				ShortName: &enumFieldName_UpdateType_Lost,
-			},
-			EnumTypeKey: ID_discovery_UpdateType__,
-			IntValue:    int32(2),
-		}},
-	}
-}
-
 type Advertiser interface {
 	Advertise(inService Service, inVisibility *[]string) (outHandle uint32, outInstanceId string, outErr *Error, err error)
 	Stop(inH uint32) (outErr *Error, err error)
@@ -315,38 +206,6 @@
 	return nil
 }
 
-// String names and labels used by the MojomStruct types.
-var (
-	structName_AdvertiserAdvertiseParams                   = "AdvertiserAdvertiseParams"
-	structFullIdentifier_AdvertiserAdvertiseParams         = "discovery.AdvertiserAdvertiseParams"
-	structFieldName_AdvertiserAdvertiseParams_InService    = "InService"
-	structFieldName_AdvertiserAdvertiseParams_InVisibility = "InVisibility"
-)
-
-func discovery_Advertiser_Advertise_Params__() mojom_types.MojomStruct {
-	return mojom_types.MojomStruct{
-		DeclData: &mojom_types.DeclarationData{
-			ShortName:      &structName_AdvertiserAdvertiseParams,
-			FullIdentifier: &structFullIdentifier_AdvertiserAdvertiseParams,
-		}, Fields: []mojom_types.StructField{mojom_types.StructField{
-			DeclData: &mojom_types.DeclarationData{
-				ShortName: &structFieldName_AdvertiserAdvertiseParams_InService,
-			},
-			Type: &mojom_types.TypeTypeReference{
-				Value: mojom_types.TypeReference{Identifier: &ID_discovery_Service__,
-					TypeKey: &ID_discovery_Service__},
-			},
-		}, mojom_types.StructField{
-			DeclData: &mojom_types.DeclarationData{
-				ShortName: &structFieldName_AdvertiserAdvertiseParams_InVisibility,
-			},
-			Type: &mojom_types.TypeArrayType{
-				Value: mojom_types.ArrayType{Nullable: true, ElementType: &mojom_types.TypeStringType{mojom_types.StringType{false}}},
-			},
-		}},
-	}
-}
-
 type advertiser_Advertise_ResponseParams struct {
 	outHandle     uint32
 	outInstanceId string
@@ -445,42 +304,6 @@
 	return nil
 }
 
-// String names and labels used by the MojomStruct types.
-var (
-	structName_AdvertiserAdvertiseResponseParams                    = "AdvertiserAdvertiseResponseParams"
-	structFullIdentifier_AdvertiserAdvertiseResponseParams          = "discovery.AdvertiserAdvertiseResponseParams"
-	structFieldName_AdvertiserAdvertiseResponseParams_OutHandle     = "OutHandle"
-	structFieldName_AdvertiserAdvertiseResponseParams_OutInstanceId = "OutInstanceId"
-	structFieldName_AdvertiserAdvertiseResponseParams_OutErr        = "OutErr"
-)
-
-func discovery_Advertiser_Advertise_ResponseParams__() mojom_types.MojomStruct {
-	return mojom_types.MojomStruct{
-		DeclData: &mojom_types.DeclarationData{
-			ShortName:      &structName_AdvertiserAdvertiseResponseParams,
-			FullIdentifier: &structFullIdentifier_AdvertiserAdvertiseResponseParams,
-		}, Fields: []mojom_types.StructField{mojom_types.StructField{
-			DeclData: &mojom_types.DeclarationData{
-				ShortName: &structFieldName_AdvertiserAdvertiseResponseParams_OutHandle,
-			},
-			Type: &mojom_types.TypeSimpleType{mojom_types.SimpleType_UinT32},
-		}, mojom_types.StructField{
-			DeclData: &mojom_types.DeclarationData{
-				ShortName: &structFieldName_AdvertiserAdvertiseResponseParams_OutInstanceId,
-			},
-			Type: &mojom_types.TypeStringType{mojom_types.StringType{false}},
-		}, mojom_types.StructField{
-			DeclData: &mojom_types.DeclarationData{
-				ShortName: &structFieldName_AdvertiserAdvertiseResponseParams_OutErr,
-			},
-			Type: &mojom_types.TypeTypeReference{
-				Value: mojom_types.TypeReference{Nullable: true, Identifier: &ID_discovery_Error__,
-					TypeKey: &ID_discovery_Error__},
-			},
-		}},
-	}
-}
-
 func (p *Advertiser_Proxy) Advertise(inService Service, inVisibility *[]string) (outHandle uint32, outInstanceId string, outErr *Error, err error) {
 	payload := &advertiser_Advertise_Params{
 		inService,
@@ -576,27 +399,6 @@
 	return nil
 }
 
-// String names and labels used by the MojomStruct types.
-var (
-	structName_AdvertiserStopParams           = "AdvertiserStopParams"
-	structFullIdentifier_AdvertiserStopParams = "discovery.AdvertiserStopParams"
-	structFieldName_AdvertiserStopParams_InH  = "InH"
-)
-
-func discovery_Advertiser_Stop_Params__() mojom_types.MojomStruct {
-	return mojom_types.MojomStruct{
-		DeclData: &mojom_types.DeclarationData{
-			ShortName:      &structName_AdvertiserStopParams,
-			FullIdentifier: &structFullIdentifier_AdvertiserStopParams,
-		}, Fields: []mojom_types.StructField{mojom_types.StructField{
-			DeclData: &mojom_types.DeclarationData{
-				ShortName: &structFieldName_AdvertiserStopParams_InH,
-			},
-			Type: &mojom_types.TypeSimpleType{mojom_types.SimpleType_UinT32},
-		}},
-	}
-}
-
 type advertiser_Stop_ResponseParams struct {
 	outErr *Error
 }
@@ -662,30 +464,6 @@
 	return nil
 }
 
-// String names and labels used by the MojomStruct types.
-var (
-	structName_AdvertiserStopResponseParams             = "AdvertiserStopResponseParams"
-	structFullIdentifier_AdvertiserStopResponseParams   = "discovery.AdvertiserStopResponseParams"
-	structFieldName_AdvertiserStopResponseParams_OutErr = "OutErr"
-)
-
-func discovery_Advertiser_Stop_ResponseParams__() mojom_types.MojomStruct {
-	return mojom_types.MojomStruct{
-		DeclData: &mojom_types.DeclarationData{
-			ShortName:      &structName_AdvertiserStopResponseParams,
-			FullIdentifier: &structFullIdentifier_AdvertiserStopResponseParams,
-		}, Fields: []mojom_types.StructField{mojom_types.StructField{
-			DeclData: &mojom_types.DeclarationData{
-				ShortName: &structFieldName_AdvertiserStopResponseParams_OutErr,
-			},
-			Type: &mojom_types.TypeTypeReference{
-				Value: mojom_types.TypeReference{Nullable: true, Identifier: &ID_discovery_Error__,
-					TypeKey: &ID_discovery_Error__},
-			},
-		}},
-	}
-}
-
 func (p *Advertiser_Proxy) Stop(inH uint32) (outErr *Error, err error) {
 	payload := &advertiser_Stop_Params{
 		inH,
@@ -737,41 +515,6 @@
 	return bindings.NewStub(connector, &advertiser_Stub{connector, impl})
 }
 
-var (
-	interfaceName_Advertiser                 = "Advertiser"
-	interfaceFullIdentifier_Advertiser       = "discovery.Advertiser"
-	interfaceMethodName_Advertiser_Advertise = "Advertise"
-	interfaceMethodName_Advertiser_Stop      = "Stop"
-)
-
-func discovery_Advertiser__() mojom_types.MojomInterface {
-	responseParamsMap := make(map[string]*mojom_types.MojomStruct)
-	_ = responseParamsMap // To avoid the declared but unused compiler error
-	mstruct_Advertise := discovery_Advertiser_Advertise_ResponseParams__()
-	responseParamsMap[interfaceMethodName_Advertiser_Advertise] = &mstruct_Advertise
-	mstruct_Stop := discovery_Advertiser_Stop_ResponseParams__()
-	responseParamsMap[interfaceMethodName_Advertiser_Stop] = &mstruct_Stop
-	return mojom_types.MojomInterface{
-		DeclData: &mojom_types.DeclarationData{
-			ShortName:      &interfaceName_Advertiser,
-			FullIdentifier: &interfaceFullIdentifier_Advertiser,
-		},
-		Methods: map[uint32]mojom_types.MojomMethod{advertiser_Advertise_Name: mojom_types.MojomMethod{
-			DeclData: &mojom_types.DeclarationData{
-				ShortName: &interfaceMethodName_Advertiser_Advertise,
-			},
-			Parameters:     discovery_Advertiser_Advertise_Params__(),
-			ResponseParams: responseParamsMap[interfaceMethodName_Advertiser_Advertise],
-		}, advertiser_Stop_Name: mojom_types.MojomMethod{
-			DeclData: &mojom_types.DeclarationData{
-				ShortName: &interfaceMethodName_Advertiser_Stop,
-			},
-			Parameters:     discovery_Advertiser_Stop_Params__(),
-			ResponseParams: responseParamsMap[interfaceMethodName_Advertiser_Stop],
-		}},
-	}
-}
-
 func (f *Advertiser_Request) ServiceDescription() service_describer.ServiceDescription {
 	return &Advertiser_ServiceDescription{}
 }
@@ -779,19 +522,18 @@
 type Advertiser_ServiceDescription struct{}
 
 func (sd *Advertiser_ServiceDescription) GetTopLevelInterface() (outMojomInterface mojom_types.MojomInterface, err error) {
-	return discovery_Advertiser__(), nil
+	err = fmt.Errorf("GetTopLevelInterface not implemented")
+	return
 }
 
 func (sd *Advertiser_ServiceDescription) GetTypeDefinition(inTypeKey string) (outType mojom_types.UserDefinedType, err error) {
-	if udt, ok := GetAllMojomTypeDefinitions()[inTypeKey]; ok {
-		return udt, nil
-	}
-	return nil, fmt.Errorf("%s_ServiceDescription does not recognize %s", "Advertiser", inTypeKey)
+	err = fmt.Errorf("GetTypeDefinition not implemented")
+	return
 }
 
 func (sd *Advertiser_ServiceDescription) GetAllTypeDefinitions() (outDefinitions *map[string]mojom_types.UserDefinedType, err error) {
-	o := GetAllMojomTypeDefinitions()
-	return &o, nil
+	err = fmt.Errorf("GetAllTypeDefinitions not implemented")
+	return
 }
 
 var _ service_describer.ServiceDescription = (*Advertiser_ServiceDescription)(nil)
@@ -1001,36 +743,6 @@
 	return nil
 }
 
-// String names and labels used by the MojomStruct types.
-var (
-	structName_ScannerScanParams                    = "ScannerScanParams"
-	structFullIdentifier_ScannerScanParams          = "discovery.ScannerScanParams"
-	structFieldName_ScannerScanParams_InQuery       = "InQuery"
-	structFieldName_ScannerScanParams_InScanHandler = "InScanHandler"
-)
-
-func discovery_Scanner_Scan_Params__() mojom_types.MojomStruct {
-	return mojom_types.MojomStruct{
-		DeclData: &mojom_types.DeclarationData{
-			ShortName:      &structName_ScannerScanParams,
-			FullIdentifier: &structFullIdentifier_ScannerScanParams,
-		}, Fields: []mojom_types.StructField{mojom_types.StructField{
-			DeclData: &mojom_types.DeclarationData{
-				ShortName: &structFieldName_ScannerScanParams_InQuery,
-			},
-			Type: &mojom_types.TypeStringType{mojom_types.StringType{false}},
-		}, mojom_types.StructField{
-			DeclData: &mojom_types.DeclarationData{
-				ShortName: &structFieldName_ScannerScanParams_InScanHandler,
-			},
-			Type: &mojom_types.TypeTypeReference{
-				Value: mojom_types.TypeReference{Identifier: &ID_discovery_ScanHandler__,
-					TypeKey: &ID_discovery_ScanHandler__},
-			},
-		}},
-	}
-}
-
 type scanner_Scan_ResponseParams struct {
 	outHandle uint32
 	outErr    *Error
@@ -1107,36 +819,6 @@
 	return nil
 }
 
-// String names and labels used by the MojomStruct types.
-var (
-	structName_ScannerScanResponseParams                = "ScannerScanResponseParams"
-	structFullIdentifier_ScannerScanResponseParams      = "discovery.ScannerScanResponseParams"
-	structFieldName_ScannerScanResponseParams_OutHandle = "OutHandle"
-	structFieldName_ScannerScanResponseParams_OutErr    = "OutErr"
-)
-
-func discovery_Scanner_Scan_ResponseParams__() mojom_types.MojomStruct {
-	return mojom_types.MojomStruct{
-		DeclData: &mojom_types.DeclarationData{
-			ShortName:      &structName_ScannerScanResponseParams,
-			FullIdentifier: &structFullIdentifier_ScannerScanResponseParams,
-		}, Fields: []mojom_types.StructField{mojom_types.StructField{
-			DeclData: &mojom_types.DeclarationData{
-				ShortName: &structFieldName_ScannerScanResponseParams_OutHandle,
-			},
-			Type: &mojom_types.TypeSimpleType{mojom_types.SimpleType_UinT32},
-		}, mojom_types.StructField{
-			DeclData: &mojom_types.DeclarationData{
-				ShortName: &structFieldName_ScannerScanResponseParams_OutErr,
-			},
-			Type: &mojom_types.TypeTypeReference{
-				Value: mojom_types.TypeReference{Nullable: true, Identifier: &ID_discovery_Error__,
-					TypeKey: &ID_discovery_Error__},
-			},
-		}},
-	}
-}
-
 func (p *Scanner_Proxy) Scan(inQuery string, inScanHandler ScanHandler_Pointer) (outHandle uint32, outErr *Error, err error) {
 	payload := &scanner_Scan_Params{
 		inQuery,
@@ -1231,27 +913,6 @@
 	return nil
 }
 
-// String names and labels used by the MojomStruct types.
-var (
-	structName_ScannerStopParams           = "ScannerStopParams"
-	structFullIdentifier_ScannerStopParams = "discovery.ScannerStopParams"
-	structFieldName_ScannerStopParams_InH  = "InH"
-)
-
-func discovery_Scanner_Stop_Params__() mojom_types.MojomStruct {
-	return mojom_types.MojomStruct{
-		DeclData: &mojom_types.DeclarationData{
-			ShortName:      &structName_ScannerStopParams,
-			FullIdentifier: &structFullIdentifier_ScannerStopParams,
-		}, Fields: []mojom_types.StructField{mojom_types.StructField{
-			DeclData: &mojom_types.DeclarationData{
-				ShortName: &structFieldName_ScannerStopParams_InH,
-			},
-			Type: &mojom_types.TypeSimpleType{mojom_types.SimpleType_UinT32},
-		}},
-	}
-}
-
 type scanner_Stop_ResponseParams struct {
 	outErr *Error
 }
@@ -1317,30 +978,6 @@
 	return nil
 }
 
-// String names and labels used by the MojomStruct types.
-var (
-	structName_ScannerStopResponseParams             = "ScannerStopResponseParams"
-	structFullIdentifier_ScannerStopResponseParams   = "discovery.ScannerStopResponseParams"
-	structFieldName_ScannerStopResponseParams_OutErr = "OutErr"
-)
-
-func discovery_Scanner_Stop_ResponseParams__() mojom_types.MojomStruct {
-	return mojom_types.MojomStruct{
-		DeclData: &mojom_types.DeclarationData{
-			ShortName:      &structName_ScannerStopResponseParams,
-			FullIdentifier: &structFullIdentifier_ScannerStopResponseParams,
-		}, Fields: []mojom_types.StructField{mojom_types.StructField{
-			DeclData: &mojom_types.DeclarationData{
-				ShortName: &structFieldName_ScannerStopResponseParams_OutErr,
-			},
-			Type: &mojom_types.TypeTypeReference{
-				Value: mojom_types.TypeReference{Nullable: true, Identifier: &ID_discovery_Error__,
-					TypeKey: &ID_discovery_Error__},
-			},
-		}},
-	}
-}
-
 func (p *Scanner_Proxy) Stop(inH uint32) (outErr *Error, err error) {
 	payload := &scanner_Stop_Params{
 		inH,
@@ -1392,41 +1029,6 @@
 	return bindings.NewStub(connector, &scanner_Stub{connector, impl})
 }
 
-var (
-	interfaceName_Scanner            = "Scanner"
-	interfaceFullIdentifier_Scanner  = "discovery.Scanner"
-	interfaceMethodName_Scanner_Scan = "Scan"
-	interfaceMethodName_Scanner_Stop = "Stop"
-)
-
-func discovery_Scanner__() mojom_types.MojomInterface {
-	responseParamsMap := make(map[string]*mojom_types.MojomStruct)
-	_ = responseParamsMap // To avoid the declared but unused compiler error
-	mstruct_Scan := discovery_Scanner_Scan_ResponseParams__()
-	responseParamsMap[interfaceMethodName_Scanner_Scan] = &mstruct_Scan
-	mstruct_Stop := discovery_Scanner_Stop_ResponseParams__()
-	responseParamsMap[interfaceMethodName_Scanner_Stop] = &mstruct_Stop
-	return mojom_types.MojomInterface{
-		DeclData: &mojom_types.DeclarationData{
-			ShortName:      &interfaceName_Scanner,
-			FullIdentifier: &interfaceFullIdentifier_Scanner,
-		},
-		Methods: map[uint32]mojom_types.MojomMethod{scanner_Scan_Name: mojom_types.MojomMethod{
-			DeclData: &mojom_types.DeclarationData{
-				ShortName: &interfaceMethodName_Scanner_Scan,
-			},
-			Parameters:     discovery_Scanner_Scan_Params__(),
-			ResponseParams: responseParamsMap[interfaceMethodName_Scanner_Scan],
-		}, scanner_Stop_Name: mojom_types.MojomMethod{
-			DeclData: &mojom_types.DeclarationData{
-				ShortName: &interfaceMethodName_Scanner_Stop,
-			},
-			Parameters:     discovery_Scanner_Stop_Params__(),
-			ResponseParams: responseParamsMap[interfaceMethodName_Scanner_Stop],
-		}},
-	}
-}
-
 func (f *Scanner_Request) ServiceDescription() service_describer.ServiceDescription {
 	return &Scanner_ServiceDescription{}
 }
@@ -1434,19 +1036,18 @@
 type Scanner_ServiceDescription struct{}
 
 func (sd *Scanner_ServiceDescription) GetTopLevelInterface() (outMojomInterface mojom_types.MojomInterface, err error) {
-	return discovery_Scanner__(), nil
+	err = fmt.Errorf("GetTopLevelInterface not implemented")
+	return
 }
 
 func (sd *Scanner_ServiceDescription) GetTypeDefinition(inTypeKey string) (outType mojom_types.UserDefinedType, err error) {
-	if udt, ok := GetAllMojomTypeDefinitions()[inTypeKey]; ok {
-		return udt, nil
-	}
-	return nil, fmt.Errorf("%s_ServiceDescription does not recognize %s", "Scanner", inTypeKey)
+	err = fmt.Errorf("GetTypeDefinition not implemented")
+	return
 }
 
 func (sd *Scanner_ServiceDescription) GetAllTypeDefinitions() (outDefinitions *map[string]mojom_types.UserDefinedType, err error) {
-	o := GetAllMojomTypeDefinitions()
-	return &o, nil
+	err = fmt.Errorf("GetAllTypeDefinitions not implemented")
+	return
 }
 
 var _ service_describer.ServiceDescription = (*Scanner_ServiceDescription)(nil)
@@ -1636,30 +1237,6 @@
 	return nil
 }
 
-// String names and labels used by the MojomStruct types.
-var (
-	structName_ScanHandlerUpdateParams               = "ScanHandlerUpdateParams"
-	structFullIdentifier_ScanHandlerUpdateParams     = "discovery.ScanHandlerUpdateParams"
-	structFieldName_ScanHandlerUpdateParams_InUpdate = "InUpdate"
-)
-
-func discovery_ScanHandler_Update_Params__() mojom_types.MojomStruct {
-	return mojom_types.MojomStruct{
-		DeclData: &mojom_types.DeclarationData{
-			ShortName:      &structName_ScanHandlerUpdateParams,
-			FullIdentifier: &structFullIdentifier_ScanHandlerUpdateParams,
-		}, Fields: []mojom_types.StructField{mojom_types.StructField{
-			DeclData: &mojom_types.DeclarationData{
-				ShortName: &structFieldName_ScanHandlerUpdateParams_InUpdate,
-			},
-			Type: &mojom_types.TypeTypeReference{
-				Value: mojom_types.TypeReference{Identifier: &ID_discovery_Update__,
-					TypeKey: &ID_discovery_Update__},
-			},
-		}},
-	}
-}
-
 func (p *ScanHandler_Proxy) Update(inUpdate Update) (err error) {
 	payload := &scanHandler_Update_Params{
 		inUpdate,
@@ -1691,30 +1268,6 @@
 	return bindings.NewStub(connector, &scanHandler_Stub{connector, impl})
 }
 
-var (
-	interfaceName_ScanHandler              = "ScanHandler"
-	interfaceFullIdentifier_ScanHandler    = "discovery.ScanHandler"
-	interfaceMethodName_ScanHandler_Update = "Update"
-)
-
-func discovery_ScanHandler__() mojom_types.MojomInterface {
-	responseParamsMap := make(map[string]*mojom_types.MojomStruct)
-	_ = responseParamsMap // To avoid the declared but unused compiler error
-	return mojom_types.MojomInterface{
-		DeclData: &mojom_types.DeclarationData{
-			ShortName:      &interfaceName_ScanHandler,
-			FullIdentifier: &interfaceFullIdentifier_ScanHandler,
-		},
-		Methods: map[uint32]mojom_types.MojomMethod{scanHandler_Update_Name: mojom_types.MojomMethod{
-			DeclData: &mojom_types.DeclarationData{
-				ShortName: &interfaceMethodName_ScanHandler_Update,
-			},
-			Parameters:     discovery_ScanHandler_Update_Params__(),
-			ResponseParams: responseParamsMap[interfaceMethodName_ScanHandler_Update],
-		}},
-	}
-}
-
 func (f *ScanHandler_Request) ServiceDescription() service_describer.ServiceDescription {
 	return &ScanHandler_ServiceDescription{}
 }
@@ -1722,19 +1275,18 @@
 type ScanHandler_ServiceDescription struct{}
 
 func (sd *ScanHandler_ServiceDescription) GetTopLevelInterface() (outMojomInterface mojom_types.MojomInterface, err error) {
-	return discovery_ScanHandler__(), nil
+	err = fmt.Errorf("GetTopLevelInterface not implemented")
+	return
 }
 
 func (sd *ScanHandler_ServiceDescription) GetTypeDefinition(inTypeKey string) (outType mojom_types.UserDefinedType, err error) {
-	if udt, ok := GetAllMojomTypeDefinitions()[inTypeKey]; ok {
-		return udt, nil
-	}
-	return nil, fmt.Errorf("%s_ServiceDescription does not recognize %s", "ScanHandler", inTypeKey)
+	err = fmt.Errorf("GetTypeDefinition not implemented")
+	return
 }
 
 func (sd *ScanHandler_ServiceDescription) GetAllTypeDefinitions() (outDefinitions *map[string]mojom_types.UserDefinedType, err error) {
-	o := GetAllMojomTypeDefinitions()
-	return &o, nil
+	err = fmt.Errorf("GetAllTypeDefinitions not implemented")
+	return
 }
 
 var _ service_describer.ServiceDescription = (*ScanHandler_ServiceDescription)(nil)
@@ -2075,57 +1627,6 @@
 	return nil
 }
 
-// String names and labels used by the MojomStruct types.
-var (
-	structName_Service                    = "Service"
-	structFullIdentifier_Service          = "discovery.Service"
-	structFieldName_Service_InstanceId    = "InstanceId"
-	structFieldName_Service_InstanceName  = "InstanceName"
-	structFieldName_Service_InterfaceName = "InterfaceName"
-	structFieldName_Service_Attrs         = "Attrs"
-	structFieldName_Service_Addrs         = "Addrs"
-)
-
-func discovery_Service__() mojom_types.MojomStruct {
-	return mojom_types.MojomStruct{
-		DeclData: &mojom_types.DeclarationData{
-			ShortName:      &structName_Service,
-			FullIdentifier: &structFullIdentifier_Service,
-		}, Fields: []mojom_types.StructField{mojom_types.StructField{
-			DeclData: &mojom_types.DeclarationData{
-				ShortName: &structFieldName_Service_InstanceId,
-			},
-			Type: &mojom_types.TypeStringType{mojom_types.StringType{true}},
-		}, mojom_types.StructField{
-			DeclData: &mojom_types.DeclarationData{
-				ShortName: &structFieldName_Service_InstanceName,
-			},
-			Type: &mojom_types.TypeStringType{mojom_types.StringType{true}},
-		}, mojom_types.StructField{
-			DeclData: &mojom_types.DeclarationData{
-				ShortName: &structFieldName_Service_InterfaceName,
-			},
-			Type: &mojom_types.TypeStringType{mojom_types.StringType{false}},
-		}, mojom_types.StructField{
-			DeclData: &mojom_types.DeclarationData{
-				ShortName: &structFieldName_Service_Attrs,
-			},
-			Type: &mojom_types.TypeMapType{
-				Value: mojom_types.MapType{Nullable: true, KeyType: &mojom_types.TypeStringType{mojom_types.StringType{false}},
-					ValueType: &mojom_types.TypeStringType{mojom_types.StringType{false}},
-				},
-			},
-		}, mojom_types.StructField{
-			DeclData: &mojom_types.DeclarationData{
-				ShortName: &structFieldName_Service_Addrs,
-			},
-			Type: &mojom_types.TypeArrayType{
-				Value: mojom_types.ArrayType{ElementType: &mojom_types.TypeStringType{mojom_types.StringType{false}}},
-			},
-		}},
-	}
-}
-
 type Update struct {
 	Service    Service
 	UpdateType UpdateType
@@ -2197,39 +1698,6 @@
 	return nil
 }
 
-// String names and labels used by the MojomStruct types.
-var (
-	structName_Update                 = "Update"
-	structFullIdentifier_Update       = "discovery.Update"
-	structFieldName_Update_Service    = "Service"
-	structFieldName_Update_UpdateType = "UpdateType"
-)
-
-func discovery_Update__() mojom_types.MojomStruct {
-	return mojom_types.MojomStruct{
-		DeclData: &mojom_types.DeclarationData{
-			ShortName:      &structName_Update,
-			FullIdentifier: &structFullIdentifier_Update,
-		}, Fields: []mojom_types.StructField{mojom_types.StructField{
-			DeclData: &mojom_types.DeclarationData{
-				ShortName: &structFieldName_Update_Service,
-			},
-			Type: &mojom_types.TypeTypeReference{
-				Value: mojom_types.TypeReference{Identifier: &ID_discovery_Service__,
-					TypeKey: &ID_discovery_Service__},
-			},
-		}, mojom_types.StructField{
-			DeclData: &mojom_types.DeclarationData{
-				ShortName: &structFieldName_Update_UpdateType,
-			},
-			Type: &mojom_types.TypeTypeReference{
-				Value: mojom_types.TypeReference{Identifier: &ID_discovery_UpdateType__,
-					TypeKey: &ID_discovery_UpdateType__},
-			},
-		}},
-	}
-}
-
 type Error struct {
 	Id     string
 	Action int32
@@ -2324,36 +1792,3 @@
 	}
 	return nil
 }
-
-// String names and labels used by the MojomStruct types.
-var (
-	structName_Error             = "Error"
-	structFullIdentifier_Error   = "discovery.Error"
-	structFieldName_Error_Id     = "Id"
-	structFieldName_Error_Action = "Action"
-	structFieldName_Error_Msg    = "Msg"
-)
-
-func discovery_Error__() mojom_types.MojomStruct {
-	return mojom_types.MojomStruct{
-		DeclData: &mojom_types.DeclarationData{
-			ShortName:      &structName_Error,
-			FullIdentifier: &structFullIdentifier_Error,
-		}, Fields: []mojom_types.StructField{mojom_types.StructField{
-			DeclData: &mojom_types.DeclarationData{
-				ShortName: &structFieldName_Error_Id,
-			},
-			Type: &mojom_types.TypeStringType{mojom_types.StringType{false}},
-		}, mojom_types.StructField{
-			DeclData: &mojom_types.DeclarationData{
-				ShortName: &structFieldName_Error_Action,
-			},
-			Type: &mojom_types.TypeSimpleType{mojom_types.SimpleType_InT32},
-		}, mojom_types.StructField{
-			DeclData: &mojom_types.DeclarationData{
-				ShortName: &structFieldName_Error_Msg,
-			},
-			Type: &mojom_types.TypeStringType{mojom_types.StringType{false}},
-		}},
-	}
-}
diff --git a/java/generated-src/io/v/mojo/discovery/ScanHandler.java b/java/generated-src/io/v/mojo/discovery/ScanHandler.java
index 08885bf..25cddab 100644
--- a/java/generated-src/io/v/mojo/discovery/ScanHandler.java
+++ b/java/generated-src/io/v/mojo/discovery/ScanHandler.java
@@ -21,6 +21,8 @@
 
     NamedManager<ScanHandler, ScanHandler.Proxy> MANAGER = ScanHandler_Internal.MANAGER;
 
-    void update(Update update);
+    void found(Service service);
+
+    void lost(String instanceId);
 }
 
diff --git a/java/generated-src/io/v/mojo/discovery/ScanHandler_Internal.java b/java/generated-src/io/v/mojo/discovery/ScanHandler_Internal.java
index 477d0e7..d649ea2 100644
--- a/java/generated-src/io/v/mojo/discovery/ScanHandler_Internal.java
+++ b/java/generated-src/io/v/mojo/discovery/ScanHandler_Internal.java
@@ -41,7 +41,8 @@
         }
     };
 
-    private static final int UPDATE_ORDINAL = 0;
+    private static final int FOUND_ORDINAL = 0;
+    private static final int LOST_ORDINAL = 1;
 
     static final class Proxy extends org.chromium.mojo.bindings.Interface.AbstractProxy implements ScanHandler.Proxy {
 
@@ -51,13 +52,23 @@
         }
 
         @Override
-        public void update(Update update) {
-            ScanHandlerUpdateParams _message = new ScanHandlerUpdateParams();
-            _message.update = update;
+        public void found(Service service) {
+            ScanHandlerFoundParams _message = new ScanHandlerFoundParams();
+            _message.service = service;
             getProxyHandler().getMessageReceiver().accept(
                     _message.serializeWithHeader(
                             getProxyHandler().getCore(),
-                            new org.chromium.mojo.bindings.MessageHeader(UPDATE_ORDINAL)));
+                            new org.chromium.mojo.bindings.MessageHeader(FOUND_ORDINAL)));
+        }
+
+        @Override
+        public void lost(String instanceId) {
+            ScanHandlerLostParams _message = new ScanHandlerLostParams();
+            _message.instanceId = instanceId;
+            getProxyHandler().getMessageReceiver().accept(
+                    _message.serializeWithHeader(
+                            getProxyHandler().getCore(),
+                            new org.chromium.mojo.bindings.MessageHeader(LOST_ORDINAL)));
         }
 
     }
@@ -81,10 +92,16 @@
                     case org.chromium.mojo.bindings.InterfaceControlMessagesConstants.RUN_OR_CLOSE_PIPE_MESSAGE_ID:
                         return org.chromium.mojo.bindings.InterfaceControlMessagesHelper.handleRunOrClosePipe(
                                 ScanHandler_Internal.MANAGER, messageWithHeader);
-                    case UPDATE_ORDINAL: {
-                        ScanHandlerUpdateParams data =
-                                ScanHandlerUpdateParams.deserialize(messageWithHeader.getPayload());
-                        getImpl().update(data.update);
+                    case FOUND_ORDINAL: {
+                        ScanHandlerFoundParams data =
+                                ScanHandlerFoundParams.deserialize(messageWithHeader.getPayload());
+                        getImpl().found(data.service);
+                        return true;
+                    }
+                    case LOST_ORDINAL: {
+                        ScanHandlerLostParams data =
+                                ScanHandlerLostParams.deserialize(messageWithHeader.getPayload());
+                        getImpl().lost(data.instanceId);
                         return true;
                     }
                     default:
@@ -119,36 +136,36 @@
         }
     }
 
-    static final class ScanHandlerUpdateParams extends org.chromium.mojo.bindings.Struct {
+    static final class ScanHandlerFoundParams extends org.chromium.mojo.bindings.Struct {
     
         private static final int STRUCT_SIZE = 16;
         private static final org.chromium.mojo.bindings.DataHeader[] VERSION_ARRAY = new org.chromium.mojo.bindings.DataHeader[] {new org.chromium.mojo.bindings.DataHeader(16, 0)};
         private static final org.chromium.mojo.bindings.DataHeader DEFAULT_STRUCT_INFO = VERSION_ARRAY[0];
     
-        public Update update;
+        public Service service;
     
-        private ScanHandlerUpdateParams(int version) {
+        private ScanHandlerFoundParams(int version) {
             super(STRUCT_SIZE, version);
         }
     
-        public ScanHandlerUpdateParams() {
+        public ScanHandlerFoundParams() {
             this(0);
         }
     
-        public static ScanHandlerUpdateParams deserialize(org.chromium.mojo.bindings.Message message) {
+        public static ScanHandlerFoundParams deserialize(org.chromium.mojo.bindings.Message message) {
             return decode(new org.chromium.mojo.bindings.Decoder(message));
         }
     
         @SuppressWarnings("unchecked")
-        public static ScanHandlerUpdateParams decode(org.chromium.mojo.bindings.Decoder decoder0) {
+        public static ScanHandlerFoundParams decode(org.chromium.mojo.bindings.Decoder decoder0) {
             if (decoder0 == null) {
                 return null;
             }
             org.chromium.mojo.bindings.DataHeader mainDataHeader = decoder0.readAndValidateDataHeader(VERSION_ARRAY);
-            ScanHandlerUpdateParams result = new ScanHandlerUpdateParams(mainDataHeader.elementsOrVersion);
+            ScanHandlerFoundParams result = new ScanHandlerFoundParams(mainDataHeader.elementsOrVersion);
             if (mainDataHeader.elementsOrVersion >= 0) {
                 org.chromium.mojo.bindings.Decoder decoder1 = decoder0.readPointer(8, false);
-                result.update = Update.decode(decoder1);
+                result.service = Service.decode(decoder1);
             }
             return result;
         }
@@ -157,7 +174,7 @@
         @Override
         protected final void encode(org.chromium.mojo.bindings.Encoder encoder) {
             org.chromium.mojo.bindings.Encoder encoder0 = encoder.getEncoderAtDataOffset(DEFAULT_STRUCT_INFO);
-            encoder0.encode(update, 8, false);
+            encoder0.encode(service, 8, false);
         }
     
         /**
@@ -171,8 +188,8 @@
                 return false;
             if (getClass() != object.getClass())
                 return false;
-            ScanHandlerUpdateParams other = (ScanHandlerUpdateParams) object;
-            if (!org.chromium.mojo.bindings.BindingsHelper.equals(this.update, other.update))
+            ScanHandlerFoundParams other = (ScanHandlerFoundParams) object;
+            if (!org.chromium.mojo.bindings.BindingsHelper.equals(this.service, other.service))
                 return false;
             return true;
         }
@@ -184,7 +201,76 @@
         public int hashCode() {
             final int prime = 31;
             int result = prime + getClass().hashCode();
-            result = prime * result + org.chromium.mojo.bindings.BindingsHelper.hashCode(update);
+            result = prime * result + org.chromium.mojo.bindings.BindingsHelper.hashCode(service);
+            return result;
+        }
+    }
+
+    static final class ScanHandlerLostParams extends org.chromium.mojo.bindings.Struct {
+    
+        private static final int STRUCT_SIZE = 16;
+        private static final org.chromium.mojo.bindings.DataHeader[] VERSION_ARRAY = new org.chromium.mojo.bindings.DataHeader[] {new org.chromium.mojo.bindings.DataHeader(16, 0)};
+        private static final org.chromium.mojo.bindings.DataHeader DEFAULT_STRUCT_INFO = VERSION_ARRAY[0];
+    
+        public String instanceId;
+    
+        private ScanHandlerLostParams(int version) {
+            super(STRUCT_SIZE, version);
+        }
+    
+        public ScanHandlerLostParams() {
+            this(0);
+        }
+    
+        public static ScanHandlerLostParams deserialize(org.chromium.mojo.bindings.Message message) {
+            return decode(new org.chromium.mojo.bindings.Decoder(message));
+        }
+    
+        @SuppressWarnings("unchecked")
+        public static ScanHandlerLostParams decode(org.chromium.mojo.bindings.Decoder decoder0) {
+            if (decoder0 == null) {
+                return null;
+            }
+            org.chromium.mojo.bindings.DataHeader mainDataHeader = decoder0.readAndValidateDataHeader(VERSION_ARRAY);
+            ScanHandlerLostParams result = new ScanHandlerLostParams(mainDataHeader.elementsOrVersion);
+            if (mainDataHeader.elementsOrVersion >= 0) {
+                result.instanceId = decoder0.readString(8, false);
+            }
+            return result;
+        }
+    
+        @SuppressWarnings("unchecked")
+        @Override
+        protected final void encode(org.chromium.mojo.bindings.Encoder encoder) {
+            org.chromium.mojo.bindings.Encoder encoder0 = encoder.getEncoderAtDataOffset(DEFAULT_STRUCT_INFO);
+            encoder0.encode(instanceId, 8, false);
+        }
+    
+        /**
+         * @see Object#equals(Object)
+         */
+        @Override
+        public boolean equals(Object object) {
+            if (object == this)
+                return true;
+            if (object == null)
+                return false;
+            if (getClass() != object.getClass())
+                return false;
+            ScanHandlerLostParams other = (ScanHandlerLostParams) object;
+            if (!org.chromium.mojo.bindings.BindingsHelper.equals(this.instanceId, other.instanceId))
+                return false;
+            return true;
+        }
+    
+        /**
+         * @see Object#hashCode()
+         */
+        @Override
+        public int hashCode() {
+            final int prime = 31;
+            int result = prime + getClass().hashCode();
+            result = prime * result + org.chromium.mojo.bindings.BindingsHelper.hashCode(instanceId);
             return result;
         }
     }
diff --git a/java/generated-src/mojom/vanadium/discovery.mojom.srcjar b/java/generated-src/mojom/vanadium/discovery.mojom.srcjar
index f97e92e..716ee4e 100644
--- a/java/generated-src/mojom/vanadium/discovery.mojom.srcjar
+++ b/java/generated-src/mojom/vanadium/discovery.mojom.srcjar
Binary files differ
diff --git a/lib/gen/dart-gen/mojom/lib/discovery/discovery.mojom.dart b/lib/gen/dart-gen/mojom/lib/discovery/discovery.mojom.dart
index 81d0426..4c20f51 100644
--- a/lib/gen/dart-gen/mojom/lib/discovery/discovery.mojom.dart
+++ b/lib/gen/dart-gen/mojom/lib/discovery/discovery.mojom.dart
@@ -8,9 +8,10 @@
 
 import 'package:mojo/bindings.dart' as bindings;
 import 'package:mojo/core.dart' as core;
+
 class UpdateType extends bindings.MojoEnum {
-  static const found = const UpdateType._(1);
-  static const lost = const UpdateType._(2);
+  static const UpdateType found = const UpdateType._(1);
+  static const UpdateType lost = const UpdateType._(2);
 
   const UpdateType._(int v) : super(v);
 
@@ -55,7 +56,7 @@
     }
   }
 
-  int toJson() => value;
+  int toJson() => mojoEnumValue;
 }
 
 
@@ -401,16 +402,16 @@
 }
 
 
-class AdvertiserAdvertiseParams extends bindings.Struct {
+class _AdvertiserAdvertiseParams extends bindings.Struct {
   static const List<bindings.StructDataHeader> kVersions = const [
     const bindings.StructDataHeader(24, 0)
   ];
   Service service = null;
   List<String> visibility = null;
 
-  AdvertiserAdvertiseParams() : super(kVersions.last.size);
+  _AdvertiserAdvertiseParams() : super(kVersions.last.size);
 
-  static AdvertiserAdvertiseParams deserialize(bindings.Message message) {
+  static _AdvertiserAdvertiseParams deserialize(bindings.Message message) {
     var decoder = new bindings.Decoder(message);
     var result = decode(decoder);
     if (decoder.excessHandles != null) {
@@ -419,11 +420,11 @@
     return result;
   }
 
-  static AdvertiserAdvertiseParams decode(bindings.Decoder decoder0) {
+  static _AdvertiserAdvertiseParams decode(bindings.Decoder decoder0) {
     if (decoder0 == null) {
       return null;
     }
-    AdvertiserAdvertiseParams result = new AdvertiserAdvertiseParams();
+    _AdvertiserAdvertiseParams result = new _AdvertiserAdvertiseParams();
 
     var mainDataHeader = decoder0.decodeStructDataHeader();
     if (mainDataHeader.version <= kVersions.last.version) {
@@ -482,7 +483,7 @@
   }
 
   String toString() {
-    return "AdvertiserAdvertiseParams("
+    return "_AdvertiserAdvertiseParams("
            "service: $service" ", "
            "visibility: $visibility" ")";
   }
@@ -582,15 +583,15 @@
 }
 
 
-class AdvertiserStopParams extends bindings.Struct {
+class _AdvertiserStopParams extends bindings.Struct {
   static const List<bindings.StructDataHeader> kVersions = const [
     const bindings.StructDataHeader(16, 0)
   ];
   int h = 0;
 
-  AdvertiserStopParams() : super(kVersions.last.size);
+  _AdvertiserStopParams() : super(kVersions.last.size);
 
-  static AdvertiserStopParams deserialize(bindings.Message message) {
+  static _AdvertiserStopParams deserialize(bindings.Message message) {
     var decoder = new bindings.Decoder(message);
     var result = decode(decoder);
     if (decoder.excessHandles != null) {
@@ -599,11 +600,11 @@
     return result;
   }
 
-  static AdvertiserStopParams decode(bindings.Decoder decoder0) {
+  static _AdvertiserStopParams decode(bindings.Decoder decoder0) {
     if (decoder0 == null) {
       return null;
     }
-    AdvertiserStopParams result = new AdvertiserStopParams();
+    _AdvertiserStopParams result = new _AdvertiserStopParams();
 
     var mainDataHeader = decoder0.decodeStructDataHeader();
     if (mainDataHeader.version <= kVersions.last.version) {
@@ -637,7 +638,7 @@
   }
 
   String toString() {
-    return "AdvertiserStopParams("
+    return "_AdvertiserStopParams("
            "h: $h" ")";
   }
 
@@ -717,16 +718,16 @@
 }
 
 
-class ScannerScanParams extends bindings.Struct {
+class _ScannerScanParams extends bindings.Struct {
   static const List<bindings.StructDataHeader> kVersions = const [
     const bindings.StructDataHeader(24, 0)
   ];
   String query = null;
   Object scanHandler = null;
 
-  ScannerScanParams() : super(kVersions.last.size);
+  _ScannerScanParams() : super(kVersions.last.size);
 
-  static ScannerScanParams deserialize(bindings.Message message) {
+  static _ScannerScanParams deserialize(bindings.Message message) {
     var decoder = new bindings.Decoder(message);
     var result = decode(decoder);
     if (decoder.excessHandles != null) {
@@ -735,11 +736,11 @@
     return result;
   }
 
-  static ScannerScanParams decode(bindings.Decoder decoder0) {
+  static _ScannerScanParams decode(bindings.Decoder decoder0) {
     if (decoder0 == null) {
       return null;
     }
-    ScannerScanParams result = new ScannerScanParams();
+    _ScannerScanParams result = new _ScannerScanParams();
 
     var mainDataHeader = decoder0.decodeStructDataHeader();
     if (mainDataHeader.version <= kVersions.last.version) {
@@ -779,7 +780,7 @@
   }
 
   String toString() {
-    return "ScannerScanParams("
+    return "_ScannerScanParams("
            "query: $query" ", "
            "scanHandler: $scanHandler" ")";
   }
@@ -868,15 +869,15 @@
 }
 
 
-class ScannerStopParams extends bindings.Struct {
+class _ScannerStopParams extends bindings.Struct {
   static const List<bindings.StructDataHeader> kVersions = const [
     const bindings.StructDataHeader(16, 0)
   ];
   int h = 0;
 
-  ScannerStopParams() : super(kVersions.last.size);
+  _ScannerStopParams() : super(kVersions.last.size);
 
-  static ScannerStopParams deserialize(bindings.Message message) {
+  static _ScannerStopParams deserialize(bindings.Message message) {
     var decoder = new bindings.Decoder(message);
     var result = decode(decoder);
     if (decoder.excessHandles != null) {
@@ -885,11 +886,11 @@
     return result;
   }
 
-  static ScannerStopParams decode(bindings.Decoder decoder0) {
+  static _ScannerStopParams decode(bindings.Decoder decoder0) {
     if (decoder0 == null) {
       return null;
     }
-    ScannerStopParams result = new ScannerStopParams();
+    _ScannerStopParams result = new _ScannerStopParams();
 
     var mainDataHeader = decoder0.decodeStructDataHeader();
     if (mainDataHeader.version <= kVersions.last.version) {
@@ -923,7 +924,7 @@
   }
 
   String toString() {
-    return "ScannerStopParams("
+    return "_ScannerStopParams("
            "h: $h" ")";
   }
 
@@ -1003,15 +1004,15 @@
 }
 
 
-class ScanHandlerUpdateParams extends bindings.Struct {
+class _ScanHandlerUpdateParams extends bindings.Struct {
   static const List<bindings.StructDataHeader> kVersions = const [
     const bindings.StructDataHeader(16, 0)
   ];
   Update update = null;
 
-  ScanHandlerUpdateParams() : super(kVersions.last.size);
+  _ScanHandlerUpdateParams() : super(kVersions.last.size);
 
-  static ScanHandlerUpdateParams deserialize(bindings.Message message) {
+  static _ScanHandlerUpdateParams deserialize(bindings.Message message) {
     var decoder = new bindings.Decoder(message);
     var result = decode(decoder);
     if (decoder.excessHandles != null) {
@@ -1020,11 +1021,11 @@
     return result;
   }
 
-  static ScanHandlerUpdateParams decode(bindings.Decoder decoder0) {
+  static _ScanHandlerUpdateParams decode(bindings.Decoder decoder0) {
     if (decoder0 == null) {
       return null;
     }
-    ScanHandlerUpdateParams result = new ScanHandlerUpdateParams();
+    _ScanHandlerUpdateParams result = new _ScanHandlerUpdateParams();
 
     var mainDataHeader = decoder0.decodeStructDataHeader();
     if (mainDataHeader.version <= kVersions.last.version) {
@@ -1059,7 +1060,7 @@
   }
 
   String toString() {
-    return "ScanHandlerUpdateParams("
+    return "_ScanHandlerUpdateParams("
            "update: $update" ")";
   }
 
@@ -1070,37 +1071,34 @@
   }
 }
 
-const int kAdvertiser_advertise_name = 0;
-const int kAdvertiser_stop_name = 1;
-const String AdvertiserName = "v23::discovery::Advertiser";
+const int _Advertiser_advertiseName = 0;
+const int _Advertiser_stopName = 1;
 
 abstract class Advertiser {
+  static const String serviceName = "v23::discovery::Advertiser";
   dynamic advertise(Service service,List<String> visibility,[Function responseFactory = null]);
   dynamic stop(int h,[Function responseFactory = null]);
-
 }
 
 
-class AdvertiserProxyImpl extends bindings.Proxy {
-  AdvertiserProxyImpl.fromEndpoint(
+class _AdvertiserProxyImpl extends bindings.Proxy {
+  _AdvertiserProxyImpl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  AdvertiserProxyImpl.fromHandle(core.MojoHandle handle) :
+  _AdvertiserProxyImpl.fromHandle(core.MojoHandle handle) :
       super.fromHandle(handle);
 
-  AdvertiserProxyImpl.unbound() : super.unbound();
+  _AdvertiserProxyImpl.unbound() : super.unbound();
 
-  static AdvertiserProxyImpl newFromEndpoint(
+  static _AdvertiserProxyImpl newFromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For AdvertiserProxyImpl"));
-    return new AdvertiserProxyImpl.fromEndpoint(endpoint);
+    assert(endpoint.setDescription("For _AdvertiserProxyImpl"));
+    return new _AdvertiserProxyImpl.fromEndpoint(endpoint);
   }
 
-  String get name => AdvertiserName;
-
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
-      case kAdvertiser_advertise_name:
+      case _Advertiser_advertiseName:
         var r = AdvertiserAdvertiseResponseParams.deserialize(
             message.payload);
         if (!message.header.hasRequestId) {
@@ -1120,7 +1118,7 @@
         }
         c.complete(r);
         break;
-      case kAdvertiser_stop_name:
+      case _Advertiser_stopName:
         var r = AdvertiserStopResponseParams.deserialize(
             message.payload);
         if (!message.header.hasRequestId) {
@@ -1149,31 +1147,31 @@
 
   String toString() {
     var superString = super.toString();
-    return "AdvertiserProxyImpl($superString)";
+    return "_AdvertiserProxyImpl($superString)";
   }
 }
 
 
 class _AdvertiserProxyCalls implements Advertiser {
-  AdvertiserProxyImpl _proxyImpl;
+  _AdvertiserProxyImpl _proxyImpl;
 
   _AdvertiserProxyCalls(this._proxyImpl);
     dynamic advertise(Service service,List<String> visibility,[Function responseFactory = null]) {
-      var params = new AdvertiserAdvertiseParams();
+      var params = new _AdvertiserAdvertiseParams();
       params.service = service;
       params.visibility = visibility;
       return _proxyImpl.sendMessageWithRequestId(
           params,
-          kAdvertiser_advertise_name,
+          _Advertiser_advertiseName,
           -1,
           bindings.MessageHeader.kMessageExpectsResponse);
     }
     dynamic stop(int h,[Function responseFactory = null]) {
-      var params = new AdvertiserStopParams();
+      var params = new _AdvertiserStopParams();
       params.h = h;
       return _proxyImpl.sendMessageWithRequestId(
           params,
-          kAdvertiser_stop_name,
+          _Advertiser_stopName,
           -1,
           bindings.MessageHeader.kMessageExpectsResponse);
     }
@@ -1183,25 +1181,24 @@
 class AdvertiserProxy implements bindings.ProxyBase {
   final bindings.Proxy impl;
   Advertiser ptr;
-  final String name = AdvertiserName;
 
-  AdvertiserProxy(AdvertiserProxyImpl proxyImpl) :
+  AdvertiserProxy(_AdvertiserProxyImpl proxyImpl) :
       impl = proxyImpl,
       ptr = new _AdvertiserProxyCalls(proxyImpl);
 
   AdvertiserProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) :
-      impl = new AdvertiserProxyImpl.fromEndpoint(endpoint) {
+      impl = new _AdvertiserProxyImpl.fromEndpoint(endpoint) {
     ptr = new _AdvertiserProxyCalls(impl);
   }
 
   AdvertiserProxy.fromHandle(core.MojoHandle handle) :
-      impl = new AdvertiserProxyImpl.fromHandle(handle) {
+      impl = new _AdvertiserProxyImpl.fromHandle(handle) {
     ptr = new _AdvertiserProxyCalls(impl);
   }
 
   AdvertiserProxy.unbound() :
-      impl = new AdvertiserProxyImpl.unbound() {
+      impl = new _AdvertiserProxyImpl.unbound() {
     ptr = new _AdvertiserProxyCalls(impl);
   }
 
@@ -1218,6 +1215,8 @@
     return new AdvertiserProxy.fromEndpoint(endpoint);
   }
 
+  String get serviceName => Advertiser.serviceName;
+
   Future close({bool immediate: false}) => impl.close(immediate: immediate);
 
   Future responseOrError(Future f) => impl.responseOrError(f);
@@ -1256,8 +1255,6 @@
     return new AdvertiserStub.fromEndpoint(endpoint);
   }
 
-  static const String name = AdvertiserName;
-
 
   AdvertiserAdvertiseResponseParams _AdvertiserAdvertiseResponseParamsFactory(int handle, String instanceId, Error err) {
     var mojo_factory_result = new AdvertiserAdvertiseResponseParams();
@@ -1280,8 +1277,8 @@
     }
     assert(_impl != null);
     switch (message.header.type) {
-      case kAdvertiser_advertise_name:
-        var params = AdvertiserAdvertiseParams.deserialize(
+      case _Advertiser_advertiseName:
+        var params = _AdvertiserAdvertiseParams.deserialize(
             message.payload);
         var response = _impl.advertise(params.service,params.visibility,_AdvertiserAdvertiseResponseParamsFactory);
         if (response is Future) {
@@ -1289,7 +1286,7 @@
             if (response != null) {
               return buildResponseWithId(
                   response,
-                  kAdvertiser_advertise_name,
+                  _Advertiser_advertiseName,
                   message.header.requestId,
                   bindings.MessageHeader.kMessageIsResponse);
             }
@@ -1297,13 +1294,13 @@
         } else if (response != null) {
           return buildResponseWithId(
               response,
-              kAdvertiser_advertise_name,
+              _Advertiser_advertiseName,
               message.header.requestId,
               bindings.MessageHeader.kMessageIsResponse);
         }
         break;
-      case kAdvertiser_stop_name:
-        var params = AdvertiserStopParams.deserialize(
+      case _Advertiser_stopName:
+        var params = _AdvertiserStopParams.deserialize(
             message.payload);
         var response = _impl.stop(params.h,_AdvertiserStopResponseParamsFactory);
         if (response is Future) {
@@ -1311,7 +1308,7 @@
             if (response != null) {
               return buildResponseWithId(
                   response,
-                  kAdvertiser_stop_name,
+                  _Advertiser_stopName,
                   message.header.requestId,
                   bindings.MessageHeader.kMessageIsResponse);
             }
@@ -1319,7 +1316,7 @@
         } else if (response != null) {
           return buildResponseWithId(
               response,
-              kAdvertiser_stop_name,
+              _Advertiser_stopName,
               message.header.requestId,
               bindings.MessageHeader.kMessageIsResponse);
         }
@@ -1345,37 +1342,34 @@
   int get version => 0;
 }
 
-const int kScanner_scan_name = 0;
-const int kScanner_stop_name = 1;
-const String ScannerName = "v23::discovery::Scanner";
+const int _Scanner_scanName = 0;
+const int _Scanner_stopName = 1;
 
 abstract class Scanner {
+  static const String serviceName = "v23::discovery::Scanner";
   dynamic scan(String query,Object scanHandler,[Function responseFactory = null]);
   dynamic stop(int h,[Function responseFactory = null]);
-
 }
 
 
-class ScannerProxyImpl extends bindings.Proxy {
-  ScannerProxyImpl.fromEndpoint(
+class _ScannerProxyImpl extends bindings.Proxy {
+  _ScannerProxyImpl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  ScannerProxyImpl.fromHandle(core.MojoHandle handle) :
+  _ScannerProxyImpl.fromHandle(core.MojoHandle handle) :
       super.fromHandle(handle);
 
-  ScannerProxyImpl.unbound() : super.unbound();
+  _ScannerProxyImpl.unbound() : super.unbound();
 
-  static ScannerProxyImpl newFromEndpoint(
+  static _ScannerProxyImpl newFromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ScannerProxyImpl"));
-    return new ScannerProxyImpl.fromEndpoint(endpoint);
+    assert(endpoint.setDescription("For _ScannerProxyImpl"));
+    return new _ScannerProxyImpl.fromEndpoint(endpoint);
   }
 
-  String get name => ScannerName;
-
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
-      case kScanner_scan_name:
+      case _Scanner_scanName:
         var r = ScannerScanResponseParams.deserialize(
             message.payload);
         if (!message.header.hasRequestId) {
@@ -1395,7 +1389,7 @@
         }
         c.complete(r);
         break;
-      case kScanner_stop_name:
+      case _Scanner_stopName:
         var r = ScannerStopResponseParams.deserialize(
             message.payload);
         if (!message.header.hasRequestId) {
@@ -1424,31 +1418,31 @@
 
   String toString() {
     var superString = super.toString();
-    return "ScannerProxyImpl($superString)";
+    return "_ScannerProxyImpl($superString)";
   }
 }
 
 
 class _ScannerProxyCalls implements Scanner {
-  ScannerProxyImpl _proxyImpl;
+  _ScannerProxyImpl _proxyImpl;
 
   _ScannerProxyCalls(this._proxyImpl);
     dynamic scan(String query,Object scanHandler,[Function responseFactory = null]) {
-      var params = new ScannerScanParams();
+      var params = new _ScannerScanParams();
       params.query = query;
       params.scanHandler = scanHandler;
       return _proxyImpl.sendMessageWithRequestId(
           params,
-          kScanner_scan_name,
+          _Scanner_scanName,
           -1,
           bindings.MessageHeader.kMessageExpectsResponse);
     }
     dynamic stop(int h,[Function responseFactory = null]) {
-      var params = new ScannerStopParams();
+      var params = new _ScannerStopParams();
       params.h = h;
       return _proxyImpl.sendMessageWithRequestId(
           params,
-          kScanner_stop_name,
+          _Scanner_stopName,
           -1,
           bindings.MessageHeader.kMessageExpectsResponse);
     }
@@ -1458,25 +1452,24 @@
 class ScannerProxy implements bindings.ProxyBase {
   final bindings.Proxy impl;
   Scanner ptr;
-  final String name = ScannerName;
 
-  ScannerProxy(ScannerProxyImpl proxyImpl) :
+  ScannerProxy(_ScannerProxyImpl proxyImpl) :
       impl = proxyImpl,
       ptr = new _ScannerProxyCalls(proxyImpl);
 
   ScannerProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) :
-      impl = new ScannerProxyImpl.fromEndpoint(endpoint) {
+      impl = new _ScannerProxyImpl.fromEndpoint(endpoint) {
     ptr = new _ScannerProxyCalls(impl);
   }
 
   ScannerProxy.fromHandle(core.MojoHandle handle) :
-      impl = new ScannerProxyImpl.fromHandle(handle) {
+      impl = new _ScannerProxyImpl.fromHandle(handle) {
     ptr = new _ScannerProxyCalls(impl);
   }
 
   ScannerProxy.unbound() :
-      impl = new ScannerProxyImpl.unbound() {
+      impl = new _ScannerProxyImpl.unbound() {
     ptr = new _ScannerProxyCalls(impl);
   }
 
@@ -1493,6 +1486,8 @@
     return new ScannerProxy.fromEndpoint(endpoint);
   }
 
+  String get serviceName => Scanner.serviceName;
+
   Future close({bool immediate: false}) => impl.close(immediate: immediate);
 
   Future responseOrError(Future f) => impl.responseOrError(f);
@@ -1531,8 +1526,6 @@
     return new ScannerStub.fromEndpoint(endpoint);
   }
 
-  static const String name = ScannerName;
-
 
   ScannerScanResponseParams _ScannerScanResponseParamsFactory(int handle, Error err) {
     var mojo_factory_result = new ScannerScanResponseParams();
@@ -1554,8 +1547,8 @@
     }
     assert(_impl != null);
     switch (message.header.type) {
-      case kScanner_scan_name:
-        var params = ScannerScanParams.deserialize(
+      case _Scanner_scanName:
+        var params = _ScannerScanParams.deserialize(
             message.payload);
         var response = _impl.scan(params.query,params.scanHandler,_ScannerScanResponseParamsFactory);
         if (response is Future) {
@@ -1563,7 +1556,7 @@
             if (response != null) {
               return buildResponseWithId(
                   response,
-                  kScanner_scan_name,
+                  _Scanner_scanName,
                   message.header.requestId,
                   bindings.MessageHeader.kMessageIsResponse);
             }
@@ -1571,13 +1564,13 @@
         } else if (response != null) {
           return buildResponseWithId(
               response,
-              kScanner_scan_name,
+              _Scanner_scanName,
               message.header.requestId,
               bindings.MessageHeader.kMessageIsResponse);
         }
         break;
-      case kScanner_stop_name:
-        var params = ScannerStopParams.deserialize(
+      case _Scanner_stopName:
+        var params = _ScannerStopParams.deserialize(
             message.payload);
         var response = _impl.stop(params.h,_ScannerStopResponseParamsFactory);
         if (response is Future) {
@@ -1585,7 +1578,7 @@
             if (response != null) {
               return buildResponseWithId(
                   response,
-                  kScanner_stop_name,
+                  _Scanner_stopName,
                   message.header.requestId,
                   bindings.MessageHeader.kMessageIsResponse);
             }
@@ -1593,7 +1586,7 @@
         } else if (response != null) {
           return buildResponseWithId(
               response,
-              kScanner_stop_name,
+              _Scanner_stopName,
               message.header.requestId,
               bindings.MessageHeader.kMessageIsResponse);
         }
@@ -1619,32 +1612,29 @@
   int get version => 0;
 }
 
-const int kScanHandler_update_name = 0;
-const String ScanHandlerName = "v23::discovery::ScanHandler";
+const int _ScanHandler_updateName = 0;
 
 abstract class ScanHandler {
+  static const String serviceName = "v23::discovery::ScanHandler";
   void update(Update update);
-
 }
 
 
-class ScanHandlerProxyImpl extends bindings.Proxy {
-  ScanHandlerProxyImpl.fromEndpoint(
+class _ScanHandlerProxyImpl extends bindings.Proxy {
+  _ScanHandlerProxyImpl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
-  ScanHandlerProxyImpl.fromHandle(core.MojoHandle handle) :
+  _ScanHandlerProxyImpl.fromHandle(core.MojoHandle handle) :
       super.fromHandle(handle);
 
-  ScanHandlerProxyImpl.unbound() : super.unbound();
+  _ScanHandlerProxyImpl.unbound() : super.unbound();
 
-  static ScanHandlerProxyImpl newFromEndpoint(
+  static _ScanHandlerProxyImpl newFromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ScanHandlerProxyImpl"));
-    return new ScanHandlerProxyImpl.fromEndpoint(endpoint);
+    assert(endpoint.setDescription("For _ScanHandlerProxyImpl"));
+    return new _ScanHandlerProxyImpl.fromEndpoint(endpoint);
   }
 
-  String get name => ScanHandlerName;
-
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -1656,13 +1646,13 @@
 
   String toString() {
     var superString = super.toString();
-    return "ScanHandlerProxyImpl($superString)";
+    return "_ScanHandlerProxyImpl($superString)";
   }
 }
 
 
 class _ScanHandlerProxyCalls implements ScanHandler {
-  ScanHandlerProxyImpl _proxyImpl;
+  _ScanHandlerProxyImpl _proxyImpl;
 
   _ScanHandlerProxyCalls(this._proxyImpl);
     void update(Update update) {
@@ -1670,36 +1660,34 @@
         _proxyImpl.proxyError("The Proxy is closed.");
         return;
       }
-      var params = new ScanHandlerUpdateParams();
+      var params = new _ScanHandlerUpdateParams();
       params.update = update;
-      _proxyImpl.sendMessage(params, kScanHandler_update_name);
+      _proxyImpl.sendMessage(params, _ScanHandler_updateName);
     }
-  
 }
 
 
 class ScanHandlerProxy implements bindings.ProxyBase {
   final bindings.Proxy impl;
   ScanHandler ptr;
-  final String name = ScanHandlerName;
 
-  ScanHandlerProxy(ScanHandlerProxyImpl proxyImpl) :
+  ScanHandlerProxy(_ScanHandlerProxyImpl proxyImpl) :
       impl = proxyImpl,
       ptr = new _ScanHandlerProxyCalls(proxyImpl);
 
   ScanHandlerProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) :
-      impl = new ScanHandlerProxyImpl.fromEndpoint(endpoint) {
+      impl = new _ScanHandlerProxyImpl.fromEndpoint(endpoint) {
     ptr = new _ScanHandlerProxyCalls(impl);
   }
 
   ScanHandlerProxy.fromHandle(core.MojoHandle handle) :
-      impl = new ScanHandlerProxyImpl.fromHandle(handle) {
+      impl = new _ScanHandlerProxyImpl.fromHandle(handle) {
     ptr = new _ScanHandlerProxyCalls(impl);
   }
 
   ScanHandlerProxy.unbound() :
-      impl = new ScanHandlerProxyImpl.unbound() {
+      impl = new _ScanHandlerProxyImpl.unbound() {
     ptr = new _ScanHandlerProxyCalls(impl);
   }
 
@@ -1716,6 +1704,8 @@
     return new ScanHandlerProxy.fromEndpoint(endpoint);
   }
 
+  String get serviceName => ScanHandler.serviceName;
+
   Future close({bool immediate: false}) => impl.close(immediate: immediate);
 
   Future responseOrError(Future f) => impl.responseOrError(f);
@@ -1754,8 +1744,6 @@
     return new ScanHandlerStub.fromEndpoint(endpoint);
   }
 
-  static const String name = ScanHandlerName;
-
 
 
   dynamic handleMessage(bindings.ServiceMessage message) {
@@ -1766,8 +1754,8 @@
     }
     assert(_impl != null);
     switch (message.header.type) {
-      case kScanHandler_update_name:
-        var params = ScanHandlerUpdateParams.deserialize(
+      case _ScanHandler_updateName:
+        var params = _ScanHandlerUpdateParams.deserialize(
             message.payload);
         _impl.update(params.update);
         break;
