diff --git a/bindings/autheticatedConnection.go b/bindings/autheticatedConnection.go
index 6ce0cf71346cee5386414eb1c80c6c8da142d3d5..5e1f78f4e08f813881f01b3695b423a4c1cd2f1e 100644
--- a/bindings/autheticatedConnection.go
+++ b/bindings/autheticatedConnection.go
@@ -23,7 +23,7 @@ func (_ *AuthenticatedConnection) IsAuthenticated() bool {
 // ConnectWithAuthentication is called by the client (i.e. the one establishing
 // connection with the server). Once a connect.Connection has been established
 // with the server and then authenticate their identity to the server.
-// accepts a marshalled Identity and contact.Contact object
+// accepts a marshalled TransmissionIdentity and contact.Contact object
 func (c *Cmix) ConnectWithAuthentication(e2eId int, recipientContact []byte) (*AuthenticatedConnection, error) {
 	cont, err := contact.Unmarshal(recipientContact)
 	if err != nil {
diff --git a/bindings/connect.go b/bindings/connect.go
index 85a905be7696960438fa8b8a44cde9b5b33a9f03..8be9e4881ec5f345fd7d80b932e22d8d693ae19f 100644
--- a/bindings/connect.go
+++ b/bindings/connect.go
@@ -31,7 +31,7 @@ func (c *Connection) GetId() int {
 // This function is to be used sender-side and will block until the
 // partner.Manager is confirmed.
 // recipientContact - marshalled contact.Contact object
-// myIdentity - marshalled Identity object
+// myIdentity - marshalled TransmissionIdentity object
 func (c *Cmix) Connect(e2eId int, recipientContact []byte) (
 	*Connection, error) {
 	cont, err := contact.Unmarshal(recipientContact)
diff --git a/bindings/contact.go b/bindings/contact.go
index 99a0101c6698c96a4abe231e1c80f956c74f47fa..9f808f66ae7059ee86b698dda93583a9a60a9cae 100644
--- a/bindings/contact.go
+++ b/bindings/contact.go
@@ -4,14 +4,13 @@ import (
 	"encoding/json"
 	"gitlab.com/elixxir/client/xxdk"
 	"gitlab.com/elixxir/crypto/contact"
-	"gitlab.com/elixxir/crypto/cyclic"
 	"gitlab.com/elixxir/primitives/fact"
 	"gitlab.com/xx_network/crypto/signature/rsa"
 	"gitlab.com/xx_network/primitives/id"
 )
 
-// Identity struct
-// Example marshalled Identity:
+// TransmissionIdentity struct
+// Example marshalled TransmissionIdentity:
 // {"ID":"emV6aW1hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD",  // User ID (base64)
 //  // RSA Private key (PEM format)
 //  "RSAPrivatePem":"LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcFFJQkFBS0NBUUVBNU15dTdhYjBJOS9UL1BFUUxtd2x3ejZHV3FjMUNYemVIVXhoVEc4bmg1WWRWSXMxCmJ2THpBVjNOMDJxdXN6K2s4TVFEWjBtejMzdkswUmhPczZIY0NUSFdzTEpXRkE5WWpzWWlCRi9qTDd1bmd1ckIKL2tvK1JJSnNrWGFWaEZaazRGdERoRXhTNWY4RnR0Qmk1NmNLZmdJQlVKT3ozZi9qQllTMkxzMlJ6cWV5YXM3SApjV2RaME9TclBTT3BiYlViU1FPbS9LWnlweGZHU21yZ2oxRUZuU1dZZ2xGZTdUOTRPbHF5MG14QTV5clVXbHorCk9sK3hHbXpCNUp4WUFSMU9oMFQrQTk4RWMrTUZHNm43L1MraDdzRDgybGRnVnJmbStFTzRCdmFKeTRESGZGMWgKNnp6QnVnY25NUVFGc0dLeDFYWC9COTVMdUpPVjdyeXlDbzZGbHdJREFRQUJBb0lCQVFDaUh6OGNlcDZvQk9RTAphUzBVRitHeU5VMnlVcVRNTWtTWThoUkh1c09CMmFheXoybHZVb3RLUHBPbjZRSWRWVTJrcE4vY2dtY0lSb2x5CkhBMDRUOHJBWVNaRlVqaVlRajkzKzRFREpJYXd2Z0YyVEs1bFoyb3oxVTdreStncU82V0RMR2Z0Q0wvODVQWEIKa210aXhnUXpRV3g1RWcvemtHdm03eURBalQxeDloNytsRjJwNFlBam5kT2xTS0dmQjFZeTR1RXBQd0kwc1lWdgpKQWc0MEFxbllZUmt4emJPbmQxWGNjdEJFN2Z1VDdrWXhoeSs3WXYrUTJwVy9BYmh6NGlHOEY1MW9GMGZwV0czCmlISDhsVXZFTkp2SUZEVHZ0UEpESlFZalBRN3lUbGlGZUdrMXZUQkcyQkpQNExzVzhpbDZOeUFuRktaY1hOQ24KeHVCendiSlJBb0dCQVBUK0dGTVJGRHRHZVl6NmwzZmg3UjJ0MlhrMysvUmpvR3BDUWREWDhYNERqR1pVd1RGVQpOS2tQTTNjS29ia2RBYlBDb3FpL0tOOVBibk9QVlZ3R3JkSE9vSnNibFVHYmJGamFTUzJQMFZnNUVhTC9rT2dUCmxMMUdoVFpIUWk1VUlMM0p4M1Z3T0ZRQ3RQOU1UQlQ0UEQvcEFLbDg3VTJXN3JTY1dGV1ZGbFNkQW9HQkFPOFUKVmhHWkRpVGFKTWVtSGZIdVYrNmtzaUlsam9aUVVzeGpmTGNMZ2NjV2RmTHBqS0ZWTzJNN3NqcEJEZ0w4NmFnegorVk14ZkQzZ1l0SmNWN01aMVcwNlZ6TlNVTHh3a1dRY1hXUWdDaXc5elpyYlhCUmZRNUVjMFBlblVoWWVwVzF5CkpkTC8rSlpQeDJxSzVrQytiWU5EdmxlNWdpcjlDSGVzTlR5enVyckRBb0dCQUl0cTJnN1RaazhCSVFUUVNrZ24Kb3BkRUtzRW4wZExXcXlBdENtVTlyaWpHL2l2eHlXczMveXZDQWNpWm5VVEp0QUZISHVlbXVTeXplQ2g5QmRkegoyWkRPNUdqQVBxVHlQS3NudFlNZkY4UDczZ1NES1VSWWVFbHFDejdET0c5QzRzcitPK3FoN1B3cCtqUmFoK1ZiCkNuWllNMDlBVDQ3YStJYUJmbWRkaXpLbEFvR0JBSmo1dkRDNmJIQnNISWlhNUNJL1RZaG5YWXUzMkVCYytQM0sKMHF3VThzOCtzZTNpUHBla2Y4RjVHd3RuUU4zc2tsMk1GQWFGYldmeVFZazBpUEVTb0p1cGJzNXA1enNNRkJ1bwpncUZrVnQ0RUZhRDJweTVwM2tQbDJsZjhlZXVwWkZScGE0WmRQdVIrMjZ4eWYrNEJhdlZJeld3NFNPL1V4Q3crCnhqbTNEczRkQW9HQWREL0VOa1BjU004c1BCM3JSWW9MQ2twcUV2U0MzbVZSbjNJd3c1WFAwcDRRVndhRmR1ckMKYUhtSE1EekNrNEUvb0haQVhFdGZ2S2tRaUI4MXVYM2c1aVo4amdYUVhXUHRteTVIcVVhcWJYUTlENkxWc3B0egpKL3R4SWJLMXp5c1o2bk9IY1VoUUwyVVF6SlBBRThZNDdjYzVzTThEN3kwZjJ0QURTQUZNMmN3PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQ==",
@@ -20,7 +19,7 @@ import (
 //  // DH Private key
 //  "DHKeyPrivate":"eyJWYWx1ZSI6NDU2MDgzOTEzMjA0OTIyODA5Njg2MDI3MzQ0MzM3OTA0MzAyODYwMjM2NDk2NDM5NDI4NTcxMTMwNDMzOTQwMzgyMTIyMjY4OTQzNTMyMjIyMzc1MTkzNTEzMjU4MjA4MDA0NTczMDY4MjEwNzg2NDI5NjA1MjA0OTA3MjI2ODI5OTc3NTczMDkxODY0NTY3NDExMDExNjQxNCwiRmluZ2VycHJpbnQiOjE2ODAxNTQxNTExMjMzMDk4MzYzfQ=="
 // }
-type Identity struct {
+type TransmissionIdentity struct {
 	ID            []byte
 	RSAPrivatePem []byte
 	Salt          []byte
@@ -38,7 +37,7 @@ func (c *Cmix) MakeIdentity() ([]byte, error) {
 		return nil, err
 	}
 	//create the identity object
-	I := Identity{
+	I := TransmissionIdentity{
 		ID:            ident.ID.Marshal(),
 		RSAPrivatePem: rsa.CreatePrivateKeyPem(ident.RSAPrivatePem),
 		Salt:          ident.Salt,
@@ -48,19 +47,19 @@ func (c *Cmix) MakeIdentity() ([]byte, error) {
 	return json.Marshal(&I)
 }
 
-// GetContactFromIdentity accepts a marshalled Identity object and returns a marshalled contact.Contact object
+// GetContactFromIdentity accepts a marshalled TransmissionIdentity object and returns a marshalled contact.Contact object
 func (c *Cmix) GetContactFromIdentity(identity []byte) ([]byte, error) {
-	uID, _, _, dhKey, err := c.unmarshalIdentity(identity)
+	unmarshalledIdentity, err := c.unmarshalIdentity(identity)
 	if err != nil {
 		return nil, err
 	}
 
 	grp := c.api.GetStorage().GetE2EGroup()
 
-	dhPub := grp.ExpG(dhKey, grp.NewInt(1))
+	dhPub := grp.ExpG(unmarshalledIdentity.DHKeyPrivate, grp.NewInt(1))
 
 	ct := contact.Contact{
-		ID:             uID,
+		ID:             unmarshalledIdentity.ID,
 		DhPubKey:       dhPub,
 		OwnershipProof: nil,
 		Facts:          nil,
@@ -69,31 +68,34 @@ func (c *Cmix) GetContactFromIdentity(identity []byte) ([]byte, error) {
 	return ct.Marshal(), nil
 }
 
-func (c *Cmix) unmarshalIdentity(marshaled []byte) (*id.ID, *rsa.PrivateKey, []byte,
-	*cyclic.Int, error) {
-	I := Identity{}
-	err := json.Unmarshal(marshaled, &I)
+func (c *Cmix) unmarshalIdentity(marshaled []byte) (*xxdk.TransmissionIdentity, error) {
+	newIdentity := &xxdk.TransmissionIdentity{}
+
+	// Unmarshal given identity into TransmissionIdentity object
+	givenIdentity := TransmissionIdentity{}
+	err := json.Unmarshal(marshaled, &givenIdentity)
 	if err != nil {
-		return nil, nil, nil, nil, err
+		return nil, err
 	}
 
-	uID, err := id.Unmarshal(I.ID)
+	newIdentity.ID, err = id.Unmarshal(givenIdentity.ID)
 	if err != nil {
-		return nil, nil, nil, nil, err
+		return nil, err
 	}
 
-	dhkey := c.api.GetStorage().GetE2EGroup().NewInt(1)
-	err = dhkey.UnmarshalJSON([]byte(I.DHKeyPrivate))
+	newIdentity.DHKeyPrivate = c.api.GetStorage().GetE2EGroup().NewInt(1)
+	err = newIdentity.DHKeyPrivate.UnmarshalJSON(givenIdentity.DHKeyPrivate)
 	if err != nil {
-		return nil, nil, nil, nil, err
+		return nil, err
 	}
 
-	rsaPriv, err := rsa.LoadPrivateKeyFromPem([]byte(I.RSAPrivatePem))
+	newIdentity.RSAPrivatePem, err = rsa.LoadPrivateKeyFromPem(givenIdentity.RSAPrivatePem)
 	if err != nil {
-		return nil, nil, nil, nil, err
+		return nil, err
 	}
 
-	return uID, rsaPriv, I.Salt, dhkey, nil
+	newIdentity.Salt = givenIdentity.Salt
+	return newIdentity, nil
 }
 
 // GetIDFromContact accepts a marshalled contact.Contact object & returns a marshalled id.ID object
diff --git a/bindings/contact_test.go b/bindings/contact_test.go
index adbf4d9c2a5d3c48e899ee5ba7f4123f44890034..97af0264f4bd9b76c9fe83017ff09477947b7a3d 100644
--- a/bindings/contact_test.go
+++ b/bindings/contact_test.go
@@ -22,14 +22,14 @@ func TestIdentity_JSON(t *testing.T) {
 	dhpkJson, _ := dhpk.MarshalJSON()
 	op := make([]byte, 64)
 	_, _ = rng.Read(op)
-	identity := Identity{
+	identity := TransmissionIdentity{
 		ID:            uid.Marshal(),
 		RSAPrivatePem: rsa.CreatePrivateKeyPem(pk),
 		Salt:          salt,
 		DHKeyPrivate:  dhpkJson,
 	}
 	im, _ := json.Marshal(identity)
-	t.Log("Marshalled Identity object")
+	t.Log("Marshalled TransmissionIdentity object")
 	t.Log(string(im))
 }
 
diff --git a/bindings/e2e.go b/bindings/e2e.go
index 95ca1960a50a90107d613cae49566681b0a3e1d3..1153f3b0cdd3b2f3c6b5770ce26af5e727ea936b 100644
--- a/bindings/e2e.go
+++ b/bindings/e2e.go
@@ -21,3 +21,30 @@ type E2e struct {
 	api *xxdk.E2e
 	id  int
 }
+
+// Login creates and returns a new E2e object
+// and adds it to the e2eTrackerSingleton
+// identity can be left nil such that a new
+// TransmissionIdentity will be created automatically
+func (e *E2e) Login(cmixId int, identity []byte) (*E2e, error) {
+	cmix, err := cmixTrackerSingleton.get(cmixId)
+	if err != nil {
+		return nil, err
+	}
+
+	newIdentity := &xxdk.TransmissionIdentity{}
+	if identity == nil {
+		newIdentity = nil
+	} else {
+		newIdentity, err = cmix.unmarshalIdentity(identity)
+		if err != nil {
+			return nil, err
+		}
+	}
+
+	newE2e, err := xxdk.Login(cmix.api, nil, newIdentity)
+	if err != nil {
+		return nil, err
+	}
+	return e2eTrackerSingleton.make(newE2e), nil
+}
diff --git a/xxdk/cmix.go b/xxdk/cmix.go
index 84c1d08201e9d8eb71336eb8222a0bd3275e3e6a..b467bda2fdabd8be7c48bc311eb064d2de58795c 100644
--- a/xxdk/cmix.go
+++ b/xxdk/cmix.go
@@ -16,7 +16,6 @@ import (
 
 	"github.com/pkg/errors"
 	jww "github.com/spf13/jwalterweatherman"
-	"gitlab.com/elixxir/client/auth"
 	"gitlab.com/elixxir/client/cmix"
 	"gitlab.com/elixxir/client/event"
 	"gitlab.com/elixxir/client/interfaces"
@@ -268,8 +267,7 @@ func LoadCmix(storageDir string, password []byte, parameters Params) (*Cmix, err
 // while replacing the base NDF.  This is designed for some specific deployment
 // procedures and is generally unsafe.
 func LoginWithNewBaseNDF_UNSAFE(storageDir string, password []byte,
-	newBaseNdf string, authCallbacks auth.Callbacks,
-	params Params) (*Cmix, error) {
+	newBaseNdf string, params Params) (*Cmix, error) {
 	jww.INFO.Printf("LoginWithNewBaseNDF_UNSAFE()")
 
 	def, err := ParseNDF(newBaseNdf)
diff --git a/xxdk/e2e.go b/xxdk/e2e.go
index efe2a01d9465638351017a2ad49b4db94d3e8d9a..57fc30cd74235cb0c777b72dcf8e01c1dfd3dbbc 100644
--- a/xxdk/e2e.go
+++ b/xxdk/e2e.go
@@ -24,6 +24,8 @@ import (
 	"gitlab.com/xx_network/primitives/id"
 )
 
+// E2e object bundles a TransmissionIdentity with a Cmix
+// and can be used for high level operations such as connections
 type E2e struct {
 	*Cmix
 	auth        auth.State