diff --git a/go/src/mojom/vanadium/discovery/discovery.mojom.go b/go/src/mojom/vanadium/discovery/discovery.mojom.go
index f39fb62..61c835d 100644
--- a/go/src/mojom/vanadium/discovery/discovery.mojom.go
+++ b/go/src/mojom/vanadium/discovery/discovery.mojom.go
@@ -86,7 +86,7 @@
 }
 
 type Advertiser interface {
-	Advertise(inService Service, inVisibility []string) (outHandle uint32, outErr *Error, err error)
+	Advertise(inService Service, inVisibility *[]string) (outHandle uint32, outInstanceId string, outErr *Error, err error)
 	Stop(inH uint32) (err error)
 }
 
@@ -153,7 +153,7 @@
 
 type advertiser_Advertise_Params struct {
 	inService    Service
-	inVisibility []string
+	inVisibility *[]string
 }
 
 func (s *advertiser_Advertise_Params) Encode(encoder *bindings.Encoder) error {
@@ -164,24 +164,28 @@
 	if err := s.inService.Encode(encoder); err != nil {
 		return err
 	}
-	if err := encoder.WritePointer(); err != nil {
-		return err
-	}
-	encoder.StartArray(uint32(len(s.inVisibility)), 64)
-	for _, elem0 := range s.inVisibility {
+	if s.inVisibility == nil {
+		encoder.WriteNullPointer()
+	} else {
 		if err := encoder.WritePointer(); err != nil {
 			return err
 		}
-		if err := encoder.WriteString(elem0); err != nil {
+		encoder.StartArray(uint32(len((*s.inVisibility))), 64)
+		for _, elem0 := range *s.inVisibility {
+			if err := encoder.WritePointer(); err != nil {
+				return err
+			}
+			if err := encoder.WriteString(elem0); err != nil {
+				return err
+			}
+		}
+		if err := encoder.Finish(); err != nil {
 			return err
 		}
 	}
 	if err := encoder.Finish(); err != nil {
 		return err
 	}
-	if err := encoder.Finish(); err != nil {
-		return err
-	}
 	return nil
 }
 
@@ -227,13 +231,14 @@
 			return err
 		}
 		if pointer0 == 0 {
-			return &bindings.ValidationError{bindings.UnexpectedNullPointer, "unexpected null pointer"}
+			s.inVisibility = nil
 		} else {
+			s.inVisibility = new([]string)
 			len0, err := decoder.StartArray(64)
 			if err != nil {
 				return err
 			}
-			s.inVisibility = make([]string, len0)
+			(*s.inVisibility) = make([]string, len0)
 			for i0 := uint32(0); i0 < len0; i0++ {
 				pointer1, err := decoder.ReadPointer()
 				if err != nil {
@@ -246,7 +251,7 @@
 					if err != nil {
 						return err
 					}
-					s.inVisibility[i0] = value1
+					(*s.inVisibility)[i0] = value1
 				}
 			}
 			if err := decoder.Finish(); err != nil {
@@ -284,22 +289,29 @@
 				ShortName: &structFieldName_AdvertiserAdvertiseParams_InVisibility,
 			},
 			Type: &mojom_types.TypeArrayType{
-				Value: mojom_types.ArrayType{ElementType: &mojom_types.TypeStringType{mojom_types.StringType{false}}},
+				Value: mojom_types.ArrayType{Nullable: true, ElementType: &mojom_types.TypeStringType{mojom_types.StringType{false}}},
 			},
 		}},
 	}
 }
 
 type advertiser_Advertise_ResponseParams struct {
-	outHandle uint32
-	outErr    *Error
+	outHandle     uint32
+	outInstanceId string
+	outErr        *Error
 }
 
 func (s *advertiser_Advertise_ResponseParams) Encode(encoder *bindings.Encoder) error {
-	encoder.StartStruct(16, 0)
+	encoder.StartStruct(24, 0)
 	if err := encoder.WriteUint32(s.outHandle); err != nil {
 		return err
 	}
+	if err := encoder.WritePointer(); err != nil {
+		return err
+	}
+	if err := encoder.WriteString(s.outInstanceId); err != nil {
+		return err
+	}
 	if s.outErr == nil {
 		encoder.WriteNullPointer()
 	} else {
@@ -317,7 +329,7 @@
 }
 
 var advertiser_Advertise_ResponseParams_Versions []bindings.DataHeader = []bindings.DataHeader{
-	bindings.DataHeader{24, 0},
+	bindings.DataHeader{32, 0},
 }
 
 func (s *advertiser_Advertise_ResponseParams) Decode(decoder *bindings.Decoder) error {
@@ -352,6 +364,21 @@
 			return err
 		}
 		if pointer0 == 0 {
+			return &bindings.ValidationError{bindings.UnexpectedNullPointer, "unexpected null pointer"}
+		} else {
+			value0, err := decoder.ReadString()
+			if err != nil {
+				return err
+			}
+			s.outInstanceId = value0
+		}
+	}
+	if header.ElementsOrVersion >= 0 {
+		pointer0, err := decoder.ReadPointer()
+		if err != nil {
+			return err
+		}
+		if pointer0 == 0 {
 			s.outErr = nil
 		} else {
 			s.outErr = new(Error)
@@ -368,9 +395,10 @@
 
 // String names and labels used by the MojomStruct types.
 var (
-	structName_AdvertiserAdvertiseResponseParams                = "AdvertiserAdvertiseResponseParams"
-	structFieldName_AdvertiserAdvertiseResponseParams_OutHandle = "OutHandle"
-	structFieldName_AdvertiserAdvertiseResponseParams_OutErr    = "OutErr"
+	structName_AdvertiserAdvertiseResponseParams                    = "AdvertiserAdvertiseResponseParams"
+	structFieldName_AdvertiserAdvertiseResponseParams_OutHandle     = "OutHandle"
+	structFieldName_AdvertiserAdvertiseResponseParams_OutInstanceId = "OutInstanceId"
+	structFieldName_AdvertiserAdvertiseResponseParams_OutErr        = "OutErr"
 )
 
 func discovery_Advertiser_Advertise_ResponseParams__() mojom_types.MojomStruct {
@@ -384,6 +412,11 @@
 			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{
@@ -394,7 +427,7 @@
 	}
 }
 
-func (p *Advertiser_Proxy) Advertise(inService Service, inVisibility []string) (outHandle uint32, outErr *Error, err error) {
+func (p *Advertiser_Proxy) Advertise(inService Service, inVisibility *[]string) (outHandle uint32, outInstanceId string, outErr *Error, err error) {
 	payload := &advertiser_Advertise_Params{
 		inService,
 		inVisibility,
@@ -433,6 +466,7 @@
 		return
 	}
 	outHandle = response.outHandle
+	outInstanceId = response.outInstanceId
 	outErr = response.outErr
 	return
 }
@@ -606,7 +640,7 @@
 			return err
 		}
 		var response advertiser_Advertise_ResponseParams
-		response.outHandle, response.outErr, err = s.impl.Advertise(request.inService, request.inVisibility)
+		response.outHandle, response.outInstanceId, response.outErr, err = s.impl.Advertise(request.inService, request.inVisibility)
 		if err != nil {
 			return
 		}
@@ -1170,7 +1204,7 @@
 
 type ScanHandler interface {
 	Found(inService Service) (err error)
-	Lost(inInstanceId []uint8) (err error)
+	Lost(inInstanceId string) (err error)
 }
 
 var scanHandler_Name = "discovery::ScanHandler"
@@ -1338,7 +1372,7 @@
 }
 
 type scanHandler_Lost_Params struct {
-	inInstanceId []uint8
+	inInstanceId string
 }
 
 func (s *scanHandler_Lost_Params) Encode(encoder *bindings.Encoder) error {
@@ -1346,13 +1380,7 @@
 	if err := encoder.WritePointer(); err != nil {
 		return err
 	}
-	encoder.StartArray(uint32(len(s.inInstanceId)), 8)
-	for _, elem0 := range s.inInstanceId {
-		if err := encoder.WriteUint8(elem0); err != nil {
-			return err
-		}
-	}
-	if err := encoder.Finish(); err != nil {
+	if err := encoder.WriteString(s.inInstanceId); err != nil {
 		return err
 	}
 	if err := encoder.Finish(); err != nil {
@@ -1392,21 +1420,11 @@
 		if pointer0 == 0 {
 			return &bindings.ValidationError{bindings.UnexpectedNullPointer, "unexpected null pointer"}
 		} else {
-			len0, err := decoder.StartArray(8)
+			value0, err := decoder.ReadString()
 			if err != nil {
 				return err
 			}
-			s.inInstanceId = make([]uint8, len0)
-			for i0 := uint32(0); i0 < len0; i0++ {
-				value1, err := decoder.ReadUint8()
-				if err != nil {
-					return err
-				}
-				s.inInstanceId[i0] = value1
-			}
-			if err := decoder.Finish(); err != nil {
-				return err
-			}
+			s.inInstanceId = value0
 		}
 	}
 	if err := decoder.Finish(); err != nil {
@@ -1429,14 +1447,12 @@
 			DeclData: &mojom_types.DeclarationData{
 				ShortName: &structFieldName_ScanHandlerLostParams_InInstanceId,
 			},
-			Type: &mojom_types.TypeArrayType{
-				Value: mojom_types.ArrayType{ElementType: &mojom_types.TypeSimpleType{mojom_types.SimpleType_UinT8}},
-			},
+			Type: &mojom_types.TypeStringType{mojom_types.StringType{false}},
 		}},
 	}
 }
 
-func (p *ScanHandler_Proxy) Lost(inInstanceId []uint8) (err error) {
+func (p *ScanHandler_Proxy) Lost(inInstanceId string) (err error) {
 	payload := &scanHandler_Lost_Params{
 		inInstanceId,
 	}
@@ -1560,32 +1576,34 @@
 }
 
 type Service struct {
-	InstanceUuid  []uint8
-	InstanceName  string
+	InstanceId    *string
+	InstanceName  *string
 	InterfaceName string
-	Attrs         map[string]string
+	Attrs         *map[string]string
 	Addrs         []string
 }
 
 func (s *Service) Encode(encoder *bindings.Encoder) error {
 	encoder.StartStruct(40, 0)
-	if err := encoder.WritePointer(); err != nil {
-		return err
-	}
-	encoder.StartArray(uint32(len(s.InstanceUuid)), 8)
-	for _, elem0 := range s.InstanceUuid {
-		if err := encoder.WriteUint8(elem0); err != nil {
+	if s.InstanceId == nil {
+		encoder.WriteNullPointer()
+	} else {
+		if err := encoder.WritePointer(); err != nil {
+			return err
+		}
+		if err := encoder.WriteString((*s.InstanceId)); err != nil {
 			return err
 		}
 	}
-	if err := encoder.Finish(); err != nil {
-		return err
-	}
-	if err := encoder.WritePointer(); err != nil {
-		return err
-	}
-	if err := encoder.WriteString(s.InstanceName); err != nil {
-		return err
+	if s.InstanceName == nil {
+		encoder.WriteNullPointer()
+	} else {
+		if err := encoder.WritePointer(); err != nil {
+			return err
+		}
+		if err := encoder.WriteString((*s.InstanceName)); err != nil {
+			return err
+		}
 	}
 	if err := encoder.WritePointer(); err != nil {
 		return err
@@ -1593,50 +1611,54 @@
 	if err := encoder.WriteString(s.InterfaceName); err != nil {
 		return err
 	}
-	if err := encoder.WritePointer(); err != nil {
-		return err
-	}
-	encoder.StartMap()
-	{
-		var keys0 []string
-		var values0 []string
-		for key0, value0 := range s.Attrs {
-			keys0 = append(keys0, key0)
-			values0 = append(values0, value0)
-		}
+	if s.Attrs == nil {
+		encoder.WriteNullPointer()
+	} else {
 		if err := encoder.WritePointer(); err != nil {
 			return err
 		}
-		encoder.StartArray(uint32(len(keys0)), 64)
-		for _, elem1 := range keys0 {
+		encoder.StartMap()
+		{
+			var keys0 []string
+			var values0 []string
+			for key0, value0 := range *s.Attrs {
+				keys0 = append(keys0, key0)
+				values0 = append(values0, value0)
+			}
 			if err := encoder.WritePointer(); err != nil {
 				return err
 			}
-			if err := encoder.WriteString(elem1); err != nil {
+			encoder.StartArray(uint32(len(keys0)), 64)
+			for _, elem1 := range keys0 {
+				if err := encoder.WritePointer(); err != nil {
+					return err
+				}
+				if err := encoder.WriteString(elem1); err != nil {
+					return err
+				}
+			}
+			if err := encoder.Finish(); err != nil {
+				return err
+			}
+			if err := encoder.WritePointer(); err != nil {
+				return err
+			}
+			encoder.StartArray(uint32(len(values0)), 64)
+			for _, elem1 := range values0 {
+				if err := encoder.WritePointer(); err != nil {
+					return err
+				}
+				if err := encoder.WriteString(elem1); err != nil {
+					return err
+				}
+			}
+			if err := encoder.Finish(); err != nil {
 				return err
 			}
 		}
 		if err := encoder.Finish(); err != nil {
 			return err
 		}
-		if err := encoder.WritePointer(); err != nil {
-			return err
-		}
-		encoder.StartArray(uint32(len(values0)), 64)
-		for _, elem1 := range values0 {
-			if err := encoder.WritePointer(); err != nil {
-				return err
-			}
-			if err := encoder.WriteString(elem1); err != nil {
-				return err
-			}
-		}
-		if err := encoder.Finish(); err != nil {
-			return err
-		}
-	}
-	if err := encoder.Finish(); err != nil {
-		return err
 	}
 	if err := encoder.WritePointer(); err != nil {
 		return err
@@ -1688,23 +1710,14 @@
 			return err
 		}
 		if pointer0 == 0 {
-			return &bindings.ValidationError{bindings.UnexpectedNullPointer, "unexpected null pointer"}
+			s.InstanceId = nil
 		} else {
-			len0, err := decoder.StartArray(8)
+			s.InstanceId = new(string)
+			value0, err := decoder.ReadString()
 			if err != nil {
 				return err
 			}
-			s.InstanceUuid = make([]uint8, len0)
-			for i0 := uint32(0); i0 < len0; i0++ {
-				value1, err := decoder.ReadUint8()
-				if err != nil {
-					return err
-				}
-				s.InstanceUuid[i0] = value1
-			}
-			if err := decoder.Finish(); err != nil {
-				return err
-			}
+			(*s.InstanceId) = value0
 		}
 	}
 	if header.ElementsOrVersion >= 0 {
@@ -1713,13 +1726,14 @@
 			return err
 		}
 		if pointer0 == 0 {
-			return &bindings.ValidationError{bindings.UnexpectedNullPointer, "unexpected null pointer"}
+			s.InstanceName = nil
 		} else {
+			s.InstanceName = new(string)
 			value0, err := decoder.ReadString()
 			if err != nil {
 				return err
 			}
-			s.InstanceName = value0
+			(*s.InstanceName) = value0
 		}
 	}
 	if header.ElementsOrVersion >= 0 {
@@ -1743,8 +1757,9 @@
 			return err
 		}
 		if pointer0 == 0 {
-			return &bindings.ValidationError{bindings.UnexpectedNullPointer, "unexpected null pointer"}
+			s.Attrs = nil
 		} else {
+			s.Attrs = new(map[string]string)
 			if err := decoder.StartMap(); err != nil {
 				return err
 			}
@@ -1829,7 +1844,7 @@
 			for i0 := 0; i0 < len0; i0++ {
 				map0[keys0[i0]] = values0[i0]
 			}
-			s.Attrs = map0
+			(*s.Attrs) = map0
 		}
 	}
 	if header.ElementsOrVersion >= 0 {
@@ -1874,7 +1889,7 @@
 // String names and labels used by the MojomStruct types.
 var (
 	structName_Service                    = "Service"
-	structFieldName_Service_InstanceUuid  = "InstanceUuid"
+	structFieldName_Service_InstanceId    = "InstanceId"
 	structFieldName_Service_InstanceName  = "InstanceName"
 	structFieldName_Service_InterfaceName = "InterfaceName"
 	structFieldName_Service_Attrs         = "Attrs"
@@ -1887,16 +1902,14 @@
 			ShortName: &structName_Service,
 		}, Fields: []mojom_types.StructField{mojom_types.StructField{
 			DeclData: &mojom_types.DeclarationData{
-				ShortName: &structFieldName_Service_InstanceUuid,
+				ShortName: &structFieldName_Service_InstanceId,
 			},
-			Type: &mojom_types.TypeArrayType{
-				Value: mojom_types.ArrayType{ElementType: &mojom_types.TypeSimpleType{mojom_types.SimpleType_UinT8}},
-			},
+			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{false}},
+			Type: &mojom_types.TypeStringType{mojom_types.StringType{true}},
 		}, mojom_types.StructField{
 			DeclData: &mojom_types.DeclarationData{
 				ShortName: &structFieldName_Service_InterfaceName,
@@ -1907,7 +1920,7 @@
 				ShortName: &structFieldName_Service_Attrs,
 			},
 			Type: &mojom_types.TypeMapType{
-				Value: mojom_types.MapType{KeyType: &mojom_types.TypeStringType{mojom_types.StringType{false}},
+				Value: mojom_types.MapType{Nullable: true, KeyType: &mojom_types.TypeStringType{mojom_types.StringType{false}},
 					ValueType: &mojom_types.TypeStringType{mojom_types.StringType{false}},
 				},
 			},
diff --git a/go/src/vanadium/discovery/internal/discovery.go b/go/src/vanadium/discovery/internal/discovery.go
index 3ae5da2..512e19a 100644
--- a/go/src/vanadium/discovery/internal/discovery.go
+++ b/go/src/vanadium/discovery/internal/discovery.go
@@ -17,7 +17,7 @@
 	"v.io/v23/verror"
 )
 
-type id uint32
+type handleT uint32
 
 // DiscoveryService implements the mojom interface mojom/vanadium/discovery.DiscoveryService.  It
 // is basically a thin wrapper around the Vanadium Discovery API.
@@ -29,13 +29,13 @@
 	mu sync.Mutex
 
 	// The id to assign the next advertisement.
-	nextAdv id
+	nextAdv handleT
 	// A map of advertisement ids to the cancellation function.
-	activeAdvs map[id]func()
+	activeAdvs map[handleT]func()
 	// The id to assign to the next scan.
-	nextScan id
+	nextScan handleT
 	// A map of scan id to the cancellataion func()
-	activeScans map[id]func()
+	activeScans map[handleT]func()
 }
 
 func v2mError(err error) *mojom.Error {
@@ -53,32 +53,38 @@
 		ctx:         ctx,
 		discovery:   v23.GetDiscovery(ctx),
 		nextAdv:     1,
-		activeAdvs:  map[id]func(){},
-		activeScans: map[id]func(){},
+		activeAdvs:  map[handleT]func(){},
+		activeScans: map[handleT]func(){},
 	}
 }
 
-// Advertise advertises the mojom service passed only to the giveen blessing patterns. Returns the
-// handle to this Advertise call.
-func (d *DiscoveryService) Advertise(s mojom.Service, patterns []string) (uint32, *mojom.Error, error) {
+func (d *DiscoveryService) Advertise(service mojom.Service, visibility *[]string) (uint32, string, *mojom.Error, error) {
 	vService := discovery.Service{
-		InstanceUuid:  s.InstanceUuid,
-		InterfaceName: s.InterfaceName,
-		InstanceName:  s.InstanceName,
-		Attrs:         discovery.Attributes(s.Attrs),
-		Addrs:         s.Addrs,
+		InterfaceName: service.InterfaceName,
+		Addrs:         service.Addrs,
+	}
+	if service.InstanceId != nil {
+		vService.InstanceId = *service.InstanceId
+	}
+	if service.InstanceName != nil {
+		vService.InstanceName = *service.InstanceName
+	}
+	if service.Attrs != nil {
+		vService.Attrs = *service.Attrs
+	}
+	var vVisibility []security.BlessingPattern
+	if visibility != nil {
+		vVisibility := make([]security.BlessingPattern, len(*visibility))
+		for i, p := range *visibility {
+			vVisibility[i] = security.BlessingPattern(p)
+		}
 	}
 
 	ctx, cancel := context.WithCancel(d.ctx)
-
-	perms := make([]security.BlessingPattern, len(patterns))
-	for i, pattern := range patterns {
-		perms[i] = security.BlessingPattern(pattern)
-	}
-	done, err := d.discovery.Advertise(ctx, vService, perms)
+	done, err := d.discovery.Advertise(ctx, &vService, vVisibility)
 	if err != nil {
 		cancel()
-		return 0, v2mError(err), nil
+		return 0, "", v2mError(err), nil
 	}
 	d.mu.Lock()
 	currId := d.nextAdv
@@ -88,13 +94,13 @@
 	}
 	d.nextAdv += 2
 	d.mu.Unlock()
-	return uint32(currId), nil, nil
+	return uint32(currId), vService.InstanceId, nil, nil
 }
 
 func (d *DiscoveryService) stopAdvertising(handle uint32) error {
 	d.mu.Lock()
-	stop := d.activeAdvs[id(handle)]
-	delete(d.activeAdvs, id(handle))
+	stop := d.activeAdvs[handleT(handle)]
+	delete(d.activeAdvs, handleT(handle))
 	d.mu.Unlock()
 	if stop != nil {
 		stop()
@@ -103,17 +109,23 @@
 }
 
 func v2mService(s discovery.Service) mojom.Service {
-	return mojom.Service{
-		InstanceUuid:  s.InstanceUuid,
+	mService := mojom.Service{
 		InterfaceName: s.InterfaceName,
-		InstanceName:  s.InstanceName,
-		Attrs:         s.Attrs,
 		Addrs:         s.Addrs,
 	}
+	if len(s.InstanceId) > 0 {
+		mService.InstanceId = &s.InstanceId
+	}
+	if len(s.InstanceName) > 0 {
+		mService.InstanceName = &s.InstanceName
+	}
+	if len(s.Attrs) > 0 {
+		attr := map[string]string(s.Attrs)
+		mService.Attrs = &attr
+	}
+	return mService
 }
 
-// Scan scans for all services that match the query string passed in and calls scanHandler with updates.
-// Returns the handle to this Scan.
 func (d *DiscoveryService) Scan(query string, scanHandler mojom.ScanHandler_Pointer) (uint32, *mojom.Error, error) {
 	ctx, cancel := context.WithCancel(d.ctx)
 	scanCh, err := d.discovery.Scan(ctx, query)
@@ -134,7 +146,7 @@
 			case discovery.UpdateFound:
 				proxy.Found(v2mService(value.Value.Service))
 			case discovery.UpdateLost:
-				proxy.Lost(value.Value.InstanceUuid)
+				proxy.Lost(value.Value.InstanceId)
 			}
 		}
 	}()
@@ -151,8 +163,8 @@
 
 func (d *DiscoveryService) stopScan(handle uint32) error {
 	d.mu.Lock()
-	cancel := d.activeScans[id(handle)]
-	delete(d.activeScans, id(handle))
+	cancel := d.activeScans[handleT(handle)]
+	delete(d.activeScans, handleT(handle))
 	d.mu.Unlock()
 	if cancel != nil {
 		cancel()
diff --git a/go/src/vanadium/discovery/internal/discovery_test.go b/go/src/vanadium/discovery/internal/discovery_test.go
index 6aa62b4..2c64631 100644
--- a/go/src/vanadium/discovery/internal/discovery_test.go
+++ b/go/src/vanadium/discovery/internal/discovery_test.go
@@ -5,12 +5,13 @@
 package internal
 
 import (
+	"fmt"
+	"math/rand"
 	"reflect"
+	"strconv"
 	"sync"
 	"testing"
 
-	"third_party/go/tool/android_arm/src/fmt"
-
 	mojom "mojom/vanadium/discovery"
 
 	"v.io/v23/context"
@@ -32,10 +33,13 @@
 	deleteCh chan struct{}
 }
 
-func (d *mockDiscovery) Advertise(ctx *context.T, s discovery.Service, perms []security.BlessingPattern) (<-chan struct{}, error) {
+func (d *mockDiscovery) Advertise(ctx *context.T, s *discovery.Service, perms []security.BlessingPattern) (<-chan struct{}, error) {
+	if len(s.InstanceId) == 0 {
+		s.InstanceId = strconv.Itoa(rand.Int())
+	}
 	d.mu.Lock()
 	currId := d.id
-	d.services[currId] = s
+	d.services[currId] = *s
 	d.id++
 	d.mu.Unlock()
 	done := make(chan struct{})
@@ -65,6 +69,15 @@
 	return nil
 }
 
+func mkMojomService(instanceId, interfaceName string, attrs map[string]string, addrs []string) mojom.Service {
+	return mojom.Service{
+		InstanceId:    &instanceId,
+		InterfaceName: interfaceName,
+		Attrs:         &attrs,
+		Addrs:         addrs,
+	}
+}
+
 func TestAdvertising(t *testing.T) {
 	mock := &mockDiscovery{
 		trigger:  idiscovery.NewTrigger(),
@@ -76,48 +89,37 @@
 	ctx, shutdown := vtest.V23Init()
 	defer shutdown()
 
-	s := NewDiscoveryService(ctx)
-	testService := mojom.Service{
-		InterfaceName: "v.io/v23/discovery.T",
-		Attrs: map[string]string{
-			"key1": "value1",
-			"key2": "value2",
-		},
-		InstanceName: "service1",
-		Addrs:        []string{"addr1", "addr2"},
-	}
-	id, e1, e2 := s.Advertise(testService, nil)
+	ds := NewDiscoveryService(ctx)
 
+	s1 := mkMojomService("s1", "v.io/discovery", map[string]string{"k1": "v1", "k2": "v2"}, []string{"addr1", "addr2"})
+	h1, id1, e1, e2 := ds.Advertise(s1, nil)
 	if e1 != nil || e2 != nil {
-		t.Fatalf("Failed to start service: %v, %v", e1, e2)
+		t.Fatalf("failed to start service: %v, %v", e1, e2)
+	}
+	if got, want := id1, "s1"; got != want {
+		t.Errorf("got instance id %s, but want %s", got, want)
 	}
 	if len(mock.services) != 1 {
 		t.Errorf("service missing in mock")
 	}
 
 	for _, service := range mock.services {
-		if err := compare(service, testService); err != nil {
+		if err := compare(service, s1); err != nil {
 			t.Error(err)
 		}
-
 	}
 
-	testService2 := mojom.Service{
-		InterfaceName: "v.io/v23/naming.T",
-		Attrs: map[string]string{
-			"key1": "value1",
-			"key2": "value2",
-		},
-		InstanceName: "service2",
-		Addrs:        []string{"addr1", "addr2"},
-	}
-
-	_, e1, e2 = s.Advertise(testService2, nil)
+	s2 := mkMojomService("", "v.io/naming", map[string]string{"k1": "v1", "k2": "v2"}, []string{"addr3", "addr4"})
+	_, id2, e1, e2 := ds.Advertise(s2, nil)
 	if e1 != nil || e2 != nil {
-		t.Fatalf("Failed to start service: %v, %v", e1, e2)
+		t.Fatalf("failed to start service: %v, %v", e1, e2)
 	}
+	if len(id2) == 0 {
+		t.Error("empty instance id returned")
+	}
+	s2.InstanceId = &id2
 
-	s.Stop(id)
+	ds.Stop(h1)
 	// Wait for the deletion to finish.
 	<-mock.deleteCh
 	if len(mock.services) != 1 {
@@ -125,13 +127,12 @@
 	}
 
 	for _, service := range mock.services {
-		if err := compare(service, testService2); err != nil {
+		if err := compare(service, s2); err != nil {
 			t.Error(err)
 		}
-
 	}
 
-	s.StopAll()
+	ds.StopAll()
 	<-mock.deleteCh
 	if len(mock.services) != 0 {
 		t.Errorf("service should have been removed")
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 ced6cc3..6c91ff7 100644
--- a/lib/gen/dart-gen/mojom/lib/discovery/discovery.mojom.dart
+++ b/lib/gen/dart-gen/mojom/lib/discovery/discovery.mojom.dart
@@ -15,7 +15,7 @@
   static const List<bindings.StructDataHeader> kVersions = const [
     const bindings.StructDataHeader(48, 0)
   ];
-  List<int> instanceUuid = null;
+  String instanceId = null;
   String instanceName = null;
   String interfaceName = null;
   Map<String, String> attrs = null;
@@ -58,11 +58,11 @@
     }
     if (mainDataHeader.version >= 0) {
       
-      result.instanceUuid = decoder0.decodeUint8Array(8, bindings.kNothingNullable, bindings.kUnspecifiedArrayLength);
+      result.instanceId = decoder0.decodeString(8, true);
     }
     if (mainDataHeader.version >= 0) {
       
-      result.instanceName = decoder0.decodeString(16, false);
+      result.instanceName = decoder0.decodeString(16, true);
     }
     if (mainDataHeader.version >= 0) {
       
@@ -70,8 +70,10 @@
     }
     if (mainDataHeader.version >= 0) {
       
-      var decoder1 = decoder0.decodePointer(32, false);
-      {
+      var decoder1 = decoder0.decodePointer(32, true);
+      if (decoder1 == null) {
+        result.attrs = null;
+      } else {
         decoder1.decodeDataHeaderForMap();
         List<String> keys0;
         List<String> values0;
@@ -121,14 +123,14 @@
   void encode(bindings.Encoder encoder) {
     var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
     
-    encoder0.encodeUint8Array(instanceUuid, 8, bindings.kNothingNullable, bindings.kUnspecifiedArrayLength);
+    encoder0.encodeString(instanceId, 8, true);
     
-    encoder0.encodeString(instanceName, 16, false);
+    encoder0.encodeString(instanceName, 16, true);
     
     encoder0.encodeString(interfaceName, 24, false);
     
     if (attrs == null) {
-      encoder0.encodeNullPointer(32, false);
+      encoder0.encodeNullPointer(32, true);
     } else {
       var encoder1 = encoder0.encoderForMap(32);
       int size0 = attrs.length;
@@ -165,7 +167,7 @@
 
   String toString() {
     return "Service("
-           "instanceUuid: $instanceUuid" ", "
+           "instanceId: $instanceId" ", "
            "instanceName: $instanceName" ", "
            "interfaceName: $interfaceName" ", "
            "attrs: $attrs" ", "
@@ -174,7 +176,7 @@
 
   Map toJson() {
     Map map = new Map();
-    map["instanceUuid"] = instanceUuid;
+    map["instanceId"] = instanceId;
     map["instanceName"] = instanceName;
     map["interfaceName"] = interfaceName;
     map["attrs"] = attrs;
@@ -318,8 +320,10 @@
     }
     if (mainDataHeader.version >= 0) {
       
-      var decoder1 = decoder0.decodePointer(16, false);
-      {
+      var decoder1 = decoder0.decodePointer(16, true);
+      if (decoder1 == null) {
+        result.visibility = null;
+      } else {
         var si1 = decoder1.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
         result.visibility = new List<String>(si1.numElements);
         for (int i1 = 0; i1 < si1.numElements; ++i1) {
@@ -337,7 +341,7 @@
     encoder0.encodeStruct(service, 8, false);
     
     if (visibility == null) {
-      encoder0.encodeNullPointer(16, false);
+      encoder0.encodeNullPointer(16, true);
     } else {
       var encoder1 = encoder0.encodePointerArray(visibility.length, 16, bindings.kUnspecifiedArrayLength);
       for (int i0 = 0; i0 < visibility.length; ++i0) {
@@ -364,9 +368,10 @@
 
 class AdvertiserAdvertiseResponseParams extends bindings.Struct {
   static const List<bindings.StructDataHeader> kVersions = const [
-    const bindings.StructDataHeader(24, 0)
+    const bindings.StructDataHeader(32, 0)
   ];
   int handle = 0;
+  String instanceId = null;
   Error err = null;
 
   AdvertiserAdvertiseResponseParams() : super(kVersions.last.size);
@@ -410,7 +415,11 @@
     }
     if (mainDataHeader.version >= 0) {
       
-      var decoder1 = decoder0.decodePointer(16, true);
+      result.instanceId = decoder0.decodeString(16, false);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(24, true);
       result.err = Error.decode(decoder1);
     }
     return result;
@@ -421,18 +430,22 @@
     
     encoder0.encodeUint32(handle, 8);
     
-    encoder0.encodeStruct(err, 16, true);
+    encoder0.encodeString(instanceId, 16, false);
+    
+    encoder0.encodeStruct(err, 24, true);
   }
 
   String toString() {
     return "AdvertiserAdvertiseResponseParams("
            "handle: $handle" ", "
+           "instanceId: $instanceId" ", "
            "err: $err" ")";
   }
 
   Map toJson() {
     Map map = new Map();
     map["handle"] = handle;
+    map["instanceId"] = instanceId;
     map["err"] = err;
     return map;
   }
@@ -796,7 +809,7 @@
   static const List<bindings.StructDataHeader> kVersions = const [
     const bindings.StructDataHeader(16, 0)
   ];
-  List<int> instanceId = null;
+  String instanceId = null;
 
   ScanHandlerLostParams() : super(kVersions.last.size);
 
@@ -835,7 +848,7 @@
     }
     if (mainDataHeader.version >= 0) {
       
-      result.instanceId = decoder0.decodeUint8Array(8, bindings.kNothingNullable, bindings.kUnspecifiedArrayLength);
+      result.instanceId = decoder0.decodeString(8, false);
     }
     return result;
   }
@@ -843,7 +856,7 @@
   void encode(bindings.Encoder encoder) {
     var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
     
-    encoder0.encodeUint8Array(instanceId, 8, bindings.kNothingNullable, bindings.kUnspecifiedArrayLength);
+    encoder0.encodeString(instanceId, 8, false);
   }
 
   String toString() {
@@ -1030,9 +1043,10 @@
   static const String name = AdvertiserName;
 
 
-  AdvertiserAdvertiseResponseParams _AdvertiserAdvertiseResponseParamsFactory(int handle, Error err) {
+  AdvertiserAdvertiseResponseParams _AdvertiserAdvertiseResponseParamsFactory(int handle, String instanceId, Error err) {
     var result = new AdvertiserAdvertiseResponseParams();
     result.handle = handle;
+    result.instanceId = instanceId;
     result.err = err;
     return result;
   }
@@ -1336,7 +1350,7 @@
 
 abstract class ScanHandler {
   void found(Service service);
-  void lost(List<int> instanceId);
+  void lost(String instanceId);
 
 }
 
@@ -1388,7 +1402,7 @@
       _proxyImpl.sendMessage(params, kScanHandler_found_name);
     }
   
-    void lost(List<int> instanceId) {
+    void lost(String instanceId) {
       if (!_proxyImpl.isBound) {
         _proxyImpl.proxyError("The Proxy is closed.");
         return;
diff --git a/mojom/vanadium/discovery.mojom b/mojom/vanadium/discovery.mojom
index f61ccdb..f29ddd2 100644
--- a/mojom/vanadium/discovery.mojom
+++ b/mojom/vanadium/discovery.mojom
@@ -6,17 +6,17 @@
 
 // Copied from v.io/v23/discovery/types.vdl
 struct Service {
-  // The 128 bit (16 byte) universal unique identifier of a service instance.
-  // If this is not specified, a random UUID will be used.
-  array<uint8> InstanceUuid;
+  // The universal unique identifier of a service instance.
+  // If this is not specified, a random 128 bit (16 byte) UUID will be used.
+  string? InstanceId;
   // Optional name of the service instance.
-  string InstanceName;
+  string? InstanceName;
   // The interface that the service implements.
   // E.g., 'v.io/v23/services/vtrace.Store'.
   string InterfaceName;
   // The service attributes.
   // E.g., {'resolution': '1024x768'}.
-  map<string, string> Attrs;
+  map<string, string>? Attrs;
   // The addresses that the service is served on.
   // E.g., '/host:port/a/b/c'.
   array<string> Addrs;
@@ -37,7 +37,7 @@
   //
   // It is an error to have simultaneously active advertisements for two identical
   // instances (service.InstanceUuid).
-  Advertise(Service service, array<string> visibility) => (uint32 Handle, Error? Err);
+  Advertise(Service service, array<string>? visibility) => (uint32 Handle, string instanceId, Error? Err);
 
   // Stop Stops the advertisement associated with the given handle.
   Stop(uint32 h);
@@ -71,5 +71,5 @@
   Found(Service service);
 
   // Lost will be called when a service is lost.
-  Lost(array<uint8> instanceId);
+  Lost(string instanceId);
 };
