diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f4689def01026e6b32088f758fffbe759f25c953..d7b29b283f5d79f8a3a620aeb30fc53c5d8d052f 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -10,9 +10,9 @@
   <application
     android:name=".QuasselDroid"
     android:allowBackup="true"
+    android:description="@string/app_description"
     android:icon="@mipmap/ic_launcher"
     android:label="@string/app_name"
-    android:description="@string/app_description"
     android:supportsRtl="true"
     android:theme="@style/Theme.SplashTheme">
     <activity
@@ -53,28 +53,40 @@
       android:parentActivityName=".ui.setup.accounts.selection.AccountSelectionActivity"
       android:windowSoftInputMode="adjustResize" />
     <activity
-      android:name=".ui.settings.app.AppSettingsActivity"
+      android:name=".ui.coresettings.CoreSettingsActivity"
+      android:exported="false"
+      android:label="@string/label_settings_core"
+      android:parentActivityName=".ui.chat.ChatActivity"
+      android:windowSoftInputMode="adjustResize" />
+    <activity
+      android:name=".ui.coresettings.networkconfig.NetworkConfigActivity"
+      android:exported="false"
+      android:label="@string/settings_networkconfig_title"
+      android:parentActivityName=".ui.chat.ChatActivity"
+      android:windowSoftInputMode="adjustResize" />
+    <activity
+      android:name=".ui.clientsettings.app.AppSettingsActivity"
       android:exported="false"
-      android:label="@string/label_settings"
+      android:label="@string/label_settings_client"
       android:parentActivityName=".ui.chat.ChatActivity"
       android:windowSoftInputMode="adjustResize" />
     <activity
-      android:name=".ui.settings.crash.CrashSettingsActivity"
+      android:name=".ui.clientsettings.crash.CrashSettingsActivity"
       android:exported="false"
       android:label="@string/label_crashes"
-      android:parentActivityName=".ui.settings.app.AppSettingsActivity"
+      android:parentActivityName=".ui.clientsettings.app.AppSettingsActivity"
       android:windowSoftInputMode="adjustResize" />
     <activity
-      android:name=".ui.settings.about.AboutSettingsActivity"
+      android:name=".ui.clientsettings.about.AboutSettingsActivity"
       android:exported="false"
       android:label="@string/label_about"
-      android:parentActivityName=".ui.settings.app.AppSettingsActivity"
+      android:parentActivityName=".ui.clientsettings.app.AppSettingsActivity"
       android:windowSoftInputMode="adjustResize" />
     <activity
-      android:name=".ui.settings.license.LicenseSettingsActivity"
+      android:name=".ui.clientsettings.license.LicenseSettingsActivity"
       android:exported="false"
       android:label="@string/label_license"
-      android:parentActivityName=".ui.settings.about.AboutSettingsActivity"
+      android:parentActivityName=".ui.clientsettings.about.AboutSettingsActivity"
       android:windowSoftInputMode="adjustResize" />
 
     <activity
diff --git a/app/src/main/java/de/kuschku/quasseldroid/dagger/ActivityModule.kt b/app/src/main/java/de/kuschku/quasseldroid/dagger/ActivityModule.kt
index e85d1de4af1b89f14c6a35d3f3bca787cfd09443..c8324a735f87bff4b5b3f3a6c65041fed1087dea 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/dagger/ActivityModule.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/dagger/ActivityModule.kt
@@ -8,14 +8,18 @@ import de.kuschku.quasseldroid.ui.chat.ChatActivityModule
 import de.kuschku.quasseldroid.ui.chat.ChatFragmentProvider
 import de.kuschku.quasseldroid.ui.chat.info.InfoActivity
 import de.kuschku.quasseldroid.ui.chat.info.InfoFragmentProvider
-import de.kuschku.quasseldroid.ui.settings.about.AboutSettingsActivity
-import de.kuschku.quasseldroid.ui.settings.about.AboutSettingsFragmentProvider
-import de.kuschku.quasseldroid.ui.settings.app.AppSettingsActivity
-import de.kuschku.quasseldroid.ui.settings.app.AppSettingsFragmentProvider
-import de.kuschku.quasseldroid.ui.settings.crash.CrashSettingsActivity
-import de.kuschku.quasseldroid.ui.settings.crash.CrashSettingsFragmentProvider
-import de.kuschku.quasseldroid.ui.settings.license.LicenseSettingsActivity
-import de.kuschku.quasseldroid.ui.settings.license.LicenseSettingsFragmentProvider
+import de.kuschku.quasseldroid.ui.clientsettings.about.AboutSettingsActivity
+import de.kuschku.quasseldroid.ui.clientsettings.about.AboutSettingsFragmentProvider
+import de.kuschku.quasseldroid.ui.clientsettings.app.AppSettingsActivity
+import de.kuschku.quasseldroid.ui.clientsettings.app.AppSettingsFragmentProvider
+import de.kuschku.quasseldroid.ui.clientsettings.crash.CrashSettingsActivity
+import de.kuschku.quasseldroid.ui.clientsettings.crash.CrashSettingsFragmentProvider
+import de.kuschku.quasseldroid.ui.clientsettings.license.LicenseSettingsActivity
+import de.kuschku.quasseldroid.ui.clientsettings.license.LicenseSettingsFragmentProvider
+import de.kuschku.quasseldroid.ui.coresettings.CoreSettingsActivity
+import de.kuschku.quasseldroid.ui.coresettings.CoreSettingsFragmentProvider
+import de.kuschku.quasseldroid.ui.coresettings.networkconfig.NetworkConfigActivity
+import de.kuschku.quasseldroid.ui.coresettings.networkconfig.NetworkConfigFragmentProvider
 import de.kuschku.quasseldroid.ui.setup.accounts.edit.AccountEditActivity
 import de.kuschku.quasseldroid.ui.setup.accounts.selection.AccountSelectionActivity
 import de.kuschku.quasseldroid.ui.setup.accounts.selection.AccountSelectionFragmentProvider
@@ -42,6 +46,12 @@ abstract class ActivityModule {
   @ContributesAndroidInjector(modules = [LicenseSettingsFragmentProvider::class])
   abstract fun bindLicenseSettingsActivity(): LicenseSettingsActivity
 
+  @ContributesAndroidInjector(modules = [CoreSettingsFragmentProvider::class])
+  abstract fun bindCoreSettingsActivity(): CoreSettingsActivity
+
+  @ContributesAndroidInjector(modules = [NetworkConfigFragmentProvider::class])
+  abstract fun bindNetworkConfigActivity(): NetworkConfigActivity
+
   @ContributesAndroidInjector(modules = [AccountSetupFragmentProvider::class])
   abstract fun bindAccountSetupActivity(): AccountSetupActivity
 
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 8552ed8d6a65e920bd23f536ef9e015854b5423b..d5be1e3fc90b9faaf0aa237ea5fbfcf9caceec8d 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
@@ -36,7 +36,8 @@ import de.kuschku.quasseldroid.settings.MessageSettings
 import de.kuschku.quasseldroid.settings.Settings
 import de.kuschku.quasseldroid.ui.chat.input.Editor
 import de.kuschku.quasseldroid.ui.chat.input.MessageHistoryAdapter
-import de.kuschku.quasseldroid.ui.settings.app.AppSettingsActivity
+import de.kuschku.quasseldroid.ui.clientsettings.app.AppSettingsActivity
+import de.kuschku.quasseldroid.ui.coresettings.CoreSettingsActivity
 import de.kuschku.quasseldroid.util.helper.editCommit
 import de.kuschku.quasseldroid.util.helper.invoke
 import de.kuschku.quasseldroid.util.helper.retint
@@ -403,8 +404,12 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc
       }
       true
     }
-    R.id.action_settings        -> {
-      startActivity(Intent(applicationContext, AppSettingsActivity::class.java))
+    R.id.action_core_settings   -> {
+      startActivity(Intent(this, CoreSettingsActivity::class.java))
+      true
+    }
+    R.id.action_client_settings -> {
+      startActivity(Intent(this, AppSettingsActivity::class.java))
       true
     }
     R.id.action_disconnect      -> {
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoActivity.kt
index b8bc0e93a23ce09a8bd02e2c675fde00ba1d748b..bae8074b29ff95b78b9c30a9cafdefee85fd0ca4 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoActivity.kt
@@ -1,5 +1,5 @@
 package de.kuschku.quasseldroid.ui.chat.info
 
-import de.kuschku.quasseldroid.ui.settings.SettingsActivity
+import de.kuschku.quasseldroid.util.ui.SettingsActivity
 
 class InfoActivity : SettingsActivity(InfoFragment())
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/about/AboutSettingsActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/about/AboutSettingsActivity.kt
new file mode 100644
index 0000000000000000000000000000000000000000..8997104a51be1d8f632922c46252c952bdb0c820
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/about/AboutSettingsActivity.kt
@@ -0,0 +1,5 @@
+package de.kuschku.quasseldroid.ui.clientsettings.about
+
+import de.kuschku.quasseldroid.util.ui.SettingsActivity
+
+class AboutSettingsActivity : SettingsActivity(AboutSettingsFragment())
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/AboutSettingsFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/about/AboutSettingsFragment.kt
similarity index 99%
rename from app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/AboutSettingsFragment.kt
rename to app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/about/AboutSettingsFragment.kt
index 9de5af5a606b7e630c51156d6b9944214733a972..3d86df20c4220fbdb0b5dc01bb77a39836bf2a12 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/AboutSettingsFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/about/AboutSettingsFragment.kt
@@ -1,4 +1,4 @@
-package de.kuschku.quasseldroid.ui.settings.about
+package de.kuschku.quasseldroid.ui.clientsettings.about
 
 import android.content.Intent
 import android.net.Uri
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/AboutSettingsFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/about/AboutSettingsFragmentProvider.kt
similarity index 80%
rename from app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/AboutSettingsFragmentProvider.kt
rename to app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/about/AboutSettingsFragmentProvider.kt
index e12cd9aef80451c27f39cf33e3b631b8bac55e66..29251635e7136978237b8971c1a3b306122eecdd 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/AboutSettingsFragmentProvider.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/about/AboutSettingsFragmentProvider.kt
@@ -1,4 +1,4 @@
-package de.kuschku.quasseldroid.ui.settings.about
+package de.kuschku.quasseldroid.ui.clientsettings.about
 
 import dagger.Module
 import dagger.android.ContributesAndroidInjector
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/Contributor.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/about/Contributor.kt
similarity index 63%
rename from app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/Contributor.kt
rename to app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/about/Contributor.kt
index 30ba46c4bcc0544582e3c3368075b28029d577a4..d90d86e1c772914eee90af71217b5e8279f9a6ee 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/Contributor.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/about/Contributor.kt
@@ -1,4 +1,4 @@
-package de.kuschku.quasseldroid.ui.settings.about
+package de.kuschku.quasseldroid.ui.clientsettings.about
 
 data class Contributor(
   val name: String,
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/ContributorAdapter.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/about/ContributorAdapter.kt
similarity index 95%
rename from app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/ContributorAdapter.kt
rename to app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/about/ContributorAdapter.kt
index 91ed4cdb322f83658c41c09f83c67b60ea323f62..a5a3e7dfbbcb54437dc0d5de4d67baeb600446d6 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/ContributorAdapter.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/about/ContributorAdapter.kt
@@ -1,4 +1,4 @@
-package de.kuschku.quasseldroid.ui.settings.about
+package de.kuschku.quasseldroid.ui.clientsettings.about
 
 import android.support.v7.widget.RecyclerView
 import android.view.LayoutInflater
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/Library.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/about/Library.kt
similarity index 67%
rename from app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/Library.kt
rename to app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/about/Library.kt
index 2621adf0921c08907e664c5ab246b6b5ec4eda56..87230d5487c9deadb44e61d671d9dbd5a24299e9 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/Library.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/about/Library.kt
@@ -1,4 +1,4 @@
-package de.kuschku.quasseldroid.ui.settings.about
+package de.kuschku.quasseldroid.ui.clientsettings.about
 
 data class Library(
   val name: String,
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/LibraryAdapter.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/about/LibraryAdapter.kt
similarity index 92%
rename from app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/LibraryAdapter.kt
rename to app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/about/LibraryAdapter.kt
index f2cfb94bff18f2b1d89fb07c30950b03621df109..f63a6f3ae4e5ab415423dc130f5365abc24ea656 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/LibraryAdapter.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/about/LibraryAdapter.kt
@@ -1,4 +1,4 @@
-package de.kuschku.quasseldroid.ui.settings.about
+package de.kuschku.quasseldroid.ui.clientsettings.about
 
 import android.content.Intent
 import android.support.v7.widget.RecyclerView
@@ -9,7 +9,7 @@ import android.widget.TextView
 import butterknife.BindView
 import butterknife.ButterKnife
 import de.kuschku.quasseldroid.R
-import de.kuschku.quasseldroid.ui.settings.license.LicenseSettingsActivity
+import de.kuschku.quasseldroid.ui.clientsettings.license.LicenseSettingsActivity
 
 class LibraryAdapter(private val libraries: List<Library>) :
   RecyclerView.Adapter<LibraryAdapter.LibraryViewHolder>() {
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/License.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/about/License.kt
similarity index 73%
rename from app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/License.kt
rename to app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/about/License.kt
index 08e21f53b05644aedcfad004be798ec0c7614cc3..29e4db909c3685f22fb55c0629d030d1302fe41d 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/License.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/about/License.kt
@@ -1,4 +1,4 @@
-package de.kuschku.quasseldroid.ui.settings.about
+package de.kuschku.quasseldroid.ui.clientsettings.about
 
 import android.support.annotation.StringRes
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/app/AppSettingsActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/app/AppSettingsActivity.kt
similarity index 74%
rename from app/src/main/java/de/kuschku/quasseldroid/ui/settings/app/AppSettingsActivity.kt
rename to app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/app/AppSettingsActivity.kt
index 7dcbb7f02931096d10e1a04ed83077009891b924..5bb8ffefa471b0449aa37323f1f12f24672f6a1a 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/app/AppSettingsActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/app/AppSettingsActivity.kt
@@ -1,12 +1,12 @@
-package de.kuschku.quasseldroid.ui.settings.app
+package de.kuschku.quasseldroid.ui.clientsettings.app
 
 import android.content.Intent
 import android.view.Menu
 import android.view.MenuItem
 import de.kuschku.quasseldroid.R
-import de.kuschku.quasseldroid.ui.settings.SettingsActivity
-import de.kuschku.quasseldroid.ui.settings.about.AboutSettingsActivity
-import de.kuschku.quasseldroid.ui.settings.crash.CrashSettingsActivity
+import de.kuschku.quasseldroid.ui.clientsettings.about.AboutSettingsActivity
+import de.kuschku.quasseldroid.ui.clientsettings.crash.CrashSettingsActivity
+import de.kuschku.quasseldroid.util.ui.SettingsActivity
 
 class AppSettingsActivity : SettingsActivity(AppSettingsFragment()) {
   override fun onCreateOptionsMenu(menu: Menu?): Boolean {
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/app/AppSettingsFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/app/AppSettingsFragment.kt
similarity index 97%
rename from app/src/main/java/de/kuschku/quasseldroid/ui/settings/app/AppSettingsFragment.kt
rename to app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/app/AppSettingsFragment.kt
index 08abd25c9b46f92a441d8ea30dd7d2ae1997bfa4..7981dc1f0808fa666ddc8a2246126fc63adfb070 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/app/AppSettingsFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/app/AppSettingsFragment.kt
@@ -1,4 +1,4 @@
-package de.kuschku.quasseldroid.ui.settings.app
+package de.kuschku.quasseldroid.ui.clientsettings.app
 
 import android.content.SharedPreferences
 import android.os.Bundle
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/app/AppSettingsFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/app/AppSettingsFragmentProvider.kt
similarity index 80%
rename from app/src/main/java/de/kuschku/quasseldroid/ui/settings/app/AppSettingsFragmentProvider.kt
rename to app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/app/AppSettingsFragmentProvider.kt
index 15b0a5bd5155767b6cda6170cbe5710c4533ff8a..1c005598fa311b93ff02756790d158cb17b4edf4 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/app/AppSettingsFragmentProvider.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/app/AppSettingsFragmentProvider.kt
@@ -1,4 +1,4 @@
-package de.kuschku.quasseldroid.ui.settings.app
+package de.kuschku.quasseldroid.ui.clientsettings.app
 
 import dagger.Module
 import dagger.android.ContributesAndroidInjector
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/crash/CrashAdapter.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/crash/CrashAdapter.kt
similarity index 97%
rename from app/src/main/java/de/kuschku/quasseldroid/ui/settings/crash/CrashAdapter.kt
rename to app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/crash/CrashAdapter.kt
index e65d8d47c4dbbcc45bc88c5b52ff608a9cc917fd..6c6ee0acca84ec803013cfd8645abdaddc516a19 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/crash/CrashAdapter.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/crash/CrashAdapter.kt
@@ -1,4 +1,4 @@
-package de.kuschku.quasseldroid.ui.settings.crash
+package de.kuschku.quasseldroid.ui.clientsettings.crash
 
 import android.content.Intent
 import android.support.v7.recyclerview.extensions.ListAdapter
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/crash/CrashSettingsActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/crash/CrashSettingsActivity.kt
new file mode 100644
index 0000000000000000000000000000000000000000..4a2be941aae6b5ef00051fe0c86a4a96a24ebdff
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/crash/CrashSettingsActivity.kt
@@ -0,0 +1,5 @@
+package de.kuschku.quasseldroid.ui.clientsettings.crash
+
+import de.kuschku.quasseldroid.util.ui.SettingsActivity
+
+class CrashSettingsActivity : SettingsActivity(CrashSettingsFragment())
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/crash/CrashSettingsFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/crash/CrashSettingsFragment.kt
similarity index 98%
rename from app/src/main/java/de/kuschku/quasseldroid/ui/settings/crash/CrashSettingsFragment.kt
rename to app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/crash/CrashSettingsFragment.kt
index 341a591a84fd58e5813c1d6d8f0905a38f499bea..b3e3fff994a7ba74e0fae4628d42bfd7cba5e89f 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/crash/CrashSettingsFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/crash/CrashSettingsFragment.kt
@@ -1,4 +1,4 @@
-package de.kuschku.quasseldroid.ui.settings.crash
+package de.kuschku.quasseldroid.ui.clientsettings.crash
 
 import android.content.Context
 import android.os.Bundle
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/crash/CrashSettingsFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/crash/CrashSettingsFragmentProvider.kt
similarity index 79%
rename from app/src/main/java/de/kuschku/quasseldroid/ui/settings/crash/CrashSettingsFragmentProvider.kt
rename to app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/crash/CrashSettingsFragmentProvider.kt
index 3cb243e5f8695de64838b5828b1b0f7ce7a2f0b9..7d7c78eab97d8d01402d09d60d1d2e3545445e2b 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/crash/CrashSettingsFragmentProvider.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/crash/CrashSettingsFragmentProvider.kt
@@ -1,4 +1,4 @@
-package de.kuschku.quasseldroid.ui.settings.crash
+package de.kuschku.quasseldroid.ui.clientsettings.crash
 
 import dagger.Module
 import dagger.android.ContributesAndroidInjector
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/license/LicenseSettingsActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/license/LicenseSettingsActivity.kt
new file mode 100644
index 0000000000000000000000000000000000000000..24177ec86de797e0aa81421f94cb7b428b3616f7
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/license/LicenseSettingsActivity.kt
@@ -0,0 +1,5 @@
+package de.kuschku.quasseldroid.ui.clientsettings.license
+
+import de.kuschku.quasseldroid.util.ui.SettingsActivity
+
+class LicenseSettingsActivity : SettingsActivity()
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/license/LicenseSettingsFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/license/LicenseSettingsFragment.kt
similarity index 94%
rename from app/src/main/java/de/kuschku/quasseldroid/ui/settings/license/LicenseSettingsFragment.kt
rename to app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/license/LicenseSettingsFragment.kt
index 5e5fe63c9d1fafee264fe645d07f7f0748880dc5..b597440f8aee9eae5f50a97485178e27de7fb81b 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/license/LicenseSettingsFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/license/LicenseSettingsFragment.kt
@@ -1,4 +1,4 @@
-package de.kuschku.quasseldroid.ui.settings.license
+package de.kuschku.quasseldroid.ui.clientsettings.license
 
 import android.os.Bundle
 import android.text.Html
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/license/LicenseSettingsFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/license/LicenseSettingsFragmentProvider.kt
similarity index 79%
rename from app/src/main/java/de/kuschku/quasseldroid/ui/settings/license/LicenseSettingsFragmentProvider.kt
rename to app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/license/LicenseSettingsFragmentProvider.kt
index 03c5df1fe9dc9b9160166f9128641ceee7ddbde2..86cc6cff6a368e3d45326cbf36a88833ef2adc47 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/license/LicenseSettingsFragmentProvider.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/license/LicenseSettingsFragmentProvider.kt
@@ -1,4 +1,4 @@
-package de.kuschku.quasseldroid.ui.settings.license
+package de.kuschku.quasseldroid.ui.clientsettings.license
 
 import dagger.Module
 import dagger.android.ContributesAndroidInjector
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/CoreSettingsActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/CoreSettingsActivity.kt
new file mode 100644
index 0000000000000000000000000000000000000000..09f567bbbe630a9314576e73050e2b99bb0c2fc6
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/CoreSettingsActivity.kt
@@ -0,0 +1,5 @@
+package de.kuschku.quasseldroid.ui.coresettings
+
+import de.kuschku.quasseldroid.util.ui.SettingsActivity
+
+class CoreSettingsActivity : SettingsActivity(CoreSettingsFragment())
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/CoreSettingsFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/CoreSettingsFragment.kt
new file mode 100644
index 0000000000000000000000000000000000000000..311ba0a6e363e779a2e2db756c88e8c8d336a520
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/CoreSettingsFragment.kt
@@ -0,0 +1,82 @@
+package de.kuschku.quasseldroid.ui.coresettings
+
+import android.content.Intent
+import android.os.Bundle
+import android.support.v7.widget.LinearLayoutManager
+import android.support.v7.widget.RecyclerView
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.TextView
+import butterknife.BindView
+import butterknife.ButterKnife
+import de.kuschku.quasseldroid.R
+import de.kuschku.quasseldroid.ui.coresettings.networkconfig.NetworkConfigActivity
+import de.kuschku.quasseldroid.util.helper.visibleIf
+import de.kuschku.quasseldroid.util.service.ServiceBoundFragment
+
+class CoreSettingsFragment : ServiceBoundFragment() {
+  @BindView(R.id.list)
+  lateinit var list: RecyclerView
+
+  override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
+                            savedInstanceState: Bundle?): View? {
+    val view = inflater.inflate(R.layout.fragment_coresettings, container, false)
+    ButterKnife.bind(this, view)
+
+    list.layoutManager = LinearLayoutManager(context)
+    list.adapter = CoreSettingsAdapter(listOf(
+      CoreSetting(
+        getString(R.string.settings_networkconfig_title),
+        getString(R.string.settings_networkconfig_description),
+        Intent(requireContext(), NetworkConfigActivity::class.java)
+      )
+    ))
+
+    return view
+  }
+
+  data class CoreSetting(
+    val title: CharSequence,
+    val summary: CharSequence? = null,
+    val intent: Intent? = null
+  )
+
+  class CoreSettingsAdapter(private val data: List<CoreSetting>) :
+    RecyclerView.Adapter<CoreSettingsAdapter.CoreSettingsViewHolder>() {
+    override fun getItemCount() = data.size
+
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = CoreSettingsViewHolder(
+      LayoutInflater.from(parent.context).inflate(R.layout.widget_coresetting, parent, false)
+    )
+
+    override fun onBindViewHolder(holder: CoreSettingsViewHolder, position: Int) {
+      holder.bind(data[position])
+    }
+
+    class CoreSettingsViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
+      @BindView(R.id.title)
+      lateinit var title: TextView
+
+      @BindView(R.id.summary)
+      lateinit var summary: TextView
+
+      var item: CoreSetting? = null
+
+      init {
+        ButterKnife.bind(this, itemView)
+        itemView.setOnClickListener {
+          item?.intent?.let(itemView.context::startActivity)
+        }
+      }
+
+      fun bind(item: CoreSetting) {
+        this.item = item
+
+        this.title.text = item.title
+        this.summary.text = item.summary
+        this.summary.visibleIf(!item.summary.isNullOrBlank())
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/CoreSettingsFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/CoreSettingsFragmentProvider.kt
new file mode 100644
index 0000000000000000000000000000000000000000..2b0e5768aeeff6dab8ebdc5c9a75b6ffa89b7380
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/CoreSettingsFragmentProvider.kt
@@ -0,0 +1,10 @@
+package de.kuschku.quasseldroid.ui.coresettings
+
+import dagger.Module
+import dagger.android.ContributesAndroidInjector
+
+@Module
+abstract class CoreSettingsFragmentProvider {
+  @ContributesAndroidInjector
+  abstract fun CoreSettingsFragmentbind(): CoreSettingsFragment
+}
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/SettingsFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/SettingsFragment.kt
new file mode 100644
index 0000000000000000000000000000000000000000..7d580fb37d1f8dba18fd833ae34ad62dd199d929
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/SettingsFragment.kt
@@ -0,0 +1,30 @@
+package de.kuschku.quasseldroid.ui.coresettings
+
+import android.os.Bundle
+import android.view.Menu
+import android.view.MenuInflater
+import android.view.MenuItem
+import de.kuschku.quasseldroid.R
+import de.kuschku.quasseldroid.util.service.ServiceBoundFragment
+
+abstract class SettingsFragment : ServiceBoundFragment() {
+  override fun onCreate(savedInstanceState: Bundle?) {
+    super.onCreate(savedInstanceState)
+    setHasOptionsMenu(true)
+  }
+
+  override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) {
+    inflater?.inflate(R.menu.context_setting, menu)
+    super.onCreateOptionsMenu(menu, inflater)
+  }
+
+  override fun onOptionsItemSelected(item: MenuItem?) = when (item?.itemId) {
+    R.id.action_save -> {
+      onSave()
+      true
+    }
+    else             -> super.onOptionsItemSelected(item)
+  }
+
+  abstract fun onSave()
+}
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/networkconfig/NetworkConfigActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/networkconfig/NetworkConfigActivity.kt
new file mode 100644
index 0000000000000000000000000000000000000000..525bed7365faa1bca511cc61dc469862384f75f7
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/networkconfig/NetworkConfigActivity.kt
@@ -0,0 +1,5 @@
+package de.kuschku.quasseldroid.ui.coresettings.networkconfig
+
+import de.kuschku.quasseldroid.util.ui.SettingsActivity
+
+class NetworkConfigActivity : SettingsActivity(NetworkConfigFragment())
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/networkconfig/NetworkConfigFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/networkconfig/NetworkConfigFragment.kt
new file mode 100644
index 0000000000000000000000000000000000000000..972ac1a518f4e1ece6bb322c6d9de7233c8599f7
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/networkconfig/NetworkConfigFragment.kt
@@ -0,0 +1,101 @@
+package de.kuschku.quasseldroid.ui.coresettings.networkconfig
+
+import android.arch.lifecycle.Observer
+import android.os.Bundle
+import android.support.v7.widget.SwitchCompat
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.EditText
+import butterknife.BindView
+import butterknife.ButterKnife
+import de.kuschku.libquassel.quassel.syncables.NetworkConfig
+import de.kuschku.libquassel.session.ISession
+import de.kuschku.quasseldroid.R
+import de.kuschku.quasseldroid.ui.coresettings.SettingsFragment
+import de.kuschku.quasseldroid.util.helper.setDependent
+import de.kuschku.quasseldroid.util.helper.toLiveData
+
+class NetworkConfigFragment : SettingsFragment() {
+  private var networkConfig: NetworkConfig? = null
+
+  @BindView(R.id.ping_timeout_enabled)
+  lateinit var pingTimeoutEnabled: SwitchCompat
+
+  @BindView(R.id.ping_timeout_group)
+  lateinit var pingTimeoutGroup: ViewGroup
+
+  @BindView(R.id.ping_interval)
+  lateinit var pingInterval: EditText
+
+  @BindView(R.id.max_ping_count)
+  lateinit var maxPingCount: EditText
+
+  @BindView(R.id.auto_who_enabled)
+  lateinit var autoWhoEnabled: SwitchCompat
+
+  @BindView(R.id.auto_who_group)
+  lateinit var autoWhoGroup: ViewGroup
+
+  @BindView(R.id.auto_who_interval)
+  lateinit var autoWhoInterval: EditText
+
+  @BindView(R.id.auto_who_nick_limit)
+  lateinit var autoWhoNickLimit: EditText
+
+  @BindView(R.id.auto_who_delay)
+  lateinit var autoWhoDelay: EditText
+
+  @BindView(R.id.standard_ctcp)
+  lateinit var standardCtcp: SwitchCompat
+
+  override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
+                            savedInstanceState: Bundle?): View? {
+    val view = inflater.inflate(R.layout.fragment_networksettings, container, false)
+    ButterKnife.bind(this, view)
+
+    setHasOptionsMenu(true)
+
+    viewModel.session.map { it.map(ISession::networkConfig) }.toLiveData().observe(this, Observer {
+      it?.orNull()?.let {
+        this.networkConfig = it
+
+        pingTimeoutEnabled.isChecked = it.pingTimeoutEnabled()
+        pingInterval.setText(it.pingInterval().toString())
+        maxPingCount.setText(it.maxPingCount().toString())
+
+        autoWhoEnabled.isChecked = it.autoWhoEnabled()
+        autoWhoInterval.setText(it.autoWhoInterval().toString())
+        autoWhoNickLimit.setText(it.autoWhoNickLimit().toString())
+        autoWhoDelay.setText(it.autoWhoDelay().toString())
+
+        standardCtcp.isChecked = it.standardCtcp()
+      }
+    })
+
+    pingTimeoutEnabled.setDependent(pingTimeoutGroup)
+    autoWhoEnabled.setDependent(autoWhoGroup)
+
+    return view
+  }
+
+
+  override fun onSave() {
+    networkConfig?.let {
+      val config = it.copy()
+
+      config.setPingTimeoutEnabled(pingTimeoutEnabled.isChecked)
+      pingInterval.text.toString().toIntOrNull()?.let(config::setPingInterval)
+      maxPingCount.text.toString().toIntOrNull()?.let(config::setMaxPingCount)
+
+      config.setAutoWhoEnabled(autoWhoEnabled.isChecked)
+      autoWhoInterval.text.toString().toIntOrNull()?.let(config::setAutoWhoInterval)
+      autoWhoNickLimit.text.toString().toIntOrNull()?.let(config::setAutoWhoNickLimit)
+      autoWhoDelay.text.toString().toIntOrNull()?.let(config::setAutoWhoDelay)
+      config.setStandardCtcp(standardCtcp.isChecked)
+
+      val properties = config.toVariantMap()
+      it.requestUpdate(properties)
+    }
+  }
+}
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/networkconfig/NetworkConfigFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/networkconfig/NetworkConfigFragmentProvider.kt
new file mode 100644
index 0000000000000000000000000000000000000000..f697f8a9363a27c6b95b1af6d2461c40e28b214e
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/networkconfig/NetworkConfigFragmentProvider.kt
@@ -0,0 +1,10 @@
+package de.kuschku.quasseldroid.ui.coresettings.networkconfig
+
+import dagger.Module
+import dagger.android.ContributesAndroidInjector
+
+@Module
+abstract class NetworkConfigFragmentProvider {
+  @ContributesAndroidInjector
+  abstract fun bindNetworkConfigFragment(): NetworkConfigFragment
+}
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/AboutSettingsActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/AboutSettingsActivity.kt
deleted file mode 100644
index 5f6d1701ffae3e14f8ff28baf0ce63e740208682..0000000000000000000000000000000000000000
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/AboutSettingsActivity.kt
+++ /dev/null
@@ -1,5 +0,0 @@
-package de.kuschku.quasseldroid.ui.settings.about
-
-import de.kuschku.quasseldroid.ui.settings.SettingsActivity
-
-class AboutSettingsActivity : SettingsActivity(AboutSettingsFragment())
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/crash/CrashSettingsActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/crash/CrashSettingsActivity.kt
deleted file mode 100644
index 5d21e0bc9cd57b6ece0408a3af5970ff04445184..0000000000000000000000000000000000000000
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/crash/CrashSettingsActivity.kt
+++ /dev/null
@@ -1,5 +0,0 @@
-package de.kuschku.quasseldroid.ui.settings.crash
-
-import de.kuschku.quasseldroid.ui.settings.SettingsActivity
-
-class CrashSettingsActivity : SettingsActivity(CrashSettingsFragment())
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/license/LicenseSettingsActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/settings/license/LicenseSettingsActivity.kt
deleted file mode 100644
index 01947a6407f984f67581038d97f4fc4ac687ffd2..0000000000000000000000000000000000000000
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/license/LicenseSettingsActivity.kt
+++ /dev/null
@@ -1,5 +0,0 @@
-package de.kuschku.quasseldroid.ui.settings.license
-
-import de.kuschku.quasseldroid.ui.settings.SettingsActivity
-
-class LicenseSettingsActivity : SettingsActivity()
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/helper/SwitchCompatHelper.kt b/app/src/main/java/de/kuschku/quasseldroid/util/helper/SwitchCompatHelper.kt
new file mode 100644
index 0000000000000000000000000000000000000000..aff438caa67c1edfb0346a1a91c60ac9b8f2290b
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/util/helper/SwitchCompatHelper.kt
@@ -0,0 +1,15 @@
+package de.kuschku.quasseldroid.util.helper
+
+import android.support.v7.widget.SwitchCompat
+import android.view.ViewGroup
+import de.kuschku.quasseldroid.util.ui.AnimationHelper
+
+fun SwitchCompat.setDependent(view: ViewGroup, reverse: Boolean = false) {
+  this.setOnCheckedChangeListener { _, isChecked ->
+    if (reverse && !isChecked || !reverse && isChecked) {
+      AnimationHelper.expand(view)
+    } else {
+      AnimationHelper.collapse(view)
+    }
+  }
+}
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/ui/AnimationHelper.kt b/app/src/main/java/de/kuschku/quasseldroid/util/ui/AnimationHelper.kt
new file mode 100644
index 0000000000000000000000000000000000000000..0007abab4f83c1e3e9c42e6076ab8be9ac499ba2
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/util/ui/AnimationHelper.kt
@@ -0,0 +1,62 @@
+package de.kuschku.quasseldroid.util.ui
+
+import android.view.View
+import android.view.ViewGroup
+import android.view.animation.Animation
+import android.view.animation.Transformation
+import kotlin.math.roundToLong
+
+object AnimationHelper {
+  fun expand(v: ViewGroup) {
+    v.measure(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
+    val targetHeight = v.measuredHeight
+
+    // Older versions of android (pre API 21) cancel animations for views with a height of 0.
+    v.layoutParams.height = 1
+    v.visibility = View.VISIBLE
+
+    v.clearAnimation()
+    v.startAnimation(object : Animation() {
+      init {
+        duration = (targetHeight / v.context.resources.displayMetrics.density).roundToLong()
+      }
+
+      override fun applyTransformation(interpolatedTime: Float, t: Transformation) {
+        v.layoutParams.height = if (interpolatedTime == 1f)
+          ViewGroup.LayoutParams.WRAP_CONTENT
+        else
+          (targetHeight * interpolatedTime).toInt()
+        v.alpha = interpolatedTime
+        v.requestLayout()
+      }
+
+      override fun willChangeBounds(): Boolean {
+        return true
+      }
+    })
+  }
+
+  fun collapse(v: ViewGroup) {
+    val initialHeight = v.measuredHeight
+    v.clearAnimation()
+    v.startAnimation(object : Animation() {
+      init {
+        duration = (initialHeight / v.context.resources.displayMetrics.density).roundToLong()
+      }
+
+      override fun applyTransformation(interpolatedTime: Float, t: Transformation) {
+        if (interpolatedTime == 1f) {
+          v.visibility = View.GONE
+        } else {
+          v.layoutParams.height = initialHeight - (initialHeight * interpolatedTime).toInt()
+          v.alpha = 1 - interpolatedTime
+          v.requestLayout()
+        }
+      }
+
+      override fun willChangeBounds(): Boolean {
+        return true
+      }
+    })
+  }
+}
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/SettingsActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/util/ui/SettingsActivity.kt
similarity index 95%
rename from app/src/main/java/de/kuschku/quasseldroid/ui/settings/SettingsActivity.kt
rename to app/src/main/java/de/kuschku/quasseldroid/util/ui/SettingsActivity.kt
index f64b961f167f43f1e9a11ab3ab4446318556b367..30b536ccf769050e253c6ffdf81000cc93972955 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/settings/SettingsActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/util/ui/SettingsActivity.kt
@@ -1,4 +1,4 @@
-package de.kuschku.quasseldroid.ui.settings
+package de.kuschku.quasseldroid.util.ui
 
 import android.os.Bundle
 import android.support.v4.app.Fragment
diff --git a/app/src/main/res/drawable/ic_message_bulleted.xml b/app/src/main/res/drawable/ic_message_bulleted.xml
new file mode 100644
index 0000000000000000000000000000000000000000..2b2d39efaf3fbae955371adab64822b8c809b4f0
--- /dev/null
+++ b/app/src/main/res/drawable/ic_message_bulleted.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+  android:width="24dp"
+  android:height="24dp"
+  android:viewportHeight="24"
+  android:viewportWidth="24">
+  <path
+    android:fillColor="#000"
+    android:pathData="M20,2H4A2,2 0 0,0 2,4V22L6,18H20A2,2 0 0,0 22,16V4A2,2 0 0,0 20,2M8,14H6V12H8V14M8,11H6V9H8V11M8,8H6V6H8V8M15,14H10V12H15V14M18,11H10V9H18V11M18,8H10V6H18V8Z" />
+</vector>
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_coresettings.xml b/app/src/main/res/layout/fragment_coresettings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d84e8ff1d1a6320ca5470f1df23866b6a0e5792b
--- /dev/null
+++ b/app/src/main/res/layout/fragment_coresettings.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
+  android:id="@+id/list"
+  android:layout_width="match_parent"
+  android:layout_height="match_parent" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_networksettings.xml b/app/src/main/res/layout/fragment_networksettings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f654040fa37c8b30180ba0149953a21e9419de09
--- /dev/null
+++ b/app/src/main/res/layout/fragment_networksettings.xml
@@ -0,0 +1,167 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.v4.widget.NestedScrollView 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"
+  android:layout_width="match_parent"
+  android:layout_height="match_parent">
+
+  <LinearLayout style="@style/Widget.CoreSettings.Wrapper">
+
+    <LinearLayout
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:minHeight="48dp">
+
+      <android.support.v7.widget.AppCompatImageView
+        style="@style/Widget.CoreSettings.PrimaryItemIcon"
+        app:srcCompat="@drawable/ic_history" />
+
+      <android.support.v7.widget.SwitchCompat
+        android:id="@+id/ping_timeout_enabled"
+        style="@style/Widget.CoreSettings.PrimaryItemSwitch"
+        android:text="@string/settings_networkconfig_ping_timeout" />
+    </LinearLayout>
+
+    <LinearLayout
+      android:id="@+id/ping_timeout_group"
+      style="@style/Widget.CoreSettings.DependentGroup"
+      tools:visibility="visible">
+
+      <FrameLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+
+        <android.support.design.widget.TextInputLayout
+          style="@style/Widget.CoreSettings.EditTextLayout"
+          android:hint="@string/settings_networkconfig_ping_interval">
+
+          <android.support.design.widget.TextInputEditText
+            android:id="@+id/ping_interval"
+            style="@style/Widget.CoreSettings.EditText"
+            android:inputType="number"
+            tools:text="30" />
+        </android.support.design.widget.TextInputLayout>
+
+        <TextView
+          style="@style/Widget.CoreSettings.EditTextSuffix"
+          android:text="@string/settings_networkconfig_ping_interval_unit" />
+      </FrameLayout>
+
+      <FrameLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+
+        <android.support.design.widget.TextInputLayout
+          style="@style/Widget.CoreSettings.EditTextLayout"
+          android:hint="@string/settings_networkconfig_max_ping_count">
+
+          <android.support.design.widget.TextInputEditText
+            android:id="@+id/max_ping_count"
+            style="@style/Widget.CoreSettings.EditText"
+            android:inputType="number"
+            tools:text="10" />
+        </android.support.design.widget.TextInputLayout>
+
+        <TextView
+          style="@style/Widget.CoreSettings.EditTextSuffix"
+          android:text="@string/settings_networkconfig_max_ping_count_unit" />
+      </FrameLayout>
+    </LinearLayout>
+
+    <LinearLayout
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:minHeight="48dp">
+
+      <android.support.v7.widget.AppCompatImageView
+        style="@style/Widget.CoreSettings.PrimaryItemIcon"
+        app:srcCompat="@drawable/ic_account" />
+
+      <android.support.v7.widget.SwitchCompat
+        android:id="@+id/auto_who_enabled"
+        style="@style/Widget.CoreSettings.PrimaryItemSwitch"
+        android:text="@string/settings_networkconfig_auto_who" />
+    </LinearLayout>
+
+    <LinearLayout
+      android:id="@+id/auto_who_group"
+      style="@style/Widget.CoreSettings.DependentGroup"
+      tools:visibility="visible">
+
+      <FrameLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+
+        <android.support.design.widget.TextInputLayout
+          style="@style/Widget.CoreSettings.EditTextLayout"
+          android:hint="@string/settings_networkconfig_auto_who_interval">
+
+          <android.support.design.widget.TextInputEditText
+            android:id="@+id/auto_who_interval"
+            style="@style/Widget.CoreSettings.EditText"
+            android:inputType="number"
+            tools:text="90" />
+        </android.support.design.widget.TextInputLayout>
+
+        <TextView
+          style="@style/Widget.CoreSettings.EditTextSuffix"
+          android:text="@string/settings_networkconfig_auto_who_interval_unit" />
+      </FrameLayout>
+
+      <FrameLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+
+        <android.support.design.widget.TextInputLayout
+          style="@style/Widget.CoreSettings.EditTextLayout"
+          android:hint="@string/settings_networkconfig_auto_who_nick_limit">
+
+          <android.support.design.widget.TextInputEditText
+            android:id="@+id/auto_who_nick_limit"
+            style="@style/Widget.CoreSettings.EditText"
+            android:inputType="number"
+            tools:text="100" />
+        </android.support.design.widget.TextInputLayout>
+
+        <TextView
+          style="@style/Widget.CoreSettings.EditTextSuffix"
+          android:text="@string/settings_networkconfig_auto_who_nick_limit_unit" />
+      </FrameLayout>
+
+      <FrameLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+
+        <android.support.design.widget.TextInputLayout
+          style="@style/Widget.CoreSettings.EditTextLayout"
+          android:hint="@string/settings_networkconfig_auto_who_delay">
+
+          <android.support.design.widget.TextInputEditText
+            android:id="@+id/auto_who_delay"
+            style="@style/Widget.CoreSettings.EditText"
+            android:inputType="number"
+            tools:text="5" />
+        </android.support.design.widget.TextInputLayout>
+
+        <TextView
+          style="@style/Widget.CoreSettings.EditTextSuffix"
+          android:text="@string/settings_networkconfig_auto_who_delay_unit" />
+      </FrameLayout>
+    </LinearLayout>
+
+    <LinearLayout
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:minHeight="48dp">
+
+      <android.support.v7.widget.AppCompatImageView
+        style="@style/Widget.CoreSettings.PrimaryItemIcon"
+        app:srcCompat="@drawable/ic_message_bulleted" />
+
+      <android.support.v7.widget.SwitchCompat
+        android:id="@+id/standard_ctcp"
+        style="@style/Widget.CoreSettings.PrimaryItemSwitch"
+        android:text="@string/settings_networkconfig_standard_ctcp" />
+    </LinearLayout>
+  </LinearLayout>
+</android.support.v4.widget.NestedScrollView>
\ No newline at end of file
diff --git a/app/src/main/res/layout/setup_account_edit.xml b/app/src/main/res/layout/setup_account_edit.xml
index b95d98987eee13a6cb2d0050c30588d1791b28f3..8c9c4e3954f94b700706fcc9c8e9444d7ec026f9 100644
--- a/app/src/main/res/layout/setup_account_edit.xml
+++ b/app/src/main/res/layout/setup_account_edit.xml
@@ -23,11 +23,11 @@
         android:layout_width="56dp"
         android:layout_height="68dp">
 
-        <ImageView
+        <android.support.v7.widget.AppCompatImageView
           android:layout_width="24dp"
           android:layout_height="24dp"
           android:layout_gravity="center_vertical"
-          android:tint="#757575"
+          app:tint="?android:textColorSecondary"
           app:srcCompat="@drawable/ic_pencil"
           tools:ignore="ContentDescription" />
       </FrameLayout>
@@ -61,11 +61,11 @@
         android:layout_width="56dp"
         android:layout_height="68dp">
 
-        <ImageView
+        <android.support.v7.widget.AppCompatImageView
           android:layout_width="24dp"
           android:layout_height="24dp"
           android:layout_gravity="center_vertical"
-          android:tint="#757575"
+          app:tint="?android:textColorSecondary"
           app:srcCompat="@drawable/ic_server_network"
           tools:ignore="ContentDescription" />
       </FrameLayout>
@@ -89,10 +89,6 @@
             android:inputType="textUri" />
         </android.support.design.widget.TextInputLayout>
 
-        <android.support.v4.widget.Space
-          android:layout_width="56dp"
-          android:layout_height="match_parent" />
-
         <android.support.design.widget.TextInputLayout
           android:id="@+id/portWrapper"
           android:layout_width="match_parent"
@@ -125,11 +121,11 @@
         android:layout_width="56dp"
         android:layout_height="68dp">
 
-        <ImageView
+        <android.support.v7.widget.AppCompatImageView
           android:layout_width="24dp"
           android:layout_height="24dp"
           android:layout_gravity="center_vertical"
-          android:tint="#757575"
+          app:tint="?android:textColorSecondary"
           app:srcCompat="@drawable/ic_account"
           tools:ignore="ContentDescription" />
       </FrameLayout>
diff --git a/app/src/main/res/layout/widget_coresetting.xml b/app/src/main/res/layout/widget_coresetting.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6d36188e6a5dfef38c83b63cbe95be566ed6cff0
--- /dev/null
+++ b/app/src/main/res/layout/widget_coresetting.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+  xmlns:tools="http://schemas.android.com/tools"
+  android:layout_width="match_parent"
+  android:layout_height="wrap_content"
+  android:background="?android:attr/selectableItemBackground"
+  android:focusable="true"
+  android:gravity="center_vertical"
+  android:minHeight="?android:attr/listPreferredItemHeightSmall"
+  android:paddingEnd="?android:attr/listPreferredItemPaddingRight"
+  android:paddingLeft="?android:attr/listPreferredItemPaddingLeft"
+  android:paddingRight="?android:attr/listPreferredItemPaddingRight"
+  android:paddingStart="?android:attr/listPreferredItemPaddingLeft">
+
+  <LinearLayout
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical"
+    android:paddingBottom="16dp"
+    android:paddingTop="16dp">
+
+    <TextView
+      android:id="@+id/title"
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:ellipsize="marquee"
+      android:singleLine="true"
+      android:textColor="?colorTextPrimary"
+      android:textSize="16sp"
+      tools:text="IRC Config" />
+
+    <TextView
+      android:id="@+id/summary"
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:textAppearance="?android:attr/textAppearanceSmall"
+      android:textColor="?colorTextPrimary"
+      tools:visibility="gone" />
+  </LinearLayout>
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/menu/activity_main.xml b/app/src/main/res/menu/activity_main.xml
index 214b44fcddda89fd7f2f49353fbbbb8599b642f3..31588b1be1945552498ef613bb364e58feaab064 100644
--- a/app/src/main/res/menu/activity_main.xml
+++ b/app/src/main/res/menu/activity_main.xml
@@ -4,8 +4,11 @@
     android:id="@+id/action_filter_messages"
     android:title="@string/label_filter_messages" />
   <item
-    android:id="@+id/action_settings"
-    android:title="@string/label_settings" />
+    android:id="@+id/action_core_settings"
+    android:title="@string/label_settings_core" />
+  <item
+    android:id="@+id/action_client_settings"
+    android:title="@string/label_settings_client" />
   <item
     android:id="@+id/action_disconnect"
     android:title="@string/label_disconnect" />
diff --git a/app/src/main/res/menu/context_setting.xml b/app/src/main/res/menu/context_setting.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c167e748cc8f1e880eb40aecb8b6efc6763921c7
--- /dev/null
+++ b/app/src/main/res/menu/context_setting.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+  xmlns:app="http://schemas.android.com/apk/res-auto">
+  <item
+    android:id="@+id/action_save"
+    android:title="@string/label_save"
+    app:showAsAction="ifRoom" />
+</menu>
\ No newline at end of file
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index a3ebc09f144d14d716432918280e34cadb7b8cad..ddffffba4a51bf8743a7496cc0f006a18482b5af 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -41,6 +41,8 @@
   <string name="label_save">Speichern</string>
   <string name="label_select">Auswählen</string>
   <string name="label_settings">Einstellungen</string>
+  <string name="label_settings_client">Client-Einstellungen</string>
+  <string name="label_settings_core">Core-Einstellungen</string>
   <string name="label_share">Teilen</string>
   <string name="label_share_crashreport">Absturzbericht Teilen</string>
   <string name="label_show_hidden">Alle anzeigen</string>
diff --git a/app/src/main/res/values-de/strings_properties.xml b/app/src/main/res/values-de/strings_properties.xml
index 1403dac82c91101753f03e5e5cd9f0e165cbfd7b..4da1e38c6ec897ba3d3eb0404d25020a8d5b760c 100644
--- a/app/src/main/res/values-de/strings_properties.xml
+++ b/app/src/main/res/values-de/strings_properties.xml
@@ -7,7 +7,7 @@
   <string name="property_ircuser_realname">Realname</string>
   <string name="property_ircuser_account">Account</string>
 
-  <string name="property_group_ircchannel_channel">Channel</string>
+  <string name="property_group_ircchannel_channel">Kanal</string>
   <string name="property_ircchannel_topic">Thema</string>
   <string name="property_ircchannel_topic_action_edit">Thema ändern</string>
   <string name="property_ircchannel_topic_default">Kein Thema gesetzt</string>
diff --git a/app/src/main/res/values-de/strings_settings.xml b/app/src/main/res/values-de/strings_settings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..574f8689bdbcee38e567d2a0a7cb6ab5d8109c89
--- /dev/null
+++ b/app/src/main/res/values-de/strings_settings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+  <string name="settings_networkconfig_title">Network Config</string>
+  <string name="settings_networkconfig_description" />
+
+  <string name="settings_networkconfig_ping_timeout">Erkennung von Ping-Zeitüberschreitungen</string>
+
+  <string name="settings_networkconfig_ping_interval">Ping-Intervall</string>
+  <string name="settings_networkconfig_ping_interval_unit">Sekunden</string>
+
+  <string name="settings_networkconfig_max_ping_count">Verbindungstrennung nach</string>
+  <string name="settings_networkconfig_max_ping_count_unit">verpassten Pings</string>
+
+  <string name="settings_networkconfig_auto_who">Automatische Suche nach Nutzerinformationen</string>
+  <string name="settings_networkconfig_auto_who_interval">Aktualisierungs-Intervall</string>
+  <string name="settings_networkconfig_auto_who_interval_unit">Sekunden</string>
+  <string name="settings_networkconfig_auto_who_nick_limit">Ignoriere Chats mit mehr als</string>
+  <string name="settings_networkconfig_auto_who_nick_limit_unit">Nutzern</string>
+  <string name="settings_networkconfig_auto_who_delay">Mindestabstand zwischen zwei Abfragen</string>
+  <string name="settings_networkconfig_auto_who_delay_unit">Sekunden</string>
+
+  <string name="settings_networkconfig_standard_ctcp">Standardkonformes CTCP-Verhalten aktivieren</string>
+</resources>
\ No newline at end of file
diff --git a/app/src/main/res/values-v17/styles_widgets.xml b/app/src/main/res/values-v17/styles_widgets.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5109234c2ce2b548fcb6e36d033f6609d7ebdd21
--- /dev/null
+++ b/app/src/main/res/values-v17/styles_widgets.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+  <style name="Widget.CoreSettings.Wrapper" parent="">
+    <item name="android:layout_width">match_parent</item>
+    <item name="android:layout_height">wrap_content</item>
+    <item name="android:orientation">vertical</item>
+    <item name="android:paddingStart">?listPreferredItemPaddingLeft</item>
+    <item name="android:paddingLeft">?listPreferredItemPaddingLeft</item>
+    <item name="android:paddingEnd">?listPreferredItemPaddingRight</item>
+    <item name="android:paddingRight">?listPreferredItemPaddingRight</item>
+  </style>
+
+  <style name="Widget.CoreSettings.PrimaryItemIcon" parent="">
+    <item name="android:layout_width">wrap_content</item>
+    <item name="android:layout_height">wrap_content</item>
+    <item name="android:layout_gravity">center_vertical</item>
+    <item name="android:layout_marginRight">32dp</item>
+    <item name="android:layout_marginEnd">32dp</item>
+    <item name="tint">?colorTextSecondary</item>
+  </style>
+
+  <style name="Widget.CoreSettings.DependentGroup" parent="">
+    <item name="android:layout_width">match_parent</item>
+    <item name="android:layout_height">wrap_content</item>
+    <item name="android:orientation">vertical</item>
+    <item name="android:visibility">gone</item>
+    <item name="android:layout_marginLeft">56dp</item>
+    <item name="android:layout_marginStart">56dp</item>
+  </style>
+
+  <style name="Widget.CoreSettings.EditTextLayout" parent="">
+    <item name="android:layout_width">match_parent</item>
+    <item name="android:layout_height">wrap_content</item>
+    <item name="android:layout_marginLeft">-4dp</item>
+    <item name="android:layout_marginStart">-4dp</item>
+  </style>
+
+  <style name="Widget.CoreSettings.EditTextSuffix" parent="">
+    <item name="android:layout_width">wrap_content</item>
+    <item name="android:layout_height">wrap_content</item>
+    <item name="android:layout_gravity">bottom|end</item>
+    <item name="android:layout_marginBottom">12dp</item>
+    <item name="android:layout_marginEnd">8dp</item>
+    <item name="android:layout_marginRight">8dp</item>
+    <item name="android:textColor">?colorTextSecondary</item>
+  </style>
+</resources>
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 135be32d8a393cc5b925281161390a8308eed694..e1f5126497a30fc7761a5ff1f4ced5b5898f3f01 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -41,6 +41,8 @@
   <string name="label_save">Save</string>
   <string name="label_select">Select</string>
   <string name="label_settings">Settings</string>
+  <string name="label_settings_client">Client Settings</string>
+  <string name="label_settings_core">Core Settings</string>
   <string name="label_share">Share</string>
   <string name="label_share_crashreport">Share Crash Report</string>
   <string name="label_show_hidden">Show Hidden</string>
diff --git a/app/src/main/res/values/strings_settings.xml b/app/src/main/res/values/strings_settings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c6579633b2f9c7f6cdcd3182ab516424dcfcbb20
--- /dev/null
+++ b/app/src/main/res/values/strings_settings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+  <string name="settings_networkconfig_title">IRC Config</string>
+  <string name="settings_networkconfig_description" />
+
+  <string name="settings_networkconfig_ping_timeout">Ping Timeout Detection</string>
+
+  <string name="settings_networkconfig_ping_interval">Ping Interval</string>
+  <string name="settings_networkconfig_ping_interval_unit">seconds</string>
+
+  <string name="settings_networkconfig_max_ping_count">Disconnect after</string>
+  <string name="settings_networkconfig_max_ping_count_unit">missed pings</string>
+
+  <string name="settings_networkconfig_auto_who">Automatic User Info Lookup</string>
+  <string name="settings_networkconfig_auto_who_interval">Update interval</string>
+  <string name="settings_networkconfig_auto_who_interval_unit">seconds</string>
+  <string name="settings_networkconfig_auto_who_nick_limit">Ignore channels with more than</string>
+  <string name="settings_networkconfig_auto_who_nick_limit_unit">users</string>
+  <string name="settings_networkconfig_auto_who_delay">Minimum delay between requests</string>
+  <string name="settings_networkconfig_auto_who_delay_unit">seconds</string>
+
+  <string name="settings_networkconfig_standard_ctcp">Standard-Compliant CTCP behavior</string>
+</resources>
\ No newline at end of file
diff --git a/app/src/main/res/values/styles_widgets.xml b/app/src/main/res/values/styles_widgets.xml
index ab9c1fb30a793c6786239f9cd3ae8a7df6ea6fba..e4ec1d3473e1d21a0667e3a7a203f02f4dcd3c4c 100644
--- a/app/src/main/res/values/styles_widgets.xml
+++ b/app/src/main/res/values/styles_widgets.xml
@@ -70,6 +70,66 @@
     <item name="android:background">?backgroundMenuItemRounded</item>
   </style>
 
+  <style name="Widget.CoreSettings.Wrapper" parent="">
+    <item name="android:layout_width">match_parent</item>
+    <item name="android:layout_height">wrap_content</item>
+    <item name="android:orientation">vertical</item>
+    <item name="android:paddingLeft">?listPreferredItemPaddingLeft</item>
+    <item name="android:paddingRight">?listPreferredItemPaddingRight</item>
+  </style>
+
+  <style name="Widget.CoreSettings.PrimaryItem" parent="">
+    <item name="android:layout_width">match_parent</item>
+    <item name="android:layout_height">wrap_content</item>
+    <item name="android:orientation">vertical</item>
+    <item name="android:visibility">gone</item>
+    <item name="android:layout_marginLeft">56dp</item>
+  </style>
+
+  <style name="Widget.CoreSettings.PrimaryItemSwitch" parent="">
+    <item name="android:layout_width">match_parent</item>
+    <item name="android:layout_height">match_parent</item>
+    <item name="android:layout_gravity">center_vertical</item>
+    <item name="android:textColor">?colorTextPrimary</item>
+  </style>
+
+  <style name="Widget.CoreSettings.PrimaryItemIcon" parent="">
+    <item name="android:layout_width">wrap_content</item>
+    <item name="android:layout_height">wrap_content</item>
+    <item name="android:layout_gravity">center_vertical</item>
+    <item name="android:layout_marginRight">32dp</item>
+    <item name="tint">?colorTextSecondary</item>
+  </style>
+
+  <style name="Widget.CoreSettings.DependentGroup" parent="">
+    <item name="android:layout_width">match_parent</item>
+    <item name="android:layout_height">wrap_content</item>
+    <item name="android:orientation">vertical</item>
+    <item name="android:visibility">gone</item>
+    <item name="android:layout_marginLeft">56dp</item>
+  </style>
+
+  <style name="Widget.CoreSettings.EditTextLayout" parent="">
+    <item name="android:layout_width">match_parent</item>
+    <item name="android:layout_height">wrap_content</item>
+    <item name="android:layout_marginLeft">-4dp</item>
+  </style>
+
+  <style name="Widget.CoreSettings.EditText" parent="">
+    <item name="android:layout_width">match_parent</item>
+    <item name="android:layout_height">wrap_content</item>
+    <item name="android:textColor">?colorTextPrimary</item>
+  </style>
+
+  <style name="Widget.CoreSettings.EditTextSuffix" parent="">
+    <item name="android:layout_width">wrap_content</item>
+    <item name="android:layout_height">wrap_content</item>
+    <item name="android:layout_gravity">bottom|end</item>
+    <item name="android:layout_marginBottom">12dp</item>
+    <item name="android:layout_marginRight">8dp</item>
+    <item name="android:textColor">?colorTextSecondary</item>
+  </style>
+
   <!-- NavigationDrawerLayout -->
   <declare-styleable name="NavigationDrawerLayout">
     <attr name="insetBackground" />
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/NetworkConfig.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/NetworkConfig.kt
index bccb74c55aa8b4f49ed547c7458f9d653ebbcd65..2332cef6bd825fe287259f5087e1cf9f04a286bd 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/NetworkConfig.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/NetworkConfig.kt
@@ -91,6 +91,12 @@ class NetworkConfig constructor(
     super.setStandardCtcp(standardCtcp)
   }
 
+  fun copy(): NetworkConfig {
+    val config = NetworkConfig(SignalProxy.NULL)
+    config.fromVariantMap(this.toVariantMap())
+    return config
+  }
+
   private var _pingTimeoutEnabled: Boolean = true
   private var _pingInterval: Int = 30
   private var _maxPingCount: Int = 6
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 02cdf68e350df788ec248bcc5995e1befb85ce46..bdbdd4a8afdf5291e98e67e1e12a2e884cba9dbc 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/ISession.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/ISession.kt
@@ -25,11 +25,11 @@ interface ISession : Closeable {
   val coreInfo: CoreInfo?
   val dccConfig: DccConfig?
   val identities: Map<IdentityId, Identity>
-  fun live_identities(): Observable<Map<IdentityId, Identity>>
+  fun liveIdentities(): Observable<Map<IdentityId, Identity>>
   val ignoreListManager: IgnoreListManager?
   val ircListHelper: IrcListHelper?
   val networks: Map<NetworkId, Network>
-  fun live_networks(): Observable<Map<NetworkId, Network>>
+  fun liveNetworks(): Observable<Map<NetworkId, Network>>
   val networkConfig: NetworkConfig?
   val rpcHandler: RpcHandler?
   val initStatus: Observable<Pair<Int, Int>>
@@ -57,11 +57,11 @@ interface ISession : Closeable {
       override val coreInfo: CoreInfo? = null
       override val dccConfig: DccConfig? = null
       override val identities: Map<IdentityId, Identity> = emptyMap()
-      override fun live_identities() = Observable.empty<Map<IdentityId, Identity>>()
+      override fun liveIdentities() = Observable.empty<Map<IdentityId, Identity>>()
       override val ignoreListManager: IgnoreListManager? = null
       override val ircListHelper: IrcListHelper? = null
       override val networks: Map<NetworkId, Network> = emptyMap()
-      override fun live_networks() = Observable.empty<Map<NetworkId, Network>>()
+      override fun liveNetworks() = Observable.empty<Map<NetworkId, Network>>()
       override val networkConfig: NetworkConfig? = null
       override val initStatus: Observable<Pair<Int, Int>> = Observable.just(0 to 0)
       override val lag: Observable<Long> = Observable.just(0L)
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 8b96dfd16610adda00b20b28b7cbf0742dddb91e..03f90a5a7e0f23fe67543ec99ef3851b35ed7e1e 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/Session.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/Session.kt
@@ -47,14 +47,14 @@ class Session(
 
   override val identities = mutableMapOf<IdentityId, Identity>()
   private val live_identities = BehaviorSubject.createDefault(Unit)
-  override fun live_identities(): Observable<Map<IdentityId, Identity>> = live_identities.map { identities }
+  override fun liveIdentities(): Observable<Map<IdentityId, Identity>> = live_identities.map { identities }
 
   override val ignoreListManager = IgnoreListManager(this)
   override val ircListHelper = IrcListHelper(this)
 
   override val networks = mutableMapOf<NetworkId, Network>()
   private val live_networks = BehaviorSubject.createDefault(Unit)
-  override fun live_networks(): Observable<Map<NetworkId, Network>> = live_networks.map { networks }
+  override fun liveNetworks(): Observable<Map<NetworkId, Network>> = live_networks.map { networks }
 
   override val networkConfig = NetworkConfig(this)
 
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 15ebd4539af45599c987a5e8b44e374e3fe51331..03af6d93358d41d6de9ec44c00f385a70130a18d 100644
--- a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt
+++ b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt
@@ -100,7 +100,7 @@ class QuasselViewModel : ViewModel() {
     val session = sessionOptional.orNull()
     val bufferSyncer = session?.bufferSyncer
     if (bufferSyncer != null) {
-      session.live_networks().switchMap { networks ->
+      session.liveNetworks().switchMap { networks ->
         bufferSyncer.liveBufferInfos().switchMap {
           val info = bufferSyncer.bufferInfo(id)
           val network = networks[info?.networkId]
@@ -160,7 +160,7 @@ class QuasselViewModel : ViewModel() {
       val bufferSyncer = session?.bufferSyncer
       val bufferInfo = bufferSyncer?.bufferInfo(buffer)
       if (bufferInfo?.type?.hasFlag(Buffer_Type.ChannelBuffer) == true) {
-        session.live_networks().switchMap { networks ->
+        session.liveNetworks().switchMap { networks ->
           val network = networks[bufferInfo.networkId]
           val ircChannel = network?.ircChannel(bufferInfo.bufferName)
           if (ircChannel != null) {
@@ -211,7 +211,7 @@ class QuasselViewModel : ViewModel() {
           val bufferSyncer = session?.bufferSyncer
           val bufferInfo = bufferSyncer?.bufferInfo(id)
           if (bufferSyncer != null) {
-            session.live_networks().switchMap { networks ->
+            session.liveNetworks().switchMap { networks ->
               bufferSyncer.liveBufferInfos().switchMap { infos ->
                 if (bufferInfo?.type?.hasFlag(
                     Buffer_Type.ChannelBuffer
@@ -319,7 +319,7 @@ class QuasselViewModel : ViewModel() {
       val bufferSyncer = session?.bufferSyncer
       val bufferViewConfig = bufferViewConfigOptional.orNull()
       if (bufferSyncer != null && bufferViewConfig != null) {
-        session.live_networks().switchMap { networks ->
+        session.liveNetworks().switchMap { networks ->
           val hiddenState = when {
             bufferViewConfig.removedBuffers().contains(buffer)            ->
               BufferHiddenState.HIDDEN_PERMANENT
@@ -372,7 +372,7 @@ class QuasselViewModel : ViewModel() {
         val showHidden = showHiddenRaw ?: false
         val config = configOptional.orNull()
         if (bufferSyncer != null && config != null) {
-          session.live_networks().switchMap { networks ->
+          session.liveNetworks().switchMap { networks ->
             config.live_config
               .debounce(16, TimeUnit.MILLISECONDS)
               .switchMap { currentConfig ->