diff --git a/bindings/connect.go b/bindings/connect.go
index 3a8ee5dca8878c53abe3d39282ee38ae55bb665d..af5645d31bbbe30a0968e121d2ffdbc3a4032208 100644
--- a/bindings/connect.go
+++ b/bindings/connect.go
@@ -2,10 +2,10 @@ package bindings
 
 import (
 	"encoding/json"
+	jww "github.com/spf13/jwalterweatherman"
 	"gitlab.com/elixxir/client/catalog"
 	"gitlab.com/elixxir/client/connect"
 	e2e2 "gitlab.com/elixxir/client/e2e"
-	"gitlab.com/elixxir/client/e2e/ratchet/partner"
 	"gitlab.com/elixxir/client/e2e/receive"
 	"gitlab.com/elixxir/crypto/contact"
 )
@@ -84,13 +84,79 @@ func (c *Connection) GetPartner() []byte {
 	return c.connection.GetPartner().PartnerId().Marshal()
 }
 
-// RegisterListener is used for E2E reception
-// and allows for reading data sent from the partner.Manager
-func (c *Connection) RegisterListener(messageType int, newListener receive.Listener) receive.ListenerID {
+// Listener provides a callback to hear a message
+// An object implementing this interface can be called back when the client
+// gets a message of the type that the registerer specified at registration
+// time.
+type Listener interface {
+	// Hear is called to receive a message in the UI
+	Hear(item []byte)
+	// Returns a name, used for debugging
+	Name() string
+}
 
+//
+type listener struct {
+	l Listener
 }
 
-// Unregister listener for E2E reception
-func (c *Connection) Unregister(listenerID receive.ListenerID) {
+//
+type Message struct {
+	MessageType int
+	ID          []byte
+	Payload     []byte
+
+	Sender      []byte
+	RecipientID []byte
+	EphemeralID int64
+	Timestamp   int64 // Message timestamp of when the user sent
+
+	Encrypted bool
+	RoundId   int
+}
+
+// Hear is called to receive a message in the UI
+func (l listener) Hear(item receive.Message) {
+	m := Message{
+		MessageType: int(item.MessageType),
+		ID:          item.ID.Marshal(),
+		Payload:     item.Payload,
+		Sender:      item.Sender.Marshal(),
+		RecipientID: item.RecipientID.Marshal(),
+		EphemeralID: item.EphemeralID.Int64(),
+		Timestamp:   item.Timestamp.UnixNano(),
+		Encrypted:   item.Encrypted,
+		RoundId:     int(item.Round.ID),
+	}
+	result, err := json.Marshal(&m)
+	if err != nil {
+		jww.ERROR.Printf("Unable to marshal Message: %+v", err.Error())
+	}
+	l.l.Hear(result)
+}
 
+// Returns a name, used for debugging
+func (l listener) Name() string {
+	return l.l.Name()
+}
+
+//
+type ListenerID struct {
+	userID      []byte
+	messageType int
+}
+
+// RegisterListener is used for E2E reception
+// and allows for reading data sent from the partner.Manager
+func (c *Connection) RegisterListener(messageType int, newListener Listener) []byte {
+	listenerId := c.connection.RegisterListener(catalog.MessageType(messageType), listener{l: newListener})
+	newlistenerId := ListenerID{
+		userID:      listenerId.GetUserID().Marshal(),
+		messageType: int(listenerId.GetMessageType()),
+	}
+	result, err := json.Marshal(&newlistenerId)
+	if err != nil {
+		jww.ERROR.Printf("Unable to marshal listenerId: %+v", err.Error())
+	}
+	return result
 }