diff --git a/app/src/gplay/java/org/futo/circles/notifications/FirebaseMessagingService.kt b/app/src/gplay/java/org/futo/circles/notifications/FirebaseMessagingService.kt
index 8f40927987ceb638c044c63f13e165aa75b22c3f..f801b64e97c4c342527dc4d6aea9d1545f60bb1d 100644
--- a/app/src/gplay/java/org/futo/circles/notifications/FirebaseMessagingService.kt
+++ b/app/src/gplay/java/org/futo/circles/notifications/FirebaseMessagingService.kt
@@ -2,11 +2,11 @@ package org.futo.circles.notifications
 
 import com.google.firebase.messaging.FirebaseMessagingService
 import com.google.firebase.messaging.RemoteMessage
+import org.futo.circles.core.provider.MatrixSessionProvider
 import org.futo.circles.feature.notifications.FcmHelper
 import org.futo.circles.feature.notifications.PushHandler
 import org.futo.circles.feature.notifications.PushersManager
 import org.futo.circles.model.PushData
-import org.futo.circles.provider.MatrixSessionProvider
 import org.koin.android.ext.android.inject
 import org.matrix.android.sdk.api.MatrixPatterns
 import org.matrix.android.sdk.api.extensions.tryOrNull
diff --git a/app/src/gplay/java/org/futo/circles/notifications/GoogleFcmHelper.kt b/app/src/gplay/java/org/futo/circles/notifications/GoogleFcmHelper.kt
index 037d45e14769750aa78e20d283ed80e067f794da..780e1f3b1e2f256c2df274f1d02bf3fe1ff2f143 100755
--- a/app/src/gplay/java/org/futo/circles/notifications/GoogleFcmHelper.kt
+++ b/app/src/gplay/java/org/futo/circles/notifications/GoogleFcmHelper.kt
@@ -6,9 +6,9 @@ import com.google.android.gms.common.ConnectionResult
 import com.google.android.gms.common.GoogleApiAvailability
 import com.google.firebase.messaging.FirebaseMessaging
 import org.futo.circles.R
+import org.futo.circles.core.provider.PreferencesProvider
 import org.futo.circles.feature.notifications.FcmHelper
 import org.futo.circles.feature.notifications.PushersManager
-import org.futo.circles.provider.PreferencesProvider
 
 class GoogleFcmHelper(
     private val context: Context,
diff --git a/app/src/gplay/java/org/futo/circles/notifications/test/NotificationTestTokenRegistration.kt b/app/src/gplay/java/org/futo/circles/notifications/test/NotificationTestTokenRegistration.kt
index f000a35e5a1fb8fe0c75a7d0935b85aeb075dfb9..eca3544a2614ce0c254adcc9c398b069b3a59a34 100644
--- a/app/src/gplay/java/org/futo/circles/notifications/test/NotificationTestTokenRegistration.kt
+++ b/app/src/gplay/java/org/futo/circles/notifications/test/NotificationTestTokenRegistration.kt
@@ -2,10 +2,10 @@ package org.futo.circles.notifications.test
 
 import android.content.Context
 import org.futo.circles.R
+import org.futo.circles.core.provider.MatrixSessionProvider
 import org.futo.circles.feature.notifications.FcmHelper
 import org.futo.circles.feature.notifications.test.task.BaseNotificationTest
 import org.futo.circles.model.NotificationTestStatus
-import org.futo.circles.provider.MatrixSessionProvider
 import org.matrix.android.sdk.api.session.pushers.PusherState
 
 class NotificationTestTokenRegistration(
diff --git a/app/src/main/java/org/futo/circles/App.kt b/app/src/main/java/org/futo/circles/App.kt
index b7e49358545d7653724cbb3d0b2c9ed4d93fb836..40a7cbea970af8123195458cac2c09e4e7943432 100644
--- a/app/src/main/java/org/futo/circles/App.kt
+++ b/app/src/main/java/org/futo/circles/App.kt
@@ -6,10 +6,10 @@ import androidx.lifecycle.LifecycleOwner
 import androidx.lifecycle.ProcessLifecycleOwner
 import com.vanniktech.emoji.EmojiManager
 import com.vanniktech.emoji.google.GoogleEmojiProvider
+import org.futo.circles.core.provider.MatrixSessionProvider
 import org.futo.circles.di.applicationModules
 import org.futo.circles.feature.notifications.FcmHelper
 import org.futo.circles.feature.notifications.NotificationUtils
-import org.futo.circles.provider.MatrixSessionProvider
 import org.koin.android.ext.android.inject
 import org.koin.android.ext.koin.androidContext
 import org.koin.core.context.startKoin
diff --git a/app/src/main/java/org/futo/circles/MainActivity.kt b/app/src/main/java/org/futo/circles/MainActivity.kt
index a439dcd32523e87a7e70f2a8e8e8696c62e82e23..9c627c5181dcc33793432ca7de42c59b4eb5e046 100644
--- a/app/src/main/java/org/futo/circles/MainActivity.kt
+++ b/app/src/main/java/org/futo/circles/MainActivity.kt
@@ -9,8 +9,8 @@ import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.launch
 import org.futo.circles.core.BaseActivity
-import org.futo.circles.provider.MatrixSessionListenerProvider
-import org.futo.circles.provider.MatrixSessionProvider
+import org.futo.circles.core.provider.MatrixSessionListenerProvider
+import org.futo.circles.core.provider.MatrixSessionProvider
 
 
 class MainActivity : BaseActivity(R.layout.activity_main) {
diff --git a/app/src/main/java/org/futo/circles/core/Constants.kt b/app/src/main/java/org/futo/circles/core/Constants.kt
index 19767433b5da3ea0caa701ef493af83c8ba5ce92..5fcf8e587501109f82f30d276be9dbe1996d39d0 100644
--- a/app/src/main/java/org/futo/circles/core/Constants.kt
+++ b/app/src/main/java/org/futo/circles/core/Constants.kt
@@ -1,37 +1,17 @@
 package org.futo.circles.core
 
 import org.futo.circles.BuildConfig
-import org.futo.circles.provider.MatrixSessionProvider
+import org.futo.circles.core.provider.MatrixSessionProvider
 
 const val FILE_PROVIDER_AUTHORITY_EXTENSION = ".provider"
 
-const val REGISTRATION_TOKEN_TYPE = "m.login.registration_token"
-const val REGISTRATION_SUBSCRIPTION_TYPE = "org.futo.subscription.google_play"
-const val REGISTRATION_EMAIL_REQUEST_TOKEN_TYPE = "m.enroll.email.request_token"
-const val REGISTRATION_EMAIL_SUBMIT_TOKEN_TYPE = "m.enroll.email.submit_token"
-const val REGISTRATION_USERNAME_TYPE = "m.enroll.username"
-const val REGISTRATION_PASSWORD_TYPE = "m.enroll.password"
-const val REGISTRATION_BSSPEKE_OPRF_TYPE = "m.enroll.bsspeke-ecc.oprf"
-const val REGISTRATION_BSSPEKE_SAVE_TYPE = "m.enroll.bsspeke-ecc.save"
-
-const val LOGIN_PASSWORD_TYPE = "m.login.password"
-const val DIRECT_LOGIN_PASSWORD_TYPE = "m.login.password.direct"
-const val LOGIN_BSSPEKE_OPRF_TYPE = "m.login.bsspeke-ecc.oprf"
-const val LOGIN_BSSPEKE_VERIFY_TYPE = "m.login.bsspeke-ecc.verify"
-
 const val ROOM_BACKUP_EVENT_TYPE = "m.room.media_backup"
 const val ROOM_BACKUP_DATE_MODIFIED_EVENT_TYPE = "m.room.media_backup.date_modified"
 
-const val LOGIN_PASSWORD_USER_ID_TYPE = "m.id.user"
-
 const val DEFAULT_USER_PREFIX = "@notices:"
 
 const val SYSTEM_NOTICES_TAG = "m.server_notice"
 
-const val TYPE_PARAM_KEY = "type"
-
-const val CREATE_ROOM_DELAY = 1000L
-
 const val PUSHER_APP_ID = "${BuildConfig.APPLICATION_ID}.android"
 
 const val READ_ONLY_ROLE = -10
diff --git a/app/src/main/java/org/futo/circles/core/utils/UserUtils.kt b/app/src/main/java/org/futo/circles/core/utils/UserUtils.kt
index 69b19863f18f704b9f6e712a092983d351b4a4c9..f29ab0b617beaca490ab6df54c68d0cc714f4dfe 100644
--- a/app/src/main/java/org/futo/circles/core/utils/UserUtils.kt
+++ b/app/src/main/java/org/futo/circles/core/utils/UserUtils.kt
@@ -1,6 +1,6 @@
 package org.futo.circles.core.utils
 
-import org.futo.circles.provider.MatrixSessionProvider
+import org.futo.circles.core.provider.MatrixSessionProvider
 
 object UserUtils {
 
diff --git a/app/src/main/java/org/futo/circles/di/data_source/AuthDsModule.kt b/app/src/main/java/org/futo/circles/di/data_source/AuthDsModule.kt
index 7e7e63c8da2feaff4dd0e7dbc2d38f9ef678e4ed..ae30c0745f2c87034fe3d40d24d4d9fbe74e4712 100644
--- a/app/src/main/java/org/futo/circles/di/data_source/AuthDsModule.kt
+++ b/app/src/main/java/org/futo/circles/di/data_source/AuthDsModule.kt
@@ -1,24 +1,24 @@
 package org.futo.circles.di.data_source
 
-import org.futo.circles.core.matrix.auth.AuthConfirmationProvider
-import org.futo.circles.feature.log_in.LoginDataSource
-import org.futo.circles.feature.log_in.stages.LoginStagesDataSource
-import org.futo.circles.feature.log_in.stages.password.DirectLoginPasswordDataSource
-import org.futo.circles.feature.log_in.stages.password.LoginBsSpekeDataSource
-import org.futo.circles.feature.log_in.stages.password.LoginPasswordDataSource
-import org.futo.circles.feature.log_in.stages.terms.LoginAcceptTermsDataSource
-import org.futo.circles.feature.reauth.ReAuthStagesDataSource
-import org.futo.circles.feature.settings.active_sessions.CrossSigningDataSource
-import org.futo.circles.feature.sign_up.SignUpDataSource
-import org.futo.circles.feature.sign_up.password.SignupBsSpekeDataSource
-import org.futo.circles.feature.sign_up.password.SignupPasswordDataSource
+import org.futo.circles.auth.feature.cross_signing.CrossSigningDataSource
+import org.futo.circles.auth.feature.log_in.LoginDataSource
+import org.futo.circles.auth.feature.log_in.stages.LoginStagesDataSource
+import org.futo.circles.auth.feature.log_in.stages.password.DirectLoginPasswordDataSource
+import org.futo.circles.auth.feature.log_in.stages.password.LoginBsSpekeDataSource
+import org.futo.circles.auth.feature.log_in.stages.password.LoginPasswordDataSource
+import org.futo.circles.auth.feature.log_in.stages.terms.LoginAcceptTermsDataSource
+import org.futo.circles.auth.feature.reauth.AuthConfirmationProvider
+import org.futo.circles.auth.feature.reauth.ReAuthStagesDataSource
+import org.futo.circles.auth.feature.sign_up.SignUpDataSource
+import org.futo.circles.auth.feature.sign_up.password.SignupBsSpekeDataSource
+import org.futo.circles.auth.feature.sign_up.password.SignupPasswordDataSource
+import org.futo.circles.auth.feature.sign_up.setup_profile.SetupProfileDataSource
+import org.futo.circles.auth.feature.sign_up.sign_up_type.SelectSignUpTypeDataSource
+import org.futo.circles.auth.feature.sign_up.subscription_stage.SubscriptionStageDataSource
+import org.futo.circles.auth.feature.sign_up.terms.SignupAcceptTermsDataSource
+import org.futo.circles.auth.feature.sign_up.validate_email.ValidateEmailDataSource
+import org.futo.circles.auth.feature.sign_up.validate_token.ValidateTokenDataSource
 import org.futo.circles.feature.sign_up.setup_circles.SetupCirclesDataSource
-import org.futo.circles.feature.sign_up.setup_profile.SetupProfileDataSource
-import org.futo.circles.feature.sign_up.sign_up_type.SelectSignUpTypeDataSource
-import org.futo.circles.feature.sign_up.subscription_stage.SubscriptionStageDataSource
-import org.futo.circles.feature.sign_up.terms.SignupAcceptTermsDataSource
-import org.futo.circles.feature.sign_up.validate_email.ValidateEmailDataSource
-import org.futo.circles.feature.sign_up.validate_token.ValidateTokenDataSource
 import org.koin.dsl.module
 
 val authDsModule = module {
diff --git a/app/src/main/java/org/futo/circles/di/data_source/RoomDsModule.kt b/app/src/main/java/org/futo/circles/di/data_source/RoomDsModule.kt
index 37372e67ae79c68612278e484ab6466cbf5cf047..4614c2983150e963176a73a9fed330840d35e41c 100644
--- a/app/src/main/java/org/futo/circles/di/data_source/RoomDsModule.kt
+++ b/app/src/main/java/org/futo/circles/di/data_source/RoomDsModule.kt
@@ -1,8 +1,8 @@
 package org.futo.circles.di.data_source
 
-import org.futo.circles.core.matrix.room.CoreSpacesTreeBuilder
-import org.futo.circles.core.matrix.room.CreateRoomDataSource
-import org.futo.circles.core.matrix.room.RoomRelationsBuilder
+import org.futo.circles.core.room.CoreSpacesTreeBuilder
+import org.futo.circles.core.room.CreateRoomDataSource
+import org.futo.circles.core.room.RoomRelationsBuilder
 import org.futo.circles.feature.circles.CirclesDataSource
 import org.futo.circles.feature.circles.accept_invite.AcceptCircleInviteDataSource
 import org.futo.circles.feature.groups.GroupsDataSource
@@ -14,9 +14,6 @@ import org.futo.circles.model.CircleRoomTypeArg
 import org.koin.dsl.module
 
 val roomDSModule = module {
-    factory { CreateRoomDataSource(get(), get()) }
-    factory { RoomRelationsBuilder() }
-    factory { CoreSpacesTreeBuilder(get(), get()) }
     factory { (roomId: String) -> UpdateRoomDataSource(roomId, get(), get()) }
     factory { GroupsDataSource(get()) }
     factory { CirclesDataSource() }
@@ -24,4 +21,9 @@ val roomDSModule = module {
     factory { PeopleDataSource(get()) }
     factory { (roomType: CircleRoomTypeArg) -> SelectRoomsDataSource(roomType) }
     factory { RoomAccountDataSource() }
+
+    ///-----
+    factory { CreateRoomDataSource(get(), get()) }
+    factory { RoomRelationsBuilder() }
+    factory { CoreSpacesTreeBuilder(get(), get()) }
 }
\ No newline at end of file
diff --git a/app/src/main/java/org/futo/circles/di/ui/SettingsUiModule.kt b/app/src/main/java/org/futo/circles/di/ui/SettingsUiModule.kt
index 5129e0c85b167c48e09a22df0de11e0b6b1e39ff..9e05d9bd50c486a3b7d4c0681c00ab67157a32ec 100644
--- a/app/src/main/java/org/futo/circles/di/ui/SettingsUiModule.kt
+++ b/app/src/main/java/org/futo/circles/di/ui/SettingsUiModule.kt
@@ -1,5 +1,6 @@
 package org.futo.circles.di.ui
 
+import org.futo.circles.auth.feature.sign_up.username.UsernameViewModel
 import org.futo.circles.feature.home.SystemNoticesCountSharedViewModel
 import org.futo.circles.feature.notices.SystemNoticesTimelineViewModel
 import org.futo.circles.feature.people.user.UserViewModel
@@ -10,7 +11,6 @@ import org.futo.circles.feature.settings.active_sessions.verify.VerifySessionVie
 import org.futo.circles.feature.settings.change_password.ChangePasswordViewModel
 import org.futo.circles.feature.settings.profile.edit.EditProfileViewModel
 import org.futo.circles.feature.settings.profile.share.ShareProfileViewModel
-import org.futo.circles.feature.sign_up.username.UsernameViewModel
 import org.futo.circles.model.CircleRoomTypeArg
 import org.koin.androidx.viewmodel.dsl.viewModel
 import org.koin.core.parameter.parametersOf