diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 7b23fbd97afd9f1c5e62b0e90e034246c5935911..a092edb2e4f3365b1a362ef8199abf1741989200 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -41,6 +41,12 @@
       android:label="@string/label_details"
       android:parentActivityName=".ui.chat.ChatActivity"
       android:windowSoftInputMode="adjustResize" />
+    <activity
+      android:name=".ui.chat.topic.TopicActivity"
+      android:exported="false"
+      android:label="@string/label_topic"
+      android:parentActivityName=".ui.chat.info.InfoActivity"
+      android:windowSoftInputMode="adjustResize" />
 
     <!-- Client Settings -->
     <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 5fa67e3b46e06574d85e6320508433d48fd00e80..193c776129355b91da732aed6a93d44f31ce0cfd 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/dagger/ActivityModule.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/dagger/ActivityModule.kt
@@ -8,6 +8,8 @@ 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.chat.topic.TopicActivity
+import de.kuschku.quasseldroid.ui.chat.topic.TopicFragmentProvider
 import de.kuschku.quasseldroid.ui.clientsettings.about.AboutSettingsActivity
 import de.kuschku.quasseldroid.ui.clientsettings.about.AboutSettingsFragmentProvider
 import de.kuschku.quasseldroid.ui.clientsettings.app.AppSettingsActivity
@@ -38,6 +40,9 @@ abstract class ActivityModule {
   @ContributesAndroidInjector(modules = [InfoFragmentProvider::class])
   abstract fun bindInfoActivity(): InfoActivity
 
+  @ContributesAndroidInjector(modules = [TopicFragmentProvider::class])
+  abstract fun bindTopicActivity(): TopicActivity
+
   @ContributesAndroidInjector(modules = [AppSettingsFragmentProvider::class])
   abstract fun bindAppSettingsActivity(): AppSettingsActivity
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ToolbarFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ToolbarFragment.kt
index ca7cd350eb3054c8c73b8bfcbefe4f66929c440e..7f0e96b92e4e16b59251609583585da0383ad8cc 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ToolbarFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ToolbarFragment.kt
@@ -103,15 +103,18 @@ class ToolbarFragment : ServiceBoundFragment() {
           BufferInfo.Type.QueryBuffer.toInt()   -> InfoDescriptor(
             type = InfoType.User,
             nick = info.bufferName,
+            buffer = info.bufferId,
             network = info.networkId
           )
           BufferInfo.Type.ChannelBuffer.toInt() -> InfoDescriptor(
             type = InfoType.Channel,
             channel = info.bufferName,
+            buffer = info.bufferId,
             network = info.networkId
           )
           BufferInfo.Type.StatusBuffer.toInt()  -> InfoDescriptor(
             type = InfoType.Network,
+            buffer = info.bufferId,
             network = info.networkId
           )
           else                                  -> null
@@ -129,4 +132,4 @@ class ToolbarFragment : ServiceBoundFragment() {
   private fun colorizeDescription(description: String?) = ircFormatDeserializer.formatString(
     requireContext(), description, messageSettings.colorizeMirc
   )
-}
\ No newline at end of file
+}
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoDescriptor.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoDescriptor.kt
index ad5328320242fce75e53a6ed8e41210c490b001d..95c5a772e1d0b5dcc239b95ee4f7544f55022fb5 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoDescriptor.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoDescriptor.kt
@@ -6,5 +6,6 @@ data class InfoDescriptor(
   val type: InfoType,
   val nick: String? = null,
   val channel: String? = null,
+  val buffer: Int,
   val network: Int
-) : Serializable
\ No newline at end of file
+) : Serializable
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoFragment.kt
index acb8d8c7b0ef6627c74bd331e8f42121725670eb..4d2df684dd09c2ad2287d69f9a945750b1cabcbb 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoFragment.kt
@@ -1,18 +1,19 @@
 package de.kuschku.quasseldroid.ui.chat.info
 
 import android.arch.lifecycle.Observer
+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.Toast
 import butterknife.BindView
 import butterknife.ButterKnife
 import de.kuschku.libquassel.util.Optional
 import de.kuschku.libquassel.util.compatibility.LoggingHandler
 import de.kuschku.quasseldroid.R
+import de.kuschku.quasseldroid.ui.chat.topic.TopicActivity
 import de.kuschku.quasseldroid.util.helper.toLiveData
 import de.kuschku.quasseldroid.util.irc.format.ContentFormatter
 import de.kuschku.quasseldroid.util.service.ServiceBoundFragment
@@ -98,11 +99,9 @@ class InfoFragment : ServiceBoundFragment() {
                             name = getString(R.string.property_ircchannel_topic_action_edit),
                             featured = true,
                             onClick = {
-                              Toast.makeText(
-                                requireContext(),
-                                "Not implemented",
-                                Toast.LENGTH_SHORT
-                              ).show()
+                              val intent = Intent(requireContext(), TopicActivity::class.java)
+                              intent.putExtra("buffer", info.buffer)
+                              startActivity(intent)
                             }
                           )
                         )
@@ -130,4 +129,4 @@ class InfoFragment : ServiceBoundFragment() {
 
     return view
   }
-}
\ No newline at end of file
+}
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/ChatlineFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/ChatlineFragment.kt
index fcd2f85781361913eaec1e270284614872498752..cebc155c413c7cc0f85627bb225d280957b5ca47 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/ChatlineFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/ChatlineFragment.kt
@@ -77,7 +77,7 @@ class ChatlineFragment : ServiceBoundFragment() {
 
   override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                             savedInstanceState: Bundle?): View? {
-    val view = LayoutInflater.from(activity).inflate(R.layout.fragment_chatline, container, false)
+    val view = inflater.inflate(R.layout.fragment_chatline, container, false)
     ButterKnife.bind(this, view)
 
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/nicks/NickListFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/nicks/NickListFragment.kt
index edda1525503069d1f96a97bfa6708eb47818db3f..8d0362fbfceb852ccf3dc4d49a2f30d98d7de447 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/nicks/NickListFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/nicks/NickListFragment.kt
@@ -19,6 +19,7 @@ import com.bumptech.glide.Glide
 import com.bumptech.glide.ListPreloader
 import com.bumptech.glide.integration.recyclerview.RecyclerViewPreloader
 import com.bumptech.glide.util.FixedPreloadSizeProvider
+import de.kuschku.libquassel.protocol.Buffer_Type
 import de.kuschku.libquassel.quassel.BufferInfo
 import de.kuschku.libquassel.util.IrcUserUtils
 import de.kuschku.libquassel.util.helpers.value
@@ -151,14 +152,21 @@ class NickListFragment : ServiceBoundFragment() {
   }
 
   private val clickListener: ((String) -> Unit)? = { nick ->
-    viewModel.bufferData.value?.info?.let(BufferInfo::networkId)?.let { networkId ->
-      val intent = Intent(requireContext(), InfoActivity::class.java)
-      intent.putExtra("info", InfoDescriptor(
-        type = InfoType.User,
-        nick = nick,
-        network = networkId
-      ))
-      startActivity(intent)
+    viewModel.session.value?.orNull()?.bufferSyncer?.let { bufferSyncer ->
+      viewModel.bufferData.value?.info?.let(BufferInfo::networkId)?.let { networkId ->
+        val intent = Intent(requireContext(), InfoActivity::class.java)
+        intent.putExtra("info", InfoDescriptor(
+          type = InfoType.User,
+          nick = nick,
+          buffer = bufferSyncer.find(
+            bufferName = nick,
+            networkId = networkId,
+            type = Buffer_Type.of(Buffer_Type.QueryBuffer)
+          )?.bufferId ?: -1,
+          network = networkId
+        ))
+        startActivity(intent)
+      }
     }
   }
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/topic/TopicActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/topic/TopicActivity.kt
new file mode 100644
index 0000000000000000000000000000000000000000..83fb366f0ff367ff593379fa8c03f0c74ec53524
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/topic/TopicActivity.kt
@@ -0,0 +1,5 @@
+package de.kuschku.quasseldroid.ui.chat.topic
+
+import de.kuschku.quasseldroid.util.ui.SettingsActivity
+
+class TopicActivity : SettingsActivity(TopicFragment())
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/topic/TopicFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/topic/TopicFragment.kt
new file mode 100644
index 0000000000000000000000000000000000000000..5c7d3ac8a6a192fd923a0a75580b5f5cdb551c64
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/topic/TopicFragment.kt
@@ -0,0 +1,115 @@
+package de.kuschku.quasseldroid.ui.chat.topic
+
+import android.arch.lifecycle.Observer
+import android.arch.lifecycle.ViewModelProviders
+import android.os.Bundle
+import android.support.v7.widget.DefaultItemAnimator
+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 butterknife.BindView
+import butterknife.ButterKnife
+import de.kuschku.quasseldroid.R
+import de.kuschku.quasseldroid.settings.AppearanceSettings
+import de.kuschku.quasseldroid.settings.AutoCompleteSettings
+import de.kuschku.quasseldroid.settings.MessageSettings
+import de.kuschku.quasseldroid.ui.chat.input.*
+import de.kuschku.quasseldroid.ui.coresettings.SettingsFragment
+import de.kuschku.quasseldroid.util.helper.invoke
+import de.kuschku.quasseldroid.util.helper.toLiveData
+import de.kuschku.quasseldroid.util.irc.format.IrcFormatDeserializer
+import de.kuschku.quasseldroid.util.irc.format.IrcFormatSerializer
+import de.kuschku.quasseldroid.viewmodel.EditorViewModel
+import javax.inject.Inject
+
+class TopicFragment : SettingsFragment() {
+  @BindView(R.id.chatline)
+  lateinit var chatline: RichEditText
+
+  @BindView(R.id.formatting_toolbar)
+  lateinit var toolbar: RichToolbar
+
+  @Inject
+  lateinit var autoCompleteSettings: AutoCompleteSettings
+
+  @Inject
+  lateinit var messageSettings: MessageSettings
+
+  @Inject
+  lateinit var appearanceSettings: AppearanceSettings
+
+  @Inject
+  lateinit var formatDeserializer: IrcFormatDeserializer
+
+  @Inject
+  lateinit var formatSerializer: IrcFormatSerializer
+
+  lateinit var editorHelper: EditorHelper
+
+  override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
+                            savedInstanceState: Bundle?): View? {
+    val view = inflater.inflate(R.layout.fragment_topic, container, false)
+    ButterKnife.bind(this, view)
+
+    val editorViewModel = ViewModelProviders.of(this).get(EditorViewModel::class.java)
+    editorViewModel.quasselViewModel.onNext(viewModel)
+
+    val autoCompleteHelper = AutoCompleteHelper(
+      requireActivity(),
+      autoCompleteSettings,
+      messageSettings,
+      formatDeserializer,
+      editorViewModel
+    )
+
+    editorHelper = EditorHelper(
+      requireActivity(),
+      chatline,
+      toolbar,
+      autoCompleteHelper,
+      autoCompleteSettings,
+      appearanceSettings
+    )
+
+    editorViewModel.lastWord.onNext(editorHelper.lastWord)
+
+    if (autoCompleteSettings.prefix || autoCompleteSettings.auto) {
+      val autoCompleteLists = listOfNotNull<RecyclerView>(
+        view.findViewById(R.id.autocomplete_list)
+      )
+      val autocompleteAdapter = AutoCompleteAdapter(messageSettings, chatline::autoComplete)
+      for (autoCompleteList in autoCompleteLists) {
+        autoCompleteList.layoutManager = LinearLayoutManager(activity)
+        autoCompleteList.itemAnimator = DefaultItemAnimator()
+        autoCompleteList.adapter = autocompleteAdapter
+      }
+    }
+
+
+    val bufferId = arguments?.getInt("buffer", -1) ?: -1
+    viewModel.buffer.onNext(bufferId)
+    viewModel.bufferData.filter {
+      it.info != null
+    }.firstElement().toLiveData().observe(this, Observer {
+      chatline.setText(formatDeserializer.formatString(chatline.context, it?.description, true))
+    })
+
+    return view
+  }
+
+  override fun onSave(): Boolean {
+    viewModel.session { sessionOptional ->
+      val session = sessionOptional.orNull()
+      viewModel.buffer { bufferId ->
+        session?.bufferSyncer?.bufferInfo(bufferId)?.also { bufferInfo ->
+          val topic = formatSerializer.toEscapeCodes(chatline.text)
+          session.rpcHandler?.sendInput(bufferInfo, "/topic $topic")
+          return true
+        }
+      }
+    }
+    return false
+  }
+}
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/topic/TopicFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/topic/TopicFragmentProvider.kt
new file mode 100644
index 0000000000000000000000000000000000000000..0cdcb82b07044e08cd3b9b6f6e9ce5bdf916a9e5
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/topic/TopicFragmentProvider.kt
@@ -0,0 +1,10 @@
+package de.kuschku.quasseldroid.ui.chat.topic
+
+import dagger.Module
+import dagger.android.ContributesAndroidInjector
+
+@Module
+abstract class TopicFragmentProvider {
+  @ContributesAndroidInjector
+  abstract fun bindTopicFragment(): TopicFragment
+}
diff --git a/app/src/main/res/layout/fragment_topic.xml b/app/src/main/res/layout/fragment_topic.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0cbc3a0de9506a45fdaf522151df6acb8c987bbd
--- /dev/null
+++ b/app/src/main/res/layout/fragment_topic.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+  xmlns:app="http://schemas.android.com/apk/res-auto"
+  android:layout_width="match_parent"
+  android:layout_height="match_parent"
+  android:orientation="vertical">
+
+  <ScrollView
+    android:id="@+id/chatline_scroller"
+    android:layout_width="match_parent"
+    android:layout_height="0dip"
+    android:layout_weight="1">
+
+    <de.kuschku.quasseldroid.ui.chat.input.RichEditText
+      android:id="@+id/chatline"
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:background="@android:color/transparent"
+      android:gravity="center_vertical"
+      android:hint="@string/label_placeholder_topic"
+      android:imeOptions="flagNoExtractUi"
+      android:inputType="textCapSentences|textAutoCorrect|textShortMessage|textMultiLine"
+      android:minHeight="?attr/actionBarSize"
+      android:paddingBottom="8dp"
+      android:paddingLeft="20dp"
+      android:paddingRight="20dp"
+      android:paddingTop="8dp"
+      android:textColor="?attr/colorForeground"
+      android:textSize="16sp" />
+  </ScrollView>
+
+  <de.kuschku.quasseldroid.util.ui.AutoCompleteRecyclerView
+    android:id="@+id/autocomplete_list"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content" />
+
+  <android.support.design.widget.AppBarLayout
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="?attr/colorBackgroundCard">
+
+    <de.kuschku.quasseldroid.ui.chat.input.RichToolbar
+      android:id="@+id/formatting_toolbar"
+      android:layout_width="match_parent"
+      android:layout_height="?attr/actionBarSize"
+      app:contentInsetStart="0dip" />
+  </android.support.design.widget.AppBarLayout>
+</LinearLayout>
diff --git a/app/src/main/res/layout/layout_editor.xml b/app/src/main/res/layout/layout_editor.xml
index 65fc344c985bb505ec40d62eaad05265ec62d963..e0f2d665891e6d35906cd4fab2149ef5d41d224f 100644
--- a/app/src/main/res/layout/layout_editor.xml
+++ b/app/src/main/res/layout/layout_editor.xml
@@ -33,7 +33,7 @@
       android:layout_height="wrap_content"
       android:background="@android:color/transparent"
       android:gravity="center_vertical"
-      android:hint="@string/label_placeholder"
+      android:hint="@string/label_placeholder_message"
       android:imeOptions="flagNoExtractUi"
       android:inputType="textCapSentences|textAutoCorrect|textShortMessage"
       android:minHeight="?attr/actionBarSize"
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 503ddec9ac71cab2d29aeec3c1848e97b84c46ba..594b7cfcd47b3592cf62d194b6c5c65424270da7 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -42,7 +42,8 @@
   <string name="label_reset">Zurücksetzen</string>
   <string name="label_open">Öffnen</string>
   <string name="label_part">Verlassen</string>
-  <string name="label_placeholder">Nachricht schreiben…</string>
+  <string name="label_placeholder_message">Nachricht schreiben…</string>
+  <string name="label_placeholder_topic">Beschreib das Thema des Kanals…</string>
   <string name="label_rename">Umbenennen</string>
   <string name="label_save">Speichern</string>
   <string name="label_select">Auswählen</string>
@@ -52,6 +53,7 @@
   <string name="label_share">Teilen</string>
   <string name="label_share_crashreport">Absturzbericht Teilen</string>
   <string name="label_show_hidden">Alle anzeigen</string>
+  <string name="label_topic">Kanal-Thema</string>
   <string name="label_unhide">Nicht mehr ausblenden</string>
   <string name="label_website">Webseite</string>
   <string name="label_yes">Ja</string>
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 64d745e20aa50d851ef333d34af19b001eeb504b..1aecf7ac075df24bcf1262113ace5ab690c56683 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -42,7 +42,8 @@
   <string name="label_reset">Reset</string>
   <string name="label_open">Open</string>
   <string name="label_part">Part</string>
-  <string name="label_placeholder">Write a message…</string>
+  <string name="label_placeholder_message">Write a message…</string>
+  <string name="label_placeholder_topic">Describe the channel topic…</string>
   <string name="label_rename">Rename</string>
   <string name="label_save">Save</string>
   <string name="label_select">Select</string>
@@ -52,6 +53,7 @@
   <string name="label_share">Share</string>
   <string name="label_share_crashreport">Share Crash Report</string>
   <string name="label_show_hidden">Show Hidden</string>
+  <string name="label_topic">Channel Topic</string>
   <string name="label_unhide">Make Visible</string>
   <string name="label_website">Website</string>
   <string name="label_yes">Yes</string>