diff --git a/Sources/ElixxirDAppsSDK/E2E.swift b/Sources/ElixxirDAppsSDK/E2E.swift
index 38f9d8018437755dc1509193a41ec4153b826808..872b18895f3ae87daf235b328c66ca97e1f6a462 100644
--- a/Sources/ElixxirDAppsSDK/E2E.swift
+++ b/Sources/ElixxirDAppsSDK/E2E.swift
@@ -7,6 +7,7 @@ public struct E2E {
   public var payloadSize: E2EPayloadSize
   public var partitionSize: E2EPartitionSize
   public var addPartnerCallback: E2EAddPartnerCallback
+  public var addService: E2EAddService
 
   // TODO:
 }
@@ -19,7 +20,8 @@ extension E2E {
       getContact: .live(bindingsE2E: bindingsE2E),
       payloadSize: .live(bindingsE2E: bindingsE2E),
       partitionSize: .live(bindingsE2E: bindingsE2E),
-      addPartnerCallback: .live(bindingsE2E)
+      addPartnerCallback: .live(bindingsE2E),
+      addService: .live(bindingsE2E)
     )
   }
 }
@@ -31,6 +33,7 @@ extension E2E {
     getContact: .unimplemented,
     payloadSize: .unimplemented,
     partitionSize: .unimplemented,
-    addPartnerCallback: .unimplemented
+    addPartnerCallback: .unimplemented,
+    addService: .unimplemented
   )
 }
diff --git a/Sources/ElixxirDAppsSDK/E2EAddService.swift b/Sources/ElixxirDAppsSDK/E2EAddService.swift
new file mode 100644
index 0000000000000000000000000000000000000000..f4b57217b4da05192097e830c2e2ae37e32464b9
--- /dev/null
+++ b/Sources/ElixxirDAppsSDK/E2EAddService.swift
@@ -0,0 +1,29 @@
+import Bindings
+import XCTestDynamicOverlay
+
+public struct E2EAddService {
+  public var run: (ServiceProcessor) throws -> Void
+
+  public func callAsFunction(
+    processor: ServiceProcessor
+  ) throws {
+    try run(processor)
+  }
+}
+
+extension E2EAddService {
+  public static func live(_ bindingsE2E: BindingsE2e) -> E2EAddService {
+    E2EAddService { processor in
+      try bindingsE2E.addService(
+        processor.serviceTag,
+        processor: processor.makeBindingsProcessor()
+      )
+    }
+  }
+}
+
+extension E2EAddService {
+  public static let unimplemented = E2EAddService(
+    run: XCTUnimplemented("\(Self.self)")
+  )
+}