diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/create/NetworkAdapter.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/NetworkAdapter.kt
similarity index 98%
rename from app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/create/NetworkAdapter.kt
rename to app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/NetworkAdapter.kt
index 512c396d45ef076e207f8ab1bfc4a90652561516..8ce027f86e41e0578b8a02d201a0e2a2d424a596 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/create/NetworkAdapter.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/NetworkAdapter.kt
@@ -17,7 +17,7 @@
  * with this program. If not, see <http://www.gnu.org/licenses/>.
  */
 
-package de.kuschku.quasseldroid.ui.chat.add.create
+package de.kuschku.quasseldroid.ui.chat.add
 
 import android.view.LayoutInflater
 import android.view.View
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/create/NetworkItem.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/NetworkItem.kt
similarity index 94%
rename from app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/create/NetworkItem.kt
rename to app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/NetworkItem.kt
index 7a2341bddac2f8788abc5b14e0acf7cc8a87b837..b978fb1873a74beb326ed2cd842b2878e5b1820b 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/create/NetworkItem.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/NetworkItem.kt
@@ -17,7 +17,7 @@
  * with this program. If not, see <http://www.gnu.org/licenses/>.
  */
 
-package de.kuschku.quasseldroid.ui.chat.add.create
+package de.kuschku.quasseldroid.ui.chat.add
 
 import de.kuschku.libquassel.protocol.NetworkId
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/create/ChannelCreateActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/create/ChannelCreateActivity.kt
index b7a982e4e94861fd5b1384c1c726b90d137818dc..aabff7772854d55212dcd188cf800c1b74d75458 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/create/ChannelCreateActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/create/ChannelCreateActivity.kt
@@ -21,11 +21,23 @@ package de.kuschku.quasseldroid.ui.chat.add.create
 
 import android.content.Context
 import android.content.Intent
+import de.kuschku.libquassel.protocol.NetworkId
 import de.kuschku.quasseldroid.util.ui.settings.ServiceBoundSettingsActivity
 
 class ChannelCreateActivity : ServiceBoundSettingsActivity(ChannelCreateFragment()) {
   companion object {
-    fun launch(context: Context) = context.startActivity(intent(context))
-    fun intent(context: Context) = Intent(context, ChannelCreateActivity::class.java)
+    fun launch(
+      context: Context,
+      networkId: NetworkId? = null
+    ) = context.startActivity(intent(context, networkId))
+
+    fun intent(
+      context: Context,
+      networkId: NetworkId? = null
+    ) = Intent(context, ChannelCreateActivity::class.java).apply {
+      if (networkId != null) {
+        putExtra("network_id", networkId.id)
+      }
+    }
   }
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/create/ChannelCreateFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/create/ChannelCreateFragment.kt
index b07ef1f8609bdc68df704a7a29bd9d0677a96aba..e3baf6fb13f3bd4db350d46ec351db77589d915d 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/create/ChannelCreateFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/create/ChannelCreateFragment.kt
@@ -38,6 +38,8 @@ import de.kuschku.libquassel.util.helpers.nullIf
 import de.kuschku.libquassel.util.helpers.value
 import de.kuschku.quasseldroid.R
 import de.kuschku.quasseldroid.ui.chat.ChatActivity
+import de.kuschku.quasseldroid.ui.chat.add.NetworkAdapter
+import de.kuschku.quasseldroid.ui.chat.add.NetworkItem
 import de.kuschku.quasseldroid.util.helper.combineLatest
 import de.kuschku.quasseldroid.util.helper.setDependent
 import de.kuschku.quasseldroid.util.helper.toLiveData
@@ -79,21 +81,30 @@ class ChannelCreateFragment : ServiceBoundSettingsFragment() {
     val view = inflater.inflate(R.layout.add_create, container, false)
     ButterKnife.bind(this, view)
 
+    val networkId = NetworkId(arguments?.getInt("network_id", 0) ?: 0)
+
     val networkAdapter = NetworkAdapter()
     network.adapter = networkAdapter
 
+    var hasSetNetwork = false
     modelHelper.networks.switchMap {
       combineLatest(it.values.map(Network::liveNetworkInfo)).map {
         it.map {
-          NetworkItem(
-            it.networkId,
-            it.networkName
-          )
+          NetworkItem(it.networkId, it.networkName)
         }.sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER, NetworkItem::name))
       }
     }.toLiveData().observe(this, Observer {
       if (it != null) {
         networkAdapter.submitList(it)
+        if (!hasSetNetwork && networkId.isValidId() && it.isNotEmpty()) {
+          network.post {
+            val index = networkAdapter.indexOf(networkId)
+            if (index != null) {
+              network.setSelection(index)
+            }
+          }
+          hasSetNetwork = true
+        }
       }
     })
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/join/ChannelJoinActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/join/ChannelJoinActivity.kt
index 22a5fb7cb3c0eebbed7ea95e3515468d87ec37da..ebc1d5e6b983c0f79d49d728b7002a87db827bf7 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/join/ChannelJoinActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/join/ChannelJoinActivity.kt
@@ -21,11 +21,23 @@ package de.kuschku.quasseldroid.ui.chat.add.join
 
 import android.content.Context
 import android.content.Intent
+import de.kuschku.libquassel.protocol.NetworkId
 import de.kuschku.quasseldroid.util.ui.settings.ServiceBoundSettingsActivity
 
 class ChannelJoinActivity : ServiceBoundSettingsActivity(ChannelJoinFragment()) {
   companion object {
-    fun launch(context: Context) = context.startActivity(intent(context))
-    fun intent(context: Context) = Intent(context, ChannelJoinActivity::class.java)
+    fun launch(
+      context: Context,
+      networkId: NetworkId? = null
+    ) = context.startActivity(intent(context, networkId))
+
+    fun intent(
+      context: Context,
+      networkId: NetworkId? = null
+    ) = Intent(context, ChannelJoinActivity::class.java).apply {
+      if (networkId != null) {
+        putExtra("network_id", networkId.id)
+      }
+    }
   }
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/join/ChannelJoinFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/join/ChannelJoinFragment.kt
index 0785d1c619968a2614bd6fa250ee99d1d972ca16..a9184d2689b890dd5cb6d09bfcc6cbf15388cc9d 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/join/ChannelJoinFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/join/ChannelJoinFragment.kt
@@ -23,17 +23,95 @@ import android.os.Bundle
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
+import android.widget.Button
+import android.widget.EditText
+import androidx.appcompat.widget.AppCompatSpinner
+import androidx.lifecycle.Observer
+import butterknife.BindView
 import butterknife.ButterKnife
+import de.kuschku.libquassel.protocol.Buffer_Type
+import de.kuschku.libquassel.protocol.NetworkId
+import de.kuschku.libquassel.quassel.syncables.Network
+import de.kuschku.libquassel.util.helpers.value
 import de.kuschku.quasseldroid.R
+import de.kuschku.quasseldroid.ui.chat.ChatActivity
+import de.kuschku.quasseldroid.ui.chat.add.NetworkAdapter
+import de.kuschku.quasseldroid.ui.chat.add.NetworkItem
+import de.kuschku.quasseldroid.util.helper.combineLatest
+import de.kuschku.quasseldroid.util.helper.toLiveData
 import de.kuschku.quasseldroid.util.service.ServiceBoundFragment
+import de.kuschku.quasseldroid.viewmodel.helper.QuasselViewModelHelper
+import javax.inject.Inject
 
 class ChannelJoinFragment : ServiceBoundFragment() {
+  @BindView(R.id.network)
+  lateinit var network: AppCompatSpinner
+
+  @BindView(R.id.name)
+  lateinit var name: EditText
+
+  @BindView(R.id.join)
+  lateinit var join: Button
+
+  @Inject
+  lateinit var modelHelper: QuasselViewModelHelper
 
   override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                             savedInstanceState: Bundle?): View? {
     val view = inflater.inflate(R.layout.add_join, container, false)
     ButterKnife.bind(this, view)
 
+    val networkId = NetworkId(arguments?.getInt("network_id", 0) ?: 0)
+
+    val networkAdapter = NetworkAdapter()
+    network.adapter = networkAdapter
+
+    var hasSetNetwork = false
+    modelHelper.networks.switchMap {
+      combineLatest(it.values.map(Network::liveNetworkInfo)).map {
+        it.map {
+          NetworkItem(it.networkId, it.networkName)
+        }.sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER, NetworkItem::name))
+      }
+    }.toLiveData().observe(this, Observer {
+      if (it != null) {
+        networkAdapter.submitList(it)
+        if (!hasSetNetwork && networkId.isValidId() && it.isNotEmpty()) {
+          network.post {
+            val index = networkAdapter.indexOf(networkId)
+            if (index != null) {
+              network.setSelection(index)
+            }
+          }
+          hasSetNetwork = true
+        }
+      }
+    })
+
+    join.setOnClickListener {
+      join.setText(R.string.label_saving)
+      join.isEnabled = false
+
+      val networkId = NetworkId(network.selectedItemId.toInt())
+      val channelName = name.text.toString().trim()
+
+      modelHelper.bufferSyncer.value?.orNull()?.let { bufferSyncer ->
+        bufferSyncer.find(
+          networkId = networkId,
+          type = Buffer_Type.of(Buffer_Type.StatusBuffer)
+        )?.let { statusBuffer ->
+          modelHelper.session.value?.orNull()?.rpcHandler?.apply {
+            sendInput(statusBuffer, "/join $channelName")
+          }
+        }
+      }
+
+      activity?.let {
+        it.finish()
+        ChatActivity.launch(it, networkId = networkId, channel = channelName)
+      }
+    }
+
     return view
   }
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/query/QueryCreateActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/query/QueryCreateActivity.kt
index 7c20d2d07ba93a38b6e1ba8da578d1d9182b0d65..ab4f880fb23b162dfc04461cc010503143cf0564 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/query/QueryCreateActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/query/QueryCreateActivity.kt
@@ -21,11 +21,23 @@ package de.kuschku.quasseldroid.ui.chat.add.query
 
 import android.content.Context
 import android.content.Intent
+import de.kuschku.libquassel.protocol.NetworkId
 import de.kuschku.quasseldroid.util.ui.settings.ServiceBoundSettingsActivity
 
 class QueryCreateActivity : ServiceBoundSettingsActivity(QueryCreateFragment()) {
   companion object {
-    fun launch(context: Context) = context.startActivity(intent(context))
-    fun intent(context: Context) = Intent(context, QueryCreateActivity::class.java)
+    fun launch(
+      context: Context,
+      networkId: NetworkId? = null
+    ) = context.startActivity(intent(context, networkId))
+
+    fun intent(
+      context: Context,
+      networkId: NetworkId? = null
+    ) = Intent(context, QueryCreateActivity::class.java).apply {
+      if (networkId != null) {
+        putExtra("network_id", networkId.id)
+      }
+    }
   }
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/buffers/BufferViewConfigFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/buffers/BufferViewConfigFragment.kt
index 7292f2878ef79c8f1ab063e4fdb4fbbe50861427..2b9874b35ccc348c311350771a76cd447c5e13ad 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/buffers/BufferViewConfigFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/buffers/BufferViewConfigFragment.kt
@@ -311,14 +311,16 @@ class BufferViewConfigFragment : ServiceBoundFragment() {
       getColor(0, 0)
     }
 
+    var chatListState: Parcelable? = savedInstanceState?.getParcelable(KEY_STATE_LIST)
     var hasRestoredChatListState = false
     listAdapter.setOnUpdateFinishedListener {
-      if (!hasRestoredChatListState && it.isNotEmpty()) {
+      if (it.isNotEmpty()) {
         chatList.layoutManager?.let {
-          savedInstanceState?.getParcelable<Parcelable>(KEY_STATE_LIST)
-            ?.let(it::onRestoreInstanceState)
+          if (chatListState != null) {
+            it.onRestoreInstanceState(chatListState)
+            hasRestoredChatListState = true
+          }
         }
-        hasRestoredChatListState = true
       }
     }
 
@@ -335,76 +337,74 @@ class BufferViewConfigFragment : ServiceBoundFragment() {
       modelHelper.selectedBuffer,
       database.filtered().listenRx(accountId).toObservable(),
       accountDatabase.accounts().listenDefaultFiltered(accountId, 0).toObservable()
-    ).toLiveData().observe(this, Observer { it ->
-      it?.let { (info, expandedNetworks, selected, filteredList, defaultFiltered) ->
-        runInBackground {
-          val (config, list) = info ?: Pair(null, emptyList())
-          val minimumActivity = config?.minimumActivity() ?: Buffer_Activity.NONE
-          val activities = filteredList.associate { it.bufferId to it.filtered.toUInt() }
-          val processedList = list.asSequence().sortedBy { props ->
-            !props.info.type.hasFlag(Buffer_Type.StatusBuffer)
-          }.sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER) { props ->
-            props.network.networkName
-          }).map { props ->
-            val activity = props.activity - (activities[props.info.bufferId]
-                                             ?: defaultFiltered?.toUInt()
-                                             ?: 0u)
-            BufferListItem(
-              props.copy(
-                activity = activity,
-                description = ircFormatDeserializer.formatString(
-                  props.description.toString(),
-                  colorize = messageSettings.colorizeMirc
-                ),
-                bufferActivity = Buffer_Activity.of(
-                  when {
-                    props.highlights > 0                  -> Buffer_Activity.Highlight
-                    activity.hasFlag(Message_Type.Plain) ||
-                    activity.hasFlag(Message_Type.Notice) ||
-                    activity.hasFlag(Message_Type.Action) -> Buffer_Activity.NewMessage
-                    activity.isNotEmpty()                 -> Buffer_Activity.OtherActivity
-                    else                                  -> Buffer_Activity.NoActivity
-                  }
-                ),
-                fallbackDrawable = if (props.info.type.hasFlag(Buffer_Type.QueryBuffer)) {
-                  props.ircUser?.let {
-                    val nickName = it.nick()
-                    val useSelfColor = when (messageSettings.colorizeNicknames) {
-                      MessageSettings.ColorizeNicknamesMode.ALL          -> false
-                      MessageSettings.ColorizeNicknamesMode.ALL_BUT_MINE ->
-                        props.ircUser?.network()?.isMyNick(nickName) == true
-                      MessageSettings.ColorizeNicknamesMode.NONE         -> true
-                    }
-
-                    colorContext.buildTextDrawable(it.nick(), useSelfColor)
-                  } ?: colorContext.buildTextDrawable("", colorAway)
-                } else {
-                  val color = if (props.bufferStatus == BufferStatus.ONLINE) colorAccent
-                  else colorAway
-
-                  colorContext.buildTextDrawable("#", color)
-                },
-                avatarUrls = props.ircUser?.let {
-                  AvatarHelper.avatar(messageSettings, it, avatarSize)
-                } ?: emptyList()
-              ),
-              BufferState(
-                networkExpanded = expandedNetworks[props.network.networkId]
-                                  ?: (props.networkConnectionState == INetwork.ConnectionState.Initialized),
-                selected = selected.info?.bufferId == props.info.bufferId
-              )
-            )
-          }.filter { (props, state) ->
-            (props.info.type.hasFlag(BufferInfo.Type.StatusBuffer) || state.networkExpanded) &&
-            (minimumActivity.toInt() <= props.bufferActivity.toInt() ||
-             props.info.type.hasFlag(Buffer_Type.StatusBuffer))
-          }.toList()
-
-          activity?.runOnUiThread {
-            listAdapter.submitList(processedList)
-          }
-        }
+    ).map { (info, expandedNetworks, selected, filteredList, defaultFiltered) ->
+      val (config, list) = info ?: Pair(null, emptyList())
+      val minimumActivity = config?.minimumActivity() ?: Buffer_Activity.NONE
+      val activities = filteredList.associate { it.bufferId to it.filtered.toUInt() }
+      list.asSequence().sortedBy { props ->
+        !props.info.type.hasFlag(Buffer_Type.StatusBuffer)
+      }.sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER) { props ->
+        props.network.networkName
+      }).map { props ->
+        val activity = props.activity - (activities[props.info.bufferId]
+                                         ?: defaultFiltered?.toUInt()
+                                         ?: 0u)
+        BufferListItem(
+          props.copy(
+            activity = activity,
+            description = ircFormatDeserializer.formatString(
+              props.description.toString(),
+              colorize = messageSettings.colorizeMirc
+            ),
+            bufferActivity = Buffer_Activity.of(
+              when {
+                props.highlights > 0                  -> Buffer_Activity.Highlight
+                activity.hasFlag(Message_Type.Plain) ||
+                activity.hasFlag(Message_Type.Notice) ||
+                activity.hasFlag(Message_Type.Action) -> Buffer_Activity.NewMessage
+                activity.isNotEmpty()                 -> Buffer_Activity.OtherActivity
+                else                                  -> Buffer_Activity.NoActivity
+              }
+            ),
+            fallbackDrawable = if (props.info.type.hasFlag(Buffer_Type.QueryBuffer)) {
+              props.ircUser?.let {
+                val nickName = it.nick()
+                val useSelfColor = when (messageSettings.colorizeNicknames) {
+                  MessageSettings.ColorizeNicknamesMode.ALL          -> false
+                  MessageSettings.ColorizeNicknamesMode.ALL_BUT_MINE ->
+                    props.ircUser?.network()?.isMyNick(nickName) == true
+                  MessageSettings.ColorizeNicknamesMode.NONE         -> true
+                }
+
+                colorContext.buildTextDrawable(it.nick(), useSelfColor)
+              } ?: colorContext.buildTextDrawable("", colorAway)
+            } else {
+              val color = if (props.bufferStatus == BufferStatus.ONLINE) colorAccent
+              else colorAway
+
+              colorContext.buildTextDrawable("#", color)
+            },
+            avatarUrls = props.ircUser?.let {
+              AvatarHelper.avatar(messageSettings, it, avatarSize)
+            } ?: emptyList()
+          ),
+          BufferState(
+            networkExpanded = expandedNetworks[props.network.networkId]
+                              ?: (props.networkConnectionState == INetwork.ConnectionState.Initialized),
+            selected = selected.info?.bufferId == props.info.bufferId
+          )
+        )
+      }.filter { (props, state) ->
+        (props.info.type.hasFlag(BufferInfo.Type.StatusBuffer) || state.networkExpanded) &&
+        (minimumActivity.toInt() <= props.bufferActivity.toInt() ||
+         props.info.type.hasFlag(Buffer_Type.StatusBuffer))
+      }.toList()
+    }.toLiveData().observe(this, Observer { processedList ->
+      if (hasRestoredChatListState) {
+        chatListState = chatList.layoutManager?.onSaveInstanceState()
+        hasRestoredChatListState = false
       }
+      listAdapter.submitList(processedList)
     })
     listAdapter.setOnClickListener(this@BufferViewConfigFragment::clickListener)
     listAdapter.setOnLongClickListener(this@BufferViewConfigFragment::longClickListener)
@@ -501,9 +501,7 @@ class BufferViewConfigFragment : ServiceBoundFragment() {
         else                    -> false
       }
     }
-    chatList.layoutManager = object : LinearLayoutManager(context) {
-      override fun supportsPredictiveItemAnimations() = false
-    }
+    chatList.layoutManager = LinearLayoutManager(context)
     chatList.itemAnimator = DefaultItemAnimator()
     chatList.setItemViewCacheSize(10)
 
@@ -554,7 +552,7 @@ class BufferViewConfigFragment : ServiceBoundFragment() {
     @ColorInt var fabBackground2 = 0
     view.context.theme.styledAttributes(
       R.attr.colorTextPrimary, R.attr.colorBackgroundCard,
-      R.attr.senderColorF, R.attr.senderColorE, R.attr.senderColorD
+      R.attr.senderColorE, R.attr.senderColorD, R.attr.senderColorC
     ) {
       colorLabel = getColor(0, 0)
       colorLabelBackground = getColor(1, 0)
@@ -574,17 +572,17 @@ class BufferViewConfigFragment : ServiceBoundFragment() {
         .create()
     )
 
-    if (BuildConfig.DEBUG) {
-      fab.addActionItem(
-        SpeedDialActionItem.Builder(R.id.fab_join, R.drawable.ic_channel)
-          .setFabBackgroundColor(fabBackground1)
-          .setFabImageTintColor(0xffffffffu.toInt())
-          .setLabel(R.string.label_join_long)
-          .setLabelBackgroundColor(colorLabelBackground)
-          .setLabelColor(colorLabel)
-          .create()
-      )
+    fab.addActionItem(
+      SpeedDialActionItem.Builder(R.id.fab_join, R.drawable.ic_channel)
+        .setFabBackgroundColor(fabBackground1)
+        .setFabImageTintColor(0xffffffffu.toInt())
+        .setLabel(R.string.label_join_long)
+        .setLabelBackgroundColor(colorLabelBackground)
+        .setLabelColor(colorLabel)
+        .create()
+    )
 
+    if (BuildConfig.DEBUG) {
       fab.addActionItem(
         SpeedDialActionItem.Builder(R.id.fab_query, R.drawable.ic_account)
           .setFabBackgroundColor(fabBackground2)
@@ -597,19 +595,26 @@ class BufferViewConfigFragment : ServiceBoundFragment() {
     }
 
     fab.setOnActionSelectedListener {
+      val networkId = modelHelper.bufferData?.value?.network?.networkId()
       when (it.id) {
         R.id.fab_query  -> {
-          context?.let(QueryCreateActivity.Companion::launch)
+          context?.let {
+            QueryCreateActivity.launch(it, networkId = networkId)
+          }
           fab.close(false)
           true
         }
         R.id.fab_join   -> {
-          context?.let(ChannelJoinActivity.Companion::launch)
+          context?.let {
+            ChannelJoinActivity.launch(it, networkId = networkId)
+          }
           fab.close(false)
           true
         }
         R.id.fab_create -> {
-          context?.let(ChannelCreateActivity.Companion::launch)
+          context?.let {
+            ChannelCreateActivity.launch(it, networkId = networkId)
+          }
           fab.close(false)
           true
         }
diff --git a/app/src/main/res/layout/add_join.xml b/app/src/main/res/layout/add_join.xml
index c409cbfc59be09cabdba386495e483cd4e7232c9..6b039888cf7b61d9164697d41c54ba9f80fc8cee 100644
--- a/app/src/main/res/layout/add_join.xml
+++ b/app/src/main/res/layout/add_join.xml
@@ -1,4 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
+
 <!--
   Quasseldroid - Quassel client for Android
 
@@ -22,32 +23,68 @@
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
-  android:orientation="vertical"
-  android:padding="16dp">
+  android:orientation="vertical">
 
-  <de.kuschku.ui.spinner.MaterialSpinnerLayout
-    style="@style/Widget.CustomSpinnerLayout"
+  <FrameLayout
     android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:hint="@string/label_network">
+    android:layout_height="0dip"
+    android:layout_weight="1">
 
-    <androidx.appcompat.widget.AppCompatSpinner
-      android:id="@+id/network"
-      style="@style/Widget.MaterialSpinner"
+    <androidx.core.widget.NestedScrollView
       android:layout_width="match_parent"
-      android:layout_height="wrap_content"
-      tools:listitem="@layout/widget_spinner_item_material" />
-  </de.kuschku.ui.spinner.MaterialSpinnerLayout>
+      android:layout_height="match_parent">
+
+      <LinearLayout style="@style/Widget.CoreSettings.Wrapper">
+
+        <de.kuschku.ui.spinner.MaterialSpinnerLayout
+          style="@style/Widget.CustomSpinnerLayout"
+          android:layout_width="match_parent"
+          android:layout_height="wrap_content"
+          android:hint="@string/label_network">
+
+          <androidx.appcompat.widget.AppCompatSpinner
+            android:id="@+id/network"
+            style="@style/Widget.MaterialSpinner"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            tools:listitem="@layout/widget_spinner_item_material" />
+        </de.kuschku.ui.spinner.MaterialSpinnerLayout>
 
-  <com.google.android.material.textfield.TextInputLayout
-    style="@style/Widget.CustomTextInput"
+        <com.google.android.material.textfield.TextInputLayout
+          style="@style/Widget.CustomTextInput"
+          android:layout_width="match_parent"
+          android:layout_height="wrap_content"
+          android:hint="@string/label_channel_name">
+
+          <com.google.android.material.textfield.TextInputEditText
+            android:id="@+id/name"
+            style="@style/Widget.CoreSettings.EditText"
+            tools:text="#trees" />
+        </com.google.android.material.textfield.TextInputLayout>
+      </LinearLayout>
+    </androidx.core.widget.NestedScrollView>
+
+    <de.kuschku.quasseldroid.util.ui.view.ShadowView
+      android:layout_width="match_parent"
+      android:layout_height="@dimen/shadow_height"
+      android:layout_gravity="bottom"
+      android:gravity="bottom" />
+  </FrameLayout>
+
+  <LinearLayout
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:hint="@string/settings_aliasitem_name">
+    android:gravity="end"
+    android:paddingLeft="16dp"
+    android:paddingTop="4dp"
+    android:paddingRight="16dp"
+    android:paddingBottom="4dp">
 
-    <com.google.android.material.textfield.TextInputEditText
-      android:id="@+id/name"
-      style="@style/Widget.CoreSettings.EditText"
-      tools:text="back" />
-  </com.google.android.material.textfield.TextInputLayout>
+    <com.google.android.material.button.MaterialButton
+      android:id="@+id/join"
+      style="@style/Widget.Button.Colored"
+      android:layout_width="wrap_content"
+      android:layout_height="wrap_content"
+      android:text="@string/label_join" />
+  </LinearLayout>
 </LinearLayout>