diff --git a/app/src/main/java/org/futo/circles/feature/log_in/LoginDataSource.kt b/app/src/main/java/org/futo/circles/feature/log_in/LoginDataSource.kt
index b9d246f33c778c5fe3539de67238246f1e4b61fa..36df8307639e7c708d3075469bec672af175f617 100644
--- a/app/src/main/java/org/futo/circles/feature/log_in/LoginDataSource.kt
+++ b/app/src/main/java/org/futo/circles/feature/log_in/LoginDataSource.kt
@@ -1,63 +1,29 @@
 package org.futo.circles.feature.log_in
 
-import android.content.Context
-import android.net.Uri
-import org.futo.circles.R
 import org.futo.circles.core.utils.HomeServerUtils
-import org.futo.circles.core.matrix.pass_phrase.restore.RestorePassPhraseDataSource
-import org.futo.circles.core.matrix.room.CoreSpacesTreeBuilder
-import org.futo.circles.extensions.Response
 import org.futo.circles.extensions.createResult
+import org.futo.circles.feature.log_in.stages.LoginStagesDataSource
 import org.futo.circles.provider.MatrixInstanceProvider
-import org.futo.circles.provider.MatrixSessionProvider
-import org.matrix.android.sdk.api.auth.data.HomeServerConnectionConfig
-import org.matrix.android.sdk.api.session.Session
 
 class LoginDataSource(
-    private val context: Context,
-    private val restorePassPhraseDataSource: RestorePassPhraseDataSource,
-    private val coreSpacesTreeBuilder: CoreSpacesTreeBuilder
+    private val loginStagesDataSource: LoginStagesDataSource
 ) {
 
-    val passPhraseLoadingLiveData = restorePassPhraseDataSource.loadingLiveData
-
-    suspend fun logIn(name: String, password: String): Response<Session> = createResult {
-        val session = MatrixInstanceProvider.matrix.authenticationService().directAuthentication(
-            homeServerConnectionConfig = buildHomeServerConfig(name),
-            matrixId = name,
-            password = password,
-            initialDeviceName = context.getString(
-                R.string.initial_device_name,
-                context.getString(R.string.app_name)
-            )
+    private val authService by lazy { MatrixInstanceProvider.matrix.authenticationService() }
+
+    suspend fun startLogin(
+        name: String
+    ) = createResult {
+        val homeServerUrl = HomeServerUtils.getHomeServerUrlFromDomain(domain)
+        authService.cancelPendingLoginOrRegistration()
+        authService.getLoginFlow(buildHomeServerConfig(homeServerUrl))
+        signUpDataSource.startSignUpStages(
+            it.flowResult.missingStages,
+            name,
+            password,
+            homeServerUrl,
+            isSubscription,
+            subscriptionReceipt
         )
-        MatrixSessionProvider.awaitForSessionSync(session)
-    }
-
-    suspend fun restoreKeys(password: String) = createResult {
-        restorePassPhraseDataSource.restoreKeysWithPassPhase(password)
-    }
-
-    suspend fun getEncryptionAlgorithm(): String? {
-        val algorithmResult = createResult { restorePassPhraseDataSource.getEncryptionAlgorithm() }
-
-       return when(algorithmResult){
-            is Response.Error -> null
-            is Response.Success -> algorithmResult.data
-        }
-    }
-
-    suspend fun createSpacesTree() = createResult {
-        coreSpacesTreeBuilder.createCoreSpacesTree()
-    }
-
-    fun isCirclesTreeCreated() = coreSpacesTreeBuilder.isCirclesHierarchyCreated()
-
-    private fun buildHomeServerConfig(userName: String): HomeServerConnectionConfig {
-        val url = HomeServerUtils.getHomeServerUrlFromUserName(userName)
-        return HomeServerConnectionConfig
-            .Builder()
-            .withHomeServerUri(Uri.parse(url))
-            .build()
     }
 }
\ No newline at end of file