From e69ae403efaff4a5bd11196dc1aa022fd0c99958 Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Sat, 31 Mar 2018 16:03:31 +0200
Subject: [PATCH] Implement networkconfig setting

---
 app/src/main/AndroidManifest.xml              |  30 +++-
 .../quasseldroid/dagger/ActivityModule.kt     |  26 ++-
 .../quasseldroid/ui/chat/ChatActivity.kt      |  11 +-
 .../quasseldroid/ui/chat/info/InfoActivity.kt |   2 +-
 .../about/AboutSettingsActivity.kt            |   5 +
 .../about/AboutSettingsFragment.kt            |   2 +-
 .../about/AboutSettingsFragmentProvider.kt    |   2 +-
 .../about/Contributor.kt                      |   2 +-
 .../about/ContributorAdapter.kt               |   2 +-
 .../about/Library.kt                          |   2 +-
 .../about/LibraryAdapter.kt                   |   4 +-
 .../about/License.kt                          |   2 +-
 .../app/AppSettingsActivity.kt                |   8 +-
 .../app/AppSettingsFragment.kt                |   2 +-
 .../app/AppSettingsFragmentProvider.kt        |   2 +-
 .../crash/CrashAdapter.kt                     |   2 +-
 .../crash/CrashSettingsActivity.kt            |   5 +
 .../crash/CrashSettingsFragment.kt            |   2 +-
 .../crash/CrashSettingsFragmentProvider.kt    |   2 +-
 .../license/LicenseSettingsActivity.kt        |   5 +
 .../license/LicenseSettingsFragment.kt        |   2 +-
 .../LicenseSettingsFragmentProvider.kt        |   2 +-
 .../ui/coresettings/CoreSettingsActivity.kt   |   5 +
 .../ui/coresettings/CoreSettingsFragment.kt   |  82 +++++++++
 .../CoreSettingsFragmentProvider.kt           |  10 ++
 .../ui/coresettings/SettingsFragment.kt       |  30 ++++
 .../networkconfig/NetworkConfigActivity.kt    |   5 +
 .../networkconfig/NetworkConfigFragment.kt    | 101 +++++++++++
 .../NetworkConfigFragmentProvider.kt          |  10 ++
 .../settings/about/AboutSettingsActivity.kt   |   5 -
 .../settings/crash/CrashSettingsActivity.kt   |   5 -
 .../license/LicenseSettingsActivity.kt        |   5 -
 .../util/helper/SwitchCompatHelper.kt         |  15 ++
 .../quasseldroid/util/ui/AnimationHelper.kt   |  62 +++++++
 .../settings => util/ui}/SettingsActivity.kt  |   2 +-
 .../main/res/drawable/ic_message_bulleted.xml |   9 +
 .../main/res/layout/fragment_coresettings.xml |   5 +
 .../res/layout/fragment_networksettings.xml   | 167 ++++++++++++++++++
 .../main/res/layout/setup_account_edit.xml    |  16 +-
 .../main/res/layout/widget_coresetting.xml    |  40 +++++
 app/src/main/res/menu/activity_main.xml       |   7 +-
 app/src/main/res/menu/context_setting.xml     |   8 +
 app/src/main/res/values-de/strings.xml        |   2 +
 .../main/res/values-de/strings_properties.xml |   2 +-
 .../main/res/values-de/strings_settings.xml   |  23 +++
 .../main/res/values-v17/styles_widgets.xml    |  48 +++++
 app/src/main/res/values/strings.xml           |   2 +
 app/src/main/res/values/strings_settings.xml  |  23 +++
 app/src/main/res/values/styles_widgets.xml    |  60 +++++++
 .../quassel/syncables/NetworkConfig.kt        |   6 +
 .../de/kuschku/libquassel/session/ISession.kt |   8 +-
 .../de/kuschku/libquassel/session/Session.kt  |   4 +-
 .../viewmodel/QuasselViewModel.kt             |  10 +-
 53 files changed, 819 insertions(+), 80 deletions(-)
 create mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/about/AboutSettingsActivity.kt
 rename app/src/main/java/de/kuschku/quasseldroid/ui/{settings => clientsettings}/about/AboutSettingsFragment.kt (99%)
 rename app/src/main/java/de/kuschku/quasseldroid/ui/{settings => clientsettings}/about/AboutSettingsFragmentProvider.kt (80%)
 rename app/src/main/java/de/kuschku/quasseldroid/ui/{settings => clientsettings}/about/Contributor.kt (63%)
 rename app/src/main/java/de/kuschku/quasseldroid/ui/{settings => clientsettings}/about/ContributorAdapter.kt (95%)
 rename app/src/main/java/de/kuschku/quasseldroid/ui/{settings => clientsettings}/about/Library.kt (67%)
 rename app/src/main/java/de/kuschku/quasseldroid/ui/{settings => clientsettings}/about/LibraryAdapter.kt (92%)
 rename app/src/main/java/de/kuschku/quasseldroid/ui/{settings => clientsettings}/about/License.kt (73%)
 rename app/src/main/java/de/kuschku/quasseldroid/ui/{settings => clientsettings}/app/AppSettingsActivity.kt (74%)
 rename app/src/main/java/de/kuschku/quasseldroid/ui/{settings => clientsettings}/app/AppSettingsFragment.kt (97%)
 rename app/src/main/java/de/kuschku/quasseldroid/ui/{settings => clientsettings}/app/AppSettingsFragmentProvider.kt (80%)
 rename app/src/main/java/de/kuschku/quasseldroid/ui/{settings => clientsettings}/crash/CrashAdapter.kt (97%)
 create mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/crash/CrashSettingsActivity.kt
 rename app/src/main/java/de/kuschku/quasseldroid/ui/{settings => clientsettings}/crash/CrashSettingsFragment.kt (98%)
 rename app/src/main/java/de/kuschku/quasseldroid/ui/{settings => clientsettings}/crash/CrashSettingsFragmentProvider.kt (79%)
 create mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/license/LicenseSettingsActivity.kt
 rename app/src/main/java/de/kuschku/quasseldroid/ui/{settings => clientsettings}/license/LicenseSettingsFragment.kt (94%)
 rename app/src/main/java/de/kuschku/quasseldroid/ui/{settings => clientsettings}/license/LicenseSettingsFragmentProvider.kt (79%)
 create mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/CoreSettingsActivity.kt
 create mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/CoreSettingsFragment.kt
 create mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/CoreSettingsFragmentProvider.kt
 create mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/SettingsFragment.kt
 create mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/networkconfig/NetworkConfigActivity.kt
 create mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/networkconfig/NetworkConfigFragment.kt
 create mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/networkconfig/NetworkConfigFragmentProvider.kt
 delete mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/settings/about/AboutSettingsActivity.kt
 delete mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/settings/crash/CrashSettingsActivity.kt
 delete mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/settings/license/LicenseSettingsActivity.kt
 create mode 100644 app/src/main/java/de/kuschku/quasseldroid/util/helper/SwitchCompatHelper.kt
 create mode 100644 app/src/main/java/de/kuschku/quasseldroid/util/ui/AnimationHelper.kt
 rename app/src/main/java/de/kuschku/quasseldroid/{ui/settings => util/ui}/SettingsActivity.kt (95%)
 create mode 100644 app/src/main/res/drawable/ic_message_bulleted.xml
 create mode 100644 app/src/main/res/layout/fragment_coresettings.xml
 create mode 100644 app/src/main/res/layout/fragment_networksettings.xml
 create mode 100644 app/src/main/res/layout/widget_coresetting.xml
 create mode 100644 app/src/main/res/menu/context_setting.xml
 create mode 100644 app/src/main/res/values-de/strings_settings.xml
 create mode 100644 app/src/main/res/values-v17/styles_widgets.xml
 create mode 100644 app/src/main/res/values/strings_settings.xml

diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f4689def0..d7b29b283 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 e85d1de4a..c8324a735 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 8552ed8d6..d5be1e3fc 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 b8bc0e93a..bae8074b2 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 000000000..8997104a5
--- /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 9de5af5a6..3d86df20c 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 e12cd9aef..29251635e 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 30ba46c4b..d90d86e1c 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 91ed4cdb3..a5a3e7dfb 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 2621adf09..87230d548 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 f2cfb94bf..f63a6f3ae 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 08e21f53b..29e4db909 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 7dcbb7f02..5bb8ffefa 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 08abd25c9..7981dc1f0 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 15b0a5bd5..1c005598f 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 e65d8d47c..6c6ee0acc 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 000000000..4a2be941a
--- /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 341a591a8..b3e3fff99 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 3cb243e5f..7d7c78eab 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 000000000..24177ec86
--- /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 5e5fe63c9..b597440f8 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 03c5df1fe..86cc6cff6 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 000000000..09f567bbb
--- /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 000000000..311ba0a6e
--- /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 000000000..2b0e5768a
--- /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 000000000..7d580fb37
--- /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 000000000..525bed736
--- /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 000000000..972ac1a51
--- /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 000000000..f697f8a93
--- /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 5f6d1701f..000000000
--- 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 5d21e0bc9..000000000
--- 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 01947a640..000000000
--- 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 000000000..aff438caa
--- /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 000000000..0007abab4
--- /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 f64b961f1..30b536ccf 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 000000000..2b2d39efa
--- /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 000000000..d84e8ff1d
--- /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 000000000..f654040fa
--- /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 b95d98987..8c9c4e395 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 000000000..6d36188e6
--- /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 214b44fcd..31588b1be 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 000000000..c167e748c
--- /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 a3ebc09f1..ddffffba4 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 1403dac82..4da1e38c6 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 000000000..574f8689b
--- /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 000000000..5109234c2
--- /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 135be32d8..e1f512649 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 000000000..c6579633b
--- /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 ab9c1fb30..e4ec1d347 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 bccb74c55..2332cef6b 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 02cdf68e3..bdbdd4a8a 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 8b96dfd16..03f90a5a7 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 15ebd4539..03af6d933 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 ->
-- 
GitLab