diff --git a/src/main/kotlin/org/briarproject/briar/desktop/BriarService.kt b/src/main/kotlin/org/briarproject/briar/desktop/BriarService.kt
index 35855a46a7b8f6ad30564cbb50a0b9ad60f0aa67..6cce7eb78c6da5cb9f9f969fb300aa680b3ff37d 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/BriarService.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/BriarService.kt
@@ -29,6 +29,7 @@ import javax.inject.Inject
 import javax.inject.Singleton
 
 enum class Screen {
+    REGISTRATION,
     LOGIN,
     MAIN
 }
@@ -60,41 +61,40 @@ constructor(
 
     private val contacts: MutableList<Contact> = ArrayList()
 
-    @Composable
-    override fun start(
-        conversationManager: ConversationManager,
-        messagingManager: MessagingManager
-    ) {
-        if (!accountManager.accountExists()) {
-            createAccount()
-        } else {
-            login(conversationManager, messagingManager)
-        }
-    }
-
     override fun stop() {
         lifecycleManager.stopServices()
         lifecycleManager.waitForShutdown()
     }
 
-    private fun createAccount() {
-        print("No account found. Let's create one!\n\n")
-        Registration("Briar", accountManager, lifecycleManager)
-    }
-
     @Composable
-    private fun login(
+    override fun start(
         conversationManager: ConversationManager,
         messagingManager: MessagingManager
     ) {
         val title = "Briar Desktop"
-        var screenState by remember { mutableStateOf(Screen.LOGIN) }
+        var screenState by remember {
+            mutableStateOf(
+                if (accountManager.accountExists()) {
+                    Screen.LOGIN
+                } else {
+                    Screen.REGISTRATION
+                }
+            )
+        }
         Window(title = title) {
             MaterialTheme(colors = DarkColorPallet) {
                 when (screenState) {
+                    Screen.REGISTRATION ->
+                        Registration(
+                            modifier = Modifier.background(briarBlack),
+                            onSubmit = { username, password ->
+                                accountManager.createAccount(username, password)
+                                signedIn()
+                                screenState = Screen.MAIN
+                            }
+                        )
                     Screen.LOGIN ->
                         Login(
-                            "Briar",
                             modifier = Modifier.background(briarBlack),
                             onResult = {
                                 try {
@@ -123,7 +123,10 @@ constructor(
         val dbKey = accountManager.databaseKey ?: throw AssertionError()
         lifecycleManager.startServices(dbKey)
         lifecycleManager.waitForStartup()
-        val contacts: Collection<Contact> = contactManager.getContacts()
+        val contacts = contactManager.getContacts()
+        if (contacts.isEmpty()) {
+            //todo: add some dummy account to db
+        }
         for (contact in contacts) {
             println("${contact.author.name} (${contact.alias})")
             this.contacts.add(contact)
diff --git a/src/main/kotlin/org/briarproject/briar/desktop/dialogs/Login.kt b/src/main/kotlin/org/briarproject/briar/desktop/dialogs/Login.kt
index 06f13c19084b490078ca4988bb2922b708cc7b21..427a55c238ff6faf72821b5efe900ce888fb5c08 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/dialogs/Login.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/dialogs/Login.kt
@@ -22,46 +22,39 @@ import androidx.compose.ui.Modifier
 import androidx.compose.ui.draw.clip
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.res.svgResource
+import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.input.PasswordVisualTransformation
 import androidx.compose.ui.unit.dp
 
 // TODO: Error handling
 @Composable
 fun Login(
-    title: String,
     modifier: Modifier = Modifier,
     onResult: (result: String) -> Unit
-) =
+) {
+    var password by remember { mutableStateOf("") }
     Column(
         modifier = modifier.padding(16.dp).fillMaxSize(),
         verticalArrangement = Arrangement.Center,
         horizontalAlignment = Alignment.CenterHorizontally
     ) {
-        TheImage()
+        BriarLogo()
         Spacer(Modifier.height(32.dp))
-        TheTextField(onResult)
+        OutlinedTextField(
+            value = password,
+            onValueChange = { password = it },
+            label = { Text("Password") },
+            singleLine = true,
+            textStyle = TextStyle(color = Color.White),
+            visualTransformation = PasswordVisualTransformation()
+        )
+        Spacer(Modifier.height(16.dp))
+        Button(onClick = { onResult.invoke(password) }) {
+            Text("Login", color = Color.Black)
+        }
     }
-
-@Composable
-private fun TheImage() {
-    Image(
-        painter = svgResource("images/logo_circle.svg"),
-        contentDescription = "Briar logo",
-        modifier = Modifier
-            .fillMaxWidth()
-            .clip(shape = RoundedCornerShape(400.dp))
-    )
 }
 
 @Composable
-private fun TheTextField(onResult: (result: String) -> Unit) {
-    var password by remember { mutableStateOf("") }
-    OutlinedTextField(password, { password = it }, label = { Text("Password") })
-    Spacer(Modifier.height(16.dp))
-    Button(
-        onClick = {
-            onResult.invoke(password)
-        }
-    ) {
-        Text("Login", color = Color.Black)
-    }
-}
+fun BriarLogo(modifier: Modifier = Modifier.fillMaxWidth().clip(shape = RoundedCornerShape(400.dp))) =
+    Image(svgResource("images/logo_circle.svg"), "Briar logo", modifier)
diff --git a/src/main/kotlin/org/briarproject/briar/desktop/dialogs/Registration.kt b/src/main/kotlin/org/briarproject/briar/desktop/dialogs/Registration.kt
index 479c901ff738bd21fc09925a34946a0acbf44353..523523391fd141f67af2922fb133f38e5da3dbc2 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/dialogs/Registration.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/dialogs/Registration.kt
@@ -1,15 +1,11 @@
 package org.briarproject.briar.desktop.dialogs
 
-import androidx.compose.desktop.Window
-import androidx.compose.foundation.Image
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Spacer
 import androidx.compose.foundation.layout.fillMaxSize
-import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.height
 import androidx.compose.foundation.layout.padding
-import androidx.compose.foundation.shape.RoundedCornerShape
 import androidx.compose.material.Button
 import androidx.compose.material.OutlinedTextField
 import androidx.compose.material.Text
@@ -20,52 +16,44 @@ import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.draw.clip
-import androidx.compose.ui.res.svgResource
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.input.PasswordVisualTransformation
 import androidx.compose.ui.unit.dp
-import org.briarproject.bramble.api.account.AccountManager
-import org.briarproject.bramble.api.lifecycle.LifecycleManager
 
 // TODO: Error handling and password strength
-fun Registration(title: String, accountManager: AccountManager, lifecycleManager: LifecycleManager) =
-    Window(title = title) {
-        Column(
-            modifier = Modifier.padding(16.dp).fillMaxSize(),
-            verticalArrangement = Arrangement.Center,
-            horizontalAlignment = Alignment.CenterHorizontally
-        ) {
-            TheImage()
-            Spacer(Modifier.height(32.dp))
-            TheTextFields(accountManager, lifecycleManager)
-        }
-    }
-
-@Composable
-private fun TheImage() {
-    Image(
-        painter = svgResource("images/logo_circle.svg"),
-        contentDescription = "Briar logo",
-        modifier = Modifier
-            .fillMaxWidth()
-            .clip(shape = RoundedCornerShape(400.dp))
-    )
-}
-
 @Composable
-private fun TheTextFields(accountManager: AccountManager, lifecycleManager: LifecycleManager) {
+fun Registration(
+    modifier: Modifier = Modifier,
+    onSubmit: (username: String, password: String) -> Unit
+) {
     var username by remember { mutableStateOf("") }
     var password by remember { mutableStateOf("") }
-    OutlinedTextField(username, { username = it }, label = { Text("Username") })
-    OutlinedTextField(password, { password = it }, label = { Text("Password") })
-    Spacer(Modifier.height(16.dp))
-    Button(
-        onClick = {
-            accountManager.createAccount(username, password)
-            val dbKey = accountManager.databaseKey ?: throw AssertionError()
-            lifecycleManager.startServices(dbKey)
-            lifecycleManager.waitForStartup()
-        }
+    Column(
+        modifier = modifier.padding(16.dp).fillMaxSize(),
+        verticalArrangement = Arrangement.Center,
+        horizontalAlignment = Alignment.CenterHorizontally
     ) {
-        Text("Register")
+        BriarLogo()
+        Spacer(Modifier.height(32.dp))
+        OutlinedTextField(
+            value = username,
+            onValueChange = { username = it },
+            label = { Text("Username") },
+            singleLine = true,
+            textStyle = TextStyle(color = Color.White),
+        )
+        OutlinedTextField(
+            value = password,
+            onValueChange = { password = it },
+            label = { Text("Password") },
+            singleLine = true,
+            textStyle = TextStyle(color = Color.White),
+            visualTransformation = PasswordVisualTransformation(),
+        )
+        Spacer(Modifier.height(16.dp))
+        Button(onClick = { onSubmit.invoke(username, password) }) {
+            Text("Register")
+        }
     }
 }