diff --git a/Makefile b/Makefile
index 60cdbe9c72c5f7d156b27637cbab21ecf1bb4b30..56c26a706138bb2708cc87e086b3ef2d43084867 100644
--- a/Makefile
+++ b/Makefile
@@ -20,20 +20,20 @@ build:
 	go mod tidy
 
 update_release:
-	GOFLAGS="" go get -u gitlab.com/elixxir/primitives@peppa/newClient
-	GOFLAGS="" go get -u gitlab.com/elixxir/crypto@peppa/newClient
-	GOFLAGS="" go get -u gitlab.com/xx_network/crypto@release
-	GOFLAGS="" go get -u gitlab.com/elixxir/comms@hotfix/TestingFunction
-	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 dc769078af0a2987c147efb427caa1459c8935a6..f1c2cc7ad37025d48fba7a0776e5107926cde051 100644
--- a/go.mod
+++ b/go.mod
@@ -17,11 +17,11 @@ 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.20201103220934-c476c9282f30
-	gitlab.com/elixxir/crypto v0.0.5-0.20201109203841-ba162a25be6e
+	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.2
-	gitlab.com/xx_network/comms v0.0.3
+	gitlab.com/elixxir/primitives v0.0.3-0.20201116174806-97f190989704
+	gitlab.com/xx_network/comms v0.0.4-0.20201110022115-4a6171cad07d
 	gitlab.com/xx_network/crypto v0.0.4
 	gitlab.com/xx_network/primitives v0.0.2
 	golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897
diff --git a/go.sum b/go.sum
index d9ae59910cd23ec3a10019a0dc42c501e1cd8164..bbf4e62eae2e70384297cd73bac04c4687b5a6c0 100644
--- a/go.sum
+++ b/go.sum
@@ -252,6 +252,10 @@ github.com/zeebo/pcg v1.0.0 h1:dt+dx+HvX8g7Un32rY9XWoYnd0NmKmrIzpHF7qiTDj0=
 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.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 h1:znCt/x2bL4y8czTPaaFkwzdgSgW3BJc/1+dxyf1jqVw=
@@ -260,6 +264,8 @@ gitlab.com/elixxir/crypto v0.0.4 h1:8eWjvUepCU2PiqZM2NFYo6rFg1w8KWO1hMDwMNFEqoI=
 gitlab.com/elixxir/crypto v0.0.4/go.mod h1:ZNgBOblhYToR4m8tj4cMvJ9UsJAUKq+p0gCp07WQmhA=
 gitlab.com/elixxir/crypto v0.0.5-0.20201109203841-ba162a25be6e h1:rkT8Pzjgo9oF3uS8ExHGNUQoJX/22qK3lU+vU8QsOCY=
 gitlab.com/elixxir/crypto v0.0.5-0.20201109203841-ba162a25be6e/go.mod h1:ZNgBOblhYToR4m8tj4cMvJ9UsJAUKq+p0gCp07WQmhA=
+gitlab.com/elixxir/crypto v0.0.5-0.20201110193609-6b5e881867b4 h1:1a1zZDuqZ56qU1EPgpc+Sqny1YFl0kAKJgQbsVc0WJQ=
+gitlab.com/elixxir/crypto v0.0.5-0.20201110193609-6b5e881867b4/go.mod h1:ZNgBOblhYToR4m8tj4cMvJ9UsJAUKq+p0gCp07WQmhA=
 gitlab.com/elixxir/ekv v0.1.3 h1:OE+LBMIhjGUMwc6hHJzYvEPNJQV7t1vMnJyIgxUMUo8=
 gitlab.com/elixxir/ekv v0.1.3/go.mod h1:e6WPUt97taFZe5PFLPb1Dupk7tqmDCTQu1kkstqJvw4=
 gitlab.com/elixxir/primitives v0.0.0-20200731184040-494269b53b4d/go.mod h1:OQgUZq7SjnE0b+8+iIAT2eqQF+2IFHn73tOo+aV11mg=
@@ -269,9 +275,13 @@ gitlab.com/elixxir/primitives v0.0.1 h1:q61anawANlNAExfkeQEE1NCsNih6vNV1FFLoUQX6
 gitlab.com/elixxir/primitives v0.0.1/go.mod h1:kNp47yPqja2lHSiS4DddTvFpB/4D9dB2YKnw5c+LJCE=
 gitlab.com/elixxir/primitives v0.0.2 h1:PvyOOp/A6tCtmU7YnGhCCPRdmEogEzCi0Li/WfiVjGo=
 gitlab.com/elixxir/primitives v0.0.2/go.mod h1:3fxFHSlQhkV4vs+S0dZEz3Om3m+40WX8L806yvSnNFc=
+gitlab.com/elixxir/primitives v0.0.3-0.20201116174806-97f190989704 h1:JkFREumz8skDqkCjjzZnlf5tg+PBiMB9kfVn9z0VEfE=
+gitlab.com/elixxir/primitives v0.0.3-0.20201116174806-97f190989704/go.mod h1:3fxFHSlQhkV4vs+S0dZEz3Om3m+40WX8L806yvSnNFc=
 gitlab.com/xx_network/comms v0.0.0-20200805174823-841427dd5023/go.mod h1:owEcxTRl7gsoM8c3RQ5KAm5GstxrJp5tn+6JfQ4z5Hw=
 gitlab.com/xx_network/comms v0.0.3 h1:ch1eJI4WXUE/Kz0Kp9uDWX16B+hfVFmdHY+EOai4Wzc=
 gitlab.com/xx_network/comms v0.0.3/go.mod h1:YViGbRj7FjJYoaO4NpALGEd9dK/l8uUT000FEBbUTL8=
+gitlab.com/xx_network/comms v0.0.4-0.20201110022115-4a6171cad07d h1:wPsoqWNusbFJxvPB1Rvzu+TLZxth3G+ay8qkNrpAuzM=
+gitlab.com/xx_network/comms v0.0.4-0.20201110022115-4a6171cad07d/go.mod h1:YViGbRj7FjJYoaO4NpALGEd9dK/l8uUT000FEBbUTL8=
 gitlab.com/xx_network/crypto v0.0.3/go.mod h1:DF2HYvvCw9wkBybXcXAgQMzX+MiGbFPjwt3t17VRqRE=
 gitlab.com/xx_network/crypto v0.0.4 h1:lpKOL5mTJ2awWMfgBy30oD/UvJVrWZzUimSHlOdZZxo=
 gitlab.com/xx_network/crypto v0.0.4/go.mod h1:+lcQEy+Th4eswFgQDwT0EXKp4AXrlubxalwQFH5O0Mk=
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