diff --git a/Sources/XXMessengerClient/Messenger/Functors/MessengerStart.swift b/Sources/XXMessengerClient/Messenger/Functors/MessengerStart.swift
new file mode 100644
index 0000000000000000000000000000000000000000..224702b7a146047af046569ed8a98e5aab99ff6c
--- /dev/null
+++ b/Sources/XXMessengerClient/Messenger/Functors/MessengerStart.swift
@@ -0,0 +1,36 @@
+import XXClient
+import XCTestDynamicOverlay
+
+public struct MessengerStart {
+  public enum Error: Swift.Error {
+    case notLoaded
+  }
+
+  public var run: (Int) throws -> Void
+
+  public func callAsFunction(
+    timeoutMS: Int = 30_000
+  ) throws {
+    try run(timeoutMS)
+  }
+}
+
+extension MessengerStart {
+  public static func live(_ env: MessengerEnvironment) -> MessengerStart {
+    MessengerStart { timeoutMS in
+      guard let cMix = env.ctx.getCMix() else {
+        throw Error.notLoaded
+      }
+      guard cMix.networkFollowerStatus() != .running else {
+        return
+      }
+      try cMix.startNetworkFollower(timeoutMS: timeoutMS)
+    }
+  }
+}
+
+extension MessengerStart {
+  public static let unimplemented = MessengerStart(
+    run: XCTUnimplemented("\(Self.self)")
+  )
+}
diff --git a/Sources/XXMessengerClient/Messenger/Messenger.swift b/Sources/XXMessengerClient/Messenger/Messenger.swift
index 12610bd6feae71b482627b9f617c4b51aa97e6e5..5526c59c243900c600a4686b1edc10214a5fe213 100644
--- a/Sources/XXMessengerClient/Messenger/Messenger.swift
+++ b/Sources/XXMessengerClient/Messenger/Messenger.swift
@@ -8,6 +8,7 @@ public struct Messenger {
   public var create: MessengerCreate
   public var isLoaded: MessengerIsLoaded
   public var load: MessengerLoad
+  public var start: MessengerStart
   public var isConnected: MessengerIsConnected
   public var connect: MessengerConnect
   public var isRegistered: MessengerIsRegistered
@@ -26,6 +27,7 @@ extension Messenger {
       create: .live(env),
       isLoaded: .live(env),
       load: .live(env),
+      start: .live(env),
       isConnected: .live(env),
       connect: .live(env),
       isRegistered: .live(env),
@@ -45,6 +47,7 @@ extension Messenger {
     create: .unimplemented,
     isLoaded: .unimplemented,
     load: .unimplemented,
+    start: .unimplemented,
     isConnected: .unimplemented,
     connect: .unimplemented,
     isRegistered: .unimplemented,
diff --git a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerStartTests.swift b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerStartTests.swift
new file mode 100644
index 0000000000000000000000000000000000000000..1b0f11b48e14695867577c1bd095cb0dd504883b
--- /dev/null
+++ b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerStartTests.swift
@@ -0,0 +1,68 @@
+import CustomDump
+import XCTest
+import XXClient
+@testable import XXMessengerClient
+
+final class MessengerStartTests: XCTestCase {
+  func testStart() throws {
+    var didStartNetworkFollower: [Int] = []
+
+    var env: MessengerEnvironment = .unimplemented
+    env.ctx.getCMix = {
+      var cMix: CMix = .unimplemented
+      cMix.networkFollowerStatus.run = { .stopped }
+      cMix.startNetworkFollower.run = { timeoutMS in
+        didStartNetworkFollower.append(timeoutMS)
+      }
+      return cMix
+    }
+    let start: MessengerStart = .live(env)
+
+    try start(timeoutMS: 123)
+
+    XCTAssertNoDifference(didStartNetworkFollower, [123])
+  }
+
+  func testStartWhenNotLoaded() {
+    var env: MessengerEnvironment = .unimplemented
+    env.ctx.getCMix = { nil }
+    let start: MessengerStart = .live(env)
+
+    XCTAssertThrowsError(try start()) { error in
+      XCTAssertEqual(
+        error as? MessengerStart.Error,
+        MessengerStart.Error.notLoaded
+      )
+    }
+  }
+
+  func testStartWhenRunning() throws {
+    var env: MessengerEnvironment = .unimplemented
+    env.ctx.getCMix = {
+      var cMix: CMix = .unimplemented
+      cMix.networkFollowerStatus.run = { .running }
+      return cMix
+    }
+    let start: MessengerStart = .live(env)
+
+    try start()
+  }
+
+  func testStartNetworkFollowerFailure() {
+    struct Error: Swift.Error, Equatable {}
+    let error = Error()
+
+    var env: MessengerEnvironment = .unimplemented
+    env.ctx.getCMix = {
+      var cMix: CMix = .unimplemented
+      cMix.networkFollowerStatus.run = { .stopped }
+      cMix.startNetworkFollower.run = { _ in throw error }
+      return cMix
+    }
+    let start: MessengerStart = .live(env)
+
+    XCTAssertThrowsError(try start()) { err in
+      XCTAssertEqual(err as? Error, error)
+    }
+  }
+}