diff --git a/bindings/fileTransfer.go b/bindings/fileTransfer.go
index cce492165115b0981cec066a8033ad2016a06abc..4176ae716a51d05fd8969cc7ed8be48866ffa525 100644
--- a/bindings/fileTransfer.go
+++ b/bindings/fileTransfer.go
@@ -2,8 +2,9 @@ package bindings
 
 import (
 	"encoding/json"
+	jww "github.com/spf13/jwalterweatherman"
+	"gitlab.com/elixxir/client/catalog"
 	"gitlab.com/elixxir/client/e2e"
-	"gitlab.com/elixxir/client/e2e/rekey"
 	"gitlab.com/elixxir/client/fileTransfer"
 	ftCrypto "gitlab.com/elixxir/crypto/fileTransfer"
 	"gitlab.com/xx_network/primitives/id"
@@ -14,7 +15,8 @@ import (
 
 // FileTransfer object is a bindings-layer struct which wraps a fileTransfer.FileTransfer interface
 type FileTransfer struct {
-	ft fileTransfer.FileTransfer
+	ft    fileTransfer.FileTransfer
+	e2eCl *E2e
 }
 
 // ReceivedFile is a public struct which represents the contents of an incoming file
@@ -86,51 +88,48 @@ type FileTransferReceiveProgressCallback interface {
 
 // InitFileTransfer creates a bindings-level File Transfer manager
 // Accepts client ID, ReceiveFileCallback and a ReporterFunc
-func InitFileTransfer(clientID int, cb ReceiveFileCallback, r ReporterFunc) (*FileTransfer, error) {
+func InitFileTransfer(clientID, e2eID int, cb ReceiveFileCallback) (*FileTransfer, error) {
 	// Get bindings client from singleton
-	c, err := clientTrackerSingleton.get(clientID)
+	//c, err := cmixTrackerSingleton.get(clientID)
+	//if err != nil {
+	//	return nil, err
+	//}
+	e2eCl, err := e2eTrackerSingleton.get(e2eID)
 	if err != nil {
 		return nil, err
 	}
 
 	// Create the callback to wrap the ReceiveFileCallback
-	rcb := func(tid *ftCrypto.TransferID, fileName, fileType string,
-		sender *id.ID, size uint32, preview []byte) {
-		f := &ReceivedFile{
-			TransferID: tid.Bytes(),
-			SenderID:   sender.Marshal(),
-			Preview:    preview,
-			Name:       fileName,
-			Type:       fileType,
-			Size:       size,
-		}
-		cb.Callback(json.Marshal(f))
-	}
+	//rcb := func(tid *ftCrypto.TransferID, fileName, fileType string,
+	//	sender *id.ID, size uint32, preview []byte) {
+	//	f := &ReceivedFile{
+	//		TransferID: tid.Bytes(),
+	//		SenderID:   sender.Marshal(),
+	//		Preview:    preview,
+	//		Name:       fileName,
+	//		Type:       fileType,
+	//		Size:       size,
+	//	}
+	//	cb.Callback(json.Marshal(f))
+	//}
 
 	// Client info
-	myID := c.api.GetUser().TransmissionID
-	kv := c.api.GetStorage().GetKV()
-	e2eGrp := c.api.GetStorage().GetE2EGroup()
-	rng := c.api.GetRng()
-
-	// Create e2e manager (should this have a singleton?)
-	err = e2e.Init(kv, myID, c.api.GetUser().E2eDhPrivateKey, e2eGrp, rekey.GetDefaultParams())
-	e2eManager, err := e2e.Load(kv, c.api.GetCmix(), myID, e2eGrp, rng, &reporter{
-		r: r,
-	})
+	e2eCl.api.GetTransmissionIdentity()
+	myID := e2eCl.api.GetTransmissionIdentity().ID
+	rng := e2eCl.api.GetRng()
 
 	// Create file transfer manager
-	m, err := fileTransfer.NewManager(rcb, fileTransfer.DefaultParams(), myID,
-		c.api.GetCmix(), e2eManager, kv, rng)
+	m, err := fileTransfer.NewManager(fileTransfer.DefaultParams(), myID,
+		e2eCl.api.GetCmix(), e2eCl.api.GetStorage(), rng)
 
 	// Add file transfer processes to client services tracking
-	err = c.api.AddService(m.StartProcesses)
+	err = e2eCl.api.AddService(m.StartProcesses)
 	if err != nil {
 		return nil, err
 	}
 
 	// Return wrapped manager
-	return &FileTransfer{ft: m}, nil
+	return &FileTransfer{ft: m, e2eCl: e2eCl}, nil
 }
 
 // Send is the bindings-level function for sending a File
@@ -147,7 +146,7 @@ func (f *FileTransfer) Send(payload, recipientID []byte, retry float32,
 
 	// Wrap transfer progress callback to be passed to fileTransfer layer
 	cb := func(completed bool, arrived, total uint16,
-		t fileTransfer.FilePartTracker, err error) {
+		st fileTransfer.SentTransfer, t fileTransfer.FilePartTracker, err error) {
 		prog := &Progress{
 			Completed:   completed,
 			Transmitted: arrived,
@@ -165,8 +164,21 @@ func (f *FileTransfer) Send(payload, recipientID []byte, retry float32,
 		return nil, err
 	}
 
+	sendNew := func(transferInfo []byte) error {
+		params, err := e2e.GetDefaultParams().MarshalJSON()
+		if err != nil {
+			return err
+		}
+		resp, err := f.e2eCl.SendE2E(int(catalog.NewFileTransfer), recipientID, transferInfo, params)
+		if err != nil {
+			return err
+		}
+		jww.INFO.Printf("New file transfer message sent: %s", resp)
+		return nil
+	}
+
 	// Send file
-	ftID, err := f.ft.Send(fs.Name, fs.Type, fs.Contents, recipient, retry, fs.Preview, cb, p)
+	ftID, err := f.ft.Send(recipient, fs.Name, fs.Type, fs.Contents, retry, fs.Preview, cb, p, sendNew)
 	if err != nil {
 		return nil, err
 	}
@@ -203,7 +215,7 @@ func (f *FileTransfer) CloseSend(tidBytes []byte) error {
 func (f *FileTransfer) RegisterSentProgressCallback(tidBytes []byte,
 	callback FileTransferSentProgressCallback, period string) error {
 	cb := func(completed bool, arrived, total uint16,
-		t fileTransfer.FilePartTracker, err error) {
+		st fileTransfer.SentTransfer, t fileTransfer.FilePartTracker, err error) {
 		prog := &Progress{
 			Completed:   completed,
 			Transmitted: arrived,
@@ -224,7 +236,7 @@ func (f *FileTransfer) RegisterSentProgressCallback(tidBytes []byte,
 
 func (f *FileTransfer) RegisterReceivedProgressCallback(tidBytes []byte, callback FileTransferReceiveProgressCallback, period string) error {
 	cb := func(completed bool, received, total uint16,
-		t fileTransfer.FilePartTracker, err error) {
+		rt fileTransfer.ReceivedTransfer, t fileTransfer.FilePartTracker, err error) {
 		prog := &Progress{
 			Completed:   completed,
 			Transmitted: received,
@@ -275,12 +287,12 @@ type FilePartTracker struct {
 // 1 = sent (sender has sent a part, but it has not arrived)
 // 2 = arrived (sender has sent a part, and it has arrived)
 // 3 = received (receiver has received a part)
-func (fpt *FilePartTracker) GetPartStatus(partNum int) int {
+func (fpt FilePartTracker) GetPartStatus(partNum int) int {
 	return int(fpt.m.GetPartStatus(uint16(partNum)))
 }
 
 // GetNumParts returns the total number of file parts in the transfer.
-func (fpt *FilePartTracker) GetNumParts() int {
+func (fpt FilePartTracker) GetNumParts() int {
 	return int(fpt.m.GetNumParts())
 }
 
diff --git a/bindings/restlike.go b/bindings/restlike.go
index a29db0147e4129d2c010208196c3bf03911ff385..f7b092bb16876fd8c07e0f9a9ff94e648fbc873c 100644
--- a/bindings/restlike.go
+++ b/bindings/restlike.go
@@ -34,7 +34,7 @@ type RestlikeMessage struct {
 // request - marshalled RestlikeMessage
 // Returns marshalled result RestlikeMessage
 func RestlikeRequest(clientID, connectionID int, request []byte) ([]byte, error) {
-	cl, err := clientTrackerSingleton.get(clientID)
+	cl, err := cmixTrackerSingleton.get(clientID)
 	if err != nil {
 		return nil, err
 	}