diff --git a/Sources/ElixxirDAppsSDK/E2E/E2E.swift b/Sources/ElixxirDAppsSDK/E2E/E2E.swift
index e127fdace0d45e8dd1ccf2a61046b37f0af4bd9b..710de98e414642b0638105e5520be63303ba3a36 100644
--- a/Sources/ElixxirDAppsSDK/E2E/E2E.swift
+++ b/Sources/ElixxirDAppsSDK/E2E/E2E.swift
@@ -22,6 +22,7 @@ public struct E2E {
   public var confirmReceivedRequest: E2EConfirmReceivedRequest
   public var replayConfirmReceivedRequest: E2EReplayConfirmReceivedRequest
   public var send: E2ESend
+  public var registerListener: E2ERegisterListener
 }
 
 extension E2E {
@@ -47,7 +48,8 @@ extension E2E {
       verifyOwnership: .live(bindingsE2E),
       confirmReceivedRequest: .live(bindingsE2E),
       replayConfirmReceivedRequest: .live(bindingsE2E),
-      send: .live(bindingsE2E)
+      send: .live(bindingsE2E),
+      registerListener: .live(bindingsE2E)
     )
   }
 }
@@ -74,6 +76,7 @@ extension E2E {
     verifyOwnership: .unimplemented,
     confirmReceivedRequest: .unimplemented,
     replayConfirmReceivedRequest: .unimplemented,
-    send: .unimplemented
+    send: .unimplemented,
+    registerListener: .unimplemented
   )
 }
diff --git a/Sources/ElixxirDAppsSDK/E2E/Functors/E2ERegisterListener.swift b/Sources/ElixxirDAppsSDK/E2E/Functors/E2ERegisterListener.swift
new file mode 100644
index 0000000000000000000000000000000000000000..5163c559939214177f175d89449c055dd376a4a0
--- /dev/null
+++ b/Sources/ElixxirDAppsSDK/E2E/Functors/E2ERegisterListener.swift
@@ -0,0 +1,32 @@
+import Bindings
+import XCTestDynamicOverlay
+
+public struct E2ERegisterListener {
+  public var run: (Data, Int, Listener) throws -> Void
+
+  public func callAsFunction(
+    senderId: Data,
+    messageType: Int,
+    callback: Listener
+  ) throws {
+    try run(senderId, messageType, callback)
+  }
+}
+
+extension E2ERegisterListener {
+  public static func live(_ bindingsE2E: BindingsE2e) -> E2ERegisterListener {
+    E2ERegisterListener { senderId, messageType, callback in
+      try bindingsE2E.registerListener(
+        senderId,
+        messageType: messageType,
+        newListener: callback.makeBindingsListener()
+      )
+    }
+  }
+}
+
+extension E2ERegisterListener {
+  public static let unimplemented = E2ERegisterListener(
+    run: XCTUnimplemented("\(Self.self)")
+  )
+}