Addressed comments.

Change-Id: I1cca2eaf9f5357061acfb9e23000f677526a1762
diff --git a/go/src/examples/advertiser/advertiser.go b/go/src/examples/advertiser/advertiser.go
index bd05870..0d04f68 100644
--- a/go/src/examples/advertiser/advertiser.go
+++ b/go/src/examples/advertiser/advertiser.go
@@ -4,8 +4,8 @@
 	"log"
 
 	"mojo/public/go/application"
-	"mojo/public/go/system"
 	"mojo/public/go/bindings"
+	"mojo/public/go/system"
 
 	"mojom/vanadium/discovery"
 )
@@ -14,21 +14,21 @@
 import "C"
 
 type advDelegate struct {
-	id int32
-	proxy *discovery.Discoverer_Proxy
+	id    int32
+	proxy *discovery.Advertiser_Proxy
 }
 
 func (a *advDelegate) Initialize(ctx application.Context) {
-	req, ptr := discovery.CreateMessagePipeForDiscoverer()
+	req, ptr := discovery.CreateMessagePipeForAdvertiser()
 	ctx.ConnectToApplication("https://mojo.v.io/discovery.mojo").ConnectToService(&req)
-	a.proxy = discovery.NewDiscovererProxy(ptr, bindings.GetAsyncWaiter())
+	a.proxy = discovery.NewAdvertiserProxy(ptr, bindings.GetAsyncWaiter())
 	s := discovery.Service{
 		InterfaceName: "v.io/discovery.T",
-		Addrs: []string{"localhost:1000", "localhost:2000"},
-		Attrs: map[string]string{ "foo" : "bar"},
+		Addrs:         []string{"localhost:1000", "localhost:2000"},
+		Attrs:         map[string]string{"foo": "bar"},
 	}
 	id, e1, e2 := a.proxy.Advertise(s, nil)
-	if e1 != nil  || e2 != nil{
+	if e1 != nil || e2 != nil {
 		log.Println("Error occurred", e1, e2)
 		return
 	}
@@ -36,7 +36,6 @@
 	a.id = id
 }
 
-
 func (*advDelegate) AcceptConnection(connection *application.Connection) {
 	connection.Close()
 }
@@ -45,7 +44,6 @@
 	s.proxy.StopAdvertising(s.id)
 }
 
-
 //export MojoMain
 func MojoMain(handle C.MojoHandle) C.MojoResult {
 	application.Run(&advDelegate{}, system.MojoHandle(handle))
diff --git a/go/src/examples/scanner/scanner.go b/go/src/examples/scanner/scanner.go
index 6c749fe..60ed6d9 100644
--- a/go/src/examples/scanner/scanner.go
+++ b/go/src/examples/scanner/scanner.go
@@ -4,8 +4,8 @@
 	"log"
 
 	"mojo/public/go/application"
-	"mojo/public/go/system"
 	"mojo/public/go/bindings"
+	"mojo/public/go/system"
 
 	"mojom/vanadium/discovery"
 )
@@ -13,7 +13,7 @@
 //#include "mojo/public/c/system/types.h"
 import "C"
 
-type handler struct {}
+type handler struct{}
 
 func (*handler) Found(s discovery.Service) error {
 	log.Println("Found a new service", s)
@@ -26,19 +26,19 @@
 }
 
 type scannerDelegate struct {
-	id int32
-	proxy *discovery.Discoverer_Proxy
-	stub *bindings.Stub
+	id    int32
+	proxy *discovery.Scanner_Proxy
+	stub  *bindings.Stub
 }
 
 func (s *scannerDelegate) Initialize(ctx application.Context) {
-	req, ptr := discovery.CreateMessagePipeForDiscoverer()
+	req, ptr := discovery.CreateMessagePipeForScanner()
 	ctx.ConnectToApplication("https://mojo.v.io/discovery.mojo").ConnectToService(&req)
-	s.proxy = discovery.NewDiscovererProxy(ptr, bindings.GetAsyncWaiter())
+	s.proxy = discovery.NewScannerProxy(ptr, bindings.GetAsyncWaiter())
 	scanReq, scanPtr := discovery.CreateMessagePipeForScanHandler()
 	s.stub = discovery.NewScanHandlerStub(scanReq, &handler{}, bindings.GetAsyncWaiter())
 	id, e1, e2 := s.proxy.Scan("v.io/discovery.T", scanPtr)
-	if e1 != nil  || e2 != nil{
+	if e1 != nil || e2 != nil {
 		log.Println("Error occurred", e1, e2)
 		return
 	}
@@ -57,7 +57,6 @@
 	}()
 }
 
-
 func (*scannerDelegate) AcceptConnection(connection *application.Connection) {
 	connection.Close()
 }
@@ -67,7 +66,6 @@
 	s.stub.Close()
 }
 
-
 //export MojoMain
 func MojoMain(handle C.MojoHandle) C.MojoResult {
 	application.Run(&scannerDelegate{}, system.MojoHandle(handle))
diff --git a/go/src/mojom/vanadium/discovery/discovery.mojom.go b/go/src/mojom/vanadium/discovery/discovery.mojom.go
index 3caf89c..458c651 100644
--- a/go/src/mojom/vanadium/discovery/discovery.mojom.go
+++ b/go/src/mojom/vanadium/discovery/discovery.mojom.go
@@ -17,78 +17,74 @@
 	"sort"
 )
 
-type Discoverer interface {
+type Advertiser interface {
 	Advertise(inS Service, inPattern []string) (outHandle int32, outErr *Error, err error)
 	StopAdvertising(inH int32) (err error)
-	Scan(inQuery string, inScanHandler ScanHandler_Pointer) (outHandle int32, outErr *Error, err error)
-	StopScan(inH int32) (err error)
 }
 
-var discoverer_Name = "discovery::Discoverer"
+var advertiser_Name = "discovery::Advertiser"
 
-type Discoverer_Request bindings.InterfaceRequest
+type Advertiser_Request bindings.InterfaceRequest
 
-func (r *Discoverer_Request) Name() string {
-	return discoverer_Name
+func (r *Advertiser_Request) Name() string {
+	return advertiser_Name
 }
 
-type Discoverer_Pointer bindings.InterfacePointer
+type Advertiser_Pointer bindings.InterfacePointer
 
-func (p *Discoverer_Pointer) Name() string {
-	return discoverer_Name
+func (p *Advertiser_Pointer) Name() string {
+	return advertiser_Name
 }
 
-type Discoverer_ServiceFactory struct {
-	Delegate Discoverer_Factory
+type Advertiser_ServiceFactory struct {
+	Delegate Advertiser_Factory
 }
 
-type Discoverer_Factory interface {
-	Create(request Discoverer_Request)
+type Advertiser_Factory interface {
+	Create(request Advertiser_Request)
 }
 
-func (f *Discoverer_ServiceFactory) Name() string {
-	return discoverer_Name
+func (f *Advertiser_ServiceFactory) Name() string {
+	return advertiser_Name
 }
 
-func (f *Discoverer_ServiceFactory) Create(messagePipe system.MessagePipeHandle) {
-	request := Discoverer_Request{bindings.NewMessagePipeHandleOwner(messagePipe)}
+func (f *Advertiser_ServiceFactory) Create(messagePipe system.MessagePipeHandle) {
+	request := Advertiser_Request{bindings.NewMessagePipeHandleOwner(messagePipe)}
 	f.Delegate.Create(request)
 }
 
-// CreateMessagePipeForDiscoverer creates a message pipe for use with the
-// Discoverer interface with a Discoverer_Request on one end and a Discoverer_Pointer on the other.
-func CreateMessagePipeForDiscoverer() (Discoverer_Request, Discoverer_Pointer) {
+// CreateMessagePipeForAdvertiser creates a message pipe for use with the
+// Advertiser interface with a Advertiser_Request on one end and a Advertiser_Pointer on the other.
+func CreateMessagePipeForAdvertiser() (Advertiser_Request, Advertiser_Pointer) {
 	r, p := bindings.CreateMessagePipeForMojoInterface()
-	return Discoverer_Request(r), Discoverer_Pointer(p)
+	return Advertiser_Request(r), Advertiser_Pointer(p)
 }
 
-const discoverer_Advertise_Name uint32 = 0
-const discoverer_StopAdvertising_Name uint32 = 1
-const discoverer_Scan_Name uint32 = 2
-const discoverer_StopScan_Name uint32 = 3
+const advertiser_Advertise_Name uint32 = 0
+const advertiser_StopAdvertising_Name uint32 = 1
 
-type Discoverer_Proxy struct {
+type Advertiser_Proxy struct {
 	router *bindings.Router
 	ids    bindings.Counter
 }
 
-func NewDiscovererProxy(p Discoverer_Pointer, waiter bindings.AsyncWaiter) *Discoverer_Proxy {
-	return &Discoverer_Proxy{
+func NewAdvertiserProxy(p Advertiser_Pointer, waiter bindings.AsyncWaiter) *Advertiser_Proxy {
+	return &Advertiser_Proxy{
 		bindings.NewRouter(p.PassMessagePipe(), waiter),
 		bindings.NewCounter(),
 	}
 }
 
-func (p *Discoverer_Proxy) Close_Proxy() {
+func (p *Advertiser_Proxy) Close_Proxy() {
 	p.router.Close()
 }
 
-type discoverer_Advertise_Params struct {
+type advertiser_Advertise_Params struct {
 	inS       Service
 	inPattern []string
 }
 
-func (s *discoverer_Advertise_Params) Encode(encoder *bindings.Encoder) error {
+func (s *advertiser_Advertise_Params) Encode(encoder *bindings.Encoder) error {
 	encoder.StartStruct(16, 0)
 	if err := encoder.WritePointer(); err != nil {
 		return err
@@ -117,23 +113,23 @@
 	return nil
 }
 
-var discoverer_Advertise_Params_Versions []bindings.DataHeader = []bindings.DataHeader{
+var advertiser_Advertise_Params_Versions []bindings.DataHeader = []bindings.DataHeader{
 	bindings.DataHeader{24, 0},
 }
 
-func (s *discoverer_Advertise_Params) Decode(decoder *bindings.Decoder) error {
+func (s *advertiser_Advertise_Params) Decode(decoder *bindings.Decoder) error {
 	header, err := decoder.StartStruct()
 	if err != nil {
 		return err
 	}
-	index := sort.Search(len(discoverer_Advertise_Params_Versions), func(i int) bool {
-		return discoverer_Advertise_Params_Versions[i].ElementsOrVersion >= header.ElementsOrVersion
+	index := sort.Search(len(advertiser_Advertise_Params_Versions), func(i int) bool {
+		return advertiser_Advertise_Params_Versions[i].ElementsOrVersion >= header.ElementsOrVersion
 	})
-	if index < len(discoverer_Advertise_Params_Versions) {
-		if discoverer_Advertise_Params_Versions[index].ElementsOrVersion > header.ElementsOrVersion {
+	if index < len(advertiser_Advertise_Params_Versions) {
+		if advertiser_Advertise_Params_Versions[index].ElementsOrVersion > header.ElementsOrVersion {
 			index--
 		}
-		expectedSize := discoverer_Advertise_Params_Versions[index].Size
+		expectedSize := advertiser_Advertise_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),
@@ -192,12 +188,12 @@
 	return nil
 }
 
-type discoverer_Advertise_ResponseParams struct {
+type advertiser_Advertise_ResponseParams struct {
 	outHandle int32
 	outErr    *Error
 }
 
-func (s *discoverer_Advertise_ResponseParams) Encode(encoder *bindings.Encoder) error {
+func (s *advertiser_Advertise_ResponseParams) Encode(encoder *bindings.Encoder) error {
 	encoder.StartStruct(16, 0)
 	if err := encoder.WriteInt32(s.outHandle); err != nil {
 		return err
@@ -218,23 +214,23 @@
 	return nil
 }
 
-var discoverer_Advertise_ResponseParams_Versions []bindings.DataHeader = []bindings.DataHeader{
+var advertiser_Advertise_ResponseParams_Versions []bindings.DataHeader = []bindings.DataHeader{
 	bindings.DataHeader{24, 0},
 }
 
-func (s *discoverer_Advertise_ResponseParams) Decode(decoder *bindings.Decoder) error {
+func (s *advertiser_Advertise_ResponseParams) Decode(decoder *bindings.Decoder) error {
 	header, err := decoder.StartStruct()
 	if err != nil {
 		return err
 	}
-	index := sort.Search(len(discoverer_Advertise_ResponseParams_Versions), func(i int) bool {
-		return discoverer_Advertise_ResponseParams_Versions[i].ElementsOrVersion >= header.ElementsOrVersion
+	index := sort.Search(len(advertiser_Advertise_ResponseParams_Versions), func(i int) bool {
+		return advertiser_Advertise_ResponseParams_Versions[i].ElementsOrVersion >= header.ElementsOrVersion
 	})
-	if index < len(discoverer_Advertise_ResponseParams_Versions) {
-		if discoverer_Advertise_ResponseParams_Versions[index].ElementsOrVersion > header.ElementsOrVersion {
+	if index < len(advertiser_Advertise_ResponseParams_Versions) {
+		if advertiser_Advertise_ResponseParams_Versions[index].ElementsOrVersion > header.ElementsOrVersion {
 			index--
 		}
-		expectedSize := discoverer_Advertise_ResponseParams_Versions[index].Size
+		expectedSize := advertiser_Advertise_ResponseParams_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),
@@ -268,13 +264,13 @@
 	return nil
 }
 
-func (p *Discoverer_Proxy) Advertise(inS Service, inPattern []string) (outHandle int32, outErr *Error, err error) {
-	payload := &discoverer_Advertise_Params{
+func (p *Advertiser_Proxy) Advertise(inS Service, inPattern []string) (outHandle int32, outErr *Error, err error) {
+	payload := &advertiser_Advertise_Params{
 		inS,
 		inPattern,
 	}
 	header := bindings.MessageHeader{
-		Type:      discoverer_Advertise_Name,
+		Type:      advertiser_Advertise_Name,
 		Flags:     bindings.MessageExpectsResponseFlag,
 		RequestId: p.ids.Count(),
 	}
@@ -295,13 +291,13 @@
 		}
 		return
 	}
-	if got, want := readResult.Message.Header.Type, discoverer_Advertise_Name; got != want {
+	if got, want := readResult.Message.Header.Type, advertiser_Advertise_Name; got != want {
 		err = &bindings.ValidationError{bindings.MessageHeaderUnknownMethod,
 			fmt.Sprintf("invalid method in response: expected %v, got %v", want, got),
 		}
 		return
 	}
-	var response discoverer_Advertise_ResponseParams
+	var response advertiser_Advertise_ResponseParams
 	if err = readResult.Message.DecodePayload(&response); err != nil {
 		p.Close_Proxy()
 		return
@@ -311,11 +307,11 @@
 	return
 }
 
-type discoverer_StopAdvertising_Params struct {
+type advertiser_StopAdvertising_Params struct {
 	inH int32
 }
 
-func (s *discoverer_StopAdvertising_Params) Encode(encoder *bindings.Encoder) error {
+func (s *advertiser_StopAdvertising_Params) Encode(encoder *bindings.Encoder) error {
 	encoder.StartStruct(8, 0)
 	if err := encoder.WriteInt32(s.inH); err != nil {
 		return err
@@ -326,23 +322,23 @@
 	return nil
 }
 
-var discoverer_StopAdvertising_Params_Versions []bindings.DataHeader = []bindings.DataHeader{
+var advertiser_StopAdvertising_Params_Versions []bindings.DataHeader = []bindings.DataHeader{
 	bindings.DataHeader{16, 0},
 }
 
-func (s *discoverer_StopAdvertising_Params) Decode(decoder *bindings.Decoder) error {
+func (s *advertiser_StopAdvertising_Params) Decode(decoder *bindings.Decoder) error {
 	header, err := decoder.StartStruct()
 	if err != nil {
 		return err
 	}
-	index := sort.Search(len(discoverer_StopAdvertising_Params_Versions), func(i int) bool {
-		return discoverer_StopAdvertising_Params_Versions[i].ElementsOrVersion >= header.ElementsOrVersion
+	index := sort.Search(len(advertiser_StopAdvertising_Params_Versions), func(i int) bool {
+		return advertiser_StopAdvertising_Params_Versions[i].ElementsOrVersion >= header.ElementsOrVersion
 	})
-	if index < len(discoverer_StopAdvertising_Params_Versions) {
-		if discoverer_StopAdvertising_Params_Versions[index].ElementsOrVersion > header.ElementsOrVersion {
+	if index < len(advertiser_StopAdvertising_Params_Versions) {
+		if advertiser_StopAdvertising_Params_Versions[index].ElementsOrVersion > header.ElementsOrVersion {
 			index--
 		}
-		expectedSize := discoverer_StopAdvertising_Params_Versions[index].Size
+		expectedSize := advertiser_StopAdvertising_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),
@@ -362,12 +358,12 @@
 	return nil
 }
 
-func (p *Discoverer_Proxy) StopAdvertising(inH int32) (err error) {
-	payload := &discoverer_StopAdvertising_Params{
+func (p *Advertiser_Proxy) StopAdvertising(inH int32) (err error) {
+	payload := &advertiser_StopAdvertising_Params{
 		inH,
 	}
 	header := bindings.MessageHeader{
-		Type:  discoverer_StopAdvertising_Name,
+		Type:  advertiser_StopAdvertising_Name,
 		Flags: bindings.MessageNoFlag,
 	}
 	var message *bindings.Message
@@ -383,12 +379,134 @@
 	return
 }
 
-type discoverer_Scan_Params struct {
+type advertiser_Stub struct {
+	connector *bindings.Connector
+	impl      Advertiser
+}
+
+func NewAdvertiserStub(r Advertiser_Request, impl Advertiser, waiter bindings.AsyncWaiter) *bindings.Stub {
+	connector := bindings.NewConnector(r.PassMessagePipe(), waiter)
+	return bindings.NewStub(connector, &advertiser_Stub{connector, impl})
+}
+
+func (s *advertiser_Stub) Accept(message *bindings.Message) (err error) {
+	switch message.Header.Type {
+	case advertiser_Advertise_Name:
+		if message.Header.Flags != bindings.MessageExpectsResponseFlag {
+			return &bindings.ValidationError{bindings.MessageHeaderInvalidFlags,
+				fmt.Sprintf("invalid message header flag: %v", message.Header.Flags),
+			}
+		}
+		var request advertiser_Advertise_Params
+		if err := message.DecodePayload(&request); err != nil {
+			return err
+		}
+		var response advertiser_Advertise_ResponseParams
+		response.outHandle, response.outErr, err = s.impl.Advertise(request.inS, request.inPattern)
+		if err != nil {
+			return
+		}
+		header := bindings.MessageHeader{
+			Type:      advertiser_Advertise_Name,
+			Flags:     bindings.MessageIsResponseFlag,
+			RequestId: message.Header.RequestId,
+		}
+		message, err = bindings.EncodeMessage(header, &response)
+		if err != nil {
+			return err
+		}
+		return s.connector.WriteMessage(message)
+	case advertiser_StopAdvertising_Name:
+		if message.Header.Flags != bindings.MessageNoFlag {
+			return &bindings.ValidationError{bindings.MessageHeaderInvalidFlags,
+				fmt.Sprintf("invalid message header flag: %v", message.Header.Flags),
+			}
+		}
+		var request advertiser_StopAdvertising_Params
+		if err := message.DecodePayload(&request); err != nil {
+			return err
+		}
+		err = s.impl.StopAdvertising(request.inH)
+		if err != nil {
+			return
+		}
+	default:
+		return &bindings.ValidationError{
+			bindings.MessageHeaderUnknownMethod,
+			fmt.Sprintf("unknown method %v", message.Header.Type),
+		}
+	}
+	return
+}
+
+type Scanner interface {
+	Scan(inQuery string, inScanHandler ScanHandler_Pointer) (outHandle int32, outErr *Error, err error)
+	StopScan(inH int32) (err error)
+}
+
+var scanner_Name = "discovery::Scanner"
+
+type Scanner_Request bindings.InterfaceRequest
+
+func (r *Scanner_Request) Name() string {
+	return scanner_Name
+}
+
+type Scanner_Pointer bindings.InterfacePointer
+
+func (p *Scanner_Pointer) Name() string {
+	return scanner_Name
+}
+
+type Scanner_ServiceFactory struct {
+	Delegate Scanner_Factory
+}
+
+type Scanner_Factory interface {
+	Create(request Scanner_Request)
+}
+
+func (f *Scanner_ServiceFactory) Name() string {
+	return scanner_Name
+}
+
+func (f *Scanner_ServiceFactory) Create(messagePipe system.MessagePipeHandle) {
+	request := Scanner_Request{bindings.NewMessagePipeHandleOwner(messagePipe)}
+	f.Delegate.Create(request)
+}
+
+// CreateMessagePipeForScanner creates a message pipe for use with the
+// Scanner interface with a Scanner_Request on one end and a Scanner_Pointer on the other.
+func CreateMessagePipeForScanner() (Scanner_Request, Scanner_Pointer) {
+	r, p := bindings.CreateMessagePipeForMojoInterface()
+	return Scanner_Request(r), Scanner_Pointer(p)
+}
+
+const scanner_Scan_Name uint32 = 0
+const scanner_StopScan_Name uint32 = 1
+
+type Scanner_Proxy struct {
+	router *bindings.Router
+	ids    bindings.Counter
+}
+
+func NewScannerProxy(p Scanner_Pointer, waiter bindings.AsyncWaiter) *Scanner_Proxy {
+	return &Scanner_Proxy{
+		bindings.NewRouter(p.PassMessagePipe(), waiter),
+		bindings.NewCounter(),
+	}
+}
+
+func (p *Scanner_Proxy) Close_Proxy() {
+	p.router.Close()
+}
+
+type scanner_Scan_Params struct {
 	inQuery       string
 	inScanHandler ScanHandler_Pointer
 }
 
-func (s *discoverer_Scan_Params) Encode(encoder *bindings.Encoder) error {
+func (s *scanner_Scan_Params) Encode(encoder *bindings.Encoder) error {
 	encoder.StartStruct(16, 0)
 	if err := encoder.WritePointer(); err != nil {
 		return err
@@ -405,23 +523,23 @@
 	return nil
 }
 
-var discoverer_Scan_Params_Versions []bindings.DataHeader = []bindings.DataHeader{
+var scanner_Scan_Params_Versions []bindings.DataHeader = []bindings.DataHeader{
 	bindings.DataHeader{24, 0},
 }
 
-func (s *discoverer_Scan_Params) Decode(decoder *bindings.Decoder) error {
+func (s *scanner_Scan_Params) Decode(decoder *bindings.Decoder) error {
 	header, err := decoder.StartStruct()
 	if err != nil {
 		return err
 	}
-	index := sort.Search(len(discoverer_Scan_Params_Versions), func(i int) bool {
-		return discoverer_Scan_Params_Versions[i].ElementsOrVersion >= header.ElementsOrVersion
+	index := sort.Search(len(scanner_Scan_Params_Versions), func(i int) bool {
+		return scanner_Scan_Params_Versions[i].ElementsOrVersion >= header.ElementsOrVersion
 	})
-	if index < len(discoverer_Scan_Params_Versions) {
-		if discoverer_Scan_Params_Versions[index].ElementsOrVersion > header.ElementsOrVersion {
+	if index < len(scanner_Scan_Params_Versions) {
+		if scanner_Scan_Params_Versions[index].ElementsOrVersion > header.ElementsOrVersion {
 			index--
 		}
-		expectedSize := discoverer_Scan_Params_Versions[index].Size
+		expectedSize := scanner_Scan_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),
@@ -461,12 +579,12 @@
 	return nil
 }
 
-type discoverer_Scan_ResponseParams struct {
+type scanner_Scan_ResponseParams struct {
 	outHandle int32
 	outErr    *Error
 }
 
-func (s *discoverer_Scan_ResponseParams) Encode(encoder *bindings.Encoder) error {
+func (s *scanner_Scan_ResponseParams) Encode(encoder *bindings.Encoder) error {
 	encoder.StartStruct(16, 0)
 	if err := encoder.WriteInt32(s.outHandle); err != nil {
 		return err
@@ -487,23 +605,23 @@
 	return nil
 }
 
-var discoverer_Scan_ResponseParams_Versions []bindings.DataHeader = []bindings.DataHeader{
+var scanner_Scan_ResponseParams_Versions []bindings.DataHeader = []bindings.DataHeader{
 	bindings.DataHeader{24, 0},
 }
 
-func (s *discoverer_Scan_ResponseParams) Decode(decoder *bindings.Decoder) error {
+func (s *scanner_Scan_ResponseParams) Decode(decoder *bindings.Decoder) error {
 	header, err := decoder.StartStruct()
 	if err != nil {
 		return err
 	}
-	index := sort.Search(len(discoverer_Scan_ResponseParams_Versions), func(i int) bool {
-		return discoverer_Scan_ResponseParams_Versions[i].ElementsOrVersion >= header.ElementsOrVersion
+	index := sort.Search(len(scanner_Scan_ResponseParams_Versions), func(i int) bool {
+		return scanner_Scan_ResponseParams_Versions[i].ElementsOrVersion >= header.ElementsOrVersion
 	})
-	if index < len(discoverer_Scan_ResponseParams_Versions) {
-		if discoverer_Scan_ResponseParams_Versions[index].ElementsOrVersion > header.ElementsOrVersion {
+	if index < len(scanner_Scan_ResponseParams_Versions) {
+		if scanner_Scan_ResponseParams_Versions[index].ElementsOrVersion > header.ElementsOrVersion {
 			index--
 		}
-		expectedSize := discoverer_Scan_ResponseParams_Versions[index].Size
+		expectedSize := scanner_Scan_ResponseParams_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),
@@ -537,13 +655,13 @@
 	return nil
 }
 
-func (p *Discoverer_Proxy) Scan(inQuery string, inScanHandler ScanHandler_Pointer) (outHandle int32, outErr *Error, err error) {
-	payload := &discoverer_Scan_Params{
+func (p *Scanner_Proxy) Scan(inQuery string, inScanHandler ScanHandler_Pointer) (outHandle int32, outErr *Error, err error) {
+	payload := &scanner_Scan_Params{
 		inQuery,
 		inScanHandler,
 	}
 	header := bindings.MessageHeader{
-		Type:      discoverer_Scan_Name,
+		Type:      scanner_Scan_Name,
 		Flags:     bindings.MessageExpectsResponseFlag,
 		RequestId: p.ids.Count(),
 	}
@@ -564,13 +682,13 @@
 		}
 		return
 	}
-	if got, want := readResult.Message.Header.Type, discoverer_Scan_Name; got != want {
+	if got, want := readResult.Message.Header.Type, scanner_Scan_Name; got != want {
 		err = &bindings.ValidationError{bindings.MessageHeaderUnknownMethod,
 			fmt.Sprintf("invalid method in response: expected %v, got %v", want, got),
 		}
 		return
 	}
-	var response discoverer_Scan_ResponseParams
+	var response scanner_Scan_ResponseParams
 	if err = readResult.Message.DecodePayload(&response); err != nil {
 		p.Close_Proxy()
 		return
@@ -580,11 +698,11 @@
 	return
 }
 
-type discoverer_StopScan_Params struct {
+type scanner_StopScan_Params struct {
 	inH int32
 }
 
-func (s *discoverer_StopScan_Params) Encode(encoder *bindings.Encoder) error {
+func (s *scanner_StopScan_Params) Encode(encoder *bindings.Encoder) error {
 	encoder.StartStruct(8, 0)
 	if err := encoder.WriteInt32(s.inH); err != nil {
 		return err
@@ -595,23 +713,23 @@
 	return nil
 }
 
-var discoverer_StopScan_Params_Versions []bindings.DataHeader = []bindings.DataHeader{
+var scanner_StopScan_Params_Versions []bindings.DataHeader = []bindings.DataHeader{
 	bindings.DataHeader{16, 0},
 }
 
-func (s *discoverer_StopScan_Params) Decode(decoder *bindings.Decoder) error {
+func (s *scanner_StopScan_Params) Decode(decoder *bindings.Decoder) error {
 	header, err := decoder.StartStruct()
 	if err != nil {
 		return err
 	}
-	index := sort.Search(len(discoverer_StopScan_Params_Versions), func(i int) bool {
-		return discoverer_StopScan_Params_Versions[i].ElementsOrVersion >= header.ElementsOrVersion
+	index := sort.Search(len(scanner_StopScan_Params_Versions), func(i int) bool {
+		return scanner_StopScan_Params_Versions[i].ElementsOrVersion >= header.ElementsOrVersion
 	})
-	if index < len(discoverer_StopScan_Params_Versions) {
-		if discoverer_StopScan_Params_Versions[index].ElementsOrVersion > header.ElementsOrVersion {
+	if index < len(scanner_StopScan_Params_Versions) {
+		if scanner_StopScan_Params_Versions[index].ElementsOrVersion > header.ElementsOrVersion {
 			index--
 		}
-		expectedSize := discoverer_StopScan_Params_Versions[index].Size
+		expectedSize := scanner_StopScan_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),
@@ -631,12 +749,12 @@
 	return nil
 }
 
-func (p *Discoverer_Proxy) StopScan(inH int32) (err error) {
-	payload := &discoverer_StopScan_Params{
+func (p *Scanner_Proxy) StopScan(inH int32) (err error) {
+	payload := &scanner_StopScan_Params{
 		inH,
 	}
 	header := bindings.MessageHeader{
-		Type:  discoverer_StopScan_Name,
+		Type:  scanner_StopScan_Name,
 		Flags: bindings.MessageNoFlag,
 	}
 	var message *bindings.Message
@@ -652,74 +770,35 @@
 	return
 }
 
-type discoverer_Stub struct {
+type scanner_Stub struct {
 	connector *bindings.Connector
-	impl      Discoverer
+	impl      Scanner
 }
 
-func NewDiscovererStub(r Discoverer_Request, impl Discoverer, waiter bindings.AsyncWaiter) *bindings.Stub {
+func NewScannerStub(r Scanner_Request, impl Scanner, waiter bindings.AsyncWaiter) *bindings.Stub {
 	connector := bindings.NewConnector(r.PassMessagePipe(), waiter)
-	return bindings.NewStub(connector, &discoverer_Stub{connector, impl})
+	return bindings.NewStub(connector, &scanner_Stub{connector, impl})
 }
 
-func (s *discoverer_Stub) Accept(message *bindings.Message) (err error) {
+func (s *scanner_Stub) Accept(message *bindings.Message) (err error) {
 	switch message.Header.Type {
-	case discoverer_Advertise_Name:
+	case scanner_Scan_Name:
 		if message.Header.Flags != bindings.MessageExpectsResponseFlag {
 			return &bindings.ValidationError{bindings.MessageHeaderInvalidFlags,
 				fmt.Sprintf("invalid message header flag: %v", message.Header.Flags),
 			}
 		}
-		var request discoverer_Advertise_Params
+		var request scanner_Scan_Params
 		if err := message.DecodePayload(&request); err != nil {
 			return err
 		}
-		var response discoverer_Advertise_ResponseParams
-		response.outHandle, response.outErr, err = s.impl.Advertise(request.inS, request.inPattern)
-		if err != nil {
-			return
-		}
-		header := bindings.MessageHeader{
-			Type:      discoverer_Advertise_Name,
-			Flags:     bindings.MessageIsResponseFlag,
-			RequestId: message.Header.RequestId,
-		}
-		message, err = bindings.EncodeMessage(header, &response)
-		if err != nil {
-			return err
-		}
-		return s.connector.WriteMessage(message)
-	case discoverer_StopAdvertising_Name:
-		if message.Header.Flags != bindings.MessageNoFlag {
-			return &bindings.ValidationError{bindings.MessageHeaderInvalidFlags,
-				fmt.Sprintf("invalid message header flag: %v", message.Header.Flags),
-			}
-		}
-		var request discoverer_StopAdvertising_Params
-		if err := message.DecodePayload(&request); err != nil {
-			return err
-		}
-		err = s.impl.StopAdvertising(request.inH)
-		if err != nil {
-			return
-		}
-	case discoverer_Scan_Name:
-		if message.Header.Flags != bindings.MessageExpectsResponseFlag {
-			return &bindings.ValidationError{bindings.MessageHeaderInvalidFlags,
-				fmt.Sprintf("invalid message header flag: %v", message.Header.Flags),
-			}
-		}
-		var request discoverer_Scan_Params
-		if err := message.DecodePayload(&request); err != nil {
-			return err
-		}
-		var response discoverer_Scan_ResponseParams
+		var response scanner_Scan_ResponseParams
 		response.outHandle, response.outErr, err = s.impl.Scan(request.inQuery, request.inScanHandler)
 		if err != nil {
 			return
 		}
 		header := bindings.MessageHeader{
-			Type:      discoverer_Scan_Name,
+			Type:      scanner_Scan_Name,
 			Flags:     bindings.MessageIsResponseFlag,
 			RequestId: message.Header.RequestId,
 		}
@@ -728,13 +807,13 @@
 			return err
 		}
 		return s.connector.WriteMessage(message)
-	case discoverer_StopScan_Name:
+	case scanner_StopScan_Name:
 		if message.Header.Flags != bindings.MessageNoFlag {
 			return &bindings.ValidationError{bindings.MessageHeaderInvalidFlags,
 				fmt.Sprintf("invalid message header flag: %v", message.Header.Flags),
 			}
 		}
-		var request discoverer_StopScan_Params
+		var request scanner_StopScan_Params
 		if err := message.DecodePayload(&request); err != nil {
 			return err
 		}
diff --git a/go/src/vanadium/discovery/discovery.go b/go/src/vanadium/discovery/discovery.go
index 7c4a2d2..f15ce4d 100644
--- a/go/src/vanadium/discovery/discovery.go
+++ b/go/src/vanadium/discovery/discovery.go
@@ -1,8 +1,6 @@
 package main
 
 import (
-	"log"
-
 	"v.io/v23"
 	idiscovery "v.io/x/ref/lib/discovery"
 	"v.io/x/ref/lib/discovery/plugins/ble"
@@ -16,44 +14,58 @@
 	"mojo/public/go/application"
 	"mojo/public/go/bindings"
 	"mojo/public/go/system"
+	"v.io/v23/context"
 )
 
 //#include "mojo/public/c/system/types.h"
 import "C"
 
 type discoveryDelegate struct {
+	ctx      *context.T
 	stubs    []*bindings.Stub
 	impl     *internal.DiscoveryService
 	shutdown v23.Shutdown
 }
 
 func (d *discoveryDelegate) Initialize(c application.Context) {
+	// TODO(bjornick): Caling init multiple times in the same process
+	// will be bad.  For now, this is ok because this is the only
+	// vanadium service that will be used in the demos and each go library
+	// will be in its own process.
 	ctx, shutdown := v23.Init()
 	host := c.Args()[1]
-	log.Println("Starting discovery with name", host)
+	ctx.Info("Starting discovery with name", host)
 	mplugin, err := mdns.New(host)
+	pluginList := []idiscovery.Plugin{}
 	if err != nil {
-		log.Println("Failed to start mplugin", err)
+		ctx.Error("Failed to start MDNS plugin", err)
+	} else {
+		pluginList = append(pluginList, mplugin)
 	}
 
 	bplugin, err := ble.NewPlugin(host)
 	if err != nil {
-		log.Println("Failed to start bplugin", err)
+		ctx.Error("Failed to start BLE plugin", err)
+	} else {
+		pluginList = append(pluginList, bplugin)
 	}
 
-	d.impl = internal.NewDiscoveryService(ctx, idiscovery.New([]idiscovery.Plugin{mplugin, bplugin}))
+	if len(pluginList) == 0 {
+		c.Close()
+		return
+	}
+	d.impl = internal.NewDiscoveryService(ctx, idiscovery.New(pluginList))
 	d.shutdown = shutdown
 }
 
-func (d *discoveryDelegate) Create(request mojom.Discoverer_Request) {
-	stub := mojom.NewDiscovererStub(request, d.impl, bindings.GetAsyncWaiter())
+func (d *discoveryDelegate) addAndServeStub(stub *bindings.Stub) {
 	d.stubs = append(d.stubs, stub)
 	go func() {
 		for {
 			if err := stub.ServeRequest(); err != nil {
 				connectionErr, ok := err.(*bindings.ConnectionError)
 				if !ok || !connectionErr.Closed() {
-					log.Println(err)
+					d.ctx.Error(err)
 				}
 				break
 			}
@@ -61,8 +73,28 @@
 	}()
 }
 
+type advertiseFactory struct {
+	d *discoveryDelegate
+}
+
+func (a *advertiseFactory) Create(request mojom.Advertiser_Request) {
+	stub := mojom.NewAdvertiserStub(request, a.d.impl, bindings.GetAsyncWaiter())
+	a.d.addAndServeStub(stub)
+}
+
+type scannerFactory struct {
+	d *discoveryDelegate
+}
+
+func (s *scannerFactory) Create(request mojom.Scanner_Request) {
+	stub := mojom.NewScannerStub(request, s.d.impl, bindings.GetAsyncWaiter())
+	s.d.addAndServeStub(stub)
+}
+
 func (d *discoveryDelegate) AcceptConnection(connection *application.Connection) {
-	connection.ProvideServices(&mojom.Discoverer_ServiceFactory{d})
+	advFactory := &advertiseFactory{d: d}
+	scanFactory := scannerFactory{d: d}
+	connection.ProvideServices(&mojom.Advertiser_ServiceFactory{advFactory}, &mojom.ScanHandler_ServiceFactory{scanFactory})
 }
 
 func (d *discoveryDelegate) Quit() {
diff --git a/go/src/vanadium/discovery/internal/discovery.go b/go/src/vanadium/discovery/internal/discovery.go
index 9b4cd17..fe50d66 100644
--- a/go/src/vanadium/discovery/internal/discovery.go
+++ b/go/src/vanadium/discovery/internal/discovery.go
@@ -6,7 +6,6 @@
 	"v.io/v23/context"
 	"v.io/v23/discovery"
 	"v.io/v23/verror"
-	idiscovery "v.io/x/ref/lib/discovery"
 
 	"mojo/public/go/bindings"
 	mojom "mojom/vanadium/discovery"
@@ -15,35 +14,28 @@
 // DiscoveryService implements the mojom interface mojom/vanadium/discovery.DiscoveryService.  It
 // is basically a thin wrapper around the Vanadium Discovery API.
 type DiscoveryService struct {
-	ctx          *context.T
-	s            discovery.T
-	trigger      *idiscovery.Trigger
+	ctx     *context.T
+	s       discovery.T
 
 	// mu protects pending* and next*
-	mu           sync.Mutex
+	mu sync.Mutex
 
 	// The id to assign the next advertisement.
-	nextAdv      int32
-	// A map of advertisement ids to the cancellation channel.  When StopAdvertisement is
-	// called, the channel will be closed.
-	pendingAdvs  map[int32]chan struct{}
+	nextAdv int32
+	// A map of advertisement ids to the cancellation function.
+	activeAdvs map[int32]func()
 	// The id to assign to the next scan.
-	nextScan     int32
-	// A map of scan id to the cancellataion channel.  When StopScan is called, the channel
-	// for that id will be closed.
-	pendingScans map[int32]chan struct{}
+	nextScan int32
+	// A map of scan id to the cancellataion func()
+	activeScans map[int32]func()
 }
 
-func convertToErrorStruct(err error) *mojom.Error {
-	outErr := &mojom.Error{
-		Id:  "v.io/verror/Unknown",
+func v2mError(err error) *mojom.Error {
+	return &mojom.Error{
+		Id:  string(verror.ErrorID(err)),
+		Action: int32(verror.Action(err)),
 		Msg: err.Error(),
 	}
-	if e, ok := err.(verror.E); ok {
-		outErr.Id = string(e.ID)
-		outErr.Action = int32(e.Action)
-	}
-	return outErr
 }
 
 // NewDiscoveryService returns a new DiscoveryService bound to the context and the Vanadium
@@ -52,9 +44,8 @@
 	return &DiscoveryService{
 		ctx:          ctx,
 		s:            vDiscovery,
-		trigger:      idiscovery.NewTrigger(),
-		pendingAdvs:  map[int32]chan struct{}{},
-		pendingScans: map[int32]chan struct{}{},
+		activeAdvs:  map[int32]func(){},
+		activeScans: map[int32]func(){},
 	}
 }
 
@@ -68,35 +59,34 @@
 		Addrs:         s.Addrs,
 	}
 
-	ctx, c := context.WithCancel(d.ctx)
+	ctx, cancel := context.WithCancel(d.ctx)
 
 	err := d.s.Advertise(ctx, vService, nil)
 	if err != nil {
-		return 0, convertToErrorStruct(err), nil
+		cancel()
+		return 0, v2mError(err), nil
 	}
-	ch := make(chan struct{})
 	d.mu.Lock()
 	id := d.nextAdv
-	d.pendingAdvs[id] = ch
+	d.activeAdvs[id] = cancel
 	d.nextAdv++
 	d.mu.Unlock()
-	d.trigger.Add(c, ch)
 	return id, nil, nil
 }
 
 // StopAdvertising stops advertising for the given advertising id.
 func (d *DiscoveryService) StopAdvertising(handle int32) error {
 	d.mu.Lock()
-	ch := d.pendingAdvs[handle]
-	delete(d.pendingAdvs, handle)
+	cancel := d.activeAdvs[handle]
+	delete(d.activeAdvs, handle)
 	d.mu.Unlock()
-	if ch != nil {
-		close(ch)
+	if cancel != nil {
+		cancel()
 	}
 	return nil
 }
 
-func vServiceTomService(s discovery.Service) mojom.Service {
+func v2mService(s discovery.Service) mojom.Service {
 	return mojom.Service{
 		InstanceUuid:  s.InstanceUuid,
 		InterfaceName: s.InterfaceName,
@@ -108,28 +98,26 @@
 // 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) (int32, *mojom.Error, error) {
-	ctx, c := context.WithCancel(d.ctx)
+	ctx, cancel := context.WithCancel(d.ctx)
 	proxy := mojom.NewScanHandlerProxy(scanHandler, bindings.GetAsyncWaiter())
 	scanCh, err := d.s.Scan(ctx, query)
 	if err != nil {
-		return 0, convertToErrorStruct(err), nil
+		cancel()
+		return 0, v2mError(err), nil
 	}
-	ch := make(chan struct{})
 	d.mu.Lock()
 	id := d.nextScan
-	d.pendingScans[id] = ch
+	d.activeScans[id] = cancel
 	d.nextScan++
 	d.mu.Unlock()
 
-	d.trigger.Add(c, ch)
 	go func() {
 		for v := range scanCh {
 			switch value := v.(type) {
 			case discovery.UpdateFound:
-				proxy.Found(vServiceTomService(value.Value.Service))
+				proxy.Found(v2mService(value.Value.Service))
 			case discovery.UpdateLost:
-				proxy.Lost(vServiceTomService(value.Value.Service))
-			default:
+				proxy.Lost(v2mService(value.Value.Service))
 			}
 		}
 	}()
@@ -139,11 +127,11 @@
 // SopScan Stops the scan.
 func (d *DiscoveryService) StopScan(handle int32) error {
 	d.mu.Lock()
-	ch := d.pendingScans[handle]
-	delete(d.pendingScans, handle)
+	cancel := d.activeScans[handle]
+	delete(d.activeScans, handle)
 	d.mu.Unlock()
-	if ch != nil {
-		close(ch)
+	if cancel != nil {
+		cancel()
 	}
 	return nil
 }
@@ -151,12 +139,12 @@
 // Stop Stops all scans and advertisements.
 func (d *DiscoveryService) Stop() {
 	d.mu.Lock()
-	for _, ch := range d.pendingScans {
-		close(ch)
+	for _, cancel := range d.activeScans {
+		cancel()
 	}
 
-	for _, ch := range d.pendingAdvs {
-		close(ch)
+	for _, cancel := range d.activeAdvs {
+		cancel()
 	}
 	d.mu.Unlock()
 }
diff --git a/go/src/vanadium/discovery/internal/discovery_test.go b/go/src/vanadium/discovery/internal/discovery_test.go
index dea5351..6c35745 100644
--- a/go/src/vanadium/discovery/internal/discovery_test.go
+++ b/go/src/vanadium/discovery/internal/discovery_test.go
@@ -1,11 +1,12 @@
 package internal
+
 import (
 	"reflect"
 	"testing"
 
+	"v.io/v23/context"
 	"v.io/v23/discovery"
 	"v.io/v23/security/access"
-	"v.io/v23/context"
 	idiscovery "v.io/x/ref/lib/discovery"
 	vtest "v.io/x/ref/test"
 
@@ -14,21 +15,19 @@
 	mojom "mojom/vanadium/discovery"
 )
 
-
 type mockAdv struct {
 	s discovery.Service
 }
 
 type discoveryMock struct {
-	trigger *idiscovery.Trigger
-	id int64
+	trigger  *idiscovery.Trigger
+	id       int64
 	services map[int64]discovery.Service
 	// An item will be put in deleteCh when something has been deleted.
 	deleteCh chan struct{}
 }
 
-
-func (d *discoveryMock) Advertise(ctx *context.T,s discovery.Service, perms access.Permissions) error {
+func (d *discoveryMock) Advertise(ctx *context.T, s discovery.Service, perms access.Permissions) error {
 	currId := d.id
 	d.services[currId] = s
 	d.id++
@@ -44,17 +43,10 @@
 	return nil, nil
 }
 
-func compare(t *testing.T, vService discovery.Service, mService mojom.Service) {
-	if !reflect.DeepEqual(vService.Addrs, mService.Addrs) {
-		t.Errorf("addrs not the same: %v, %v", vService.Addrs, mService.Addrs)
-	}
-
-	if vService.InterfaceName != mService.InterfaceName {
-		t.Errorf("interface name not the same: %v, %v", vService.InterfaceName, mService.InterfaceName)
-	}
-
-	if !reflect.DeepEqual(map[string]string(vService.Attrs), mService.Attrs) {
-		t.Errorf("attributes not the same: %v, %v", vService.Attrs, mService.Attrs)
+func compare(t *testing.T, want discovery.Service, got mojom.Service) {
+	mwant := v2mService(want)
+	if !reflect.DeepEqual(mwant, got) {
+		t.Errorf("Got %#v want %#v", got, want)
 	}
 }
 
@@ -62,18 +54,18 @@
 	ctx, shutdown := vtest.V23Init()
 	defer shutdown()
 	mock := &discoveryMock{
-		trigger: idiscovery.NewTrigger(),
+		trigger:  idiscovery.NewTrigger(),
 		services: map[int64]discovery.Service{},
 		deleteCh: make(chan struct{}),
 	}
 	s := NewDiscoveryService(ctx, mock)
-	testService := mojom.Service {
+	testService := mojom.Service{
 		InterfaceName: "v.io/v23/discovery.T",
 		Attrs: map[string]string{
 			"key1": "value1",
 			"key2": "value2",
 		},
-		Addrs: []string{ "addr1", "addr2"},
+		Addrs: []string{"addr1", "addr2"},
 	}
 	id, e1, e2 := s.Advertise(testService, nil)
 
@@ -88,14 +80,13 @@
 		compare(t, service, testService)
 	}
 
-	testService2 := mojom.Service {
+	testService2 := mojom.Service{
 		InterfaceName: "v.io/v23/naming.T",
 		Attrs: map[string]string{
 			"key1": "value1",
 			"key2": "value2",
 		},
-		Addrs: []string{ "addr1", "addr2"},
-
+		Addrs: []string{"addr1", "addr2"},
 	}
 
 	_, e1, e2 = s.Advertise(testService2, nil)
@@ -120,6 +111,3 @@
 		t.Errorf("service should have been removed")
 	}
 }
-
-
-
diff --git a/mojom/vanadium/discovery.mojom b/mojom/vanadium/discovery.mojom
index 996c3a6..ca741e0 100644
--- a/mojom/vanadium/discovery.mojom
+++ b/mojom/vanadium/discovery.mojom
@@ -22,18 +22,32 @@
    string msg;
 };
 
-interface Discoverer {
+// Advertiser provides methods to do Vanadium Advertising.
+interface Advertiser {
+	// Advertises the given Service to all blessings that match pattern.  Returns
+	// a handle to the active advertisement that can be used to stop the advertisement.
 	Advertise(Service s, array<string> pattern) => (int32 Handle, Error? Err);
 
+	// StopAdvertising Stops the advertisement associated with the given handle.
 	StopAdvertising(int32 h);
+};
 
+// Scanner provides methods to scan for Vanadium advertisements.
+interface Scanner {
+	// Scan scans for services matching the query passed nad calls ScanHandler with updates.
+	// Returns a handle to the active scanner that can be used to stop the scanning.
 	Scan(string query, ScanHandler scanHandler) => (int32 Handle, Error? Err);
 
+	// StopScan stops the scanner associated weith the given handle.
 	StopScan(int32 h);
 };
 
+// ScanHandler is used to pass updates about Services that are found/lost during the
+// scan.
 interface ScanHandler {
+	// Found will be called when a Service is found.
 	Found(Service s);
 
+	// Lost will be called when a service is lost.
 	Lost(Service s);
 };
\ No newline at end of file