diff --git a/cmd/ud.go b/cmd/ud.go
index 2310b172c2b138026d03b1309dc0d04cc9ff5f80..cf1a0df7be220da8ded2bc23bba9b0c1c6c01fa3 100644
--- a/cmd/ud.go
+++ b/cmd/ud.go
@@ -82,19 +82,11 @@ var udCmd = &cobra.Command{
 		// Make user discovery manager
 		rng := client.GetRng()
 		userToRegister := viper.GetString("register")
-		userDiscoveryMgr, err := ud.NewManager(client.GetCmix(),
-			client.GetE2E(), client.NetworkFollowerStatus,
-			client.GetEventReporter(),
-			client.GetComms(), client.GetStorage(),
-			rng,
-			userToRegister, client.GetStorage().GetKV())
+		userDiscoveryMgr, err := ud.NewManager(client, client.GetComms(),
+			client.NetworkFollowerStatus, userToRegister, nil)
 		if err != nil {
 			if strings.Contains(err.Error(), ud.IsRegisteredErr) {
-				userDiscoveryMgr, err = ud.LoadManager(client.GetCmix(),
-					client.GetE2E(), client.GetEventReporter(),
-					client.GetComms(),
-					client.GetStorage(), client.GetRng(),
-					client.GetStorage().GetKV())
+				userDiscoveryMgr, err = ud.LoadManager(client, client.GetComms())
 				if err != nil {
 					jww.FATAL.Panicf("Failed to load UD manager: %+v", err)
 				}
diff --git a/ud/addFact.go b/ud/addFact.go
index 3c2b0af5428d71c57fd5f80cc3a0b5657bc9cccc..f5174a0ed1dc928759ea14591e3e983b0c91bfc3 100644
--- a/ud/addFact.go
+++ b/ud/addFact.go
@@ -22,7 +22,7 @@ func (m *Manager) SendRegisterFact(f fact.Fact) (string, error) {
 	jww.INFO.Printf("ud.SendRegisterFact(%s)", f.Stringify())
 	m.factMux.Lock()
 	defer m.factMux.Unlock()
-	return m.addFact(f, m.e2e.GetReceptionID(), m.comms)
+	return m.addFact(f, m.e2e.GetReceptionIdentity().ID, m.comms)
 }
 
 // addFact is the helper function for SendRegisterFact.
@@ -45,7 +45,10 @@ func (m *Manager) addFact(inFact fact.Fact, myId *id.ID,
 	fHash := factID.Fingerprint(f)
 
 	// Sign our inFact for putting into the request
-	privKey := m.user.PortableUserInfo().ReceptionRSA
+	privKey, err := m.e2e.GetReceptionIdentity().GetRSAPrivatePem()
+	if err != nil {
+		return "", err
+	}
 	stream := m.rng.GetStream()
 	defer stream.Close()
 	fSig, err := rsa.Sign(stream, privKey, hash.CMixHash, fHash, nil)
diff --git a/ud/interfaces.go b/ud/interfaces.go
index db7f0b60333ddbc559520aa5ee9a12eb51594eea..42b0c570f5ff522bcb2b8204ad867b4b08fd9b4a 100644
--- a/ud/interfaces.go
+++ b/ud/interfaces.go
@@ -1,11 +1,13 @@
 package ud
 
 import (
+	"gitlab.com/elixxir/client/cmix"
+	"gitlab.com/elixxir/client/e2e"
+	"gitlab.com/elixxir/client/event"
 	"gitlab.com/elixxir/client/single"
-	"gitlab.com/elixxir/client/storage/user"
+	"gitlab.com/elixxir/client/storage"
 	"gitlab.com/elixxir/client/xxdk"
-	"gitlab.com/elixxir/crypto/cyclic"
-	"gitlab.com/xx_network/primitives/id"
+	"gitlab.com/elixxir/crypto/fastRNG"
 )
 
 // CMix is a sub-interface of the cmix.Client. It contains the methods
@@ -16,25 +18,16 @@ type CMix interface {
 	single.Cmix
 }
 
-// E2E is a sub-interface of the e2e.Handler. It contains the methods
+// E2E is a sub-interface of the xxdk.E2e. It contains the methods
 // relevant to what is used in this package.
 type E2E interface {
-	// GetGroup returns the cyclic group used for end to end encruption
-	GetGroup() *cyclic.Group
-
-	// GetReceptionID returns the default IDs
-	GetReceptionID() *id.ID
-
-	// GetHistoricalDHPubkey returns the user's Historical DH
-	// Public Key
-	GetHistoricalDHPubkey() *cyclic.Int
-}
-
-// UserInfo is a sub-interface for the user.User object in storage.
-// It contains the methods relevant to what is used in this package.
-type UserInfo interface {
-	PortableUserInfo() user.Info
-	GetReceptionRegistrationValidationSignature() []byte
+	GetReceptionIdentity() xxdk.ReceptionIdentity
+	GetCmix() cmix.Client
+	GetE2E() e2e.Handler
+	GetEventReporter() event.Reporter
+	GetRng() *fastRNG.StreamGenerator
+	GetStorage() storage.Session
+	GetTransmissionIdentity() xxdk.TransmissionIdentity
 }
 
 // NetworkStatus is an interface for the xxdk.Cmix's
diff --git a/ud/lookup_test.go b/ud/lookup_test.go
index 132905cc0878331aba435b1cbeee045bbda91d84..716f93460fe87b982e7f705ff6ebab59e7711a60 100644
--- a/ud/lookup_test.go
+++ b/ud/lookup_test.go
@@ -65,8 +65,8 @@ func TestManager_Lookup(t *testing.T) {
 
 	defer mockListener.Stop()
 
-	r := m.e2e.GetGroup().NewInt(1)
-	m.e2e.GetGroup().Random(r)
+	r := m.e2e.GetE2E().GetGroup().NewInt(1)
+	m.e2e.GetE2E().GetGroup().Random(r)
 	s := ""
 	jsonable, err := r.MarshalJSON()
 	if err != nil {
diff --git a/ud/manager.go b/ud/manager.go
index 77dbc01f44def0d37e0d84ff208fb8cffe39befe..757d2247331fdbc2f531039c72e6643306a4725c 100644
--- a/ud/manager.go
+++ b/ud/manager.go
@@ -43,11 +43,6 @@ type Manager struct {
 	// with the UD service
 	store *store.Store
 
-	// user is a sub-interface of the user.User object in the storage package.
-	// This allows the Manager to pull user information for registration
-	// and verifying the client's identity
-	user UserInfo
-
 	// comms is a sub-interface of the client.Comms interface. It contains
 	// gRPC functions for registering and fact operations.
 	comms Comms
@@ -69,16 +64,18 @@ type Manager struct {
 	// rng is a fastRNG.StreamGenerator which is used to generate random
 	// data. This is used for signatures for adding/removing facts.
 	rng *fastRNG.StreamGenerator
+
+	// registrationValidationSignature for the ReceptionID
+	// Optional, depending on UD configuration
+	registrationValidationSignature []byte
 }
 
 // NewManager builds a new user discovery manager.
 // It requires that an updated
 // NDF is available and will error if one is not.
-func NewManager(services CMix, e2e E2E,
-	follower NetworkStatus,
-	events event.Reporter, comms Comms, userStore UserInfo,
-	rng *fastRNG.StreamGenerator, username string,
-	kv *versioned.KV) (*Manager, error) {
+// registrationValidationSignature may be set to nil
+func NewManager(e2e E2E, comms Comms, follower NetworkStatus,
+	username string, registrationValidationSignature []byte) (*Manager, error) {
 	jww.INFO.Println("ud.NewManager()")
 
 	if follower() != xxdk.Running {
@@ -88,13 +85,13 @@ func NewManager(services CMix, e2e E2E,
 
 	// Initialize manager
 	m := &Manager{
-		network: services,
-		e2e:     e2e,
-		events:  events,
-		comms:   comms,
-		user:    userStore,
-		kv:      kv,
-		rng:     rng,
+		network:                         e2e.GetCmix(),
+		e2e:                             e2e,
+		events:                          e2e.GetEventReporter(),
+		comms:                           comms,
+		kv:                              e2e.GetStorage().GetKV(),
+		rng:                             e2e.GetRng(),
+		registrationValidationSignature: registrationValidationSignature,
 	}
 
 	if m.isRegistered() {
@@ -103,7 +100,7 @@ func NewManager(services CMix, e2e E2E,
 
 	// Initialize store
 	var err error
-	m.store, err = store.NewOrLoadStore(kv)
+	m.store, err = store.NewOrLoadStore(m.kv)
 	if err != nil {
 		return nil, errors.Errorf("Failed to initialize store: %v", err)
 	}
@@ -116,15 +113,15 @@ func NewManager(services CMix, e2e E2E,
 	}
 
 	// Register with user discovery
-	stream := rng.GetStream()
+	stream := m.rng.GetStream()
 	defer stream.Close()
-	err = m.register(username, stream, comms, udHost)
+	err = m.register(username, stream, m.comms, udHost)
 	if err != nil {
 		return nil, errors.Errorf("Failed to register: %v", err)
 	}
 
 	// Set storage to registered
-	if err = setRegistered(kv); err != nil && m.events != nil {
+	if err = setRegistered(m.kv); err != nil && m.events != nil {
 		m.events.Report(1, "UserDiscovery", "Registration",
 			fmt.Sprintf("User Registered with UD: %+v",
 				username))
@@ -136,11 +133,8 @@ func NewManager(services CMix, e2e E2E,
 // NewManagerFromBackup builds a new user discover manager from a backup.
 // It will construct a manager that is already registered and restore
 // already registered facts into store.
-func NewManagerFromBackup(services CMix,
-	e2e E2E, follower NetworkStatus,
-	events event.Reporter, comms Comms, userStore UserInfo,
-	rng *fastRNG.StreamGenerator,
-	email, phone fact.Fact, kv *versioned.KV) (*Manager, error) {
+func NewManagerFromBackup(e2e E2E, comms Comms, follower NetworkStatus,
+	email, phone fact.Fact) (*Manager, error) {
 	jww.INFO.Println("ud.NewManagerFromBackup()")
 	if follower() != xxdk.Running {
 		return nil, errors.New(
@@ -150,18 +144,17 @@ func NewManagerFromBackup(services CMix,
 
 	// Initialize manager
 	m := &Manager{
-		network: services,
+		network: e2e.GetCmix(),
 		e2e:     e2e,
-		events:  events,
+		events:  e2e.GetEventReporter(),
 		comms:   comms,
-		user:    userStore,
-		kv:      kv,
-		rng:     rng,
+		kv:      e2e.GetStorage().GetKV(),
+		rng:     e2e.GetRng(),
 	}
 
 	// Initialize our store
 	var err error
-	m.store, err = store.NewOrLoadStore(kv)
+	m.store, err = store.NewOrLoadStore(m.kv)
 	if err != nil {
 		return nil, err
 	}
@@ -175,7 +168,7 @@ func NewManagerFromBackup(services CMix,
 
 	// Set as registered. Since it's from a backup,
 	// the client is already registered
-	if err = setRegistered(kv); err != nil {
+	if err = setRegistered(m.kv); err != nil {
 		return nil, errors.WithMessage(err, "failed to set client as "+
 			"registered with user discovery.")
 	}
@@ -219,19 +212,15 @@ func InitStoreFromBackup(kv *versioned.KV,
 // LoadManager loads the state of the Manager
 // from disk. This is meant to be called after any the first
 // instantiation of the manager by NewUserDiscovery.
-func LoadManager(services CMix, e2e E2E,
-	events event.Reporter, comms Comms, userStore UserInfo,
-	rng *fastRNG.StreamGenerator,
-	kv *versioned.KV) (*Manager, error) {
+func LoadManager(e2e E2E, comms Comms) (*Manager, error) {
 
 	m := &Manager{
-		network: services,
+		network: e2e.GetCmix(),
 		e2e:     e2e,
-		events:  events,
+		events:  e2e.GetEventReporter(),
 		comms:   comms,
-		user:    userStore,
-		rng:     rng,
-		kv:      kv,
+		rng:     e2e.GetRng(),
+		kv:      e2e.GetStorage().GetKV(),
 	}
 
 	if !m.isRegistered() {
@@ -240,7 +229,7 @@ func LoadManager(services CMix, e2e E2E,
 	}
 
 	var err error
-	m.store, err = store.NewOrLoadStore(kv)
+	m.store, err = store.NewOrLoadStore(m.kv)
 	if err != nil {
 		return nil, errors.Errorf("Failed to initialize store: %v", err)
 	}
@@ -262,7 +251,10 @@ func (m *Manager) GetStringifiedFacts() []string {
 
 // GetContact returns the contact for UD as retrieved from the NDF.
 func (m *Manager) GetContact() (contact.Contact, error) {
-	grp := m.e2e.GetGroup()
+	grp, err := m.e2e.GetReceptionIdentity().GetGroup()
+	if err != nil {
+		return contact.Contact{}, err
+	}
 	// Return alternative User discovery contact if set
 	if m.alternativeUd != nil {
 		// Unmarshal UD DH public key
diff --git a/ud/mockComms_test.go b/ud/mockComms_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..542469eac332d27589dc6c40a27ef824f60a6cab
--- /dev/null
+++ b/ud/mockComms_test.go
@@ -0,0 +1,46 @@
+package ud
+
+import (
+	pb "gitlab.com/elixxir/comms/mixmessages"
+	"gitlab.com/xx_network/comms/connect"
+	"gitlab.com/xx_network/comms/messages"
+	"gitlab.com/xx_network/primitives/id"
+)
+
+type mockComms struct {
+	udHost *connect.Host
+}
+
+func (m mockComms) SendRegisterUser(host *connect.Host, message *pb.UDBUserRegistration) (*messages.Ack, error) {
+	return nil, nil
+}
+
+func (m mockComms) SendRegisterFact(host *connect.Host, message *pb.FactRegisterRequest) (*pb.FactRegisterResponse, error) {
+	return nil, nil
+}
+
+func (m mockComms) SendConfirmFact(host *connect.Host, message *pb.FactConfirmRequest) (*messages.Ack, error) {
+	return nil, nil
+}
+
+func (m mockComms) SendRemoveFact(host *connect.Host, message *pb.FactRemovalRequest) (*messages.Ack, error) {
+	return nil, nil
+}
+
+func (m mockComms) SendRemoveUser(host *connect.Host, message *pb.FactRemovalRequest) (*messages.Ack, error) {
+	return nil, nil
+}
+
+func (m *mockComms) AddHost(hid *id.ID, address string, cert []byte, params connect.HostParams) (host *connect.Host, err error) {
+	h, err := connect.NewHost(hid, address, cert, params)
+	if err != nil {
+		return nil, err
+	}
+
+	m.udHost = h
+	return h, nil
+}
+
+func (m mockComms) GetHost(hostId *id.ID) (*connect.Host, bool) {
+	return m.udHost, true
+}
diff --git a/ud/mockE2e_test.go b/ud/mockE2e_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..4341478526e251ff22b85a0ccfa458383137798b
--- /dev/null
+++ b/ud/mockE2e_test.go
@@ -0,0 +1,215 @@
+package ud
+
+import (
+	"github.com/cloudflare/circl/dh/sidh"
+	"gitlab.com/elixxir/client/catalog"
+	"gitlab.com/elixxir/client/cmix"
+	"gitlab.com/elixxir/client/cmix/message"
+	"gitlab.com/elixxir/client/e2e"
+	"gitlab.com/elixxir/client/e2e/ratchet/partner"
+	"gitlab.com/elixxir/client/e2e/ratchet/partner/session"
+	"gitlab.com/elixxir/client/e2e/receive"
+	"gitlab.com/elixxir/client/event"
+	"gitlab.com/elixxir/client/stoppable"
+	"gitlab.com/elixxir/client/storage"
+	"gitlab.com/elixxir/client/xxdk"
+	"gitlab.com/elixxir/crypto/cyclic"
+	cryptoE2e "gitlab.com/elixxir/crypto/e2e"
+	"gitlab.com/elixxir/crypto/fastRNG"
+	"gitlab.com/xx_network/crypto/csprng"
+	"gitlab.com/xx_network/crypto/signature/rsa"
+	"gitlab.com/xx_network/primitives/id"
+	"testing"
+	"time"
+)
+
+///////////////////////////////////////////////////////////////////////////////
+// Mock of the E2E interface within this package //////////////////////////////
+///////////////////////////////////////////////////////////////////////////////
+
+type mockE2e struct {
+	grp *cyclic.Group
+	t   testing.TB
+	key *rsa.PrivateKey
+}
+
+func (m mockE2e) GetE2E() e2e.Handler {
+	return mockE2eHandler{}
+}
+
+func (m mockE2e) GetReceptionIdentity() xxdk.ReceptionIdentity {
+
+	dhPrivKey, _ := getGroup().NewInt(5).MarshalJSON()
+	grp, _ := getGroup().MarshalJSON()
+
+	return xxdk.ReceptionIdentity{
+		ID:            id.NewIdFromString("test", id.User, m.t),
+		RSAPrivatePem: rsa.CreatePrivateKeyPem(m.key),
+		Salt:          []byte("test"),
+		DHKeyPrivate:  dhPrivKey,
+		E2eGrp:        grp,
+	}
+}
+
+func (m mockE2e) GetRng() *fastRNG.StreamGenerator {
+	return fastRNG.NewStreamGenerator(1000, 10, csprng.NewSystemRNG)
+}
+
+func (m mockE2e) GetTransmissionIdentity() xxdk.TransmissionIdentity {
+	return xxdk.TransmissionIdentity{
+		ID:            id.NewIdFromString("test", id.User, m.t),
+		RSAPrivatePem: m.key,
+		Salt:          []byte("test"),
+	}
+}
+
+func (m mockE2e) GetHistoricalDHPubkey() *cyclic.Int {
+	return m.grp.NewInt(6)
+}
+
+func (m mockE2e) GetReceptionID() *id.ID {
+	return id.NewIdFromString("test", id.User, m.t)
+}
+
+func (m mockE2e) GetGroup() *cyclic.Group {
+	return getGroup()
+}
+
+func (m mockE2e) GetEventReporter() event.Reporter {
+	return mockReporter{}
+}
+
+func (m mockE2e) GetCmix() cmix.Client {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockE2e) GetStorage() storage.Session {
+	//TODO implement me
+	panic("implement me")
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// Mock of the e2e.Handler interface within this package //////////////////////
+///////////////////////////////////////////////////////////////////////////////
+
+type mockE2eHandler struct{}
+
+func (m mockE2eHandler) StartProcesses() (stoppable.Stoppable, error) {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockE2eHandler) SendE2E(mt catalog.MessageType, recipient *id.ID, payload []byte, params e2e.Params) ([]id.Round, cryptoE2e.MessageID, time.Time, error) {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockE2eHandler) RegisterListener(senderID *id.ID, messageType catalog.MessageType, newListener receive.Listener) receive.ListenerID {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockE2eHandler) RegisterFunc(name string, senderID *id.ID, messageType catalog.MessageType, newListener receive.ListenerFunc) receive.ListenerID {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockE2eHandler) RegisterChannel(name string, senderID *id.ID, messageType catalog.MessageType, newListener chan receive.Message) receive.ListenerID {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockE2eHandler) Unregister(listenerID receive.ListenerID) {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockE2eHandler) UnregisterUserListeners(userID *id.ID) {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockE2eHandler) AddPartner(partnerID *id.ID, partnerPubKey, myPrivKey *cyclic.Int, partnerSIDHPubKey *sidh.PublicKey, mySIDHPrivKey *sidh.PrivateKey, sendParams, receiveParams session.Params) (partner.Manager, error) {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockE2eHandler) GetPartner(partnerID *id.ID) (partner.Manager, error) {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockE2eHandler) DeletePartner(partnerId *id.ID) error {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockE2eHandler) GetAllPartnerIDs() []*id.ID {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockE2eHandler) HasAuthenticatedChannel(partner *id.ID) bool {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockE2eHandler) AddService(tag string, processor message.Processor) error {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockE2eHandler) RemoveService(tag string) error {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockE2eHandler) SendUnsafe(mt catalog.MessageType, recipient *id.ID, payload []byte, params e2e.Params) ([]id.Round, time.Time, error) {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockE2eHandler) EnableUnsafeReception() {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockE2eHandler) GetHistoricalDHPubkey() *cyclic.Int {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockE2eHandler) GetHistoricalDHPrivkey() *cyclic.Int {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockE2eHandler) GetReceptionID() *id.ID {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockE2eHandler) FirstPartitionSize() uint {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockE2eHandler) SecondPartitionSize() uint {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockE2eHandler) PartitionSize(payloadIndex uint) uint {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockE2eHandler) PayloadSize() uint {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockE2eHandler) GetGroup() *cyclic.Group {
+	return getGroup()
+}
diff --git a/ud/register.go b/ud/register.go
index 3df8edd643216d8629e7c074152cd23f7ef2cc04..591a1cf1fd218c9afc9b84af5d53c4300505914e 100644
--- a/ud/register.go
+++ b/ud/register.go
@@ -17,24 +17,37 @@ func (m *Manager) register(username string, rng csprng.Source,
 	comm registerUserComms, udHost *connect.Host) error {
 
 	var err error
-	cryptoUser := m.user.PortableUserInfo()
+	identity := m.e2e.GetReceptionIdentity()
+	privKey, err := identity.GetRSAPrivatePem()
+	if err != nil {
+		return err
+	}
+	grp, err := identity.GetGroup()
+	if err != nil {
+		return err
+	}
+	dhKeyPriv, err := identity.GetDHKeyPrivate()
+	if err != nil {
+		return err
+	}
+	dhKeyPub := grp.ExpG(dhKeyPriv, grp.NewInt(1))
 
 	// Construct the user registration message
 	msg := &pb.UDBUserRegistration{
-		PermissioningSignature: m.user.GetReceptionRegistrationValidationSignature(),
-		RSAPublicPem:           string(rsa.CreatePublicKeyPem(cryptoUser.ReceptionRSA.GetPublic())),
+		PermissioningSignature: m.registrationValidationSignature,
+		RSAPublicPem:           string(rsa.CreatePublicKeyPem(privKey.GetPublic())),
 		IdentityRegistration: &pb.Identity{
 			Username: username,
-			DhPubKey: m.e2e.GetHistoricalDHPubkey().Bytes(),
-			Salt:     cryptoUser.ReceptionSalt,
+			DhPubKey: dhKeyPub.Bytes(),
+			Salt:     identity.Salt,
 		},
-		UID:       cryptoUser.ReceptionID.Marshal(),
-		Timestamp: cryptoUser.RegistrationTimestamp,
+		UID:       identity.ID.Marshal(),
+		Timestamp: m.e2e.GetTransmissionIdentity().RegistrationTimestamp,
 	}
 
 	// Sign the identity data and add to user registration message
 	identityDigest := msg.IdentityRegistration.Digest()
-	msg.IdentitySignature, err = rsa.Sign(rng, cryptoUser.ReceptionRSA,
+	msg.IdentitySignature, err = rsa.Sign(rng, privKey,
 		hash.CMixHash, identityDigest, nil)
 	if err != nil {
 		return errors.Errorf("Failed to sign user's IdentityRegistration: %+v", err)
@@ -48,11 +61,11 @@ func (m *Manager) register(username string, rng csprng.Source,
 
 	// Hash and sign fact
 	hashedFact := factID.Fingerprint(usernameFact)
-	signedFact, err := rsa.Sign(rng, cryptoUser.ReceptionRSA, hash.CMixHash, hashedFact, nil)
+	signedFact, err := rsa.Sign(rng, privKey, hash.CMixHash, hashedFact, nil)
 
 	// Add username fact register request to the user registration message
 	msg.Frs = &pb.FactRegisterRequest{
-		UID: cryptoUser.ReceptionID.Marshal(),
+		UID: identity.ID.Marshal(),
 		Fact: &pb.Fact{
 			Fact:     username,
 			FactType: 0,
diff --git a/ud/register_test.go b/ud/register_test.go
index 3aae46e19b7a3834e3f16c6f42a35e8e696e20bc..d23aacc40f1b7bb89a1fb2f9606dc414ec909f72 100644
--- a/ud/register_test.go
+++ b/ud/register_test.go
@@ -43,8 +43,13 @@ func TestManager_register(t *testing.T) {
 	isCorrect("testUser", c.msg, m, t)
 
 	// Verify the signed identity data
-	pubKey := m.user.PortableUserInfo().ReceptionRSA.GetPublic()
-	err = rsa.Verify(pubKey, hash.CMixHash, c.msg.IdentityRegistration.Digest(),
+	pubKeyPem := m.e2e.GetReceptionIdentity().RSAPrivatePem
+	privKey, err := rsa.LoadPrivateKeyFromPem(pubKeyPem)
+	if err != nil {
+		t.Fatalf("Failed to load public key: %+v", err)
+	}
+
+	err = rsa.Verify(privKey.GetPublic(), hash.CMixHash, c.msg.IdentityRegistration.Digest(),
 		c.msg.IdentitySignature, nil)
 	if err != nil {
 		t.Errorf("Failed to verify signed identity data: %+v", err)
@@ -52,7 +57,7 @@ func TestManager_register(t *testing.T) {
 
 	// Verify the signed fact
 	usernameFact, _ := fact.NewFact(fact.Username, "testUser")
-	err = rsa.Verify(pubKey, hash.CMixHash, factID.Fingerprint(usernameFact),
+	err = rsa.Verify(privKey.GetPublic(), hash.CMixHash, factID.Fingerprint(usernameFact),
 		c.msg.Frs.FactSig, nil)
 	if err != nil {
 		t.Errorf("Failed to verify signed fact data: %+v", err)
@@ -62,17 +67,23 @@ func TestManager_register(t *testing.T) {
 // isCorrect checks if the UDBUserRegistration has all the expected fields minus
 // any signatures.
 func isCorrect(username string, msg *pb.UDBUserRegistration, m *Manager, t *testing.T) {
-	userInfo := m.user.PortableUserInfo()
-
-	if !bytes.Equal(m.user.GetReceptionRegistrationValidationSignature(), msg.PermissioningSignature) {
+	if !bytes.Equal(m.registrationValidationSignature, msg.PermissioningSignature) {
 		t.Errorf("PermissioningSignature incorrect.\n\texpected: %v\n\treceived: %v",
-			m.user.GetReceptionRegistrationValidationSignature(), msg.PermissioningSignature)
+			m.registrationValidationSignature, msg.PermissioningSignature)
+	}
+
+	identity := m.e2e.GetReceptionIdentity()
+	privKey, err := rsa.LoadPrivateKeyFromPem(identity.RSAPrivatePem)
+	if err != nil {
+		t.Fatalf("Failed to load private key: %v", err)
 	}
 
-	if string(rsa.CreatePublicKeyPem(userInfo.TransmissionRSA.GetPublic())) !=
+	pubKeyPem := rsa.CreatePublicKeyPem(privKey.GetPublic())
+
+	if string(pubKeyPem) !=
 		msg.RSAPublicPem {
 		t.Errorf("RSAPublicPem incorrect.\n\texpected: %v\n\treceived: %v",
-			string(rsa.CreatePublicKeyPem(userInfo.TransmissionRSA.GetPublic())),
+			string(pubKeyPem),
 			msg.RSAPublicPem)
 	}
 
@@ -81,19 +92,27 @@ func isCorrect(username string, msg *pb.UDBUserRegistration, m *Manager, t *test
 			username, msg.IdentityRegistration.Username)
 	}
 
-	if !bytes.Equal(userInfo.E2eDhPublicKey.Bytes(), msg.IdentityRegistration.DhPubKey) {
+	dhKeyPriv, err := identity.GetDHKeyPrivate()
+	if err != nil {
+		t.Fatalf("%v", err)
+	}
+
+	grp := m.e2e.GetE2E().GetGroup()
+	dhKeyPub := grp.ExpG(dhKeyPriv, grp.NewInt(1))
+
+	if !bytes.Equal(dhKeyPub.Bytes(), msg.IdentityRegistration.DhPubKey) {
 		t.Errorf("IdentityRegistration DhPubKey incorrect.\n\texpected: %#v\n\treceived: %#v",
-			userInfo.E2eDhPublicKey.Bytes(), msg.IdentityRegistration.DhPubKey)
+			dhKeyPub.Bytes(), msg.IdentityRegistration.DhPubKey)
 	}
 
-	if !bytes.Equal(userInfo.TransmissionSalt, msg.IdentityRegistration.Salt) {
+	if !bytes.Equal(identity.Salt, msg.IdentityRegistration.Salt) {
 		t.Errorf("IdentityRegistration Salt incorrect.\n\texpected: %#v\n\treceived: %#v",
-			userInfo.TransmissionSalt, msg.IdentityRegistration.Salt)
+			identity.Salt, msg.IdentityRegistration.Salt)
 	}
 
-	if !bytes.Equal(userInfo.TransmissionID.Marshal(), msg.Frs.UID) {
+	if !bytes.Equal(identity.ID.Marshal(), msg.Frs.UID) {
 		t.Errorf("Frs UID incorrect.\n\texpected: %v\n\treceived: %v",
-			userInfo.TransmissionID.Marshal(), msg.Frs.UID)
+			identity.ID.Marshal(), msg.Frs.UID)
 	}
 
 	if !reflect.DeepEqual(&pb.Fact{Fact: username}, msg.Frs.Fact) {
diff --git a/ud/remove.go b/ud/remove.go
index b64a218e6d54f120de999478ef8b9fd5fb10dd0c..97fbc8a192bea01066632717029bd07a69167733 100644
--- a/ud/remove.go
+++ b/ud/remove.go
@@ -45,7 +45,11 @@ func (m *Manager) removeFact(f fact.Fact,
 	fHash := factID.Fingerprint(f)
 
 	// Sign our inFact for putting into the request
-	privKey := m.user.PortableUserInfo().ReceptionRSA
+	identity := m.e2e.GetReceptionIdentity()
+	privKey, err := identity.GetRSAPrivatePem()
+	if err != nil {
+		return err
+	}
 	stream := m.rng.GetStream()
 	defer stream.Close()
 	fSig, err := rsa.Sign(stream, privKey, hash.CMixHash, fHash, nil)
@@ -55,7 +59,7 @@ func (m *Manager) removeFact(f fact.Fact,
 
 	// Create our Fact Removal Request message data
 	remFactMsg := mixmessages.FactRemovalRequest{
-		UID:         m.e2e.GetReceptionID().Marshal(),
+		UID:         identity.ID.Marshal(),
 		RemovalData: &mmFact,
 		FactSig:     fSig,
 	}
@@ -84,9 +88,14 @@ func (m *Manager) PermanentDeleteAccount(f fact.Fact) error {
 	if err != nil {
 		return err
 	}
-	privKey := m.user.PortableUserInfo().ReceptionRSA
 
-	return m.permanentDeleteAccount(f, m.e2e.GetReceptionID(), privKey, m.comms, udHost)
+	identity := m.e2e.GetReceptionIdentity()
+	privKey, err := identity.GetRSAPrivatePem()
+	if err != nil {
+		return err
+	}
+
+	return m.permanentDeleteAccount(f, identity.ID, privKey, m.comms, udHost)
 }
 
 // permanentDeleteAccount is a helper function for PermanentDeleteAccount.
diff --git a/ud/search_test.go b/ud/search_test.go
index 4bbc98e44ccba2fc08f3f98b0b58c5925d774ae9..49d9cbf7905bed838a9607098f1c5cd427b42ec3 100644
--- a/ud/search_test.go
+++ b/ud/search_test.go
@@ -71,7 +71,7 @@ func TestManager_Search(t *testing.T) {
 		CmixParams:          cmix.GetDefaultCMIXParams(),
 	}
 
-	_, _, err = Search(m.network, m.events, prng, m.e2e.GetGroup(),
+	_, _, err = Search(m.network, m.events, prng, m.e2e.GetE2E().GetGroup(),
 		udContact, callback, factList, p)
 	if err != nil {
 		t.Fatalf("Search() returned an error: %+v", err)
diff --git a/ud/utils_test.go b/ud/utils_test.go
index 5124db19cd73f3b153afde487c4649a2276780ff..5c65cb48f3d36d4d1589eaba85f86b16cc8d9176 100644
--- a/ud/utils_test.go
+++ b/ud/utils_test.go
@@ -20,19 +20,15 @@ import (
 	"gitlab.com/elixxir/client/storage/user"
 	"gitlab.com/elixxir/client/storage/versioned"
 	store "gitlab.com/elixxir/client/ud/store"
-	pb "gitlab.com/elixxir/comms/mixmessages"
-	"gitlab.com/elixxir/comms/testkeys"
 	"gitlab.com/elixxir/crypto/contact"
 	"gitlab.com/elixxir/crypto/cyclic"
 	"gitlab.com/elixxir/crypto/fastRNG"
 	"gitlab.com/elixxir/ekv"
 	"gitlab.com/elixxir/primitives/format"
-	"gitlab.com/xx_network/comms/messages"
 	"gitlab.com/xx_network/crypto/csprng"
 	"gitlab.com/xx_network/crypto/large"
 	"gitlab.com/xx_network/crypto/signature/rsa"
 	"gitlab.com/xx_network/primitives/id/ephemeral"
-	"gitlab.com/xx_network/primitives/utils"
 	"io"
 	"math/rand"
 	"testing"
@@ -53,17 +49,6 @@ const dhKeyEnc = `hQj4FKeaQDt34eO/BQe5OSk571WMQBu4YNqMQ0TFeuzjzCM9lLMuOsQhcyjZcI
 const lookupRequestEnc = `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`
 
 func newTestManager(t *testing.T) (*Manager, *testNetworkManager) {
-
-	keyData, err := utils.ReadFile(testkeys.GetNodeKeyPath())
-	if err != nil {
-		t.Fatalf("Could not load private key: %v", err)
-	}
-
-	key, err := rsa.LoadPrivateKeyFromPem(keyData)
-	if err != nil {
-		t.Fatalf("Could not load public key")
-	}
-
 	kv := versioned.NewKV(ekv.MakeMemstore())
 	udStore, err := store.NewOrLoadStore(kv)
 	if err != nil {
@@ -71,12 +56,18 @@ func newTestManager(t *testing.T) (*Manager, *testNetworkManager) {
 	}
 
 	rngGen := fastRNG.NewStreamGenerator(1000, 10, csprng.NewSystemRNG)
+	stream := rngGen.GetStream()
+	privKey, err := rsa.GenerateKey(stream, 1024)
+	stream.Close()
 
 	// Create our Manager object
 	m := &Manager{
-		e2e:    mockE2e{grp: getGroup()},
+		e2e: mockE2e{
+			grp: getGroup(),
+			t:   t,
+			key: privKey,
+		},
 		events: event.NewEventManager(),
-		user:   mockUser{testing: t, key: key},
 		store:  udStore,
 		comms:  &mockComms{},
 		rng:    rngGen,
@@ -335,81 +326,10 @@ func (tnm *testNetworkManager) GetInstance() *network.Instance {
 	return tnm.instance
 }
 
-type mockUserStore struct{}
-
-func (m mockUserStore) PortableUserInfo() user.Info {
-	//TODO implement me
-	panic("implement me")
-}
-
-func (m mockUserStore) GetUsername() (string, error) {
-	//TODO implement me
-	panic("implement me")
-}
-
-func (m mockUserStore) GetReceptionRegistrationValidationSignature() []byte {
-	//TODO implement me
-	panic("implement me")
-}
-
-type mockComms struct {
-	udHost *connect.Host
-}
-
-func (m mockComms) SendRegisterUser(host *connect.Host, message *pb.UDBUserRegistration) (*messages.Ack, error) {
-	//TODO implement me
-	panic("implement me")
-}
-
-func (m mockComms) SendRegisterFact(host *connect.Host, message *pb.FactRegisterRequest) (*pb.FactRegisterResponse, error) {
-	//TODO implement me
-	panic("implement me")
-}
-
-func (m mockComms) SendConfirmFact(host *connect.Host, message *pb.FactConfirmRequest) (*messages.Ack, error) {
-	//TODO implement me
-	panic("implement me")
-}
+type mockReporter struct{}
 
-func (m mockComms) SendRemoveFact(host *connect.Host, message *pb.FactRemovalRequest) (*messages.Ack, error) {
-	//TODO implement me
-	panic("implement me")
-}
-
-func (m mockComms) SendRemoveUser(host *connect.Host, message *pb.FactRemovalRequest) (*messages.Ack, error) {
-	//TODO implement me
-	panic("implement me")
-}
-
-func (m *mockComms) AddHost(hid *id.ID, address string, cert []byte, params connect.HostParams) (host *connect.Host, err error) {
-	h, err := connect.NewHost(hid, address, cert, params)
-	if err != nil {
-		return nil, err
-	}
-
-	m.udHost = h
-	return h, nil
-}
-
-func (m mockComms) GetHost(hostId *id.ID) (*connect.Host, bool) {
-	return m.udHost, true
-}
-
-type mockE2e struct {
-	grp *cyclic.Group
-}
-
-func (m mockE2e) GetHistoricalDHPubkey() *cyclic.Int {
-	return m.grp.NewInt(6)
-}
-
-func (m mockE2e) GetReceptionID() *id.ID {
-	//TODO implement me
-	panic("implement me")
-}
-
-func (m mockE2e) GetGroup() *cyclic.Group {
-	return getGroup()
+func (m mockReporter) Report(priority int, category, evtType, details string) {
+	return
 }
 
 type mockResponse struct {
diff --git a/xxdk/cmix.go b/xxdk/cmix.go
index fbc08044b3cdb27bc8224cdff2805dff8efd09eb..6bc1f0915134ec42d5a5bb21b2b433ae9603f59f 100644
--- a/xxdk/cmix.go
+++ b/xxdk/cmix.go
@@ -213,12 +213,12 @@ func LoadCmix(storageDir string, password []byte, parameters CMIXParams) (*Cmix,
 		return nil, err
 	}
 
-	jww.INFO.Printf("Cmix Logged in: \n\tTransmissionID: %s "+
-		"\n\tReceptionID: %s", c.storage.GetTransmissionID(), c.storage.GetReceptionID())
+	jww.INFO.Printf("Client loaded: \n\tTransmissionID: %s",
+		c.GetTransmissionIdentity().ID)
 
 	def := c.storage.GetNDF()
 
-	//initialize registration
+	//initialize registration.
 	if def.Registration.Address != "" {
 		err = c.initPermissioning(def)
 		if err != nil {
@@ -257,13 +257,14 @@ func (c *Cmix) initComms() error {
 	var err error
 
 	//get the user from session
-	privKey := c.storage.GetTransmissionRSA()
+	transmissionIdentity := c.GetTransmissionIdentity()
+	privKey := transmissionIdentity.RSAPrivatePem
 	pubPEM := rsa.CreatePublicKeyPem(privKey.GetPublic())
 	privPEM := rsa.CreatePrivateKeyPem(privKey)
 
 	//start comms
-	c.comms, err = client.NewClientComms(c.storage.GetTransmissionID(),
-		pubPEM, privPEM, c.storage.GetTransmissionSalt())
+	c.comms, err = client.NewClientComms(transmissionIdentity.ID,
+		pubPEM, privPEM, transmissionIdentity.Salt)
 	if err != nil {
 		return errors.WithMessage(err, "failed to load client")
 	}
diff --git a/xxdk/e2e.go b/xxdk/e2e.go
index 55c83b6f490a25691c4954916a558901816ae661..0e55925360d9793445218c441a4c6ee3d9df8a5a 100644
--- a/xxdk/e2e.go
+++ b/xxdk/e2e.go
@@ -248,6 +248,8 @@ func login(client *Cmix, callbacks AuthCallbacks, identity ReceptionIdentity,
 	}
 
 	client.network.AddIdentity(identity.ID, time.Time{}, true)
+	jww.INFO.Printf("Client logged in: \n\tReceptionID: %s",
+		identity.ID)
 	return m, err
 }
 
diff --git a/xxdk/identity.go b/xxdk/identity.go
index 97de124001ce2d090d80cf7c70b7f48a9bba5431..96100eddf44e1a7de4bbf11045dea336b6446251 100644
--- a/xxdk/identity.go
+++ b/xxdk/identity.go
@@ -81,6 +81,12 @@ func (r ReceptionIdentity) GetRSAPrivatePem() (*rsa.PrivateKey, error) {
 	return rsa.LoadPrivateKeyFromPem(r.RSAPrivatePem)
 }
 
+// GetGroup returns the cyclic.Group in go format
+func (r ReceptionIdentity) GetGroup() (*cyclic.Group, error) {
+	grp := &cyclic.Group{}
+	return grp, grp.UnmarshalJSON(r.E2eGrp)
+}
+
 // MakeReceptionIdentity generates a new cryptographic identity
 // for receiving messages.
 func MakeReceptionIdentity(client *Cmix) (ReceptionIdentity, error) {
@@ -155,8 +161,7 @@ func (r ReceptionIdentity) DeepCopy() ReceptionIdentity {
 
 // GetContact accepts a xxdk.ReceptionIdentity object and returns a contact.Contact object
 func (r ReceptionIdentity) GetContact() contact.Contact {
-	grp := &cyclic.Group{}
-	_ = grp.UnmarshalJSON(r.E2eGrp)
+	grp, _ := r.GetGroup()
 	dhKeyPriv, _ := r.GetDHKeyPrivate()
 
 	dhPub := grp.ExpG(dhKeyPriv, grp.NewInt(1))