diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcChannel.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcChannel.kt
index f213b12c5a9b4557557ee26a0dc52dae78c66abe..cd2fa70c0e6355bd05287fd123d5bb5c037ea29f 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcChannel.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcChannel.kt
@@ -46,6 +46,18 @@ class IrcChannel(
     "UserModes" to QVariant.of(initUserModes(), Type.QVariantMap)
   ) + initProperties()
 
+  private inline fun QVariant_?.indexed(index: Int?) = this?.let {
+    index?.let { i ->
+      it.valueOr<QVariantList>(::emptyList)[i]
+    } ?: it
+  }
+
+  fun fromVariantMap(properties: QVariantMap, i: Int? = null) {
+    initSetChanModes(properties["ChanModes"].indexed(i).valueOr(::emptyMap))
+    initSetUserModes(properties["UserModes"].indexed(i).valueOr(::emptyMap))
+    initSetProperties(properties, i)
+  }
+
   override fun fromVariantMap(properties: QVariantMap) {
     initSetChanModes(properties["ChanModes"].valueOr(::emptyMap))
     initSetUserModes(properties["UserModes"].valueOr(::emptyMap))
@@ -100,10 +112,10 @@ class IrcChannel(
     joinIrcUsersInternal(users, modes)
   }
 
-  override fun initSetProperties(properties: QVariantMap) {
-    setTopic(properties["topic"].valueOr(this::topic))
-    setPassword(properties["password"].valueOr(this::password))
-    setEncrypted(properties["encrypted"].valueOr(this::encrypted))
+  override fun initSetProperties(properties: QVariantMap, i: Int?) {
+    setTopic(properties["topic"].indexed(i).valueOr(this::topic))
+    setPassword(properties["password"].indexed(i).valueOr(this::password))
+    setEncrypted(properties["encrypted"].indexed(i).valueOr(this::encrypted))
   }
 
   fun isKnownUser(ircUser: IrcUser): Boolean {
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcUser.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcUser.kt
index 6c5c38970f06a9a9c1f20a8d2e6698cef866cef8..c30946e5d30e39a9fbb2f116bccc8014746565a3 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcUser.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcUser.kt
@@ -19,10 +19,7 @@
 
 package de.kuschku.libquassel.quassel.syncables
 
-import de.kuschku.libquassel.protocol.QVariant
-import de.kuschku.libquassel.protocol.QVariantMap
-import de.kuschku.libquassel.protocol.Type
-import de.kuschku.libquassel.protocol.valueOr
+import de.kuschku.libquassel.protocol.*
 import de.kuschku.libquassel.quassel.ExtendedFeature
 import de.kuschku.libquassel.quassel.syncables.interfaces.IIrcUser
 import de.kuschku.libquassel.session.SignalProxy
@@ -42,6 +39,9 @@ class IrcUser(
   }
 
   override fun toVariantMap() = initProperties()
+  fun fromVariantMap(properties: QVariantMap, index: Int? = null) {
+    initSetProperties(properties, index)
+  }
   override fun fromVariantMap(properties: QVariantMap) {
     initSetProperties(properties)
   }
@@ -68,25 +68,31 @@ class IrcUser(
     "userModes" to QVariant.of(userModes(), Type.QString)
   )
 
-  override fun initSetProperties(properties: QVariantMap) {
-    setUser(properties["user"].valueOr(this::user))
-    setHost(properties["host"].valueOr(this::host))
-    setNick(properties["nick"].valueOr(this::nick))
-    setRealName(properties["realName"].valueOr(this::realName))
-    setAccount(properties["account"].valueOr(this::account))
-    setAway(properties["away"].valueOr(this::isAway))
-    setAwayMessage(properties["awayMessage"].valueOr(this::awayMessage))
-    setIdleTime(properties["idleTime"].valueOr(this::idleTime))
-    setLoginTime(properties["loginTime"].valueOr(this::loginTime))
-    setServer(properties["server"].valueOr(this::server))
-    setIrcOperator(properties["ircOperator"].valueOr(this::ircOperator))
-    setLastAwayMessageTime(properties["lastAwayMessageTime"].valueOr {
-      Instant.ofEpochSecond(properties["lastAwayMessage"].valueOr(this::lastAwayMessage).toLong())
+  private inline fun QVariant_?.indexed(index: Int?) = this?.let {
+    index?.let { i ->
+      it.valueOr<QVariantList>(::emptyList)[i]
+    } ?: it
+  }
+
+  override fun initSetProperties(properties: QVariantMap, i: Int?) {
+    setUser(properties["user"].indexed(i).valueOr(this::user))
+    setHost(properties["host"].indexed(i).valueOr(this::host))
+    setNick(properties["nick"].indexed(i).valueOr(this::nick))
+    setRealName(properties["realName"].indexed(i).valueOr(this::realName))
+    setAccount(properties["account"].indexed(i).valueOr(this::account))
+    setAway(properties["away"].indexed(i).valueOr(this::isAway))
+    setAwayMessage(properties["awayMessage"].indexed(i).valueOr(this::awayMessage))
+    setIdleTime(properties["idleTime"].indexed(i).valueOr(this::idleTime))
+    setLoginTime(properties["loginTime"].indexed(i).valueOr(this::loginTime))
+    setServer(properties["server"].indexed(i).valueOr(this::server))
+    setIrcOperator(properties["ircOperator"].indexed(i).valueOr(this::ircOperator))
+    setLastAwayMessageTime(properties["lastAwayMessageTime"].indexed(i).valueOr {
+      Instant.ofEpochSecond(properties["lastAwayMessage"].indexed(i).valueOr(this::lastAwayMessage).toLong())
     })
-    setWhoisServiceReply(properties["whoisServiceReply"].valueOr(this::whoisServiceReply))
-    setSuserHost(properties["suserHost"].valueOr(this::suserHost))
-    setEncrypted(properties["encrypted"].valueOr(this::encrypted))
-    setUserModes(properties["userModes"].valueOr(this::userModes))
+    setWhoisServiceReply(properties["whoisServiceReply"].indexed(i).valueOr(this::whoisServiceReply))
+    setSuserHost(properties["suserHost"].indexed(i).valueOr(this::suserHost))
+    setEncrypted(properties["encrypted"].indexed(i).valueOr(this::encrypted))
+    setUserModes(properties["userModes"].indexed(i).valueOr(this::userModes))
   }
 
   fun updates(): Observable<IrcUser> = hasChangedNotification.map { this }
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Network.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Network.kt
index 576fa0f037acb241233421e29d16a08964acd6ef..503c7166bf05607de3416219efc89f31c33026c6 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Network.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Network.kt
@@ -32,7 +32,6 @@ import de.kuschku.libquassel.util.irc.IrcCaseMappers
 import io.reactivex.Observable
 import io.reactivex.subjects.BehaviorSubject
 import java.nio.ByteBuffer
-import java.nio.charset.Charset
 import java.util.*
 
 class Network constructor(
@@ -192,11 +191,11 @@ class Network constructor(
     if (info.identity > 0 && info.identity != identity())
       setIdentity(info.identity)
     if (info.codecForServer != codecForServer())
-      setCodecForServer(Charset.forName(info.codecForServer))
+      setCodecForServer(info.codecForServer)
     if (info.codecForEncoding != codecForEncoding())
-      setCodecForEncoding(Charset.forName(info.codecForEncoding))
+      setCodecForEncoding(info.codecForEncoding)
     if (info.codecForDecoding != codecForDecoding())
-      setCodecForDecoding(Charset.forName(info.codecForDecoding))
+      setCodecForDecoding(info.codecForDecoding)
     // FIXME compare components
     if (info.serverList.isNotEmpty())
       setServerList(info.serverList.map { QVariant.of(it.toVariantMap(), QType.Network_Server) })
@@ -348,19 +347,19 @@ class Network constructor(
             capValue?.contains(saslMechanism, ignoreCase = true) ?: false)
   }
 
-  fun newIrcUser(hostMask: String, initData: QVariantMap = emptyMap()): IrcUser {
+  fun newIrcUser(hostMask: String, initData: QVariantMap = emptyMap(),
+                 index: Int? = null): IrcUser {
     val nick = caseMapper.toLowerCase(HostmaskHelper.nick(hostMask))
     val user = ircUser(nick)
     return if (user == null) {
       val ircUser = IrcUser(hostMask, this, proxy)
       ircUser.init()
       if (initData.isNotEmpty()) {
-        ircUser.fromVariantMap(initData)
+        ircUser.fromVariantMap(initData, index)
         ircUser.initialized = true
       }
       proxy.synchronize(ircUser)
       _ircUsers[nick] = ircUser
-      val mask = ircUser.hostMask()
       live_ircUsers.onNext(_ircUsers)
       ircUser
     } else {
@@ -375,13 +374,14 @@ class Network constructor(
 
   fun ircUsers() = _ircUsers.values.toList()
   fun ircUserCount(): UInt = _ircUsers.size
-  fun newIrcChannel(channelName: String, initData: QVariantMap = emptyMap()): IrcChannel =
+  fun newIrcChannel(channelName: String, initData: QVariantMap = emptyMap(),
+                    index: Int? = null): IrcChannel =
     ircChannel(channelName).let { channel ->
       return if (channel == null) {
         val ircChannel = IrcChannel(channelName, this, proxy)
         ircChannel.init()
         if (initData.isNotEmpty()) {
-          ircChannel.fromVariantMap(initData)
+          ircChannel.fromVariantMap(initData, index)
           ircChannel.initialized = true
         }
         proxy.synchronize(ircChannel)
@@ -402,18 +402,18 @@ class Network constructor(
 
   fun ircChannels() = _ircChannels.values.toList()
   fun ircChannelCount(): UInt = _ircChannels.size
-  fun codecForServer(): String = _codecForServer.name()
-  fun codecForEncoding(): String = _codecForEncoding.name()
-  fun codecForDecoding(): String = _codecForDecoding.name()
-  fun setCodecForDecoding(codec: Charset) {
+  fun codecForServer(): String = _codecForServer
+  fun codecForEncoding(): String = _codecForEncoding
+  fun codecForDecoding(): String = _codecForDecoding
+  fun setCodecForDecoding(codec: String) {
     _codecForDecoding = codec
   }
 
-  fun setCodecForEncoding(codec: Charset) {
+  fun setCodecForEncoding(codec: String) {
     _codecForEncoding = codec
   }
 
-  fun setCodecForServer(codec: Charset) {
+  fun setCodecForServer(codec: String) {
     _codecForServer = codec
   }
 
@@ -615,27 +615,6 @@ class Network constructor(
       setCodecForServer(Charsets.ISO_8859_1.decode(codecName).toString())
   }
 
-  fun setCodecForDecoding(codecName: String) {
-    val charset = Charset.availableCharsets()[codecName]
-    if (charset != null) {
-      setCodecForDecoding(charset)
-    }
-  }
-
-  fun setCodecForEncoding(codecName: String) {
-    val charset = Charset.availableCharsets()[codecName]
-    if (charset != null) {
-      setCodecForEncoding(charset)
-    }
-  }
-
-  fun setCodecForServer(codecName: String) {
-    val charset = Charset.availableCharsets()[codecName]
-    if (charset != null) {
-      setCodecForServer(charset)
-    }
-  }
-
   override fun addSupport(param: String, value: String?) {
     _supports[param] = value
   }
@@ -773,25 +752,13 @@ class Network constructor(
     val users: Map<String, QVariant_> = usersAndChannels["Users"].valueOr(::emptyMap)
     val userKeys = users.keys
     users["nick"].valueOr<QVariantList>(::emptyList).forEachIndexed { index, nick ->
-      val data = mutableMapOf<String, QVariant_>()
-      for (it in userKeys) {
-        val value = users[it].value<QVariantList>()?.get(index)
-        if (value != null)
-          data[it] = value
-      }
-      newIrcUser(nick.value(""), data)
+      newIrcUser(nick.value(""), users, index)
     }
 
     val channels: Map<String, QVariant_> = usersAndChannels["Channels"].valueOr(::emptyMap)
     val channelKeys = channels.keys
     channels["name"].valueOr<QVariantList>(::emptyList).forEachIndexed { index, nick ->
-      val data = mutableMapOf<String, QVariant_>()
-      for (it in channelKeys) {
-        val value = channels[it].value<QVariantList>()?.get(index)
-        if (value != null)
-          data[it] = value
-      }
-      newIrcChannel(nick.value(""), data)
+      newIrcChannel(nick.value(""), channels, index)
     }
   }
 
@@ -1022,17 +989,17 @@ class Network constructor(
       field = value
       live_networkInfo.onNext(Unit)
     }
-  private var _codecForServer: Charset = Charsets.UTF_8
+  private var _codecForServer: String = "UTF_8"
     set(value) {
       field = value
       live_networkInfo.onNext(Unit)
     }
-  private var _codecForEncoding: Charset = Charsets.UTF_8
+  private var _codecForEncoding: String = "UTF_8"
     set(value) {
       field = value
       live_networkInfo.onNext(Unit)
     }
-  private var _codecForDecoding: Charset = Charsets.UTF_8
+  private var _codecForDecoding: String = "UTF_8"
     set(value) {
       field = value
       live_networkInfo.onNext(Unit)
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IIrcChannel.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IIrcChannel.kt
index 41418e947a38644d68e241b85788e162ea549de9..deca805f4b67b1d78e8ade6b68fd45f16219c0e4 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IIrcChannel.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IIrcChannel.kt
@@ -33,7 +33,7 @@ interface IIrcChannel : ISyncableObject {
   fun initSetUserModes(usermodes: QVariantMap)
 
   fun initProperties(): QVariantMap
-  fun initSetProperties(properties: QVariantMap)
+  fun initSetProperties(properties: QVariantMap, i: Int? = null)
 
   @Slot
   fun addChannelMode(mode: Char, value: String?)
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IIrcUser.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IIrcUser.kt
index 88b41f50786dd4666a3db980bf8986949ff7c42e..7cdd5b007986423f7b23ea5b3ba4f91eeeac9f88 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IIrcUser.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IIrcUser.kt
@@ -28,7 +28,7 @@ import org.threeten.bp.Instant
 @Syncable(name = "IrcUser")
 interface IIrcUser : ISyncableObject {
   fun initProperties(): QVariantMap
-  fun initSetProperties(properties: QVariantMap)
+  fun initSetProperties(properties: QVariantMap, index: Int? = null)
   @Slot
   fun addUserModes(modes: String)