diff --git a/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt b/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt
index 63c754f1c347101d4a980005b04926a3c14d7a99..b24b6f8f6ecc969f56c127adb7f627b52871067c 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt
@@ -130,7 +130,7 @@ class QuasselService : DaggerLifecycleService(),
   private fun updateConnection(accountId: Long, reconnect: Boolean) {
     handlerService.backend {
       val account = if (accountId != -1L && reconnect) {
-        AccountDatabase.Creator.init(this).accounts().findById(accountId)
+        accountDatabase.accounts().findById(accountId)
       } else {
         null
       }
@@ -165,6 +165,13 @@ class QuasselService : DaggerLifecycleService(),
   }
 
   private val backendImplementation = object : Backend {
+    override fun updateUserDataAndLogin(user: String, pass: String) {
+      accountDatabase.accounts().findById(accountId)?.let { old ->
+        accountDatabase.accounts().save(old.copy(user = user, pass = pass))
+        sessionManager.login(user, pass)
+      }
+    }
+
     override fun sessionManager() = sessionManager
 
     override fun connectUnlessConnected(address: SocketAddress, user: String, pass: String,
@@ -193,6 +200,12 @@ class QuasselService : DaggerLifecycleService(),
   private val handlerService = AndroidHandlerService()
 
   private val asyncBackend = object : Backend {
+    override fun updateUserDataAndLogin(user: String, pass: String) {
+      handlerService.backend {
+        backendImplementation.updateUserDataAndLogin(user, pass)
+      }
+    }
+
     override fun connectUnlessConnected(address: SocketAddress, user: String, pass: String,
                                         reconnect: Boolean) {
       handlerService.backend {
@@ -224,7 +237,11 @@ class QuasselService : DaggerLifecycleService(),
     override fun sessionManager() = backendImplementation.sessionManager()
   }
 
-  private lateinit var database: QuasselDatabase
+  @Inject
+  lateinit var database: QuasselDatabase
+
+  @Inject
+  lateinit var accountDatabase: AccountDatabase
 
   private val receiver = object : BroadcastReceiver() {
     override fun onReceive(context: Context?, intent: Intent?) {
@@ -237,7 +254,6 @@ class QuasselService : DaggerLifecycleService(),
 
   override fun onCreate() {
     super.onCreate()
-    database = QuasselDatabase.Creator.init(application)
     sessionManager = SessionManager(ISession.NULL, QuasselBacklogStorage(database), handlerService)
     clientData = ClientData(
       identifier = "${resources.getString(R.string.app_name)} ${BuildConfig.VERSION_NAME}",
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt
index 0fb11743b5b904c2c32966486f28a85280d603f7..f06944fd3a7ff0d7897b5504dde0fb4cdb99122c 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt
@@ -20,6 +20,7 @@ import android.view.Gravity
 import android.view.Menu
 import android.view.MenuItem
 import android.view.View
+import android.widget.EditText
 import butterknife.BindView
 import butterknife.ButterKnife
 import com.afollestad.materialdialogs.MaterialDialog
@@ -37,6 +38,7 @@ import de.kuschku.quasseldroid.persistence.QuasselDatabase
 import de.kuschku.quasseldroid.ui.chat.input.Editor
 import de.kuschku.quasseldroid.ui.chat.input.MessageHistoryAdapter
 import de.kuschku.quasseldroid.ui.settings.SettingsActivity
+import de.kuschku.quasseldroid.util.helper.editCommit
 import de.kuschku.quasseldroid.util.helper.invoke
 import de.kuschku.quasseldroid.util.helper.toLiveData
 import de.kuschku.quasseldroid.util.service.ServiceBoundActivity
@@ -171,29 +173,58 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc
       drawerToggle.syncState()
     }
 
-    viewModel.errors_liveData.observe(this, Observer {
-      when (it) {
-        is HandshakeMessage.ClientInitReject  ->
-          MaterialDialog.Builder(this)
-            .title(R.string.label_error_init)
-            .content(Html.fromHtml(it.errorString))
-            .neutralText(R.string.label_close)
-            .build()
-            .show()
-        is HandshakeMessage.CoreSetupReject   ->
-          MaterialDialog.Builder(this)
-            .title(R.string.label_error_setup)
-            .content(Html.fromHtml(it.errorString))
-            .neutralText(R.string.label_close)
-            .build()
-            .show()
-        is HandshakeMessage.ClientLoginReject ->
-          MaterialDialog.Builder(this)
-            .title(R.string.label_error_login)
-            .content(Html.fromHtml(it.errorString))
-            .neutralText(R.string.label_close)
-            .build()
-            .show()
+    viewModel.errors_liveData.observe(this, Observer { optional ->
+      optional?.orNull().let {
+        when (it) {
+          is HandshakeMessage.ClientInitReject  ->
+            MaterialDialog.Builder(this)
+              .title(R.string.label_error_init)
+              .content(Html.fromHtml(it.errorString))
+              .neutralText(R.string.label_close)
+              .build()
+              .show()
+          is HandshakeMessage.CoreSetupReject   ->
+            MaterialDialog.Builder(this)
+              .title(R.string.label_error_setup)
+              .content(Html.fromHtml(it.errorString))
+              .neutralText(R.string.label_close)
+              .build()
+              .show()
+          is HandshakeMessage.ClientLoginReject ->
+            MaterialDialog.Builder(this)
+              .title(R.string.label_error_login)
+              .content(Html.fromHtml(it.errorString))
+              .negativeText(R.string.label_disconnect)
+              .positiveText("Change User/Password")
+              .onNegative { _, _ ->
+                disconnect()
+              }
+              .onPositive { _, _ ->
+                MaterialDialog.Builder(this)
+                  .title("Login Required")
+                  .customView(R.layout.setup_account_user, false)
+                  .negativeText(R.string.label_disconnect)
+                  .positiveText(R.string.label_save)
+                  .onNegative { _, _ ->
+                    disconnect()
+                  }
+                  .onPositive { dialog, _ ->
+                    dialog.customView?.run {
+                      val userField = findViewById<EditText>(R.id.user)
+                      val passField = findViewById<EditText>(R.id.pass)
+
+                      val user = userField.text.toString()
+                      val pass = passField.text.toString()
+
+                      backend.value.orNull()?.updateUserDataAndLogin(user, pass)
+                    }
+                  }
+                  .build()
+                  .show()
+              }
+              .build()
+              .show()
+        }
       }
     })
 
@@ -319,11 +350,15 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc
       true
     }
     R.id.disconnect      -> {
-      val editor1 = getSharedPreferences(Keys.Status.NAME, Context.MODE_PRIVATE).edit()
-      editor1.putBoolean(Keys.Status.reconnect, false)
-      editor1.commit()
+      disconnect()
       true
     }
     else                 -> super.onOptionsItemSelected(item)
   }
+
+  private fun disconnect() {
+    getSharedPreferences(Keys.Status.NAME, Context.MODE_PRIVATE).editCommit {
+      putBoolean(Keys.Status.reconnect, false)
+    }
+  }
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/edit/AccountEditActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/edit/AccountEditActivity.kt
index a52ac3c6ffc1a65511b517ab6342367bc4b95dab..b5677d0163238cdeb71470216ed52e9deaea1d15 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/edit/AccountEditActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/edit/AccountEditActivity.kt
@@ -82,26 +82,26 @@ class AccountEditActivity : AppCompatActivity() {
     }
 
     nameValidator = object : TextValidator(
-      nameWrapper::setError, resources.getString(R.string.hintInvalidName)
+      nameWrapper::setError, resources.getString(R.string.hint_invalid_name)
     ) {
       override fun validate(text: Editable) = text.isNotBlank()
     }
 
     hostValidator = object : TextValidator(
-      hostWrapper::setError, resources.getString(R.string.hintInvalidHost)
+      hostWrapper::setError, resources.getString(R.string.hint_invalid_host)
     ) {
       override fun validate(text: Editable) =
         text.toString().matches(Patterns.DOMAIN_NAME.toRegex())
     }
 
     portValidator = object : TextValidator(
-      portWrapper::setError, resources.getString(R.string.hintInvalidPort)
+      portWrapper::setError, resources.getString(R.string.hint_invalid_port)
     ) {
       override fun validate(text: Editable) = text.toString().toIntOrNull() in (0 until 65536)
     }
 
     userValidator = object : TextValidator(
-      userWrapper::setError, resources.getString(R.string.hintInvalidUser)
+      userWrapper::setError, resources.getString(R.string.hint_invalid_user)
     ) {
       override fun validate(text: Editable) = text.isNotBlank()
     }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/selection/AccountAdapter.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/selection/AccountAdapter.kt
index 5b3c07ccf8f593263b0dfe60e3fce6a543769049..f236d115fa25237f5ed42a33ad0deaa42e111b79 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/selection/AccountAdapter.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/selection/AccountAdapter.kt
@@ -217,7 +217,7 @@ class AccountAdapter(
         id = account.id
         accountName.text = account.name
         accountDescription.text = itemView.context.resources.getString(
-          R.string.userOnHost, account.user, account.host, account.port
+          R.string.label_user_on_host, account.user, account.host, account.port
         )
         accountSelect.isChecked = selected
       }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/selection/AccountSelectionSlide.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/selection/AccountSelectionSlide.kt
index 88491e67ae14a93a9814326c61d6ef974c8b93de..3a1224b61bc2c6d2ebac907f54bee0fb64456083 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/selection/AccountSelectionSlide.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/selection/AccountSelectionSlide.kt
@@ -27,8 +27,8 @@ class AccountSelectionSlide : SlideFragment() {
 
   override fun isValid() = adapter?.selectedItemId ?: -1L != -1L
 
-  override val title = R.string.slideAccountSelectTitle
-  override val description = R.string.slideAccountSelectDescription
+  override val title = R.string.slide_account_select_title
+  override val description = R.string.slide_account_select_description
 
   override fun setData(data: Bundle) {
     if (data.containsKey("selectedAccount"))
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/setup/AccountSetupConnectionSlide.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/setup/AccountSetupConnectionSlide.kt
index 62dbbed4e783df8c0cf1f6d7286c5d377207ff97..670bb67b6dfc264c9c6c3332aa37547044f3831c 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/setup/AccountSetupConnectionSlide.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/setup/AccountSetupConnectionSlide.kt
@@ -30,7 +30,7 @@ class AccountSetupConnectionSlide : SlideFragment() {
     return hostValidator.isValid && portValidator.isValid
   }
 
-  override val title = R.string.slideAccountConnectionTitle
+  override val title = R.string.slide_account_connection_title
   override val description = R.string.slideAccountConnectionDescription
 
   override fun setData(data: Bundle) {
@@ -51,7 +51,7 @@ class AccountSetupConnectionSlide : SlideFragment() {
     val view = inflater.inflate(R.layout.setup_account_connection, container, false)
     ButterKnife.bind(this, view)
     hostValidator = object : TextValidator(
-      hostWrapper::setError, resources.getString(R.string.hintInvalidHost)
+      hostWrapper::setError, resources.getString(R.string.hint_invalid_host)
     ) {
       override fun validate(text: Editable) =
         text.toString().matches(Patterns.DOMAIN_NAME.toRegex())
@@ -59,7 +59,7 @@ class AccountSetupConnectionSlide : SlideFragment() {
       override fun onChanged() = updateValidity()
     }
     portValidator = object : TextValidator(
-      portWrapper::setError, resources.getString(R.string.hintInvalidPort)
+      portWrapper::setError, resources.getString(R.string.hint_invalid_port)
     ) {
       override fun validate(text: Editable) = text.toString().toIntOrNull() in (0 until 65536)
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/setup/AccountSetupNameSlide.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/setup/AccountSetupNameSlide.kt
index 3b7049fa9d30d3d886700e08bfb6d1542374bece..f062cb3fb4fcf4bf6382b7dea5ec754bc25f99e7 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/setup/AccountSetupNameSlide.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/setup/AccountSetupNameSlide.kt
@@ -23,8 +23,8 @@ class AccountSetupNameSlide : SlideFragment() {
     return nameValidator.isValid
   }
 
-  override val title = R.string.slideAccountNameTitle
-  override val description = R.string.slideAccountNameDescription
+  override val title = R.string.slide_account_name_title
+  override val description = R.string.slide_account_name_description
 
   override fun setData(data: Bundle) {
     if (data.containsKey("name"))
@@ -41,7 +41,7 @@ class AccountSetupNameSlide : SlideFragment() {
     val view = inflater.inflate(R.layout.setup_account_name, container, false)
     ButterKnife.bind(this, view)
     nameValidator = object : TextValidator(
-      nameWrapper::setError, resources.getString(R.string.hintInvalidName)
+      nameWrapper::setError, resources.getString(R.string.hint_invalid_name)
     ) {
       override fun validate(text: Editable) = text.isNotBlank()
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/setup/AccountSetupUserSlide.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/setup/AccountSetupUserSlide.kt
index 088aac61266d3a1d9a22c8959496b98ee681e7e8..e21728510d4cb3f532632a247684b67366070dcd 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/setup/AccountSetupUserSlide.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/setup/accounts/setup/AccountSetupUserSlide.kt
@@ -28,8 +28,8 @@ class AccountSetupUserSlide : SlideFragment() {
     return true
   }
 
-  override val title = R.string.slideAccountUserTitle
-  override val description = R.string.slideAccountUserDescription
+  override val title = R.string.slide_account_user_title
+  override val description = R.string.slide_account_user_description
 
   override fun setData(data: Bundle) {
     if (data.containsKey("user"))
@@ -48,7 +48,7 @@ class AccountSetupUserSlide : SlideFragment() {
     val view = inflater.inflate(R.layout.setup_account_user, container, false)
     ButterKnife.bind(this, view)
     userValidator = object : TextValidator(
-      userWrapper::setError, resources.getString(R.string.hintInvalidUser)
+      userWrapper::setError, resources.getString(R.string.hint_invalid_user)
     ) {
       override fun validate(text: Editable) = text.isNotBlank()
 
diff --git a/app/src/main/res/layout-sw720dp/activity_settings.xml b/app/src/main/res/layout-sw720dp/activity_settings.xml
index 893bde649bed402cfe11c5263d1c46bd5e5e5313..8e7395e7ba80d70e9a1ee1067055f0f9c9b6839c 100644
--- a/app/src/main/res/layout-sw720dp/activity_settings.xml
+++ b/app/src/main/res/layout-sw720dp/activity_settings.xml
@@ -3,11 +3,11 @@
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
-  android:fitsSystemWindows="true">
+  android:background="#eeeeee"
+  android:fitsSystemWindows="true"
+  android:orientation="vertical">
 
-  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
+  <LinearLayout
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:fitsSystemWindows="true"
@@ -15,7 +15,7 @@
 
     <android.support.design.widget.AppBarLayout
       android:layout_width="match_parent"
-      android:layout_height="wrap_content"
+      android:layout_height="172dp"
       android:theme="?attr/actionBarTheme">
 
       <android.support.v7.widget.Toolbar
@@ -27,13 +27,28 @@
 
     </android.support.design.widget.AppBarLayout>
 
-    <fragment
-      android:id="@+id/settingsFragment"
-      android:name="de.kuschku.quasseldroid.ui.settings.SettingsFragment"
-      android:layout_width="600dp"
+    <android.support.v7.widget.CardView
+      android:layout_width="@dimen/max_content_width"
       android:layout_height="match_parent"
       android:layout_gravity="center_horizontal"
-      tools:layout="@xml/preferences" />
-  </LinearLayout>
+      android:layout_marginBottom="32dp"
+      android:layout_marginTop="-64dp"
+      android:clipToPadding="false"
+      app:cardElevation="4dp">
+
+      <android.support.v4.widget.NestedScrollView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:scrollbars="vertical">
 
+        <fragment
+          android:id="@+id/settingsFragment"
+          android:name="de.kuschku.quasseldroid.ui.settings.SettingsFragment"
+          android:layout_width="match_parent"
+          android:layout_height="wrap_content"
+          tools:layout="@xml/preferences" />
+      </android.support.v4.widget.NestedScrollView>
+    </android.support.v7.widget.CardView>
+
+  </LinearLayout>
 </android.support.v4.widget.DrawerLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/preference_vertical.xml b/app/src/main/res/layout/preference_vertical.xml
index fd5c40f8209b917d92ccc714a54b9d6d2b624ad1..0d382f7c3cf092db228727294b060198e1004669 100644
--- a/app/src/main/res/layout/preference_vertical.xml
+++ b/app/src/main/res/layout/preference_vertical.xml
@@ -64,6 +64,7 @@
       android:layout_height="wrap_content"
       android:ellipsize="marquee"
       android:singleLine="true"
+      android:textColor="?android:attr/textColorPrimary"
       android:textSize="16sp"
       tools:text="Font Size" />
 
@@ -78,6 +79,7 @@
     <LinearLayout
       android:id="@android:id/widget_frame"
       android:layout_width="match_parent"
-      android:layout_height="wrap_content" />
+      android:layout_height="wrap_content"
+      android:orientation="vertical" />
   </LinearLayout>
 </LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/setup_account_connection.xml b/app/src/main/res/layout/setup_account_connection.xml
index f217339abc7c29ceb074c2fdcce352cfd96ec164..328f2cb3283c7b87e5a9ca32e69008db6fff8bfd 100644
--- a/app/src/main/res/layout/setup_account_connection.xml
+++ b/app/src/main/res/layout/setup_account_connection.xml
@@ -11,7 +11,7 @@
     android:id="@+id/hostWrapper"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:hint="@string/labelConnectionHost"
+    android:hint="@string/label_connection_host"
     app:errorEnabled="true">
 
     <EditText
diff --git a/app/src/main/res/layout/setup_account_edit.xml b/app/src/main/res/layout/setup_account_edit.xml
index 4397994164a74e6b0be5996b2119fefddbd3174f..b95d98987eee13a6cb2d0050c30588d1791b28f3 100644
--- a/app/src/main/res/layout/setup_account_edit.xml
+++ b/app/src/main/res/layout/setup_account_edit.xml
@@ -36,7 +36,7 @@
         android:id="@+id/nameWrapper"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:hint="@string/labelAccountName"
+        android:hint="@string/label_account_name"
         app:errorEnabled="true">
 
         <EditText
@@ -79,7 +79,7 @@
           android:id="@+id/hostWrapper"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
-          android:hint="@string/labelConnectionHost"
+          android:hint="@string/label_connection_host"
           app:errorEnabled="true">
 
           <EditText
@@ -143,7 +143,7 @@
           android:id="@+id/userWrapper"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
-          android:hint="@string/labelAccountUser">
+          android:hint="@string/label_account_user">
 
           <EditText
             android:id="@+id/user"
@@ -157,7 +157,7 @@
           android:id="@+id/passWrapper"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
-          android:hint="@string/labelAccountPass"
+          android:hint="@string/label_account_pass"
           app:passwordToggleEnabled="true">
 
           <EditText
diff --git a/app/src/main/res/layout/setup_account_name.xml b/app/src/main/res/layout/setup_account_name.xml
index 4de486fd0b252c76593f3724e3bed5c254b61cc1..7321ec065a4564e95f3f2adef275ebd36faf38b6 100644
--- a/app/src/main/res/layout/setup_account_name.xml
+++ b/app/src/main/res/layout/setup_account_name.xml
@@ -9,7 +9,7 @@
     android:id="@+id/nameWrapper"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:hint="@string/labelAccountName"
+    android:hint="@string/label_account_name"
     app:errorEnabled="true">
 
     <EditText
diff --git a/app/src/main/res/layout/setup_account_user.xml b/app/src/main/res/layout/setup_account_user.xml
index 2dda6f38460d2546395648a1654424a0b91ecdf0..60214fa1df96c1389ddff97f841a5bebac4a2d04 100644
--- a/app/src/main/res/layout/setup_account_user.xml
+++ b/app/src/main/res/layout/setup_account_user.xml
@@ -9,7 +9,7 @@
     android:id="@+id/userWrapper"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:hint="@string/labelAccountUser">
+    android:hint="@string/label_account_user">
 
     <EditText
       android:id="@+id/user"
@@ -23,7 +23,7 @@
     android:id="@+id/passWrapper"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:hint="@string/labelAccountPass"
+    android:hint="@string/label_account_pass"
     app:passwordToggleEnabled="true">
 
     <EditText
diff --git a/app/src/main/res/values-de/strings_setup.xml b/app/src/main/res/values-de/strings_setup.xml
index fe97661c53cefe3aa515ca08a3b0eee8837d2837..e24e3a95cdc10cab00895cc5fd8b78839524ac8c 100644
--- a/app/src/main/res/values-de/strings_setup.xml
+++ b/app/src/main/res/values-de/strings_setup.xml
@@ -1,46 +1,46 @@
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
   <!-- Account Selection -->
-  <string name="slideAccountSelectTitle">Account Auswählen</string>
-  <string name="slideAccountSelectDescription">Wähle einen Account aus oder erstelle einen neuen</string>
-  <string name="userOnHost">%1$s @ %2$s:%3$s</string>
+  <string name="slide_account_select_title">Account Auswählen</string>
+  <string name="slide_account_select_description">Wähle einen Account aus oder erstelle einen neuen</string>
+  <string name="label_user_on_host">%1$s @ %2$s:%3$s</string>
 
   <!-- Account Connection -->
-  <string name="slideAccountConnectionTitle">Verbindung</string>
+  <string name="slide_account_connection_title">Verbindung</string>
   <string name="slideAccountConnectionDescription">Bitte gebe an die Addresse des Servers an, auf dem dein Core läuft</string>
 
-  <string name="labelConnectionHost">Hostname</string>
+  <string name="label_connection_host">Hostname</string>
   <string name="labelConnectionPort">Port</string>
 
-  <string name="hintInvalidHost">Ungültiger Hostname</string>
-  <string name="hintInvalidPort">Ungültiger Port</string>
+  <string name="hint_invalid_host">Ungültiger Hostname</string>
+  <string name="hint_invalid_port">Ungültiger Port</string>
 
   <!-- Account User -->
-  <string name="slideAccountUserTitle">Dein Account</string>
-  <string name="slideAccountUserDescription">Bitte gib Benutzernamen und Passwort für deinen Account ein. Falls du noch keinen hast, wird dieser für dich erstellt.</string>
+  <string name="slide_account_user_title">Dein Account</string>
+  <string name="slide_account_user_description">Bitte gib Benutzernamen und Passwort für deinen Account ein. Falls du noch keinen hast, wird dieser für dich erstellt.</string>
 
-  <string name="labelAccountUser">Benutzername</string>
-  <string name="labelAccountPass">Passwort</string>
+  <string name="label_account_user">Benutzername</string>
+  <string name="label_account_pass">Passwort</string>
 
-  <string name="hintInvalidUser">Benutzername darf nicht leer sein</string>
+  <string name="hint_invalid_user">Benutzername darf nicht leer sein</string>
 
   <!-- Account Name -->
-  <string name="slideAccountNameTitle">Account Anpassen</string>
-  <string name="slideAccountNameDescription">Benenne diesen Account</string>
+  <string name="slide_account_name_title">Account Anpassen</string>
+  <string name="slide_account_name_description">Benenne diesen Account</string>
 
-  <string name="labelAccountName">Accountname</string>
+  <string name="label_account_name">Accountname</string>
 
-  <string name="hintInvalidName">Accountname darf nicht leer sein</string>
+  <string name="hint_invalid_name">Accountname darf nicht leer sein</string>
 
   <!-- Core Authenticator Select -->
-  <string name="slideCoreAuthenticatorSelectTitle">Authentifizierungsbackend auswählen</string>
-  <string name="slideCoreAuthenticatorSelectDescription">Bitte wähle aus, welches Authentifizierungsbackend der Quassel Core verwenden soll</string>
+  <string name="slide_core_authenticator_select_title">Authentifizierungsbackend auswählen</string>
+  <string name="slide_core_authenticator_select_description">Bitte wähle aus, welches Authentifizierungsbackend der Quassel Core verwenden soll</string>
 
   <!-- Core Backend Select -->
-  <string name="slideCoreBackendSelectTitle">Datenbank auswählen</string>
-  <string name="slideCoreBackendSelectDescription">Bitte wähle aus, in welchem Datenbankbackend der Quassel Core Nachrichten und andere Daten speichern soll</string>
+  <string name="slide_core_backend_select_title">Datenbank auswählen</string>
+  <string name="slide_core_backend_select_description">Bitte wähle aus, in welchem Datenbankbackend der Quassel Core Nachrichten und andere Daten speichern soll</string>
 
   <!-- Core Backend Config -->
-  <string name="slideCoreBackendSetupTitle">Datenbank konfigurieren</string>
-  <string name="slideCoreBackendSetupDescription">Bitte konfiguriere das ausgewählte Datenbankbackend</string>
+  <string name="slide_core_backend_setup_title">Datenbank konfigurieren</string>
+  <string name="slide_core_backend_setup_description">Bitte konfiguriere das ausgewählte Datenbankbackend</string>
 </resources>
\ No newline at end of file
diff --git a/app/src/main/res/values-sw600dp/dimens.xml b/app/src/main/res/values-sw600dp/dimens.xml
index d5591b01943f2b7105b52250a6640ad0eb936c13..bf1aceae7b34274129ff21278b136edd5f742e99 100644
--- a/app/src/main/res/values-sw600dp/dimens.xml
+++ b/app/src/main/res/values-sw600dp/dimens.xml
@@ -1,3 +1,5 @@
 <resources>
   <dimen name="navigation_drawer_max_width">400dp</dimen>
+
+  <dimen name="max_content_width">600dp</dimen>
 </resources>
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index 21fb8ab65f39b0dce1da370f4ec1ce9d6051fe04..0f762c4fbc4c475e66227ad810ec52da6eafbc66 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -5,4 +5,6 @@
   <dimen name="message_vertical">2dp</dimen>
 
   <dimen name="autocomplete_max_height">96dp</dimen>
+
+  <dimen name="max_content_width">480dp</dimen>
 </resources>
diff --git a/app/src/main/res/values/strings_setup.xml b/app/src/main/res/values/strings_setup.xml
index c5bf1bf09b71bcf7e49390e2c50b85da7e53e4c1..023d168480241145de7be248273dc556ae5eaa61 100644
--- a/app/src/main/res/values/strings_setup.xml
+++ b/app/src/main/res/values/strings_setup.xml
@@ -1,45 +1,45 @@
 <resources>
   <!-- Account Selection -->
-  <string name="slideAccountSelectTitle">Select Account</string>
-  <string name="slideAccountSelectDescription">Please select an account from the list or add one</string>
-  <string name="userOnHost">%1$s on %2$s:%3$d</string>
+  <string name="slide_account_select_title">Select Account</string>
+  <string name="slide_account_select_description">Please select an account from the list or add one</string>
+  <string name="label_user_on_host">%1$s on %2$s:%3$d</string>
 
   <!-- Account Connection -->
-  <string name="slideAccountConnectionTitle">Connection</string>
+  <string name="slide_account_connection_title">Connection</string>
   <string name="slideAccountConnectionDescription">First, please choose which server your core is hosted on.</string>
 
-  <string name="labelConnectionHost">Host</string>
+  <string name="label_connection_host">Host</string>
   <string name="labelConnectionPort">Port</string>
 
-  <string name="hintInvalidHost">Not a valid hostname</string>
-  <string name="hintInvalidPort">Not a valid port</string>
+  <string name="hint_invalid_host">Not a valid hostname</string>
+  <string name="hint_invalid_port">Not a valid port</string>
 
   <!-- Account User -->
-  <string name="slideAccountUserTitle">Your Account</string>
-  <string name="slideAccountUserDescription">Now, please enter the username and password for your account on the core. If you just created that core, we’ll set up this account for you</string>
+  <string name="slide_account_user_title">Your Account</string>
+  <string name="slide_account_user_description">Now, please enter the username and password for your account on the core. If you just created that core, we’ll set up this account for you</string>
 
-  <string name="labelAccountUser">Username</string>
-  <string name="labelAccountPass">Password</string>
+  <string name="label_account_user">Username</string>
+  <string name="label_account_pass">Password</string>
 
-  <string name="hintInvalidUser">Username can not be empty</string>
+  <string name="hint_invalid_user">Username can not be empty</string>
 
   <!-- Account Name -->
-  <string name="slideAccountNameTitle">Customize Account</string>
-  <string name="slideAccountNameDescription">Give this account a name</string>
+  <string name="slide_account_name_title">Customize Account</string>
+  <string name="slide_account_name_description">Give this account a name</string>
 
-  <string name="labelAccountName">Account name</string>
+  <string name="label_account_name">Account name</string>
 
-  <string name="hintInvalidName">Name can not be empty</string>
+  <string name="hint_invalid_name">Name can not be empty</string>
 
   <!-- Core Authenticator Select -->
-  <string name="slideCoreAuthenticatorSelectTitle">Select Authentication Backend</string>
-  <string name="slideCoreAuthenticatorSelectDescription">Please select an authentication backend for the Quassel Core to use for authenticating users.</string>
+  <string name="slide_core_authenticator_select_title">Select Authentication Backend</string>
+  <string name="slide_core_authenticator_select_description">Please select an authentication backend for the Quassel Core to use for authenticating users.</string>
 
   <!-- Core Backend Select -->
-  <string name="slideCoreBackendSelectTitle">Select Storage Backend</string>
-  <string name="slideCoreBackendSelectDescription">Please select a database backend for the Quassel Core storage to store the backlog and other data in.</string>
+  <string name="slide_core_backend_select_title">Select Storage Backend</string>
+  <string name="slide_core_backend_select_description">Please select a database backend for the Quassel Core storage to store the backlog and other data in.</string>
 
   <!-- Core Backend Config -->
-  <string name="slideCoreBackendSetupTitle">Configure Storage Backend</string>
-  <string name="slideCoreBackendSetupDescription">Please configure the selected database backend.</string>
+  <string name="slide_core_backend_setup_title">Configure Storage Backend</string>
+  <string name="slide_core_backend_setup_description">Please configure the selected database backend.</string>
 </resources>
diff --git a/lib/src/main/java/de/kuschku/libquassel/session/Backend.kt b/lib/src/main/java/de/kuschku/libquassel/session/Backend.kt
index 529c0210ae4791aabefe36fee15a672bf741cf92..2af74cb885c257690ecfe9b414079ac684c7d152 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/Backend.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/Backend.kt
@@ -6,4 +6,5 @@ interface Backend {
   fun reconnect()
   fun disconnect(forever: Boolean = false)
   fun sessionManager(): SessionManager
+  fun updateUserDataAndLogin(user: String, pass: String)
 }
diff --git a/lib/src/main/java/de/kuschku/libquassel/session/ISession.kt b/lib/src/main/java/de/kuschku/libquassel/session/ISession.kt
index dfb5118ce5c5542d088fe88131413838173f4dc8..4271747835c602aabd3ceb40f7126b8cf91887f4 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/ISession.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/ISession.kt
@@ -34,6 +34,8 @@ interface ISession : Closeable {
 
   val lag: Observable<Long>
 
+  fun login(user: String, pass: String)
+
   companion object {
     val NULL = object : ISession {
       override val error = BehaviorSubject.create<HandshakeMessage>()
@@ -57,6 +59,8 @@ interface ISession : Closeable {
       override val initStatus: Observable<Pair<Int, Int>> = Observable.just(0 to 0)
       override val lag: Observable<Long> = Observable.just(0L)
 
+      override fun login(user: String, pass: String) = Unit
+
       override fun close() = Unit
     }
   }
diff --git a/lib/src/main/java/de/kuschku/libquassel/session/Session.kt b/lib/src/main/java/de/kuschku/libquassel/session/Session.kt
index cfb0c8528da93a7c32973982898d413cf78a75b4..42707bd164ff13611399e780c0f1613923422cfd 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/Session.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/Session.kt
@@ -20,7 +20,7 @@ class Session(
   address: SocketAddress,
   private val handlerService: HandlerService,
   backlogStorage: BacklogStorage,
-  private val userData: Pair<String, String>
+  private var userData: Pair<String, String>
 ) : ProtocolHandler(), ISession {
   override val features = Features(clientData.clientFeatures, Quassel_Features.of())
 
@@ -77,6 +77,11 @@ class Session(
     )
   }
 
+  override fun login(user: String, pass: String) {
+    userData = Pair(user, pass)
+    login()
+  }
+
   override fun handle(f: HandshakeMessage.CoreSetupAck): Boolean {
     login()
     return true
diff --git a/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt b/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt
index 9294077913652e754e5a0c4666f10eef9aa2c824..d46a638925b11cfaf954c5e899177c06b7a7e5d8 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt
@@ -19,8 +19,6 @@ import javax.net.ssl.X509TrustManager
 class SessionManager(offlineSession: ISession,
                      val backlogStorage: BacklogStorage,
                      val handlerService: HandlerService) : ISession {
-  override val error: Observable<HandshakeMessage>
-    get() = session.or(lastSession).error
   override val features: Features
     get() = session.or(lastSession).features
   override val sslSession: SSLSession?
@@ -64,15 +62,17 @@ class SessionManager(offlineSession: ISession,
 
   private var inProgressSession = BehaviorSubject.createDefault(ISession.NULL)
   private var lastSession: ISession = offlineSession
-  override val state: Observable<ConnectionState> = inProgressSession.switchMap { it.state }
+  override val state: Observable<ConnectionState> = inProgressSession.switchMap(ISession::state)
 
-  override val initStatus: Observable<Pair<Int, Int>> = inProgressSession.switchMap { it.initStatus }
+  override val initStatus: Observable<Pair<Int, Int>> = inProgressSession.switchMap(ISession::initStatus)
   val session: Observable<ISession> = state.map { connectionState ->
     if (connectionState == ConnectionState.CONNECTED)
       inProgressSession.value
     else
       lastSession
   }
+  override val error: Observable<HandshakeMessage>
+    get() = inProgressSession.switchMap(ISession::error)
 
   val connectionProgress: Observable<Triple<ConnectionState, Int, Int>> = Observable.combineLatest(
     state, initStatus,
@@ -149,4 +149,8 @@ class SessionManager(offlineSession: ISession,
     inProgressSession.value.close()
     inProgressSession.onNext(ISession.NULL)
   }
+
+  override fun login(user: String, pass: String) {
+    inProgressSession.value.login(user, pass)
+  }
 }
diff --git a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt
index 943e12ae6d2b2e0bae1517164e5816e078bb1bba..6ff16c3e9fe831820f705031375e05215530993d 100644
--- a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt
+++ b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt
@@ -4,6 +4,7 @@ import android.arch.lifecycle.ViewModel
 import de.kuschku.libquassel.protocol.BufferId
 import de.kuschku.libquassel.protocol.Buffer_Type
 import de.kuschku.libquassel.protocol.NetworkId
+import de.kuschku.libquassel.protocol.message.HandshakeMessage
 import de.kuschku.libquassel.quassel.BufferInfo
 import de.kuschku.libquassel.quassel.syncables.BufferViewConfig
 import de.kuschku.libquassel.quassel.syncables.IrcChannel
@@ -60,7 +61,7 @@ class QuasselViewModel : ViewModel() {
     }
   }
 
-  val errors = session.mapSwitchMapEmpty(ISession::error)
+  val errors = sessionManager.mapSwitchMap(SessionManager::error)
   val errors_liveData = errors.toLiveData()
 
   /**