diff --git a/go/src/mojom/v.io/x/ref/services/discovery/ble/ble/ble.mojom.go b/go/src/mojom/v.io/x/ref/services/discovery/ble/ble/ble.mojom.go
index ebcf1fa..4276952 100644
--- a/go/src/mojom/v.io/x/ref/services/discovery/ble/ble/ble.mojom.go
+++ b/go/src/mojom/v.io/x/ref/services/discovery/ble/ble/ble.mojom.go
@@ -647,8 +647,8 @@
 }
 
 type PluginScanHandler interface {
-	Add(inS Service) (err error)
-	Remove(inS Service) (err error)
+	Found(inS Advertisement) (err error)
+	Lost(inS Advertisement) (err error)
 }
 
 var pluginScanHandler_Name = "ble::PluginScanHandler"
@@ -689,8 +689,8 @@
         return PluginScanHandler_Request(r), PluginScanHandler_Pointer(p)
 }
 
-const pluginScanHandler_Add_Name uint32 = 0
-const pluginScanHandler_Remove_Name uint32 = 1
+const pluginScanHandler_Found_Name uint32 = 0
+const pluginScanHandler_Lost_Name uint32 = 1
 
 type PluginScanHandler_Proxy struct {
 	router *bindings.Router
@@ -708,11 +708,11 @@
 	p.router.Close()
 }
 
-type pluginScanHandler_Add_Params struct {
-	inS Service
+type pluginScanHandler_Found_Params struct {
+	inS Advertisement
 }
 
-func (s *pluginScanHandler_Add_Params) Encode(encoder *bindings.Encoder) error {
+func (s *pluginScanHandler_Found_Params) Encode(encoder *bindings.Encoder) error {
 	encoder.StartStruct(8, 0)
 	if err := encoder.WritePointer(); err != nil {
 		return err
@@ -726,23 +726,23 @@
 	return nil
 }
 
-var pluginScanHandler_Add_Params_Versions []bindings.DataHeader = []bindings.DataHeader{
+var pluginScanHandler_Found_Params_Versions []bindings.DataHeader = []bindings.DataHeader{
 	bindings.DataHeader{16, 0},
 }
 
-func (s *pluginScanHandler_Add_Params) Decode(decoder *bindings.Decoder) error {
+func (s *pluginScanHandler_Found_Params) Decode(decoder *bindings.Decoder) error {
 	header, err := decoder.StartStruct()
 	if err != nil {
 		return err
 	}
-	index := sort.Search(len(pluginScanHandler_Add_Params_Versions), func(i int) bool {
-		return pluginScanHandler_Add_Params_Versions[i].ElementsOrVersion >= header.ElementsOrVersion
+	index := sort.Search(len(pluginScanHandler_Found_Params_Versions), func(i int) bool {
+		return pluginScanHandler_Found_Params_Versions[i].ElementsOrVersion >= header.ElementsOrVersion
 	})
-	if index < len(pluginScanHandler_Add_Params_Versions) {
-		if pluginScanHandler_Add_Params_Versions[index].ElementsOrVersion > header.ElementsOrVersion {
+	if index < len(pluginScanHandler_Found_Params_Versions) {
+		if pluginScanHandler_Found_Params_Versions[index].ElementsOrVersion > header.ElementsOrVersion {
 			index--
 		}
-		expectedSize := pluginScanHandler_Add_Params_Versions[index].Size
+		expectedSize := pluginScanHandler_Found_Params_Versions[index].Size
 		if expectedSize != header.Size {
 			return &bindings.ValidationError{bindings.UnexpectedStructHeader,
 				fmt.Sprintf("invalid struct header size: should be %d, but was %d", expectedSize, header.Size),
@@ -768,12 +768,12 @@
 	return nil
 }
 
-func (p *PluginScanHandler_Proxy) Add(inS Service) (err error) {
-	payload := &pluginScanHandler_Add_Params{
+func (p *PluginScanHandler_Proxy) Found(inS Advertisement) (err error) {
+	payload := &pluginScanHandler_Found_Params{
 		inS,
 	}
 	header := bindings.MessageHeader{
-		Type: pluginScanHandler_Add_Name,
+		Type: pluginScanHandler_Found_Name,
 		Flags: bindings.MessageNoFlag,
 	}
 	var message *bindings.Message
@@ -789,11 +789,11 @@
 	return
 }
 
-type pluginScanHandler_Remove_Params struct {
-	inS Service
+type pluginScanHandler_Lost_Params struct {
+	inS Advertisement
 }
 
-func (s *pluginScanHandler_Remove_Params) Encode(encoder *bindings.Encoder) error {
+func (s *pluginScanHandler_Lost_Params) Encode(encoder *bindings.Encoder) error {
 	encoder.StartStruct(8, 0)
 	if err := encoder.WritePointer(); err != nil {
 		return err
@@ -807,23 +807,23 @@
 	return nil
 }
 
-var pluginScanHandler_Remove_Params_Versions []bindings.DataHeader = []bindings.DataHeader{
+var pluginScanHandler_Lost_Params_Versions []bindings.DataHeader = []bindings.DataHeader{
 	bindings.DataHeader{16, 0},
 }
 
-func (s *pluginScanHandler_Remove_Params) Decode(decoder *bindings.Decoder) error {
+func (s *pluginScanHandler_Lost_Params) Decode(decoder *bindings.Decoder) error {
 	header, err := decoder.StartStruct()
 	if err != nil {
 		return err
 	}
-	index := sort.Search(len(pluginScanHandler_Remove_Params_Versions), func(i int) bool {
-		return pluginScanHandler_Remove_Params_Versions[i].ElementsOrVersion >= header.ElementsOrVersion
+	index := sort.Search(len(pluginScanHandler_Lost_Params_Versions), func(i int) bool {
+		return pluginScanHandler_Lost_Params_Versions[i].ElementsOrVersion >= header.ElementsOrVersion
 	})
-	if index < len(pluginScanHandler_Remove_Params_Versions) {
-		if pluginScanHandler_Remove_Params_Versions[index].ElementsOrVersion > header.ElementsOrVersion {
+	if index < len(pluginScanHandler_Lost_Params_Versions) {
+		if pluginScanHandler_Lost_Params_Versions[index].ElementsOrVersion > header.ElementsOrVersion {
 			index--
 		}
-		expectedSize := pluginScanHandler_Remove_Params_Versions[index].Size
+		expectedSize := pluginScanHandler_Lost_Params_Versions[index].Size
 		if expectedSize != header.Size {
 			return &bindings.ValidationError{bindings.UnexpectedStructHeader,
 				fmt.Sprintf("invalid struct header size: should be %d, but was %d", expectedSize, header.Size),
@@ -849,12 +849,12 @@
 	return nil
 }
 
-func (p *PluginScanHandler_Proxy) Remove(inS Service) (err error) {
-	payload := &pluginScanHandler_Remove_Params{
+func (p *PluginScanHandler_Proxy) Lost(inS Advertisement) (err error) {
+	payload := &pluginScanHandler_Lost_Params{
 		inS,
 	}
 	header := bindings.MessageHeader{
-		Type: pluginScanHandler_Remove_Name,
+		Type: pluginScanHandler_Lost_Name,
 		Flags: bindings.MessageNoFlag,
 	}
 	var message *bindings.Message
@@ -882,31 +882,31 @@
 
 func (s *pluginScanHandler_Stub) Accept(message *bindings.Message) (err error) {
 	switch message.Header.Type {
-	case pluginScanHandler_Add_Name:
+	case pluginScanHandler_Found_Name:
 		if message.Header.Flags != bindings.MessageNoFlag {
 			return &bindings.ValidationError{bindings.MessageHeaderInvalidFlags,
 				fmt.Sprintf("invalid message header flag: %v", message.Header.Flags),
 			}
 		}
-		var request pluginScanHandler_Add_Params
+		var request pluginScanHandler_Found_Params
 		if err := message.DecodePayload(&request); err != nil {
 			return err
 		}
-		err = s.impl.Add(request.inS)
+		err = s.impl.Found(request.inS)
 		if err != nil {
 			return
 		}
-	case pluginScanHandler_Remove_Name:
+	case pluginScanHandler_Lost_Name:
 		if message.Header.Flags != bindings.MessageNoFlag {
 			return &bindings.ValidationError{bindings.MessageHeaderInvalidFlags,
 				fmt.Sprintf("invalid message header flag: %v", message.Header.Flags),
 			}
 		}
-		var request pluginScanHandler_Remove_Params
+		var request pluginScanHandler_Lost_Params
 		if err := message.DecodePayload(&request); err != nil {
 			return err
 		}
-		err = s.impl.Remove(request.inS)
+		err = s.impl.Lost(request.inS)
 		if err != nil {
 			return
 		}
diff --git a/go/src/mojom/v.io/x/ref/services/discovery/discovery/discovery.mojom.go b/go/src/mojom/v.io/x/ref/services/discovery/discovery/discovery.mojom.go
index 5ccd99f..9ad87c7 100644
--- a/go/src/mojom/v.io/x/ref/services/discovery/discovery/discovery.mojom.go
+++ b/go/src/mojom/v.io/x/ref/services/discovery/discovery/discovery.mojom.go
@@ -930,7 +930,7 @@
 }
 
 type Service struct {
-	InterfaceNames []string
+	InterfaceNames string
 	Attrs map[string]string
 	Addrs []string
 }
@@ -940,16 +940,7 @@
 	if err := encoder.WritePointer(); err != nil {
 		return err
 	}
-	encoder.StartArray(uint32(len(s.InterfaceNames)), 64)
-	for _, elem0 := range s.InterfaceNames {
-		if err := encoder.WritePointer(); err != nil {
-			return err
-		}
-		if err := encoder.WriteString(elem0); err != nil {
-			return err
-		}
-	}
-	if err := encoder.Finish(); err != nil {
+	if err := encoder.WriteString(s.InterfaceNames); err != nil {
 		return err
 	}
 	if err := encoder.WritePointer(); err != nil {
@@ -1049,29 +1040,11 @@
 		if pointer0 == 0 {
 			return &bindings.ValidationError{bindings.UnexpectedNullPointer, "unexpected null pointer"}
 		} else {
-			len0, err := decoder.StartArray(64)
+			value0, err := decoder.ReadString()
 			if err != nil {
 				return err
 			}
-			s.InterfaceNames = make([]string, len0)
-			for i0 := uint32(0); i0 < len0; i0++ {
-				pointer1, err := decoder.ReadPointer()
-				if err != nil {
-					return err
-				}
-				if pointer1 == 0 {
-					return &bindings.ValidationError{bindings.UnexpectedNullPointer, "unexpected null pointer"}
-				} else {
-					value1, err := decoder.ReadString()
-					if err != nil {
-						return err
-					}
-					s.InterfaceNames[i0] = value1
-				}
-			}
-			if err := decoder.Finish(); err != nil {
-				return err
-			}
+			s.InterfaceNames = value0
 		}
 	}
 	if header.ElementsOrVersion >= 0 {
diff --git a/go/src/v.io/x/ref/services/discovery/ble/neighborhood.go b/go/src/v.io/x/ref/services/discovery/ble/neighborhood.go
index b26d003..301316a 100644
--- a/go/src/v.io/x/ref/services/discovery/ble/neighborhood.go
+++ b/go/src/v.io/x/ref/services/discovery/ble/neighborhood.go
@@ -101,12 +101,28 @@
 	}
 	matches := s.matches(id, newService)
 	oldMatches := s.matches(id, oldService)
+	uuid, err := hex.DecodeString(id)
+	if err != nil {
+		log.Fatal("Failed to decode uuid:",id,",",err)
+	}
 	if oldMatches {
-		s.ch <- &update{found: false, service: *oldService}
+		s.ch <- &update{
+			found: false,
+			adv: ble.Advertisement{
+				ServiceId: uuid,
+				Service: *oldService,
+			},
+		}
 	}
 
 	if matches {
-		s.ch <- &update{found: true, service: *newService}
+		s.ch <- &update{
+			found: true,
+			adv: ble.Advertisement{
+				ServiceId: uuid,
+				Service: *newService,
+			},
+		}
 	}
 }
 
@@ -134,7 +150,7 @@
 
 type update struct {
 	found   bool
-	service ble.Service
+	adv ble.Advertisement
 }
 
 type bleCacheEntry struct {
diff --git a/go/src/v.io/x/ref/services/discovery/ble/service.go b/go/src/v.io/x/ref/services/discovery/ble/service.go
index 9270097..bf0a91a 100644
--- a/go/src/v.io/x/ref/services/discovery/ble/service.go
+++ b/go/src/v.io/x/ref/services/discovery/ble/service.go
@@ -32,9 +32,9 @@
 	go func() {
 		for v := range ch {
 			if v.found {
-				proxy.Add(v.service)
+				proxy.Found(v.adv)
 			} else {
-				proxy.Remove(v.service)
+				proxy.Lost(v.adv)
 			}
 		}
 	}()
diff --git a/mojom/v.io/x/ref/services/discovery/ble/ble.mojom b/mojom/v.io/x/ref/services/discovery/ble/ble.mojom
index 331c735..62985f7 100644
--- a/mojom/v.io/x/ref/services/discovery/ble/ble.mojom
+++ b/mojom/v.io/x/ref/services/discovery/ble/ble.mojom
@@ -27,9 +27,9 @@
 };
 
 interface PluginScanHandler {
-    Add(Service s);
+    Found(Advertisement s);
 
-    Remove(Service s);
+    Lost(Advertisement s);
 };
 
 interface PluginStopper {
