diff --git a/api/client.go b/api/client.go
index 685e7dca25ac36403b4171826e3f6b91e1332854..a8e641a491dd0fd1438f920ecc08d5bf87c85650 100644
--- a/api/client.go
+++ b/api/client.go
@@ -290,7 +290,7 @@ func Login(storageDir string, password []byte,
 		return nil, err
 	}
 
-	u := c.GetUser()
+	u := c.userState.PortableUserInfo()
 	jww.INFO.Printf("Client Logged in: \n\tTransmisstionID: %s "+
 		"\n\tReceptionID: %s", u.TransmissionID, u.ReceptionID)
 
@@ -334,8 +334,10 @@ func Login(storageDir string, password []byte,
 		return nil, err
 	}
 
+	user := c.userState.PortableUserInfo()
+
 	c.e2e, err = e2e.Load(c.storage.GetKV(), c.network,
-		c.GetUser().ReceptionID, c.storage.GetE2EGroup(),
+		user.ReceptionID, c.storage.GetE2EGroup(),
 		c.rng, c.events)
 	if err != nil {
 		return nil, err
@@ -700,7 +702,12 @@ func (c *Client) AddService(sp Service) error {
 // can be serialized into a byte stream for out-of-band sharing.
 func (c *Client) GetUser() user.Info {
 	jww.INFO.Printf("GetUser()")
-	return c.userState.PortableUserInfo()
+	cMixUser := c.userState.PortableUserInfo()
+	// Add e2e dh keys
+	e2e := c.GetE2EHandler()
+	cMixUser.E2eDhPrivateKey = e2e.GetHistoricalDHPrivkey().DeepCopy()
+	cMixUser.E2eDhPublicKey = e2e.GetHistoricalDHPubkey().DeepCopy()
+	return cMixUser
 }
 
 // GetComms returns the client comms object
diff --git a/cmd/utils.go b/cmd/utils.go
index 16bf5ea68e8c3081969bafae9c7ca00c70bf5c30..db747ab014d26429ab0e043fed3ccd31ed69704b 100644
--- a/cmd/utils.go
+++ b/cmd/utils.go
@@ -82,6 +82,7 @@ func writeContact(c contact.Contact) {
 	if outfilePath == "" {
 		return
 	}
+	jww.INFO.Printf("PubKey WRITE: %s", c.DhPubKey.Text(10))
 	err := ioutil.WriteFile(outfilePath, c.Marshal(), 0644)
 	if err != nil {
 		jww.FATAL.Panicf("%+v", err)
@@ -102,5 +103,6 @@ func readContact() contact.Contact {
 	if err != nil {
 		jww.FATAL.Panicf("Failed to unmarshal contact: %+v", err)
 	}
+	jww.INFO.Printf("PubKey READ: %s", c.DhPubKey.Text(10))
 	return c
 }
diff --git a/e2e/ratchet/storage.go b/e2e/ratchet/storage.go
index cd285816f3fb055ac6d2fe3d98b13402bf73e62a..146a51752419746c070eda7fd640e734899f3d79 100644
--- a/e2e/ratchet/storage.go
+++ b/e2e/ratchet/storage.go
@@ -27,11 +27,25 @@ func Load(kv *versioned.KV, myID *id.ID, grp *cyclic.Group,
 	*Ratchet, error) {
 	kv = kv.Prefix(packagePrefix)
 
+	privKey, err := util.LoadCyclicKey(kv, privKeyKey)
+	if err != nil {
+		return nil, errors.WithMessage(err,
+			"Failed to load e2e DH private key")
+	}
+
+	pubKey, err := util.LoadCyclicKey(kv, pubKeyKey)
+	if err != nil {
+		return nil, errors.WithMessage(err,
+			"Failed to load e2e DH public key")
+	}
+
 	r := &Ratchet{
 		managers: make(map[id.ID]partner.Manager),
 		services: make(map[string]message.Processor),
 
-		myID: myID,
+		myID:                   myID,
+		advertisedDHPrivateKey: privKey,
+		advertisedDHPublicKey:  pubKey,
 
 		kv: kv,
 
@@ -92,6 +106,15 @@ func (r *Ratchet) marshal() ([]byte, error) {
 		index++
 	}
 
+	err := util.StoreCyclicKey(r.kv, r.advertisedDHPrivateKey, privKeyKey)
+	if err != nil {
+		return nil, err
+	}
+	err = util.StoreCyclicKey(r.kv, r.advertisedDHPublicKey, pubKeyKey)
+	if err != nil {
+		return nil, err
+	}
+
 	return json.Marshal(&contacts)
 }