diff --git a/Makefile b/Makefile
index c2aaee3c1b8d2bf065c2a75489f12ded0ef33bd3..56c26a706138bb2708cc87e086b3ef2d43084867 100644
--- a/Makefile
+++ b/Makefile
@@ -20,20 +20,20 @@ build:
 	go mod tidy
 
 update_release:
-	GOFLAGS="" go get -u gitlab.com/elixxir/primitives@release
-	GOFLAGS="" go get -u gitlab.com/elixxir/crypto@release
-	GOFLAGS="" go get -u gitlab.com/xx_network/crypto@release
-	GOFLAGS="" go get -u gitlab.com/elixxir/comms@"Anne/FactCommsHotfix"
-	GOFLAGS="" go get -u gitlab.com/xx_network/comms@release
-	GOFLAGS="" go get -u gitlab.com/xx_network/primitives@release
+	GOFLAGS="" go get gitlab.com/elixxir/primitives@release
+	GOFLAGS="" go get gitlab.com/elixxir/crypto@release
+	GOFLAGS="" go get gitlab.com/xx_network/crypto@release
+	GOFLAGS="" go get gitlab.com/elixxir/comms@release
+	GOFLAGS="" go get gitlab.com/xx_network/comms@release
+	GOFLAGS="" go get gitlab.com/xx_network/primitives@release
 
 update_master:
-	GOFLAGS="" go get -u gitlab.com/elixxir/primitives@master
-	GOFLAGS="" go get -u gitlab.com/elixxir/crypto@master
-	GOFLAGS="" go get -u gitlab.com/xx_network/crypto@master
-	GOFLAGS="" go get -u gitlab.com/elixxir/comms@master
-	GOFLAGS="" go get -u gitlab.com/xx_network/comms@master
-	GOFLAGS="" go get -u gitlab.com/xx_network/primitives@master
+	GOFLAGS="" go get gitlab.com/elixxir/primitives@master
+	GOFLAGS="" go get gitlab.com/elixxir/crypto@master
+	GOFLAGS="" go get gitlab.com/xx_network/crypto@master
+	GOFLAGS="" go get gitlab.com/elixxir/comms@master
+	GOFLAGS="" go get gitlab.com/xx_network/comms@master
+	GOFLAGS="" go get gitlab.com/xx_network/primitives@master
 
 master: clean update_master build version
 
diff --git a/go.mod b/go.mod
index 7fb867a89f1601ac26c870e4278a3ebaedbc22d1..f1c2cc7ad37025d48fba7a0776e5107926cde051 100644
--- a/go.mod
+++ b/go.mod
@@ -17,7 +17,7 @@ require (
 	github.com/spf13/jwalterweatherman v1.1.0
 	github.com/spf13/pflag v1.0.5 // indirect
 	github.com/spf13/viper v1.7.1
-	gitlab.com/elixxir/comms v0.0.4-0.20201116215317-0febe6765554
+	gitlab.com/elixxir/comms v0.0.4-0.20201111205457-b073b28c367a
 	gitlab.com/elixxir/crypto v0.0.5-0.20201110193609-6b5e881867b4
 	gitlab.com/elixxir/ekv v0.1.3
 	gitlab.com/elixxir/primitives v0.0.3-0.20201116174806-97f190989704
diff --git a/go.sum b/go.sum
index 6cdc407f14da17be8efb1ed402708a654df068a5..88aebaecc98ca197d77a91d93616c314b35d7185 100644
--- a/go.sum
+++ b/go.sum
@@ -226,10 +226,11 @@ github.com/zeebo/pcg v0.0.0-20181207190024-3cdc6b625a05/go.mod h1:Gr+78ptB0MwXxm
 github.com/zeebo/pcg v1.0.0/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4=
 gitlab.com/elixxir/comms v0.0.4-0.20201103220934-c476c9282f30 h1:9q+xVbu5m7XDvT1CVz8s1S/SOVpasWJOx7V/3rAY/pE=
 gitlab.com/elixxir/comms v0.0.4-0.20201103220934-c476c9282f30/go.mod h1:5p7oz4yFrK037rPap6ooaWrloJrzuVZ4jnzOdvgyqnU=
-gitlab.com/elixxir/comms v0.0.4-0.20201116214359-6714b02d2fad h1:jr/vHpuK9dbSMCydxWJ5fH6KshUTpH8L7LqotxPvQrs=
-gitlab.com/elixxir/comms v0.0.4-0.20201116214359-6714b02d2fad/go.mod h1:spFKl7jsMy8M6NDvhJ27IJ+CnZ/07JHJCYpYsG8JQ4o=
-gitlab.com/elixxir/comms v0.0.4-0.20201116215317-0febe6765554 h1:PGFYXmpv8vT7vYBvcynN9uDqMQArzgo88rlZ51NyaV4=
-gitlab.com/elixxir/comms v0.0.4-0.20201116215317-0febe6765554/go.mod h1:spFKl7jsMy8M6NDvhJ27IJ+CnZ/07JHJCYpYsG8JQ4o=
+gitlab.com/elixxir/comms v0.0.4-0.20201111205457-b073b28c367a h1:GnZLdgn5ZSDtPFsiCUPgqQk2D+e7LmzVOZ9Rq/B8hCY=
+gitlab.com/elixxir/comms v0.0.4-0.20201111205457-b073b28c367a/go.mod h1:5p7oz4yFrK037rPap6ooaWrloJrzuVZ4jnzOdvgyqnU=
+gitlab.com/elixxir/comms v0.0.4-0.20201112000135-4147e270e129 h1:d4s9JGimUVmqdKlK4NhICayzWBUSM2XmKta821ZJTF0=
+gitlab.com/elixxir/comms v0.0.4-0.20201112000135-4147e270e129/go.mod h1:5p7oz4yFrK037rPap6ooaWrloJrzuVZ4jnzOdvgyqnU=
+gitlab.com/elixxir/crypto v0.0.0-20200804182833-984246dea2c4 h1:28ftZDeYEko7xptCZzeFWS1Iam95dj46TWFVVlKmw6A=
 gitlab.com/elixxir/crypto v0.0.0-20200804182833-984246dea2c4/go.mod h1:ucm9SFKJo+K0N2GwRRpaNr+tKXMIOVWzmyUD0SbOu2c=
 gitlab.com/elixxir/crypto v0.0.3/go.mod h1:ZNgBOblhYToR4m8tj4cMvJ9UsJAUKq+p0gCp07WQmhA=
 gitlab.com/elixxir/crypto v0.0.4/go.mod h1:ZNgBOblhYToR4m8tj4cMvJ9UsJAUKq+p0gCp07WQmhA=
diff --git a/ud/lookup.go b/ud/lookup.go
index a2df280190e3ca48c4a03af31d1731113d15e368..1032c6a3e2af5446a0f376bf3f32fc7c6092c823 100644
--- a/ud/lookup.go
+++ b/ud/lookup.go
@@ -7,23 +7,71 @@ import (
 	"gitlab.com/elixxir/client/interfaces/message"
 	"gitlab.com/elixxir/client/interfaces/params"
 	"gitlab.com/elixxir/client/interfaces/utility"
+	"gitlab.com/elixxir/comms/network/dataStructures"
+	"gitlab.com/elixxir/primitives/states"
 	"gitlab.com/xx_network/primitives/id"
 	"google.golang.org/protobuf/runtime/protoimpl"
 	"time"
+	jww "github.com/spf13/jwalterweatherman"
 )
 
-type lookupCallback func([]contact.Contact, error)
+type lookupCallback func(contact.Contact, error)
+
+
+func (m *Manager)lookupProcess(c chan message.Receive, quitCh <-chan struct{}){
+	for true {
+		select {
+		case <-quitCh:
+			return
+		case response := <-c:
+			// edge check the encryption
+			if response.Encryption!=message.E2E{
+				jww.WARN.Printf("Dropped a lookup response from user " +
+					"discovery due to incorrect encryption")
+			}
+
+			// unmarshal the message
+			lookupResponse := &LookupResponse{}
+			if err :=proto.Unmarshal(response.Payload, lookupResponse); err!=nil{
+				jww.WARN.Printf("Dropped a lookup response from user " +
+					"discovery due to failed unmarshal: %s", err)
+			}
+
+			// get the appropriate channel from the lookup
+			m.inProgressMux.RLock()
+			ch, ok := m.inProgressLookup[lookupResponse.CommID]
+			m.inProgressMux.RUnlock()
+			if !ok{
+				jww.WARN.Printf("Dropped a lookup response from user " +
+					"discovery due to unknown comm ID: %d",
+					lookupResponse.CommID)
+			}
+
+			// send the response on the correct channel
+			// drop if the send cannot be completed
+			select{
+				case ch<-lookupResponse:
+				default:
+					jww.WARN.Printf("Dropped a lookup response from user " +
+						"discovery due failure to transmit to handling thread: " +
+						"commID: %d", lookupResponse.CommID)
+			}
+		}
+	}
+}
+
 
 // returns the public key of the passed id as known by the user discovery system
 // or returns by the timeout
 func (m *Manager)Lookup(id *id.ID, callback lookupCallback, timeout time.Duration)error{
 
+	//get the id of this comm so it can be connected to its responce
 	commID, err := m.getCommID()
 	if err!=nil{
 		return errors.WithMessage(err, "Random generation failed")
 	}
 
-
+	//build the request
 	request := &LookupSend{
 		UserID:        id.Marshal(),
 		CommID:        commID,
@@ -40,20 +88,68 @@ func (m *Manager)Lookup(id *id.ID, callback lookupCallback, timeout time.Duratio
 		MessageType: message.UdLookup,
 	}
 
-	rounds, mid, err := m.net.SendE2E(msg, params.GetDefaultE2E())
+	//register the request in the responce map so it can be procesed on return
+	responseChan := make(chan *LookupResponse, 1)
+	m.inProgressMux.Lock()
+	m.inProgressLookup[commID] = responseChan
+	m.inProgressMux.Unlock()
+
+	//send the request
+	rounds, _, err := m.net.SendE2E(msg, params.GetDefaultE2E())
 
 	if err!=nil{
 		return errors.WithMessage(err, "Failed to send the lookup " +
 			"request")
 	}
 
+	//register the round event to capture if the round fails
+	roundFailChan := make(chan dataStructures.EventReturn, len(rounds))
 
-
-	go func(){
-		results :=
-		utility.TrackResults()
+	for _, round := range rounds{
+		//subtract a millisecond to ensure this timeout will trigger before
+		// the one below
+		m.net.GetInstance().GetRoundEvents().AddRoundEventChan(round,
+			roundFailChan, timeout-1*time.Millisecond, states.FAILED)
 	}
 
-
-
+	//start the go routine which will trigger the callback
+	go func(){
+		timer := time.NewTimer(timeout)
+
+		var err error
+		var c contact.Contact
+
+		select{
+			//return an error if the round fails
+			case <-roundFailChan:
+				err= errors.New("One or more rounds failed to " +
+					"resolve, lookup not delivered")
+			//return an error if the timeout is reached
+			case <-timer.C:
+				err= errors.New("Response from User Discovery" +
+					" did not come before timeout")
+			//return the contact if one is returned
+			case response := <-responseChan:
+				if response.Error!=""{
+					err = errors.Errorf("User Discovery returned an " +
+						"error on Lookup: %s", response.Error)
+				}else{
+					pubkey := m.grp.NewIntFromBytes(response.PubKey)
+					c = contact.Contact{
+						ID:             id,
+						DhPubKey:       pubkey,
+						OwnershipProof: nil,
+						Facts:          nil,
+					}
+				}
+		}
+		//delete the response channel from the map
+		m.inProgressMux.Lock()
+		delete(m.inProgressLookup, commID)
+		m.inProgressMux.Unlock()
+		//call the callback last in case it is blocking
+		callback(c, err)
+	}()
+
+	return nil
 }
\ No newline at end of file
diff --git a/ud/manager.go b/ud/manager.go
index f2f4f3cfb4009e505806b8cb5ec3a0afd8faeb53..a12e5f1fc1e7e698f0492575181525e02e948056 100644
--- a/ud/manager.go
+++ b/ud/manager.go
@@ -3,7 +3,10 @@ package ud
 import (
 	"encoding/binary"
 	"gitlab.com/elixxir/client/interfaces"
+	"gitlab.com/elixxir/client/interfaces/message"
+	"gitlab.com/elixxir/client/stoppable"
 	"gitlab.com/elixxir/comms/client"
+	"gitlab.com/elixxir/crypto/cyclic"
 	"gitlab.com/elixxir/crypto/fastRNG"
 	"gitlab.com/xx_network/comms/connect"
 	"gitlab.com/xx_network/crypto/signature/rsa"
@@ -16,17 +19,20 @@ type Manager struct {
 	host    *connect.Host
 	privKey *rsa.PrivateKey
 	rng *fastRNG.StreamGenerator
+	grp *cyclic.Group
+	sw interfaces.Switchboard
 
 	udID *id.ID
 
 
-	inProgressLookup map[int64]chan *LookupResponse
+	inProgressLookup map[uint64]chan *LookupResponse
 	inProgressMux sync.RWMutex
 
 	net interfaces.NetworkManager
 }
 
 func (m *Manager)getCommID()(uint64, error){
+	//fixme: this should use incremenetation
 	stream := m.rng.GetStream()
 
 	idBytes := make([]byte, 8)
@@ -35,4 +41,17 @@ func (m *Manager)getCommID()(uint64, error){
 	}
 
 	return binary.BigEndian.Uint64(idBytes), nil
+}
+
+func (m *Manager)StartProcessies()stoppable.Stoppable{
+
+	lookupStop := stoppable.NewSingle("UDLookup")
+	lookupChan := make(chan message.Receive, 100)
+	m.sw.RegisterChannel("UDLookupResponse", m.udID, message.UdLookupResponse, lookupChan)
+	go m.lookupProcess(lookupChan, lookupStop.Quit())
+
+
+	udMulti := stoppable.NewMulti("UD")
+	udMulti.Add(lookupStop)
+	return lookupStop
 }
\ No newline at end of file
diff --git a/ud/register.go b/ud/register.go
new file mode 100644
index 0000000000000000000000000000000000000000..6fdd2b54e1203bb3f82814f94f14f3101bfa8307
--- /dev/null
+++ b/ud/register.go
@@ -0,0 +1,24 @@
+package ud
+
+import (
+	"gitlab.com/xx_network/comms/messages"
+	"gitlab.com/xx_network/primitives/id"
+)
+
+func (m *Manager)Register(myID *id.ID, username string)error{
+
+	msg := &messages.AuthenticatedMessage{
+		ID:                   myID.Bytes(),
+		Signature:            nil,
+		Token:                nil,
+		Client:               nil,
+		Message:              nil,
+		XXX_NoUnkeyedLiteral: struct{}{},
+		XXX_unrecognized:     nil,
+		XXX_sizecache:        0,
+	}
+
+	m.comms.SendRegisterUser(m.host)
+
+
+}
\ No newline at end of file