diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/QuasselMessageRenderer.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/QuasselMessageRenderer.kt
index eaa49a9018793c8a90345f6a8db0945535e1f3cd..688beaa65b0d1372dbcc110324dbef876cff8f36 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/QuasselMessageRenderer.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/QuasselMessageRenderer.kt
@@ -10,6 +10,7 @@ import de.kuschku.libquassel.protocol.Message.MessageType.*
 import de.kuschku.libquassel.protocol.Message_Type
 import de.kuschku.quasseldroid_ng.R
 import de.kuschku.quasseldroid_ng.persistence.QuasselDatabase
+import de.kuschku.quasseldroid_ng.util.helper.styledAttributes
 import de.kuschku.quasseldroid_ng.util.quassel.IrcUserUtils
 import de.kuschku.quasseldroid_ng.util.ui.SpanFormatter
 import org.threeten.bp.ZoneId
@@ -20,23 +21,21 @@ class QuasselMessageRenderer(context: Context) : MessageRenderer {
   private val timeFormatter = DateTimeFormatter.ofPattern(
     (DateFormat.getTimeFormat(context) as SimpleDateFormat).toLocalizedPattern()
   )
-  private val senderColors: IntArray
+  private lateinit var senderColors: IntArray
 
   private val zoneId = ZoneId.systemDefault()
 
   init {
-    val typedArray = context.obtainStyledAttributes(
-      intArrayOf(
-        R.attr.senderColor0, R.attr.senderColor1, R.attr.senderColor2, R.attr.senderColor3,
+    context.theme.styledAttributes(
+      R.attr.senderColor0, R.attr.senderColor1, R.attr.senderColor2, R.attr.senderColor3,
         R.attr.senderColor4, R.attr.senderColor5, R.attr.senderColor6, R.attr.senderColor7,
         R.attr.senderColor8, R.attr.senderColor9, R.attr.senderColorA, R.attr.senderColorB,
         R.attr.senderColorC, R.attr.senderColorD, R.attr.senderColorE, R.attr.senderColorF
-      )
-    )
-    senderColors = IntArray(16) {
-      typedArray.getColor(it, 0)
+    ) {
+      senderColors = IntArray(16) {
+        getColor(it, 0)
+      }
     }
-    typedArray.recycle()
   }
 
   override fun layout(type: Message_Type?, hasHighlight: Boolean)
@@ -66,16 +65,18 @@ class QuasselMessageRenderer(context: Context) : MessageRenderer {
   }
 
   override fun render(message: QuasselDatabase.DatabaseMessage): FormattedMessage {
-    return FormattedMessage(
-      message.messageId,
-      timeFormatter.format(message.time.atZone(zoneId)),
-      SpanFormatter.format(
-        "%s%s: %s",
-        message.senderPrefixes,
-        formatNick(message.sender),
-        message.content
+    when (message.type) {
+      else -> return FormattedMessage(
+        message.messageId,
+        timeFormatter.format(message.time.atZone(zoneId)),
+        SpanFormatter.format(
+          "%s%s: %s",
+          message.senderPrefixes,
+          formatNick(message.sender),
+          message.content
+        )
       )
-    )
+    }
   }
 
   private fun formatNick(sender: String): CharSequence {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ToolbarFragment.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ToolbarFragment.kt
index 1423c78ad4eda8e08d52513bcbfecac352db76bb..ac243f448aedfe740c60b0a74a63ccbca156969f 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ToolbarFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ToolbarFragment.kt
@@ -15,10 +15,7 @@ import de.kuschku.libquassel.quassel.BufferInfo
 import de.kuschku.libquassel.session.Backend
 import de.kuschku.libquassel.session.SessionManager
 import de.kuschku.quasseldroid_ng.R
-import de.kuschku.quasseldroid_ng.util.helper.map
-import de.kuschku.quasseldroid_ng.util.helper.switchMap
-import de.kuschku.quasseldroid_ng.util.helper.switchMapRx
-import de.kuschku.quasseldroid_ng.util.helper.visibleIf
+import de.kuschku.quasseldroid_ng.util.helper.*
 import de.kuschku.quasseldroid_ng.util.service.ServiceBoundFragment
 
 class ToolbarFragment : ServiceBoundFragment() {
@@ -41,6 +38,14 @@ class ToolbarFragment : ServiceBoundFragment() {
     }
   }
 
+  private val isSecure: LiveData<Boolean?> = sessionManager.switchMapRx(
+    SessionManager::session
+  ).switchMapRx { session ->
+    session.state.map { state ->
+      session.sslSession != null
+    }
+  }
+
   var title: CharSequence
     get() = toolbarTitle.text
     set(value) {
@@ -60,11 +65,14 @@ class ToolbarFragment : ServiceBoundFragment() {
     val view = inflater.inflate(R.layout.fragment_toolbar, container, false)
     ButterKnife.bind(this, view)
 
-    currentBufferInfo.observe(
+    currentBufferInfo.zip(isSecure).observe(
       this, Observer {
-      title = it?.bufferName ?: resources.getString(
-        R.string.app_name
-      )
+      if (it != null) {
+        val (info, isSecure) = it
+        this.title = info?.bufferName ?: resources.getString(
+          R.string.app_name
+        )
+      }
     }
     )
 
diff --git a/app/src/main/res/layout/widget_chatmessage_action.xml b/app/src/main/res/layout/widget_chatmessage_action.xml
index 13146566a8206109480b8f04364b5f54e032eee2..dee8b88535003c767e9bd9fcd6d27967a3e4f59b 100644
--- a/app/src/main/res/layout/widget_chatmessage_action.xml
+++ b/app/src/main/res/layout/widget_chatmessage_action.xml
@@ -44,7 +44,8 @@
     android:layout_marginEnd="@dimen/message_horizontal"
     android:layout_marginRight="@dimen/message_horizontal"
     android:textColor="?attr/colorForegroundSecondary"
-    android:typeface="monospace" />
+    android:typeface="monospace"
+    tools:text="[15:55]" />
 
   <TextView
     android:id="@+id/content"
@@ -53,5 +54,6 @@
     android:layout_weight="1"
     android:textColor="?attr/colorForegroundAction"
     android:textIsSelectable="true"
-    android:textStyle="italic" />
+    android:textStyle="italic"
+    tools:text="-*- justJanne loves the new version" />
 </LinearLayout>
diff --git a/app/src/main/res/layout/widget_chatmessage_error.xml b/app/src/main/res/layout/widget_chatmessage_error.xml
index ac45d3d6eb721e77dfc369b0e43204da7832f3f5..53233ad2500fd04413285f1af00ef380d738e9dc 100644
--- a/app/src/main/res/layout/widget_chatmessage_error.xml
+++ b/app/src/main/res/layout/widget_chatmessage_error.xml
@@ -15,6 +15,7 @@
   android:paddingStart="@dimen/message_horizontal"
   android:paddingTop="@dimen/message_vertical"
   android:textAppearance="?android:attr/textAppearanceListItemSmall"
+  tools:background="@android:color/background_light"
   tools:theme="@style/Theme.ChatTheme.Quassel_Light">
 
   <TextView
@@ -24,7 +25,8 @@
     android:layout_marginEnd="@dimen/message_horizontal"
     android:layout_marginRight="@dimen/message_horizontal"
     android:textColor="?attr/colorForegroundSecondary"
-    android:typeface="monospace" />
+    android:typeface="monospace"
+    tools:text="[15:55]" />
 
   <TextView
     android:id="@+id/content"
@@ -33,5 +35,6 @@
     android:layout_weight="1"
     android:textColor="?attr/colorForegroundError"
     android:textIsSelectable="true"
-    android:textStyle="italic" />
+    android:textStyle="italic"
+    tools:text="everyone: deserves a chance to fly. No such channel" />
 </LinearLayout>
diff --git a/app/src/main/res/layout/widget_chatmessage_server.xml b/app/src/main/res/layout/widget_chatmessage_server.xml
index 48b076cb058e41c3f4a0fc27026155987e5d96bd..59248a6abead59011187bea02a9d0a2694766db6 100644
--- a/app/src/main/res/layout/widget_chatmessage_server.xml
+++ b/app/src/main/res/layout/widget_chatmessage_server.xml
@@ -15,6 +15,7 @@
   android:paddingStart="@dimen/message_horizontal"
   android:paddingTop="@dimen/message_vertical"
   android:textAppearance="?android:attr/textAppearanceListItemSmall"
+  tools:background="@android:color/background_light"
   tools:theme="@style/Theme.ChatTheme.Quassel_Light">
 
   <TextView
@@ -24,7 +25,8 @@
     android:layout_marginEnd="@dimen/message_horizontal"
     android:layout_marginRight="@dimen/message_horizontal"
     android:textColor="?attr/colorForegroundSecondary"
-    android:typeface="monospace" />
+    android:typeface="monospace"
+    tools:text="[15:55]" />
 
   <TextView
     android:id="@+id/content"
@@ -33,5 +35,6 @@
     android:layout_weight="1"
     android:textColor="?attr/colorForegroundSecondary"
     android:textIsSelectable="true"
-    android:textStyle="italic" />
+    android:typeface="monospace"
+    tools:text="Connecting to irc.freenode.net:6667..." />
 </LinearLayout>
diff --git a/lib/src/main/java/de/kuschku/libquassel/session/CoreConnection.kt b/lib/src/main/java/de/kuschku/libquassel/session/CoreConnection.kt
index ccc2c7432f7870c7465e2e28b6f44db48c3c04d6..3723825a162d47fab79c5ec7276ad570f442db6b 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/CoreConnection.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/CoreConnection.kt
@@ -223,4 +223,7 @@ class CoreConnection(
       dataBuffer.hexDump()
     }
   }
+
+  val sslSession
+    get() = channel?.sslSession
 }
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 2b2a7774022bc8003bcef10e0db77f958f879b74..4cf9c05f5bc1a111722ffa591ed66d326add2d6c 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/ISession.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/ISession.kt
@@ -2,13 +2,18 @@ package de.kuschku.libquassel.session
 
 import de.kuschku.libquassel.protocol.IdentityId
 import de.kuschku.libquassel.protocol.NetworkId
+import de.kuschku.libquassel.protocol.Quassel_Features
 import de.kuschku.libquassel.quassel.syncables.*
 import io.reactivex.Observable
 import io.reactivex.subjects.BehaviorSubject
 import java.io.Closeable
+import javax.net.ssl.SSLSession
 
 interface ISession : Closeable {
   val state: Observable<ConnectionState>
+  val coreFeatures: Quassel_Features
+  val negotiatedFeatures: Quassel_Features
+  val sslSession: SSLSession?
 
   val aliasManager: AliasManager?
   val backlogManager: BacklogManager?
@@ -27,6 +32,11 @@ interface ISession : Closeable {
 
   companion object {
     val NULL = object : ISession {
+      override val state = BehaviorSubject.createDefault(ConnectionState.DISCONNECTED)
+      override val coreFeatures: Quassel_Features = Quassel_Features.of()
+      override val negotiatedFeatures: Quassel_Features = Quassel_Features.of()
+      override val sslSession: SSLSession? = null
+
       override val rpcHandler: RpcHandler? = null
       override val aliasManager: AliasManager? = null
       override val backlogManager: BacklogManager? = null
@@ -43,7 +53,6 @@ interface ISession : Closeable {
       override val initStatus: Observable<Pair<Int, Int>> = Observable.just(0 to 0)
 
       override fun close() = Unit
-      override val state = BehaviorSubject.createDefault(ConnectionState.DISCONNECTED)
     }
   }
 }
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 32604d18838fe75dfca7874e84cfb0ce8fb39015..9f729068d4844548193269f5342001ce366b7489 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/Session.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/Session.kt
@@ -23,10 +23,13 @@ class Session(
   backlogStorage: BacklogStorage,
   private val userData: Pair<String, String>
 ) : ProtocolHandler(), ISession {
-  var coreFeatures: Quassel_Features = Quassel_Feature.NONE
-  val negotiatedFeatures
+  override var coreFeatures: Quassel_Features = Quassel_Feature.NONE
+  override val negotiatedFeatures
     get() = coreFeatures and clientData.clientFeatures
 
+  override val sslSession
+    get() = coreConnection.sslSession
+
   private val coreConnection = CoreConnection(this, address, handlerService)
   override val state = coreConnection.state
 
diff --git a/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt b/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt
index 98f166bbd6793368ecf98d68e425f3e749556f05..0f5829de0381342842dddeae59b4e52ec7985983 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt
@@ -3,6 +3,7 @@ package de.kuschku.libquassel.session
 import de.kuschku.libquassel.protocol.ClientData
 import de.kuschku.libquassel.protocol.IdentityId
 import de.kuschku.libquassel.protocol.NetworkId
+import de.kuschku.libquassel.protocol.Quassel_Features
 import de.kuschku.libquassel.quassel.syncables.*
 import de.kuschku.libquassel.quassel.syncables.interfaces.invokers.Invokers
 import de.kuschku.libquassel.util.compatibility.HandlerService
@@ -11,9 +12,16 @@ import de.kuschku.libquassel.util.compatibility.log
 import de.kuschku.libquassel.util.helpers.or
 import io.reactivex.Observable
 import io.reactivex.subjects.BehaviorSubject
+import javax.net.ssl.SSLSession
 import javax.net.ssl.X509TrustManager
 
 class SessionManager(offlineSession: ISession, val backlogStorage: BacklogStorage) : ISession {
+  override val coreFeatures: Quassel_Features
+    get() = session.or(lastSession).coreFeatures
+  override val negotiatedFeatures: Quassel_Features
+    get() = session.or(lastSession).negotiatedFeatures
+  override val sslSession: SSLSession?
+    get() = session.or(lastSession).sslSession
   override val aliasManager: AliasManager?
     get() = session.or(lastSession).aliasManager
   override val backlogManager: BacklogManager?
diff --git a/lib/src/main/java/de/kuschku/libquassel/util/nio/WrappedChannel.kt b/lib/src/main/java/de/kuschku/libquassel/util/nio/WrappedChannel.kt
index e6465fa893d19ee4224220b1880974ec400fbc04..50fefbed5a73c755b0f038e7b8360b537f380df2 100644
--- a/lib/src/main/java/de/kuschku/libquassel/util/nio/WrappedChannel.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/util/nio/WrappedChannel.kt
@@ -63,7 +63,7 @@ class WrappedChannel(
     val managers = arrayOf(certificateManager)
     context.init(null, managers, null)
     val factory = context.socketFactory
-    val socket = factory.createSocket(socket, address.host, address.port.toInt(), true) as SSLSocket
+    val socket = factory.createSocket(socket, address.host, address.port, true) as SSLSocket
     socket.useClientMode = true
     socket.startHandshake()
     return WrappedChannel.ofSocket(socket)
@@ -187,4 +187,7 @@ class WrappedChannel(
   override fun flush() {
     flusher?.invoke()
   }
+
+  val sslSession
+    get() = (socket as? SSLSocket)?.session
 }