diff --git a/app/src/main/java/org/futo/circles/App.kt b/app/src/main/java/org/futo/circles/App.kt
index 1baa30e0051aca6e0b2704aa0b495792aa1f3685..71156c948e7173c4f6907f921fb4c30eb0fe5ccf 100644
--- a/app/src/main/java/org/futo/circles/App.kt
+++ b/app/src/main/java/org/futo/circles/App.kt
@@ -46,8 +46,12 @@ class App : Application() {
                 BuildConfig.FLAVOR
             )
             .appName(getString(R.string.app_name))
-            .euDomain(getString(if (BuildConfig.DEBUG) R.string.debug_eu_domain else R.string.release_eu_domain))
-            .usDomain(getString(if (BuildConfig.DEBUG) R.string.debug_us_domain else R.string.release_us_domain))
+            .serverDomains(
+                applicationContext.resources.getStringArray(
+                    if (BuildConfig.DEBUG) R.array.debug_domains
+                    else R.array.release_domains
+                ).toList()
+            )
             .init()
 
         MatrixSessionProvider.initSession(
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 265530ea73f1a1db179ee46ca30f612a65332e54..068dd88563eeb1db52f80932c6b70974d41bf50a 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1,8 +1,4 @@
 <resources>
-    <string name="debug_eu_domain" translatable="false">matrix.org</string>
-    <string name="debug_us_domain" translatable="false">nl.circles-dev.net</string>
-    <string name="release_eu_domain" translatable="false">eu.circu.li</string>
-    <string name="release_us_domain" translatable="false">circu.li</string>
     <string name="app_name">Circles</string>
     <string name="futo">FUTO</string>
     <string name="circles">Circles</string>
@@ -221,6 +217,16 @@
     <string name="invite_to_connect">Invite to connect</string>
     <string name="empty_media_storage_info">0 MB used</string>
 
+    <string-array name="debug_domains">
+        <item>nl.circles-dev.net</item>
+        <item>matrix.org</item>
+    </string-array>
+
+    <string-array name="release_domains">
+        <item>circu.li</item>
+        <item>eu.circu.li</item>
+    </string-array>
+
     <string-array name="report_categories">
         <item>@string/crude_language</item>
         <item>@string/copyright_violation</item>
diff --git a/auth/src/main/java/org/futo/circles/auth/feature/log_in/LogInFragment.kt b/auth/src/main/java/org/futo/circles/auth/feature/log_in/LogInFragment.kt
index ec5d06f5d8ea1f4b295b3741a4d1a28c557d4cdb..e1ea34e4acf8ac6f20b42ff02e34cb00300a1437 100644
--- a/auth/src/main/java/org/futo/circles/auth/feature/log_in/LogInFragment.kt
+++ b/auth/src/main/java/org/futo/circles/auth/feature/log_in/LogInFragment.kt
@@ -39,7 +39,7 @@ class LogInFragment : Fragment(R.layout.fragment_log_in), HasLoadingState {
         ArrayAdapter(
             requireContext(),
             android.R.layout.simple_dropdown_item_1line,
-            listOf(CirclesAppConfig.usServerDomain, CirclesAppConfig.euServerDomain)
+            CirclesAppConfig.serverDomains
         )
     }
 
@@ -71,11 +71,11 @@ class LogInFragment : Fragment(R.layout.fragment_log_in), HasLoadingState {
                 setAdapter(autocompleteAdapter)
                 onFocusChangeListener = OnFocusChangeListener { _, hasFocus ->
                     tilDomain.hint =
-                        if (!hasFocus && tvDomain.text.isEmpty()) CirclesAppConfig.usServerDomain
+                        if (!hasFocus && tvDomain.text.isEmpty()) CirclesAppConfig.serverDomains.first()
                         else getString(R.string.domain)
                 }
             }
-            tilDomain.hint = CirclesAppConfig.usServerDomain
+            tilDomain.hint = CirclesAppConfig.serverDomains.first()
             binding.rvSwitchUsers.apply {
                 adapter = switchUsersAdapter
                 addItemDecoration(
@@ -121,5 +121,5 @@ class LogInFragment : Fragment(R.layout.fragment_log_in), HasLoadingState {
     }
 
     private fun getDomain() = binding.tvDomain.text.toString().takeIf { it.isNotEmpty() }
-        ?: CirclesAppConfig.usServerDomain
+        ?: CirclesAppConfig.serverDomains.first()
 }
\ No newline at end of file
diff --git a/auth/src/main/java/org/futo/circles/auth/feature/sign_up/SignUpDataSource.kt b/auth/src/main/java/org/futo/circles/auth/feature/sign_up/SignUpDataSource.kt
index f918bc02a6b7587260b81a1ff073addc076793cd..a7f1fbc005478f38f97d62386f344f551cff2c25 100644
--- a/auth/src/main/java/org/futo/circles/auth/feature/sign_up/SignUpDataSource.kt
+++ b/auth/src/main/java/org/futo/circles/auth/feature/sign_up/SignUpDataSource.kt
@@ -4,6 +4,7 @@ import android.content.Context
 import androidx.lifecycle.MutableLiveData
 import dagger.hilt.android.qualifiers.ApplicationContext
 import org.futo.circles.auth.R
+import org.futo.circles.auth.base.BaseLoginStagesDataSource
 import org.futo.circles.auth.bsspeke.BSSpekeClientProvider
 import org.futo.circles.auth.feature.pass_phrase.create.CreatePassPhraseDataSource
 import org.futo.circles.core.base.SingleEventLiveData
@@ -43,7 +44,7 @@ class SignUpDataSource @Inject constructor(
     var domain: String = ""
         private set
 
-    fun startSignUpStages(
+    suspend fun startSignUpStages(
         stages: List<Stage>,
         serverDomain: String
     ) {
@@ -51,7 +52,14 @@ class SignUpDataSource @Inject constructor(
         stagesToComplete.clear()
         domain = serverDomain
         stagesToComplete.addAll(stages)
-        navigateToNextStage()
+        if ((stages.firstOrNull() as? Stage.Other)?.type == REGISTRATION_FREE_TYPE)
+            skipFreeSubscriptionDummyStage()
+        else navigateToNextStage()
+    }
+
+    private suspend fun skipFreeSubscriptionDummyStage() {
+        setNextStage()
+        performRegistrationStage(mapOf(BaseLoginStagesDataSource.TYPE_PARAM_KEY to REGISTRATION_FREE_TYPE))
     }
 
     suspend fun performRegistrationStage(
@@ -143,6 +151,7 @@ class SignUpDataSource @Inject constructor(
     }
 
     companion object {
+        const val REGISTRATION_FREE_TYPE = "org.futo.subscriptions.free_forever"
         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"
diff --git a/auth/src/main/java/org/futo/circles/auth/feature/sign_up/sign_up_type/SelectSignUpTypeDataSource.kt b/auth/src/main/java/org/futo/circles/auth/feature/sign_up/sign_up_type/SelectSignUpTypeDataSource.kt
index e4fcd63c850fc6c298217eb8e7d1812389062548..d723b78c2fc78a53f6cae26f9945c299b57ad5e4 100644
--- a/auth/src/main/java/org/futo/circles/auth/feature/sign_up/sign_up_type/SelectSignUpTypeDataSource.kt
+++ b/auth/src/main/java/org/futo/circles/auth/feature/sign_up/sign_up_type/SelectSignUpTypeDataSource.kt
@@ -4,9 +4,12 @@ import android.content.Context
 import dagger.hilt.android.qualifiers.ApplicationContext
 import org.futo.circles.auth.R
 import org.futo.circles.auth.feature.sign_up.SignUpDataSource
+import org.futo.circles.auth.feature.sign_up.SignUpDataSource.Companion.REGISTRATION_FREE_TYPE
+import org.futo.circles.auth.feature.sign_up.SignUpDataSource.Companion.REGISTRATION_SUBSCRIPTION_TYPE
 import org.futo.circles.core.extensions.createResult
 import org.futo.circles.core.provider.MatrixInstanceProvider
 import org.futo.circles.core.utils.HomeServerUtils.buildHomeServerConfigFromDomain
+import org.matrix.android.sdk.api.auth.registration.Stage
 import javax.inject.Inject
 
 class SelectSignUpTypeDataSource @Inject constructor(
@@ -14,19 +17,41 @@ class SelectSignUpTypeDataSource @Inject constructor(
     private val signUpDataSource: SignUpDataSource
 ) {
 
+    private var registrationFlowsForDomain: Pair<String, List<List<Stage>>>? = null
+
     fun clearSubtitle() {
         signUpDataSource.clearSubtitle()
     }
 
-    suspend fun startNewRegistration(domain: String) = createResult {
+    suspend fun getAuthFlowsFor(domain: String) = createResult {
+        registrationFlowsForDomain = null
         val authService = MatrixInstanceProvider.matrix.authenticationService().apply {
             cancelPendingLoginOrRegistration()
             initiateAuth(buildHomeServerConfigFromDomain(domain))
         }
-        val stages = authService.getRegistrationWizard().getAllRegistrationFlows().firstOrNull()
-            ?: throw IllegalArgumentException(context.getString(R.string.wrong_signup_config))
+        authService.getRegistrationWizard().getAllRegistrationFlows().also {
+            registrationFlowsForDomain = domain to it
+        }
+    }
+
+    suspend fun startNewRegistration(isSubscription: Boolean) = createResult {
+        val (domain, flows) = registrationFlowsForDomain ?: throw IllegalArgumentException(
+            context.getString(R.string.wrong_signup_config)
+        )
+        val stages = if (isSubscription) getSubscriptionSignupStages(flows)
+        else getFreeSignupStages(flows)
+
+        stages ?: throw IllegalArgumentException(context.getString(R.string.wrong_signup_config))
 
         signUpDataSource.startSignUpStages(stages, domain)
     }
 
+    // Must start with org.futo.subscriptions.free_forever
+    fun getFreeSignupStages(flows: List<List<Stage>>): List<Stage>? =
+        flows.firstOrNull { (it.firstOrNull() as? Stage.Other)?.type == REGISTRATION_FREE_TYPE }
+
+    // Must start with org.futo.subscription.google_play
+    fun getSubscriptionSignupStages(flows: List<List<Stage>>): List<Stage>? =
+        flows.firstOrNull { (it.firstOrNull() as? Stage.Other)?.type == REGISTRATION_SUBSCRIPTION_TYPE }
+
 }
\ No newline at end of file
diff --git a/auth/src/main/java/org/futo/circles/auth/feature/sign_up/sign_up_type/SelectSignUpTypeFragment.kt b/auth/src/main/java/org/futo/circles/auth/feature/sign_up/sign_up_type/SelectSignUpTypeFragment.kt
index 47eefff35c557e61587fd8d5a6506dd5ade389fd..7c1ca617f958d823a1d579ec0285233bd8257585 100644
--- a/auth/src/main/java/org/futo/circles/auth/feature/sign_up/sign_up_type/SelectSignUpTypeFragment.kt
+++ b/auth/src/main/java/org/futo/circles/auth/feature/sign_up/sign_up_type/SelectSignUpTypeFragment.kt
@@ -1,17 +1,21 @@
 package org.futo.circles.auth.feature.sign_up.sign_up_type
 
 import android.os.Bundle
-import android.text.Html
 import android.view.View
+import androidx.core.view.children
 import androidx.fragment.app.Fragment
 import androidx.fragment.app.viewModels
 import by.kirich1409.viewbindingdelegate.viewBinding
+import com.google.android.material.radiobutton.MaterialRadioButton
 import dagger.hilt.android.AndroidEntryPoint
 import org.futo.circles.auth.R
 import org.futo.circles.auth.databinding.FragmentSelectSignUpTypeBinding
 import org.futo.circles.core.base.CirclesAppConfig
 import org.futo.circles.core.base.fragment.HasLoadingState
+import org.futo.circles.core.extensions.gone
 import org.futo.circles.core.extensions.observeResponse
+import org.futo.circles.core.extensions.setIsVisible
+import org.futo.circles.core.extensions.showError
 
 @AndroidEntryPoint
 class SelectSignUpTypeFragment : Fragment(R.layout.fragment_select_sign_up_type),
@@ -31,29 +35,59 @@ class SelectSignUpTypeFragment : Fragment(R.layout.fragment_select_sign_up_type)
 
     private fun setupViews() {
         with(binding) {
-            btnEU.text = Html.fromHtml(
-                getString(R.string.eu_server_format, CirclesAppConfig.euServerDomain),
-                Html.FROM_HTML_MODE_COMPACT
-            )
-            btnUS.text =
-                Html.fromHtml(
-                    getString(R.string.us_server_format, CirclesAppConfig.usServerDomain),
-                    Html.FROM_HTML_MODE_COMPACT
+            serverDomainGroup.setOnCheckedChangeListener { _, _ ->
+                setFlowsLoading(true)
+                viewModel.loadSignupFlowsForDomain(getDomain())
+            }
+            CirclesAppConfig.serverDomains.forEach { domain ->
+                serverDomainGroup.addView(
+                    MaterialRadioButton(requireContext()).apply {
+                        text = domain
+                        textSize = 20f
+                    }
                 )
-            btnSignup.setOnClickListener {
-                startLoading(btnSignup)
-                viewModel.startSignUp(getDomain())
+            }
+            serverDomainGroup.check(serverDomainGroup.children.first().id)
+            btnSubscription.setOnClickListener {
+                startLoading(btnSubscription)
+                viewModel.startSignUp(true)
+            }
+            btnFree.setOnClickListener {
+                startLoading(btnFree)
+                viewModel.startSignUp(false)
             }
         }
     }
 
     private fun setupObservers() {
         viewModel.startSignUpEventLiveData.observeResponse(this)
+        viewModel.signupFlowsLiveData.observeResponse(this,
+            success = {
+                val hasSubscriptionFlow = viewModel.hasSubscriptionFlow(it)
+                val hasFreeFlow = viewModel.hasFreeFlow(it)
+                with(binding) {
+                    btnSubscription.setIsVisible(hasSubscriptionFlow)
+                    btnFree.setIsVisible(hasFreeFlow)
+                    tvOr.setIsVisible(hasFreeFlow && hasSubscriptionFlow)
+                }
+            },
+            error = { message ->
+                showError(message)
+                binding.lButtonsContainer.gone()
+            },
+            onRequestInvoked = { setFlowsLoading(false) }
+        )
     }
 
-    private fun getDomain() = when (binding.serverLocationGroup.checkedRadioButtonId) {
-        binding.btnUS.id -> CirclesAppConfig.usServerDomain
-        binding.btnEU.id -> CirclesAppConfig.euServerDomain
-        else -> CirclesAppConfig.usServerDomain
+    private fun setFlowsLoading(isLoading: Boolean) {
+        with(binding) {
+            lButtonsContainer.setIsVisible(!isLoading)
+            flowProgress.setIsVisible(isLoading)
+        }
     }
+
+    private fun getDomain() =
+        binding.serverDomainGroup
+            .findViewById<MaterialRadioButton>(binding.serverDomainGroup.checkedRadioButtonId).text.toString()
+
 }
\ No newline at end of file
diff --git a/auth/src/main/java/org/futo/circles/auth/feature/sign_up/sign_up_type/SelectSignUpTypeViewModel.kt b/auth/src/main/java/org/futo/circles/auth/feature/sign_up/sign_up_type/SelectSignUpTypeViewModel.kt
index 79e0b26ff764e47fd0bc86f83ccf57ea16a4f243..677f8727cb2fc6f241b355066bfe02e445b74472 100644
--- a/auth/src/main/java/org/futo/circles/auth/feature/sign_up/sign_up_type/SelectSignUpTypeViewModel.kt
+++ b/auth/src/main/java/org/futo/circles/auth/feature/sign_up/sign_up_type/SelectSignUpTypeViewModel.kt
@@ -5,6 +5,7 @@ import dagger.hilt.android.lifecycle.HiltViewModel
 import org.futo.circles.core.base.SingleEventLiveData
 import org.futo.circles.core.extensions.Response
 import org.futo.circles.core.extensions.launchBg
+import org.matrix.android.sdk.api.auth.registration.Stage
 import javax.inject.Inject
 
 @HiltViewModel
@@ -13,10 +14,12 @@ class SelectSignUpTypeViewModel @Inject constructor(
 ) : ViewModel() {
 
     val startSignUpEventLiveData = SingleEventLiveData<Response<Unit?>>()
+    val signupFlowsLiveData = SingleEventLiveData<Response<List<List<Stage>>>>()
 
-    fun startSignUp(serverDomain: String) {
+    fun startSignUp(isSubscription: Boolean) {
         launchBg {
-            startSignUpEventLiveData.postValue(dataSource.startNewRegistration(serverDomain))
+            val result = dataSource.startNewRegistration(isSubscription)
+            startSignUpEventLiveData.postValue(result)
         }
     }
 
@@ -24,4 +27,17 @@ class SelectSignUpTypeViewModel @Inject constructor(
         dataSource.clearSubtitle()
     }
 
+    fun loadSignupFlowsForDomain(domain: String) {
+        launchBg {
+            val result = dataSource.getAuthFlowsFor(domain)
+            signupFlowsLiveData.postValue(result)
+        }
+    }
+
+    fun hasSubscriptionFlow(flows: List<List<Stage>>): Boolean =
+        dataSource.getSubscriptionSignupStages(flows) != null
+
+    fun hasFreeFlow(flows: List<List<Stage>>): Boolean =
+        dataSource.getFreeSignupStages(flows) != null
+
 }
\ No newline at end of file
diff --git a/auth/src/main/res/layout/fragment_select_sign_up_type.xml b/auth/src/main/res/layout/fragment_select_sign_up_type.xml
index 41faa2fff30ec1154dd456d232dd39a6bb8bc5b7..c6e1fef7a6e78dd825d0682b64452a51c5f488f0 100644
--- a/auth/src/main/res/layout/fragment_select_sign_up_type.xml
+++ b/auth/src/main/res/layout/fragment_select_sign_up_type.xml
@@ -26,53 +26,73 @@
 
 
     <TextView
-        android:id="@+id/tvServerLocationTitle"
+        android:id="@+id/tvServerTitle"
         style="@style/headline"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginTop="16dp"
-        android:text="@string/server_location"
+        android:text="@string/server"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toBottomOf="@id/guidelineLogo" />
 
     <RadioGroup
-        android:id="@+id/serverLocationGroup"
+        android:id="@+id/serverDomainGroup"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:orientation="vertical"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toBottomOf="@id/tvServerLocationTitle">
+        app:layout_constraintTop_toBottomOf="@id/tvServerTitle" />
 
-        <com.google.android.material.radiobutton.MaterialRadioButton
-            android:id="@+id/btnUS"
-            android:layout_width="wrap_content"
+
+    <LinearLayout
+        android:id="@+id/lButtonsContainer"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="24dp"
+        android:orientation="vertical"
+        android:visibility="gone"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/serverDomainGroup"
+        tools:visibility="visible">
+
+        <org.futo.circles.core.view.LoadingButton
+            android:id="@+id/btnFree"
+            android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:checked="true"
-            android:paddingHorizontal="8dp"
-            android:textSize="17sp"
-            tools:text="US some.server.domain" />
+            android:layout_marginBottom="16dp"
+            android:text="@string/sign_up_for_free" />
 
-        <com.google.android.material.radiobutton.MaterialRadioButton
-            android:id="@+id/btnEU"
+        <TextView
+            android:id="@+id/tvOr"
+            style="@style/headline"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:paddingHorizontal="8dp"
-            android:textSize="17sp"
-            tools:text="EU - (some.server.domain)" />
+            android:layout_gravity="center_horizontal"
+            android:gravity="center"
+            android:text="@string/or" />
 
-    </RadioGroup>
+        <org.futo.circles.core.view.LoadingButton
+            android:id="@+id/btnSubscription"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="16dp"
+            android:text="@string/sign_up_with_subscription" />
 
+    </LinearLayout>
 
-    <org.futo.circles.core.view.LoadingButton
-        android:id="@+id/btnSignup"
-        android:layout_width="0dp"
+    <ProgressBar
+        android:id="@+id/flowProgress"
+        android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_marginTop="24dp"
-        android:text="@string/sign_up_with_subscription"
+        android:visibility="gone"
+        app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toBottomOf="@id/serverLocationGroup" />
+        app:layout_constraintTop_toBottomOf="@id/serverDomainGroup"
+        tools:visibility="visible" />
+
 
 </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/auth/src/main/res/values/strings.xml b/auth/src/main/res/values/strings.xml
index cd4e34c606e1a9c908c84899bdf50f35a3e91941..c661570422a4009a705d37889441f2eb30af82e1 100644
--- a/auth/src/main/res/values/strings.xml
+++ b/auth/src/main/res/values/strings.xml
@@ -14,8 +14,6 @@
     <string name="us_server_format"><![CDATA[<b>US</b> - (%s)]]></string>
     <string name="eu_server_format"><![CDATA[<b>EU</b> - (%s)]]></string>
     <string name="sign_up_using_active_subscription">Sign Up using your active subscription</string>
-    <string name="choose_a_subscription">Choose a subscription</string>
-    <string name="create_a_subscription">Create a subscription</string>
     <string name="sign_up">Sign Up</string>
     <string name="not_supported_stage_format">Not supported stage %s</string>
     <string name="sign_up_stage_subtitle_format">Stage %1$d of %2$d</string>
@@ -61,8 +59,9 @@
     <string name="enter_your_password">Enter your password</string>
     <string name="password">Password</string>
     <string name="repeat_password">Repeat password</string>
-    <string name="server_location">Server Location</string>
+    <string name="server">Server</string>
     <string name="sign_up_with_subscription">Sign up with subscription</string>
+    <string name="sign_up_for_free">Sign up for free</string>
     <string name="or">Or</string>
     <string name="setup_profile">Setup profile</string>
     <string name="upload_a_profile_photo">Upload a profile photo</string>
diff --git a/core/src/main/java/org/futo/circles/core/base/CirclesAppConfig.kt b/core/src/main/java/org/futo/circles/core/base/CirclesAppConfig.kt
index e5337064d96c32a3261a87d680c9ec22a38df27e..feb74f9e4d7d5f7241e3461032d1d9de90ee9be1 100644
--- a/core/src/main/java/org/futo/circles/core/base/CirclesAppConfig.kt
+++ b/core/src/main/java/org/futo/circles/core/base/CirclesAppConfig.kt
@@ -14,10 +14,7 @@ object CirclesAppConfig {
     var appName = ""
         private set
 
-    var usServerDomain = ""
-        private set
-
-    var euServerDomain = ""
+    var serverDomains = emptyList<String>()
         private set
 
     var isMediaBackupEnabled = false
@@ -32,9 +29,8 @@ object CirclesAppConfig {
         private var version: String? = null,
         private var flavour: String? = null,
         private var appName: String? = null,
-        private var usDomain: String? = null,
+        private var serverDomains: List<String> = emptyList(),
         private var euDomain: String? = null,
-        private var subscriptionEnabled: Boolean = false,
         private var mediaBackupEnabled: Boolean = false,
         private var rageshakeEnabled: Boolean = false
     ) {
@@ -48,9 +44,7 @@ object CirclesAppConfig {
 
         fun appName(appName: String) = apply { this.appName = appName }
 
-        fun usDomain(domain: String) = apply { this.usDomain = domain }
-
-        fun euDomain(domain: String) = apply { this.euDomain = domain }
+        fun serverDomains(domains: List<String>) = apply { this.serverDomains = domains }
 
         fun isMediaBackupEnabled(isEnabled: Boolean) = apply { this.mediaBackupEnabled = isEnabled }
 
@@ -70,11 +64,8 @@ object CirclesAppConfig {
             CirclesAppConfig.appName = appName?.takeIf { it.isNotEmpty() }
                 ?: throw IllegalArgumentException("appName is empty $appName")
 
-            usServerDomain = usDomain?.takeIf { it.isNotEmpty() }
-                ?: throw IllegalArgumentException("Illegal US server domain $usDomain")
-
-            euServerDomain = euDomain?.takeIf { it.isNotEmpty() }
-                ?: throw IllegalArgumentException("Illegal EU server domain $euDomain")
+            CirclesAppConfig.serverDomains = serverDomains.takeIf { it.isNotEmpty() }
+                ?: throw IllegalArgumentException("Illegal empty server domains")
 
             isMediaBackupEnabled = mediaBackupEnabled
             isRageshakeEnabled = rageshakeEnabled
diff --git a/core/src/main/java/org/futo/circles/core/base/Constants.kt b/core/src/main/java/org/futo/circles/core/base/Constants.kt
index da27a0b25b74bce18534147cb8f1cc15062b7b72..8ead7f0d10d45959d27ef9cef671b3dd6724e1fc 100644
--- a/core/src/main/java/org/futo/circles/core/base/Constants.kt
+++ b/core/src/main/java/org/futo/circles/core/base/Constants.kt
@@ -1,6 +1,5 @@
 package org.futo.circles.core.base
 
-import org.futo.circles.core.BuildConfig
 import org.futo.circles.core.provider.MatrixSessionProvider
 
 const val FILE_PROVIDER_AUTHORITY_EXTENSION = ".provider"
@@ -8,9 +7,7 @@ const val MediaCaptionFieldKey = "caption"
 const val READ_ONLY_ROLE = -10
 
 fun getCirclesDomain(): String {
-    if (BuildConfig.DEBUG) return CirclesAppConfig.usServerDomain
     val homeServerUrl = MatrixSessionProvider.currentSession?.sessionParams?.homeServerUrl ?: ""
-    if (homeServerUrl.contains(CirclesAppConfig.usServerDomain)) return CirclesAppConfig.usServerDomain
-    if (homeServerUrl.contains(CirclesAppConfig.euServerDomain)) return CirclesAppConfig.euServerDomain
-    return CirclesAppConfig.usServerDomain
+    return CirclesAppConfig.serverDomains.firstOrNull { homeServerUrl.contains(it) }
+        ?: CirclesAppConfig.serverDomains.first()
 }