diff --git a/cmd/connect.go b/cmd/connect.go
index 478af0988a67202ef3af7f5f8df86eb241e142ed..badb69b3afe8fe2a9958d3397dfb3dfb796cf07d 100644
--- a/cmd/connect.go
+++ b/cmd/connect.go
@@ -308,8 +308,16 @@ func insecureConnServer(forceLegacy bool, statePass []byte, statePath, regCode s
 func secureConnClient(forceLegacy bool, statePass []byte, statePath, regCode string,
 	cmixParams xxdk.CMIXParams, e2eParams xxdk.E2EParams) {
 	// Load client ------------------------------------------------------------------
-	messenger := loadOrInitMessenger(forceLegacy, statePass, statePath, regCode,
-		cmixParams, e2eParams, xxdk.DefaultAuthCallbacks{})
+	var messenger *xxdk.E2e
+	if viper.GetBool(connectionEphemeralFlag) {
+		fmt.Println("Loading ephemerally")
+		messenger = loadOrInitMessengerEphemeral(forceLegacy, statePass, statePath, regCode,
+			cmixParams, e2eParams, xxdk.DefaultAuthCallbacks{})
+	} else {
+		fmt.Println("Loading non-ephemerally")
+		messenger = loadOrInitMessenger(forceLegacy, statePass, statePath, regCode,
+			cmixParams, e2eParams, xxdk.DefaultAuthCallbacks{})
+	}
 
 	// Start network threads---------------------------------------------------------
 
@@ -374,8 +382,16 @@ func insecureConnClient(forceLegacy bool, statePass []byte, statePath, regCode s
 	cmixParams xxdk.CMIXParams, e2eParams xxdk.E2EParams) {
 
 	// Load client ------------------------------------------------------------------
-	messenger := loadOrInitMessenger(forceLegacy, statePass, statePath, regCode,
-		cmixParams, e2eParams, xxdk.DefaultAuthCallbacks{})
+	var messenger *xxdk.E2e
+	if viper.GetBool(connectionEphemeralFlag) {
+		fmt.Println("Loading ephemerally")
+		messenger = loadOrInitMessengerEphemeral(forceLegacy, statePass, statePath, regCode,
+			cmixParams, e2eParams, xxdk.DefaultAuthCallbacks{})
+	} else {
+		fmt.Println("Loading non-ephemerally")
+		messenger = loadOrInitMessenger(forceLegacy, statePass, statePath, regCode,
+			cmixParams, e2eParams, xxdk.DefaultAuthCallbacks{})
+	}
 
 	// Start network threads---------------------------------------------------------
 
@@ -554,5 +570,12 @@ func init() {
 			" will call the applicable authenticated counterpart")
 	bindFlagHelper(connectionAuthenticatedFlag, connectionCmd)
 
+	connectionCmd.Flags().Bool(connectionEphemeralFlag, false,
+		"This flag is available to both server and client. "+
+			"This flag operates as a switch determining the initialization path."+
+			"If present, the messenger will be initialized ephemerally. Without this flag, "+
+			"the messenger will be initialized as stateful.")
+	bindFlagHelper(connectionEphemeralFlag, connectionCmd)
+
 	rootCmd.AddCommand(connectionCmd)
 }
diff --git a/cmd/flags.go b/cmd/flags.go
index 32ce750fae4f6efe97a546b60b24f7633063a52e..5244b7a12b62ee1e1c7d5a718f45b2bbccfad005 100644
--- a/cmd/flags.go
+++ b/cmd/flags.go
@@ -100,6 +100,7 @@ const (
 	connectionServerTimeoutFlag = "serverTimeout"
 	connectionDisconnectFlag    = "disconnect"
 	connectionAuthenticatedFlag = "authenticated"
+	connectionEphemeralFlag     = "ephemeral"
 
 	///////////////// File Transfer subcommand flags //////////////////////////
 	fileSendFlag          = "sendFile"
diff --git a/cmd/init.go b/cmd/init.go
index 58995ef081ec4a6ff051210fbebaee9b36b3d19d..ca1fadbd2153d194d5d3aa2665b95d6b0753b864 100644
--- a/cmd/init.go
+++ b/cmd/init.go
@@ -123,6 +123,57 @@ func loadOrInitMessenger(forceLegacy bool, password []byte, storeDir, regCode st
 	return messenger
 }
 
+// loadOrInitMessengerEphemeral will build a new ephemeral xxdk.E2e.
+func loadOrInitMessengerEphemeral(forceLegacy bool, password []byte, storeDir, regCode string,
+	cmixParams xxdk.CMIXParams, e2eParams xxdk.E2EParams, cbs xxdk.AuthCallbacks) *xxdk.E2e {
+	jww.INFO.Printf("Using normal sender")
+
+	// create a new client if none exist
+	if _, err := os.Stat(storeDir); errors.Is(err, fs.ErrNotExist) {
+		// Initialize from scratch
+		ndfJson, err := ioutil.ReadFile(viper.GetString("ndf"))
+		if err != nil {
+			jww.FATAL.Panicf("%+v", err)
+		}
+
+		err = xxdk.NewCmix(string(ndfJson), storeDir, password, regCode)
+		if err != nil {
+			jww.FATAL.Panicf("%+v", err)
+		}
+	}
+
+	// Initialize from storage
+	net, err := xxdk.LoadCmix(storeDir, password, cmixParams)
+	if err != nil {
+		jww.FATAL.Panicf("%+v", err)
+	}
+
+	// Load or initialize xxdk.ReceptionIdentity storage
+	identity, err := xxdk.LoadReceptionIdentity(identityStorageKey, net)
+	if err != nil {
+		if forceLegacy {
+			jww.INFO.Printf("Forcing legacy sender")
+			identity, err = xxdk.MakeLegacyReceptionIdentity(net)
+		} else {
+			identity, err = xxdk.MakeReceptionIdentity(net)
+		}
+		if err != nil {
+			jww.FATAL.Panicf("%+v", err)
+		}
+
+		err = xxdk.StoreReceptionIdentity(identityStorageKey, identity, net)
+		if err != nil {
+			jww.FATAL.Panicf("%+v", err)
+		}
+	}
+
+	messenger, err := xxdk.LoginEphemeral(net, cbs, identity, e2eParams)
+	if err != nil {
+		jww.FATAL.Panicf("%+v", err)
+	}
+	return messenger
+}
+
 // loadOrInitNet will build a new xxdk.Cmix from existing storage
 // or from a new storage that it will create if none already exists
 func loadOrInitNet(password []byte, storeDir, regCode string,