diff --git a/kmqtt-broker/src/commonMain/kotlin/Main.kt b/kmqtt-broker/src/commonMain/kotlin/Main.kt
index 5fa61d376995ccc46676433a5bcb6fccd9593f2a..02071dbf2019a41fcf3f8a72377412922e8d0cb3 100644
--- a/kmqtt-broker/src/commonMain/kotlin/Main.kt
+++ b/kmqtt-broker/src/commonMain/kotlin/Main.kt
@@ -1,5 +1,6 @@
-import mqtt.broker.Broker
-import socket.tls.TLSSettings
+import io.github.davidepianca98.mqtt.broker.Broker
+import io.github.davidepianca98.setShutdownHook
+import io.github.davidepianca98.socket.tls.TLSSettings
 
 private fun showHelp() {
     println("At least one argument needed:")
diff --git a/kmqtt-broker/src/commonMain/kotlin/ShutdownHook.kt b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/ShutdownHook.kt
similarity index 61%
rename from kmqtt-broker/src/commonMain/kotlin/ShutdownHook.kt
rename to kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/ShutdownHook.kt
index 82616b0786c0d3d7b2c6357e8ee26185fb5a6952..4d8edcfe0f48af7b1bb337ef8d81d11f074d97e7 100644
--- a/kmqtt-broker/src/commonMain/kotlin/ShutdownHook.kt
+++ b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/ShutdownHook.kt
@@ -1 +1,3 @@
+package io.github.davidepianca98
+
 internal expect fun setShutdownHook(hook: () -> Unit)
diff --git a/kmqtt-broker/src/commonMain/kotlin/datastructures/Trie.kt b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/datastructures/Trie.kt
similarity index 96%
rename from kmqtt-broker/src/commonMain/kotlin/datastructures/Trie.kt
rename to kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/datastructures/Trie.kt
index 2fc9e56bc15108d0023900161ada8eab66845962..02b6b010ce5fa2a168b8d29c31137a2b12c3553a 100644
--- a/kmqtt-broker/src/commonMain/kotlin/datastructures/Trie.kt
+++ b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/datastructures/Trie.kt
@@ -1,7 +1,7 @@
-package datastructures
+package io.github.davidepianca98.datastructures
 
-import mqtt.Subscription
-import mqtt.getSharedTopicFilter
+import io.github.davidepianca98.mqtt.Subscription
+import io.github.davidepianca98.mqtt.getSharedTopicFilter
 
 internal class Trie(subscriptions: Map<String, Subscription>? = null) {
 
diff --git a/kmqtt-broker/src/commonMain/kotlin/mqtt/Will.kt b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/Will.kt
similarity index 80%
rename from kmqtt-broker/src/commonMain/kotlin/mqtt/Will.kt
rename to kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/Will.kt
index 3b3a75eaf30fd79201f9364a2b1471ec25dac6c5..76906eee38a90f4941f33573faf4097a4e5422f2 100644
--- a/kmqtt-broker/src/commonMain/kotlin/mqtt/Will.kt
+++ b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/Will.kt
@@ -1,10 +1,10 @@
-package mqtt
+package io.github.davidepianca98.mqtt
 
-import mqtt.packets.Qos
-import mqtt.packets.mqtt.MQTTConnect
-import mqtt.packets.mqttv5.MQTT5Connect
-import mqtt.packets.mqttv5.ReasonCode
-import validatePayloadFormat
+import io.github.davidepianca98.mqtt.packets.Qos
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTConnect
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Connect
+import io.github.davidepianca98.mqtt.packets.mqttv5.ReasonCode
+import io.github.davidepianca98.validatePayloadFormat
 
 public class Will(packet: MQTTConnect) {
     public val retain: Boolean
diff --git a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/Broker.kt b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/Broker.kt
similarity index 93%
rename from kmqtt-broker/src/commonMain/kotlin/mqtt/broker/Broker.kt
rename to kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/Broker.kt
index 3e2fe0c77b5fa03835b0f8fb1afa7df286f23993..72be9dbdd8d02549f139eb621634f36e8a663aa1 100644
--- a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/Broker.kt
+++ b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/Broker.kt
@@ -1,21 +1,22 @@
-package mqtt.broker
-
-import currentTimeMillis
-import datastructures.Trie
+package io.github.davidepianca98.mqtt.broker
+
+import io.github.davidepianca98.currentTimeMillis
+import io.github.davidepianca98.datastructures.Trie
+import io.github.davidepianca98.mqtt.MQTTException
+import io.github.davidepianca98.mqtt.Subscription
+import io.github.davidepianca98.mqtt.broker.cluster.*
+import io.github.davidepianca98.mqtt.broker.interfaces.*
+import io.github.davidepianca98.mqtt.matchesWildcard
+import io.github.davidepianca98.mqtt.packets.Qos
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTPublish
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Properties
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Publish
+import io.github.davidepianca98.mqtt.packets.mqttv5.ReasonCode
+import io.github.davidepianca98.removeIf
+import io.github.davidepianca98.socket.ServerSocketLoop
+import io.github.davidepianca98.socket.tls.TLSSettings
 import kotlinx.atomicfu.locks.reentrantLock
 import kotlinx.atomicfu.locks.withLock
-import mqtt.MQTTException
-import mqtt.Subscription
-import mqtt.broker.cluster.*
-import mqtt.broker.interfaces.*
-import mqtt.matchesWildcard
-import mqtt.packets.Qos
-import mqtt.packets.mqttv5.MQTT5Properties
-import mqtt.packets.mqttv5.MQTT5Publish
-import mqtt.packets.mqttv5.ReasonCode
-import removeIf
-import socket.ServerSocketLoop
-import socket.tls.TLSSettings
 
 public class Broker(
     public val port: Int = 1883,
@@ -272,7 +273,7 @@ public class Broker(
         }
     }
 
-    internal fun publishFromRemote(packet: mqtt.packets.mqtt.MQTTPublish) {
+    internal fun publishFromRemote(packet: MQTTPublish) {
         publish(
             "",
             packet.retain,
@@ -340,7 +341,7 @@ public class Broker(
         }
     }
 
-    internal fun setRetained(topicName: String, message: mqtt.packets.mqtt.MQTTPublish, clientId: String, remote: Boolean = false) {
+    internal fun setRetained(topicName: String, message: MQTTPublish, clientId: String, remote: Boolean = false) {
         if (retainedAvailable) {
             if (message.payload?.isNotEmpty() == true) {
                 val retained = Pair(message, clientId)
@@ -373,7 +374,7 @@ public class Broker(
         }
     }
 
-    internal fun getRetained(topicFilter: String): List<Pair<mqtt.packets.mqtt.MQTTPublish, String>> {
+    internal fun getRetained(topicFilter: String): List<Pair<MQTTPublish, String>> {
         removeExpiredRetainedMessages()
         return retainedList.filter { it.key.matchesWildcard(topicFilter) }.map { it.value }
     }
diff --git a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/ClientConnection.kt b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/ClientConnection.kt
similarity index 89%
rename from kmqtt-broker/src/commonMain/kotlin/mqtt/broker/ClientConnection.kt
rename to kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/ClientConnection.kt
index 57f0b641cffe747fece24d96041adbae30c5fb2c..6019c94a0a27cedeae3f2bef37337fa0541bf9a2 100644
--- a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/ClientConnection.kt
+++ b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/ClientConnection.kt
@@ -1,21 +1,63 @@
-package mqtt.broker
-
-import currentTimeMillis
-import generateRandomClientId
-import mqtt.*
-import mqtt.broker.cluster.RemoteSession
-import mqtt.broker.interfaces.EnhancedAuthenticationProvider
-import mqtt.packets.ConnectAcknowledgeFlags
-import mqtt.MQTTException
-import mqtt.packets.MQTTPacket
-import mqtt.packets.Qos
-import mqtt.packets.mqtt.*
-import mqtt.packets.mqttv4.*
-import mqtt.packets.mqttv5.*
-import socket.IOException
-import socket.SocketInterface
-import socket.streams.EOFException
-import socket.tcp.TCPEventHandler
+package io.github.davidepianca98.mqtt.broker
+
+import io.github.davidepianca98.currentTimeMillis
+import io.github.davidepianca98.generateRandomClientId
+import io.github.davidepianca98.mqtt.MQTTCurrentPacket
+import io.github.davidepianca98.mqtt.Subscription
+import io.github.davidepianca98.mqtt.Will
+import io.github.davidepianca98.mqtt.broker.cluster.RemoteSession
+import io.github.davidepianca98.mqtt.broker.interfaces.EnhancedAuthenticationProvider
+import io.github.davidepianca98.mqtt.containsWildcard
+import io.github.davidepianca98.mqtt.isValidTopic
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTPubrel
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTUnsubscribe
+import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Pingresp
+import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Pubrec
+import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Pubrel
+import io.github.davidepianca98.mqtt.packets.mqttv4.toSubackReturnCodes
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Puback
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Subscribe
+import io.github.davidepianca98.mqtt.packets.ConnectAcknowledgeFlags
+import io.github.davidepianca98.mqtt.MQTTException
+import io.github.davidepianca98.mqtt.MQTTVersion
+import io.github.davidepianca98.mqtt.packets.MQTTPacket
+import io.github.davidepianca98.mqtt.packets.Qos
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTAuth
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTConnect
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTDisconnect
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTPingreq
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTPuback
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTPubcomp
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTPublish
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTPubrec
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTSubscribe
+import io.github.davidepianca98.mqtt.packets.mqttv4.ConnectReturnCode
+import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Connack
+import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Connect
+import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Disconnect
+import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Puback
+import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Pubcomp
+import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Publish
+import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Suback
+import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Unsuback
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Auth
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Connack
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Connect
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Disconnect
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Pingresp
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Properties
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Pubcomp
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Publish
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Pubrec
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Pubrel
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Suback
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Unsuback
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Unsubscribe
+import io.github.davidepianca98.mqtt.packets.mqttv5.ReasonCode
+import io.github.davidepianca98.socket.IOException
+import io.github.davidepianca98.socket.SocketInterface
+import io.github.davidepianca98.socket.streams.EOFException
+import io.github.davidepianca98.socket.tcp.TCPEventHandler
 
 public class ClientConnection(
     private val client: SocketInterface,
diff --git a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/ISession.kt b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/ISession.kt
similarity index 75%
rename from kmqtt-broker/src/commonMain/kotlin/mqtt/broker/ISession.kt
rename to kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/ISession.kt
index e91bde12f40f2fcf96b24afddc0dbd508f66f3f7..84de90a5fc4875f0b659e76f9da842a469a88505 100644
--- a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/ISession.kt
+++ b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/ISession.kt
@@ -1,10 +1,10 @@
-package mqtt.broker
+package io.github.davidepianca98.mqtt.broker
 
-import currentTimeMillis
-import mqtt.MQTTVersion
-import mqtt.Will
-import mqtt.packets.Qos
-import mqtt.packets.mqttv5.MQTT5Properties
+import io.github.davidepianca98.currentTimeMillis
+import io.github.davidepianca98.mqtt.Will
+import io.github.davidepianca98.mqtt.MQTTVersion
+import io.github.davidepianca98.mqtt.packets.Qos
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Properties
 
 internal interface ISession {
 
diff --git a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/Session.kt b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/Session.kt
similarity index 90%
rename from kmqtt-broker/src/commonMain/kotlin/mqtt/broker/Session.kt
rename to kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/Session.kt
index f8118a4491dc537a2a34aa84d4a50f8e42bcf580..ce6af4c637f5f7af72ce52e2afdc9b5bd87bc5fc 100644
--- a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/Session.kt
+++ b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/Session.kt
@@ -1,16 +1,16 @@
-package mqtt.broker
-
-import currentTimeMillis
-import mqtt.MQTTVersion
-import mqtt.Will
-import mqtt.packets.MQTTPacket
-import mqtt.packets.Qos
-import mqtt.packets.mqtt.MQTTPublish
-import mqtt.packets.mqtt.MQTTPubrel
-import mqtt.packets.mqttv4.MQTT4Publish
-import mqtt.packets.mqttv5.MQTT5Properties
-import mqtt.packets.mqttv5.MQTT5Publish
-import mqtt.packets.mqttv5.ReasonCode
+package io.github.davidepianca98.mqtt.broker
+
+import io.github.davidepianca98.currentTimeMillis
+import io.github.davidepianca98.mqtt.Will
+import io.github.davidepianca98.mqtt.MQTTVersion
+import io.github.davidepianca98.mqtt.packets.MQTTPacket
+import io.github.davidepianca98.mqtt.packets.Qos
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTPublish
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTPubrel
+import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Publish
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Properties
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Publish
+import io.github.davidepianca98.mqtt.packets.mqttv5.ReasonCode
 
 public class Session(
     public var clientConnection: ClientConnection?,
diff --git a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/ClusterConnection.kt b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/ClusterConnection.kt
similarity index 73%
rename from kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/ClusterConnection.kt
rename to kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/ClusterConnection.kt
index b9eb4093992aedd597df0717b7eeecb1609a71c0..24f319b3c48fab4fe6631e791e0814a2f8306058 100644
--- a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/ClusterConnection.kt
+++ b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/ClusterConnection.kt
@@ -1,11 +1,19 @@
-package mqtt.broker.cluster
-
-import mqtt.Subscription
-import mqtt.broker.Broker
-import mqtt.broker.Session
-import mqtt.broker.cluster.packets.*
-import socket.SocketInterface
-import socket.tcp.TCPEventHandler
+package io.github.davidepianca98.mqtt.broker.cluster
+
+import io.github.davidepianca98.mqtt.broker.Broker
+import io.github.davidepianca98.mqtt.broker.Session
+import io.github.davidepianca98.mqtt.broker.cluster.packets.AddSessionPacket
+import io.github.davidepianca98.mqtt.broker.cluster.packets.AddSubscriptionPacket
+import io.github.davidepianca98.mqtt.broker.cluster.packets.ClusterPacket
+import io.github.davidepianca98.mqtt.broker.cluster.packets.PublishPacket
+import io.github.davidepianca98.mqtt.broker.cluster.packets.RemoveSubscriptionPacket
+import io.github.davidepianca98.mqtt.broker.cluster.packets.SessionTakenOverPacket
+import io.github.davidepianca98.mqtt.broker.cluster.packets.SessionUpdatePacket
+import io.github.davidepianca98.mqtt.broker.cluster.packets.SetRetainedPacket
+import io.github.davidepianca98.mqtt.Subscription
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTPublish
+import io.github.davidepianca98.socket.SocketInterface
+import io.github.davidepianca98.socket.tcp.TCPEventHandler
 
 internal class ClusterConnection(private val socket: SocketInterface, private val broker: Broker) : TCPEventHandler {
 
@@ -70,11 +78,11 @@ internal class ClusterConnection(private val socket: SocketInterface, private va
         socket.close()
     }
 
-    fun publish(packet: mqtt.packets.mqtt.MQTTPublish) {
+    fun publish(packet: MQTTPublish) {
         socket.send(PublishPacket(packet).toByteArray())
     }
 
-    fun setRetained(retained: Pair<mqtt.packets.mqtt.MQTTPublish, String>) {
+    fun setRetained(retained: Pair<MQTTPublish, String>) {
         socket.send(SetRetainedPacket(retained).toByteArray())
     }
 
diff --git a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/ClusterCurrentPacket.kt b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/ClusterCurrentPacket.kt
similarity index 66%
rename from kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/ClusterCurrentPacket.kt
rename to kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/ClusterCurrentPacket.kt
index 2a75b8a06d504d9d3938dc9715ca70f8322a4b95..22a72b35b89bab0c04ec67b017bcecc047f1dcb2 100644
--- a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/ClusterCurrentPacket.kt
+++ b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/ClusterCurrentPacket.kt
@@ -1,9 +1,16 @@
-package mqtt.broker.cluster
-
-import mqtt.broker.cluster.packets.*
-import socket.streams.DynamicByteBuffer
-import socket.streams.EOFException
-import socket.streams.decodeVariableByteInteger
+package io.github.davidepianca98.mqtt.broker.cluster
+
+import io.github.davidepianca98.mqtt.broker.cluster.packets.AddSessionPacket
+import io.github.davidepianca98.mqtt.broker.cluster.packets.AddSubscriptionPacket
+import io.github.davidepianca98.mqtt.broker.cluster.packets.ClusterPacket
+import io.github.davidepianca98.mqtt.broker.cluster.packets.PublishPacket
+import io.github.davidepianca98.mqtt.broker.cluster.packets.RemoveSubscriptionPacket
+import io.github.davidepianca98.mqtt.broker.cluster.packets.SessionTakenOverPacket
+import io.github.davidepianca98.mqtt.broker.cluster.packets.SessionUpdatePacket
+import io.github.davidepianca98.mqtt.broker.cluster.packets.SetRetainedPacket
+import io.github.davidepianca98.socket.streams.DynamicByteBuffer
+import io.github.davidepianca98.socket.streams.EOFException
+import io.github.davidepianca98.socket.streams.decodeVariableByteInteger
 
 internal class ClusterCurrentPacket {
 
diff --git a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/ClusterDiscoveryConnection.kt b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/ClusterDiscoveryConnection.kt
similarity index 77%
rename from kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/ClusterDiscoveryConnection.kt
rename to kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/ClusterDiscoveryConnection.kt
index d05d7fe8c4b94731896a13419f2a85716feede4a..a209845c6b3dacd423040702b90daeef3b4e07be 100644
--- a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/ClusterDiscoveryConnection.kt
+++ b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/ClusterDiscoveryConnection.kt
@@ -1,9 +1,9 @@
-package mqtt.broker.cluster
+package io.github.davidepianca98.mqtt.broker.cluster
 
+import io.github.davidepianca98.mqtt.broker.Broker
 import kotlinx.serialization.protobuf.ProtoBuf
-import mqtt.broker.Broker
-import socket.udp.UDPEventHandler
-import socket.udp.UDPSocket
+import io.github.davidepianca98.socket.udp.UDPEventHandler
+import io.github.davidepianca98.socket.udp.UDPSocket
 
 internal class ClusterDiscoveryConnection(private val socket: UDPSocket, private val broker: Broker) :
     UDPEventHandler {
diff --git a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/ClusterExtensions.kt b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/ClusterExtensions.kt
similarity index 75%
rename from kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/ClusterExtensions.kt
rename to kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/ClusterExtensions.kt
index 6f393d90e037daa052d57bb894a843c910c5174f..3d60807257c0696570a69743d0bff6548834a088 100644
--- a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/ClusterExtensions.kt
+++ b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/ClusterExtensions.kt
@@ -1,9 +1,10 @@
-package mqtt.broker.cluster
+package io.github.davidepianca98.mqtt.broker.cluster
 
-import mqtt.Subscription
-import mqtt.broker.Session
+import io.github.davidepianca98.mqtt.broker.Session
+import io.github.davidepianca98.mqtt.Subscription
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTPublish
 
-internal fun MutableMap<String, ClusterConnection>.setRetained(retained: Pair<mqtt.packets.mqtt.MQTTPublish, String>) {
+internal fun MutableMap<String, ClusterConnection>.setRetained(retained: Pair<MQTTPublish, String>) {
     forEach {
         it.value.setRetained(retained)
     }
diff --git a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/ClusterSettings.kt b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/ClusterSettings.kt
similarity index 83%
rename from kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/ClusterSettings.kt
rename to kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/ClusterSettings.kt
index d7b9e505dc517adecde1bf4c72a2aff626395be6..cca0fb4058ada6b99774c55b651b100a20c67a43 100644
--- a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/ClusterSettings.kt
+++ b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/ClusterSettings.kt
@@ -1,4 +1,4 @@
-package mqtt.broker.cluster
+package io.github.davidepianca98.mqtt.broker.cluster
 
 import kotlin.random.Random
 
diff --git a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/DiscoveryPacket.kt b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/DiscoveryPacket.kt
similarity index 78%
rename from kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/DiscoveryPacket.kt
rename to kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/DiscoveryPacket.kt
index b3d019c8c6d14b14da9254ac6c1aeb52111def05..c128763b549f92e3c4c97fa75ca1686f6fcfc8c5 100644
--- a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/DiscoveryPacket.kt
+++ b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/DiscoveryPacket.kt
@@ -1,4 +1,4 @@
-package mqtt.broker.cluster
+package io.github.davidepianca98.mqtt.broker.cluster
 
 import kotlinx.serialization.Serializable
 import kotlinx.serialization.protobuf.ProtoNumber
diff --git a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/RemoteSession.kt b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/RemoteSession.kt
similarity index 75%
rename from kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/RemoteSession.kt
rename to kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/RemoteSession.kt
index 41fad0af7f04b96fe370c571f201382594955114..50c6d63850b69bc09332c728694908c020d66d80 100644
--- a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/RemoteSession.kt
+++ b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/RemoteSession.kt
@@ -1,15 +1,15 @@
-package mqtt.broker.cluster
+package io.github.davidepianca98.mqtt.broker.cluster
 
-import mqtt.MQTTVersion
-import mqtt.Will
-import mqtt.broker.Broker
-import mqtt.broker.ClientConnection
-import mqtt.broker.ISession
-import mqtt.broker.Session
-import mqtt.packets.Qos
-import mqtt.packets.mqttv4.MQTT4Publish
-import mqtt.packets.mqttv5.MQTT5Properties
-import mqtt.packets.mqttv5.MQTT5Publish
+import io.github.davidepianca98.mqtt.Will
+import io.github.davidepianca98.mqtt.broker.Broker
+import io.github.davidepianca98.mqtt.broker.ClientConnection
+import io.github.davidepianca98.mqtt.broker.ISession
+import io.github.davidepianca98.mqtt.broker.Session
+import io.github.davidepianca98.mqtt.MQTTVersion
+import io.github.davidepianca98.mqtt.packets.Qos
+import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Publish
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Properties
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Publish
 
 internal class RemoteSession(
     private val connection: ClusterConnection,
diff --git a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/packets/AddSessionPacket.kt b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/packets/AddSessionPacket.kt
similarity index 80%
rename from kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/packets/AddSessionPacket.kt
rename to kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/packets/AddSessionPacket.kt
index 75d47ab23f4297acc6bd238548f277ac17699021..8e9af10dfc26871161cdefce0db3ee7fadd22e53 100644
--- a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/packets/AddSessionPacket.kt
+++ b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/packets/AddSessionPacket.kt
@@ -1,8 +1,8 @@
-package mqtt.broker.cluster.packets
+package io.github.davidepianca98.mqtt.broker.cluster.packets
 
-import socket.streams.ByteArrayInputStream
-import socket.streams.ByteArrayOutputStream
-import socket.streams.encodeVariableByteInteger
+import io.github.davidepianca98.socket.streams.ByteArrayInputStream
+import io.github.davidepianca98.socket.streams.ByteArrayOutputStream
+import io.github.davidepianca98.socket.streams.encodeVariableByteInteger
 
 internal class AddSessionPacket(val clientId: String, val sessionExpiryInterval: UInt) : ClusterPacket {
 
diff --git a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/packets/AddSubscriptionPacket.kt b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/packets/AddSubscriptionPacket.kt
similarity index 82%
rename from kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/packets/AddSubscriptionPacket.kt
rename to kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/packets/AddSubscriptionPacket.kt
index 2c5bbb1e6743f6f7617a7dafde1982c5af9f80ae..e126feed5e39a8c79d801248bab714395e765f62 100644
--- a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/packets/AddSubscriptionPacket.kt
+++ b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/packets/AddSubscriptionPacket.kt
@@ -1,11 +1,11 @@
-package mqtt.broker.cluster.packets
-
-import mqtt.Subscription
-import mqtt.packets.Qos
-import mqtt.packets.mqttv5.SubscriptionOptions
-import socket.streams.ByteArrayInputStream
-import socket.streams.ByteArrayOutputStream
-import socket.streams.encodeVariableByteInteger
+package io.github.davidepianca98.mqtt.broker.cluster.packets
+
+import io.github.davidepianca98.mqtt.Subscription
+import io.github.davidepianca98.mqtt.packets.Qos
+import io.github.davidepianca98.mqtt.packets.mqttv5.SubscriptionOptions
+import io.github.davidepianca98.socket.streams.ByteArrayInputStream
+import io.github.davidepianca98.socket.streams.ByteArrayOutputStream
+import io.github.davidepianca98.socket.streams.encodeVariableByteInteger
 
 internal class AddSubscriptionPacket(val clientId: String, val subscription: Subscription) : ClusterPacket {
 
diff --git a/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/packets/ClusterPacket.kt b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/packets/ClusterPacket.kt
new file mode 100644
index 0000000000000000000000000000000000000000..55a03932f0cc1179256bb7979372eff0c0650405
--- /dev/null
+++ b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/packets/ClusterPacket.kt
@@ -0,0 +1,5 @@
+package io.github.davidepianca98.mqtt.broker.cluster.packets
+
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTTSerializer
+
+internal interface ClusterPacket : MQTTSerializer
diff --git a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/packets/ClusterPacketDeserializer.kt b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/packets/ClusterPacketDeserializer.kt
similarity index 72%
rename from kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/packets/ClusterPacketDeserializer.kt
rename to kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/packets/ClusterPacketDeserializer.kt
index b8e06d8076f334bde2bd5d12657a28e0f4c158f9..ad222f04ed1fce8d46c0b3e0fddbc2ce354104e5 100644
--- a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/packets/ClusterPacketDeserializer.kt
+++ b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/packets/ClusterPacketDeserializer.kt
@@ -1,9 +1,9 @@
-package mqtt.broker.cluster.packets
+package io.github.davidepianca98.mqtt.broker.cluster.packets
 
-import mqtt.MQTTException
-import mqtt.packets.mqttv5.ReasonCode
-import socket.streams.ByteArrayInputStream
-import validateUTF8String
+import io.github.davidepianca98.mqtt.MQTTException
+import io.github.davidepianca98.mqtt.packets.mqttv5.ReasonCode
+import io.github.davidepianca98.socket.streams.ByteArrayInputStream
+import io.github.davidepianca98.validateUTF8String
 
 internal interface ClusterPacketDeserializer {
 
diff --git a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/packets/PublishPacket.kt b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/packets/PublishPacket.kt
similarity index 72%
rename from kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/packets/PublishPacket.kt
rename to kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/packets/PublishPacket.kt
index 4cbbbf6f04f00f46faacf11057efa20faa15f7e0..a9fd9c44b8630013297c966b20e15c327364ed30 100644
--- a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/packets/PublishPacket.kt
+++ b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/packets/PublishPacket.kt
@@ -1,9 +1,9 @@
-package mqtt.broker.cluster.packets
+package io.github.davidepianca98.mqtt.broker.cluster.packets
 
-import mqtt.packets.mqtt.MQTTPublish
-import socket.streams.ByteArrayInputStream
-import socket.streams.ByteArrayOutputStream
-import socket.streams.encodeVariableByteInteger
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTPublish
+import io.github.davidepianca98.socket.streams.ByteArrayInputStream
+import io.github.davidepianca98.socket.streams.ByteArrayOutputStream
+import io.github.davidepianca98.socket.streams.encodeVariableByteInteger
 
 internal class PublishPacket(val packet: MQTTPublish) : ClusterPacket {
 
diff --git a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/packets/RemoveSubscriptionPacket.kt b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/packets/RemoveSubscriptionPacket.kt
similarity index 79%
rename from kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/packets/RemoveSubscriptionPacket.kt
rename to kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/packets/RemoveSubscriptionPacket.kt
index dd197c2c4c0dc0e756481c7e20de3a757e942a2e..0c96bcabe71b1a6750aa1da9656d93468dcfe3a1 100644
--- a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/packets/RemoveSubscriptionPacket.kt
+++ b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/packets/RemoveSubscriptionPacket.kt
@@ -1,8 +1,8 @@
-package mqtt.broker.cluster.packets
+package io.github.davidepianca98.mqtt.broker.cluster.packets
 
-import socket.streams.ByteArrayInputStream
-import socket.streams.ByteArrayOutputStream
-import socket.streams.encodeVariableByteInteger
+import io.github.davidepianca98.socket.streams.ByteArrayInputStream
+import io.github.davidepianca98.socket.streams.ByteArrayOutputStream
+import io.github.davidepianca98.socket.streams.encodeVariableByteInteger
 
 internal class RemoveSubscriptionPacket(val clientId: String, val topicFilter: String) : ClusterPacket {
 
diff --git a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/packets/SessionTakenOverPacket.kt b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/packets/SessionTakenOverPacket.kt
similarity index 75%
rename from kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/packets/SessionTakenOverPacket.kt
rename to kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/packets/SessionTakenOverPacket.kt
index 0ee7b0b6308ffb4039c645d4c5b452a7d3154c4e..171e2e91d8f332ae76d140ac37fbcb3459812677 100644
--- a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/packets/SessionTakenOverPacket.kt
+++ b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/packets/SessionTakenOverPacket.kt
@@ -1,8 +1,8 @@
-package mqtt.broker.cluster.packets
+package io.github.davidepianca98.mqtt.broker.cluster.packets
 
-import socket.streams.ByteArrayInputStream
-import socket.streams.ByteArrayOutputStream
-import socket.streams.encodeVariableByteInteger
+import io.github.davidepianca98.socket.streams.ByteArrayInputStream
+import io.github.davidepianca98.socket.streams.ByteArrayOutputStream
+import io.github.davidepianca98.socket.streams.encodeVariableByteInteger
 
 internal class SessionTakenOverPacket(val clientId: String) : ClusterPacket {
 
diff --git a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/packets/SessionUpdatePacket.kt b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/packets/SessionUpdatePacket.kt
similarity index 86%
rename from kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/packets/SessionUpdatePacket.kt
rename to kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/packets/SessionUpdatePacket.kt
index 36d9429621699de38e4bc57956fe817f7d8b0512..3e267981652e5b08fde6e1e7814ca221763cc516 100644
--- a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/packets/SessionUpdatePacket.kt
+++ b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/packets/SessionUpdatePacket.kt
@@ -1,8 +1,8 @@
-package mqtt.broker.cluster.packets
+package io.github.davidepianca98.mqtt.broker.cluster.packets
 
-import socket.streams.ByteArrayInputStream
-import socket.streams.ByteArrayOutputStream
-import socket.streams.encodeVariableByteInteger
+import io.github.davidepianca98.socket.streams.ByteArrayInputStream
+import io.github.davidepianca98.socket.streams.ByteArrayOutputStream
+import io.github.davidepianca98.socket.streams.encodeVariableByteInteger
 
 internal class SessionUpdatePacket(
     val clientId: String,
diff --git a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/packets/SetRetainedPacket.kt b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/packets/SetRetainedPacket.kt
similarity index 76%
rename from kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/packets/SetRetainedPacket.kt
rename to kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/packets/SetRetainedPacket.kt
index adbeb5d20de5bb4a7fbd0aa9e0b8fa62760b06ba..48a67e6e47f647a126bc955a16f4e43dfd4074f6 100644
--- a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/packets/SetRetainedPacket.kt
+++ b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/packets/SetRetainedPacket.kt
@@ -1,9 +1,9 @@
-package mqtt.broker.cluster.packets
+package io.github.davidepianca98.mqtt.broker.cluster.packets
 
-import mqtt.packets.mqtt.MQTTPublish
-import socket.streams.ByteArrayInputStream
-import socket.streams.ByteArrayOutputStream
-import socket.streams.encodeVariableByteInteger
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTPublish
+import io.github.davidepianca98.socket.streams.ByteArrayInputStream
+import io.github.davidepianca98.socket.streams.ByteArrayOutputStream
+import io.github.davidepianca98.socket.streams.encodeVariableByteInteger
 
 internal class SetRetainedPacket(val retained: Pair<MQTTPublish, String>) : ClusterPacket {
 
diff --git a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/interfaces/Authentication.kt b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/interfaces/Authentication.kt
similarity index 89%
rename from kmqtt-broker/src/commonMain/kotlin/mqtt/broker/interfaces/Authentication.kt
rename to kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/interfaces/Authentication.kt
index 09d0f55e0b1d74c24a82cd0935aa353ba2ce64f8..a08a9aecf70e4bfffa7d48f6f59c04ea8565075a 100644
--- a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/interfaces/Authentication.kt
+++ b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/interfaces/Authentication.kt
@@ -1,4 +1,4 @@
-package mqtt.broker.interfaces
+package io.github.davidepianca98.mqtt.broker.interfaces
 
 public interface Authentication {
 
diff --git a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/interfaces/Authorization.kt b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/interfaces/Authorization.kt
similarity index 94%
rename from kmqtt-broker/src/commonMain/kotlin/mqtt/broker/interfaces/Authorization.kt
rename to kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/interfaces/Authorization.kt
index 32623471ac061d7052a70647a1b6904577ee30c9..40858bc727eb48e19065406c41604b97c72c14e0 100644
--- a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/interfaces/Authorization.kt
+++ b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/interfaces/Authorization.kt
@@ -1,4 +1,4 @@
-package mqtt.broker.interfaces
+package io.github.davidepianca98.mqtt.broker.interfaces
 
 public interface Authorization {
 
diff --git a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/interfaces/BytesMetrics.kt b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/interfaces/BytesMetrics.kt
similarity index 90%
rename from kmqtt-broker/src/commonMain/kotlin/mqtt/broker/interfaces/BytesMetrics.kt
rename to kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/interfaces/BytesMetrics.kt
index 743b2f5552a16b6c75137600706fe06cefc566ee..5c1321386d0f3cb6f2265edf24f67be5c68a4bc1 100644
--- a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/interfaces/BytesMetrics.kt
+++ b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/interfaces/BytesMetrics.kt
@@ -1,4 +1,4 @@
-package mqtt.broker.interfaces
+package io.github.davidepianca98.mqtt.broker.interfaces
 
 public interface BytesMetrics {
 
diff --git a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/interfaces/ConnectionCallbacks.kt b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/interfaces/ConnectionCallbacks.kt
similarity index 85%
rename from kmqtt-broker/src/commonMain/kotlin/mqtt/broker/interfaces/ConnectionCallbacks.kt
rename to kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/interfaces/ConnectionCallbacks.kt
index ee1899bd516b51ac1f9a042eca49713ba2d91e01..2960baace54f6f1adc3620197daf2f0330b6be2e 100644
--- a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/interfaces/ConnectionCallbacks.kt
+++ b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/interfaces/ConnectionCallbacks.kt
@@ -1,4 +1,4 @@
-package mqtt.broker.interfaces
+package io.github.davidepianca98.mqtt.broker.interfaces
 
 public interface ConnectionCallbacks {
 
diff --git a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/interfaces/EnhancedAuthentication.kt b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/interfaces/EnhancedAuthentication.kt
similarity index 93%
rename from kmqtt-broker/src/commonMain/kotlin/mqtt/broker/interfaces/EnhancedAuthentication.kt
rename to kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/interfaces/EnhancedAuthentication.kt
index 736e2c6440e62f4e606a8be82f94ea0cf46142b3..01e34950935d5de15d2425f201e804d8306f3206 100644
--- a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/interfaces/EnhancedAuthentication.kt
+++ b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/interfaces/EnhancedAuthentication.kt
@@ -1,4 +1,4 @@
-package mqtt.broker.interfaces
+package io.github.davidepianca98.mqtt.broker.interfaces
 
 public interface EnhancedAuthenticationProvider {
 
diff --git a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/interfaces/MiscCallbacks.kt b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/interfaces/MiscCallbacks.kt
similarity index 80%
rename from kmqtt-broker/src/commonMain/kotlin/mqtt/broker/interfaces/MiscCallbacks.kt
rename to kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/interfaces/MiscCallbacks.kt
index f549e594ef6cffffb2282ab590f2014364ee2d51..ebdac94879966c162408f5e9f6857fbf1f4fdf42 100644
--- a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/interfaces/MiscCallbacks.kt
+++ b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/interfaces/MiscCallbacks.kt
@@ -1,4 +1,4 @@
-package mqtt.broker.interfaces
+package io.github.davidepianca98.mqtt.broker.interfaces
 
 public interface MiscCallbacks {
 
diff --git a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/interfaces/PacketInterceptor.kt b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/interfaces/PacketInterceptor.kt
similarity index 84%
rename from kmqtt-broker/src/commonMain/kotlin/mqtt/broker/interfaces/PacketInterceptor.kt
rename to kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/interfaces/PacketInterceptor.kt
index 4fe3348cb418ba4a8bf4601726fc01eaa76f712f..05f281d9b36d46fc1966a2856b1e563331834e0c 100644
--- a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/interfaces/PacketInterceptor.kt
+++ b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/interfaces/PacketInterceptor.kt
@@ -1,6 +1,6 @@
-package mqtt.broker.interfaces
+package io.github.davidepianca98.mqtt.broker.interfaces
 
-import mqtt.packets.MQTTPacket
+import io.github.davidepianca98.mqtt.packets.MQTTPacket
 
 public interface PacketInterceptor {
 
diff --git a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/interfaces/Persistence.kt b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/interfaces/Persistence.kt
similarity index 90%
rename from kmqtt-broker/src/commonMain/kotlin/mqtt/broker/interfaces/Persistence.kt
rename to kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/interfaces/Persistence.kt
index 0d546c3ec1eac86a4c296cb1044fa78765af5f42..162b041b482f437feac204bda6c41c97e59602d4 100644
--- a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/interfaces/Persistence.kt
+++ b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/interfaces/Persistence.kt
@@ -1,8 +1,8 @@
-package mqtt.broker.interfaces
+package io.github.davidepianca98.mqtt.broker.interfaces
 
-import mqtt.Subscription
-import mqtt.broker.Session
-import mqtt.packets.mqtt.MQTTPublish
+import io.github.davidepianca98.mqtt.broker.Session
+import io.github.davidepianca98.mqtt.Subscription
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTPublish
 
 public interface Persistence {
 
diff --git a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/udp/UDPConnectionsMap.kt b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/udp/UDPConnectionsMap.kt
similarity index 74%
rename from kmqtt-broker/src/commonMain/kotlin/mqtt/broker/udp/UDPConnectionsMap.kt
rename to kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/udp/UDPConnectionsMap.kt
index f1c3d91fdae914b23debc2f8d81e2017748f671a..9d9bc24319d6846fcaa535b89a53cbaeb7c25b6d 100644
--- a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/udp/UDPConnectionsMap.kt
+++ b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/udp/UDPConnectionsMap.kt
@@ -1,10 +1,10 @@
-package mqtt.broker.udp
+package io.github.davidepianca98.mqtt.broker.udp
 
-import mqtt.broker.Broker
-import mqtt.broker.ClientConnection
-import socket.SocketInterface
-import socket.udp.UDPEventHandler
-import socket.udp.UDPSocket
+import io.github.davidepianca98.mqtt.broker.Broker
+import io.github.davidepianca98.mqtt.broker.ClientConnection
+import io.github.davidepianca98.socket.SocketInterface
+import io.github.davidepianca98.socket.udp.UDPEventHandler
+import io.github.davidepianca98.socket.udp.UDPSocket
 
 internal class UDPConnectionsMap(private val socket: UDPSocket, private val broker: Broker) : UDPEventHandler, SocketInterface {
 
diff --git a/kmqtt-broker/src/commonMain/kotlin/socket/ServerSocket.kt b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/socket/ServerSocket.kt
similarity index 66%
rename from kmqtt-broker/src/commonMain/kotlin/socket/ServerSocket.kt
rename to kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/socket/ServerSocket.kt
index 17e6849216b19dd0a88937e5b29027683ee49a55..550c5c9c1527d68d40a994d6fedf2628a77f829b 100644
--- a/kmqtt-broker/src/commonMain/kotlin/socket/ServerSocket.kt
+++ b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/socket/ServerSocket.kt
@@ -1,7 +1,7 @@
-package socket
+package io.github.davidepianca98.socket
 
-import mqtt.broker.Broker
-import mqtt.broker.cluster.ClusterConnection
+import io.github.davidepianca98.mqtt.broker.Broker
+import io.github.davidepianca98.mqtt.broker.cluster.ClusterConnection
 
 internal expect open class ServerSocket(
     broker: Broker,
diff --git a/kmqtt-broker/src/commonMain/kotlin/socket/ServerSocketInterface.kt b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/socket/ServerSocketInterface.kt
similarity index 50%
rename from kmqtt-broker/src/commonMain/kotlin/socket/ServerSocketInterface.kt
rename to kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/socket/ServerSocketInterface.kt
index 88d72a655abb250463917c9dcb3530a27363a9bd..5115abec506df0d802bb417449548b576ef681db 100644
--- a/kmqtt-broker/src/commonMain/kotlin/socket/ServerSocketInterface.kt
+++ b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/socket/ServerSocketInterface.kt
@@ -1,6 +1,6 @@
-package socket
+package io.github.davidepianca98.socket
 
-import mqtt.broker.cluster.ClusterConnection
+import io.github.davidepianca98.mqtt.broker.cluster.ClusterConnection
 
 internal interface ServerSocketInterface {
 
diff --git a/kmqtt-broker/src/commonMain/kotlin/socket/ServerSocketLoop.kt b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/socket/ServerSocketLoop.kt
similarity index 88%
rename from kmqtt-broker/src/commonMain/kotlin/socket/ServerSocketLoop.kt
rename to kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/socket/ServerSocketLoop.kt
index e351ff65e9802670989a0464f0a77c355aa99b59..4d9aa59c9e53e6a97982995607c801b5a213593d 100644
--- a/kmqtt-broker/src/commonMain/kotlin/socket/ServerSocketLoop.kt
+++ b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/socket/ServerSocketLoop.kt
@@ -1,11 +1,11 @@
-package socket
+package io.github.davidepianca98.socket
 
 import kotlinx.atomicfu.locks.withLock
-import mqtt.broker.Broker
-import mqtt.broker.cluster.ClusterConnection
-import socket.tcp.TCPEventHandler
-import socket.tls.TLSServerSocket
-import socket.udp.UDPEventHandler
+import io.github.davidepianca98.mqtt.broker.Broker
+import io.github.davidepianca98.mqtt.broker.cluster.ClusterConnection
+import io.github.davidepianca98.socket.tcp.TCPEventHandler
+import io.github.davidepianca98.socket.tls.TLSServerSocket
+import io.github.davidepianca98.socket.udp.UDPEventHandler
 
 internal class ServerSocketLoop(private val broker: Broker) {
 
diff --git a/kmqtt-broker/src/commonMain/kotlin/socket/tcp/TCPEventHandler.kt b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/socket/tcp/TCPEventHandler.kt
similarity index 81%
rename from kmqtt-broker/src/commonMain/kotlin/socket/tcp/TCPEventHandler.kt
rename to kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/socket/tcp/TCPEventHandler.kt
index f3b98b2568397edd7ef0397d32a2d91cb59784a1..a1f5ef9d9b3f26099634cd5122e736e51e06c106 100644
--- a/kmqtt-broker/src/commonMain/kotlin/socket/tcp/TCPEventHandler.kt
+++ b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/socket/tcp/TCPEventHandler.kt
@@ -1,4 +1,4 @@
-package socket.tcp
+package io.github.davidepianca98.socket.tcp
 
 internal interface TCPEventHandler {
 
diff --git a/kmqtt-broker/src/commonMain/kotlin/socket/tcp/WebSocket.kt b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/socket/tcp/WebSocket.kt
similarity index 92%
rename from kmqtt-broker/src/commonMain/kotlin/socket/tcp/WebSocket.kt
rename to kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/socket/tcp/WebSocket.kt
index 124b0e9a11c8f762531190171876e852170ccc80..c1a4ba8a136b8a8dbca70d348e553a27d2125465 100644
--- a/kmqtt-broker/src/commonMain/kotlin/socket/tcp/WebSocket.kt
+++ b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/socket/tcp/WebSocket.kt
@@ -1,12 +1,12 @@
-package socket.tcp
-
-import sha1
-import socket.IOException
-import socket.SocketInterface
-import socket.streams.ByteArrayOutputStream
-import socket.streams.DynamicByteBuffer
-import socket.streams.EOFException
-import toBase64
+package io.github.davidepianca98.socket.tcp
+
+import io.github.davidepianca98.sha1
+import io.github.davidepianca98.socket.IOException
+import io.github.davidepianca98.socket.SocketInterface
+import io.github.davidepianca98.socket.streams.ByteArrayOutputStream
+import io.github.davidepianca98.socket.streams.DynamicByteBuffer
+import io.github.davidepianca98.socket.streams.EOFException
+import io.github.davidepianca98.toBase64
 
 
 internal class WebSocket(private val socket: Socket) : SocketInterface {
diff --git a/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/socket/tls/TLSServerSocket.kt b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/socket/tls/TLSServerSocket.kt
new file mode 100644
index 0000000000000000000000000000000000000000..35a2dc195e61ab15959bc2bd5c684b63f0171473
--- /dev/null
+++ b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/socket/tls/TLSServerSocket.kt
@@ -0,0 +1,10 @@
+package io.github.davidepianca98.socket.tls
+
+import io.github.davidepianca98.mqtt.broker.Broker
+import io.github.davidepianca98.socket.ServerSocket
+import io.github.davidepianca98.socket.SocketState
+
+internal expect class TLSServerSocket(
+    broker: Broker,
+    selectCallback: (attachment: Any?, state: SocketState) -> Boolean
+) : ServerSocket
diff --git a/kmqtt-broker/src/commonMain/kotlin/socket/tls/TLSSettings.kt b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/socket/tls/TLSSettings.kt
similarity index 83%
rename from kmqtt-broker/src/commonMain/kotlin/socket/tls/TLSSettings.kt
rename to kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/socket/tls/TLSSettings.kt
index b744230aa58e270d8ac678d2fa7f600f795a63b0..e287239bbb4c3e2160ba27863f9e774d2a558747 100644
--- a/kmqtt-broker/src/commonMain/kotlin/socket/tls/TLSSettings.kt
+++ b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/socket/tls/TLSSettings.kt
@@ -1,4 +1,4 @@
-package socket.tls
+package io.github.davidepianca98.socket.tls
 
 public class TLSSettings(
     public val version: String = "TLS",
diff --git a/kmqtt-broker/src/commonMain/kotlin/socket/udp/UDPEventHandler.kt b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/socket/udp/UDPEventHandler.kt
similarity index 59%
rename from kmqtt-broker/src/commonMain/kotlin/socket/udp/UDPEventHandler.kt
rename to kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/socket/udp/UDPEventHandler.kt
index 29a56c4753beb776e2841836f2a0efade357392e..da56113b9db25804eb57e9f4823b5caaea7ae5ab 100644
--- a/kmqtt-broker/src/commonMain/kotlin/socket/udp/UDPEventHandler.kt
+++ b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/socket/udp/UDPEventHandler.kt
@@ -1,4 +1,4 @@
-package socket.udp
+package io.github.davidepianca98.socket.udp
 
 internal interface UDPEventHandler {
 
diff --git a/kmqtt-broker/src/commonMain/kotlin/socket/udp/UDPReadData.kt b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/socket/udp/UDPReadData.kt
similarity index 70%
rename from kmqtt-broker/src/commonMain/kotlin/socket/udp/UDPReadData.kt
rename to kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/socket/udp/UDPReadData.kt
index d315b19df1d7b0a86ea0be81a81a85181b73477c..546ee81b87f94a34f3e1d5e78e42196c91b09b2b 100644
--- a/kmqtt-broker/src/commonMain/kotlin/socket/udp/UDPReadData.kt
+++ b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/socket/udp/UDPReadData.kt
@@ -1,3 +1,3 @@
-package socket.udp
+package io.github.davidepianca98.socket.udp
 
 internal data class UDPReadData(val data: UByteArray, val sourceAddress: String, val sourcePort: Int)
diff --git a/kmqtt-broker/src/commonMain/kotlin/socket/udp/UDPSocket.kt b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/socket/udp/UDPSocket.kt
similarity index 74%
rename from kmqtt-broker/src/commonMain/kotlin/socket/udp/UDPSocket.kt
rename to kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/socket/udp/UDPSocket.kt
index 24864c3606d1e4d6313501682a1330e3cc64c51b..b737d3570223723d6a8109d89b4569ee5de1994b 100644
--- a/kmqtt-broker/src/commonMain/kotlin/socket/udp/UDPSocket.kt
+++ b/kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/socket/udp/UDPSocket.kt
@@ -1,4 +1,4 @@
-package socket.udp
+package io.github.davidepianca98.socket.udp
 
 internal expect class UDPSocket {
 
diff --git a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/packets/ClusterPacket.kt b/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/packets/ClusterPacket.kt
deleted file mode 100644
index 96a276178815b2a13cdeefe126132b286f551430..0000000000000000000000000000000000000000
--- a/kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/packets/ClusterPacket.kt
+++ /dev/null
@@ -1,5 +0,0 @@
-package mqtt.broker.cluster.packets
-
-import mqtt.packets.mqttv5.MQTTSerializer
-
-internal interface ClusterPacket : MQTTSerializer
diff --git a/kmqtt-broker/src/commonMain/kotlin/socket/tls/TLSServerSocket.kt b/kmqtt-broker/src/commonMain/kotlin/socket/tls/TLSServerSocket.kt
deleted file mode 100644
index bdf6ab0f150470cee6445a5378862bc4ff26c270..0000000000000000000000000000000000000000
--- a/kmqtt-broker/src/commonMain/kotlin/socket/tls/TLSServerSocket.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-package socket.tls
-
-import mqtt.broker.Broker
-import socket.ServerSocket
-import socket.ServerSocketLoop
-import socket.SocketState
-
-internal expect class TLSServerSocket(
-    broker: Broker,
-    selectCallback: (attachment: Any?, state: SocketState) -> Boolean
-) : ServerSocket
diff --git a/kmqtt-broker/src/commonTest/kotlin/datastructures/TrieTest.kt b/kmqtt-broker/src/commonTest/kotlin/io/github/davidepianca98/datastructures/TrieTest.kt
similarity index 97%
rename from kmqtt-broker/src/commonTest/kotlin/datastructures/TrieTest.kt
rename to kmqtt-broker/src/commonTest/kotlin/io/github/davidepianca98/datastructures/TrieTest.kt
index 7710b1425b23085d0d76ad100d6ad9a8bdd0abdd..2cab9016644a1804ee9a70d65e73c4119b3c8066 100644
--- a/kmqtt-broker/src/commonTest/kotlin/datastructures/TrieTest.kt
+++ b/kmqtt-broker/src/commonTest/kotlin/io/github/davidepianca98/datastructures/TrieTest.kt
@@ -1,6 +1,6 @@
-package datastructures
+package io.github.davidepianca98.datastructures
 
-import mqtt.Subscription
+import io.github.davidepianca98.mqtt.Subscription
 import kotlin.test.Test
 import kotlin.test.assertEquals
 
diff --git a/kmqtt-broker/src/commonTest/kotlin/integration/AuthenticationTest.kt b/kmqtt-broker/src/commonTest/kotlin/io/github/davidepianca98/integration/AuthenticationTest.kt
similarity index 86%
rename from kmqtt-broker/src/commonTest/kotlin/integration/AuthenticationTest.kt
rename to kmqtt-broker/src/commonTest/kotlin/io/github/davidepianca98/integration/AuthenticationTest.kt
index 67c98d6cb0d3faa21fb58b5614b952331cc3da21..884233b2e72b0a850d436f66ad53792d35d74e3b 100644
--- a/kmqtt-broker/src/commonTest/kotlin/integration/AuthenticationTest.kt
+++ b/kmqtt-broker/src/commonTest/kotlin/io/github/davidepianca98/integration/AuthenticationTest.kt
@@ -1,14 +1,14 @@
-package integration
+package io.github.davidepianca98.integration
 
-import MQTTClient
+import io.github.davidepianca98.MQTTClient
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.test.runTest
-import mqtt.MQTTVersion
-import mqtt.broker.Broker
-import mqtt.broker.interfaces.Authentication
-import mqtt.broker.interfaces.EnhancedAuthenticationProvider
-import mqtt.packets.mqttv5.MQTT5Properties
-import mqtt.packets.mqttv5.ReasonCode
+import io.github.davidepianca98.mqtt.MQTTVersion
+import io.github.davidepianca98.mqtt.broker.Broker
+import io.github.davidepianca98.mqtt.broker.interfaces.Authentication
+import io.github.davidepianca98.mqtt.broker.interfaces.EnhancedAuthenticationProvider
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Properties
+import io.github.davidepianca98.mqtt.packets.mqttv5.ReasonCode
 import kotlin.test.Test
 
 class AuthenticationTest {
diff --git a/kmqtt-broker/src/commonTest/kotlin/integration/PublishSubscribeMultipleClientsTest.kt b/kmqtt-broker/src/commonTest/kotlin/io/github/davidepianca98/integration/PublishSubscribeMultipleClientsTest.kt
similarity index 84%
rename from kmqtt-broker/src/commonTest/kotlin/integration/PublishSubscribeMultipleClientsTest.kt
rename to kmqtt-broker/src/commonTest/kotlin/io/github/davidepianca98/integration/PublishSubscribeMultipleClientsTest.kt
index 2e4a4605a68c5764f00f06f22b96d4643a7022f7..36ff0c2946eb2803b48a8f082e465915f07889ae 100644
--- a/kmqtt-broker/src/commonTest/kotlin/integration/PublishSubscribeMultipleClientsTest.kt
+++ b/kmqtt-broker/src/commonTest/kotlin/io/github/davidepianca98/integration/PublishSubscribeMultipleClientsTest.kt
@@ -1,14 +1,14 @@
-package integration
+package io.github.davidepianca98.integration
 
-import MQTTClient
+import io.github.davidepianca98.MQTTClient
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.test.runTest
-import mqtt.MQTTVersion
-import mqtt.Subscription
-import mqtt.broker.Broker
-import mqtt.packets.Qos
-import mqtt.packets.mqttv5.ReasonCode
-import mqtt.packets.mqttv5.SubscriptionOptions
+import io.github.davidepianca98.mqtt.MQTTVersion
+import io.github.davidepianca98.mqtt.Subscription
+import io.github.davidepianca98.mqtt.broker.Broker
+import io.github.davidepianca98.mqtt.packets.Qos
+import io.github.davidepianca98.mqtt.packets.mqttv5.ReasonCode
+import io.github.davidepianca98.mqtt.packets.mqttv5.SubscriptionOptions
 import kotlin.test.Test
 import kotlin.test.assertContentEquals
 import kotlin.test.assertEquals
diff --git a/kmqtt-broker/src/commonTest/kotlin/integration/PublishSubscribeSingleClientTest.kt b/kmqtt-broker/src/commonTest/kotlin/io/github/davidepianca98/integration/PublishSubscribeSingleClientTest.kt
similarity index 74%
rename from kmqtt-broker/src/commonTest/kotlin/integration/PublishSubscribeSingleClientTest.kt
rename to kmqtt-broker/src/commonTest/kotlin/io/github/davidepianca98/integration/PublishSubscribeSingleClientTest.kt
index 28b255e9f5336ec214752c97e41b46578da424fc..5fd23bd94a0945b6efa8e08f7baa6f3d29d53211 100644
--- a/kmqtt-broker/src/commonTest/kotlin/integration/PublishSubscribeSingleClientTest.kt
+++ b/kmqtt-broker/src/commonTest/kotlin/io/github/davidepianca98/integration/PublishSubscribeSingleClientTest.kt
@@ -1,16 +1,14 @@
-package integration
+package io.github.davidepianca98.integration
 
-import MQTTClient
-import kotlinx.coroutines.Dispatchers
+import io.github.davidepianca98.MQTTClient
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.test.runTest
-import kotlinx.coroutines.withContext
-import mqtt.MQTTVersion
-import mqtt.Subscription
-import mqtt.broker.Broker
-import mqtt.packets.Qos
-import mqtt.packets.mqttv5.ReasonCode
-import mqtt.packets.mqttv5.SubscriptionOptions
+import io.github.davidepianca98.mqtt.MQTTVersion
+import io.github.davidepianca98.mqtt.Subscription
+import io.github.davidepianca98.mqtt.broker.Broker
+import io.github.davidepianca98.mqtt.packets.Qos
+import io.github.davidepianca98.mqtt.packets.mqttv5.ReasonCode
+import io.github.davidepianca98.mqtt.packets.mqttv5.SubscriptionOptions
 import kotlin.test.Test
 import kotlin.test.assertContentEquals
 import kotlin.test.assertEquals
diff --git a/kmqtt-broker/src/commonTest/kotlin/integration/RetainedPublishTest.kt b/kmqtt-broker/src/commonTest/kotlin/io/github/davidepianca98/integration/RetainedPublishTest.kt
similarity index 82%
rename from kmqtt-broker/src/commonTest/kotlin/integration/RetainedPublishTest.kt
rename to kmqtt-broker/src/commonTest/kotlin/io/github/davidepianca98/integration/RetainedPublishTest.kt
index 79b0d5fcbdd498222ecc6261736ba0e147bd57b8..4a89bd597050345a4ba0350a14d6ccac2aa3cb0a 100644
--- a/kmqtt-broker/src/commonTest/kotlin/integration/RetainedPublishTest.kt
+++ b/kmqtt-broker/src/commonTest/kotlin/io/github/davidepianca98/integration/RetainedPublishTest.kt
@@ -1,16 +1,14 @@
-package integration
+package io.github.davidepianca98.integration
 
-import MQTTClient
-import kotlinx.coroutines.Dispatchers
+import io.github.davidepianca98.MQTTClient
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.test.runTest
-import kotlinx.coroutines.withContext
-import mqtt.MQTTVersion
-import mqtt.Subscription
-import mqtt.broker.Broker
-import mqtt.packets.Qos
-import mqtt.packets.mqttv5.ReasonCode
-import mqtt.packets.mqttv5.SubscriptionOptions
+import io.github.davidepianca98.mqtt.MQTTVersion
+import io.github.davidepianca98.mqtt.Subscription
+import io.github.davidepianca98.mqtt.broker.Broker
+import io.github.davidepianca98.mqtt.packets.Qos
+import io.github.davidepianca98.mqtt.packets.mqttv5.ReasonCode
+import io.github.davidepianca98.mqtt.packets.mqttv5.SubscriptionOptions
 import kotlin.test.Test
 import kotlin.test.assertContentEquals
 import kotlin.test.assertEquals
diff --git a/kmqtt-broker/src/commonTest/kotlin/integration/TLSTest.kt b/kmqtt-broker/src/commonTest/kotlin/io/github/davidepianca98/integration/TLSTest.kt
similarity index 77%
rename from kmqtt-broker/src/commonTest/kotlin/integration/TLSTest.kt
rename to kmqtt-broker/src/commonTest/kotlin/io/github/davidepianca98/integration/TLSTest.kt
index 077b5ccc617ab4d1f9b5519d475d35062a2ac65b..aab3fe9d2f36199d64b7331b8f0e922a91023269 100644
--- a/kmqtt-broker/src/commonTest/kotlin/integration/TLSTest.kt
+++ b/kmqtt-broker/src/commonTest/kotlin/io/github/davidepianca98/integration/TLSTest.kt
@@ -1,19 +1,17 @@
-package integration
+package io.github.davidepianca98.integration
 
-import MQTTClient
+import io.github.davidepianca98.MQTTClient
 import com.goncalossilva.resources.Resource
-import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.test.runTest
-import kotlinx.coroutines.withContext
-import mqtt.MQTTVersion
-import mqtt.Subscription
-import mqtt.broker.Broker
-import mqtt.packets.Qos
-import mqtt.packets.mqttv5.ReasonCode
-import mqtt.packets.mqttv5.SubscriptionOptions
-import socket.tls.TLSClientSettings
-import socket.tls.TLSSettings
+import io.github.davidepianca98.mqtt.MQTTVersion
+import io.github.davidepianca98.mqtt.Subscription
+import io.github.davidepianca98.mqtt.broker.Broker
+import io.github.davidepianca98.mqtt.packets.Qos
+import io.github.davidepianca98.mqtt.packets.mqttv5.ReasonCode
+import io.github.davidepianca98.mqtt.packets.mqttv5.SubscriptionOptions
+import io.github.davidepianca98.socket.tls.TLSClientSettings
+import io.github.davidepianca98.socket.tls.TLSSettings
 import kotlin.test.Test
 import kotlin.test.assertContentEquals
 import kotlin.test.assertEquals
diff --git a/kmqtt-broker/src/commonTest/kotlin/mqtt/MQTTCurrentPacketTest.kt b/kmqtt-broker/src/commonTest/kotlin/io/github/davidepianca98/mqtt/MQTTCurrentPacketTest.kt
similarity index 96%
rename from kmqtt-broker/src/commonTest/kotlin/mqtt/MQTTCurrentPacketTest.kt
rename to kmqtt-broker/src/commonTest/kotlin/io/github/davidepianca98/mqtt/MQTTCurrentPacketTest.kt
index 3774afab39f02d12b8d56664dc8a3fba0d954802..82f9720f5322346b31ed28efba5291915d833570 100644
--- a/kmqtt-broker/src/commonTest/kotlin/mqtt/MQTTCurrentPacketTest.kt
+++ b/kmqtt-broker/src/commonTest/kotlin/io/github/davidepianca98/mqtt/MQTTCurrentPacketTest.kt
@@ -1,6 +1,6 @@
-package mqtt
+package io.github.davidepianca98.mqtt
 
-import mqtt.packets.mqttv5.MQTT5Publish
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Publish
 import kotlin.test.Test
 import kotlin.test.assertEquals
 
diff --git a/kmqtt-broker/src/jsMain/kotlin/io/github/davidepianca98/setShutdownHook.kt b/kmqtt-broker/src/jsMain/kotlin/io/github/davidepianca98/setShutdownHook.kt
new file mode 100644
index 0000000000000000000000000000000000000000..05a5e8055e26184419b750167629b04c29cda8e3
--- /dev/null
+++ b/kmqtt-broker/src/jsMain/kotlin/io/github/davidepianca98/setShutdownHook.kt
@@ -0,0 +1,10 @@
+package io.github.davidepianca98
+
+import node.process.ProcessEvent
+import node.process.process
+
+internal actual fun setShutdownHook(hook: () -> Unit) {
+    process.on(ProcessEvent.BEFOREEXIT) {
+        hook()
+    }
+}
diff --git a/kmqtt-broker/src/jsMain/kotlin/socket/ServerSocket.kt b/kmqtt-broker/src/jsMain/kotlin/io/github/davidepianca98/socket/ServerSocket.kt
similarity index 82%
rename from kmqtt-broker/src/jsMain/kotlin/socket/ServerSocket.kt
rename to kmqtt-broker/src/jsMain/kotlin/io/github/davidepianca98/socket/ServerSocket.kt
index 6784551cda5924064e90211c122164486d63ab1a..40515bc39153214e139953b2d3dbbbd826a3fd3c 100644
--- a/kmqtt-broker/src/jsMain/kotlin/socket/ServerSocket.kt
+++ b/kmqtt-broker/src/jsMain/kotlin/io/github/davidepianca98/socket/ServerSocket.kt
@@ -1,12 +1,15 @@
-package socket
+package io.github.davidepianca98.socket
 
-import mqtt.broker.Broker
-import mqtt.broker.ClientConnection
-import mqtt.broker.cluster.ClusterConnection
+import io.github.davidepianca98.mqtt.broker.Broker
+import io.github.davidepianca98.mqtt.broker.ClientConnection
+import io.github.davidepianca98.mqtt.broker.cluster.ClusterConnection
 import node.net.SocketEvent
-import socket.tcp.Socket
-import socket.tcp.WebSocket
+import io.github.davidepianca98.socket.tcp.Socket
+import io.github.davidepianca98.socket.tcp.WebSocket
+import node.net.Server
+import node.net.createServer
 import web.timers.setTimeout
+import kotlin.collections.iterator
 
 internal actual open class ServerSocket actual constructor(
     private val broker: Broker,
@@ -14,7 +17,7 @@ internal actual open class ServerSocket actual constructor(
 ) : ServerSocketInterface {
 
     protected val clients = mutableMapOf<String, Pair<node.net.Socket, Any?>>()
-    protected open val mqttSocket: node.net.Server = node.net.createServer { socket: node.net.Socket ->
+    protected open val mqttSocket: Server = createServer { socket: node.net.Socket ->
         val localSocket = createSocket(socket)
         val connection = ClientConnection(localSocket, broker)
         clients[socket.socketId()] = Pair(socket, connection)
@@ -22,7 +25,7 @@ internal actual open class ServerSocket actual constructor(
 
         onConnect(socket)
     }
-    protected open val mqttWebSocket: node.net.Server = node.net.createServer { socket: node.net.Socket ->
+    protected open val mqttWebSocket: Server = createServer { socket: node.net.Socket ->
         val localSocket = createSocket(socket)
         val connection = ClientConnection(WebSocket(localSocket), broker)
         clients[socket.socketId()] = Pair(socket, connection)
diff --git a/kmqtt-broker/src/jsMain/kotlin/socket/tls/TLSServerSocket.kt b/kmqtt-broker/src/jsMain/kotlin/io/github/davidepianca98/socket/tls/TLSServerSocket.kt
similarity index 76%
rename from kmqtt-broker/src/jsMain/kotlin/socket/tls/TLSServerSocket.kt
rename to kmqtt-broker/src/jsMain/kotlin/io/github/davidepianca98/socket/tls/TLSServerSocket.kt
index fad911c1366ab3c14688f21600a270da728e580e..c4cebb0b6d4214902f7ee32c3fab33b5e0cd8d07 100644
--- a/kmqtt-broker/src/jsMain/kotlin/socket/tls/TLSServerSocket.kt
+++ b/kmqtt-broker/src/jsMain/kotlin/io/github/davidepianca98/socket/tls/TLSServerSocket.kt
@@ -1,12 +1,13 @@
-package socket.tls
+package io.github.davidepianca98.socket.tls
 
-import mqtt.broker.Broker
-import mqtt.broker.ClientConnection
+import io.github.davidepianca98.mqtt.broker.Broker
+import io.github.davidepianca98.mqtt.broker.ClientConnection
 import node.fs.ReadFileSyncBufferOptions
 import node.net.Socket
-import socket.ServerSocket
-import socket.SocketState
-import socket.tcp.WebSocket
+import io.github.davidepianca98.socket.ServerSocket
+import io.github.davidepianca98.socket.SocketState
+import io.github.davidepianca98.socket.tcp.WebSocket
+import node.fs.readFileSync
 
 internal actual class TLSServerSocket actual constructor(
     private val broker: Broker,
@@ -17,7 +18,7 @@ internal actual class TLSServerSocket actual constructor(
     private fun ReadFileOptions(): ReadFileSyncBufferOptions = js("{}") as ReadFileSyncBufferOptions
 
     private val tlsOptions = TlsOptions().apply {
-        pfx = node.fs.readFileSync(broker.tlsSettings!!.keyStoreFilePath, ReadFileOptions())
+        pfx = readFileSync(broker.tlsSettings!!.keyStoreFilePath, ReadFileOptions())
         passphrase = broker.tlsSettings.keyStorePassword
         requestCert = broker.tlsSettings.requireClientCertificate
     }
@@ -57,9 +58,9 @@ internal actual class TLSServerSocket actual constructor(
         }
     }
 
-    private fun node.net.Socket.socketId(): String = "$remoteAddress:$remotePort"
+    private fun Socket.socketId(): String = "$remoteAddress:$remotePort"
 
-    override fun createSocket(socket: node.net.Socket): TLSSocket {
+    override fun createSocket(socket: Socket): TLSSocket {
         return TLSSocket(socket, selectCallback)
     }
 }
diff --git a/kmqtt-broker/src/jsMain/kotlin/socket/udp/UDPSocket.kt b/kmqtt-broker/src/jsMain/kotlin/io/github/davidepianca98/socket/udp/UDPSocket.kt
similarity index 73%
rename from kmqtt-broker/src/jsMain/kotlin/socket/udp/UDPSocket.kt
rename to kmqtt-broker/src/jsMain/kotlin/io/github/davidepianca98/socket/udp/UDPSocket.kt
index fac7aa20d5b39d53fe9c24506eb42274caf4ec1c..63b721ba3d7a703a14be5eef84c6aae2426ec71e 100644
--- a/kmqtt-broker/src/jsMain/kotlin/socket/udp/UDPSocket.kt
+++ b/kmqtt-broker/src/jsMain/kotlin/io/github/davidepianca98/socket/udp/UDPSocket.kt
@@ -1,10 +1,12 @@
-package socket.udp
+package io.github.davidepianca98.socket.udp
 
-import socket.SocketState
-import toBuffer
+import node.dgram.Socket
+import node.dgram.SocketEvent
+import io.github.davidepianca98.socket.SocketState
+import io.github.davidepianca98.toBuffer
 
 internal actual class UDPSocket(
-    private val socket: node.dgram.Socket,
+    private val socket: Socket,
     private val selectCallback: (attachment: Any?, state: SocketState) -> Boolean
 ) {
 
@@ -12,7 +14,7 @@ internal actual class UDPSocket(
     private var attachment: Any? = null
 
     init {
-        socket.on(node.dgram.SocketEvent.MESSAGE) { msg, rinfo ->
+        socket.on(SocketEvent.MESSAGE) { msg, rinfo ->
             queue.add(UDPReadData(msg.toUByteArray(), rinfo.address, rinfo.port.toInt()))
             selectCallback(attachment, SocketState.READ)
         }
diff --git a/kmqtt-broker/src/jsMain/kotlin/setShutdownHook.kt b/kmqtt-broker/src/jsMain/kotlin/setShutdownHook.kt
deleted file mode 100644
index f408c18e9cdc46a13650f39fd39df40589213de7..0000000000000000000000000000000000000000
--- a/kmqtt-broker/src/jsMain/kotlin/setShutdownHook.kt
+++ /dev/null
@@ -1,7 +0,0 @@
-import node.process.process
-
-internal actual fun setShutdownHook(hook: () -> Unit) {
-    process.on(node.process.ProcessEvent.BEFOREEXIT) {
-        hook()
-    }
-}
diff --git a/kmqtt-broker/src/jvmMain/kotlin/setShutdownHook.kt b/kmqtt-broker/src/jvmMain/kotlin/io/github/davidepianca98/setShutdownHook.kt
similarity index 84%
rename from kmqtt-broker/src/jvmMain/kotlin/setShutdownHook.kt
rename to kmqtt-broker/src/jvmMain/kotlin/io/github/davidepianca98/setShutdownHook.kt
index c07a9a554d6bd9f00feee2566e88d287aea3dcb7..70ba797d9f7f8eed2e291276cd8139d6bcf62f66 100644
--- a/kmqtt-broker/src/jvmMain/kotlin/setShutdownHook.kt
+++ b/kmqtt-broker/src/jvmMain/kotlin/io/github/davidepianca98/setShutdownHook.kt
@@ -1,3 +1,5 @@
+package io.github.davidepianca98
+
 public actual fun setShutdownHook(hook: () -> Unit) {
     Runtime.getRuntime().addShutdownHook(object : Thread() {
         override fun run() {
diff --git a/kmqtt-broker/src/jvmMain/kotlin/socket/ServerSocket.kt b/kmqtt-broker/src/jvmMain/kotlin/io/github/davidepianca98/socket/ServerSocket.kt
similarity index 92%
rename from kmqtt-broker/src/jvmMain/kotlin/socket/ServerSocket.kt
rename to kmqtt-broker/src/jvmMain/kotlin/io/github/davidepianca98/socket/ServerSocket.kt
index dee547f43bd984e068fceaac061d05d186962c3d..285c589d123695d3887d908fd1cfa187b9b496ec 100644
--- a/kmqtt-broker/src/jvmMain/kotlin/socket/ServerSocket.kt
+++ b/kmqtt-broker/src/jvmMain/kotlin/io/github/davidepianca98/socket/ServerSocket.kt
@@ -1,16 +1,16 @@
-package socket
+package io.github.davidepianca98.socket
 
-import mqtt.broker.Broker
-import mqtt.broker.ClientConnection
-import mqtt.broker.cluster.ClusterConnection
-import mqtt.broker.cluster.ClusterDiscoveryConnection
-import mqtt.broker.udp.UDPConnectionsMap
+import io.github.davidepianca98.mqtt.broker.Broker
+import io.github.davidepianca98.mqtt.broker.ClientConnection
+import io.github.davidepianca98.mqtt.broker.cluster.ClusterConnection
+import io.github.davidepianca98.mqtt.broker.cluster.ClusterDiscoveryConnection
+import io.github.davidepianca98.mqtt.broker.udp.UDPConnectionsMap
 import org.xbill.DNS.ARecord
 import org.xbill.DNS.Lookup
 import org.xbill.DNS.Type
-import socket.tcp.Socket
-import socket.tcp.WebSocket
-import socket.udp.UDPSocket
+import io.github.davidepianca98.socket.tcp.Socket
+import io.github.davidepianca98.socket.tcp.WebSocket
+import io.github.davidepianca98.socket.udp.UDPSocket
 import java.net.InetAddress
 import java.net.InetSocketAddress
 import java.net.StandardSocketOptions
diff --git a/kmqtt-broker/src/jvmMain/kotlin/socket/tls/TLSServerSocket.kt b/kmqtt-broker/src/jvmMain/kotlin/io/github/davidepianca98/socket/tls/TLSServerSocket.kt
similarity index 93%
rename from kmqtt-broker/src/jvmMain/kotlin/socket/tls/TLSServerSocket.kt
rename to kmqtt-broker/src/jvmMain/kotlin/io/github/davidepianca98/socket/tls/TLSServerSocket.kt
index 7d252a76ab7690304bf114f5496e1f4b8b7da763..42b2fd9a91fe4ec43ba817c38f7f09d988b30203 100644
--- a/kmqtt-broker/src/jvmMain/kotlin/socket/tls/TLSServerSocket.kt
+++ b/kmqtt-broker/src/jvmMain/kotlin/io/github/davidepianca98/socket/tls/TLSServerSocket.kt
@@ -1,9 +1,9 @@
-package socket.tls
+package io.github.davidepianca98.socket.tls
 
-import mqtt.broker.Broker
-import socket.ServerSocket
-import socket.SocketState
-import socket.tcp.Socket
+import io.github.davidepianca98.mqtt.broker.Broker
+import io.github.davidepianca98.socket.ServerSocket
+import io.github.davidepianca98.socket.SocketState
+import io.github.davidepianca98.socket.tcp.Socket
 import java.io.ByteArrayInputStream
 import java.io.File
 import java.nio.ByteBuffer
diff --git a/kmqtt-broker/src/jvmMain/kotlin/socket/udp/UDPSocket.kt b/kmqtt-broker/src/jvmMain/kotlin/io/github/davidepianca98/socket/udp/UDPSocket.kt
similarity index 91%
rename from kmqtt-broker/src/jvmMain/kotlin/socket/udp/UDPSocket.kt
rename to kmqtt-broker/src/jvmMain/kotlin/io/github/davidepianca98/socket/udp/UDPSocket.kt
index a08a678a124c166bac0a19518c66b979fdac2e3f..39589d2c9aa39652ca07a8e9d53a6c8052ba7d2e 100644
--- a/kmqtt-broker/src/jvmMain/kotlin/socket/udp/UDPSocket.kt
+++ b/kmqtt-broker/src/jvmMain/kotlin/io/github/davidepianca98/socket/udp/UDPSocket.kt
@@ -1,6 +1,6 @@
-package socket.udp
+package io.github.davidepianca98.socket.udp
 
-import toUByteArray
+import io.github.davidepianca98.toUByteArray
 import java.net.InetSocketAddress
 import java.nio.ByteBuffer
 import java.nio.channels.DatagramChannel
diff --git a/kmqtt-broker/src/jvmTest/kotlin/RunLocal.kt b/kmqtt-broker/src/jvmTest/kotlin/RunLocal.kt
index d9a6718f6d893cdd4b749c3eec42a3cfde6226c9..e3e6b08b2408fd0201eaaf5fb450df66f2eb4429 100644
--- a/kmqtt-broker/src/jvmTest/kotlin/RunLocal.kt
+++ b/kmqtt-broker/src/jvmTest/kotlin/RunLocal.kt
@@ -1,6 +1,6 @@
-import mqtt.broker.Broker
-import mqtt.broker.interfaces.Authorization
-import socket.tls.TLSSettings
+import io.github.davidepianca98.mqtt.broker.Broker
+import io.github.davidepianca98.mqtt.broker.interfaces.Authorization
+import io.github.davidepianca98.socket.tls.TLSSettings
 
 fun main() {
     Broker(
diff --git a/kmqtt-broker/src/macosX64Main/kotlin/setShutdownHook.kt b/kmqtt-broker/src/linuxArm64Main/kotlin/io/github/davidepianca98/setShutdownHook.kt
similarity index 92%
rename from kmqtt-broker/src/macosX64Main/kotlin/setShutdownHook.kt
rename to kmqtt-broker/src/linuxArm64Main/kotlin/io/github/davidepianca98/setShutdownHook.kt
index f8ec7b8ad6f55f5b29c9a4189aac9b6110ca1806..6fd07530f6d357dec46c0393d0ac802489de3e5e 100644
--- a/kmqtt-broker/src/macosX64Main/kotlin/setShutdownHook.kt
+++ b/kmqtt-broker/src/linuxArm64Main/kotlin/io/github/davidepianca98/setShutdownHook.kt
@@ -1,3 +1,5 @@
+package io.github.davidepianca98
+
 import kotlinx.cinterop.staticCFunction
 import platform.posix.SIGINT
 import platform.posix.SIGTERM
diff --git a/kmqtt-broker/src/linuxArm64Main/kotlin/socket.tls/TLSServerContext.kt b/kmqtt-broker/src/linuxArm64Main/kotlin/io/github/davidepianca98/socket.tls/TLSServerContext.kt
similarity index 97%
rename from kmqtt-broker/src/linuxArm64Main/kotlin/socket.tls/TLSServerContext.kt
rename to kmqtt-broker/src/linuxArm64Main/kotlin/io/github/davidepianca98/socket.tls/TLSServerContext.kt
index d55a78ffe535dc4500c07b796647d7b0e639d984..29106e7cdb6a9f00686e9aa9e315ae10d780c5e4 100644
--- a/kmqtt-broker/src/linuxArm64Main/kotlin/socket.tls/TLSServerContext.kt
+++ b/kmqtt-broker/src/linuxArm64Main/kotlin/io/github/davidepianca98/socket.tls/TLSServerContext.kt
@@ -1,4 +1,4 @@
-package socket.tls
+package io.github.davidepianca98.socket.tls
 
 import cnames.structs.stack_st_X509
 import kotlinx.cinterop.*
diff --git a/kmqtt-broker/src/linuxArm64Main/kotlin/socket.tls/TLSServerEngine.kt b/kmqtt-broker/src/linuxArm64Main/kotlin/io/github/davidepianca98/socket.tls/TLSServerEngine.kt
similarity index 95%
rename from kmqtt-broker/src/linuxArm64Main/kotlin/socket.tls/TLSServerEngine.kt
rename to kmqtt-broker/src/linuxArm64Main/kotlin/io/github/davidepianca98/socket.tls/TLSServerEngine.kt
index 0dc5defc552d808703b9eaa8f50a9b45c378cc34..62574c55be244393c7c29f8dfe4ad67ee2fcbee7 100644
--- a/kmqtt-broker/src/linuxArm64Main/kotlin/socket.tls/TLSServerEngine.kt
+++ b/kmqtt-broker/src/linuxArm64Main/kotlin/io/github/davidepianca98/socket.tls/TLSServerEngine.kt
@@ -1,8 +1,8 @@
-package socket.tls
+package io.github.davidepianca98.socket.tls
 
 import kotlinx.cinterop.*
 import openssl.*
-import socket.IOException
+import io.github.davidepianca98.socket.IOException
 
 internal actual class TLSServerEngine actual constructor(serverContext: TLSServerContext) : TLSEngine {
 
diff --git a/kmqtt-broker/src/macosArm64Main/kotlin/setShutdownHook.kt b/kmqtt-broker/src/linuxX64Main/kotlin/io/github/davidepianca98/setShutdownHook.kt
similarity index 92%
rename from kmqtt-broker/src/macosArm64Main/kotlin/setShutdownHook.kt
rename to kmqtt-broker/src/linuxX64Main/kotlin/io/github/davidepianca98/setShutdownHook.kt
index f8ec7b8ad6f55f5b29c9a4189aac9b6110ca1806..6fd07530f6d357dec46c0393d0ac802489de3e5e 100644
--- a/kmqtt-broker/src/macosArm64Main/kotlin/setShutdownHook.kt
+++ b/kmqtt-broker/src/linuxX64Main/kotlin/io/github/davidepianca98/setShutdownHook.kt
@@ -1,3 +1,5 @@
+package io.github.davidepianca98
+
 import kotlinx.cinterop.staticCFunction
 import platform.posix.SIGINT
 import platform.posix.SIGTERM
diff --git a/kmqtt-broker/src/macosArm64Main/kotlin/socket/tls/TLSServerContext.kt b/kmqtt-broker/src/linuxX64Main/kotlin/io/github/davidepianca98/socket/tls/TLSServerContext.kt
similarity index 97%
rename from kmqtt-broker/src/macosArm64Main/kotlin/socket/tls/TLSServerContext.kt
rename to kmqtt-broker/src/linuxX64Main/kotlin/io/github/davidepianca98/socket/tls/TLSServerContext.kt
index afbbd663dc85e943d7a3e8964317c5a3db58ed21..3b7f599424c5d932e7cdf2ac9706dad9b657c094 100644
--- a/kmqtt-broker/src/macosArm64Main/kotlin/socket/tls/TLSServerContext.kt
+++ b/kmqtt-broker/src/linuxX64Main/kotlin/io/github/davidepianca98/socket/tls/TLSServerContext.kt
@@ -1,8 +1,7 @@
-package socket.tls
+package io.github.davidepianca98.socket.tls
 
 import cnames.structs.stack_st_X509
 import kotlinx.cinterop.*
-import mqtt.broker.Broker
 import openssl.*
 import platform.posix.fclose
 import platform.posix.fopen
diff --git a/kmqtt-broker/src/macosX64Main/kotlin/socket/tls/TLSServerEngine.kt b/kmqtt-broker/src/linuxX64Main/kotlin/io/github/davidepianca98/socket/tls/TLSServerEngine.kt
similarity index 95%
rename from kmqtt-broker/src/macosX64Main/kotlin/socket/tls/TLSServerEngine.kt
rename to kmqtt-broker/src/linuxX64Main/kotlin/io/github/davidepianca98/socket/tls/TLSServerEngine.kt
index 3c08335d5f42b109067f08d1df5a867ada9a0b6e..d8a8e6c71b116ba99819ca148594a8bbb588995d 100644
--- a/kmqtt-broker/src/macosX64Main/kotlin/socket/tls/TLSServerEngine.kt
+++ b/kmqtt-broker/src/linuxX64Main/kotlin/io/github/davidepianca98/socket/tls/TLSServerEngine.kt
@@ -1,9 +1,9 @@
-package socket.tls
+package io.github.davidepianca98.socket.tls
 
 import kotlinx.cinterop.ByteVar
 import kotlinx.cinterop.CPointer
 import openssl.*
-import socket.IOException
+import io.github.davidepianca98.socket.IOException
 
 internal actual class TLSServerEngine actual constructor(serverContext: TLSServerContext) : TLSEngine {
 
diff --git a/kmqtt-broker/src/linuxArm64Main/kotlin/setShutdownHook.kt b/kmqtt-broker/src/macosArm64Main/kotlin/io/github/davidepianca98/setShutdownHook.kt
similarity index 92%
rename from kmqtt-broker/src/linuxArm64Main/kotlin/setShutdownHook.kt
rename to kmqtt-broker/src/macosArm64Main/kotlin/io/github/davidepianca98/setShutdownHook.kt
index f8ec7b8ad6f55f5b29c9a4189aac9b6110ca1806..6fd07530f6d357dec46c0393d0ac802489de3e5e 100644
--- a/kmqtt-broker/src/linuxArm64Main/kotlin/setShutdownHook.kt
+++ b/kmqtt-broker/src/macosArm64Main/kotlin/io/github/davidepianca98/setShutdownHook.kt
@@ -1,3 +1,5 @@
+package io.github.davidepianca98
+
 import kotlinx.cinterop.staticCFunction
 import platform.posix.SIGINT
 import platform.posix.SIGTERM
diff --git a/kmqtt-broker/src/linuxX64Main/kotlin/socket/tls/TLSServerContext.kt b/kmqtt-broker/src/macosArm64Main/kotlin/io/github/davidepianca98/socket/tls/TLSServerContext.kt
similarity index 97%
rename from kmqtt-broker/src/linuxX64Main/kotlin/socket/tls/TLSServerContext.kt
rename to kmqtt-broker/src/macosArm64Main/kotlin/io/github/davidepianca98/socket/tls/TLSServerContext.kt
index afbbd663dc85e943d7a3e8964317c5a3db58ed21..3b7f599424c5d932e7cdf2ac9706dad9b657c094 100644
--- a/kmqtt-broker/src/linuxX64Main/kotlin/socket/tls/TLSServerContext.kt
+++ b/kmqtt-broker/src/macosArm64Main/kotlin/io/github/davidepianca98/socket/tls/TLSServerContext.kt
@@ -1,8 +1,7 @@
-package socket.tls
+package io.github.davidepianca98.socket.tls
 
 import cnames.structs.stack_st_X509
 import kotlinx.cinterop.*
-import mqtt.broker.Broker
 import openssl.*
 import platform.posix.fclose
 import platform.posix.fopen
diff --git a/kmqtt-broker/src/macosArm64Main/kotlin/socket/tls/TLSServerEngine.kt b/kmqtt-broker/src/macosArm64Main/kotlin/io/github/davidepianca98/socket/tls/TLSServerEngine.kt
similarity index 95%
rename from kmqtt-broker/src/macosArm64Main/kotlin/socket/tls/TLSServerEngine.kt
rename to kmqtt-broker/src/macosArm64Main/kotlin/io/github/davidepianca98/socket/tls/TLSServerEngine.kt
index 3c08335d5f42b109067f08d1df5a867ada9a0b6e..d8a8e6c71b116ba99819ca148594a8bbb588995d 100644
--- a/kmqtt-broker/src/macosArm64Main/kotlin/socket/tls/TLSServerEngine.kt
+++ b/kmqtt-broker/src/macosArm64Main/kotlin/io/github/davidepianca98/socket/tls/TLSServerEngine.kt
@@ -1,9 +1,9 @@
-package socket.tls
+package io.github.davidepianca98.socket.tls
 
 import kotlinx.cinterop.ByteVar
 import kotlinx.cinterop.CPointer
 import openssl.*
-import socket.IOException
+import io.github.davidepianca98.socket.IOException
 
 internal actual class TLSServerEngine actual constructor(serverContext: TLSServerContext) : TLSEngine {
 
diff --git a/kmqtt-broker/src/linuxX64Main/kotlin/setShutdownHook.kt b/kmqtt-broker/src/macosX64Main/kotlin/io/github/davidepianca98/setShutdownHook.kt
similarity index 92%
rename from kmqtt-broker/src/linuxX64Main/kotlin/setShutdownHook.kt
rename to kmqtt-broker/src/macosX64Main/kotlin/io/github/davidepianca98/setShutdownHook.kt
index f8ec7b8ad6f55f5b29c9a4189aac9b6110ca1806..6fd07530f6d357dec46c0393d0ac802489de3e5e 100644
--- a/kmqtt-broker/src/linuxX64Main/kotlin/setShutdownHook.kt
+++ b/kmqtt-broker/src/macosX64Main/kotlin/io/github/davidepianca98/setShutdownHook.kt
@@ -1,3 +1,5 @@
+package io.github.davidepianca98
+
 import kotlinx.cinterop.staticCFunction
 import platform.posix.SIGINT
 import platform.posix.SIGTERM
diff --git a/kmqtt-broker/src/mingwX64Main/kotlin/socket/tls/TLSServerContext.kt b/kmqtt-broker/src/macosX64Main/kotlin/io/github/davidepianca98/socket/tls/TLSServerContext.kt
similarity index 97%
rename from kmqtt-broker/src/mingwX64Main/kotlin/socket/tls/TLSServerContext.kt
rename to kmqtt-broker/src/macosX64Main/kotlin/io/github/davidepianca98/socket/tls/TLSServerContext.kt
index afbbd663dc85e943d7a3e8964317c5a3db58ed21..3b7f599424c5d932e7cdf2ac9706dad9b657c094 100644
--- a/kmqtt-broker/src/mingwX64Main/kotlin/socket/tls/TLSServerContext.kt
+++ b/kmqtt-broker/src/macosX64Main/kotlin/io/github/davidepianca98/socket/tls/TLSServerContext.kt
@@ -1,8 +1,7 @@
-package socket.tls
+package io.github.davidepianca98.socket.tls
 
 import cnames.structs.stack_st_X509
 import kotlinx.cinterop.*
-import mqtt.broker.Broker
 import openssl.*
 import platform.posix.fclose
 import platform.posix.fopen
diff --git a/kmqtt-broker/src/linuxX64Main/kotlin/socket/tls/TLSServerEngine.kt b/kmqtt-broker/src/macosX64Main/kotlin/io/github/davidepianca98/socket/tls/TLSServerEngine.kt
similarity index 95%
rename from kmqtt-broker/src/linuxX64Main/kotlin/socket/tls/TLSServerEngine.kt
rename to kmqtt-broker/src/macosX64Main/kotlin/io/github/davidepianca98/socket/tls/TLSServerEngine.kt
index 3c08335d5f42b109067f08d1df5a867ada9a0b6e..d8a8e6c71b116ba99819ca148594a8bbb588995d 100644
--- a/kmqtt-broker/src/linuxX64Main/kotlin/socket/tls/TLSServerEngine.kt
+++ b/kmqtt-broker/src/macosX64Main/kotlin/io/github/davidepianca98/socket/tls/TLSServerEngine.kt
@@ -1,9 +1,9 @@
-package socket.tls
+package io.github.davidepianca98.socket.tls
 
 import kotlinx.cinterop.ByteVar
 import kotlinx.cinterop.CPointer
 import openssl.*
-import socket.IOException
+import io.github.davidepianca98.socket.IOException
 
 internal actual class TLSServerEngine actual constructor(serverContext: TLSServerContext) : TLSEngine {
 
diff --git a/kmqtt-broker/src/mingwX64Main/kotlin/setShutdownHook.kt b/kmqtt-broker/src/mingwX64Main/kotlin/io/github/davidepianca98/setShutdownHook.kt
similarity index 92%
rename from kmqtt-broker/src/mingwX64Main/kotlin/setShutdownHook.kt
rename to kmqtt-broker/src/mingwX64Main/kotlin/io/github/davidepianca98/setShutdownHook.kt
index 801378ae78b97548e21e555ac3278125849e9d25..3b206f3c9087d53e3547625f020c6a875d959a03 100644
--- a/kmqtt-broker/src/mingwX64Main/kotlin/setShutdownHook.kt
+++ b/kmqtt-broker/src/mingwX64Main/kotlin/io/github/davidepianca98/setShutdownHook.kt
@@ -1,3 +1,5 @@
+package io.github.davidepianca98
+
 import kotlinx.cinterop.staticCFunction
 import platform.windows.*
 
diff --git a/kmqtt-broker/src/macosX64Main/kotlin/socket/tls/TLSServerContext.kt b/kmqtt-broker/src/mingwX64Main/kotlin/io/github/davidepianca98/socket/tls/TLSServerContext.kt
similarity index 97%
rename from kmqtt-broker/src/macosX64Main/kotlin/socket/tls/TLSServerContext.kt
rename to kmqtt-broker/src/mingwX64Main/kotlin/io/github/davidepianca98/socket/tls/TLSServerContext.kt
index afbbd663dc85e943d7a3e8964317c5a3db58ed21..3b7f599424c5d932e7cdf2ac9706dad9b657c094 100644
--- a/kmqtt-broker/src/macosX64Main/kotlin/socket/tls/TLSServerContext.kt
+++ b/kmqtt-broker/src/mingwX64Main/kotlin/io/github/davidepianca98/socket/tls/TLSServerContext.kt
@@ -1,8 +1,7 @@
-package socket.tls
+package io.github.davidepianca98.socket.tls
 
 import cnames.structs.stack_st_X509
 import kotlinx.cinterop.*
-import mqtt.broker.Broker
 import openssl.*
 import platform.posix.fclose
 import platform.posix.fopen
diff --git a/kmqtt-broker/src/mingwX64Main/kotlin/socket/tls/TLSServerEngine.kt b/kmqtt-broker/src/mingwX64Main/kotlin/io/github/davidepianca98/socket/tls/TLSServerEngine.kt
similarity index 95%
rename from kmqtt-broker/src/mingwX64Main/kotlin/socket/tls/TLSServerEngine.kt
rename to kmqtt-broker/src/mingwX64Main/kotlin/io/github/davidepianca98/socket/tls/TLSServerEngine.kt
index 3c08335d5f42b109067f08d1df5a867ada9a0b6e..d8a8e6c71b116ba99819ca148594a8bbb588995d 100644
--- a/kmqtt-broker/src/mingwX64Main/kotlin/socket/tls/TLSServerEngine.kt
+++ b/kmqtt-broker/src/mingwX64Main/kotlin/io/github/davidepianca98/socket/tls/TLSServerEngine.kt
@@ -1,9 +1,9 @@
-package socket.tls
+package io.github.davidepianca98.socket.tls
 
 import kotlinx.cinterop.ByteVar
 import kotlinx.cinterop.CPointer
 import openssl.*
-import socket.IOException
+import io.github.davidepianca98.socket.IOException
 
 internal actual class TLSServerEngine actual constructor(serverContext: TLSServerContext) : TLSEngine {
 
diff --git a/kmqtt-broker/src/posixMain/kotlin/socket/ServerSocket.kt b/kmqtt-broker/src/posixMain/kotlin/io/github/davidepianca98/socket/ServerSocket.kt
similarity index 89%
rename from kmqtt-broker/src/posixMain/kotlin/socket/ServerSocket.kt
rename to kmqtt-broker/src/posixMain/kotlin/io/github/davidepianca98/socket/ServerSocket.kt
index f73b772da0ec39016849655a88d018e58ca225c9..5524be809e7a823616a476196c0391be3e063d26 100644
--- a/kmqtt-broker/src/posixMain/kotlin/socket/ServerSocket.kt
+++ b/kmqtt-broker/src/posixMain/kotlin/io/github/davidepianca98/socket/ServerSocket.kt
@@ -1,31 +1,31 @@
-package socket
-
-import bind
-import close
-import getEagain
-import getErrno
-import getEwouldblock
-import inet_pton
+package io.github.davidepianca98.socket
+
+import io.github.davidepianca98.bind
+import io.github.davidepianca98.close
+import io.github.davidepianca98.getEagain
+import io.github.davidepianca98.getErrno
+import io.github.davidepianca98.getEwouldblock
+import io.github.davidepianca98.inet_pton
 import kotlinx.cinterop.*
-import listen
-import mqtt.broker.Broker
-import mqtt.broker.ClientConnection
-import mqtt.broker.cluster.ClusterConnection
-import mqtt.broker.cluster.ClusterDiscoveryConnection
-import mqtt.broker.udp.UDPConnectionsMap
+import io.github.davidepianca98.listen
+import io.github.davidepianca98.mqtt.broker.Broker
+import io.github.davidepianca98.mqtt.broker.ClientConnection
+import io.github.davidepianca98.mqtt.broker.cluster.ClusterConnection
+import io.github.davidepianca98.mqtt.broker.cluster.ClusterDiscoveryConnection
+import io.github.davidepianca98.mqtt.broker.udp.UDPConnectionsMap
+import io.github.davidepianca98.select
 import platform.posix.*
-import select
-import set_non_blocking
-import setsockopt
-import shutdown
-import sockaddrIn
-import socket
-import socket.tcp.Socket
-import socket.tcp.WebSocket
-import socket.udp.UDPSocket
-import socketsCleanup
-import socketsInit
-import accept as posixAccept
+import io.github.davidepianca98.set_non_blocking
+import io.github.davidepianca98.setsockopt
+import io.github.davidepianca98.shutdown
+import io.github.davidepianca98.sockaddrIn
+import io.github.davidepianca98.socket
+import io.github.davidepianca98.socket.tcp.Socket
+import io.github.davidepianca98.socket.tcp.WebSocket
+import io.github.davidepianca98.socket.udp.UDPSocket
+import io.github.davidepianca98.socketsCleanup
+import io.github.davidepianca98.socketsInit
+import io.github.davidepianca98.accept as posixAccept
 
 internal actual open class ServerSocket actual constructor(
     private val broker: Broker,
diff --git a/kmqtt-broker/src/posixMain/kotlin/socket/tls/TLSServerContext.kt b/kmqtt-broker/src/posixMain/kotlin/io/github/davidepianca98/socket/tls/TLSServerContext.kt
similarity index 65%
rename from kmqtt-broker/src/posixMain/kotlin/socket/tls/TLSServerContext.kt
rename to kmqtt-broker/src/posixMain/kotlin/io/github/davidepianca98/socket/tls/TLSServerContext.kt
index 0e2a7f73381e32652b36fd8d78193a52d67c3b2a..4fd96336e93128430de4979396237438d9c3acf4 100644
--- a/kmqtt-broker/src/posixMain/kotlin/socket/tls/TLSServerContext.kt
+++ b/kmqtt-broker/src/posixMain/kotlin/io/github/davidepianca98/socket/tls/TLSServerContext.kt
@@ -1,4 +1,4 @@
-package socket.tls
+package io.github.davidepianca98.socket.tls
 
 internal expect class TLSServerContext(tlsSettings: TLSSettings) {
     fun close()
diff --git a/kmqtt-broker/src/posixMain/kotlin/socket/tls/TLSServerEngine.kt b/kmqtt-broker/src/posixMain/kotlin/io/github/davidepianca98/socket/tls/TLSServerEngine.kt
similarity index 93%
rename from kmqtt-broker/src/posixMain/kotlin/socket/tls/TLSServerEngine.kt
rename to kmqtt-broker/src/posixMain/kotlin/io/github/davidepianca98/socket/tls/TLSServerEngine.kt
index dee0771bd3fcaadd7ff67fa2d97a3894a1373ea4..3f1d3067c0ae91aded53a6a9a41ea3a713fd2407 100644
--- a/kmqtt-broker/src/posixMain/kotlin/socket/tls/TLSServerEngine.kt
+++ b/kmqtt-broker/src/posixMain/kotlin/io/github/davidepianca98/socket/tls/TLSServerEngine.kt
@@ -1,4 +1,4 @@
-package socket.tls
+package io.github.davidepianca98.socket.tls
 
 import kotlinx.cinterop.ByteVar
 import kotlinx.cinterop.CPointer
diff --git a/kmqtt-broker/src/posixMain/kotlin/socket/tls/TLSServerSocket.kt b/kmqtt-broker/src/posixMain/kotlin/io/github/davidepianca98/socket/tls/TLSServerSocket.kt
similarity index 76%
rename from kmqtt-broker/src/posixMain/kotlin/socket/tls/TLSServerSocket.kt
rename to kmqtt-broker/src/posixMain/kotlin/io/github/davidepianca98/socket/tls/TLSServerSocket.kt
index 7291574f17e922bd6e7ed1af754d290150a31762..bff7d0e28d28cf11904ce75efcf22ec731597408 100644
--- a/kmqtt-broker/src/posixMain/kotlin/socket/tls/TLSServerSocket.kt
+++ b/kmqtt-broker/src/posixMain/kotlin/io/github/davidepianca98/socket/tls/TLSServerSocket.kt
@@ -1,12 +1,12 @@
-package socket.tls
+package io.github.davidepianca98.socket.tls
 
-import close
-import mqtt.broker.Broker
-import mqtt.broker.ClientConnection
-import socket.IOException
-import socket.ServerSocket
-import socket.SocketState
-import socket.tcp.WebSocket
+import io.github.davidepianca98.close
+import io.github.davidepianca98.mqtt.broker.Broker
+import io.github.davidepianca98.mqtt.broker.ClientConnection
+import io.github.davidepianca98.socket.IOException
+import io.github.davidepianca98.socket.ServerSocket
+import io.github.davidepianca98.socket.SocketState
+import io.github.davidepianca98.socket.tcp.WebSocket
 
 internal actual class TLSServerSocket actual constructor(
     private val broker: Broker,
diff --git a/kmqtt-broker/src/posixMain/kotlin/socket/udp/UDPSocket.kt b/kmqtt-broker/src/posixMain/kotlin/io/github/davidepianca98/socket/udp/UDPSocket.kt
similarity index 80%
rename from kmqtt-broker/src/posixMain/kotlin/socket/udp/UDPSocket.kt
rename to kmqtt-broker/src/posixMain/kotlin/io/github/davidepianca98/socket/udp/UDPSocket.kt
index 6a75a8f8fece0cd08d1855e21316fc228cd895f3..a3eb9a920e6502aff92515a33da3f6a0a1cb672d 100644
--- a/kmqtt-broker/src/posixMain/kotlin/socket/udp/UDPSocket.kt
+++ b/kmqtt-broker/src/posixMain/kotlin/io/github/davidepianca98/socket/udp/UDPSocket.kt
@@ -1,23 +1,23 @@
-package socket.udp
+package io.github.davidepianca98.socket.udp
 
-import close
-import getEagain
-import getErrno
-import getEwouldblock
-import getPortFromSockaddrIn
-import inet_ntop
-import inet_pton
+import io.github.davidepianca98.close
+import io.github.davidepianca98.getEagain
+import io.github.davidepianca98.getErrno
+import io.github.davidepianca98.getEwouldblock
+import io.github.davidepianca98.inet_ntop
+import io.github.davidepianca98.inet_pton
+import io.github.davidepianca98.getPortFromSockaddrIn
 import kotlinx.cinterop.*
-import memset
+import io.github.davidepianca98.memset
 import platform.posix.AF_INET
 import platform.posix.sockaddr
 import platform.posix.sockaddr_in
-import recvfrom
-import sendto
-import sockaddrIn
-import socket.IOException
-import socket.SocketClosedException
-import socklen_tVar
+import io.github.davidepianca98.recvfrom
+import io.github.davidepianca98.sendto
+import io.github.davidepianca98.sockaddrIn
+import io.github.davidepianca98.socket.IOException
+import io.github.davidepianca98.socket.SocketClosedException
+import io.github.davidepianca98.socklen_tVar
 
 internal actual class UDPSocket(private val socket: Int) {
 
diff --git a/kmqtt-client/src/commonMain/kotlin/ClientSocket.kt b/kmqtt-client/src/commonMain/kotlin/io/github/davidepianca98/ClientSocket.kt
similarity index 69%
rename from kmqtt-client/src/commonMain/kotlin/ClientSocket.kt
rename to kmqtt-client/src/commonMain/kotlin/io/github/davidepianca98/ClientSocket.kt
index 46d4841b33f85f5cd0567e51409d1e73567e55c7..d242be1a8b169bde67fb9c76822de68e978b9d94 100644
--- a/kmqtt-client/src/commonMain/kotlin/ClientSocket.kt
+++ b/kmqtt-client/src/commonMain/kotlin/io/github/davidepianca98/ClientSocket.kt
@@ -1,4 +1,6 @@
-import socket.tcp.Socket
+package io.github.davidepianca98
+
+import io.github.davidepianca98.socket.tcp.Socket
 
 public expect class ClientSocket(
     address: String,
diff --git a/kmqtt-client/src/commonMain/kotlin/MQTTClient.kt b/kmqtt-client/src/commonMain/kotlin/io/github/davidepianca98/MQTTClient.kt
similarity index 86%
rename from kmqtt-client/src/commonMain/kotlin/MQTTClient.kt
rename to kmqtt-client/src/commonMain/kotlin/io/github/davidepianca98/MQTTClient.kt
index 218fd461c5347517aa8479bcd4678c88bd0fa670..6ec25e4d7f1d8cb7767d310ceeec755a20d38d8d 100644
--- a/kmqtt-client/src/commonMain/kotlin/MQTTClient.kt
+++ b/kmqtt-client/src/commonMain/kotlin/io/github/davidepianca98/MQTTClient.kt
@@ -1,3 +1,12 @@
+package io.github.davidepianca98
+
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTPubrel
+import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Pubrec
+import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Pubrel
+import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Unsubscribe
+import io.github.davidepianca98.mqtt.packets.mqttv4.SubackReturnCode
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Puback
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Subscribe
 import kotlinx.atomicfu.AtomicBoolean
 import kotlinx.atomicfu.atomic
 import kotlinx.atomicfu.locks.ReentrantLock
@@ -6,21 +15,51 @@ import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.launch
-import mqtt.MQTTCurrentPacket
-import mqtt.MQTTException
-import mqtt.MQTTVersion
-import mqtt.Subscription
-import mqtt.packets.ConnectFlags
-import mqtt.packets.MQTTPacket
-import mqtt.packets.Qos
-import mqtt.packets.mqtt.*
-import mqtt.packets.mqttv4.*
-import mqtt.packets.mqttv5.*
-import socket.IOException
-import socket.SocketClosedException
-import socket.SocketInterface
-import socket.streams.EOFException
-import socket.tls.TLSClientSettings
+import io.github.davidepianca98.mqtt.MQTTCurrentPacket
+import io.github.davidepianca98.mqtt.MQTTException
+import io.github.davidepianca98.mqtt.MQTTVersion
+import io.github.davidepianca98.mqtt.Subscription
+import io.github.davidepianca98.mqtt.packets.ConnectFlags
+import io.github.davidepianca98.mqtt.packets.MQTTPacket
+import io.github.davidepianca98.mqtt.packets.Qos
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTConnack
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTDisconnect
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTPingresp
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTPuback
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTPubcomp
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTPublish
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTPubrec
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTSuback
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTUnsuback
+import io.github.davidepianca98.mqtt.packets.mqttv4.ConnectReturnCode
+import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Connack
+import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Connect
+import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Disconnect
+import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Pingreq
+import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Puback
+import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Pubcomp
+import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Publish
+import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Suback
+import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Subscribe
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Auth
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Connack
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Connect
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Disconnect
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Pingreq
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Properties
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Pubcomp
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Publish
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Pubrec
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Pubrel
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Suback
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Unsuback
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Unsubscribe
+import io.github.davidepianca98.mqtt.packets.mqttv5.ReasonCode
+import io.github.davidepianca98.socket.IOException
+import io.github.davidepianca98.socket.SocketClosedException
+import io.github.davidepianca98.socket.SocketInterface
+import io.github.davidepianca98.socket.streams.EOFException
+import io.github.davidepianca98.socket.tls.TLSClientSettings
 
 /**
  * MQTT 3.1.1 and 5 client
@@ -164,7 +203,15 @@ public class MQTTClient(
         val connect = if (mqttVersion == MQTTVersion.MQTT3_1_1) {
             MQTT4Connect(
                 "MQTT",
-                ConnectFlags(userName != null, password != null, willRetain, willQos, willTopic != null, cleanStart, false),
+                ConnectFlags(
+                    userName != null,
+                    password != null,
+                    willRetain,
+                    willQos,
+                    willTopic != null,
+                    cleanStart,
+                    false
+                ),
                 keepAlive.value,
                 clientId ?: generateRandomClientId(),
                 willTopic,
@@ -175,7 +222,15 @@ public class MQTTClient(
         } else {
             MQTT5Connect(
                 "MQTT",
-                ConnectFlags(userName != null, password != null, willRetain, willQos, willTopic != null, cleanStart, false),
+                ConnectFlags(
+                    userName != null,
+                    password != null,
+                    willRetain,
+                    willQos,
+                    willTopic != null,
+                    cleanStart,
+                    false
+                ),
                 keepAlive.value,
                 clientId ?: generateRandomClientId(),
                 properties,
@@ -534,7 +589,8 @@ public class MQTTClient(
                     topicAliasesClient[correctPacket.properties.topicAlias!!] = correctPacket.topicName
                 } else if (correctPacket.topicName.isEmpty()) {
                     // Use alias
-                    val topicName = topicAliasesClient[correctPacket.properties.topicAlias!!] ?: throw MQTTException(ReasonCode.PROTOCOL_ERROR)
+                    val topicName = topicAliasesClient[correctPacket.properties.topicAlias!!] ?: throw MQTTException(
+                        ReasonCode.PROTOCOL_ERROR)
                     correctPacket = correctPacket.setTopicFromAlias(topicName)
                 }
             }
@@ -652,7 +708,13 @@ public class MQTTClient(
     private fun handleAuth(packet: MQTT5Auth) {
         if (packet.authenticateReasonCode == ReasonCode.CONTINUE_AUTHENTICATION) {
             val data = enhancedAuthCallback(packet.properties.authenticationData)
-            val auth = MQTT5Auth(ReasonCode.CONTINUE_AUTHENTICATION, MQTT5Properties(authenticationMethod = packet.properties.authenticationMethod, authenticationData = data))
+            val auth = MQTT5Auth(
+                ReasonCode.CONTINUE_AUTHENTICATION,
+                MQTT5Properties(
+                    authenticationMethod = packet.properties.authenticationMethod,
+                    authenticationData = data
+                )
+            )
             send(auth.toByteArray(), true)
         }
     }
diff --git a/kmqtt-client/src/commonMain/kotlin/TLSClientSocket.kt b/kmqtt-client/src/commonMain/kotlin/io/github/davidepianca98/TLSClientSocket.kt
similarity index 65%
rename from kmqtt-client/src/commonMain/kotlin/TLSClientSocket.kt
rename to kmqtt-client/src/commonMain/kotlin/io/github/davidepianca98/TLSClientSocket.kt
index 1964002269876138b74f55d4a6f7b0e0cfabde22..f7a20b43caae155d0200d624343b33d70fbe8792 100644
--- a/kmqtt-client/src/commonMain/kotlin/TLSClientSocket.kt
+++ b/kmqtt-client/src/commonMain/kotlin/io/github/davidepianca98/TLSClientSocket.kt
@@ -1,5 +1,7 @@
-import socket.tls.TLSClientSettings
-import socket.tls.TLSSocket
+package io.github.davidepianca98
+
+import io.github.davidepianca98.socket.tls.TLSClientSettings
+import io.github.davidepianca98.socket.tls.TLSSocket
 
 public expect class TLSClientSocket(
     address: String,
diff --git a/kmqtt-client/src/commonMain/kotlin/WebSocket.kt b/kmqtt-client/src/commonMain/kotlin/io/github/davidepianca98/WebSocket.kt
similarity index 95%
rename from kmqtt-client/src/commonMain/kotlin/WebSocket.kt
rename to kmqtt-client/src/commonMain/kotlin/io/github/davidepianca98/WebSocket.kt
index 9d599bd637988feccdfbc48dc2cdabd1b772c3ac..a81c6b1ec2530b827d7b21d3da736ccf25c4d7ba 100644
--- a/kmqtt-client/src/commonMain/kotlin/WebSocket.kt
+++ b/kmqtt-client/src/commonMain/kotlin/io/github/davidepianca98/WebSocket.kt
@@ -1,8 +1,10 @@
-import socket.IOException
-import socket.SocketInterface
-import socket.streams.ByteArrayOutputStream
-import socket.streams.DynamicByteBuffer
-import socket.streams.EOFException
+package io.github.davidepianca98
+
+import io.github.davidepianca98.socket.IOException
+import io.github.davidepianca98.socket.SocketInterface
+import io.github.davidepianca98.socket.streams.ByteArrayOutputStream
+import io.github.davidepianca98.socket.streams.DynamicByteBuffer
+import io.github.davidepianca98.socket.streams.EOFException
 import kotlin.random.Random
 
 public class WebSocket(private val socket: SocketInterface, host: String, path: String = "/mqtt") : SocketInterface {
diff --git a/kmqtt-client/src/iosArm64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt b/kmqtt-client/src/iosArm64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
new file mode 100644
index 0000000000000000000000000000000000000000..6a7fddc0f8df0ef7b503ac160160008318af81ec
--- /dev/null
+++ b/kmqtt-client/src/iosArm64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
@@ -0,0 +1,235 @@
+package io.github.davidepianca98
+
+import kotlinx.cinterop.ByteVar
+import kotlinx.cinterop.COpaquePointer
+import kotlinx.cinterop.CPointer
+import kotlinx.cinterop.pointed
+import kotlinx.cinterop.refTo
+import kotlinx.cinterop.reinterpret
+import kotlinx.cinterop.staticCFunction
+import kotlinx.cinterop.toKString
+import openssl.BIO_FLAGS_SHOULD_RETRY
+import openssl.BIO_free
+import openssl.BIO_new
+import openssl.BIO_puts
+import openssl.BIO_read
+import openssl.BIO_s_mem
+import openssl.BIO_test_flags
+import openssl.BIO_write
+import openssl.PEM_X509_INFO_read_bio
+import openssl.PEM_read_bio_PrivateKey
+import openssl.PEM_read_bio_X509
+import openssl.SSL_CTX_check_private_key
+import openssl.SSL_CTX_get_cert_store
+import openssl.SSL_CTX_load_verify_locations
+import openssl.SSL_CTX_new
+import openssl.SSL_CTX_set_cert_verify_callback
+import openssl.SSL_CTX_set_default_passwd_cb
+import openssl.SSL_CTX_set_default_passwd_cb_userdata
+import openssl.SSL_CTX_use_PrivateKey
+import openssl.SSL_CTX_use_PrivateKey_file
+import openssl.SSL_CTX_use_certificate
+import openssl.SSL_CTX_use_certificate_file
+import openssl.SSL_FILETYPE_PEM
+import openssl.SSL_VERIFY_PEER
+import openssl.SSL_free
+import openssl.SSL_get_error
+import openssl.SSL_is_init_finished
+import openssl.SSL_new
+import openssl.SSL_read
+import openssl.SSL_set_bio
+import openssl.SSL_set_connect_state
+import openssl.SSL_set_verify
+import openssl.SSL_write
+import openssl.TLS_client_method
+import openssl.X509_INFO_free
+import openssl.X509_STORE_add_cert
+import openssl.X509_get_default_cert_dir_env
+import openssl.sk_X509_INFO_num
+import openssl.sk_X509_INFO_pop_free
+import openssl.sk_X509_INFO_value
+import platform.posix.getenv
+import platform.posix.strcpy
+import platform.posix.strlen
+import io.github.davidepianca98.socket.IOException
+import io.github.davidepianca98.socket.tls.TLSClientSettings
+import io.github.davidepianca98.socket.tls.TLSEngine
+
+internal actual class TLSClientEngine actual constructor(tlsSettings: TLSClientSettings) : TLSEngine {
+
+    private val context: CPointer<SSL>
+    private val readBio: CPointer<BIO>
+    private val writeBio: CPointer<BIO>
+
+    fun loadServerCertsFromString(context: CPointer<SSL_CTX>, certBuffer: String): Boolean {
+        val bio = BIO_new(BIO_s_mem())
+        BIO_puts(bio, certBuffer)
+
+        val inf = PEM_X509_INFO_read_bio(bio, null, null, null)
+
+        if (inf == null) {
+            BIO_free(bio)
+            return false
+        }
+
+        val ctx = SSL_CTX_get_cert_store(context);
+
+        var loaded = 0
+        for (i in 0..<sk_X509_INFO_num(inf)) {
+            val itmp = sk_X509_INFO_value(inf, i)
+            if (itmp != null && itmp.pointed.x509 != null) {
+                if (X509_STORE_add_cert(ctx, itmp.pointed.x509) != 1) {
+                    sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
+                        X509_INFO_free(buf)
+                    })
+                    BIO_free(bio)
+                    return false
+                }
+                loaded++
+            }
+        }
+
+        sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
+            X509_INFO_free(buf)
+        })
+        BIO_free(bio)
+
+        return loaded > 0
+    }
+
+    init {
+        val readBio = BIO_new(BIO_s_mem()) ?: throw IOException("Failed allocating read BIO")
+
+        val writeBio = BIO_new(BIO_s_mem())
+        if (writeBio == null) {
+            BIO_free(readBio)
+            throw IOException("Failed allocating read BIO")
+        }
+
+        val method = TLS_client_method()
+        val sslContext = SSL_CTX_new(method)!!
+
+        if (tlsSettings.serverCertificate != null) {
+            if (!loadServerCertsFromString(sslContext, tlsSettings.serverCertificate!!)) {
+                // Try file
+                if (SSL_CTX_load_verify_locations(sslContext, tlsSettings.serverCertificate, null) != 1) {
+                    throw Exception("Server certificate path not found")
+                }
+            }
+        } else {
+            if (!tlsSettings.checkServerCertificate) {
+                SSL_CTX_set_cert_verify_callback(
+                    sslContext,
+                    staticCFunction { buf: CPointer<X509_STORE_CTX>?, arg: COpaquePointer? ->
+                        1
+                    },
+                    null
+                )
+            } else {
+                if (SSL_CTX_load_verify_locations(
+                        sslContext,
+                        null,
+                        getenv(X509_get_default_cert_dir_env()?.toKString())?.toKString()
+                    ) != 1) {
+                    throw Exception("Server certificate path not found")
+                }
+            }
+        }
+
+        if (tlsSettings.clientCertificate != null) {
+            val bio = BIO_new(BIO_s_mem())
+            BIO_puts(bio, tlsSettings.clientCertificate)
+            val certificate = PEM_read_bio_X509(bio, null, null, null)
+
+            if (certificate != null) {
+                if (SSL_CTX_use_certificate(sslContext, certificate) != 1) {
+                    throw Exception("Cannot load client's certificate")
+                }
+            } else {
+                // Load file
+                if (SSL_CTX_use_certificate_file(sslContext, tlsSettings.clientCertificate, SSL_FILETYPE_PEM) != 1) {
+                    throw Exception("Cannot load client's certificate file")
+                }
+            }
+
+            BIO_puts(bio, tlsSettings.clientCertificateKey)
+            val key = PEM_read_bio_PrivateKey(bio, null, null, null)
+            if (key != null) {
+                if (SSL_CTX_use_PrivateKey(sslContext, key) != 1) {
+                    throw Exception("Cannot load client's key")
+                }
+            } else {
+                if (SSL_CTX_use_PrivateKey_file(sslContext, tlsSettings.clientCertificateKey!!, SSL_FILETYPE_PEM) != 1) {
+                    throw Exception("Cannot load client's key file")
+                }
+            }
+            if (SSL_CTX_check_private_key(sslContext) != 1) {
+                throw Exception("Client's certificate and key don't match")
+            }
+
+            if (tlsSettings.clientCertificatePassword != null) {
+                SSL_CTX_set_default_passwd_cb_userdata(sslContext, tlsSettings.clientCertificatePassword!!.refTo(0))
+                SSL_CTX_set_default_passwd_cb(
+                    sslContext,
+                    staticCFunction { buf: CPointer<ByteVar>?, size: Int, _: Int, password: COpaquePointer? ->
+                        if (password == null) {
+                            0
+                        } else {
+                            val len = strlen(password.reinterpret<ByteVar>().toKString())
+                            if (size < len.toInt() + 1) {
+                                0
+                            } else {
+                                strcpy(buf, password.reinterpret<ByteVar>().toKString())
+                                len.toInt()
+                            }
+                        }
+                    })
+            }
+        }
+
+        val clientContext = SSL_new(sslContext)
+        if (clientContext == null) {
+            BIO_free(readBio)
+            BIO_free(writeBio)
+            throw IOException("Failed allocating read BIO")
+        }
+
+        SSL_set_verify(clientContext, SSL_VERIFY_PEER, null)
+
+        SSL_set_connect_state(clientContext)
+        SSL_set_bio(clientContext, readBio, writeBio)
+        context = clientContext
+        this.readBio = readBio
+        this.writeBio = writeBio
+    }
+
+    actual override val isInitFinished: Boolean
+        get() = SSL_is_init_finished(context) != 0
+
+    actual override val bioShouldRetry: Boolean
+        get() = BIO_test_flags(writeBio, BIO_FLAGS_SHOULD_RETRY) == 0
+
+    actual override fun write(buffer: CPointer<ByteVar>, length: Int): Int {
+        return SSL_write(context, buffer, length)
+    }
+
+    actual override fun read(buffer: CPointer<ByteVar>, length: Int): Int {
+        return SSL_read(context, buffer, length)
+    }
+
+    actual override fun bioRead(buffer: CPointer<ByteVar>, length: Int): Int {
+        return BIO_read(writeBio, buffer, length)
+    }
+
+    actual override fun bioWrite(buffer: CPointer<ByteVar>, length: Int): Int {
+        return BIO_write(readBio, buffer, length)
+    }
+
+    actual override fun getError(result: Int): Int {
+        return SSL_get_error(context, result)
+    }
+
+    actual override fun close() {
+        SSL_free(context)
+    }
+}
\ No newline at end of file
diff --git a/kmqtt-client/src/iosSimulatorArm64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt b/kmqtt-client/src/iosSimulatorArm64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
new file mode 100644
index 0000000000000000000000000000000000000000..6a7fddc0f8df0ef7b503ac160160008318af81ec
--- /dev/null
+++ b/kmqtt-client/src/iosSimulatorArm64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
@@ -0,0 +1,235 @@
+package io.github.davidepianca98
+
+import kotlinx.cinterop.ByteVar
+import kotlinx.cinterop.COpaquePointer
+import kotlinx.cinterop.CPointer
+import kotlinx.cinterop.pointed
+import kotlinx.cinterop.refTo
+import kotlinx.cinterop.reinterpret
+import kotlinx.cinterop.staticCFunction
+import kotlinx.cinterop.toKString
+import openssl.BIO_FLAGS_SHOULD_RETRY
+import openssl.BIO_free
+import openssl.BIO_new
+import openssl.BIO_puts
+import openssl.BIO_read
+import openssl.BIO_s_mem
+import openssl.BIO_test_flags
+import openssl.BIO_write
+import openssl.PEM_X509_INFO_read_bio
+import openssl.PEM_read_bio_PrivateKey
+import openssl.PEM_read_bio_X509
+import openssl.SSL_CTX_check_private_key
+import openssl.SSL_CTX_get_cert_store
+import openssl.SSL_CTX_load_verify_locations
+import openssl.SSL_CTX_new
+import openssl.SSL_CTX_set_cert_verify_callback
+import openssl.SSL_CTX_set_default_passwd_cb
+import openssl.SSL_CTX_set_default_passwd_cb_userdata
+import openssl.SSL_CTX_use_PrivateKey
+import openssl.SSL_CTX_use_PrivateKey_file
+import openssl.SSL_CTX_use_certificate
+import openssl.SSL_CTX_use_certificate_file
+import openssl.SSL_FILETYPE_PEM
+import openssl.SSL_VERIFY_PEER
+import openssl.SSL_free
+import openssl.SSL_get_error
+import openssl.SSL_is_init_finished
+import openssl.SSL_new
+import openssl.SSL_read
+import openssl.SSL_set_bio
+import openssl.SSL_set_connect_state
+import openssl.SSL_set_verify
+import openssl.SSL_write
+import openssl.TLS_client_method
+import openssl.X509_INFO_free
+import openssl.X509_STORE_add_cert
+import openssl.X509_get_default_cert_dir_env
+import openssl.sk_X509_INFO_num
+import openssl.sk_X509_INFO_pop_free
+import openssl.sk_X509_INFO_value
+import platform.posix.getenv
+import platform.posix.strcpy
+import platform.posix.strlen
+import io.github.davidepianca98.socket.IOException
+import io.github.davidepianca98.socket.tls.TLSClientSettings
+import io.github.davidepianca98.socket.tls.TLSEngine
+
+internal actual class TLSClientEngine actual constructor(tlsSettings: TLSClientSettings) : TLSEngine {
+
+    private val context: CPointer<SSL>
+    private val readBio: CPointer<BIO>
+    private val writeBio: CPointer<BIO>
+
+    fun loadServerCertsFromString(context: CPointer<SSL_CTX>, certBuffer: String): Boolean {
+        val bio = BIO_new(BIO_s_mem())
+        BIO_puts(bio, certBuffer)
+
+        val inf = PEM_X509_INFO_read_bio(bio, null, null, null)
+
+        if (inf == null) {
+            BIO_free(bio)
+            return false
+        }
+
+        val ctx = SSL_CTX_get_cert_store(context);
+
+        var loaded = 0
+        for (i in 0..<sk_X509_INFO_num(inf)) {
+            val itmp = sk_X509_INFO_value(inf, i)
+            if (itmp != null && itmp.pointed.x509 != null) {
+                if (X509_STORE_add_cert(ctx, itmp.pointed.x509) != 1) {
+                    sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
+                        X509_INFO_free(buf)
+                    })
+                    BIO_free(bio)
+                    return false
+                }
+                loaded++
+            }
+        }
+
+        sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
+            X509_INFO_free(buf)
+        })
+        BIO_free(bio)
+
+        return loaded > 0
+    }
+
+    init {
+        val readBio = BIO_new(BIO_s_mem()) ?: throw IOException("Failed allocating read BIO")
+
+        val writeBio = BIO_new(BIO_s_mem())
+        if (writeBio == null) {
+            BIO_free(readBio)
+            throw IOException("Failed allocating read BIO")
+        }
+
+        val method = TLS_client_method()
+        val sslContext = SSL_CTX_new(method)!!
+
+        if (tlsSettings.serverCertificate != null) {
+            if (!loadServerCertsFromString(sslContext, tlsSettings.serverCertificate!!)) {
+                // Try file
+                if (SSL_CTX_load_verify_locations(sslContext, tlsSettings.serverCertificate, null) != 1) {
+                    throw Exception("Server certificate path not found")
+                }
+            }
+        } else {
+            if (!tlsSettings.checkServerCertificate) {
+                SSL_CTX_set_cert_verify_callback(
+                    sslContext,
+                    staticCFunction { buf: CPointer<X509_STORE_CTX>?, arg: COpaquePointer? ->
+                        1
+                    },
+                    null
+                )
+            } else {
+                if (SSL_CTX_load_verify_locations(
+                        sslContext,
+                        null,
+                        getenv(X509_get_default_cert_dir_env()?.toKString())?.toKString()
+                    ) != 1) {
+                    throw Exception("Server certificate path not found")
+                }
+            }
+        }
+
+        if (tlsSettings.clientCertificate != null) {
+            val bio = BIO_new(BIO_s_mem())
+            BIO_puts(bio, tlsSettings.clientCertificate)
+            val certificate = PEM_read_bio_X509(bio, null, null, null)
+
+            if (certificate != null) {
+                if (SSL_CTX_use_certificate(sslContext, certificate) != 1) {
+                    throw Exception("Cannot load client's certificate")
+                }
+            } else {
+                // Load file
+                if (SSL_CTX_use_certificate_file(sslContext, tlsSettings.clientCertificate, SSL_FILETYPE_PEM) != 1) {
+                    throw Exception("Cannot load client's certificate file")
+                }
+            }
+
+            BIO_puts(bio, tlsSettings.clientCertificateKey)
+            val key = PEM_read_bio_PrivateKey(bio, null, null, null)
+            if (key != null) {
+                if (SSL_CTX_use_PrivateKey(sslContext, key) != 1) {
+                    throw Exception("Cannot load client's key")
+                }
+            } else {
+                if (SSL_CTX_use_PrivateKey_file(sslContext, tlsSettings.clientCertificateKey!!, SSL_FILETYPE_PEM) != 1) {
+                    throw Exception("Cannot load client's key file")
+                }
+            }
+            if (SSL_CTX_check_private_key(sslContext) != 1) {
+                throw Exception("Client's certificate and key don't match")
+            }
+
+            if (tlsSettings.clientCertificatePassword != null) {
+                SSL_CTX_set_default_passwd_cb_userdata(sslContext, tlsSettings.clientCertificatePassword!!.refTo(0))
+                SSL_CTX_set_default_passwd_cb(
+                    sslContext,
+                    staticCFunction { buf: CPointer<ByteVar>?, size: Int, _: Int, password: COpaquePointer? ->
+                        if (password == null) {
+                            0
+                        } else {
+                            val len = strlen(password.reinterpret<ByteVar>().toKString())
+                            if (size < len.toInt() + 1) {
+                                0
+                            } else {
+                                strcpy(buf, password.reinterpret<ByteVar>().toKString())
+                                len.toInt()
+                            }
+                        }
+                    })
+            }
+        }
+
+        val clientContext = SSL_new(sslContext)
+        if (clientContext == null) {
+            BIO_free(readBio)
+            BIO_free(writeBio)
+            throw IOException("Failed allocating read BIO")
+        }
+
+        SSL_set_verify(clientContext, SSL_VERIFY_PEER, null)
+
+        SSL_set_connect_state(clientContext)
+        SSL_set_bio(clientContext, readBio, writeBio)
+        context = clientContext
+        this.readBio = readBio
+        this.writeBio = writeBio
+    }
+
+    actual override val isInitFinished: Boolean
+        get() = SSL_is_init_finished(context) != 0
+
+    actual override val bioShouldRetry: Boolean
+        get() = BIO_test_flags(writeBio, BIO_FLAGS_SHOULD_RETRY) == 0
+
+    actual override fun write(buffer: CPointer<ByteVar>, length: Int): Int {
+        return SSL_write(context, buffer, length)
+    }
+
+    actual override fun read(buffer: CPointer<ByteVar>, length: Int): Int {
+        return SSL_read(context, buffer, length)
+    }
+
+    actual override fun bioRead(buffer: CPointer<ByteVar>, length: Int): Int {
+        return BIO_read(writeBio, buffer, length)
+    }
+
+    actual override fun bioWrite(buffer: CPointer<ByteVar>, length: Int): Int {
+        return BIO_write(readBio, buffer, length)
+    }
+
+    actual override fun getError(result: Int): Int {
+        return SSL_get_error(context, result)
+    }
+
+    actual override fun close() {
+        SSL_free(context)
+    }
+}
\ No newline at end of file
diff --git a/kmqtt-client/src/iosArm64Main/kotlin/TLSClientEngine.kt b/kmqtt-client/src/iosX64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
similarity index 97%
rename from kmqtt-client/src/iosArm64Main/kotlin/TLSClientEngine.kt
rename to kmqtt-client/src/iosX64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
index b180dea3fb966b42a150ca3e66decb194b6cd0f3..35214674fc3ee31084da917a860a564c37d85155 100644
--- a/kmqtt-client/src/iosArm64Main/kotlin/TLSClientEngine.kt
+++ b/kmqtt-client/src/iosX64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
@@ -1,11 +1,13 @@
+package io.github.davidepianca98
+
 import kotlinx.cinterop.*
 import openssl.*
 import platform.posix.getenv
 import platform.posix.strcpy
 import platform.posix.strlen
-import socket.IOException
-import socket.tls.TLSClientSettings
-import socket.tls.TLSEngine
+import io.github.davidepianca98.socket.IOException
+import io.github.davidepianca98.socket.tls.TLSClientSettings
+import io.github.davidepianca98.socket.tls.TLSEngine
 
 internal actual class TLSClientEngine actual constructor(tlsSettings: TLSClientSettings) : TLSEngine {
 
diff --git a/kmqtt-client/src/jsMain/kotlin/ClientSocket.kt b/kmqtt-client/src/jsMain/kotlin/io/github/davidepianca98/ClientSocket.kt
similarity index 88%
rename from kmqtt-client/src/jsMain/kotlin/ClientSocket.kt
rename to kmqtt-client/src/jsMain/kotlin/io/github/davidepianca98/ClientSocket.kt
index 86c85219f6875fc486eea0a0d21d3266e232b6ba..df89e3fa43a15ad83208d8f9887a11e7ffee79c3 100644
--- a/kmqtt-client/src/jsMain/kotlin/ClientSocket.kt
+++ b/kmqtt-client/src/jsMain/kotlin/io/github/davidepianca98/ClientSocket.kt
@@ -1,5 +1,7 @@
-import socket.IOException
-import socket.tcp.Socket
+package io.github.davidepianca98
+
+import io.github.davidepianca98.socket.IOException
+import io.github.davidepianca98.socket.tcp.Socket
 import web.timers.setTimeout
 
 public actual class ClientSocket actual constructor(
diff --git a/kmqtt-client/src/jsMain/kotlin/TLSClientSocket.kt b/kmqtt-client/src/jsMain/kotlin/io/github/davidepianca98/TLSClientSocket.kt
similarity index 75%
rename from kmqtt-client/src/jsMain/kotlin/TLSClientSocket.kt
rename to kmqtt-client/src/jsMain/kotlin/io/github/davidepianca98/TLSClientSocket.kt
index a72f4916a50a220c63b31fd478bf9d38bf6d4b2a..4cfa354d0a747f26411f1839c4e942e1543fd13d 100644
--- a/kmqtt-client/src/jsMain/kotlin/TLSClientSocket.kt
+++ b/kmqtt-client/src/jsMain/kotlin/io/github/davidepianca98/TLSClientSocket.kt
@@ -1,9 +1,12 @@
+package io.github.davidepianca98
+
 import node.fs.ReadFileSyncBufferOptions
-import socket.IOException
-import socket.tls.ConnectionOptions
-import socket.tls.TLSClientSettings
-import socket.tls.TLSSocket
-import socket.tls.connect
+import io.github.davidepianca98.socket.IOException
+import io.github.davidepianca98.socket.tls.ConnectionOptions
+import io.github.davidepianca98.socket.tls.TLSClientSettings
+import io.github.davidepianca98.socket.tls.TLSSocket
+import io.github.davidepianca98.socket.tls.connect
+import node.fs.readFileSync
 import web.timers.setTimeout
 
 private fun TlsConnectionOptions(): ConnectionOptions = js("{ checkServerIdentity: function (host, cert) { return undefined; }}") as ConnectionOptions
@@ -23,7 +26,7 @@ public actual class TLSClientSocket actual constructor(
             tlsSettings.serverCertificate?.encodeToByteArray()?.toUByteArray()?.toBuffer()
         } else {
             // Try to load file
-            tlsSettings.serverCertificate?.run { node.fs.readFileSync(this, ReadFileOptions()) } ?: throw IOException("Couldn't load server certificate")
+            tlsSettings.serverCertificate?.run { readFileSync(this, ReadFileOptions()) } ?: throw IOException("Couldn't load server certificate")
         }
     }
     if (tlsSettings.clientCertificate != null) {
@@ -31,7 +34,7 @@ public actual class TLSClientSocket actual constructor(
             tlsSettings.clientCertificate?.encodeToByteArray()?.toUByteArray()?.toBuffer()
         } else {
             // Try to load file
-            tlsSettings.clientCertificate?.run { node.fs.readFileSync(this, ReadFileOptions()) } ?: throw IOException("Couldn't load client certificate")
+            tlsSettings.clientCertificate?.run { readFileSync(this, ReadFileOptions()) } ?: throw IOException("Couldn't load client certificate")
         }
     }
     if (tlsSettings.clientCertificateKey != null) {
@@ -39,7 +42,7 @@ public actual class TLSClientSocket actual constructor(
             tlsSettings.clientCertificateKey?.encodeToByteArray()?.toUByteArray()?.toBuffer()
         } else {
             // Try to load file
-            tlsSettings.clientCertificateKey?.run { node.fs.readFileSync(this, ReadFileOptions()) } ?: throw IOException("Couldn't load client certificate key")
+            tlsSettings.clientCertificateKey?.run { readFileSync(this, ReadFileOptions()) } ?: throw IOException("Couldn't load client certificate key")
         }
     }
 
diff --git a/kmqtt-client/src/jvmMain/kotlin/ClientSocket.kt b/kmqtt-client/src/jvmMain/kotlin/io/github/davidepianca98/ClientSocket.kt
similarity index 92%
rename from kmqtt-client/src/jvmMain/kotlin/ClientSocket.kt
rename to kmqtt-client/src/jvmMain/kotlin/io/github/davidepianca98/ClientSocket.kt
index 6aaf823edc9e99ac30c7c56dcd8f04b816938315..881b0283d2b703388cc413299d16f760edb16e9b 100644
--- a/kmqtt-client/src/jvmMain/kotlin/ClientSocket.kt
+++ b/kmqtt-client/src/jvmMain/kotlin/io/github/davidepianca98/ClientSocket.kt
@@ -1,4 +1,6 @@
-import socket.tcp.Socket
+package io.github.davidepianca98
+
+import io.github.davidepianca98.socket.tcp.Socket
 import java.net.InetSocketAddress
 import java.nio.ByteBuffer
 import java.nio.channels.SelectionKey
diff --git a/kmqtt-client/src/jvmMain/kotlin/TLSClientSocket.kt b/kmqtt-client/src/jvmMain/kotlin/io/github/davidepianca98/TLSClientSocket.kt
similarity index 97%
rename from kmqtt-client/src/jvmMain/kotlin/TLSClientSocket.kt
rename to kmqtt-client/src/jvmMain/kotlin/io/github/davidepianca98/TLSClientSocket.kt
index d01d03d63cac1e2c2bf76fe6fb11a301c4636f74..49b53f0b206d12cf9b03d27ec5942b23167c9cd8 100644
--- a/kmqtt-client/src/jvmMain/kotlin/TLSClientSocket.kt
+++ b/kmqtt-client/src/jvmMain/kotlin/io/github/davidepianca98/TLSClientSocket.kt
@@ -1,5 +1,7 @@
-import socket.tls.TLSClientSettings
-import socket.tls.TLSSocket
+package io.github.davidepianca98
+
+import io.github.davidepianca98.socket.tls.TLSClientSettings
+import io.github.davidepianca98.socket.tls.TLSSocket
 import java.io.FileInputStream
 import java.net.InetSocketAddress
 import java.nio.ByteBuffer
diff --git a/kmqtt-client/src/linuxArm64Main/kotlin/TLSClientEngine.kt b/kmqtt-client/src/linuxArm64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
similarity index 97%
rename from kmqtt-client/src/linuxArm64Main/kotlin/TLSClientEngine.kt
rename to kmqtt-client/src/linuxArm64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
index b180dea3fb966b42a150ca3e66decb194b6cd0f3..35214674fc3ee31084da917a860a564c37d85155 100644
--- a/kmqtt-client/src/linuxArm64Main/kotlin/TLSClientEngine.kt
+++ b/kmqtt-client/src/linuxArm64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
@@ -1,11 +1,13 @@
+package io.github.davidepianca98
+
 import kotlinx.cinterop.*
 import openssl.*
 import platform.posix.getenv
 import platform.posix.strcpy
 import platform.posix.strlen
-import socket.IOException
-import socket.tls.TLSClientSettings
-import socket.tls.TLSEngine
+import io.github.davidepianca98.socket.IOException
+import io.github.davidepianca98.socket.tls.TLSClientSettings
+import io.github.davidepianca98.socket.tls.TLSEngine
 
 internal actual class TLSClientEngine actual constructor(tlsSettings: TLSClientSettings) : TLSEngine {
 
diff --git a/kmqtt-client/src/linuxX64Main/kotlin/TLSClientEngine.kt b/kmqtt-client/src/linuxX64Main/kotlin/TLSClientEngine.kt
deleted file mode 100644
index b180dea3fb966b42a150ca3e66decb194b6cd0f3..0000000000000000000000000000000000000000
--- a/kmqtt-client/src/linuxX64Main/kotlin/TLSClientEngine.kt
+++ /dev/null
@@ -1,183 +0,0 @@
-import kotlinx.cinterop.*
-import openssl.*
-import platform.posix.getenv
-import platform.posix.strcpy
-import platform.posix.strlen
-import socket.IOException
-import socket.tls.TLSClientSettings
-import socket.tls.TLSEngine
-
-internal actual class TLSClientEngine actual constructor(tlsSettings: TLSClientSettings) : TLSEngine {
-
-    private val context: CPointer<SSL>
-    private val readBio: CPointer<BIO>
-    private val writeBio: CPointer<BIO>
-
-    fun loadServerCertsFromString(context: CPointer<SSL_CTX>, certBuffer: String): Boolean {
-        val bio = BIO_new(BIO_s_mem())
-        BIO_puts(bio, certBuffer)
-
-        val inf = PEM_X509_INFO_read_bio(bio, null, null, null)
-
-        if (inf == null) {
-            BIO_free(bio)
-            return false
-        }
-
-        val ctx = SSL_CTX_get_cert_store(context);
-
-        var loaded = 0
-        for (i in 0..<sk_X509_INFO_num(inf)) {
-            val itmp = sk_X509_INFO_value(inf, i)
-            if (itmp != null && itmp.pointed.x509 != null) {
-                if (X509_STORE_add_cert(ctx, itmp.pointed.x509) != 1) {
-                    sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
-                        X509_INFO_free(buf)
-                    })
-                    BIO_free(bio)
-                    return false
-                }
-                loaded++
-            }
-        }
-
-        sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
-            X509_INFO_free(buf)
-        })
-        BIO_free(bio)
-
-        return loaded > 0
-    }
-
-    init {
-        val readBio = BIO_new(BIO_s_mem()) ?: throw IOException("Failed allocating read BIO")
-
-        val writeBio = BIO_new(BIO_s_mem())
-        if (writeBio == null) {
-            BIO_free(readBio)
-            throw IOException("Failed allocating read BIO")
-        }
-
-        val method = TLS_client_method()
-        val sslContext = SSL_CTX_new(method)!!
-
-        if (tlsSettings.serverCertificate != null) {
-            if (!loadServerCertsFromString(sslContext, tlsSettings.serverCertificate!!)) {
-                // Try file
-                if (SSL_CTX_load_verify_locations(sslContext, tlsSettings.serverCertificate, null) != 1) {
-                    throw Exception("Server certificate path not found")
-                }
-            }
-        } else {
-            if (!tlsSettings.checkServerCertificate) {
-                SSL_CTX_set_cert_verify_callback(
-                    sslContext,
-                    staticCFunction { buf: CPointer<X509_STORE_CTX>?, arg: COpaquePointer? ->
-                        1
-                    },
-                    null
-                )
-            } else {
-                if (SSL_CTX_load_verify_locations(sslContext, null, getenv(X509_get_default_cert_dir_env()?.toKString())?.toKString()) != 1) {
-                    throw Exception("Server certificate path not found")
-                }
-            }
-        }
-
-        if (tlsSettings.clientCertificate != null) {
-            val bio = BIO_new(BIO_s_mem())
-            BIO_puts(bio, tlsSettings.clientCertificate)
-            val certificate = PEM_read_bio_X509(bio, null, null, null)
-
-            if (certificate != null) {
-                if (SSL_CTX_use_certificate(sslContext, certificate) != 1) {
-                    throw Exception("Cannot load client's certificate")
-                }
-            } else {
-                // Load file
-                if (SSL_CTX_use_certificate_file(sslContext, tlsSettings.clientCertificate, SSL_FILETYPE_PEM) != 1) {
-                    throw Exception("Cannot load client's certificate file")
-                }
-            }
-
-            BIO_puts(bio, tlsSettings.clientCertificateKey)
-            val key = PEM_read_bio_PrivateKey(bio, null, null, null)
-            if (key != null) {
-                if (SSL_CTX_use_PrivateKey(sslContext, key) != 1) {
-                    throw Exception("Cannot load client's key")
-                }
-            } else {
-                if (SSL_CTX_use_PrivateKey_file(sslContext, tlsSettings.clientCertificateKey!!, SSL_FILETYPE_PEM) != 1) {
-                    throw Exception("Cannot load client's key file")
-                }
-            }
-            if (SSL_CTX_check_private_key(sslContext) != 1) {
-                throw Exception("Client's certificate and key don't match")
-            }
-
-            if (tlsSettings.clientCertificatePassword != null) {
-                SSL_CTX_set_default_passwd_cb_userdata(sslContext, tlsSettings.clientCertificatePassword!!.refTo(0))
-                SSL_CTX_set_default_passwd_cb(
-                    sslContext,
-                    staticCFunction { buf: CPointer<ByteVar>?, size: Int, _: Int, password: COpaquePointer? ->
-                        if (password == null) {
-                            0
-                        } else {
-                            val len = strlen(password.reinterpret<ByteVar>().toKString())
-                            if (size < len.toInt() + 1) {
-                                0
-                            } else {
-                                strcpy(buf, password.reinterpret<ByteVar>().toKString())
-                                len.toInt()
-                            }
-                        }
-                    })
-            }
-        }
-
-        val clientContext = SSL_new(sslContext)
-        if (clientContext == null) {
-            BIO_free(readBio)
-            BIO_free(writeBio)
-            throw IOException("Failed allocating read BIO")
-        }
-
-        SSL_set_verify(clientContext, SSL_VERIFY_PEER, null)
-
-        SSL_set_connect_state(clientContext)
-        SSL_set_bio(clientContext, readBio, writeBio)
-        context = clientContext
-        this.readBio = readBio
-        this.writeBio = writeBio
-    }
-
-    actual override val isInitFinished: Boolean
-        get() = SSL_is_init_finished(context) != 0
-
-    actual override val bioShouldRetry: Boolean
-        get() = BIO_test_flags(writeBio, BIO_FLAGS_SHOULD_RETRY) == 0
-
-    actual override fun write(buffer: CPointer<ByteVar>, length: Int): Int {
-        return SSL_write(context, buffer, length)
-    }
-
-    actual override fun read(buffer: CPointer<ByteVar>, length: Int): Int {
-        return SSL_read(context, buffer, length)
-    }
-
-    actual override fun bioRead(buffer: CPointer<ByteVar>, length: Int): Int {
-        return BIO_read(writeBio, buffer, length)
-    }
-
-    actual override fun bioWrite(buffer: CPointer<ByteVar>, length: Int): Int {
-        return BIO_write(readBio, buffer, length)
-    }
-
-    actual override fun getError(result: Int): Int {
-        return SSL_get_error(context, result)
-    }
-
-    actual override fun close() {
-        SSL_free(context)
-    }
-}
diff --git a/kmqtt-client/src/iosSimulatorArm64Main/kotlin/TLSClientEngine.kt b/kmqtt-client/src/linuxX64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
similarity index 97%
rename from kmqtt-client/src/iosSimulatorArm64Main/kotlin/TLSClientEngine.kt
rename to kmqtt-client/src/linuxX64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
index b180dea3fb966b42a150ca3e66decb194b6cd0f3..35214674fc3ee31084da917a860a564c37d85155 100644
--- a/kmqtt-client/src/iosSimulatorArm64Main/kotlin/TLSClientEngine.kt
+++ b/kmqtt-client/src/linuxX64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
@@ -1,11 +1,13 @@
+package io.github.davidepianca98
+
 import kotlinx.cinterop.*
 import openssl.*
 import platform.posix.getenv
 import platform.posix.strcpy
 import platform.posix.strlen
-import socket.IOException
-import socket.tls.TLSClientSettings
-import socket.tls.TLSEngine
+import io.github.davidepianca98.socket.IOException
+import io.github.davidepianca98.socket.tls.TLSClientSettings
+import io.github.davidepianca98.socket.tls.TLSEngine
 
 internal actual class TLSClientEngine actual constructor(tlsSettings: TLSClientSettings) : TLSEngine {
 
diff --git a/kmqtt-client/src/macosArm64Main/kotlin/TLSClientEngine.kt b/kmqtt-client/src/macosArm64Main/kotlin/TLSClientEngine.kt
deleted file mode 100644
index b180dea3fb966b42a150ca3e66decb194b6cd0f3..0000000000000000000000000000000000000000
--- a/kmqtt-client/src/macosArm64Main/kotlin/TLSClientEngine.kt
+++ /dev/null
@@ -1,183 +0,0 @@
-import kotlinx.cinterop.*
-import openssl.*
-import platform.posix.getenv
-import platform.posix.strcpy
-import platform.posix.strlen
-import socket.IOException
-import socket.tls.TLSClientSettings
-import socket.tls.TLSEngine
-
-internal actual class TLSClientEngine actual constructor(tlsSettings: TLSClientSettings) : TLSEngine {
-
-    private val context: CPointer<SSL>
-    private val readBio: CPointer<BIO>
-    private val writeBio: CPointer<BIO>
-
-    fun loadServerCertsFromString(context: CPointer<SSL_CTX>, certBuffer: String): Boolean {
-        val bio = BIO_new(BIO_s_mem())
-        BIO_puts(bio, certBuffer)
-
-        val inf = PEM_X509_INFO_read_bio(bio, null, null, null)
-
-        if (inf == null) {
-            BIO_free(bio)
-            return false
-        }
-
-        val ctx = SSL_CTX_get_cert_store(context);
-
-        var loaded = 0
-        for (i in 0..<sk_X509_INFO_num(inf)) {
-            val itmp = sk_X509_INFO_value(inf, i)
-            if (itmp != null && itmp.pointed.x509 != null) {
-                if (X509_STORE_add_cert(ctx, itmp.pointed.x509) != 1) {
-                    sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
-                        X509_INFO_free(buf)
-                    })
-                    BIO_free(bio)
-                    return false
-                }
-                loaded++
-            }
-        }
-
-        sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
-            X509_INFO_free(buf)
-        })
-        BIO_free(bio)
-
-        return loaded > 0
-    }
-
-    init {
-        val readBio = BIO_new(BIO_s_mem()) ?: throw IOException("Failed allocating read BIO")
-
-        val writeBio = BIO_new(BIO_s_mem())
-        if (writeBio == null) {
-            BIO_free(readBio)
-            throw IOException("Failed allocating read BIO")
-        }
-
-        val method = TLS_client_method()
-        val sslContext = SSL_CTX_new(method)!!
-
-        if (tlsSettings.serverCertificate != null) {
-            if (!loadServerCertsFromString(sslContext, tlsSettings.serverCertificate!!)) {
-                // Try file
-                if (SSL_CTX_load_verify_locations(sslContext, tlsSettings.serverCertificate, null) != 1) {
-                    throw Exception("Server certificate path not found")
-                }
-            }
-        } else {
-            if (!tlsSettings.checkServerCertificate) {
-                SSL_CTX_set_cert_verify_callback(
-                    sslContext,
-                    staticCFunction { buf: CPointer<X509_STORE_CTX>?, arg: COpaquePointer? ->
-                        1
-                    },
-                    null
-                )
-            } else {
-                if (SSL_CTX_load_verify_locations(sslContext, null, getenv(X509_get_default_cert_dir_env()?.toKString())?.toKString()) != 1) {
-                    throw Exception("Server certificate path not found")
-                }
-            }
-        }
-
-        if (tlsSettings.clientCertificate != null) {
-            val bio = BIO_new(BIO_s_mem())
-            BIO_puts(bio, tlsSettings.clientCertificate)
-            val certificate = PEM_read_bio_X509(bio, null, null, null)
-
-            if (certificate != null) {
-                if (SSL_CTX_use_certificate(sslContext, certificate) != 1) {
-                    throw Exception("Cannot load client's certificate")
-                }
-            } else {
-                // Load file
-                if (SSL_CTX_use_certificate_file(sslContext, tlsSettings.clientCertificate, SSL_FILETYPE_PEM) != 1) {
-                    throw Exception("Cannot load client's certificate file")
-                }
-            }
-
-            BIO_puts(bio, tlsSettings.clientCertificateKey)
-            val key = PEM_read_bio_PrivateKey(bio, null, null, null)
-            if (key != null) {
-                if (SSL_CTX_use_PrivateKey(sslContext, key) != 1) {
-                    throw Exception("Cannot load client's key")
-                }
-            } else {
-                if (SSL_CTX_use_PrivateKey_file(sslContext, tlsSettings.clientCertificateKey!!, SSL_FILETYPE_PEM) != 1) {
-                    throw Exception("Cannot load client's key file")
-                }
-            }
-            if (SSL_CTX_check_private_key(sslContext) != 1) {
-                throw Exception("Client's certificate and key don't match")
-            }
-
-            if (tlsSettings.clientCertificatePassword != null) {
-                SSL_CTX_set_default_passwd_cb_userdata(sslContext, tlsSettings.clientCertificatePassword!!.refTo(0))
-                SSL_CTX_set_default_passwd_cb(
-                    sslContext,
-                    staticCFunction { buf: CPointer<ByteVar>?, size: Int, _: Int, password: COpaquePointer? ->
-                        if (password == null) {
-                            0
-                        } else {
-                            val len = strlen(password.reinterpret<ByteVar>().toKString())
-                            if (size < len.toInt() + 1) {
-                                0
-                            } else {
-                                strcpy(buf, password.reinterpret<ByteVar>().toKString())
-                                len.toInt()
-                            }
-                        }
-                    })
-            }
-        }
-
-        val clientContext = SSL_new(sslContext)
-        if (clientContext == null) {
-            BIO_free(readBio)
-            BIO_free(writeBio)
-            throw IOException("Failed allocating read BIO")
-        }
-
-        SSL_set_verify(clientContext, SSL_VERIFY_PEER, null)
-
-        SSL_set_connect_state(clientContext)
-        SSL_set_bio(clientContext, readBio, writeBio)
-        context = clientContext
-        this.readBio = readBio
-        this.writeBio = writeBio
-    }
-
-    actual override val isInitFinished: Boolean
-        get() = SSL_is_init_finished(context) != 0
-
-    actual override val bioShouldRetry: Boolean
-        get() = BIO_test_flags(writeBio, BIO_FLAGS_SHOULD_RETRY) == 0
-
-    actual override fun write(buffer: CPointer<ByteVar>, length: Int): Int {
-        return SSL_write(context, buffer, length)
-    }
-
-    actual override fun read(buffer: CPointer<ByteVar>, length: Int): Int {
-        return SSL_read(context, buffer, length)
-    }
-
-    actual override fun bioRead(buffer: CPointer<ByteVar>, length: Int): Int {
-        return BIO_read(writeBio, buffer, length)
-    }
-
-    actual override fun bioWrite(buffer: CPointer<ByteVar>, length: Int): Int {
-        return BIO_write(readBio, buffer, length)
-    }
-
-    actual override fun getError(result: Int): Int {
-        return SSL_get_error(context, result)
-    }
-
-    actual override fun close() {
-        SSL_free(context)
-    }
-}
diff --git a/kmqtt-client/src/iosX64Main/kotlin/TLSClientEngine.kt b/kmqtt-client/src/macosArm64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
similarity index 97%
rename from kmqtt-client/src/iosX64Main/kotlin/TLSClientEngine.kt
rename to kmqtt-client/src/macosArm64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
index b180dea3fb966b42a150ca3e66decb194b6cd0f3..35214674fc3ee31084da917a860a564c37d85155 100644
--- a/kmqtt-client/src/iosX64Main/kotlin/TLSClientEngine.kt
+++ b/kmqtt-client/src/macosArm64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
@@ -1,11 +1,13 @@
+package io.github.davidepianca98
+
 import kotlinx.cinterop.*
 import openssl.*
 import platform.posix.getenv
 import platform.posix.strcpy
 import platform.posix.strlen
-import socket.IOException
-import socket.tls.TLSClientSettings
-import socket.tls.TLSEngine
+import io.github.davidepianca98.socket.IOException
+import io.github.davidepianca98.socket.tls.TLSClientSettings
+import io.github.davidepianca98.socket.tls.TLSEngine
 
 internal actual class TLSClientEngine actual constructor(tlsSettings: TLSClientSettings) : TLSEngine {
 
diff --git a/kmqtt-client/src/macosX64Main/kotlin/TLSClientEngine.kt b/kmqtt-client/src/macosX64Main/kotlin/TLSClientEngine.kt
deleted file mode 100644
index b180dea3fb966b42a150ca3e66decb194b6cd0f3..0000000000000000000000000000000000000000
--- a/kmqtt-client/src/macosX64Main/kotlin/TLSClientEngine.kt
+++ /dev/null
@@ -1,183 +0,0 @@
-import kotlinx.cinterop.*
-import openssl.*
-import platform.posix.getenv
-import platform.posix.strcpy
-import platform.posix.strlen
-import socket.IOException
-import socket.tls.TLSClientSettings
-import socket.tls.TLSEngine
-
-internal actual class TLSClientEngine actual constructor(tlsSettings: TLSClientSettings) : TLSEngine {
-
-    private val context: CPointer<SSL>
-    private val readBio: CPointer<BIO>
-    private val writeBio: CPointer<BIO>
-
-    fun loadServerCertsFromString(context: CPointer<SSL_CTX>, certBuffer: String): Boolean {
-        val bio = BIO_new(BIO_s_mem())
-        BIO_puts(bio, certBuffer)
-
-        val inf = PEM_X509_INFO_read_bio(bio, null, null, null)
-
-        if (inf == null) {
-            BIO_free(bio)
-            return false
-        }
-
-        val ctx = SSL_CTX_get_cert_store(context);
-
-        var loaded = 0
-        for (i in 0..<sk_X509_INFO_num(inf)) {
-            val itmp = sk_X509_INFO_value(inf, i)
-            if (itmp != null && itmp.pointed.x509 != null) {
-                if (X509_STORE_add_cert(ctx, itmp.pointed.x509) != 1) {
-                    sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
-                        X509_INFO_free(buf)
-                    })
-                    BIO_free(bio)
-                    return false
-                }
-                loaded++
-            }
-        }
-
-        sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
-            X509_INFO_free(buf)
-        })
-        BIO_free(bio)
-
-        return loaded > 0
-    }
-
-    init {
-        val readBio = BIO_new(BIO_s_mem()) ?: throw IOException("Failed allocating read BIO")
-
-        val writeBio = BIO_new(BIO_s_mem())
-        if (writeBio == null) {
-            BIO_free(readBio)
-            throw IOException("Failed allocating read BIO")
-        }
-
-        val method = TLS_client_method()
-        val sslContext = SSL_CTX_new(method)!!
-
-        if (tlsSettings.serverCertificate != null) {
-            if (!loadServerCertsFromString(sslContext, tlsSettings.serverCertificate!!)) {
-                // Try file
-                if (SSL_CTX_load_verify_locations(sslContext, tlsSettings.serverCertificate, null) != 1) {
-                    throw Exception("Server certificate path not found")
-                }
-            }
-        } else {
-            if (!tlsSettings.checkServerCertificate) {
-                SSL_CTX_set_cert_verify_callback(
-                    sslContext,
-                    staticCFunction { buf: CPointer<X509_STORE_CTX>?, arg: COpaquePointer? ->
-                        1
-                    },
-                    null
-                )
-            } else {
-                if (SSL_CTX_load_verify_locations(sslContext, null, getenv(X509_get_default_cert_dir_env()?.toKString())?.toKString()) != 1) {
-                    throw Exception("Server certificate path not found")
-                }
-            }
-        }
-
-        if (tlsSettings.clientCertificate != null) {
-            val bio = BIO_new(BIO_s_mem())
-            BIO_puts(bio, tlsSettings.clientCertificate)
-            val certificate = PEM_read_bio_X509(bio, null, null, null)
-
-            if (certificate != null) {
-                if (SSL_CTX_use_certificate(sslContext, certificate) != 1) {
-                    throw Exception("Cannot load client's certificate")
-                }
-            } else {
-                // Load file
-                if (SSL_CTX_use_certificate_file(sslContext, tlsSettings.clientCertificate, SSL_FILETYPE_PEM) != 1) {
-                    throw Exception("Cannot load client's certificate file")
-                }
-            }
-
-            BIO_puts(bio, tlsSettings.clientCertificateKey)
-            val key = PEM_read_bio_PrivateKey(bio, null, null, null)
-            if (key != null) {
-                if (SSL_CTX_use_PrivateKey(sslContext, key) != 1) {
-                    throw Exception("Cannot load client's key")
-                }
-            } else {
-                if (SSL_CTX_use_PrivateKey_file(sslContext, tlsSettings.clientCertificateKey!!, SSL_FILETYPE_PEM) != 1) {
-                    throw Exception("Cannot load client's key file")
-                }
-            }
-            if (SSL_CTX_check_private_key(sslContext) != 1) {
-                throw Exception("Client's certificate and key don't match")
-            }
-
-            if (tlsSettings.clientCertificatePassword != null) {
-                SSL_CTX_set_default_passwd_cb_userdata(sslContext, tlsSettings.clientCertificatePassword!!.refTo(0))
-                SSL_CTX_set_default_passwd_cb(
-                    sslContext,
-                    staticCFunction { buf: CPointer<ByteVar>?, size: Int, _: Int, password: COpaquePointer? ->
-                        if (password == null) {
-                            0
-                        } else {
-                            val len = strlen(password.reinterpret<ByteVar>().toKString())
-                            if (size < len.toInt() + 1) {
-                                0
-                            } else {
-                                strcpy(buf, password.reinterpret<ByteVar>().toKString())
-                                len.toInt()
-                            }
-                        }
-                    })
-            }
-        }
-
-        val clientContext = SSL_new(sslContext)
-        if (clientContext == null) {
-            BIO_free(readBio)
-            BIO_free(writeBio)
-            throw IOException("Failed allocating read BIO")
-        }
-
-        SSL_set_verify(clientContext, SSL_VERIFY_PEER, null)
-
-        SSL_set_connect_state(clientContext)
-        SSL_set_bio(clientContext, readBio, writeBio)
-        context = clientContext
-        this.readBio = readBio
-        this.writeBio = writeBio
-    }
-
-    actual override val isInitFinished: Boolean
-        get() = SSL_is_init_finished(context) != 0
-
-    actual override val bioShouldRetry: Boolean
-        get() = BIO_test_flags(writeBio, BIO_FLAGS_SHOULD_RETRY) == 0
-
-    actual override fun write(buffer: CPointer<ByteVar>, length: Int): Int {
-        return SSL_write(context, buffer, length)
-    }
-
-    actual override fun read(buffer: CPointer<ByteVar>, length: Int): Int {
-        return SSL_read(context, buffer, length)
-    }
-
-    actual override fun bioRead(buffer: CPointer<ByteVar>, length: Int): Int {
-        return BIO_read(writeBio, buffer, length)
-    }
-
-    actual override fun bioWrite(buffer: CPointer<ByteVar>, length: Int): Int {
-        return BIO_write(readBio, buffer, length)
-    }
-
-    actual override fun getError(result: Int): Int {
-        return SSL_get_error(context, result)
-    }
-
-    actual override fun close() {
-        SSL_free(context)
-    }
-}
diff --git a/kmqtt-client/src/macosX64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt b/kmqtt-client/src/macosX64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
new file mode 100644
index 0000000000000000000000000000000000000000..35214674fc3ee31084da917a860a564c37d85155
--- /dev/null
+++ b/kmqtt-client/src/macosX64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
@@ -0,0 +1,185 @@
+package io.github.davidepianca98
+
+import kotlinx.cinterop.*
+import openssl.*
+import platform.posix.getenv
+import platform.posix.strcpy
+import platform.posix.strlen
+import io.github.davidepianca98.socket.IOException
+import io.github.davidepianca98.socket.tls.TLSClientSettings
+import io.github.davidepianca98.socket.tls.TLSEngine
+
+internal actual class TLSClientEngine actual constructor(tlsSettings: TLSClientSettings) : TLSEngine {
+
+    private val context: CPointer<SSL>
+    private val readBio: CPointer<BIO>
+    private val writeBio: CPointer<BIO>
+
+    fun loadServerCertsFromString(context: CPointer<SSL_CTX>, certBuffer: String): Boolean {
+        val bio = BIO_new(BIO_s_mem())
+        BIO_puts(bio, certBuffer)
+
+        val inf = PEM_X509_INFO_read_bio(bio, null, null, null)
+
+        if (inf == null) {
+            BIO_free(bio)
+            return false
+        }
+
+        val ctx = SSL_CTX_get_cert_store(context);
+
+        var loaded = 0
+        for (i in 0..<sk_X509_INFO_num(inf)) {
+            val itmp = sk_X509_INFO_value(inf, i)
+            if (itmp != null && itmp.pointed.x509 != null) {
+                if (X509_STORE_add_cert(ctx, itmp.pointed.x509) != 1) {
+                    sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
+                        X509_INFO_free(buf)
+                    })
+                    BIO_free(bio)
+                    return false
+                }
+                loaded++
+            }
+        }
+
+        sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
+            X509_INFO_free(buf)
+        })
+        BIO_free(bio)
+
+        return loaded > 0
+    }
+
+    init {
+        val readBio = BIO_new(BIO_s_mem()) ?: throw IOException("Failed allocating read BIO")
+
+        val writeBio = BIO_new(BIO_s_mem())
+        if (writeBio == null) {
+            BIO_free(readBio)
+            throw IOException("Failed allocating read BIO")
+        }
+
+        val method = TLS_client_method()
+        val sslContext = SSL_CTX_new(method)!!
+
+        if (tlsSettings.serverCertificate != null) {
+            if (!loadServerCertsFromString(sslContext, tlsSettings.serverCertificate!!)) {
+                // Try file
+                if (SSL_CTX_load_verify_locations(sslContext, tlsSettings.serverCertificate, null) != 1) {
+                    throw Exception("Server certificate path not found")
+                }
+            }
+        } else {
+            if (!tlsSettings.checkServerCertificate) {
+                SSL_CTX_set_cert_verify_callback(
+                    sslContext,
+                    staticCFunction { buf: CPointer<X509_STORE_CTX>?, arg: COpaquePointer? ->
+                        1
+                    },
+                    null
+                )
+            } else {
+                if (SSL_CTX_load_verify_locations(sslContext, null, getenv(X509_get_default_cert_dir_env()?.toKString())?.toKString()) != 1) {
+                    throw Exception("Server certificate path not found")
+                }
+            }
+        }
+
+        if (tlsSettings.clientCertificate != null) {
+            val bio = BIO_new(BIO_s_mem())
+            BIO_puts(bio, tlsSettings.clientCertificate)
+            val certificate = PEM_read_bio_X509(bio, null, null, null)
+
+            if (certificate != null) {
+                if (SSL_CTX_use_certificate(sslContext, certificate) != 1) {
+                    throw Exception("Cannot load client's certificate")
+                }
+            } else {
+                // Load file
+                if (SSL_CTX_use_certificate_file(sslContext, tlsSettings.clientCertificate, SSL_FILETYPE_PEM) != 1) {
+                    throw Exception("Cannot load client's certificate file")
+                }
+            }
+
+            BIO_puts(bio, tlsSettings.clientCertificateKey)
+            val key = PEM_read_bio_PrivateKey(bio, null, null, null)
+            if (key != null) {
+                if (SSL_CTX_use_PrivateKey(sslContext, key) != 1) {
+                    throw Exception("Cannot load client's key")
+                }
+            } else {
+                if (SSL_CTX_use_PrivateKey_file(sslContext, tlsSettings.clientCertificateKey!!, SSL_FILETYPE_PEM) != 1) {
+                    throw Exception("Cannot load client's key file")
+                }
+            }
+            if (SSL_CTX_check_private_key(sslContext) != 1) {
+                throw Exception("Client's certificate and key don't match")
+            }
+
+            if (tlsSettings.clientCertificatePassword != null) {
+                SSL_CTX_set_default_passwd_cb_userdata(sslContext, tlsSettings.clientCertificatePassword!!.refTo(0))
+                SSL_CTX_set_default_passwd_cb(
+                    sslContext,
+                    staticCFunction { buf: CPointer<ByteVar>?, size: Int, _: Int, password: COpaquePointer? ->
+                        if (password == null) {
+                            0
+                        } else {
+                            val len = strlen(password.reinterpret<ByteVar>().toKString())
+                            if (size < len.toInt() + 1) {
+                                0
+                            } else {
+                                strcpy(buf, password.reinterpret<ByteVar>().toKString())
+                                len.toInt()
+                            }
+                        }
+                    })
+            }
+        }
+
+        val clientContext = SSL_new(sslContext)
+        if (clientContext == null) {
+            BIO_free(readBio)
+            BIO_free(writeBio)
+            throw IOException("Failed allocating read BIO")
+        }
+
+        SSL_set_verify(clientContext, SSL_VERIFY_PEER, null)
+
+        SSL_set_connect_state(clientContext)
+        SSL_set_bio(clientContext, readBio, writeBio)
+        context = clientContext
+        this.readBio = readBio
+        this.writeBio = writeBio
+    }
+
+    actual override val isInitFinished: Boolean
+        get() = SSL_is_init_finished(context) != 0
+
+    actual override val bioShouldRetry: Boolean
+        get() = BIO_test_flags(writeBio, BIO_FLAGS_SHOULD_RETRY) == 0
+
+    actual override fun write(buffer: CPointer<ByteVar>, length: Int): Int {
+        return SSL_write(context, buffer, length)
+    }
+
+    actual override fun read(buffer: CPointer<ByteVar>, length: Int): Int {
+        return SSL_read(context, buffer, length)
+    }
+
+    actual override fun bioRead(buffer: CPointer<ByteVar>, length: Int): Int {
+        return BIO_read(writeBio, buffer, length)
+    }
+
+    actual override fun bioWrite(buffer: CPointer<ByteVar>, length: Int): Int {
+        return BIO_write(readBio, buffer, length)
+    }
+
+    actual override fun getError(result: Int): Int {
+        return SSL_get_error(context, result)
+    }
+
+    actual override fun close() {
+        SSL_free(context)
+    }
+}
diff --git a/kmqtt-client/src/mingwX64Main/kotlin/TLSClientEngine.kt b/kmqtt-client/src/mingwX64Main/kotlin/TLSClientEngine.kt
deleted file mode 100644
index b180dea3fb966b42a150ca3e66decb194b6cd0f3..0000000000000000000000000000000000000000
--- a/kmqtt-client/src/mingwX64Main/kotlin/TLSClientEngine.kt
+++ /dev/null
@@ -1,183 +0,0 @@
-import kotlinx.cinterop.*
-import openssl.*
-import platform.posix.getenv
-import platform.posix.strcpy
-import platform.posix.strlen
-import socket.IOException
-import socket.tls.TLSClientSettings
-import socket.tls.TLSEngine
-
-internal actual class TLSClientEngine actual constructor(tlsSettings: TLSClientSettings) : TLSEngine {
-
-    private val context: CPointer<SSL>
-    private val readBio: CPointer<BIO>
-    private val writeBio: CPointer<BIO>
-
-    fun loadServerCertsFromString(context: CPointer<SSL_CTX>, certBuffer: String): Boolean {
-        val bio = BIO_new(BIO_s_mem())
-        BIO_puts(bio, certBuffer)
-
-        val inf = PEM_X509_INFO_read_bio(bio, null, null, null)
-
-        if (inf == null) {
-            BIO_free(bio)
-            return false
-        }
-
-        val ctx = SSL_CTX_get_cert_store(context);
-
-        var loaded = 0
-        for (i in 0..<sk_X509_INFO_num(inf)) {
-            val itmp = sk_X509_INFO_value(inf, i)
-            if (itmp != null && itmp.pointed.x509 != null) {
-                if (X509_STORE_add_cert(ctx, itmp.pointed.x509) != 1) {
-                    sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
-                        X509_INFO_free(buf)
-                    })
-                    BIO_free(bio)
-                    return false
-                }
-                loaded++
-            }
-        }
-
-        sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
-            X509_INFO_free(buf)
-        })
-        BIO_free(bio)
-
-        return loaded > 0
-    }
-
-    init {
-        val readBio = BIO_new(BIO_s_mem()) ?: throw IOException("Failed allocating read BIO")
-
-        val writeBio = BIO_new(BIO_s_mem())
-        if (writeBio == null) {
-            BIO_free(readBio)
-            throw IOException("Failed allocating read BIO")
-        }
-
-        val method = TLS_client_method()
-        val sslContext = SSL_CTX_new(method)!!
-
-        if (tlsSettings.serverCertificate != null) {
-            if (!loadServerCertsFromString(sslContext, tlsSettings.serverCertificate!!)) {
-                // Try file
-                if (SSL_CTX_load_verify_locations(sslContext, tlsSettings.serverCertificate, null) != 1) {
-                    throw Exception("Server certificate path not found")
-                }
-            }
-        } else {
-            if (!tlsSettings.checkServerCertificate) {
-                SSL_CTX_set_cert_verify_callback(
-                    sslContext,
-                    staticCFunction { buf: CPointer<X509_STORE_CTX>?, arg: COpaquePointer? ->
-                        1
-                    },
-                    null
-                )
-            } else {
-                if (SSL_CTX_load_verify_locations(sslContext, null, getenv(X509_get_default_cert_dir_env()?.toKString())?.toKString()) != 1) {
-                    throw Exception("Server certificate path not found")
-                }
-            }
-        }
-
-        if (tlsSettings.clientCertificate != null) {
-            val bio = BIO_new(BIO_s_mem())
-            BIO_puts(bio, tlsSettings.clientCertificate)
-            val certificate = PEM_read_bio_X509(bio, null, null, null)
-
-            if (certificate != null) {
-                if (SSL_CTX_use_certificate(sslContext, certificate) != 1) {
-                    throw Exception("Cannot load client's certificate")
-                }
-            } else {
-                // Load file
-                if (SSL_CTX_use_certificate_file(sslContext, tlsSettings.clientCertificate, SSL_FILETYPE_PEM) != 1) {
-                    throw Exception("Cannot load client's certificate file")
-                }
-            }
-
-            BIO_puts(bio, tlsSettings.clientCertificateKey)
-            val key = PEM_read_bio_PrivateKey(bio, null, null, null)
-            if (key != null) {
-                if (SSL_CTX_use_PrivateKey(sslContext, key) != 1) {
-                    throw Exception("Cannot load client's key")
-                }
-            } else {
-                if (SSL_CTX_use_PrivateKey_file(sslContext, tlsSettings.clientCertificateKey!!, SSL_FILETYPE_PEM) != 1) {
-                    throw Exception("Cannot load client's key file")
-                }
-            }
-            if (SSL_CTX_check_private_key(sslContext) != 1) {
-                throw Exception("Client's certificate and key don't match")
-            }
-
-            if (tlsSettings.clientCertificatePassword != null) {
-                SSL_CTX_set_default_passwd_cb_userdata(sslContext, tlsSettings.clientCertificatePassword!!.refTo(0))
-                SSL_CTX_set_default_passwd_cb(
-                    sslContext,
-                    staticCFunction { buf: CPointer<ByteVar>?, size: Int, _: Int, password: COpaquePointer? ->
-                        if (password == null) {
-                            0
-                        } else {
-                            val len = strlen(password.reinterpret<ByteVar>().toKString())
-                            if (size < len.toInt() + 1) {
-                                0
-                            } else {
-                                strcpy(buf, password.reinterpret<ByteVar>().toKString())
-                                len.toInt()
-                            }
-                        }
-                    })
-            }
-        }
-
-        val clientContext = SSL_new(sslContext)
-        if (clientContext == null) {
-            BIO_free(readBio)
-            BIO_free(writeBio)
-            throw IOException("Failed allocating read BIO")
-        }
-
-        SSL_set_verify(clientContext, SSL_VERIFY_PEER, null)
-
-        SSL_set_connect_state(clientContext)
-        SSL_set_bio(clientContext, readBio, writeBio)
-        context = clientContext
-        this.readBio = readBio
-        this.writeBio = writeBio
-    }
-
-    actual override val isInitFinished: Boolean
-        get() = SSL_is_init_finished(context) != 0
-
-    actual override val bioShouldRetry: Boolean
-        get() = BIO_test_flags(writeBio, BIO_FLAGS_SHOULD_RETRY) == 0
-
-    actual override fun write(buffer: CPointer<ByteVar>, length: Int): Int {
-        return SSL_write(context, buffer, length)
-    }
-
-    actual override fun read(buffer: CPointer<ByteVar>, length: Int): Int {
-        return SSL_read(context, buffer, length)
-    }
-
-    actual override fun bioRead(buffer: CPointer<ByteVar>, length: Int): Int {
-        return BIO_read(writeBio, buffer, length)
-    }
-
-    actual override fun bioWrite(buffer: CPointer<ByteVar>, length: Int): Int {
-        return BIO_write(readBio, buffer, length)
-    }
-
-    actual override fun getError(result: Int): Int {
-        return SSL_get_error(context, result)
-    }
-
-    actual override fun close() {
-        SSL_free(context)
-    }
-}
diff --git a/kmqtt-client/src/mingwX64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt b/kmqtt-client/src/mingwX64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
new file mode 100644
index 0000000000000000000000000000000000000000..35214674fc3ee31084da917a860a564c37d85155
--- /dev/null
+++ b/kmqtt-client/src/mingwX64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
@@ -0,0 +1,185 @@
+package io.github.davidepianca98
+
+import kotlinx.cinterop.*
+import openssl.*
+import platform.posix.getenv
+import platform.posix.strcpy
+import platform.posix.strlen
+import io.github.davidepianca98.socket.IOException
+import io.github.davidepianca98.socket.tls.TLSClientSettings
+import io.github.davidepianca98.socket.tls.TLSEngine
+
+internal actual class TLSClientEngine actual constructor(tlsSettings: TLSClientSettings) : TLSEngine {
+
+    private val context: CPointer<SSL>
+    private val readBio: CPointer<BIO>
+    private val writeBio: CPointer<BIO>
+
+    fun loadServerCertsFromString(context: CPointer<SSL_CTX>, certBuffer: String): Boolean {
+        val bio = BIO_new(BIO_s_mem())
+        BIO_puts(bio, certBuffer)
+
+        val inf = PEM_X509_INFO_read_bio(bio, null, null, null)
+
+        if (inf == null) {
+            BIO_free(bio)
+            return false
+        }
+
+        val ctx = SSL_CTX_get_cert_store(context);
+
+        var loaded = 0
+        for (i in 0..<sk_X509_INFO_num(inf)) {
+            val itmp = sk_X509_INFO_value(inf, i)
+            if (itmp != null && itmp.pointed.x509 != null) {
+                if (X509_STORE_add_cert(ctx, itmp.pointed.x509) != 1) {
+                    sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
+                        X509_INFO_free(buf)
+                    })
+                    BIO_free(bio)
+                    return false
+                }
+                loaded++
+            }
+        }
+
+        sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
+            X509_INFO_free(buf)
+        })
+        BIO_free(bio)
+
+        return loaded > 0
+    }
+
+    init {
+        val readBio = BIO_new(BIO_s_mem()) ?: throw IOException("Failed allocating read BIO")
+
+        val writeBio = BIO_new(BIO_s_mem())
+        if (writeBio == null) {
+            BIO_free(readBio)
+            throw IOException("Failed allocating read BIO")
+        }
+
+        val method = TLS_client_method()
+        val sslContext = SSL_CTX_new(method)!!
+
+        if (tlsSettings.serverCertificate != null) {
+            if (!loadServerCertsFromString(sslContext, tlsSettings.serverCertificate!!)) {
+                // Try file
+                if (SSL_CTX_load_verify_locations(sslContext, tlsSettings.serverCertificate, null) != 1) {
+                    throw Exception("Server certificate path not found")
+                }
+            }
+        } else {
+            if (!tlsSettings.checkServerCertificate) {
+                SSL_CTX_set_cert_verify_callback(
+                    sslContext,
+                    staticCFunction { buf: CPointer<X509_STORE_CTX>?, arg: COpaquePointer? ->
+                        1
+                    },
+                    null
+                )
+            } else {
+                if (SSL_CTX_load_verify_locations(sslContext, null, getenv(X509_get_default_cert_dir_env()?.toKString())?.toKString()) != 1) {
+                    throw Exception("Server certificate path not found")
+                }
+            }
+        }
+
+        if (tlsSettings.clientCertificate != null) {
+            val bio = BIO_new(BIO_s_mem())
+            BIO_puts(bio, tlsSettings.clientCertificate)
+            val certificate = PEM_read_bio_X509(bio, null, null, null)
+
+            if (certificate != null) {
+                if (SSL_CTX_use_certificate(sslContext, certificate) != 1) {
+                    throw Exception("Cannot load client's certificate")
+                }
+            } else {
+                // Load file
+                if (SSL_CTX_use_certificate_file(sslContext, tlsSettings.clientCertificate, SSL_FILETYPE_PEM) != 1) {
+                    throw Exception("Cannot load client's certificate file")
+                }
+            }
+
+            BIO_puts(bio, tlsSettings.clientCertificateKey)
+            val key = PEM_read_bio_PrivateKey(bio, null, null, null)
+            if (key != null) {
+                if (SSL_CTX_use_PrivateKey(sslContext, key) != 1) {
+                    throw Exception("Cannot load client's key")
+                }
+            } else {
+                if (SSL_CTX_use_PrivateKey_file(sslContext, tlsSettings.clientCertificateKey!!, SSL_FILETYPE_PEM) != 1) {
+                    throw Exception("Cannot load client's key file")
+                }
+            }
+            if (SSL_CTX_check_private_key(sslContext) != 1) {
+                throw Exception("Client's certificate and key don't match")
+            }
+
+            if (tlsSettings.clientCertificatePassword != null) {
+                SSL_CTX_set_default_passwd_cb_userdata(sslContext, tlsSettings.clientCertificatePassword!!.refTo(0))
+                SSL_CTX_set_default_passwd_cb(
+                    sslContext,
+                    staticCFunction { buf: CPointer<ByteVar>?, size: Int, _: Int, password: COpaquePointer? ->
+                        if (password == null) {
+                            0
+                        } else {
+                            val len = strlen(password.reinterpret<ByteVar>().toKString())
+                            if (size < len.toInt() + 1) {
+                                0
+                            } else {
+                                strcpy(buf, password.reinterpret<ByteVar>().toKString())
+                                len.toInt()
+                            }
+                        }
+                    })
+            }
+        }
+
+        val clientContext = SSL_new(sslContext)
+        if (clientContext == null) {
+            BIO_free(readBio)
+            BIO_free(writeBio)
+            throw IOException("Failed allocating read BIO")
+        }
+
+        SSL_set_verify(clientContext, SSL_VERIFY_PEER, null)
+
+        SSL_set_connect_state(clientContext)
+        SSL_set_bio(clientContext, readBio, writeBio)
+        context = clientContext
+        this.readBio = readBio
+        this.writeBio = writeBio
+    }
+
+    actual override val isInitFinished: Boolean
+        get() = SSL_is_init_finished(context) != 0
+
+    actual override val bioShouldRetry: Boolean
+        get() = BIO_test_flags(writeBio, BIO_FLAGS_SHOULD_RETRY) == 0
+
+    actual override fun write(buffer: CPointer<ByteVar>, length: Int): Int {
+        return SSL_write(context, buffer, length)
+    }
+
+    actual override fun read(buffer: CPointer<ByteVar>, length: Int): Int {
+        return SSL_read(context, buffer, length)
+    }
+
+    actual override fun bioRead(buffer: CPointer<ByteVar>, length: Int): Int {
+        return BIO_read(writeBio, buffer, length)
+    }
+
+    actual override fun bioWrite(buffer: CPointer<ByteVar>, length: Int): Int {
+        return BIO_write(readBio, buffer, length)
+    }
+
+    actual override fun getError(result: Int): Int {
+        return SSL_get_error(context, result)
+    }
+
+    actual override fun close() {
+        SSL_free(context)
+    }
+}
diff --git a/kmqtt-client/src/posixMain/kotlin/ClientSocket.kt b/kmqtt-client/src/posixMain/kotlin/io/github/davidepianca98/ClientSocket.kt
similarity index 92%
rename from kmqtt-client/src/posixMain/kotlin/ClientSocket.kt
rename to kmqtt-client/src/posixMain/kotlin/io/github/davidepianca98/ClientSocket.kt
index 6fcf934b3409db3adfb5521017b7894c1ab8d036..ea1f39372ceabb0fe9c2b24f516ae6c7547da004 100644
--- a/kmqtt-client/src/posixMain/kotlin/ClientSocket.kt
+++ b/kmqtt-client/src/posixMain/kotlin/io/github/davidepianca98/ClientSocket.kt
@@ -1,7 +1,9 @@
+package io.github.davidepianca98
+
 import kotlinx.cinterop.*
 import platform.posix.*
-import socket.IOException
-import socket.tcp.Socket
+import io.github.davidepianca98.socket.IOException
+import io.github.davidepianca98.socket.tcp.Socket
 
 public actual class ClientSocket actual constructor(
     address: String,
diff --git a/kmqtt-client/src/posixMain/kotlin/TLSClientEngine.kt b/kmqtt-client/src/posixMain/kotlin/io/github/davidepianca98/TLSClientEngine.kt
similarity index 79%
rename from kmqtt-client/src/posixMain/kotlin/TLSClientEngine.kt
rename to kmqtt-client/src/posixMain/kotlin/io/github/davidepianca98/TLSClientEngine.kt
index f6fa7a9e2b37a4d252b43f2c838e1b69e79513de..d16c003e9217d1c45ca246bdce14a7d972cf717e 100644
--- a/kmqtt-client/src/posixMain/kotlin/TLSClientEngine.kt
+++ b/kmqtt-client/src/posixMain/kotlin/io/github/davidepianca98/TLSClientEngine.kt
@@ -1,7 +1,9 @@
+package io.github.davidepianca98
+
 import kotlinx.cinterop.ByteVar
 import kotlinx.cinterop.CPointer
-import socket.tls.TLSClientSettings
-import socket.tls.TLSEngine
+import io.github.davidepianca98.socket.tls.TLSClientSettings
+import io.github.davidepianca98.socket.tls.TLSEngine
 
 internal expect class TLSClientEngine(tlsSettings: TLSClientSettings) : TLSEngine {
 
diff --git a/kmqtt-client/src/posixMain/kotlin/TLSClientSocket.kt b/kmqtt-client/src/posixMain/kotlin/io/github/davidepianca98/TLSClientSocket.kt
similarity index 90%
rename from kmqtt-client/src/posixMain/kotlin/TLSClientSocket.kt
rename to kmqtt-client/src/posixMain/kotlin/io/github/davidepianca98/TLSClientSocket.kt
index bb1629b0a77abcfbdbccc5f3c9e5e464f83b34d3..ce4fca96f4cb78961766218449355b8c316a4cb3 100644
--- a/kmqtt-client/src/posixMain/kotlin/TLSClientSocket.kt
+++ b/kmqtt-client/src/posixMain/kotlin/io/github/davidepianca98/TLSClientSocket.kt
@@ -1,8 +1,10 @@
+package io.github.davidepianca98
+
 import kotlinx.cinterop.*
 import platform.posix.*
-import socket.IOException
-import socket.tls.TLSClientSettings
-import socket.tls.TLSSocket
+import io.github.davidepianca98.socket.IOException
+import io.github.davidepianca98.socket.tls.TLSClientSettings
+import io.github.davidepianca98.socket.tls.TLSSocket
 
 public actual class TLSClientSocket actual constructor(
     address: String,
diff --git a/kmqtt-client/src/tvosArm64Main/kotlin/TLSClientEngine.kt b/kmqtt-client/src/tvosArm64Main/kotlin/TLSClientEngine.kt
deleted file mode 100644
index b180dea3fb966b42a150ca3e66decb194b6cd0f3..0000000000000000000000000000000000000000
--- a/kmqtt-client/src/tvosArm64Main/kotlin/TLSClientEngine.kt
+++ /dev/null
@@ -1,183 +0,0 @@
-import kotlinx.cinterop.*
-import openssl.*
-import platform.posix.getenv
-import platform.posix.strcpy
-import platform.posix.strlen
-import socket.IOException
-import socket.tls.TLSClientSettings
-import socket.tls.TLSEngine
-
-internal actual class TLSClientEngine actual constructor(tlsSettings: TLSClientSettings) : TLSEngine {
-
-    private val context: CPointer<SSL>
-    private val readBio: CPointer<BIO>
-    private val writeBio: CPointer<BIO>
-
-    fun loadServerCertsFromString(context: CPointer<SSL_CTX>, certBuffer: String): Boolean {
-        val bio = BIO_new(BIO_s_mem())
-        BIO_puts(bio, certBuffer)
-
-        val inf = PEM_X509_INFO_read_bio(bio, null, null, null)
-
-        if (inf == null) {
-            BIO_free(bio)
-            return false
-        }
-
-        val ctx = SSL_CTX_get_cert_store(context);
-
-        var loaded = 0
-        for (i in 0..<sk_X509_INFO_num(inf)) {
-            val itmp = sk_X509_INFO_value(inf, i)
-            if (itmp != null && itmp.pointed.x509 != null) {
-                if (X509_STORE_add_cert(ctx, itmp.pointed.x509) != 1) {
-                    sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
-                        X509_INFO_free(buf)
-                    })
-                    BIO_free(bio)
-                    return false
-                }
-                loaded++
-            }
-        }
-
-        sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
-            X509_INFO_free(buf)
-        })
-        BIO_free(bio)
-
-        return loaded > 0
-    }
-
-    init {
-        val readBio = BIO_new(BIO_s_mem()) ?: throw IOException("Failed allocating read BIO")
-
-        val writeBio = BIO_new(BIO_s_mem())
-        if (writeBio == null) {
-            BIO_free(readBio)
-            throw IOException("Failed allocating read BIO")
-        }
-
-        val method = TLS_client_method()
-        val sslContext = SSL_CTX_new(method)!!
-
-        if (tlsSettings.serverCertificate != null) {
-            if (!loadServerCertsFromString(sslContext, tlsSettings.serverCertificate!!)) {
-                // Try file
-                if (SSL_CTX_load_verify_locations(sslContext, tlsSettings.serverCertificate, null) != 1) {
-                    throw Exception("Server certificate path not found")
-                }
-            }
-        } else {
-            if (!tlsSettings.checkServerCertificate) {
-                SSL_CTX_set_cert_verify_callback(
-                    sslContext,
-                    staticCFunction { buf: CPointer<X509_STORE_CTX>?, arg: COpaquePointer? ->
-                        1
-                    },
-                    null
-                )
-            } else {
-                if (SSL_CTX_load_verify_locations(sslContext, null, getenv(X509_get_default_cert_dir_env()?.toKString())?.toKString()) != 1) {
-                    throw Exception("Server certificate path not found")
-                }
-            }
-        }
-
-        if (tlsSettings.clientCertificate != null) {
-            val bio = BIO_new(BIO_s_mem())
-            BIO_puts(bio, tlsSettings.clientCertificate)
-            val certificate = PEM_read_bio_X509(bio, null, null, null)
-
-            if (certificate != null) {
-                if (SSL_CTX_use_certificate(sslContext, certificate) != 1) {
-                    throw Exception("Cannot load client's certificate")
-                }
-            } else {
-                // Load file
-                if (SSL_CTX_use_certificate_file(sslContext, tlsSettings.clientCertificate, SSL_FILETYPE_PEM) != 1) {
-                    throw Exception("Cannot load client's certificate file")
-                }
-            }
-
-            BIO_puts(bio, tlsSettings.clientCertificateKey)
-            val key = PEM_read_bio_PrivateKey(bio, null, null, null)
-            if (key != null) {
-                if (SSL_CTX_use_PrivateKey(sslContext, key) != 1) {
-                    throw Exception("Cannot load client's key")
-                }
-            } else {
-                if (SSL_CTX_use_PrivateKey_file(sslContext, tlsSettings.clientCertificateKey!!, SSL_FILETYPE_PEM) != 1) {
-                    throw Exception("Cannot load client's key file")
-                }
-            }
-            if (SSL_CTX_check_private_key(sslContext) != 1) {
-                throw Exception("Client's certificate and key don't match")
-            }
-
-            if (tlsSettings.clientCertificatePassword != null) {
-                SSL_CTX_set_default_passwd_cb_userdata(sslContext, tlsSettings.clientCertificatePassword!!.refTo(0))
-                SSL_CTX_set_default_passwd_cb(
-                    sslContext,
-                    staticCFunction { buf: CPointer<ByteVar>?, size: Int, _: Int, password: COpaquePointer? ->
-                        if (password == null) {
-                            0
-                        } else {
-                            val len = strlen(password.reinterpret<ByteVar>().toKString())
-                            if (size < len.toInt() + 1) {
-                                0
-                            } else {
-                                strcpy(buf, password.reinterpret<ByteVar>().toKString())
-                                len.toInt()
-                            }
-                        }
-                    })
-            }
-        }
-
-        val clientContext = SSL_new(sslContext)
-        if (clientContext == null) {
-            BIO_free(readBio)
-            BIO_free(writeBio)
-            throw IOException("Failed allocating read BIO")
-        }
-
-        SSL_set_verify(clientContext, SSL_VERIFY_PEER, null)
-
-        SSL_set_connect_state(clientContext)
-        SSL_set_bio(clientContext, readBio, writeBio)
-        context = clientContext
-        this.readBio = readBio
-        this.writeBio = writeBio
-    }
-
-    actual override val isInitFinished: Boolean
-        get() = SSL_is_init_finished(context) != 0
-
-    actual override val bioShouldRetry: Boolean
-        get() = BIO_test_flags(writeBio, BIO_FLAGS_SHOULD_RETRY) == 0
-
-    actual override fun write(buffer: CPointer<ByteVar>, length: Int): Int {
-        return SSL_write(context, buffer, length)
-    }
-
-    actual override fun read(buffer: CPointer<ByteVar>, length: Int): Int {
-        return SSL_read(context, buffer, length)
-    }
-
-    actual override fun bioRead(buffer: CPointer<ByteVar>, length: Int): Int {
-        return BIO_read(writeBio, buffer, length)
-    }
-
-    actual override fun bioWrite(buffer: CPointer<ByteVar>, length: Int): Int {
-        return BIO_write(readBio, buffer, length)
-    }
-
-    actual override fun getError(result: Int): Int {
-        return SSL_get_error(context, result)
-    }
-
-    actual override fun close() {
-        SSL_free(context)
-    }
-}
diff --git a/kmqtt-client/src/tvosArm64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt b/kmqtt-client/src/tvosArm64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
new file mode 100644
index 0000000000000000000000000000000000000000..35214674fc3ee31084da917a860a564c37d85155
--- /dev/null
+++ b/kmqtt-client/src/tvosArm64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
@@ -0,0 +1,185 @@
+package io.github.davidepianca98
+
+import kotlinx.cinterop.*
+import openssl.*
+import platform.posix.getenv
+import platform.posix.strcpy
+import platform.posix.strlen
+import io.github.davidepianca98.socket.IOException
+import io.github.davidepianca98.socket.tls.TLSClientSettings
+import io.github.davidepianca98.socket.tls.TLSEngine
+
+internal actual class TLSClientEngine actual constructor(tlsSettings: TLSClientSettings) : TLSEngine {
+
+    private val context: CPointer<SSL>
+    private val readBio: CPointer<BIO>
+    private val writeBio: CPointer<BIO>
+
+    fun loadServerCertsFromString(context: CPointer<SSL_CTX>, certBuffer: String): Boolean {
+        val bio = BIO_new(BIO_s_mem())
+        BIO_puts(bio, certBuffer)
+
+        val inf = PEM_X509_INFO_read_bio(bio, null, null, null)
+
+        if (inf == null) {
+            BIO_free(bio)
+            return false
+        }
+
+        val ctx = SSL_CTX_get_cert_store(context);
+
+        var loaded = 0
+        for (i in 0..<sk_X509_INFO_num(inf)) {
+            val itmp = sk_X509_INFO_value(inf, i)
+            if (itmp != null && itmp.pointed.x509 != null) {
+                if (X509_STORE_add_cert(ctx, itmp.pointed.x509) != 1) {
+                    sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
+                        X509_INFO_free(buf)
+                    })
+                    BIO_free(bio)
+                    return false
+                }
+                loaded++
+            }
+        }
+
+        sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
+            X509_INFO_free(buf)
+        })
+        BIO_free(bio)
+
+        return loaded > 0
+    }
+
+    init {
+        val readBio = BIO_new(BIO_s_mem()) ?: throw IOException("Failed allocating read BIO")
+
+        val writeBio = BIO_new(BIO_s_mem())
+        if (writeBio == null) {
+            BIO_free(readBio)
+            throw IOException("Failed allocating read BIO")
+        }
+
+        val method = TLS_client_method()
+        val sslContext = SSL_CTX_new(method)!!
+
+        if (tlsSettings.serverCertificate != null) {
+            if (!loadServerCertsFromString(sslContext, tlsSettings.serverCertificate!!)) {
+                // Try file
+                if (SSL_CTX_load_verify_locations(sslContext, tlsSettings.serverCertificate, null) != 1) {
+                    throw Exception("Server certificate path not found")
+                }
+            }
+        } else {
+            if (!tlsSettings.checkServerCertificate) {
+                SSL_CTX_set_cert_verify_callback(
+                    sslContext,
+                    staticCFunction { buf: CPointer<X509_STORE_CTX>?, arg: COpaquePointer? ->
+                        1
+                    },
+                    null
+                )
+            } else {
+                if (SSL_CTX_load_verify_locations(sslContext, null, getenv(X509_get_default_cert_dir_env()?.toKString())?.toKString()) != 1) {
+                    throw Exception("Server certificate path not found")
+                }
+            }
+        }
+
+        if (tlsSettings.clientCertificate != null) {
+            val bio = BIO_new(BIO_s_mem())
+            BIO_puts(bio, tlsSettings.clientCertificate)
+            val certificate = PEM_read_bio_X509(bio, null, null, null)
+
+            if (certificate != null) {
+                if (SSL_CTX_use_certificate(sslContext, certificate) != 1) {
+                    throw Exception("Cannot load client's certificate")
+                }
+            } else {
+                // Load file
+                if (SSL_CTX_use_certificate_file(sslContext, tlsSettings.clientCertificate, SSL_FILETYPE_PEM) != 1) {
+                    throw Exception("Cannot load client's certificate file")
+                }
+            }
+
+            BIO_puts(bio, tlsSettings.clientCertificateKey)
+            val key = PEM_read_bio_PrivateKey(bio, null, null, null)
+            if (key != null) {
+                if (SSL_CTX_use_PrivateKey(sslContext, key) != 1) {
+                    throw Exception("Cannot load client's key")
+                }
+            } else {
+                if (SSL_CTX_use_PrivateKey_file(sslContext, tlsSettings.clientCertificateKey!!, SSL_FILETYPE_PEM) != 1) {
+                    throw Exception("Cannot load client's key file")
+                }
+            }
+            if (SSL_CTX_check_private_key(sslContext) != 1) {
+                throw Exception("Client's certificate and key don't match")
+            }
+
+            if (tlsSettings.clientCertificatePassword != null) {
+                SSL_CTX_set_default_passwd_cb_userdata(sslContext, tlsSettings.clientCertificatePassword!!.refTo(0))
+                SSL_CTX_set_default_passwd_cb(
+                    sslContext,
+                    staticCFunction { buf: CPointer<ByteVar>?, size: Int, _: Int, password: COpaquePointer? ->
+                        if (password == null) {
+                            0
+                        } else {
+                            val len = strlen(password.reinterpret<ByteVar>().toKString())
+                            if (size < len.toInt() + 1) {
+                                0
+                            } else {
+                                strcpy(buf, password.reinterpret<ByteVar>().toKString())
+                                len.toInt()
+                            }
+                        }
+                    })
+            }
+        }
+
+        val clientContext = SSL_new(sslContext)
+        if (clientContext == null) {
+            BIO_free(readBio)
+            BIO_free(writeBio)
+            throw IOException("Failed allocating read BIO")
+        }
+
+        SSL_set_verify(clientContext, SSL_VERIFY_PEER, null)
+
+        SSL_set_connect_state(clientContext)
+        SSL_set_bio(clientContext, readBio, writeBio)
+        context = clientContext
+        this.readBio = readBio
+        this.writeBio = writeBio
+    }
+
+    actual override val isInitFinished: Boolean
+        get() = SSL_is_init_finished(context) != 0
+
+    actual override val bioShouldRetry: Boolean
+        get() = BIO_test_flags(writeBio, BIO_FLAGS_SHOULD_RETRY) == 0
+
+    actual override fun write(buffer: CPointer<ByteVar>, length: Int): Int {
+        return SSL_write(context, buffer, length)
+    }
+
+    actual override fun read(buffer: CPointer<ByteVar>, length: Int): Int {
+        return SSL_read(context, buffer, length)
+    }
+
+    actual override fun bioRead(buffer: CPointer<ByteVar>, length: Int): Int {
+        return BIO_read(writeBio, buffer, length)
+    }
+
+    actual override fun bioWrite(buffer: CPointer<ByteVar>, length: Int): Int {
+        return BIO_write(readBio, buffer, length)
+    }
+
+    actual override fun getError(result: Int): Int {
+        return SSL_get_error(context, result)
+    }
+
+    actual override fun close() {
+        SSL_free(context)
+    }
+}
diff --git a/kmqtt-client/src/tvosSimulatorArm64Main/kotlin/TLSClientEngine.kt b/kmqtt-client/src/tvosSimulatorArm64Main/kotlin/TLSClientEngine.kt
deleted file mode 100644
index b180dea3fb966b42a150ca3e66decb194b6cd0f3..0000000000000000000000000000000000000000
--- a/kmqtt-client/src/tvosSimulatorArm64Main/kotlin/TLSClientEngine.kt
+++ /dev/null
@@ -1,183 +0,0 @@
-import kotlinx.cinterop.*
-import openssl.*
-import platform.posix.getenv
-import platform.posix.strcpy
-import platform.posix.strlen
-import socket.IOException
-import socket.tls.TLSClientSettings
-import socket.tls.TLSEngine
-
-internal actual class TLSClientEngine actual constructor(tlsSettings: TLSClientSettings) : TLSEngine {
-
-    private val context: CPointer<SSL>
-    private val readBio: CPointer<BIO>
-    private val writeBio: CPointer<BIO>
-
-    fun loadServerCertsFromString(context: CPointer<SSL_CTX>, certBuffer: String): Boolean {
-        val bio = BIO_new(BIO_s_mem())
-        BIO_puts(bio, certBuffer)
-
-        val inf = PEM_X509_INFO_read_bio(bio, null, null, null)
-
-        if (inf == null) {
-            BIO_free(bio)
-            return false
-        }
-
-        val ctx = SSL_CTX_get_cert_store(context);
-
-        var loaded = 0
-        for (i in 0..<sk_X509_INFO_num(inf)) {
-            val itmp = sk_X509_INFO_value(inf, i)
-            if (itmp != null && itmp.pointed.x509 != null) {
-                if (X509_STORE_add_cert(ctx, itmp.pointed.x509) != 1) {
-                    sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
-                        X509_INFO_free(buf)
-                    })
-                    BIO_free(bio)
-                    return false
-                }
-                loaded++
-            }
-        }
-
-        sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
-            X509_INFO_free(buf)
-        })
-        BIO_free(bio)
-
-        return loaded > 0
-    }
-
-    init {
-        val readBio = BIO_new(BIO_s_mem()) ?: throw IOException("Failed allocating read BIO")
-
-        val writeBio = BIO_new(BIO_s_mem())
-        if (writeBio == null) {
-            BIO_free(readBio)
-            throw IOException("Failed allocating read BIO")
-        }
-
-        val method = TLS_client_method()
-        val sslContext = SSL_CTX_new(method)!!
-
-        if (tlsSettings.serverCertificate != null) {
-            if (!loadServerCertsFromString(sslContext, tlsSettings.serverCertificate!!)) {
-                // Try file
-                if (SSL_CTX_load_verify_locations(sslContext, tlsSettings.serverCertificate, null) != 1) {
-                    throw Exception("Server certificate path not found")
-                }
-            }
-        } else {
-            if (!tlsSettings.checkServerCertificate) {
-                SSL_CTX_set_cert_verify_callback(
-                    sslContext,
-                    staticCFunction { buf: CPointer<X509_STORE_CTX>?, arg: COpaquePointer? ->
-                        1
-                    },
-                    null
-                )
-            } else {
-                if (SSL_CTX_load_verify_locations(sslContext, null, getenv(X509_get_default_cert_dir_env()?.toKString())?.toKString()) != 1) {
-                    throw Exception("Server certificate path not found")
-                }
-            }
-        }
-
-        if (tlsSettings.clientCertificate != null) {
-            val bio = BIO_new(BIO_s_mem())
-            BIO_puts(bio, tlsSettings.clientCertificate)
-            val certificate = PEM_read_bio_X509(bio, null, null, null)
-
-            if (certificate != null) {
-                if (SSL_CTX_use_certificate(sslContext, certificate) != 1) {
-                    throw Exception("Cannot load client's certificate")
-                }
-            } else {
-                // Load file
-                if (SSL_CTX_use_certificate_file(sslContext, tlsSettings.clientCertificate, SSL_FILETYPE_PEM) != 1) {
-                    throw Exception("Cannot load client's certificate file")
-                }
-            }
-
-            BIO_puts(bio, tlsSettings.clientCertificateKey)
-            val key = PEM_read_bio_PrivateKey(bio, null, null, null)
-            if (key != null) {
-                if (SSL_CTX_use_PrivateKey(sslContext, key) != 1) {
-                    throw Exception("Cannot load client's key")
-                }
-            } else {
-                if (SSL_CTX_use_PrivateKey_file(sslContext, tlsSettings.clientCertificateKey!!, SSL_FILETYPE_PEM) != 1) {
-                    throw Exception("Cannot load client's key file")
-                }
-            }
-            if (SSL_CTX_check_private_key(sslContext) != 1) {
-                throw Exception("Client's certificate and key don't match")
-            }
-
-            if (tlsSettings.clientCertificatePassword != null) {
-                SSL_CTX_set_default_passwd_cb_userdata(sslContext, tlsSettings.clientCertificatePassword!!.refTo(0))
-                SSL_CTX_set_default_passwd_cb(
-                    sslContext,
-                    staticCFunction { buf: CPointer<ByteVar>?, size: Int, _: Int, password: COpaquePointer? ->
-                        if (password == null) {
-                            0
-                        } else {
-                            val len = strlen(password.reinterpret<ByteVar>().toKString())
-                            if (size < len.toInt() + 1) {
-                                0
-                            } else {
-                                strcpy(buf, password.reinterpret<ByteVar>().toKString())
-                                len.toInt()
-                            }
-                        }
-                    })
-            }
-        }
-
-        val clientContext = SSL_new(sslContext)
-        if (clientContext == null) {
-            BIO_free(readBio)
-            BIO_free(writeBio)
-            throw IOException("Failed allocating read BIO")
-        }
-
-        SSL_set_verify(clientContext, SSL_VERIFY_PEER, null)
-
-        SSL_set_connect_state(clientContext)
-        SSL_set_bio(clientContext, readBio, writeBio)
-        context = clientContext
-        this.readBio = readBio
-        this.writeBio = writeBio
-    }
-
-    actual override val isInitFinished: Boolean
-        get() = SSL_is_init_finished(context) != 0
-
-    actual override val bioShouldRetry: Boolean
-        get() = BIO_test_flags(writeBio, BIO_FLAGS_SHOULD_RETRY) == 0
-
-    actual override fun write(buffer: CPointer<ByteVar>, length: Int): Int {
-        return SSL_write(context, buffer, length)
-    }
-
-    actual override fun read(buffer: CPointer<ByteVar>, length: Int): Int {
-        return SSL_read(context, buffer, length)
-    }
-
-    actual override fun bioRead(buffer: CPointer<ByteVar>, length: Int): Int {
-        return BIO_read(writeBio, buffer, length)
-    }
-
-    actual override fun bioWrite(buffer: CPointer<ByteVar>, length: Int): Int {
-        return BIO_write(readBio, buffer, length)
-    }
-
-    actual override fun getError(result: Int): Int {
-        return SSL_get_error(context, result)
-    }
-
-    actual override fun close() {
-        SSL_free(context)
-    }
-}
diff --git a/kmqtt-client/src/tvosSimulatorArm64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt b/kmqtt-client/src/tvosSimulatorArm64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
new file mode 100644
index 0000000000000000000000000000000000000000..35214674fc3ee31084da917a860a564c37d85155
--- /dev/null
+++ b/kmqtt-client/src/tvosSimulatorArm64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
@@ -0,0 +1,185 @@
+package io.github.davidepianca98
+
+import kotlinx.cinterop.*
+import openssl.*
+import platform.posix.getenv
+import platform.posix.strcpy
+import platform.posix.strlen
+import io.github.davidepianca98.socket.IOException
+import io.github.davidepianca98.socket.tls.TLSClientSettings
+import io.github.davidepianca98.socket.tls.TLSEngine
+
+internal actual class TLSClientEngine actual constructor(tlsSettings: TLSClientSettings) : TLSEngine {
+
+    private val context: CPointer<SSL>
+    private val readBio: CPointer<BIO>
+    private val writeBio: CPointer<BIO>
+
+    fun loadServerCertsFromString(context: CPointer<SSL_CTX>, certBuffer: String): Boolean {
+        val bio = BIO_new(BIO_s_mem())
+        BIO_puts(bio, certBuffer)
+
+        val inf = PEM_X509_INFO_read_bio(bio, null, null, null)
+
+        if (inf == null) {
+            BIO_free(bio)
+            return false
+        }
+
+        val ctx = SSL_CTX_get_cert_store(context);
+
+        var loaded = 0
+        for (i in 0..<sk_X509_INFO_num(inf)) {
+            val itmp = sk_X509_INFO_value(inf, i)
+            if (itmp != null && itmp.pointed.x509 != null) {
+                if (X509_STORE_add_cert(ctx, itmp.pointed.x509) != 1) {
+                    sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
+                        X509_INFO_free(buf)
+                    })
+                    BIO_free(bio)
+                    return false
+                }
+                loaded++
+            }
+        }
+
+        sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
+            X509_INFO_free(buf)
+        })
+        BIO_free(bio)
+
+        return loaded > 0
+    }
+
+    init {
+        val readBio = BIO_new(BIO_s_mem()) ?: throw IOException("Failed allocating read BIO")
+
+        val writeBio = BIO_new(BIO_s_mem())
+        if (writeBio == null) {
+            BIO_free(readBio)
+            throw IOException("Failed allocating read BIO")
+        }
+
+        val method = TLS_client_method()
+        val sslContext = SSL_CTX_new(method)!!
+
+        if (tlsSettings.serverCertificate != null) {
+            if (!loadServerCertsFromString(sslContext, tlsSettings.serverCertificate!!)) {
+                // Try file
+                if (SSL_CTX_load_verify_locations(sslContext, tlsSettings.serverCertificate, null) != 1) {
+                    throw Exception("Server certificate path not found")
+                }
+            }
+        } else {
+            if (!tlsSettings.checkServerCertificate) {
+                SSL_CTX_set_cert_verify_callback(
+                    sslContext,
+                    staticCFunction { buf: CPointer<X509_STORE_CTX>?, arg: COpaquePointer? ->
+                        1
+                    },
+                    null
+                )
+            } else {
+                if (SSL_CTX_load_verify_locations(sslContext, null, getenv(X509_get_default_cert_dir_env()?.toKString())?.toKString()) != 1) {
+                    throw Exception("Server certificate path not found")
+                }
+            }
+        }
+
+        if (tlsSettings.clientCertificate != null) {
+            val bio = BIO_new(BIO_s_mem())
+            BIO_puts(bio, tlsSettings.clientCertificate)
+            val certificate = PEM_read_bio_X509(bio, null, null, null)
+
+            if (certificate != null) {
+                if (SSL_CTX_use_certificate(sslContext, certificate) != 1) {
+                    throw Exception("Cannot load client's certificate")
+                }
+            } else {
+                // Load file
+                if (SSL_CTX_use_certificate_file(sslContext, tlsSettings.clientCertificate, SSL_FILETYPE_PEM) != 1) {
+                    throw Exception("Cannot load client's certificate file")
+                }
+            }
+
+            BIO_puts(bio, tlsSettings.clientCertificateKey)
+            val key = PEM_read_bio_PrivateKey(bio, null, null, null)
+            if (key != null) {
+                if (SSL_CTX_use_PrivateKey(sslContext, key) != 1) {
+                    throw Exception("Cannot load client's key")
+                }
+            } else {
+                if (SSL_CTX_use_PrivateKey_file(sslContext, tlsSettings.clientCertificateKey!!, SSL_FILETYPE_PEM) != 1) {
+                    throw Exception("Cannot load client's key file")
+                }
+            }
+            if (SSL_CTX_check_private_key(sslContext) != 1) {
+                throw Exception("Client's certificate and key don't match")
+            }
+
+            if (tlsSettings.clientCertificatePassword != null) {
+                SSL_CTX_set_default_passwd_cb_userdata(sslContext, tlsSettings.clientCertificatePassword!!.refTo(0))
+                SSL_CTX_set_default_passwd_cb(
+                    sslContext,
+                    staticCFunction { buf: CPointer<ByteVar>?, size: Int, _: Int, password: COpaquePointer? ->
+                        if (password == null) {
+                            0
+                        } else {
+                            val len = strlen(password.reinterpret<ByteVar>().toKString())
+                            if (size < len.toInt() + 1) {
+                                0
+                            } else {
+                                strcpy(buf, password.reinterpret<ByteVar>().toKString())
+                                len.toInt()
+                            }
+                        }
+                    })
+            }
+        }
+
+        val clientContext = SSL_new(sslContext)
+        if (clientContext == null) {
+            BIO_free(readBio)
+            BIO_free(writeBio)
+            throw IOException("Failed allocating read BIO")
+        }
+
+        SSL_set_verify(clientContext, SSL_VERIFY_PEER, null)
+
+        SSL_set_connect_state(clientContext)
+        SSL_set_bio(clientContext, readBio, writeBio)
+        context = clientContext
+        this.readBio = readBio
+        this.writeBio = writeBio
+    }
+
+    actual override val isInitFinished: Boolean
+        get() = SSL_is_init_finished(context) != 0
+
+    actual override val bioShouldRetry: Boolean
+        get() = BIO_test_flags(writeBio, BIO_FLAGS_SHOULD_RETRY) == 0
+
+    actual override fun write(buffer: CPointer<ByteVar>, length: Int): Int {
+        return SSL_write(context, buffer, length)
+    }
+
+    actual override fun read(buffer: CPointer<ByteVar>, length: Int): Int {
+        return SSL_read(context, buffer, length)
+    }
+
+    actual override fun bioRead(buffer: CPointer<ByteVar>, length: Int): Int {
+        return BIO_read(writeBio, buffer, length)
+    }
+
+    actual override fun bioWrite(buffer: CPointer<ByteVar>, length: Int): Int {
+        return BIO_write(readBio, buffer, length)
+    }
+
+    actual override fun getError(result: Int): Int {
+        return SSL_get_error(context, result)
+    }
+
+    actual override fun close() {
+        SSL_free(context)
+    }
+}
diff --git a/kmqtt-client/src/tvosX64Main/kotlin/TLSClientEngine.kt b/kmqtt-client/src/tvosX64Main/kotlin/TLSClientEngine.kt
deleted file mode 100644
index b180dea3fb966b42a150ca3e66decb194b6cd0f3..0000000000000000000000000000000000000000
--- a/kmqtt-client/src/tvosX64Main/kotlin/TLSClientEngine.kt
+++ /dev/null
@@ -1,183 +0,0 @@
-import kotlinx.cinterop.*
-import openssl.*
-import platform.posix.getenv
-import platform.posix.strcpy
-import platform.posix.strlen
-import socket.IOException
-import socket.tls.TLSClientSettings
-import socket.tls.TLSEngine
-
-internal actual class TLSClientEngine actual constructor(tlsSettings: TLSClientSettings) : TLSEngine {
-
-    private val context: CPointer<SSL>
-    private val readBio: CPointer<BIO>
-    private val writeBio: CPointer<BIO>
-
-    fun loadServerCertsFromString(context: CPointer<SSL_CTX>, certBuffer: String): Boolean {
-        val bio = BIO_new(BIO_s_mem())
-        BIO_puts(bio, certBuffer)
-
-        val inf = PEM_X509_INFO_read_bio(bio, null, null, null)
-
-        if (inf == null) {
-            BIO_free(bio)
-            return false
-        }
-
-        val ctx = SSL_CTX_get_cert_store(context);
-
-        var loaded = 0
-        for (i in 0..<sk_X509_INFO_num(inf)) {
-            val itmp = sk_X509_INFO_value(inf, i)
-            if (itmp != null && itmp.pointed.x509 != null) {
-                if (X509_STORE_add_cert(ctx, itmp.pointed.x509) != 1) {
-                    sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
-                        X509_INFO_free(buf)
-                    })
-                    BIO_free(bio)
-                    return false
-                }
-                loaded++
-            }
-        }
-
-        sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
-            X509_INFO_free(buf)
-        })
-        BIO_free(bio)
-
-        return loaded > 0
-    }
-
-    init {
-        val readBio = BIO_new(BIO_s_mem()) ?: throw IOException("Failed allocating read BIO")
-
-        val writeBio = BIO_new(BIO_s_mem())
-        if (writeBio == null) {
-            BIO_free(readBio)
-            throw IOException("Failed allocating read BIO")
-        }
-
-        val method = TLS_client_method()
-        val sslContext = SSL_CTX_new(method)!!
-
-        if (tlsSettings.serverCertificate != null) {
-            if (!loadServerCertsFromString(sslContext, tlsSettings.serverCertificate!!)) {
-                // Try file
-                if (SSL_CTX_load_verify_locations(sslContext, tlsSettings.serverCertificate, null) != 1) {
-                    throw Exception("Server certificate path not found")
-                }
-            }
-        } else {
-            if (!tlsSettings.checkServerCertificate) {
-                SSL_CTX_set_cert_verify_callback(
-                    sslContext,
-                    staticCFunction { buf: CPointer<X509_STORE_CTX>?, arg: COpaquePointer? ->
-                        1
-                    },
-                    null
-                )
-            } else {
-                if (SSL_CTX_load_verify_locations(sslContext, null, getenv(X509_get_default_cert_dir_env()?.toKString())?.toKString()) != 1) {
-                    throw Exception("Server certificate path not found")
-                }
-            }
-        }
-
-        if (tlsSettings.clientCertificate != null) {
-            val bio = BIO_new(BIO_s_mem())
-            BIO_puts(bio, tlsSettings.clientCertificate)
-            val certificate = PEM_read_bio_X509(bio, null, null, null)
-
-            if (certificate != null) {
-                if (SSL_CTX_use_certificate(sslContext, certificate) != 1) {
-                    throw Exception("Cannot load client's certificate")
-                }
-            } else {
-                // Load file
-                if (SSL_CTX_use_certificate_file(sslContext, tlsSettings.clientCertificate, SSL_FILETYPE_PEM) != 1) {
-                    throw Exception("Cannot load client's certificate file")
-                }
-            }
-
-            BIO_puts(bio, tlsSettings.clientCertificateKey)
-            val key = PEM_read_bio_PrivateKey(bio, null, null, null)
-            if (key != null) {
-                if (SSL_CTX_use_PrivateKey(sslContext, key) != 1) {
-                    throw Exception("Cannot load client's key")
-                }
-            } else {
-                if (SSL_CTX_use_PrivateKey_file(sslContext, tlsSettings.clientCertificateKey!!, SSL_FILETYPE_PEM) != 1) {
-                    throw Exception("Cannot load client's key file")
-                }
-            }
-            if (SSL_CTX_check_private_key(sslContext) != 1) {
-                throw Exception("Client's certificate and key don't match")
-            }
-
-            if (tlsSettings.clientCertificatePassword != null) {
-                SSL_CTX_set_default_passwd_cb_userdata(sslContext, tlsSettings.clientCertificatePassword!!.refTo(0))
-                SSL_CTX_set_default_passwd_cb(
-                    sslContext,
-                    staticCFunction { buf: CPointer<ByteVar>?, size: Int, _: Int, password: COpaquePointer? ->
-                        if (password == null) {
-                            0
-                        } else {
-                            val len = strlen(password.reinterpret<ByteVar>().toKString())
-                            if (size < len.toInt() + 1) {
-                                0
-                            } else {
-                                strcpy(buf, password.reinterpret<ByteVar>().toKString())
-                                len.toInt()
-                            }
-                        }
-                    })
-            }
-        }
-
-        val clientContext = SSL_new(sslContext)
-        if (clientContext == null) {
-            BIO_free(readBio)
-            BIO_free(writeBio)
-            throw IOException("Failed allocating read BIO")
-        }
-
-        SSL_set_verify(clientContext, SSL_VERIFY_PEER, null)
-
-        SSL_set_connect_state(clientContext)
-        SSL_set_bio(clientContext, readBio, writeBio)
-        context = clientContext
-        this.readBio = readBio
-        this.writeBio = writeBio
-    }
-
-    actual override val isInitFinished: Boolean
-        get() = SSL_is_init_finished(context) != 0
-
-    actual override val bioShouldRetry: Boolean
-        get() = BIO_test_flags(writeBio, BIO_FLAGS_SHOULD_RETRY) == 0
-
-    actual override fun write(buffer: CPointer<ByteVar>, length: Int): Int {
-        return SSL_write(context, buffer, length)
-    }
-
-    actual override fun read(buffer: CPointer<ByteVar>, length: Int): Int {
-        return SSL_read(context, buffer, length)
-    }
-
-    actual override fun bioRead(buffer: CPointer<ByteVar>, length: Int): Int {
-        return BIO_read(writeBio, buffer, length)
-    }
-
-    actual override fun bioWrite(buffer: CPointer<ByteVar>, length: Int): Int {
-        return BIO_write(readBio, buffer, length)
-    }
-
-    actual override fun getError(result: Int): Int {
-        return SSL_get_error(context, result)
-    }
-
-    actual override fun close() {
-        SSL_free(context)
-    }
-}
diff --git a/kmqtt-client/src/tvosX64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt b/kmqtt-client/src/tvosX64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
new file mode 100644
index 0000000000000000000000000000000000000000..35214674fc3ee31084da917a860a564c37d85155
--- /dev/null
+++ b/kmqtt-client/src/tvosX64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
@@ -0,0 +1,185 @@
+package io.github.davidepianca98
+
+import kotlinx.cinterop.*
+import openssl.*
+import platform.posix.getenv
+import platform.posix.strcpy
+import platform.posix.strlen
+import io.github.davidepianca98.socket.IOException
+import io.github.davidepianca98.socket.tls.TLSClientSettings
+import io.github.davidepianca98.socket.tls.TLSEngine
+
+internal actual class TLSClientEngine actual constructor(tlsSettings: TLSClientSettings) : TLSEngine {
+
+    private val context: CPointer<SSL>
+    private val readBio: CPointer<BIO>
+    private val writeBio: CPointer<BIO>
+
+    fun loadServerCertsFromString(context: CPointer<SSL_CTX>, certBuffer: String): Boolean {
+        val bio = BIO_new(BIO_s_mem())
+        BIO_puts(bio, certBuffer)
+
+        val inf = PEM_X509_INFO_read_bio(bio, null, null, null)
+
+        if (inf == null) {
+            BIO_free(bio)
+            return false
+        }
+
+        val ctx = SSL_CTX_get_cert_store(context);
+
+        var loaded = 0
+        for (i in 0..<sk_X509_INFO_num(inf)) {
+            val itmp = sk_X509_INFO_value(inf, i)
+            if (itmp != null && itmp.pointed.x509 != null) {
+                if (X509_STORE_add_cert(ctx, itmp.pointed.x509) != 1) {
+                    sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
+                        X509_INFO_free(buf)
+                    })
+                    BIO_free(bio)
+                    return false
+                }
+                loaded++
+            }
+        }
+
+        sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
+            X509_INFO_free(buf)
+        })
+        BIO_free(bio)
+
+        return loaded > 0
+    }
+
+    init {
+        val readBio = BIO_new(BIO_s_mem()) ?: throw IOException("Failed allocating read BIO")
+
+        val writeBio = BIO_new(BIO_s_mem())
+        if (writeBio == null) {
+            BIO_free(readBio)
+            throw IOException("Failed allocating read BIO")
+        }
+
+        val method = TLS_client_method()
+        val sslContext = SSL_CTX_new(method)!!
+
+        if (tlsSettings.serverCertificate != null) {
+            if (!loadServerCertsFromString(sslContext, tlsSettings.serverCertificate!!)) {
+                // Try file
+                if (SSL_CTX_load_verify_locations(sslContext, tlsSettings.serverCertificate, null) != 1) {
+                    throw Exception("Server certificate path not found")
+                }
+            }
+        } else {
+            if (!tlsSettings.checkServerCertificate) {
+                SSL_CTX_set_cert_verify_callback(
+                    sslContext,
+                    staticCFunction { buf: CPointer<X509_STORE_CTX>?, arg: COpaquePointer? ->
+                        1
+                    },
+                    null
+                )
+            } else {
+                if (SSL_CTX_load_verify_locations(sslContext, null, getenv(X509_get_default_cert_dir_env()?.toKString())?.toKString()) != 1) {
+                    throw Exception("Server certificate path not found")
+                }
+            }
+        }
+
+        if (tlsSettings.clientCertificate != null) {
+            val bio = BIO_new(BIO_s_mem())
+            BIO_puts(bio, tlsSettings.clientCertificate)
+            val certificate = PEM_read_bio_X509(bio, null, null, null)
+
+            if (certificate != null) {
+                if (SSL_CTX_use_certificate(sslContext, certificate) != 1) {
+                    throw Exception("Cannot load client's certificate")
+                }
+            } else {
+                // Load file
+                if (SSL_CTX_use_certificate_file(sslContext, tlsSettings.clientCertificate, SSL_FILETYPE_PEM) != 1) {
+                    throw Exception("Cannot load client's certificate file")
+                }
+            }
+
+            BIO_puts(bio, tlsSettings.clientCertificateKey)
+            val key = PEM_read_bio_PrivateKey(bio, null, null, null)
+            if (key != null) {
+                if (SSL_CTX_use_PrivateKey(sslContext, key) != 1) {
+                    throw Exception("Cannot load client's key")
+                }
+            } else {
+                if (SSL_CTX_use_PrivateKey_file(sslContext, tlsSettings.clientCertificateKey!!, SSL_FILETYPE_PEM) != 1) {
+                    throw Exception("Cannot load client's key file")
+                }
+            }
+            if (SSL_CTX_check_private_key(sslContext) != 1) {
+                throw Exception("Client's certificate and key don't match")
+            }
+
+            if (tlsSettings.clientCertificatePassword != null) {
+                SSL_CTX_set_default_passwd_cb_userdata(sslContext, tlsSettings.clientCertificatePassword!!.refTo(0))
+                SSL_CTX_set_default_passwd_cb(
+                    sslContext,
+                    staticCFunction { buf: CPointer<ByteVar>?, size: Int, _: Int, password: COpaquePointer? ->
+                        if (password == null) {
+                            0
+                        } else {
+                            val len = strlen(password.reinterpret<ByteVar>().toKString())
+                            if (size < len.toInt() + 1) {
+                                0
+                            } else {
+                                strcpy(buf, password.reinterpret<ByteVar>().toKString())
+                                len.toInt()
+                            }
+                        }
+                    })
+            }
+        }
+
+        val clientContext = SSL_new(sslContext)
+        if (clientContext == null) {
+            BIO_free(readBio)
+            BIO_free(writeBio)
+            throw IOException("Failed allocating read BIO")
+        }
+
+        SSL_set_verify(clientContext, SSL_VERIFY_PEER, null)
+
+        SSL_set_connect_state(clientContext)
+        SSL_set_bio(clientContext, readBio, writeBio)
+        context = clientContext
+        this.readBio = readBio
+        this.writeBio = writeBio
+    }
+
+    actual override val isInitFinished: Boolean
+        get() = SSL_is_init_finished(context) != 0
+
+    actual override val bioShouldRetry: Boolean
+        get() = BIO_test_flags(writeBio, BIO_FLAGS_SHOULD_RETRY) == 0
+
+    actual override fun write(buffer: CPointer<ByteVar>, length: Int): Int {
+        return SSL_write(context, buffer, length)
+    }
+
+    actual override fun read(buffer: CPointer<ByteVar>, length: Int): Int {
+        return SSL_read(context, buffer, length)
+    }
+
+    actual override fun bioRead(buffer: CPointer<ByteVar>, length: Int): Int {
+        return BIO_read(writeBio, buffer, length)
+    }
+
+    actual override fun bioWrite(buffer: CPointer<ByteVar>, length: Int): Int {
+        return BIO_write(readBio, buffer, length)
+    }
+
+    actual override fun getError(result: Int): Int {
+        return SSL_get_error(context, result)
+    }
+
+    actual override fun close() {
+        SSL_free(context)
+    }
+}
diff --git a/kmqtt-client/src/watchosArm32Main/kotlin/TLSClientEngine.kt b/kmqtt-client/src/watchosArm32Main/kotlin/TLSClientEngine.kt
deleted file mode 100644
index b180dea3fb966b42a150ca3e66decb194b6cd0f3..0000000000000000000000000000000000000000
--- a/kmqtt-client/src/watchosArm32Main/kotlin/TLSClientEngine.kt
+++ /dev/null
@@ -1,183 +0,0 @@
-import kotlinx.cinterop.*
-import openssl.*
-import platform.posix.getenv
-import platform.posix.strcpy
-import platform.posix.strlen
-import socket.IOException
-import socket.tls.TLSClientSettings
-import socket.tls.TLSEngine
-
-internal actual class TLSClientEngine actual constructor(tlsSettings: TLSClientSettings) : TLSEngine {
-
-    private val context: CPointer<SSL>
-    private val readBio: CPointer<BIO>
-    private val writeBio: CPointer<BIO>
-
-    fun loadServerCertsFromString(context: CPointer<SSL_CTX>, certBuffer: String): Boolean {
-        val bio = BIO_new(BIO_s_mem())
-        BIO_puts(bio, certBuffer)
-
-        val inf = PEM_X509_INFO_read_bio(bio, null, null, null)
-
-        if (inf == null) {
-            BIO_free(bio)
-            return false
-        }
-
-        val ctx = SSL_CTX_get_cert_store(context);
-
-        var loaded = 0
-        for (i in 0..<sk_X509_INFO_num(inf)) {
-            val itmp = sk_X509_INFO_value(inf, i)
-            if (itmp != null && itmp.pointed.x509 != null) {
-                if (X509_STORE_add_cert(ctx, itmp.pointed.x509) != 1) {
-                    sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
-                        X509_INFO_free(buf)
-                    })
-                    BIO_free(bio)
-                    return false
-                }
-                loaded++
-            }
-        }
-
-        sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
-            X509_INFO_free(buf)
-        })
-        BIO_free(bio)
-
-        return loaded > 0
-    }
-
-    init {
-        val readBio = BIO_new(BIO_s_mem()) ?: throw IOException("Failed allocating read BIO")
-
-        val writeBio = BIO_new(BIO_s_mem())
-        if (writeBio == null) {
-            BIO_free(readBio)
-            throw IOException("Failed allocating read BIO")
-        }
-
-        val method = TLS_client_method()
-        val sslContext = SSL_CTX_new(method)!!
-
-        if (tlsSettings.serverCertificate != null) {
-            if (!loadServerCertsFromString(sslContext, tlsSettings.serverCertificate!!)) {
-                // Try file
-                if (SSL_CTX_load_verify_locations(sslContext, tlsSettings.serverCertificate, null) != 1) {
-                    throw Exception("Server certificate path not found")
-                }
-            }
-        } else {
-            if (!tlsSettings.checkServerCertificate) {
-                SSL_CTX_set_cert_verify_callback(
-                    sslContext,
-                    staticCFunction { buf: CPointer<X509_STORE_CTX>?, arg: COpaquePointer? ->
-                        1
-                    },
-                    null
-                )
-            } else {
-                if (SSL_CTX_load_verify_locations(sslContext, null, getenv(X509_get_default_cert_dir_env()?.toKString())?.toKString()) != 1) {
-                    throw Exception("Server certificate path not found")
-                }
-            }
-        }
-
-        if (tlsSettings.clientCertificate != null) {
-            val bio = BIO_new(BIO_s_mem())
-            BIO_puts(bio, tlsSettings.clientCertificate)
-            val certificate = PEM_read_bio_X509(bio, null, null, null)
-
-            if (certificate != null) {
-                if (SSL_CTX_use_certificate(sslContext, certificate) != 1) {
-                    throw Exception("Cannot load client's certificate")
-                }
-            } else {
-                // Load file
-                if (SSL_CTX_use_certificate_file(sslContext, tlsSettings.clientCertificate, SSL_FILETYPE_PEM) != 1) {
-                    throw Exception("Cannot load client's certificate file")
-                }
-            }
-
-            BIO_puts(bio, tlsSettings.clientCertificateKey)
-            val key = PEM_read_bio_PrivateKey(bio, null, null, null)
-            if (key != null) {
-                if (SSL_CTX_use_PrivateKey(sslContext, key) != 1) {
-                    throw Exception("Cannot load client's key")
-                }
-            } else {
-                if (SSL_CTX_use_PrivateKey_file(sslContext, tlsSettings.clientCertificateKey!!, SSL_FILETYPE_PEM) != 1) {
-                    throw Exception("Cannot load client's key file")
-                }
-            }
-            if (SSL_CTX_check_private_key(sslContext) != 1) {
-                throw Exception("Client's certificate and key don't match")
-            }
-
-            if (tlsSettings.clientCertificatePassword != null) {
-                SSL_CTX_set_default_passwd_cb_userdata(sslContext, tlsSettings.clientCertificatePassword!!.refTo(0))
-                SSL_CTX_set_default_passwd_cb(
-                    sslContext,
-                    staticCFunction { buf: CPointer<ByteVar>?, size: Int, _: Int, password: COpaquePointer? ->
-                        if (password == null) {
-                            0
-                        } else {
-                            val len = strlen(password.reinterpret<ByteVar>().toKString())
-                            if (size < len.toInt() + 1) {
-                                0
-                            } else {
-                                strcpy(buf, password.reinterpret<ByteVar>().toKString())
-                                len.toInt()
-                            }
-                        }
-                    })
-            }
-        }
-
-        val clientContext = SSL_new(sslContext)
-        if (clientContext == null) {
-            BIO_free(readBio)
-            BIO_free(writeBio)
-            throw IOException("Failed allocating read BIO")
-        }
-
-        SSL_set_verify(clientContext, SSL_VERIFY_PEER, null)
-
-        SSL_set_connect_state(clientContext)
-        SSL_set_bio(clientContext, readBio, writeBio)
-        context = clientContext
-        this.readBio = readBio
-        this.writeBio = writeBio
-    }
-
-    actual override val isInitFinished: Boolean
-        get() = SSL_is_init_finished(context) != 0
-
-    actual override val bioShouldRetry: Boolean
-        get() = BIO_test_flags(writeBio, BIO_FLAGS_SHOULD_RETRY) == 0
-
-    actual override fun write(buffer: CPointer<ByteVar>, length: Int): Int {
-        return SSL_write(context, buffer, length)
-    }
-
-    actual override fun read(buffer: CPointer<ByteVar>, length: Int): Int {
-        return SSL_read(context, buffer, length)
-    }
-
-    actual override fun bioRead(buffer: CPointer<ByteVar>, length: Int): Int {
-        return BIO_read(writeBio, buffer, length)
-    }
-
-    actual override fun bioWrite(buffer: CPointer<ByteVar>, length: Int): Int {
-        return BIO_write(readBio, buffer, length)
-    }
-
-    actual override fun getError(result: Int): Int {
-        return SSL_get_error(context, result)
-    }
-
-    actual override fun close() {
-        SSL_free(context)
-    }
-}
diff --git a/kmqtt-client/src/watchosArm32Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt b/kmqtt-client/src/watchosArm32Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
new file mode 100644
index 0000000000000000000000000000000000000000..35214674fc3ee31084da917a860a564c37d85155
--- /dev/null
+++ b/kmqtt-client/src/watchosArm32Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
@@ -0,0 +1,185 @@
+package io.github.davidepianca98
+
+import kotlinx.cinterop.*
+import openssl.*
+import platform.posix.getenv
+import platform.posix.strcpy
+import platform.posix.strlen
+import io.github.davidepianca98.socket.IOException
+import io.github.davidepianca98.socket.tls.TLSClientSettings
+import io.github.davidepianca98.socket.tls.TLSEngine
+
+internal actual class TLSClientEngine actual constructor(tlsSettings: TLSClientSettings) : TLSEngine {
+
+    private val context: CPointer<SSL>
+    private val readBio: CPointer<BIO>
+    private val writeBio: CPointer<BIO>
+
+    fun loadServerCertsFromString(context: CPointer<SSL_CTX>, certBuffer: String): Boolean {
+        val bio = BIO_new(BIO_s_mem())
+        BIO_puts(bio, certBuffer)
+
+        val inf = PEM_X509_INFO_read_bio(bio, null, null, null)
+
+        if (inf == null) {
+            BIO_free(bio)
+            return false
+        }
+
+        val ctx = SSL_CTX_get_cert_store(context);
+
+        var loaded = 0
+        for (i in 0..<sk_X509_INFO_num(inf)) {
+            val itmp = sk_X509_INFO_value(inf, i)
+            if (itmp != null && itmp.pointed.x509 != null) {
+                if (X509_STORE_add_cert(ctx, itmp.pointed.x509) != 1) {
+                    sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
+                        X509_INFO_free(buf)
+                    })
+                    BIO_free(bio)
+                    return false
+                }
+                loaded++
+            }
+        }
+
+        sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
+            X509_INFO_free(buf)
+        })
+        BIO_free(bio)
+
+        return loaded > 0
+    }
+
+    init {
+        val readBio = BIO_new(BIO_s_mem()) ?: throw IOException("Failed allocating read BIO")
+
+        val writeBio = BIO_new(BIO_s_mem())
+        if (writeBio == null) {
+            BIO_free(readBio)
+            throw IOException("Failed allocating read BIO")
+        }
+
+        val method = TLS_client_method()
+        val sslContext = SSL_CTX_new(method)!!
+
+        if (tlsSettings.serverCertificate != null) {
+            if (!loadServerCertsFromString(sslContext, tlsSettings.serverCertificate!!)) {
+                // Try file
+                if (SSL_CTX_load_verify_locations(sslContext, tlsSettings.serverCertificate, null) != 1) {
+                    throw Exception("Server certificate path not found")
+                }
+            }
+        } else {
+            if (!tlsSettings.checkServerCertificate) {
+                SSL_CTX_set_cert_verify_callback(
+                    sslContext,
+                    staticCFunction { buf: CPointer<X509_STORE_CTX>?, arg: COpaquePointer? ->
+                        1
+                    },
+                    null
+                )
+            } else {
+                if (SSL_CTX_load_verify_locations(sslContext, null, getenv(X509_get_default_cert_dir_env()?.toKString())?.toKString()) != 1) {
+                    throw Exception("Server certificate path not found")
+                }
+            }
+        }
+
+        if (tlsSettings.clientCertificate != null) {
+            val bio = BIO_new(BIO_s_mem())
+            BIO_puts(bio, tlsSettings.clientCertificate)
+            val certificate = PEM_read_bio_X509(bio, null, null, null)
+
+            if (certificate != null) {
+                if (SSL_CTX_use_certificate(sslContext, certificate) != 1) {
+                    throw Exception("Cannot load client's certificate")
+                }
+            } else {
+                // Load file
+                if (SSL_CTX_use_certificate_file(sslContext, tlsSettings.clientCertificate, SSL_FILETYPE_PEM) != 1) {
+                    throw Exception("Cannot load client's certificate file")
+                }
+            }
+
+            BIO_puts(bio, tlsSettings.clientCertificateKey)
+            val key = PEM_read_bio_PrivateKey(bio, null, null, null)
+            if (key != null) {
+                if (SSL_CTX_use_PrivateKey(sslContext, key) != 1) {
+                    throw Exception("Cannot load client's key")
+                }
+            } else {
+                if (SSL_CTX_use_PrivateKey_file(sslContext, tlsSettings.clientCertificateKey!!, SSL_FILETYPE_PEM) != 1) {
+                    throw Exception("Cannot load client's key file")
+                }
+            }
+            if (SSL_CTX_check_private_key(sslContext) != 1) {
+                throw Exception("Client's certificate and key don't match")
+            }
+
+            if (tlsSettings.clientCertificatePassword != null) {
+                SSL_CTX_set_default_passwd_cb_userdata(sslContext, tlsSettings.clientCertificatePassword!!.refTo(0))
+                SSL_CTX_set_default_passwd_cb(
+                    sslContext,
+                    staticCFunction { buf: CPointer<ByteVar>?, size: Int, _: Int, password: COpaquePointer? ->
+                        if (password == null) {
+                            0
+                        } else {
+                            val len = strlen(password.reinterpret<ByteVar>().toKString())
+                            if (size < len.toInt() + 1) {
+                                0
+                            } else {
+                                strcpy(buf, password.reinterpret<ByteVar>().toKString())
+                                len.toInt()
+                            }
+                        }
+                    })
+            }
+        }
+
+        val clientContext = SSL_new(sslContext)
+        if (clientContext == null) {
+            BIO_free(readBio)
+            BIO_free(writeBio)
+            throw IOException("Failed allocating read BIO")
+        }
+
+        SSL_set_verify(clientContext, SSL_VERIFY_PEER, null)
+
+        SSL_set_connect_state(clientContext)
+        SSL_set_bio(clientContext, readBio, writeBio)
+        context = clientContext
+        this.readBio = readBio
+        this.writeBio = writeBio
+    }
+
+    actual override val isInitFinished: Boolean
+        get() = SSL_is_init_finished(context) != 0
+
+    actual override val bioShouldRetry: Boolean
+        get() = BIO_test_flags(writeBio, BIO_FLAGS_SHOULD_RETRY) == 0
+
+    actual override fun write(buffer: CPointer<ByteVar>, length: Int): Int {
+        return SSL_write(context, buffer, length)
+    }
+
+    actual override fun read(buffer: CPointer<ByteVar>, length: Int): Int {
+        return SSL_read(context, buffer, length)
+    }
+
+    actual override fun bioRead(buffer: CPointer<ByteVar>, length: Int): Int {
+        return BIO_read(writeBio, buffer, length)
+    }
+
+    actual override fun bioWrite(buffer: CPointer<ByteVar>, length: Int): Int {
+        return BIO_write(readBio, buffer, length)
+    }
+
+    actual override fun getError(result: Int): Int {
+        return SSL_get_error(context, result)
+    }
+
+    actual override fun close() {
+        SSL_free(context)
+    }
+}
diff --git a/kmqtt-client/src/watchosArm64Main/kotlin/TLSClientEngine.kt b/kmqtt-client/src/watchosArm64Main/kotlin/TLSClientEngine.kt
deleted file mode 100644
index b180dea3fb966b42a150ca3e66decb194b6cd0f3..0000000000000000000000000000000000000000
--- a/kmqtt-client/src/watchosArm64Main/kotlin/TLSClientEngine.kt
+++ /dev/null
@@ -1,183 +0,0 @@
-import kotlinx.cinterop.*
-import openssl.*
-import platform.posix.getenv
-import platform.posix.strcpy
-import platform.posix.strlen
-import socket.IOException
-import socket.tls.TLSClientSettings
-import socket.tls.TLSEngine
-
-internal actual class TLSClientEngine actual constructor(tlsSettings: TLSClientSettings) : TLSEngine {
-
-    private val context: CPointer<SSL>
-    private val readBio: CPointer<BIO>
-    private val writeBio: CPointer<BIO>
-
-    fun loadServerCertsFromString(context: CPointer<SSL_CTX>, certBuffer: String): Boolean {
-        val bio = BIO_new(BIO_s_mem())
-        BIO_puts(bio, certBuffer)
-
-        val inf = PEM_X509_INFO_read_bio(bio, null, null, null)
-
-        if (inf == null) {
-            BIO_free(bio)
-            return false
-        }
-
-        val ctx = SSL_CTX_get_cert_store(context);
-
-        var loaded = 0
-        for (i in 0..<sk_X509_INFO_num(inf)) {
-            val itmp = sk_X509_INFO_value(inf, i)
-            if (itmp != null && itmp.pointed.x509 != null) {
-                if (X509_STORE_add_cert(ctx, itmp.pointed.x509) != 1) {
-                    sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
-                        X509_INFO_free(buf)
-                    })
-                    BIO_free(bio)
-                    return false
-                }
-                loaded++
-            }
-        }
-
-        sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
-            X509_INFO_free(buf)
-        })
-        BIO_free(bio)
-
-        return loaded > 0
-    }
-
-    init {
-        val readBio = BIO_new(BIO_s_mem()) ?: throw IOException("Failed allocating read BIO")
-
-        val writeBio = BIO_new(BIO_s_mem())
-        if (writeBio == null) {
-            BIO_free(readBio)
-            throw IOException("Failed allocating read BIO")
-        }
-
-        val method = TLS_client_method()
-        val sslContext = SSL_CTX_new(method)!!
-
-        if (tlsSettings.serverCertificate != null) {
-            if (!loadServerCertsFromString(sslContext, tlsSettings.serverCertificate!!)) {
-                // Try file
-                if (SSL_CTX_load_verify_locations(sslContext, tlsSettings.serverCertificate, null) != 1) {
-                    throw Exception("Server certificate path not found")
-                }
-            }
-        } else {
-            if (!tlsSettings.checkServerCertificate) {
-                SSL_CTX_set_cert_verify_callback(
-                    sslContext,
-                    staticCFunction { buf: CPointer<X509_STORE_CTX>?, arg: COpaquePointer? ->
-                        1
-                    },
-                    null
-                )
-            } else {
-                if (SSL_CTX_load_verify_locations(sslContext, null, getenv(X509_get_default_cert_dir_env()?.toKString())?.toKString()) != 1) {
-                    throw Exception("Server certificate path not found")
-                }
-            }
-        }
-
-        if (tlsSettings.clientCertificate != null) {
-            val bio = BIO_new(BIO_s_mem())
-            BIO_puts(bio, tlsSettings.clientCertificate)
-            val certificate = PEM_read_bio_X509(bio, null, null, null)
-
-            if (certificate != null) {
-                if (SSL_CTX_use_certificate(sslContext, certificate) != 1) {
-                    throw Exception("Cannot load client's certificate")
-                }
-            } else {
-                // Load file
-                if (SSL_CTX_use_certificate_file(sslContext, tlsSettings.clientCertificate, SSL_FILETYPE_PEM) != 1) {
-                    throw Exception("Cannot load client's certificate file")
-                }
-            }
-
-            BIO_puts(bio, tlsSettings.clientCertificateKey)
-            val key = PEM_read_bio_PrivateKey(bio, null, null, null)
-            if (key != null) {
-                if (SSL_CTX_use_PrivateKey(sslContext, key) != 1) {
-                    throw Exception("Cannot load client's key")
-                }
-            } else {
-                if (SSL_CTX_use_PrivateKey_file(sslContext, tlsSettings.clientCertificateKey!!, SSL_FILETYPE_PEM) != 1) {
-                    throw Exception("Cannot load client's key file")
-                }
-            }
-            if (SSL_CTX_check_private_key(sslContext) != 1) {
-                throw Exception("Client's certificate and key don't match")
-            }
-
-            if (tlsSettings.clientCertificatePassword != null) {
-                SSL_CTX_set_default_passwd_cb_userdata(sslContext, tlsSettings.clientCertificatePassword!!.refTo(0))
-                SSL_CTX_set_default_passwd_cb(
-                    sslContext,
-                    staticCFunction { buf: CPointer<ByteVar>?, size: Int, _: Int, password: COpaquePointer? ->
-                        if (password == null) {
-                            0
-                        } else {
-                            val len = strlen(password.reinterpret<ByteVar>().toKString())
-                            if (size < len.toInt() + 1) {
-                                0
-                            } else {
-                                strcpy(buf, password.reinterpret<ByteVar>().toKString())
-                                len.toInt()
-                            }
-                        }
-                    })
-            }
-        }
-
-        val clientContext = SSL_new(sslContext)
-        if (clientContext == null) {
-            BIO_free(readBio)
-            BIO_free(writeBio)
-            throw IOException("Failed allocating read BIO")
-        }
-
-        SSL_set_verify(clientContext, SSL_VERIFY_PEER, null)
-
-        SSL_set_connect_state(clientContext)
-        SSL_set_bio(clientContext, readBio, writeBio)
-        context = clientContext
-        this.readBio = readBio
-        this.writeBio = writeBio
-    }
-
-    actual override val isInitFinished: Boolean
-        get() = SSL_is_init_finished(context) != 0
-
-    actual override val bioShouldRetry: Boolean
-        get() = BIO_test_flags(writeBio, BIO_FLAGS_SHOULD_RETRY) == 0
-
-    actual override fun write(buffer: CPointer<ByteVar>, length: Int): Int {
-        return SSL_write(context, buffer, length)
-    }
-
-    actual override fun read(buffer: CPointer<ByteVar>, length: Int): Int {
-        return SSL_read(context, buffer, length)
-    }
-
-    actual override fun bioRead(buffer: CPointer<ByteVar>, length: Int): Int {
-        return BIO_read(writeBio, buffer, length)
-    }
-
-    actual override fun bioWrite(buffer: CPointer<ByteVar>, length: Int): Int {
-        return BIO_write(readBio, buffer, length)
-    }
-
-    actual override fun getError(result: Int): Int {
-        return SSL_get_error(context, result)
-    }
-
-    actual override fun close() {
-        SSL_free(context)
-    }
-}
diff --git a/kmqtt-client/src/watchosArm64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt b/kmqtt-client/src/watchosArm64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
new file mode 100644
index 0000000000000000000000000000000000000000..35214674fc3ee31084da917a860a564c37d85155
--- /dev/null
+++ b/kmqtt-client/src/watchosArm64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
@@ -0,0 +1,185 @@
+package io.github.davidepianca98
+
+import kotlinx.cinterop.*
+import openssl.*
+import platform.posix.getenv
+import platform.posix.strcpy
+import platform.posix.strlen
+import io.github.davidepianca98.socket.IOException
+import io.github.davidepianca98.socket.tls.TLSClientSettings
+import io.github.davidepianca98.socket.tls.TLSEngine
+
+internal actual class TLSClientEngine actual constructor(tlsSettings: TLSClientSettings) : TLSEngine {
+
+    private val context: CPointer<SSL>
+    private val readBio: CPointer<BIO>
+    private val writeBio: CPointer<BIO>
+
+    fun loadServerCertsFromString(context: CPointer<SSL_CTX>, certBuffer: String): Boolean {
+        val bio = BIO_new(BIO_s_mem())
+        BIO_puts(bio, certBuffer)
+
+        val inf = PEM_X509_INFO_read_bio(bio, null, null, null)
+
+        if (inf == null) {
+            BIO_free(bio)
+            return false
+        }
+
+        val ctx = SSL_CTX_get_cert_store(context);
+
+        var loaded = 0
+        for (i in 0..<sk_X509_INFO_num(inf)) {
+            val itmp = sk_X509_INFO_value(inf, i)
+            if (itmp != null && itmp.pointed.x509 != null) {
+                if (X509_STORE_add_cert(ctx, itmp.pointed.x509) != 1) {
+                    sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
+                        X509_INFO_free(buf)
+                    })
+                    BIO_free(bio)
+                    return false
+                }
+                loaded++
+            }
+        }
+
+        sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
+            X509_INFO_free(buf)
+        })
+        BIO_free(bio)
+
+        return loaded > 0
+    }
+
+    init {
+        val readBio = BIO_new(BIO_s_mem()) ?: throw IOException("Failed allocating read BIO")
+
+        val writeBio = BIO_new(BIO_s_mem())
+        if (writeBio == null) {
+            BIO_free(readBio)
+            throw IOException("Failed allocating read BIO")
+        }
+
+        val method = TLS_client_method()
+        val sslContext = SSL_CTX_new(method)!!
+
+        if (tlsSettings.serverCertificate != null) {
+            if (!loadServerCertsFromString(sslContext, tlsSettings.serverCertificate!!)) {
+                // Try file
+                if (SSL_CTX_load_verify_locations(sslContext, tlsSettings.serverCertificate, null) != 1) {
+                    throw Exception("Server certificate path not found")
+                }
+            }
+        } else {
+            if (!tlsSettings.checkServerCertificate) {
+                SSL_CTX_set_cert_verify_callback(
+                    sslContext,
+                    staticCFunction { buf: CPointer<X509_STORE_CTX>?, arg: COpaquePointer? ->
+                        1
+                    },
+                    null
+                )
+            } else {
+                if (SSL_CTX_load_verify_locations(sslContext, null, getenv(X509_get_default_cert_dir_env()?.toKString())?.toKString()) != 1) {
+                    throw Exception("Server certificate path not found")
+                }
+            }
+        }
+
+        if (tlsSettings.clientCertificate != null) {
+            val bio = BIO_new(BIO_s_mem())
+            BIO_puts(bio, tlsSettings.clientCertificate)
+            val certificate = PEM_read_bio_X509(bio, null, null, null)
+
+            if (certificate != null) {
+                if (SSL_CTX_use_certificate(sslContext, certificate) != 1) {
+                    throw Exception("Cannot load client's certificate")
+                }
+            } else {
+                // Load file
+                if (SSL_CTX_use_certificate_file(sslContext, tlsSettings.clientCertificate, SSL_FILETYPE_PEM) != 1) {
+                    throw Exception("Cannot load client's certificate file")
+                }
+            }
+
+            BIO_puts(bio, tlsSettings.clientCertificateKey)
+            val key = PEM_read_bio_PrivateKey(bio, null, null, null)
+            if (key != null) {
+                if (SSL_CTX_use_PrivateKey(sslContext, key) != 1) {
+                    throw Exception("Cannot load client's key")
+                }
+            } else {
+                if (SSL_CTX_use_PrivateKey_file(sslContext, tlsSettings.clientCertificateKey!!, SSL_FILETYPE_PEM) != 1) {
+                    throw Exception("Cannot load client's key file")
+                }
+            }
+            if (SSL_CTX_check_private_key(sslContext) != 1) {
+                throw Exception("Client's certificate and key don't match")
+            }
+
+            if (tlsSettings.clientCertificatePassword != null) {
+                SSL_CTX_set_default_passwd_cb_userdata(sslContext, tlsSettings.clientCertificatePassword!!.refTo(0))
+                SSL_CTX_set_default_passwd_cb(
+                    sslContext,
+                    staticCFunction { buf: CPointer<ByteVar>?, size: Int, _: Int, password: COpaquePointer? ->
+                        if (password == null) {
+                            0
+                        } else {
+                            val len = strlen(password.reinterpret<ByteVar>().toKString())
+                            if (size < len.toInt() + 1) {
+                                0
+                            } else {
+                                strcpy(buf, password.reinterpret<ByteVar>().toKString())
+                                len.toInt()
+                            }
+                        }
+                    })
+            }
+        }
+
+        val clientContext = SSL_new(sslContext)
+        if (clientContext == null) {
+            BIO_free(readBio)
+            BIO_free(writeBio)
+            throw IOException("Failed allocating read BIO")
+        }
+
+        SSL_set_verify(clientContext, SSL_VERIFY_PEER, null)
+
+        SSL_set_connect_state(clientContext)
+        SSL_set_bio(clientContext, readBio, writeBio)
+        context = clientContext
+        this.readBio = readBio
+        this.writeBio = writeBio
+    }
+
+    actual override val isInitFinished: Boolean
+        get() = SSL_is_init_finished(context) != 0
+
+    actual override val bioShouldRetry: Boolean
+        get() = BIO_test_flags(writeBio, BIO_FLAGS_SHOULD_RETRY) == 0
+
+    actual override fun write(buffer: CPointer<ByteVar>, length: Int): Int {
+        return SSL_write(context, buffer, length)
+    }
+
+    actual override fun read(buffer: CPointer<ByteVar>, length: Int): Int {
+        return SSL_read(context, buffer, length)
+    }
+
+    actual override fun bioRead(buffer: CPointer<ByteVar>, length: Int): Int {
+        return BIO_read(writeBio, buffer, length)
+    }
+
+    actual override fun bioWrite(buffer: CPointer<ByteVar>, length: Int): Int {
+        return BIO_write(readBio, buffer, length)
+    }
+
+    actual override fun getError(result: Int): Int {
+        return SSL_get_error(context, result)
+    }
+
+    actual override fun close() {
+        SSL_free(context)
+    }
+}
diff --git a/kmqtt-client/src/watchosSimulatorArm64Main/kotlin/TLSClientEngine.kt b/kmqtt-client/src/watchosSimulatorArm64Main/kotlin/TLSClientEngine.kt
deleted file mode 100644
index b180dea3fb966b42a150ca3e66decb194b6cd0f3..0000000000000000000000000000000000000000
--- a/kmqtt-client/src/watchosSimulatorArm64Main/kotlin/TLSClientEngine.kt
+++ /dev/null
@@ -1,183 +0,0 @@
-import kotlinx.cinterop.*
-import openssl.*
-import platform.posix.getenv
-import platform.posix.strcpy
-import platform.posix.strlen
-import socket.IOException
-import socket.tls.TLSClientSettings
-import socket.tls.TLSEngine
-
-internal actual class TLSClientEngine actual constructor(tlsSettings: TLSClientSettings) : TLSEngine {
-
-    private val context: CPointer<SSL>
-    private val readBio: CPointer<BIO>
-    private val writeBio: CPointer<BIO>
-
-    fun loadServerCertsFromString(context: CPointer<SSL_CTX>, certBuffer: String): Boolean {
-        val bio = BIO_new(BIO_s_mem())
-        BIO_puts(bio, certBuffer)
-
-        val inf = PEM_X509_INFO_read_bio(bio, null, null, null)
-
-        if (inf == null) {
-            BIO_free(bio)
-            return false
-        }
-
-        val ctx = SSL_CTX_get_cert_store(context);
-
-        var loaded = 0
-        for (i in 0..<sk_X509_INFO_num(inf)) {
-            val itmp = sk_X509_INFO_value(inf, i)
-            if (itmp != null && itmp.pointed.x509 != null) {
-                if (X509_STORE_add_cert(ctx, itmp.pointed.x509) != 1) {
-                    sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
-                        X509_INFO_free(buf)
-                    })
-                    BIO_free(bio)
-                    return false
-                }
-                loaded++
-            }
-        }
-
-        sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
-            X509_INFO_free(buf)
-        })
-        BIO_free(bio)
-
-        return loaded > 0
-    }
-
-    init {
-        val readBio = BIO_new(BIO_s_mem()) ?: throw IOException("Failed allocating read BIO")
-
-        val writeBio = BIO_new(BIO_s_mem())
-        if (writeBio == null) {
-            BIO_free(readBio)
-            throw IOException("Failed allocating read BIO")
-        }
-
-        val method = TLS_client_method()
-        val sslContext = SSL_CTX_new(method)!!
-
-        if (tlsSettings.serverCertificate != null) {
-            if (!loadServerCertsFromString(sslContext, tlsSettings.serverCertificate!!)) {
-                // Try file
-                if (SSL_CTX_load_verify_locations(sslContext, tlsSettings.serverCertificate, null) != 1) {
-                    throw Exception("Server certificate path not found")
-                }
-            }
-        } else {
-            if (!tlsSettings.checkServerCertificate) {
-                SSL_CTX_set_cert_verify_callback(
-                    sslContext,
-                    staticCFunction { buf: CPointer<X509_STORE_CTX>?, arg: COpaquePointer? ->
-                        1
-                    },
-                    null
-                )
-            } else {
-                if (SSL_CTX_load_verify_locations(sslContext, null, getenv(X509_get_default_cert_dir_env()?.toKString())?.toKString()) != 1) {
-                    throw Exception("Server certificate path not found")
-                }
-            }
-        }
-
-        if (tlsSettings.clientCertificate != null) {
-            val bio = BIO_new(BIO_s_mem())
-            BIO_puts(bio, tlsSettings.clientCertificate)
-            val certificate = PEM_read_bio_X509(bio, null, null, null)
-
-            if (certificate != null) {
-                if (SSL_CTX_use_certificate(sslContext, certificate) != 1) {
-                    throw Exception("Cannot load client's certificate")
-                }
-            } else {
-                // Load file
-                if (SSL_CTX_use_certificate_file(sslContext, tlsSettings.clientCertificate, SSL_FILETYPE_PEM) != 1) {
-                    throw Exception("Cannot load client's certificate file")
-                }
-            }
-
-            BIO_puts(bio, tlsSettings.clientCertificateKey)
-            val key = PEM_read_bio_PrivateKey(bio, null, null, null)
-            if (key != null) {
-                if (SSL_CTX_use_PrivateKey(sslContext, key) != 1) {
-                    throw Exception("Cannot load client's key")
-                }
-            } else {
-                if (SSL_CTX_use_PrivateKey_file(sslContext, tlsSettings.clientCertificateKey!!, SSL_FILETYPE_PEM) != 1) {
-                    throw Exception("Cannot load client's key file")
-                }
-            }
-            if (SSL_CTX_check_private_key(sslContext) != 1) {
-                throw Exception("Client's certificate and key don't match")
-            }
-
-            if (tlsSettings.clientCertificatePassword != null) {
-                SSL_CTX_set_default_passwd_cb_userdata(sslContext, tlsSettings.clientCertificatePassword!!.refTo(0))
-                SSL_CTX_set_default_passwd_cb(
-                    sslContext,
-                    staticCFunction { buf: CPointer<ByteVar>?, size: Int, _: Int, password: COpaquePointer? ->
-                        if (password == null) {
-                            0
-                        } else {
-                            val len = strlen(password.reinterpret<ByteVar>().toKString())
-                            if (size < len.toInt() + 1) {
-                                0
-                            } else {
-                                strcpy(buf, password.reinterpret<ByteVar>().toKString())
-                                len.toInt()
-                            }
-                        }
-                    })
-            }
-        }
-
-        val clientContext = SSL_new(sslContext)
-        if (clientContext == null) {
-            BIO_free(readBio)
-            BIO_free(writeBio)
-            throw IOException("Failed allocating read BIO")
-        }
-
-        SSL_set_verify(clientContext, SSL_VERIFY_PEER, null)
-
-        SSL_set_connect_state(clientContext)
-        SSL_set_bio(clientContext, readBio, writeBio)
-        context = clientContext
-        this.readBio = readBio
-        this.writeBio = writeBio
-    }
-
-    actual override val isInitFinished: Boolean
-        get() = SSL_is_init_finished(context) != 0
-
-    actual override val bioShouldRetry: Boolean
-        get() = BIO_test_flags(writeBio, BIO_FLAGS_SHOULD_RETRY) == 0
-
-    actual override fun write(buffer: CPointer<ByteVar>, length: Int): Int {
-        return SSL_write(context, buffer, length)
-    }
-
-    actual override fun read(buffer: CPointer<ByteVar>, length: Int): Int {
-        return SSL_read(context, buffer, length)
-    }
-
-    actual override fun bioRead(buffer: CPointer<ByteVar>, length: Int): Int {
-        return BIO_read(writeBio, buffer, length)
-    }
-
-    actual override fun bioWrite(buffer: CPointer<ByteVar>, length: Int): Int {
-        return BIO_write(readBio, buffer, length)
-    }
-
-    actual override fun getError(result: Int): Int {
-        return SSL_get_error(context, result)
-    }
-
-    actual override fun close() {
-        SSL_free(context)
-    }
-}
diff --git a/kmqtt-client/src/watchosSimulatorArm64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt b/kmqtt-client/src/watchosSimulatorArm64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
new file mode 100644
index 0000000000000000000000000000000000000000..35214674fc3ee31084da917a860a564c37d85155
--- /dev/null
+++ b/kmqtt-client/src/watchosSimulatorArm64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
@@ -0,0 +1,185 @@
+package io.github.davidepianca98
+
+import kotlinx.cinterop.*
+import openssl.*
+import platform.posix.getenv
+import platform.posix.strcpy
+import platform.posix.strlen
+import io.github.davidepianca98.socket.IOException
+import io.github.davidepianca98.socket.tls.TLSClientSettings
+import io.github.davidepianca98.socket.tls.TLSEngine
+
+internal actual class TLSClientEngine actual constructor(tlsSettings: TLSClientSettings) : TLSEngine {
+
+    private val context: CPointer<SSL>
+    private val readBio: CPointer<BIO>
+    private val writeBio: CPointer<BIO>
+
+    fun loadServerCertsFromString(context: CPointer<SSL_CTX>, certBuffer: String): Boolean {
+        val bio = BIO_new(BIO_s_mem())
+        BIO_puts(bio, certBuffer)
+
+        val inf = PEM_X509_INFO_read_bio(bio, null, null, null)
+
+        if (inf == null) {
+            BIO_free(bio)
+            return false
+        }
+
+        val ctx = SSL_CTX_get_cert_store(context);
+
+        var loaded = 0
+        for (i in 0..<sk_X509_INFO_num(inf)) {
+            val itmp = sk_X509_INFO_value(inf, i)
+            if (itmp != null && itmp.pointed.x509 != null) {
+                if (X509_STORE_add_cert(ctx, itmp.pointed.x509) != 1) {
+                    sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
+                        X509_INFO_free(buf)
+                    })
+                    BIO_free(bio)
+                    return false
+                }
+                loaded++
+            }
+        }
+
+        sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
+            X509_INFO_free(buf)
+        })
+        BIO_free(bio)
+
+        return loaded > 0
+    }
+
+    init {
+        val readBio = BIO_new(BIO_s_mem()) ?: throw IOException("Failed allocating read BIO")
+
+        val writeBio = BIO_new(BIO_s_mem())
+        if (writeBio == null) {
+            BIO_free(readBio)
+            throw IOException("Failed allocating read BIO")
+        }
+
+        val method = TLS_client_method()
+        val sslContext = SSL_CTX_new(method)!!
+
+        if (tlsSettings.serverCertificate != null) {
+            if (!loadServerCertsFromString(sslContext, tlsSettings.serverCertificate!!)) {
+                // Try file
+                if (SSL_CTX_load_verify_locations(sslContext, tlsSettings.serverCertificate, null) != 1) {
+                    throw Exception("Server certificate path not found")
+                }
+            }
+        } else {
+            if (!tlsSettings.checkServerCertificate) {
+                SSL_CTX_set_cert_verify_callback(
+                    sslContext,
+                    staticCFunction { buf: CPointer<X509_STORE_CTX>?, arg: COpaquePointer? ->
+                        1
+                    },
+                    null
+                )
+            } else {
+                if (SSL_CTX_load_verify_locations(sslContext, null, getenv(X509_get_default_cert_dir_env()?.toKString())?.toKString()) != 1) {
+                    throw Exception("Server certificate path not found")
+                }
+            }
+        }
+
+        if (tlsSettings.clientCertificate != null) {
+            val bio = BIO_new(BIO_s_mem())
+            BIO_puts(bio, tlsSettings.clientCertificate)
+            val certificate = PEM_read_bio_X509(bio, null, null, null)
+
+            if (certificate != null) {
+                if (SSL_CTX_use_certificate(sslContext, certificate) != 1) {
+                    throw Exception("Cannot load client's certificate")
+                }
+            } else {
+                // Load file
+                if (SSL_CTX_use_certificate_file(sslContext, tlsSettings.clientCertificate, SSL_FILETYPE_PEM) != 1) {
+                    throw Exception("Cannot load client's certificate file")
+                }
+            }
+
+            BIO_puts(bio, tlsSettings.clientCertificateKey)
+            val key = PEM_read_bio_PrivateKey(bio, null, null, null)
+            if (key != null) {
+                if (SSL_CTX_use_PrivateKey(sslContext, key) != 1) {
+                    throw Exception("Cannot load client's key")
+                }
+            } else {
+                if (SSL_CTX_use_PrivateKey_file(sslContext, tlsSettings.clientCertificateKey!!, SSL_FILETYPE_PEM) != 1) {
+                    throw Exception("Cannot load client's key file")
+                }
+            }
+            if (SSL_CTX_check_private_key(sslContext) != 1) {
+                throw Exception("Client's certificate and key don't match")
+            }
+
+            if (tlsSettings.clientCertificatePassword != null) {
+                SSL_CTX_set_default_passwd_cb_userdata(sslContext, tlsSettings.clientCertificatePassword!!.refTo(0))
+                SSL_CTX_set_default_passwd_cb(
+                    sslContext,
+                    staticCFunction { buf: CPointer<ByteVar>?, size: Int, _: Int, password: COpaquePointer? ->
+                        if (password == null) {
+                            0
+                        } else {
+                            val len = strlen(password.reinterpret<ByteVar>().toKString())
+                            if (size < len.toInt() + 1) {
+                                0
+                            } else {
+                                strcpy(buf, password.reinterpret<ByteVar>().toKString())
+                                len.toInt()
+                            }
+                        }
+                    })
+            }
+        }
+
+        val clientContext = SSL_new(sslContext)
+        if (clientContext == null) {
+            BIO_free(readBio)
+            BIO_free(writeBio)
+            throw IOException("Failed allocating read BIO")
+        }
+
+        SSL_set_verify(clientContext, SSL_VERIFY_PEER, null)
+
+        SSL_set_connect_state(clientContext)
+        SSL_set_bio(clientContext, readBio, writeBio)
+        context = clientContext
+        this.readBio = readBio
+        this.writeBio = writeBio
+    }
+
+    actual override val isInitFinished: Boolean
+        get() = SSL_is_init_finished(context) != 0
+
+    actual override val bioShouldRetry: Boolean
+        get() = BIO_test_flags(writeBio, BIO_FLAGS_SHOULD_RETRY) == 0
+
+    actual override fun write(buffer: CPointer<ByteVar>, length: Int): Int {
+        return SSL_write(context, buffer, length)
+    }
+
+    actual override fun read(buffer: CPointer<ByteVar>, length: Int): Int {
+        return SSL_read(context, buffer, length)
+    }
+
+    actual override fun bioRead(buffer: CPointer<ByteVar>, length: Int): Int {
+        return BIO_read(writeBio, buffer, length)
+    }
+
+    actual override fun bioWrite(buffer: CPointer<ByteVar>, length: Int): Int {
+        return BIO_write(readBio, buffer, length)
+    }
+
+    actual override fun getError(result: Int): Int {
+        return SSL_get_error(context, result)
+    }
+
+    actual override fun close() {
+        SSL_free(context)
+    }
+}
diff --git a/kmqtt-client/src/watchosX64Main/kotlin/TLSClientEngine.kt b/kmqtt-client/src/watchosX64Main/kotlin/TLSClientEngine.kt
deleted file mode 100644
index b180dea3fb966b42a150ca3e66decb194b6cd0f3..0000000000000000000000000000000000000000
--- a/kmqtt-client/src/watchosX64Main/kotlin/TLSClientEngine.kt
+++ /dev/null
@@ -1,183 +0,0 @@
-import kotlinx.cinterop.*
-import openssl.*
-import platform.posix.getenv
-import platform.posix.strcpy
-import platform.posix.strlen
-import socket.IOException
-import socket.tls.TLSClientSettings
-import socket.tls.TLSEngine
-
-internal actual class TLSClientEngine actual constructor(tlsSettings: TLSClientSettings) : TLSEngine {
-
-    private val context: CPointer<SSL>
-    private val readBio: CPointer<BIO>
-    private val writeBio: CPointer<BIO>
-
-    fun loadServerCertsFromString(context: CPointer<SSL_CTX>, certBuffer: String): Boolean {
-        val bio = BIO_new(BIO_s_mem())
-        BIO_puts(bio, certBuffer)
-
-        val inf = PEM_X509_INFO_read_bio(bio, null, null, null)
-
-        if (inf == null) {
-            BIO_free(bio)
-            return false
-        }
-
-        val ctx = SSL_CTX_get_cert_store(context);
-
-        var loaded = 0
-        for (i in 0..<sk_X509_INFO_num(inf)) {
-            val itmp = sk_X509_INFO_value(inf, i)
-            if (itmp != null && itmp.pointed.x509 != null) {
-                if (X509_STORE_add_cert(ctx, itmp.pointed.x509) != 1) {
-                    sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
-                        X509_INFO_free(buf)
-                    })
-                    BIO_free(bio)
-                    return false
-                }
-                loaded++
-            }
-        }
-
-        sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
-            X509_INFO_free(buf)
-        })
-        BIO_free(bio)
-
-        return loaded > 0
-    }
-
-    init {
-        val readBio = BIO_new(BIO_s_mem()) ?: throw IOException("Failed allocating read BIO")
-
-        val writeBio = BIO_new(BIO_s_mem())
-        if (writeBio == null) {
-            BIO_free(readBio)
-            throw IOException("Failed allocating read BIO")
-        }
-
-        val method = TLS_client_method()
-        val sslContext = SSL_CTX_new(method)!!
-
-        if (tlsSettings.serverCertificate != null) {
-            if (!loadServerCertsFromString(sslContext, tlsSettings.serverCertificate!!)) {
-                // Try file
-                if (SSL_CTX_load_verify_locations(sslContext, tlsSettings.serverCertificate, null) != 1) {
-                    throw Exception("Server certificate path not found")
-                }
-            }
-        } else {
-            if (!tlsSettings.checkServerCertificate) {
-                SSL_CTX_set_cert_verify_callback(
-                    sslContext,
-                    staticCFunction { buf: CPointer<X509_STORE_CTX>?, arg: COpaquePointer? ->
-                        1
-                    },
-                    null
-                )
-            } else {
-                if (SSL_CTX_load_verify_locations(sslContext, null, getenv(X509_get_default_cert_dir_env()?.toKString())?.toKString()) != 1) {
-                    throw Exception("Server certificate path not found")
-                }
-            }
-        }
-
-        if (tlsSettings.clientCertificate != null) {
-            val bio = BIO_new(BIO_s_mem())
-            BIO_puts(bio, tlsSettings.clientCertificate)
-            val certificate = PEM_read_bio_X509(bio, null, null, null)
-
-            if (certificate != null) {
-                if (SSL_CTX_use_certificate(sslContext, certificate) != 1) {
-                    throw Exception("Cannot load client's certificate")
-                }
-            } else {
-                // Load file
-                if (SSL_CTX_use_certificate_file(sslContext, tlsSettings.clientCertificate, SSL_FILETYPE_PEM) != 1) {
-                    throw Exception("Cannot load client's certificate file")
-                }
-            }
-
-            BIO_puts(bio, tlsSettings.clientCertificateKey)
-            val key = PEM_read_bio_PrivateKey(bio, null, null, null)
-            if (key != null) {
-                if (SSL_CTX_use_PrivateKey(sslContext, key) != 1) {
-                    throw Exception("Cannot load client's key")
-                }
-            } else {
-                if (SSL_CTX_use_PrivateKey_file(sslContext, tlsSettings.clientCertificateKey!!, SSL_FILETYPE_PEM) != 1) {
-                    throw Exception("Cannot load client's key file")
-                }
-            }
-            if (SSL_CTX_check_private_key(sslContext) != 1) {
-                throw Exception("Client's certificate and key don't match")
-            }
-
-            if (tlsSettings.clientCertificatePassword != null) {
-                SSL_CTX_set_default_passwd_cb_userdata(sslContext, tlsSettings.clientCertificatePassword!!.refTo(0))
-                SSL_CTX_set_default_passwd_cb(
-                    sslContext,
-                    staticCFunction { buf: CPointer<ByteVar>?, size: Int, _: Int, password: COpaquePointer? ->
-                        if (password == null) {
-                            0
-                        } else {
-                            val len = strlen(password.reinterpret<ByteVar>().toKString())
-                            if (size < len.toInt() + 1) {
-                                0
-                            } else {
-                                strcpy(buf, password.reinterpret<ByteVar>().toKString())
-                                len.toInt()
-                            }
-                        }
-                    })
-            }
-        }
-
-        val clientContext = SSL_new(sslContext)
-        if (clientContext == null) {
-            BIO_free(readBio)
-            BIO_free(writeBio)
-            throw IOException("Failed allocating read BIO")
-        }
-
-        SSL_set_verify(clientContext, SSL_VERIFY_PEER, null)
-
-        SSL_set_connect_state(clientContext)
-        SSL_set_bio(clientContext, readBio, writeBio)
-        context = clientContext
-        this.readBio = readBio
-        this.writeBio = writeBio
-    }
-
-    actual override val isInitFinished: Boolean
-        get() = SSL_is_init_finished(context) != 0
-
-    actual override val bioShouldRetry: Boolean
-        get() = BIO_test_flags(writeBio, BIO_FLAGS_SHOULD_RETRY) == 0
-
-    actual override fun write(buffer: CPointer<ByteVar>, length: Int): Int {
-        return SSL_write(context, buffer, length)
-    }
-
-    actual override fun read(buffer: CPointer<ByteVar>, length: Int): Int {
-        return SSL_read(context, buffer, length)
-    }
-
-    actual override fun bioRead(buffer: CPointer<ByteVar>, length: Int): Int {
-        return BIO_read(writeBio, buffer, length)
-    }
-
-    actual override fun bioWrite(buffer: CPointer<ByteVar>, length: Int): Int {
-        return BIO_write(readBio, buffer, length)
-    }
-
-    actual override fun getError(result: Int): Int {
-        return SSL_get_error(context, result)
-    }
-
-    actual override fun close() {
-        SSL_free(context)
-    }
-}
diff --git a/kmqtt-client/src/watchosX64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt b/kmqtt-client/src/watchosX64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
new file mode 100644
index 0000000000000000000000000000000000000000..6a7fddc0f8df0ef7b503ac160160008318af81ec
--- /dev/null
+++ b/kmqtt-client/src/watchosX64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
@@ -0,0 +1,235 @@
+package io.github.davidepianca98
+
+import kotlinx.cinterop.ByteVar
+import kotlinx.cinterop.COpaquePointer
+import kotlinx.cinterop.CPointer
+import kotlinx.cinterop.pointed
+import kotlinx.cinterop.refTo
+import kotlinx.cinterop.reinterpret
+import kotlinx.cinterop.staticCFunction
+import kotlinx.cinterop.toKString
+import openssl.BIO_FLAGS_SHOULD_RETRY
+import openssl.BIO_free
+import openssl.BIO_new
+import openssl.BIO_puts
+import openssl.BIO_read
+import openssl.BIO_s_mem
+import openssl.BIO_test_flags
+import openssl.BIO_write
+import openssl.PEM_X509_INFO_read_bio
+import openssl.PEM_read_bio_PrivateKey
+import openssl.PEM_read_bio_X509
+import openssl.SSL_CTX_check_private_key
+import openssl.SSL_CTX_get_cert_store
+import openssl.SSL_CTX_load_verify_locations
+import openssl.SSL_CTX_new
+import openssl.SSL_CTX_set_cert_verify_callback
+import openssl.SSL_CTX_set_default_passwd_cb
+import openssl.SSL_CTX_set_default_passwd_cb_userdata
+import openssl.SSL_CTX_use_PrivateKey
+import openssl.SSL_CTX_use_PrivateKey_file
+import openssl.SSL_CTX_use_certificate
+import openssl.SSL_CTX_use_certificate_file
+import openssl.SSL_FILETYPE_PEM
+import openssl.SSL_VERIFY_PEER
+import openssl.SSL_free
+import openssl.SSL_get_error
+import openssl.SSL_is_init_finished
+import openssl.SSL_new
+import openssl.SSL_read
+import openssl.SSL_set_bio
+import openssl.SSL_set_connect_state
+import openssl.SSL_set_verify
+import openssl.SSL_write
+import openssl.TLS_client_method
+import openssl.X509_INFO_free
+import openssl.X509_STORE_add_cert
+import openssl.X509_get_default_cert_dir_env
+import openssl.sk_X509_INFO_num
+import openssl.sk_X509_INFO_pop_free
+import openssl.sk_X509_INFO_value
+import platform.posix.getenv
+import platform.posix.strcpy
+import platform.posix.strlen
+import io.github.davidepianca98.socket.IOException
+import io.github.davidepianca98.socket.tls.TLSClientSettings
+import io.github.davidepianca98.socket.tls.TLSEngine
+
+internal actual class TLSClientEngine actual constructor(tlsSettings: TLSClientSettings) : TLSEngine {
+
+    private val context: CPointer<SSL>
+    private val readBio: CPointer<BIO>
+    private val writeBio: CPointer<BIO>
+
+    fun loadServerCertsFromString(context: CPointer<SSL_CTX>, certBuffer: String): Boolean {
+        val bio = BIO_new(BIO_s_mem())
+        BIO_puts(bio, certBuffer)
+
+        val inf = PEM_X509_INFO_read_bio(bio, null, null, null)
+
+        if (inf == null) {
+            BIO_free(bio)
+            return false
+        }
+
+        val ctx = SSL_CTX_get_cert_store(context);
+
+        var loaded = 0
+        for (i in 0..<sk_X509_INFO_num(inf)) {
+            val itmp = sk_X509_INFO_value(inf, i)
+            if (itmp != null && itmp.pointed.x509 != null) {
+                if (X509_STORE_add_cert(ctx, itmp.pointed.x509) != 1) {
+                    sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
+                        X509_INFO_free(buf)
+                    })
+                    BIO_free(bio)
+                    return false
+                }
+                loaded++
+            }
+        }
+
+        sk_X509_INFO_pop_free(inf, staticCFunction { buf: CPointer<X509_INFO>? ->
+            X509_INFO_free(buf)
+        })
+        BIO_free(bio)
+
+        return loaded > 0
+    }
+
+    init {
+        val readBio = BIO_new(BIO_s_mem()) ?: throw IOException("Failed allocating read BIO")
+
+        val writeBio = BIO_new(BIO_s_mem())
+        if (writeBio == null) {
+            BIO_free(readBio)
+            throw IOException("Failed allocating read BIO")
+        }
+
+        val method = TLS_client_method()
+        val sslContext = SSL_CTX_new(method)!!
+
+        if (tlsSettings.serverCertificate != null) {
+            if (!loadServerCertsFromString(sslContext, tlsSettings.serverCertificate!!)) {
+                // Try file
+                if (SSL_CTX_load_verify_locations(sslContext, tlsSettings.serverCertificate, null) != 1) {
+                    throw Exception("Server certificate path not found")
+                }
+            }
+        } else {
+            if (!tlsSettings.checkServerCertificate) {
+                SSL_CTX_set_cert_verify_callback(
+                    sslContext,
+                    staticCFunction { buf: CPointer<X509_STORE_CTX>?, arg: COpaquePointer? ->
+                        1
+                    },
+                    null
+                )
+            } else {
+                if (SSL_CTX_load_verify_locations(
+                        sslContext,
+                        null,
+                        getenv(X509_get_default_cert_dir_env()?.toKString())?.toKString()
+                    ) != 1) {
+                    throw Exception("Server certificate path not found")
+                }
+            }
+        }
+
+        if (tlsSettings.clientCertificate != null) {
+            val bio = BIO_new(BIO_s_mem())
+            BIO_puts(bio, tlsSettings.clientCertificate)
+            val certificate = PEM_read_bio_X509(bio, null, null, null)
+
+            if (certificate != null) {
+                if (SSL_CTX_use_certificate(sslContext, certificate) != 1) {
+                    throw Exception("Cannot load client's certificate")
+                }
+            } else {
+                // Load file
+                if (SSL_CTX_use_certificate_file(sslContext, tlsSettings.clientCertificate, SSL_FILETYPE_PEM) != 1) {
+                    throw Exception("Cannot load client's certificate file")
+                }
+            }
+
+            BIO_puts(bio, tlsSettings.clientCertificateKey)
+            val key = PEM_read_bio_PrivateKey(bio, null, null, null)
+            if (key != null) {
+                if (SSL_CTX_use_PrivateKey(sslContext, key) != 1) {
+                    throw Exception("Cannot load client's key")
+                }
+            } else {
+                if (SSL_CTX_use_PrivateKey_file(sslContext, tlsSettings.clientCertificateKey!!, SSL_FILETYPE_PEM) != 1) {
+                    throw Exception("Cannot load client's key file")
+                }
+            }
+            if (SSL_CTX_check_private_key(sslContext) != 1) {
+                throw Exception("Client's certificate and key don't match")
+            }
+
+            if (tlsSettings.clientCertificatePassword != null) {
+                SSL_CTX_set_default_passwd_cb_userdata(sslContext, tlsSettings.clientCertificatePassword!!.refTo(0))
+                SSL_CTX_set_default_passwd_cb(
+                    sslContext,
+                    staticCFunction { buf: CPointer<ByteVar>?, size: Int, _: Int, password: COpaquePointer? ->
+                        if (password == null) {
+                            0
+                        } else {
+                            val len = strlen(password.reinterpret<ByteVar>().toKString())
+                            if (size < len.toInt() + 1) {
+                                0
+                            } else {
+                                strcpy(buf, password.reinterpret<ByteVar>().toKString())
+                                len.toInt()
+                            }
+                        }
+                    })
+            }
+        }
+
+        val clientContext = SSL_new(sslContext)
+        if (clientContext == null) {
+            BIO_free(readBio)
+            BIO_free(writeBio)
+            throw IOException("Failed allocating read BIO")
+        }
+
+        SSL_set_verify(clientContext, SSL_VERIFY_PEER, null)
+
+        SSL_set_connect_state(clientContext)
+        SSL_set_bio(clientContext, readBio, writeBio)
+        context = clientContext
+        this.readBio = readBio
+        this.writeBio = writeBio
+    }
+
+    actual override val isInitFinished: Boolean
+        get() = SSL_is_init_finished(context) != 0
+
+    actual override val bioShouldRetry: Boolean
+        get() = BIO_test_flags(writeBio, BIO_FLAGS_SHOULD_RETRY) == 0
+
+    actual override fun write(buffer: CPointer<ByteVar>, length: Int): Int {
+        return SSL_write(context, buffer, length)
+    }
+
+    actual override fun read(buffer: CPointer<ByteVar>, length: Int): Int {
+        return SSL_read(context, buffer, length)
+    }
+
+    actual override fun bioRead(buffer: CPointer<ByteVar>, length: Int): Int {
+        return BIO_read(writeBio, buffer, length)
+    }
+
+    actual override fun bioWrite(buffer: CPointer<ByteVar>, length: Int): Int {
+        return BIO_write(readBio, buffer, length)
+    }
+
+    actual override fun getError(result: Int): Int {
+        return SSL_get_error(context, result)
+    }
+
+    actual override fun close() {
+        SSL_free(context)
+    }
+}
\ No newline at end of file
diff --git a/kmqtt-common/src/commonMain/kotlin/CommonUtils.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/CommonUtils.kt
similarity index 98%
rename from kmqtt-common/src/commonMain/kotlin/CommonUtils.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/CommonUtils.kt
index a1556954ddac8e566217c52be0e3284eba7470b6..574cac1ec627c2559a48099617281146eef6a74b 100644
--- a/kmqtt-common/src/commonMain/kotlin/CommonUtils.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/CommonUtils.kt
@@ -1,4 +1,6 @@
-import socket.streams.ByteArrayOutputStream
+package io.github.davidepianca98
+
+import io.github.davidepianca98.socket.streams.ByteArrayOutputStream
 import kotlin.random.Random
 
 public expect fun currentTimeMillis(): Long
diff --git a/kmqtt-common/src/commonMain/kotlin/IgnoreJs.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/IgnoreJs.kt
similarity index 74%
rename from kmqtt-common/src/commonMain/kotlin/IgnoreJs.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/IgnoreJs.kt
index 74df6db6bc35a9b158ec9e4421b38bd8811f7fa3..e4f9ff598814fc6d201bfeac8e75749241953c37 100644
--- a/kmqtt-common/src/commonMain/kotlin/IgnoreJs.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/IgnoreJs.kt
@@ -1,2 +1,4 @@
+package io.github.davidepianca98
+
 @Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION)
 public expect annotation class IgnoreJs()
\ No newline at end of file
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/MQTTCurrentPacket.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/MQTTCurrentPacket.kt
similarity index 65%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/MQTTCurrentPacket.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/MQTTCurrentPacket.kt
index 89d2a597ebe78240844350af19c9878ef91cf6c3..d6987e5e31d644345ce72712e92f5f38d06d990a 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/MQTTCurrentPacket.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/MQTTCurrentPacket.kt
@@ -1,13 +1,42 @@
-package mqtt
+package io.github.davidepianca98.mqtt
 
-import mqtt.packets.MQTTControlPacketType
-import mqtt.packets.MQTTDeserializer
-import mqtt.packets.MQTTPacket
-import mqtt.packets.mqttv4.*
-import mqtt.packets.mqttv5.*
-import socket.streams.DynamicByteBuffer
-import socket.streams.EOFException
-import socket.streams.decodeVariableByteInteger
+import io.github.davidepianca98.mqtt.packets.MQTTControlPacketType
+import io.github.davidepianca98.mqtt.packets.MQTTDeserializer
+import io.github.davidepianca98.mqtt.packets.MQTTPacket
+import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Connack
+import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Connect
+import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Disconnect
+import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Pingreq
+import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Pingresp
+import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Puback
+import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Pubcomp
+import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Publish
+import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Pubrec
+import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Pubrel
+import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Suback
+import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Subscribe
+import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Unsuback
+import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Unsubscribe
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Auth
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Connack
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Connect
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Disconnect
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Pingreq
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Pingresp
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Puback
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Pubcomp
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Publish
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Pubrec
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Pubrel
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Suback
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Subscribe
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Unsuback
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Unsubscribe
+import io.github.davidepianca98.mqtt.packets.mqttv5.ReasonCode
+import io.github.davidepianca98.socket.streams.DynamicByteBuffer
+import io.github.davidepianca98.socket.streams.EOFException
+import io.github.davidepianca98.socket.streams.decodeVariableByteInteger
+import kotlin.collections.plusAssign
 
 public class MQTTCurrentPacket(
     private val maximumPacketSize: UInt,
@@ -25,7 +54,7 @@ public class MQTTCurrentPacket(
             while (true) {
                 packets += readPacket()
             }
-        } catch (e: EOFException) {
+        } catch (_: EOFException) {
             currentReceivedData.clearReadCounter()
         }
         return packets
@@ -37,7 +66,7 @@ public class MQTTCurrentPacket(
         val flags = byte1 and 0b1111u
 
         val type =
-            MQTTControlPacketType.valueOf(mqttControlPacketType) ?: throw MQTTException(ReasonCode.PROTOCOL_ERROR)
+            MQTTControlPacketType.Companion.valueOf(mqttControlPacketType) ?: throw MQTTException(ReasonCode.PROTOCOL_ERROR)
 
         val remainingLength = currentReceivedData.decodeVariableByteInteger().toInt()
 
@@ -104,7 +133,7 @@ public class MQTTCurrentPacket(
                 try {
                     mqttVersion = MQTTVersion.MQTT5
                     parseMQTT5Packet(type, flags, data)
-                } catch (e: MQTTException) {
+                } catch (_: MQTTException) {
                     mqttVersion = MQTTVersion.MQTT3_1_1
                     parseMQTT4Packet(type, flags, data)
                 }
diff --git a/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/MQTTException.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/MQTTException.kt
new file mode 100644
index 0000000000000000000000000000000000000000..eaf4504eed1e97c04ec7b9ca5318a145128009f4
--- /dev/null
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/MQTTException.kt
@@ -0,0 +1,5 @@
+package io.github.davidepianca98.mqtt
+
+import io.github.davidepianca98.mqtt.packets.mqttv5.ReasonCode
+
+public class MQTTException(public val reasonCode: ReasonCode) : Exception(reasonCode.toString())
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/MQTTVersion.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/MQTTVersion.kt
similarity index 69%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/MQTTVersion.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/MQTTVersion.kt
index f1f9b552b15db4b4765b75dba66011f7794b80a6..dfda197d9c0307a8f77c5c908a8b27bd701c818f 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/MQTTVersion.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/MQTTVersion.kt
@@ -1,4 +1,4 @@
-package mqtt
+package io.github.davidepianca98.mqtt
 
 public enum class MQTTVersion(public val value: Int) {
     MQTT3_1_1(4),
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/Subscription.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/Subscription.kt
similarity index 81%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/Subscription.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/Subscription.kt
index 4d35a37d7d8d2f5b0fc74a8cd6810f2ada6c20ed..9445601cb3922e47e3377c89caa861a9be424b50 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/Subscription.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/Subscription.kt
@@ -1,6 +1,6 @@
-package mqtt
+package io.github.davidepianca98.mqtt
 
-import mqtt.packets.mqttv5.SubscriptionOptions
+import io.github.davidepianca98.mqtt.packets.mqttv5.SubscriptionOptions
 
 public data class Subscription(
     public val topicFilter: String,
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/TopicUtils.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/TopicUtils.kt
similarity index 98%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/TopicUtils.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/TopicUtils.kt
index 88e4b58206e5ac19cfc1c394b7111320e5fd581e..c5da6be368ae9a2ce2bd23815cc92b64a07605b9 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/TopicUtils.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/TopicUtils.kt
@@ -1,4 +1,4 @@
-package mqtt
+package io.github.davidepianca98.mqtt
 
 public fun String.containsWildcard(): Boolean {
     return this.contains("#") || this.contains("+")
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/ConnectAcknowledgeFlags.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/ConnectAcknowledgeFlags.kt
similarity index 62%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/ConnectAcknowledgeFlags.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/ConnectAcknowledgeFlags.kt
index e3056937ca18aed0f7b2e0b827a9a1d4fa4b5e47..a362ba31205aa7e25f9cc720192172a124f8cfc3 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/ConnectAcknowledgeFlags.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/ConnectAcknowledgeFlags.kt
@@ -1,3 +1,3 @@
-package mqtt.packets
+package io.github.davidepianca98.mqtt.packets
 
 public data class ConnectAcknowledgeFlags(val sessionPresentFlag: Boolean)
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/ConnectFlags.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/ConnectFlags.kt
similarity index 91%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/ConnectFlags.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/ConnectFlags.kt
index afe23bf1d47a50d6a5f8af5eb512b421c129b26d..8fdd28ac5d571bc0811fe81702cd7b115803d050 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/ConnectFlags.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/ConnectFlags.kt
@@ -1,7 +1,7 @@
-package mqtt.packets
+package io.github.davidepianca98.mqtt.packets
 
-import mqtt.MQTTException
-import mqtt.packets.mqttv5.ReasonCode
+import io.github.davidepianca98.mqtt.MQTTException
+import io.github.davidepianca98.mqtt.packets.mqttv5.ReasonCode
 
 public data class ConnectFlags(
     val userNameFlag: Boolean,
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/MQTTControlPacketType.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/MQTTControlPacketType.kt
similarity index 91%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/MQTTControlPacketType.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/MQTTControlPacketType.kt
index 57b6dcec0c5bd73d8160afcbe2532177028d1125..cfcb9b712a1a320705ff73a91bb39e073bef1268 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/MQTTControlPacketType.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/MQTTControlPacketType.kt
@@ -1,4 +1,4 @@
-package mqtt.packets
+package io.github.davidepianca98.mqtt.packets
 
 public enum class MQTTControlPacketType(public val value: Int) {
     Reserved(0),
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/MQTTDeserializer.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/MQTTDeserializer.kt
similarity index 94%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/MQTTDeserializer.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/MQTTDeserializer.kt
index 92310b4725abf639d1b822757ebe002ce603613f..85abe2cdff5329476621564d30d709f2bb0f4332 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/MQTTDeserializer.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/MQTTDeserializer.kt
@@ -1,13 +1,13 @@
-package mqtt.packets
+package io.github.davidepianca98.mqtt.packets
 
-import mqtt.MQTTException
-import mqtt.containsWildcard
-import mqtt.packets.mqttv5.MQTT5Properties
-import mqtt.packets.mqttv5.Property
-import mqtt.packets.mqttv5.ReasonCode
-import socket.streams.ByteArrayInputStream
-import socket.streams.decodeVariableByteInteger
-import validateUTF8String
+import io.github.davidepianca98.mqtt.MQTTException
+import io.github.davidepianca98.mqtt.containsWildcard
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Properties
+import io.github.davidepianca98.mqtt.packets.mqttv5.Property
+import io.github.davidepianca98.mqtt.packets.mqttv5.ReasonCode
+import io.github.davidepianca98.socket.streams.ByteArrayInputStream
+import io.github.davidepianca98.socket.streams.decodeVariableByteInteger
+import io.github.davidepianca98.validateUTF8String
 
 internal interface MQTTDeserializer {
 
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/MQTTPacket.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/MQTTPacket.kt
similarity index 52%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/MQTTPacket.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/MQTTPacket.kt
index 59e66fda2d7646b0f9037d0171dc19d7afb23a84..ccb482b6b54e3a1ff8cbe0a8bf5899fb0dd31e9d 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/MQTTPacket.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/MQTTPacket.kt
@@ -1,6 +1,6 @@
-package mqtt.packets
+package io.github.davidepianca98.mqtt.packets
 
-import mqtt.packets.mqttv5.MQTTSerializer
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTTSerializer
 
 public interface MQTTPacket : MQTTSerializer {
 
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/Qos.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/Qos.kt
similarity index 65%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/Qos.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/Qos.kt
index 46e3c686a531193d0d4b288a15f81af4ecfca93f..4b3b5062bbc59f16305440567c610dac02c56eaa 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/Qos.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/Qos.kt
@@ -1,4 +1,4 @@
-package mqtt.packets
+package io.github.davidepianca98.mqtt.packets
 
 public enum class Qos(public val value: Int) {
     AT_MOST_ONCE(0),
@@ -6,7 +6,7 @@ public enum class Qos(public val value: Int) {
     EXACTLY_ONCE(2);
 
     public companion object {
-        public fun valueOf(value: Int): Qos? = values().firstOrNull { it.value == value }
+        public fun valueOf(value: Int): Qos? = entries.firstOrNull { it.value == value }
 
         public fun min(qos1: Qos, qos2: Qos): Qos = valueOf(kotlin.math.min(qos1.value, qos2.value))!!
     }
diff --git a/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTAuth.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTAuth.kt
new file mode 100644
index 0000000000000000000000000000000000000000..2735a4882277b2fb9aed41fcbd826f2ad965f5af
--- /dev/null
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTAuth.kt
@@ -0,0 +1,5 @@
+package io.github.davidepianca98.mqtt.packets.mqtt
+
+import io.github.davidepianca98.mqtt.packets.MQTTPacket
+
+public abstract class MQTTAuth : MQTTPacket
diff --git a/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTConnack.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTConnack.kt
new file mode 100644
index 0000000000000000000000000000000000000000..bf99c9b64fdcb7ded1374c2d20c36e4d75eb7d3f
--- /dev/null
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTConnack.kt
@@ -0,0 +1,6 @@
+package io.github.davidepianca98.mqtt.packets.mqtt
+
+import io.github.davidepianca98.mqtt.packets.ConnectAcknowledgeFlags
+import io.github.davidepianca98.mqtt.packets.MQTTPacket
+
+public abstract class MQTTConnack(public val connectAcknowledgeFlags: ConnectAcknowledgeFlags) : MQTTPacket
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTConnect.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTConnect.kt
similarity index 71%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTConnect.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTConnect.kt
index e2423bd7863ba71b511d9af6617e16ce446524e6..e031c221f1e181d6fcea3722d77acf5f7eaf7e78 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTConnect.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTConnect.kt
@@ -1,7 +1,7 @@
-package mqtt.packets.mqtt
+package io.github.davidepianca98.mqtt.packets.mqtt
 
-import mqtt.packets.ConnectFlags
-import mqtt.packets.MQTTPacket
+import io.github.davidepianca98.mqtt.packets.ConnectFlags
+import io.github.davidepianca98.mqtt.packets.MQTTPacket
 
 public abstract class MQTTConnect(
     public val protocolName: String,
diff --git a/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTDisconnect.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTDisconnect.kt
new file mode 100644
index 0000000000000000000000000000000000000000..3b34fffd51aeed129d3c40f48a0036535ad1cfb5
--- /dev/null
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTDisconnect.kt
@@ -0,0 +1,5 @@
+package io.github.davidepianca98.mqtt.packets.mqtt
+
+import io.github.davidepianca98.mqtt.packets.MQTTPacket
+
+public abstract class MQTTDisconnect : MQTTPacket
diff --git a/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTPingreq.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTPingreq.kt
new file mode 100644
index 0000000000000000000000000000000000000000..0ef0a64bcea2a7b8d9d2a6cd5caf3bf71eb930b5
--- /dev/null
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTPingreq.kt
@@ -0,0 +1,5 @@
+package io.github.davidepianca98.mqtt.packets.mqtt
+
+import io.github.davidepianca98.mqtt.packets.MQTTPacket
+
+public abstract class MQTTPingreq : MQTTPacket
diff --git a/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTPingresp.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTPingresp.kt
new file mode 100644
index 0000000000000000000000000000000000000000..f0233d9c1515d43035de0b86b33aabccddf368f5
--- /dev/null
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTPingresp.kt
@@ -0,0 +1,5 @@
+package io.github.davidepianca98.mqtt.packets.mqtt
+
+import io.github.davidepianca98.mqtt.packets.MQTTPacket
+
+public abstract class MQTTPingresp : MQTTPacket
diff --git a/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTPuback.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTPuback.kt
new file mode 100644
index 0000000000000000000000000000000000000000..86034132005088453bb0e934c07a001c7c0f7c2f
--- /dev/null
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTPuback.kt
@@ -0,0 +1,5 @@
+package io.github.davidepianca98.mqtt.packets.mqtt
+
+import io.github.davidepianca98.mqtt.packets.MQTTPacket
+
+public abstract class MQTTPuback(public val packetId: UInt) : MQTTPacket
diff --git a/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTPubcomp.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTPubcomp.kt
new file mode 100644
index 0000000000000000000000000000000000000000..dac0e73454ac43b362ace5060a05cabfc8c5637b
--- /dev/null
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTPubcomp.kt
@@ -0,0 +1,5 @@
+package io.github.davidepianca98.mqtt.packets.mqtt
+
+import io.github.davidepianca98.mqtt.packets.MQTTPacket
+
+public abstract class MQTTPubcomp(public val packetId: UInt) : MQTTPacket
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTPublish.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTPublish.kt
similarity index 72%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTPublish.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTPublish.kt
index 3c5d6328f5cb66d4afeb81319a1b3daac3fbc907..f46e24d2a7baa9e6428589a18384537a3628b469 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTPublish.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTPublish.kt
@@ -1,13 +1,13 @@
-package mqtt.packets.mqtt
-
-import currentTimeMillis
-import mqtt.packets.MQTTControlPacketType
-import mqtt.packets.MQTTPacket
-import mqtt.packets.Qos
-import mqtt.packets.mqttv4.MQTT4Publish
-import mqtt.packets.mqttv5.MQTT5Publish
-import socket.streams.ByteArrayInputStream
-import socket.streams.decodeVariableByteInteger
+package io.github.davidepianca98.mqtt.packets.mqtt
+
+import io.github.davidepianca98.currentTimeMillis
+import io.github.davidepianca98.mqtt.packets.MQTTControlPacketType
+import io.github.davidepianca98.mqtt.packets.MQTTPacket
+import io.github.davidepianca98.mqtt.packets.Qos
+import io.github.davidepianca98.mqtt.packets.mqttv4.MQTT4Publish
+import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Publish
+import io.github.davidepianca98.socket.streams.ByteArrayInputStream
+import io.github.davidepianca98.socket.streams.decodeVariableByteInteger
 
 public abstract class MQTTPublish(
     public val retain: Boolean,
diff --git a/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTPubrec.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTPubrec.kt
new file mode 100644
index 0000000000000000000000000000000000000000..b3530260d3cbc90bfc8f0d1ac2802591cedc47c5
--- /dev/null
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTPubrec.kt
@@ -0,0 +1,5 @@
+package io.github.davidepianca98.mqtt.packets.mqtt
+
+import io.github.davidepianca98.mqtt.packets.MQTTPacket
+
+public abstract class MQTTPubrec(public val packetId: UInt) : MQTTPacket
diff --git a/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTPubrel.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTPubrel.kt
new file mode 100644
index 0000000000000000000000000000000000000000..6f937372810bb742eb56ab8045705992fc68ec6b
--- /dev/null
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTPubrel.kt
@@ -0,0 +1,5 @@
+package io.github.davidepianca98.mqtt.packets.mqtt
+
+import io.github.davidepianca98.mqtt.packets.MQTTPacket
+
+public abstract class MQTTPubrel(public val packetId: UInt) : MQTTPacket
diff --git a/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTSuback.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTSuback.kt
new file mode 100644
index 0000000000000000000000000000000000000000..a62fd0f2b63c5b42ca338e86074c718d49368aeb
--- /dev/null
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTSuback.kt
@@ -0,0 +1,5 @@
+package io.github.davidepianca98.mqtt.packets.mqtt
+
+import io.github.davidepianca98.mqtt.packets.MQTTPacket
+
+public abstract class MQTTSuback(public val packetIdentifier: UInt) : MQTTPacket
diff --git a/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTSubscribe.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTSubscribe.kt
new file mode 100644
index 0000000000000000000000000000000000000000..f2b0fc3efa8050036530309c308c30e0d6f5ce37
--- /dev/null
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTSubscribe.kt
@@ -0,0 +1,9 @@
+package io.github.davidepianca98.mqtt.packets.mqtt
+
+import io.github.davidepianca98.mqtt.Subscription
+import io.github.davidepianca98.mqtt.packets.MQTTPacket
+
+public abstract class MQTTSubscribe(
+    public val packetIdentifier: UInt,
+    public val subscriptions: List<Subscription>
+) : MQTTPacket
diff --git a/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTUnsuback.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTUnsuback.kt
new file mode 100644
index 0000000000000000000000000000000000000000..22a2e5537062c943d785cf6496d0a22c9b707d7b
--- /dev/null
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTUnsuback.kt
@@ -0,0 +1,5 @@
+package io.github.davidepianca98.mqtt.packets.mqtt
+
+import io.github.davidepianca98.mqtt.packets.MQTTPacket
+
+public abstract class MQTTUnsuback(public val packetIdentifier: UInt) : MQTTPacket
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTUnsubscribe.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTUnsubscribe.kt
similarity index 56%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTUnsubscribe.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTUnsubscribe.kt
index 0332f01266a8a07b0384133668d028b04fff270c..367f1acc441cffc98f9750a88b4e1208d292314e 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTUnsubscribe.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTUnsubscribe.kt
@@ -1,6 +1,6 @@
-package mqtt.packets.mqtt
+package io.github.davidepianca98.mqtt.packets.mqtt
 
-import mqtt.packets.MQTTPacket
+import io.github.davidepianca98.mqtt.packets.MQTTPacket
 
 public abstract class MQTTUnsubscribe(
     public val packetIdentifier: UInt,
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/ConnectReturnCode.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/ConnectReturnCode.kt
similarity index 87%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/ConnectReturnCode.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/ConnectReturnCode.kt
index 647dc7f80c9326d2b5cdf09ff219cdb78dbd6453..8346c226a76091a54e5da7d80e50462f9212ab3f 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/ConnectReturnCode.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/ConnectReturnCode.kt
@@ -1,4 +1,4 @@
-package mqtt.packets.mqttv4
+package io.github.davidepianca98.mqtt.packets.mqttv4
 
 public enum class ConnectReturnCode(public val value: Int) {
     CONNECTION_ACCEPTED(0),
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Connack.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Connack.kt
similarity index 72%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Connack.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Connack.kt
index e7805ef223848a7af18253b56cbcc9654ab81194..74dbc0251929117339904617611dd87d19c03abd 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Connack.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Connack.kt
@@ -1,13 +1,13 @@
-package mqtt.packets.mqttv4
-
-import mqtt.MQTTException
-import mqtt.packets.ConnectAcknowledgeFlags
-import mqtt.packets.MQTTControlPacketType
-import mqtt.packets.MQTTDeserializer
-import mqtt.packets.mqtt.MQTTConnack
-import mqtt.packets.mqttv5.ReasonCode
-import socket.streams.ByteArrayInputStream
-import socket.streams.ByteArrayOutputStream
+package io.github.davidepianca98.mqtt.packets.mqttv4
+
+import io.github.davidepianca98.mqtt.MQTTException
+import io.github.davidepianca98.mqtt.packets.ConnectAcknowledgeFlags
+import io.github.davidepianca98.mqtt.packets.MQTTControlPacketType
+import io.github.davidepianca98.mqtt.packets.MQTTDeserializer
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTConnack
+import io.github.davidepianca98.mqtt.packets.mqttv5.ReasonCode
+import io.github.davidepianca98.socket.streams.ByteArrayInputStream
+import io.github.davidepianca98.socket.streams.ByteArrayOutputStream
 
 public class MQTT4Connack(
     connectAcknowledgeFlags: ConnectAcknowledgeFlags,
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Connect.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Connect.kt
similarity index 83%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Connect.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Connect.kt
index 27e7f258805a80021d4109a5e4d1d0acc1c02527..64d7067e33acddce3be8cc17432b55ec0d5b2558 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Connect.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Connect.kt
@@ -1,14 +1,14 @@
-package mqtt.packets.mqttv4
+package io.github.davidepianca98.mqtt.packets.mqttv4
 
-import mqtt.MQTTException
-import mqtt.MQTTVersion
-import mqtt.packets.ConnectFlags
-import mqtt.packets.MQTTControlPacketType
-import mqtt.packets.MQTTDeserializer
-import mqtt.packets.mqtt.MQTTConnect
-import mqtt.packets.mqttv5.ReasonCode
-import socket.streams.ByteArrayInputStream
-import socket.streams.ByteArrayOutputStream
+import io.github.davidepianca98.mqtt.MQTTException
+import io.github.davidepianca98.mqtt.MQTTVersion
+import io.github.davidepianca98.mqtt.packets.ConnectFlags
+import io.github.davidepianca98.mqtt.packets.MQTTControlPacketType
+import io.github.davidepianca98.mqtt.packets.MQTTDeserializer
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTConnect
+import io.github.davidepianca98.mqtt.packets.mqttv5.ReasonCode
+import io.github.davidepianca98.socket.streams.ByteArrayInputStream
+import io.github.davidepianca98.socket.streams.ByteArrayOutputStream
 
 
 public class MQTT4Connect(
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Disconnect.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Disconnect.kt
similarity index 57%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Disconnect.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Disconnect.kt
index 66f30784f5a2b3ea9195de04b795ea9bd764394c..878aeb4778b21dd289e4f30997b68bb78495318b 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Disconnect.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Disconnect.kt
@@ -1,9 +1,9 @@
-package mqtt.packets.mqttv4
+package io.github.davidepianca98.mqtt.packets.mqttv4
 
-import mqtt.packets.MQTTControlPacketType
-import mqtt.packets.MQTTDeserializer
-import mqtt.packets.mqtt.MQTTDisconnect
-import socket.streams.ByteArrayOutputStream
+import io.github.davidepianca98.mqtt.packets.MQTTControlPacketType
+import io.github.davidepianca98.mqtt.packets.MQTTDeserializer
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTDisconnect
+import io.github.davidepianca98.socket.streams.ByteArrayOutputStream
 
 public class MQTT4Disconnect : MQTTDisconnect(), MQTT4Packet {
 
diff --git a/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Packet.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Packet.kt
new file mode 100644
index 0000000000000000000000000000000000000000..d89f63839679cf5d5044de60b920f5ea003c7b67
--- /dev/null
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Packet.kt
@@ -0,0 +1,5 @@
+package io.github.davidepianca98.mqtt.packets.mqttv4
+
+import io.github.davidepianca98.mqtt.packets.MQTTPacket
+
+public interface MQTT4Packet : MQTTPacket
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Pingreq.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Pingreq.kt
similarity index 57%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Pingreq.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Pingreq.kt
index 82e2730e8fc7c4eb8a7cf752801799ac70e22a56..bd38e72ab1ec26964e5640e36cec1bec0f9519c5 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Pingreq.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Pingreq.kt
@@ -1,9 +1,9 @@
-package mqtt.packets.mqttv4
+package io.github.davidepianca98.mqtt.packets.mqttv4
 
-import mqtt.packets.MQTTControlPacketType
-import mqtt.packets.MQTTDeserializer
-import mqtt.packets.mqtt.MQTTPingreq
-import socket.streams.ByteArrayOutputStream
+import io.github.davidepianca98.mqtt.packets.MQTTControlPacketType
+import io.github.davidepianca98.mqtt.packets.MQTTDeserializer
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTPingreq
+import io.github.davidepianca98.socket.streams.ByteArrayOutputStream
 
 public class MQTT4Pingreq : MQTTPingreq(), MQTT4Packet {
 
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Pingresp.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Pingresp.kt
similarity index 57%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Pingresp.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Pingresp.kt
index 0f8a0c7c9943cd86ab43c4978b3f40e9d6284d55..a7a0cea30d5b918904fe840a9b469593550114dd 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Pingresp.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Pingresp.kt
@@ -1,9 +1,9 @@
-package mqtt.packets.mqttv4
+package io.github.davidepianca98.mqtt.packets.mqttv4
 
-import mqtt.packets.MQTTControlPacketType
-import mqtt.packets.MQTTDeserializer
-import mqtt.packets.mqtt.MQTTPingresp
-import socket.streams.ByteArrayOutputStream
+import io.github.davidepianca98.mqtt.packets.MQTTControlPacketType
+import io.github.davidepianca98.mqtt.packets.MQTTDeserializer
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTPingresp
+import io.github.davidepianca98.socket.streams.ByteArrayOutputStream
 
 public class MQTT4Pingresp : MQTTPingresp(), MQTT4Packet {
 
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Puback.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Puback.kt
similarity index 62%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Puback.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Puback.kt
index 4a9ba66d26cf935ab21a413c7aba791e8f9e5b79..0d4e06b933829af3cd313a163a00b677f1860380 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Puback.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Puback.kt
@@ -1,10 +1,10 @@
-package mqtt.packets.mqttv4
+package io.github.davidepianca98.mqtt.packets.mqttv4
 
-import mqtt.packets.MQTTControlPacketType
-import mqtt.packets.MQTTDeserializer
-import mqtt.packets.mqtt.MQTTPuback
-import socket.streams.ByteArrayInputStream
-import socket.streams.ByteArrayOutputStream
+import io.github.davidepianca98.mqtt.packets.MQTTControlPacketType
+import io.github.davidepianca98.mqtt.packets.MQTTDeserializer
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTPuback
+import io.github.davidepianca98.socket.streams.ByteArrayInputStream
+import io.github.davidepianca98.socket.streams.ByteArrayOutputStream
 
 public class MQTT4Puback(
     packetId: UInt
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Pubcomp.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Pubcomp.kt
similarity index 63%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Pubcomp.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Pubcomp.kt
index 7606989bbe7fc2125468412282fd61dd5a267b1e..cfa9d728db0fb740e0d89d510c99842b2fefa0fe 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Pubcomp.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Pubcomp.kt
@@ -1,10 +1,10 @@
-package mqtt.packets.mqttv4
+package io.github.davidepianca98.mqtt.packets.mqttv4
 
-import mqtt.packets.MQTTControlPacketType
-import mqtt.packets.MQTTDeserializer
-import mqtt.packets.mqtt.MQTTPubcomp
-import socket.streams.ByteArrayInputStream
-import socket.streams.ByteArrayOutputStream
+import io.github.davidepianca98.mqtt.packets.MQTTControlPacketType
+import io.github.davidepianca98.mqtt.packets.MQTTDeserializer
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTPubcomp
+import io.github.davidepianca98.socket.streams.ByteArrayInputStream
+import io.github.davidepianca98.socket.streams.ByteArrayOutputStream
 
 public class MQTT4Pubcomp(
     packetId: UInt
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Publish.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Publish.kt
similarity index 78%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Publish.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Publish.kt
index f28ec77993ca3839321e876bda6e0fab2e477548..bfa883927dc8350e715d5287b51ee95aeaf5ea1b 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Publish.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Publish.kt
@@ -1,15 +1,15 @@
-package mqtt.packets.mqttv4
-
-import currentTimeMillis
-import mqtt.MQTTException
-import mqtt.containsWildcard
-import mqtt.packets.MQTTControlPacketType
-import mqtt.packets.MQTTDeserializer
-import mqtt.packets.Qos
-import mqtt.packets.mqtt.MQTTPublish
-import mqtt.packets.mqttv5.ReasonCode
-import socket.streams.ByteArrayInputStream
-import socket.streams.ByteArrayOutputStream
+package io.github.davidepianca98.mqtt.packets.mqttv4
+
+import io.github.davidepianca98.currentTimeMillis
+import io.github.davidepianca98.mqtt.MQTTException
+import io.github.davidepianca98.mqtt.containsWildcard
+import io.github.davidepianca98.mqtt.packets.MQTTControlPacketType
+import io.github.davidepianca98.mqtt.packets.MQTTDeserializer
+import io.github.davidepianca98.mqtt.packets.Qos
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTPublish
+import io.github.davidepianca98.mqtt.packets.mqttv5.ReasonCode
+import io.github.davidepianca98.socket.streams.ByteArrayInputStream
+import io.github.davidepianca98.socket.streams.ByteArrayOutputStream
 
 public class MQTT4Publish(
     retain: Boolean,
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Pubrec.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Pubrec.kt
similarity index 62%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Pubrec.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Pubrec.kt
index 1ce6844aa3a3f4edd559b4103da90e8c1740ab24..2059561260dee1c0476efae574d8427ea6a897f2 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Pubrec.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Pubrec.kt
@@ -1,10 +1,10 @@
-package mqtt.packets.mqttv4
+package io.github.davidepianca98.mqtt.packets.mqttv4
 
-import mqtt.packets.MQTTControlPacketType
-import mqtt.packets.MQTTDeserializer
-import mqtt.packets.mqtt.MQTTPubrec
-import socket.streams.ByteArrayInputStream
-import socket.streams.ByteArrayOutputStream
+import io.github.davidepianca98.mqtt.packets.MQTTControlPacketType
+import io.github.davidepianca98.mqtt.packets.MQTTDeserializer
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTPubrec
+import io.github.davidepianca98.socket.streams.ByteArrayInputStream
+import io.github.davidepianca98.socket.streams.ByteArrayOutputStream
 
 public class MQTT4Pubrec(
     packetId: UInt
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Pubrel.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Pubrel.kt
similarity index 65%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Pubrel.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Pubrel.kt
index f9df2b85aeb35aa70579dcf89cfda6e8cecd9fc2..b04dd644a1e9b961ef36cf5c2c9395378c8375cf 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Pubrel.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Pubrel.kt
@@ -1,12 +1,12 @@
-package mqtt.packets.mqttv4
-
-import mqtt.MQTTException
-import mqtt.packets.MQTTControlPacketType
-import mqtt.packets.MQTTDeserializer
-import mqtt.packets.mqtt.MQTTPubrel
-import mqtt.packets.mqttv5.ReasonCode
-import socket.streams.ByteArrayInputStream
-import socket.streams.ByteArrayOutputStream
+package io.github.davidepianca98.mqtt.packets.mqttv4
+
+import io.github.davidepianca98.mqtt.MQTTException
+import io.github.davidepianca98.mqtt.packets.MQTTControlPacketType
+import io.github.davidepianca98.mqtt.packets.MQTTDeserializer
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTPubrel
+import io.github.davidepianca98.mqtt.packets.mqttv5.ReasonCode
+import io.github.davidepianca98.socket.streams.ByteArrayInputStream
+import io.github.davidepianca98.socket.streams.ByteArrayOutputStream
 
 public class MQTT4Pubrel(
     packetId: UInt
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Suback.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Suback.kt
similarity index 70%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Suback.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Suback.kt
index 45cf1d5114d87768c0dea51dc30654445b6da747..6df7f08c1ae95f372411e01fd10a3a723aa63a3f 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Suback.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Suback.kt
@@ -1,12 +1,12 @@
-package mqtt.packets.mqttv4
-
-import mqtt.MQTTException
-import mqtt.packets.MQTTControlPacketType
-import mqtt.packets.MQTTDeserializer
-import mqtt.packets.mqtt.MQTTSuback
-import mqtt.packets.mqttv5.ReasonCode
-import socket.streams.ByteArrayInputStream
-import socket.streams.ByteArrayOutputStream
+package io.github.davidepianca98.mqtt.packets.mqttv4
+
+import io.github.davidepianca98.mqtt.MQTTException
+import io.github.davidepianca98.mqtt.packets.MQTTControlPacketType
+import io.github.davidepianca98.mqtt.packets.MQTTDeserializer
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTSuback
+import io.github.davidepianca98.mqtt.packets.mqttv5.ReasonCode
+import io.github.davidepianca98.socket.streams.ByteArrayInputStream
+import io.github.davidepianca98.socket.streams.ByteArrayOutputStream
 
 public class MQTT4Suback(
     packetIdentifier: UInt,
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Subscribe.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Subscribe.kt
similarity index 76%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Subscribe.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Subscribe.kt
index c64ba5a5fae494313870b165ac66eb0ddbe39d79..af2d735599786dd4f42b590409d22f88a66e7167 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Subscribe.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Subscribe.kt
@@ -1,15 +1,15 @@
-package mqtt.packets.mqttv4
+package io.github.davidepianca98.mqtt.packets.mqttv4
 
-import mqtt.MQTTException
-import mqtt.Subscription
-import mqtt.packets.MQTTControlPacketType
-import mqtt.packets.MQTTDeserializer
-import mqtt.packets.Qos
-import mqtt.packets.mqtt.MQTTSubscribe
-import mqtt.packets.mqttv5.ReasonCode
-import mqtt.packets.mqttv5.SubscriptionOptions
-import socket.streams.ByteArrayInputStream
-import socket.streams.ByteArrayOutputStream
+import io.github.davidepianca98.mqtt.MQTTException
+import io.github.davidepianca98.mqtt.Subscription
+import io.github.davidepianca98.mqtt.packets.MQTTControlPacketType
+import io.github.davidepianca98.mqtt.packets.MQTTDeserializer
+import io.github.davidepianca98.mqtt.packets.Qos
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTSubscribe
+import io.github.davidepianca98.mqtt.packets.mqttv5.ReasonCode
+import io.github.davidepianca98.mqtt.packets.mqttv5.SubscriptionOptions
+import io.github.davidepianca98.socket.streams.ByteArrayInputStream
+import io.github.davidepianca98.socket.streams.ByteArrayOutputStream
 
 public class MQTT4Subscribe(
     packetIdentifier: UInt,
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Unsuback.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Unsuback.kt
similarity index 64%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Unsuback.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Unsuback.kt
index cad93c2de2e35646a6df5d1a6a11a1059eee91fa..da3d2631dc84a63716f15b1bf1cfaf2903a8e36e 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Unsuback.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Unsuback.kt
@@ -1,10 +1,10 @@
-package mqtt.packets.mqttv4
+package io.github.davidepianca98.mqtt.packets.mqttv4
 
-import mqtt.packets.MQTTControlPacketType
-import mqtt.packets.MQTTDeserializer
-import mqtt.packets.mqtt.MQTTUnsuback
-import socket.streams.ByteArrayInputStream
-import socket.streams.ByteArrayOutputStream
+import io.github.davidepianca98.mqtt.packets.MQTTControlPacketType
+import io.github.davidepianca98.mqtt.packets.MQTTDeserializer
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTUnsuback
+import io.github.davidepianca98.socket.streams.ByteArrayInputStream
+import io.github.davidepianca98.socket.streams.ByteArrayOutputStream
 
 public class MQTT4Unsuback(
     packetIdentifier: UInt
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Unsubscribe.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Unsubscribe.kt
similarity index 72%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Unsubscribe.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Unsubscribe.kt
index 02926b0b357a17bb1494867f9fe86be9a6d976e7..4394c05bd247813658ea14af9c9f17b49b646cb7 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Unsubscribe.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Unsubscribe.kt
@@ -1,12 +1,12 @@
-package mqtt.packets.mqttv4
-
-import mqtt.MQTTException
-import mqtt.packets.MQTTControlPacketType
-import mqtt.packets.MQTTDeserializer
-import mqtt.packets.mqtt.MQTTUnsubscribe
-import mqtt.packets.mqttv5.ReasonCode
-import socket.streams.ByteArrayInputStream
-import socket.streams.ByteArrayOutputStream
+package io.github.davidepianca98.mqtt.packets.mqttv4
+
+import io.github.davidepianca98.mqtt.MQTTException
+import io.github.davidepianca98.mqtt.packets.MQTTControlPacketType
+import io.github.davidepianca98.mqtt.packets.MQTTDeserializer
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTUnsubscribe
+import io.github.davidepianca98.mqtt.packets.mqttv5.ReasonCode
+import io.github.davidepianca98.socket.streams.ByteArrayInputStream
+import io.github.davidepianca98.socket.streams.ByteArrayOutputStream
 
 public class MQTT4Unsubscribe(
     packetIdentifier: UInt,
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/SubackReturnCode.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/SubackReturnCode.kt
similarity index 85%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/SubackReturnCode.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/SubackReturnCode.kt
index 8446dd3be567e68962527cb8d21fe322de7d7b37..0c8331fabc7ed530871afde4ba5b4a3e3748b9b0 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/SubackReturnCode.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/SubackReturnCode.kt
@@ -1,6 +1,6 @@
-package mqtt.packets.mqttv4
+package io.github.davidepianca98.mqtt.packets.mqttv4
 
-import mqtt.packets.mqttv5.ReasonCode
+import io.github.davidepianca98.mqtt.packets.mqttv5.ReasonCode
 
 public enum class SubackReturnCode(public val value: Int) {
     MAXIMUM_QOS0(0),
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Auth.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Auth.kt
similarity index 82%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Auth.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Auth.kt
index 377780332175147b0094a985d7fa1e8cd5d7e999..10971c1545705810ced4a41688fbda528171bbd7 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Auth.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Auth.kt
@@ -1,11 +1,11 @@
-package mqtt.packets.mqttv5
+package io.github.davidepianca98.mqtt.packets.mqttv5
 
-import mqtt.MQTTException
-import mqtt.packets.MQTTControlPacketType
-import mqtt.packets.MQTTDeserializer
-import mqtt.packets.mqtt.MQTTAuth
-import socket.streams.ByteArrayInputStream
-import socket.streams.ByteArrayOutputStream
+import io.github.davidepianca98.mqtt.MQTTException
+import io.github.davidepianca98.mqtt.packets.MQTTControlPacketType
+import io.github.davidepianca98.mqtt.packets.MQTTDeserializer
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTAuth
+import io.github.davidepianca98.socket.streams.ByteArrayInputStream
+import io.github.davidepianca98.socket.streams.ByteArrayOutputStream
 
 public class MQTT5Auth(
     public val authenticateReasonCode: ReasonCode,
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Connack.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Connack.kt
similarity index 88%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Connack.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Connack.kt
index 9f5028d052631c59adb562c4567c6b5f8d1117fa..b27e785db3ba1618db8949dae7357c67b2ea1f33 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Connack.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Connack.kt
@@ -1,12 +1,12 @@
-package mqtt.packets.mqttv5
+package io.github.davidepianca98.mqtt.packets.mqttv5
 
-import mqtt.MQTTException
-import mqtt.packets.ConnectAcknowledgeFlags
-import mqtt.packets.MQTTControlPacketType
-import mqtt.packets.MQTTDeserializer
-import mqtt.packets.mqtt.MQTTConnack
-import socket.streams.ByteArrayInputStream
-import socket.streams.ByteArrayOutputStream
+import io.github.davidepianca98.mqtt.MQTTException
+import io.github.davidepianca98.mqtt.packets.ConnectAcknowledgeFlags
+import io.github.davidepianca98.mqtt.packets.MQTTControlPacketType
+import io.github.davidepianca98.mqtt.packets.MQTTDeserializer
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTConnack
+import io.github.davidepianca98.socket.streams.ByteArrayInputStream
+import io.github.davidepianca98.socket.streams.ByteArrayOutputStream
 
 public class MQTT5Connack(
     connectAcknowledgeFlags: ConnectAcknowledgeFlags,
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Connect.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Connect.kt
similarity index 89%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Connect.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Connect.kt
index 56f7ecd692af33b01e70981070507fe7b796db81..fce84d0d8ab3dc528f1f3b19c6e4cf55e65e9ae9 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Connect.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Connect.kt
@@ -1,13 +1,13 @@
-package mqtt.packets.mqttv5
-
-import mqtt.MQTTException
-import mqtt.MQTTVersion
-import mqtt.packets.ConnectFlags
-import mqtt.packets.MQTTControlPacketType
-import mqtt.packets.MQTTDeserializer
-import mqtt.packets.mqtt.MQTTConnect
-import socket.streams.ByteArrayInputStream
-import socket.streams.ByteArrayOutputStream
+package io.github.davidepianca98.mqtt.packets.mqttv5
+
+import io.github.davidepianca98.mqtt.MQTTException
+import io.github.davidepianca98.mqtt.MQTTVersion
+import io.github.davidepianca98.mqtt.packets.ConnectFlags
+import io.github.davidepianca98.mqtt.packets.MQTTControlPacketType
+import io.github.davidepianca98.mqtt.packets.MQTTDeserializer
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTConnect
+import io.github.davidepianca98.socket.streams.ByteArrayInputStream
+import io.github.davidepianca98.socket.streams.ByteArrayOutputStream
 
 public class MQTT5Connect(
     protocolName: String,
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Disconnect.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Disconnect.kt
similarity index 88%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Disconnect.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Disconnect.kt
index 9307ba545792a23449e3ca74f6a06153a4eeadf4..ee8893d95d0c29521d862fc48608baba8d496826 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Disconnect.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Disconnect.kt
@@ -1,11 +1,11 @@
-package mqtt.packets.mqttv5
+package io.github.davidepianca98.mqtt.packets.mqttv5
 
-import mqtt.MQTTException
-import mqtt.packets.MQTTControlPacketType
-import mqtt.packets.MQTTDeserializer
-import mqtt.packets.mqtt.MQTTDisconnect
-import socket.streams.ByteArrayInputStream
-import socket.streams.ByteArrayOutputStream
+import io.github.davidepianca98.mqtt.MQTTException
+import io.github.davidepianca98.mqtt.packets.MQTTControlPacketType
+import io.github.davidepianca98.mqtt.packets.MQTTDeserializer
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTDisconnect
+import io.github.davidepianca98.socket.streams.ByteArrayInputStream
+import io.github.davidepianca98.socket.streams.ByteArrayOutputStream
 
 public class MQTT5Disconnect(
     public val reasonCode: ReasonCode,
diff --git a/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Packet.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Packet.kt
new file mode 100644
index 0000000000000000000000000000000000000000..eceeb66e6d7eebdc3d8730a5e2f76811a0c4dff4
--- /dev/null
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Packet.kt
@@ -0,0 +1,5 @@
+package io.github.davidepianca98.mqtt.packets.mqttv5
+
+import io.github.davidepianca98.mqtt.packets.MQTTPacket
+
+public interface MQTT5Packet : MQTTPacket
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Pingreq.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Pingreq.kt
similarity index 58%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Pingreq.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Pingreq.kt
index 340432969e3b72db82dd86b2bc807b8920db9253..d5305fff83678d9abda5ff0f3025f7d2f3f8e847 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Pingreq.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Pingreq.kt
@@ -1,10 +1,10 @@
-package mqtt.packets.mqttv5
+package io.github.davidepianca98.mqtt.packets.mqttv5
 
-import mqtt.MQTTException
-import mqtt.packets.MQTTControlPacketType
-import mqtt.packets.MQTTDeserializer
-import mqtt.packets.mqtt.MQTTPingreq
-import socket.streams.ByteArrayOutputStream
+import io.github.davidepianca98.mqtt.MQTTException
+import io.github.davidepianca98.mqtt.packets.MQTTControlPacketType
+import io.github.davidepianca98.mqtt.packets.MQTTDeserializer
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTPingreq
+import io.github.davidepianca98.socket.streams.ByteArrayOutputStream
 
 public class MQTT5Pingreq : MQTTPingreq(), MQTT5Packet {
 
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Pingresp.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Pingresp.kt
similarity index 58%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Pingresp.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Pingresp.kt
index 778a0c353a7e53c43fa06cbc8c16aaf310120e2d..955768c838230e752caabbd7589e2be73b3c2c67 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Pingresp.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Pingresp.kt
@@ -1,10 +1,10 @@
-package mqtt.packets.mqttv5
+package io.github.davidepianca98.mqtt.packets.mqttv5
 
-import mqtt.MQTTException
-import mqtt.packets.MQTTControlPacketType
-import mqtt.packets.MQTTDeserializer
-import mqtt.packets.mqtt.MQTTPingresp
-import socket.streams.ByteArrayOutputStream
+import io.github.davidepianca98.mqtt.MQTTException
+import io.github.davidepianca98.mqtt.packets.MQTTControlPacketType
+import io.github.davidepianca98.mqtt.packets.MQTTDeserializer
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTPingresp
+import io.github.davidepianca98.socket.streams.ByteArrayOutputStream
 
 public class MQTT5Pingresp : MQTTPingresp(), MQTT5Packet {
 
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Properties.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Properties.kt
similarity index 96%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Properties.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Properties.kt
index 3bf034f0082a6432b521a5a3ba0fdc83e99ec895..5546887e9e258a182c57a8e1d8c9a414526acbae 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Properties.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Properties.kt
@@ -1,4 +1,4 @@
-package mqtt.packets.mqttv5
+package io.github.davidepianca98.mqtt.packets.mqttv5
 
 public class MQTT5Properties(
     public var payloadFormatIndicator: UInt? = null,
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Puback.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Puback.kt
similarity index 85%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Puback.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Puback.kt
index b424310cbc444fead30a8a375d542b424a4af5ee..54f79a9f6e8eb6652f9e53a1e61aea174b8405d9 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Puback.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Puback.kt
@@ -1,11 +1,11 @@
-package mqtt.packets.mqttv5
+package io.github.davidepianca98.mqtt.packets.mqttv5
 
-import mqtt.MQTTException
-import mqtt.packets.MQTTControlPacketType
-import mqtt.packets.MQTTDeserializer
-import mqtt.packets.mqtt.MQTTPuback
-import socket.streams.ByteArrayInputStream
-import socket.streams.ByteArrayOutputStream
+import io.github.davidepianca98.mqtt.MQTTException
+import io.github.davidepianca98.mqtt.packets.MQTTControlPacketType
+import io.github.davidepianca98.mqtt.packets.MQTTDeserializer
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTPuback
+import io.github.davidepianca98.socket.streams.ByteArrayInputStream
+import io.github.davidepianca98.socket.streams.ByteArrayOutputStream
 
 public class MQTT5Puback(
     packetId: UInt,
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Pubcomp.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Pubcomp.kt
similarity index 84%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Pubcomp.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Pubcomp.kt
index eff09945fd295f785c84528ababbcef7182e2145..7188fa59a27c5d783c69c530e9852a59d564dd0b 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Pubcomp.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Pubcomp.kt
@@ -1,11 +1,11 @@
-package mqtt.packets.mqttv5
+package io.github.davidepianca98.mqtt.packets.mqttv5
 
-import mqtt.MQTTException
-import mqtt.packets.MQTTControlPacketType
-import mqtt.packets.MQTTDeserializer
-import mqtt.packets.mqtt.MQTTPubcomp
-import socket.streams.ByteArrayInputStream
-import socket.streams.ByteArrayOutputStream
+import io.github.davidepianca98.mqtt.MQTTException
+import io.github.davidepianca98.mqtt.packets.MQTTControlPacketType
+import io.github.davidepianca98.mqtt.packets.MQTTDeserializer
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTPubcomp
+import io.github.davidepianca98.socket.streams.ByteArrayInputStream
+import io.github.davidepianca98.socket.streams.ByteArrayOutputStream
 
 public class MQTT5Pubcomp(
     packetId: UInt,
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Publish.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Publish.kt
similarity index 86%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Publish.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Publish.kt
index 9ee43403abad37d98745cd3350fb7f23eae57d16..92a9f519462404ab45194ae065c3e60a024b1243 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Publish.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Publish.kt
@@ -1,15 +1,15 @@
-package mqtt.packets.mqttv5
-
-import currentTimeMillis
-import mqtt.MQTTException
-import mqtt.containsWildcard
-import mqtt.packets.MQTTControlPacketType
-import mqtt.packets.MQTTDeserializer
-import mqtt.packets.Qos
-import mqtt.packets.mqtt.MQTTPublish
-import socket.streams.ByteArrayInputStream
-import socket.streams.ByteArrayOutputStream
-import validatePayloadFormat
+package io.github.davidepianca98.mqtt.packets.mqttv5
+
+import io.github.davidepianca98.currentTimeMillis
+import io.github.davidepianca98.mqtt.MQTTException
+import io.github.davidepianca98.mqtt.containsWildcard
+import io.github.davidepianca98.mqtt.packets.MQTTControlPacketType
+import io.github.davidepianca98.mqtt.packets.MQTTDeserializer
+import io.github.davidepianca98.mqtt.packets.Qos
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTPublish
+import io.github.davidepianca98.socket.streams.ByteArrayInputStream
+import io.github.davidepianca98.socket.streams.ByteArrayOutputStream
+import io.github.davidepianca98.validatePayloadFormat
 
 
 public class MQTT5Publish(
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Pubrec.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Pubrec.kt
similarity index 85%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Pubrec.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Pubrec.kt
index 3bd48d1f1ed857acc747032932ed77942c3edd78..53ced26c080e9ef4d1349a411689613dd33d37ce 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Pubrec.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Pubrec.kt
@@ -1,11 +1,11 @@
-package mqtt.packets.mqttv5
+package io.github.davidepianca98.mqtt.packets.mqttv5
 
-import mqtt.MQTTException
-import mqtt.packets.MQTTControlPacketType
-import mqtt.packets.MQTTDeserializer
-import mqtt.packets.mqtt.MQTTPubrec
-import socket.streams.ByteArrayInputStream
-import socket.streams.ByteArrayOutputStream
+import io.github.davidepianca98.mqtt.MQTTException
+import io.github.davidepianca98.mqtt.packets.MQTTControlPacketType
+import io.github.davidepianca98.mqtt.packets.MQTTDeserializer
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTPubrec
+import io.github.davidepianca98.socket.streams.ByteArrayInputStream
+import io.github.davidepianca98.socket.streams.ByteArrayOutputStream
 
 public class MQTT5Pubrec(
     packetId: UInt,
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Pubrel.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Pubrel.kt
similarity index 85%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Pubrel.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Pubrel.kt
index 80c9dca9d87520570d37f1bb797b8787882a4886..105c8a5ba98e21ea384f586cce242fc491293b62 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Pubrel.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Pubrel.kt
@@ -1,11 +1,11 @@
-package mqtt.packets.mqttv5
+package io.github.davidepianca98.mqtt.packets.mqttv5
 
-import mqtt.MQTTException
-import mqtt.packets.MQTTControlPacketType
-import mqtt.packets.MQTTDeserializer
-import mqtt.packets.mqtt.MQTTPubrel
-import socket.streams.ByteArrayInputStream
-import socket.streams.ByteArrayOutputStream
+import io.github.davidepianca98.mqtt.MQTTException
+import io.github.davidepianca98.mqtt.packets.MQTTControlPacketType
+import io.github.davidepianca98.mqtt.packets.MQTTDeserializer
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTPubrel
+import io.github.davidepianca98.socket.streams.ByteArrayInputStream
+import io.github.davidepianca98.socket.streams.ByteArrayOutputStream
 
 public class MQTT5Pubrel(
     packetId: UInt,
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Suback.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Suback.kt
similarity index 86%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Suback.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Suback.kt
index c5f06e72caa1b92ac706954a113abef85bb53055..aa350b7ced47f84928d7e33c01f4c44bbb01ea70 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Suback.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Suback.kt
@@ -1,11 +1,11 @@
-package mqtt.packets.mqttv5
+package io.github.davidepianca98.mqtt.packets.mqttv5
 
-import mqtt.MQTTException
-import mqtt.packets.MQTTControlPacketType
-import mqtt.packets.MQTTDeserializer
-import mqtt.packets.mqtt.MQTTSuback
-import socket.streams.ByteArrayInputStream
-import socket.streams.ByteArrayOutputStream
+import io.github.davidepianca98.mqtt.MQTTException
+import io.github.davidepianca98.mqtt.packets.MQTTControlPacketType
+import io.github.davidepianca98.mqtt.packets.MQTTDeserializer
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTSuback
+import io.github.davidepianca98.socket.streams.ByteArrayInputStream
+import io.github.davidepianca98.socket.streams.ByteArrayOutputStream
 
 public class MQTT5Suback(
     packetIdentifier: UInt,
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Subscribe.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Subscribe.kt
similarity index 87%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Subscribe.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Subscribe.kt
index 39849332d61ee5e16cc6dd686fa76d223147d8e4..4de366f83317133946048cdf0bc25b9b8150930f 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Subscribe.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Subscribe.kt
@@ -1,14 +1,14 @@
-package mqtt.packets.mqttv5
+package io.github.davidepianca98.mqtt.packets.mqttv5
 
-import mqtt.MQTTException
-import mqtt.Subscription
-import mqtt.isSharedTopicFilter
-import mqtt.packets.MQTTControlPacketType
-import mqtt.packets.MQTTDeserializer
-import mqtt.packets.Qos
-import mqtt.packets.mqtt.MQTTSubscribe
-import socket.streams.ByteArrayInputStream
-import socket.streams.ByteArrayOutputStream
+import io.github.davidepianca98.mqtt.MQTTException
+import io.github.davidepianca98.mqtt.Subscription
+import io.github.davidepianca98.mqtt.isSharedTopicFilter
+import io.github.davidepianca98.mqtt.packets.MQTTControlPacketType
+import io.github.davidepianca98.mqtt.packets.MQTTDeserializer
+import io.github.davidepianca98.mqtt.packets.Qos
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTSubscribe
+import io.github.davidepianca98.socket.streams.ByteArrayInputStream
+import io.github.davidepianca98.socket.streams.ByteArrayOutputStream
 
 public class MQTT5Subscribe(
     packetIdentifier: UInt,
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Unsuback.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Unsuback.kt
similarity index 85%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Unsuback.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Unsuback.kt
index 13c0e5981ffcd008b81217aed829e700e17ec825..57d3f4e22ecc47bb6ab407413c74709232e29874 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Unsuback.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Unsuback.kt
@@ -1,11 +1,11 @@
-package mqtt.packets.mqttv5
+package io.github.davidepianca98.mqtt.packets.mqttv5
 
-import mqtt.MQTTException
-import mqtt.packets.MQTTControlPacketType
-import mqtt.packets.MQTTDeserializer
-import mqtt.packets.mqtt.MQTTUnsuback
-import socket.streams.ByteArrayInputStream
-import socket.streams.ByteArrayOutputStream
+import io.github.davidepianca98.mqtt.MQTTException
+import io.github.davidepianca98.mqtt.packets.MQTTControlPacketType
+import io.github.davidepianca98.mqtt.packets.MQTTDeserializer
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTUnsuback
+import io.github.davidepianca98.socket.streams.ByteArrayInputStream
+import io.github.davidepianca98.socket.streams.ByteArrayOutputStream
 
 public class MQTT5Unsuback(
     packetIdentifier: UInt,
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Unsubscribe.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Unsubscribe.kt
similarity index 78%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Unsubscribe.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Unsubscribe.kt
index eebfd1e6b49dbe535744ab8a7f1c0fd49545efc1..23729a0b65b6ff6b297471046ca92d0246ed6a74 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Unsubscribe.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Unsubscribe.kt
@@ -1,11 +1,11 @@
-package mqtt.packets.mqttv5
-
-import mqtt.MQTTException
-import mqtt.packets.MQTTControlPacketType
-import mqtt.packets.MQTTDeserializer
-import mqtt.packets.mqtt.MQTTUnsubscribe
-import socket.streams.ByteArrayInputStream
-import socket.streams.ByteArrayOutputStream
+package io.github.davidepianca98.mqtt.packets.mqttv5
+
+import io.github.davidepianca98.mqtt.MQTTException
+import io.github.davidepianca98.mqtt.packets.MQTTControlPacketType
+import io.github.davidepianca98.mqtt.packets.MQTTDeserializer
+import io.github.davidepianca98.mqtt.packets.mqtt.MQTTUnsubscribe
+import io.github.davidepianca98.socket.streams.ByteArrayInputStream
+import io.github.davidepianca98.socket.streams.ByteArrayOutputStream
 
 public class MQTT5Unsubscribe(
     packetIdentifier: UInt,
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTTSerializer.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTSerializer.kt
similarity index 95%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTTSerializer.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTSerializer.kt
index 9942ef2c32841cd5dd5a7aa454118bc505c22428..8ad882d771ec88bc87861c29e6d936e8557a6396 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTTSerializer.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTSerializer.kt
@@ -1,10 +1,10 @@
-package mqtt.packets.mqttv5
+package io.github.davidepianca98.mqtt.packets.mqttv5
 
-import mqtt.MQTTException
-import mqtt.packets.MQTTControlPacketType
-import socket.streams.ByteArrayOutputStream
-import socket.streams.encodeVariableByteInteger
-import validateUTF8String
+import io.github.davidepianca98.mqtt.MQTTException
+import io.github.davidepianca98.mqtt.packets.MQTTControlPacketType
+import io.github.davidepianca98.socket.streams.ByteArrayOutputStream
+import io.github.davidepianca98.socket.streams.encodeVariableByteInteger
+import io.github.davidepianca98.validateUTF8String
 
 public interface MQTTSerializer {
 
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/Property.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/Property.kt
similarity index 95%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/Property.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/Property.kt
index 7b10129857689778bf44dc758ae875d1149c2d06..a62bd4ed58690c051e2e33e8c51a67d724b6491e 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/Property.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/Property.kt
@@ -1,4 +1,4 @@
-package mqtt.packets.mqttv5
+package io.github.davidepianca98.mqtt.packets.mqttv5
 
 public enum class Property(public val value: UInt) {
     PAYLOAD_FORMAT_INDICATOR(1u),
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/ReasonCode.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/ReasonCode.kt
similarity index 96%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/ReasonCode.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/ReasonCode.kt
index 05bed9ad4c2eb7c2c90f68cbb359ca1fb52628c9..dfba46b5feba0b3bead849013486f754d6396288 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/ReasonCode.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/ReasonCode.kt
@@ -1,4 +1,4 @@
-package mqtt.packets.mqttv5
+package io.github.davidepianca98.mqtt.packets.mqttv5
 
 public enum class ReasonCode(public val value: Int) {
     SUCCESS(0), // NORMAL_DISCONNECTION, GRANTED_QOS0
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/SubscriptionOptions.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/SubscriptionOptions.kt
similarity index 81%
rename from kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/SubscriptionOptions.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/SubscriptionOptions.kt
index 3e72d36bc4bc0b635403c53bcad9c7c5284bdcca..c4d1cfcacbc6192eb1dde4a3f61c98ce17bc4a7a 100644
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/SubscriptionOptions.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/SubscriptionOptions.kt
@@ -1,7 +1,7 @@
-package mqtt.packets.mqttv5
+package io.github.davidepianca98.mqtt.packets.mqttv5
 
-import mqtt.MQTTException
-import mqtt.packets.Qos
+import io.github.davidepianca98.mqtt.MQTTException
+import io.github.davidepianca98.mqtt.packets.Qos
 
 public data class SubscriptionOptions(
     public val qos: Qos = Qos.AT_MOST_ONCE,
diff --git a/kmqtt-common/src/commonMain/kotlin/socket/IOException.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/IOException.kt
similarity index 65%
rename from kmqtt-common/src/commonMain/kotlin/socket/IOException.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/IOException.kt
index dbf173eed0405e9d73fd5f2269edc2e866fdfe05..009100cd86f1f2e9d9532924243710441b291747 100644
--- a/kmqtt-common/src/commonMain/kotlin/socket/IOException.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/IOException.kt
@@ -1,3 +1,3 @@
-package socket
+package io.github.davidepianca98.socket
 
 public open class IOException(message: String? = null) : Exception(message)
\ No newline at end of file
diff --git a/kmqtt-common/src/commonMain/kotlin/socket/SocketClosedException.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/SocketClosedException.kt
similarity index 67%
rename from kmqtt-common/src/commonMain/kotlin/socket/SocketClosedException.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/SocketClosedException.kt
index c1d92e149d54b904191950244999b51f12741736..5e028fcb4ffdcf5402534887aa75d9e5e6a4e84c 100644
--- a/kmqtt-common/src/commonMain/kotlin/socket/SocketClosedException.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/SocketClosedException.kt
@@ -1,3 +1,3 @@
-package socket
+package io.github.davidepianca98.socket
 
 public class SocketClosedException(message: String? = null) : IOException(message)
\ No newline at end of file
diff --git a/kmqtt-common/src/commonMain/kotlin/socket/SocketInterface.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/SocketInterface.kt
similarity index 80%
rename from kmqtt-common/src/commonMain/kotlin/socket/SocketInterface.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/SocketInterface.kt
index 49de172a18832a2272ed618e7bf33d258212c3b5..032c99e286eec278257e9e26276ebed233672c95 100644
--- a/kmqtt-common/src/commonMain/kotlin/socket/SocketInterface.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/SocketInterface.kt
@@ -1,4 +1,4 @@
-package socket
+package io.github.davidepianca98.socket
 
 public interface SocketInterface {
 
diff --git a/kmqtt-common/src/commonMain/kotlin/socket/SocketState.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/SocketState.kt
similarity index 57%
rename from kmqtt-common/src/commonMain/kotlin/socket/SocketState.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/SocketState.kt
index e5f078f2f613dfcb497f118afa2dbf22c1732eca..be788936de6444cd793a00b0aa9f778cd3124a23 100644
--- a/kmqtt-common/src/commonMain/kotlin/socket/SocketState.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/SocketState.kt
@@ -1,4 +1,4 @@
-package socket
+package io.github.davidepianca98.socket
 
 public enum class SocketState {
     READ,
diff --git a/kmqtt-common/src/commonMain/kotlin/socket/streams/ByteArrayInputStream.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/streams/ByteArrayInputStream.kt
similarity index 93%
rename from kmqtt-common/src/commonMain/kotlin/socket/streams/ByteArrayInputStream.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/streams/ByteArrayInputStream.kt
index 796ef24901293b97f6a319e08e90875154c65a4e..b5bd189e8a6937442c7b40caf25e1ddf8f613d96 100644
--- a/kmqtt-common/src/commonMain/kotlin/socket/streams/ByteArrayInputStream.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/streams/ByteArrayInputStream.kt
@@ -1,4 +1,4 @@
-package socket.streams
+package io.github.davidepianca98.socket.streams
 
 public class ByteArrayInputStream(private val array: UByteArray) : InputStream {
 
diff --git a/kmqtt-common/src/commonMain/kotlin/socket/streams/ByteArrayOutputStream.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/streams/ByteArrayOutputStream.kt
similarity index 95%
rename from kmqtt-common/src/commonMain/kotlin/socket/streams/ByteArrayOutputStream.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/streams/ByteArrayOutputStream.kt
index 4f79ddbdb1c13b71422b06a540c4ebc5b4ad7071..2496f3c9fcd3e24edafca4954510629a8524b265 100644
--- a/kmqtt-common/src/commonMain/kotlin/socket/streams/ByteArrayOutputStream.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/streams/ByteArrayOutputStream.kt
@@ -1,4 +1,4 @@
-package socket.streams
+package io.github.davidepianca98.socket.streams
 
 public class ByteArrayOutputStream : OutputStream {
 
diff --git a/kmqtt-common/src/commonMain/kotlin/socket/streams/DynamicByteBuffer.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/streams/DynamicByteBuffer.kt
similarity index 96%
rename from kmqtt-common/src/commonMain/kotlin/socket/streams/DynamicByteBuffer.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/streams/DynamicByteBuffer.kt
index 13bf16fc4172d1a34dd158dda95ba42217203ee0..c2e4c7dbcff4b8bf67004b530dd823ee61c03e5a 100644
--- a/kmqtt-common/src/commonMain/kotlin/socket/streams/DynamicByteBuffer.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/streams/DynamicByteBuffer.kt
@@ -1,4 +1,4 @@
-package socket.streams
+package io.github.davidepianca98.socket.streams
 
 public class DynamicByteBuffer : InputStream, OutputStream {
 
diff --git a/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/streams/EOFException.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/streams/EOFException.kt
new file mode 100644
index 0000000000000000000000000000000000000000..c25bee7567e7f8e70720ef226d05d3f56d6d7f33
--- /dev/null
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/streams/EOFException.kt
@@ -0,0 +1,5 @@
+package io.github.davidepianca98.socket.streams
+
+import io.github.davidepianca98.socket.IOException
+
+public class EOFException : IOException()
diff --git a/kmqtt-common/src/commonMain/kotlin/socket/streams/InputStream.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/streams/InputStream.kt
similarity index 92%
rename from kmqtt-common/src/commonMain/kotlin/socket/streams/InputStream.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/streams/InputStream.kt
index bbf8575bd6088e1fb05229b9c2e15df8b644fa4b..5be09f7072446662800ba7ce07aae82ba5a291f3 100644
--- a/kmqtt-common/src/commonMain/kotlin/socket/streams/InputStream.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/streams/InputStream.kt
@@ -1,4 +1,4 @@
-package socket.streams
+package io.github.davidepianca98.socket.streams
 
 public interface InputStream {
 
diff --git a/kmqtt-common/src/commonMain/kotlin/socket/streams/OutputStream.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/streams/OutputStream.kt
similarity index 91%
rename from kmqtt-common/src/commonMain/kotlin/socket/streams/OutputStream.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/streams/OutputStream.kt
index b3049b51dd2a83dbcc82645748668a8ad17e7a5c..ec39e1ead97f5e0d40fdabfafeab2aebb94931b7 100644
--- a/kmqtt-common/src/commonMain/kotlin/socket/streams/OutputStream.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/streams/OutputStream.kt
@@ -1,4 +1,4 @@
-package socket.streams
+package io.github.davidepianca98.socket.streams
 
 public interface OutputStream {
 
diff --git a/kmqtt-common/src/commonMain/kotlin/socket/streams/StreamExtensions.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/streams/StreamExtensions.kt
similarity index 94%
rename from kmqtt-common/src/commonMain/kotlin/socket/streams/StreamExtensions.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/streams/StreamExtensions.kt
index 39abe02ccec50231f4ae7e33397f16ffdfb7bd50..2fd607605723b1bd910a34cd465b50dbdf1bdbd7 100644
--- a/kmqtt-common/src/commonMain/kotlin/socket/streams/StreamExtensions.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/streams/StreamExtensions.kt
@@ -1,4 +1,4 @@
-package socket.streams
+package io.github.davidepianca98.socket.streams
 
 public fun OutputStream.encodeVariableByteInteger(value: UInt): Int {
     var length = 0
diff --git a/kmqtt-common/src/commonMain/kotlin/socket/tcp/Socket.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/tcp/Socket.kt
similarity index 66%
rename from kmqtt-common/src/commonMain/kotlin/socket/tcp/Socket.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/tcp/Socket.kt
index 6da9c65a3eff90dbce06bf6a5c81f5c4768f6163..81b2bdab29db28f270b6d88e015720ba1db8b8b9 100644
--- a/kmqtt-common/src/commonMain/kotlin/socket/tcp/Socket.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/tcp/Socket.kt
@@ -1,6 +1,6 @@
-package socket.tcp
+package io.github.davidepianca98.socket.tcp
 
-import socket.SocketInterface
+import io.github.davidepianca98.socket.SocketInterface
 
 public expect open class Socket : SocketInterface {
 
diff --git a/kmqtt-common/src/commonMain/kotlin/socket/tls/TLSClientSettings.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/tls/TLSClientSettings.kt
similarity index 96%
rename from kmqtt-common/src/commonMain/kotlin/socket/tls/TLSClientSettings.kt
rename to kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/tls/TLSClientSettings.kt
index 9537a62c6e76e6beaf64a23e7d83797e1757d7ff..7aa1f58bc31e8ccc7f007a27865f7f1dd8fdd54d 100644
--- a/kmqtt-common/src/commonMain/kotlin/socket/tls/TLSClientSettings.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/tls/TLSClientSettings.kt
@@ -1,4 +1,4 @@
-package socket.tls
+package io.github.davidepianca98.socket.tls
 
 /**
  * TLS settings
diff --git a/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/tls/TLSSocket.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/tls/TLSSocket.kt
new file mode 100644
index 0000000000000000000000000000000000000000..1ed4e6f8a2ee7cc5fdf95c314279ba198cdcb00d
--- /dev/null
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/tls/TLSSocket.kt
@@ -0,0 +1,5 @@
+package io.github.davidepianca98.socket.tls
+
+import io.github.davidepianca98.socket.tcp.Socket
+
+public expect open class TLSSocket : Socket
\ No newline at end of file
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/MQTTException.kt b/kmqtt-common/src/commonMain/kotlin/mqtt/MQTTException.kt
deleted file mode 100644
index 80774e060c687585435f4dc4135d114c9d9608e5..0000000000000000000000000000000000000000
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/MQTTException.kt
+++ /dev/null
@@ -1,5 +0,0 @@
-package mqtt
-
-import mqtt.packets.mqttv5.ReasonCode
-
-public class MQTTException(public val reasonCode: ReasonCode) : Exception(reasonCode.toString())
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTAuth.kt b/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTAuth.kt
deleted file mode 100644
index 3873a955c4d6e986cb879a8be848766caf269a17..0000000000000000000000000000000000000000
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTAuth.kt
+++ /dev/null
@@ -1,5 +0,0 @@
-package mqtt.packets.mqtt
-
-import mqtt.packets.MQTTPacket
-
-public abstract class MQTTAuth : MQTTPacket
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTConnack.kt b/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTConnack.kt
deleted file mode 100644
index 9153ca27711caebd96c2d4e5fdd3642558071afc..0000000000000000000000000000000000000000
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTConnack.kt
+++ /dev/null
@@ -1,6 +0,0 @@
-package mqtt.packets.mqtt
-
-import mqtt.packets.ConnectAcknowledgeFlags
-import mqtt.packets.MQTTPacket
-
-public abstract class MQTTConnack(public val connectAcknowledgeFlags: ConnectAcknowledgeFlags) : MQTTPacket
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTDisconnect.kt b/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTDisconnect.kt
deleted file mode 100644
index 2f40b11039c2a3faf67c7e1907d8aeb462419673..0000000000000000000000000000000000000000
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTDisconnect.kt
+++ /dev/null
@@ -1,5 +0,0 @@
-package mqtt.packets.mqtt
-
-import mqtt.packets.MQTTPacket
-
-public abstract class MQTTDisconnect : MQTTPacket
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTPingreq.kt b/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTPingreq.kt
deleted file mode 100644
index 497c20eafaf597a8e003aec0b5c781c691a887df..0000000000000000000000000000000000000000
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTPingreq.kt
+++ /dev/null
@@ -1,5 +0,0 @@
-package mqtt.packets.mqtt
-
-import mqtt.packets.MQTTPacket
-
-public abstract class MQTTPingreq : MQTTPacket
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTPingresp.kt b/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTPingresp.kt
deleted file mode 100644
index 102132da93b59486820f737fce04b839ef16ea49..0000000000000000000000000000000000000000
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTPingresp.kt
+++ /dev/null
@@ -1,5 +0,0 @@
-package mqtt.packets.mqtt
-
-import mqtt.packets.MQTTPacket
-
-public abstract class MQTTPingresp : MQTTPacket
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTPuback.kt b/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTPuback.kt
deleted file mode 100644
index 3e3138be32da71d37731426dface0384cc962dce..0000000000000000000000000000000000000000
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTPuback.kt
+++ /dev/null
@@ -1,5 +0,0 @@
-package mqtt.packets.mqtt
-
-import mqtt.packets.MQTTPacket
-
-public abstract class MQTTPuback(public val packetId: UInt) : MQTTPacket
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTPubcomp.kt b/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTPubcomp.kt
deleted file mode 100644
index f07a742c9a9dec9f2491d7643843efb4a1cbcf9e..0000000000000000000000000000000000000000
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTPubcomp.kt
+++ /dev/null
@@ -1,5 +0,0 @@
-package mqtt.packets.mqtt
-
-import mqtt.packets.MQTTPacket
-
-public abstract class MQTTPubcomp(public val packetId: UInt) : MQTTPacket
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTPubrec.kt b/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTPubrec.kt
deleted file mode 100644
index c295f9eb5bbadb4f46effb2a62d37ee192a787de..0000000000000000000000000000000000000000
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTPubrec.kt
+++ /dev/null
@@ -1,5 +0,0 @@
-package mqtt.packets.mqtt
-
-import mqtt.packets.MQTTPacket
-
-public abstract class MQTTPubrec(public val packetId: UInt) : MQTTPacket
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTPubrel.kt b/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTPubrel.kt
deleted file mode 100644
index 9f4ab7105ac5079a1b94050d0742c8bbba07052e..0000000000000000000000000000000000000000
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTPubrel.kt
+++ /dev/null
@@ -1,5 +0,0 @@
-package mqtt.packets.mqtt
-
-import mqtt.packets.MQTTPacket
-
-public abstract class MQTTPubrel(public val packetId: UInt) : MQTTPacket
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTSuback.kt b/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTSuback.kt
deleted file mode 100644
index 46dcdd1ca34507f8212082a6207c0abd5cc70845..0000000000000000000000000000000000000000
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTSuback.kt
+++ /dev/null
@@ -1,5 +0,0 @@
-package mqtt.packets.mqtt
-
-import mqtt.packets.MQTTPacket
-
-public abstract class MQTTSuback(public val packetIdentifier: UInt) : MQTTPacket
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTSubscribe.kt b/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTSubscribe.kt
deleted file mode 100644
index bd399c540a7d56f8a5905dc105c17880c58bea80..0000000000000000000000000000000000000000
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTSubscribe.kt
+++ /dev/null
@@ -1,9 +0,0 @@
-package mqtt.packets.mqtt
-
-import mqtt.Subscription
-import mqtt.packets.MQTTPacket
-
-public abstract class MQTTSubscribe(
-    public val packetIdentifier: UInt,
-    public val subscriptions: List<Subscription>
-) : MQTTPacket
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTUnsuback.kt b/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTUnsuback.kt
deleted file mode 100644
index 939a3b8b6ab7eef8c45242256e9d2d0a179548e2..0000000000000000000000000000000000000000
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTUnsuback.kt
+++ /dev/null
@@ -1,5 +0,0 @@
-package mqtt.packets.mqtt
-
-import mqtt.packets.MQTTPacket
-
-public abstract class MQTTUnsuback(public val packetIdentifier: UInt) : MQTTPacket
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Packet.kt b/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Packet.kt
deleted file mode 100644
index 1b4334074299d60276f0a0b13253112efbda7816..0000000000000000000000000000000000000000
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Packet.kt
+++ /dev/null
@@ -1,5 +0,0 @@
-package mqtt.packets.mqttv4
-
-import mqtt.packets.MQTTPacket
-
-public interface MQTT4Packet : MQTTPacket
diff --git a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Packet.kt b/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Packet.kt
deleted file mode 100644
index 5f5ac5af3fe0068e2589afb88af4a2e8afe10d4b..0000000000000000000000000000000000000000
--- a/kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Packet.kt
+++ /dev/null
@@ -1,5 +0,0 @@
-package mqtt.packets.mqttv5
-
-import mqtt.packets.MQTTPacket
-
-public interface MQTT5Packet : MQTTPacket
diff --git a/kmqtt-common/src/commonMain/kotlin/socket/streams/EOFException.kt b/kmqtt-common/src/commonMain/kotlin/socket/streams/EOFException.kt
deleted file mode 100644
index 5a26fe96ab55ca62315313ab3aa51601abb3ce32..0000000000000000000000000000000000000000
--- a/kmqtt-common/src/commonMain/kotlin/socket/streams/EOFException.kt
+++ /dev/null
@@ -1,5 +0,0 @@
-package socket.streams
-
-import socket.IOException
-
-public class EOFException : IOException()
diff --git a/kmqtt-common/src/commonMain/kotlin/socket/tls/TLSSocket.kt b/kmqtt-common/src/commonMain/kotlin/socket/tls/TLSSocket.kt
deleted file mode 100644
index 6ec585d78c69150b961c618b6f9d9aaacd81ab82..0000000000000000000000000000000000000000
--- a/kmqtt-common/src/commonMain/kotlin/socket/tls/TLSSocket.kt
+++ /dev/null
@@ -1,5 +0,0 @@
-package socket.tls
-
-import socket.tcp.Socket
-
-public expect open class TLSSocket : Socket
\ No newline at end of file
diff --git a/kmqtt-common/src/commonTest/kotlin/mqtt/CommonUtilsTest.kt b/kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/CommonUtilsTest.kt
similarity index 93%
rename from kmqtt-common/src/commonTest/kotlin/mqtt/CommonUtilsTest.kt
rename to kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/CommonUtilsTest.kt
index 9a9a02473705321755054f42194deefa19b8f443..7efdf90e2c39f959f67db8409a6c0752a0b4aaa2 100644
--- a/kmqtt-common/src/commonTest/kotlin/mqtt/CommonUtilsTest.kt
+++ b/kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/CommonUtilsTest.kt
@@ -1,8 +1,8 @@
-package mqtt
+package io.github.davidepianca98.mqtt
 
-import sha1
-import toBase64
-import validateUTF8String
+import io.github.davidepianca98.sha1
+import io.github.davidepianca98.toBase64
+import io.github.davidepianca98.validateUTF8String
 import kotlin.test.Test
 import kotlin.test.assertEquals
 import kotlin.test.assertFalse
diff --git a/kmqtt-common/src/commonTest/kotlin/mqtt/TopicUtilsTest.kt b/kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/TopicUtilsTest.kt
similarity index 98%
rename from kmqtt-common/src/commonTest/kotlin/mqtt/TopicUtilsTest.kt
rename to kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/TopicUtilsTest.kt
index 22b10ff4d9223a698f50f8d232fe7bc6adfa4980..2bc71cfed28c9669702ed213420c5e9e1714eeaa 100644
--- a/kmqtt-common/src/commonTest/kotlin/mqtt/TopicUtilsTest.kt
+++ b/kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/TopicUtilsTest.kt
@@ -1,6 +1,5 @@
-package mqtt
+package io.github.davidepianca98.mqtt
 
-import mqtt.*
 import kotlin.test.Test
 import kotlin.test.assertEquals
 import kotlin.test.assertFalse
diff --git a/kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTAuthTest.kt b/kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTAuthTest.kt
similarity index 89%
rename from kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTAuthTest.kt
rename to kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTAuthTest.kt
index b591f8677229c435f411fef6683cc3160ca55055..63b69e49aff358193851107a1e6e77268b545a3a 100644
--- a/kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTAuthTest.kt
+++ b/kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTAuthTest.kt
@@ -1,8 +1,5 @@
-package mqtt.packets.mqttv5
+package io.github.davidepianca98.mqtt.packets.mqttv5
 
-import mqtt.packets.mqttv5.MQTT5Auth
-import mqtt.packets.mqttv5.MQTT5Properties
-import mqtt.packets.mqttv5.ReasonCode
 import kotlin.test.Test
 import kotlin.test.assertEquals
 import kotlin.test.assertTrue
diff --git a/kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTConnackTest.kt b/kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTConnackTest.kt
similarity index 88%
rename from kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTConnackTest.kt
rename to kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTConnackTest.kt
index 59c001962486d55ad4becf807461b32c8721cd73..0a83bc33c82dbc0b0307b09323fdeb0e975007f8 100644
--- a/kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTConnackTest.kt
+++ b/kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTConnackTest.kt
@@ -1,9 +1,6 @@
-package mqtt.packets.mqttv5
+package io.github.davidepianca98.mqtt.packets.mqttv5
 
-import mqtt.packets.ConnectAcknowledgeFlags
-import mqtt.packets.mqttv5.MQTT5Connack
-import mqtt.packets.mqttv5.MQTT5Properties
-import mqtt.packets.mqttv5.ReasonCode
+import io.github.davidepianca98.mqtt.packets.ConnectAcknowledgeFlags
 import kotlin.test.Test
 import kotlin.test.assertEquals
 import kotlin.test.assertTrue
diff --git a/kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTConnectTest.kt b/kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTConnectTest.kt
similarity index 92%
rename from kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTConnectTest.kt
rename to kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTConnectTest.kt
index cda2de1d85993d16c71849364fd0dd2ca85ca459..d14003a9f59ccd363c8a1d47d9aae2600cfbfb34 100644
--- a/kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTConnectTest.kt
+++ b/kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTConnectTest.kt
@@ -1,8 +1,7 @@
-package mqtt.packets.mqttv5
+package io.github.davidepianca98.mqtt.packets.mqttv5
 
-import mqtt.packets.ConnectFlags
-import mqtt.packets.Qos
-import mqtt.packets.mqttv5.MQTT5Connect
+import io.github.davidepianca98.mqtt.packets.ConnectFlags
+import io.github.davidepianca98.mqtt.packets.Qos
 import kotlin.test.Test
 import kotlin.test.assertEquals
 import kotlin.test.assertTrue
diff --git a/kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTDisconnectTest.kt b/kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTDisconnectTest.kt
similarity index 83%
rename from kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTDisconnectTest.kt
rename to kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTDisconnectTest.kt
index b1e2ee148474fe7daeecf15ac5a4001ee0470409..6bd86ad642440d084a143e6505c1c1b9fe75bf3b 100644
--- a/kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTDisconnectTest.kt
+++ b/kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTDisconnectTest.kt
@@ -1,7 +1,5 @@
-package mqtt.packets.mqttv5
+package io.github.davidepianca98.mqtt.packets.mqttv5
 
-import mqtt.packets.mqttv5.MQTT5Disconnect
-import mqtt.packets.mqttv5.ReasonCode
 import kotlin.test.Test
 import kotlin.test.assertEquals
 import kotlin.test.assertTrue
diff --git a/kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTPingreqTest.kt b/kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTPingreqTest.kt
similarity index 85%
rename from kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTPingreqTest.kt
rename to kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTPingreqTest.kt
index b45a862eac00955b1ff334e146898afb69c9cbb9..c54f1fae78d3bce999b224ca232e50bd49c33e37 100644
--- a/kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTPingreqTest.kt
+++ b/kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTPingreqTest.kt
@@ -1,6 +1,5 @@
-package mqtt.packets.mqttv5
+package io.github.davidepianca98.mqtt.packets.mqttv5
 
-import mqtt.packets.mqttv5.MQTT5Pingreq
 import kotlin.test.Test
 import kotlin.test.assertTrue
 
diff --git a/kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTPingrespTest.kt b/kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTPingrespTest.kt
similarity index 85%
rename from kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTPingrespTest.kt
rename to kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTPingrespTest.kt
index f294d42c9cae1bc34f44945bfd4a2c5400455b18..4da7635443cb620b14f12fb9ba5fbfbb2bd7a4a0 100644
--- a/kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTPingrespTest.kt
+++ b/kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTPingrespTest.kt
@@ -1,6 +1,5 @@
-package mqtt.packets.mqttv5
+package io.github.davidepianca98.mqtt.packets.mqttv5
 
-import mqtt.packets.mqttv5.MQTT5Pingresp
 import kotlin.test.Test
 import kotlin.test.assertTrue
 
diff --git a/kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTPubackTest.kt b/kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTPubackTest.kt
similarity index 89%
rename from kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTPubackTest.kt
rename to kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTPubackTest.kt
index 4e7ec56bdf4ca743ac8774a3e3e0cb228981e7cc..d4374727a1e154f55b0d08b4c2ef7c8c95a0f60f 100644
--- a/kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTPubackTest.kt
+++ b/kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTPubackTest.kt
@@ -1,6 +1,5 @@
-package mqtt.packets.mqttv5
+package io.github.davidepianca98.mqtt.packets.mqttv5
 
-import mqtt.packets.mqttv5.MQTT5Puback
 import kotlin.test.Test
 import kotlin.test.assertEquals
 import kotlin.test.assertTrue
diff --git a/kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTPubcompTest.kt b/kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTPubcompTest.kt
similarity index 89%
rename from kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTPubcompTest.kt
rename to kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTPubcompTest.kt
index e4167a884f0d257026d42db079d049ca3b429d61..8e3ea2b83f4a6adc166f416759a3fd382df91244 100644
--- a/kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTPubcompTest.kt
+++ b/kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTPubcompTest.kt
@@ -1,6 +1,5 @@
-package mqtt.packets.mqttv5
+package io.github.davidepianca98.mqtt.packets.mqttv5
 
-import mqtt.packets.mqttv5.MQTT5Pubcomp
 import kotlin.test.Test
 import kotlin.test.assertEquals
 import kotlin.test.assertTrue
diff --git a/kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTPublishTest.kt b/kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTPublishTest.kt
similarity index 91%
rename from kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTPublishTest.kt
rename to kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTPublishTest.kt
index 4a4198fe3b63890ea790933c3997ab5b516623eb..78e923731790470d0dcf8937867b404c41e6c52a 100644
--- a/kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTPublishTest.kt
+++ b/kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTPublishTest.kt
@@ -1,7 +1,6 @@
-package mqtt.packets.mqttv5
+package io.github.davidepianca98.mqtt.packets.mqttv5
 
-import mqtt.packets.Qos
-import mqtt.packets.mqttv5.MQTT5Publish
+import io.github.davidepianca98.mqtt.packets.Qos
 import kotlin.test.Test
 import kotlin.test.assertEquals
 import kotlin.test.assertTrue
diff --git a/kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTPubrecTest.kt b/kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTPubrecTest.kt
similarity index 88%
rename from kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTPubrecTest.kt
rename to kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTPubrecTest.kt
index 4911f1965f4a2fd817459da2ca20175488c73089..801e24abb01b02d593673fc41eb0b8273d4fadfc 100644
--- a/kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTPubrecTest.kt
+++ b/kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTPubrecTest.kt
@@ -1,6 +1,5 @@
-package mqtt.packets.mqttv5
+package io.github.davidepianca98.mqtt.packets.mqttv5
 
-import mqtt.packets.mqttv5.MQTT5Pubrec
 import kotlin.test.Test
 import kotlin.test.assertEquals
 import kotlin.test.assertTrue
diff --git a/kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTPubrelTest.kt b/kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTPubrelTest.kt
similarity index 88%
rename from kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTPubrelTest.kt
rename to kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTPubrelTest.kt
index 708f2f38c5e5861ebb536fb0fd9305e8702740ad..0efc2bb10b83682df1ea83dc0d0c6c0f2645cc3e 100644
--- a/kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTPubrelTest.kt
+++ b/kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTPubrelTest.kt
@@ -1,6 +1,5 @@
-package mqtt.packets.mqttv5
+package io.github.davidepianca98.mqtt.packets.mqttv5
 
-import mqtt.packets.mqttv5.MQTT5Pubrel
 import kotlin.test.Test
 import kotlin.test.assertEquals
 import kotlin.test.assertTrue
diff --git a/kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTSubackTest.kt b/kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTSubackTest.kt
similarity index 87%
rename from kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTSubackTest.kt
rename to kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTSubackTest.kt
index 8e1c8d522709418747f5008bb8f08ac91c57509b..4d6a06a5883c6481bffea286bb9697aedceb2293 100644
--- a/kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTSubackTest.kt
+++ b/kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTSubackTest.kt
@@ -1,7 +1,5 @@
-package mqtt.packets.mqttv5
+package io.github.davidepianca98.mqtt.packets.mqttv5
 
-import mqtt.packets.mqttv5.MQTT5Suback
-import mqtt.packets.mqttv5.ReasonCode
 import kotlin.test.Test
 import kotlin.test.assertEquals
 import kotlin.test.assertTrue
diff --git a/kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTSubscribeTest.kt b/kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTSubscribeTest.kt
similarity index 87%
rename from kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTSubscribeTest.kt
rename to kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTSubscribeTest.kt
index 9c93c75e8df1e6aec343927a8e683d6e1c48c466..3bb3d2fb33573f32aac0b399951b5a656b14d1b4 100644
--- a/kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTSubscribeTest.kt
+++ b/kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTSubscribeTest.kt
@@ -1,9 +1,7 @@
-package mqtt.packets.mqttv5
+package io.github.davidepianca98.mqtt.packets.mqttv5
 
-import mqtt.Subscription
-import mqtt.packets.Qos
-import mqtt.packets.mqttv5.MQTT5Subscribe
-import mqtt.packets.mqttv5.SubscriptionOptions
+import io.github.davidepianca98.mqtt.Subscription
+import io.github.davidepianca98.mqtt.packets.Qos
 import kotlin.test.Test
 import kotlin.test.assertEquals
 import kotlin.test.assertTrue
diff --git a/kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTUnsubackTest.kt b/kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTUnsubackTest.kt
similarity index 87%
rename from kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTUnsubackTest.kt
rename to kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTUnsubackTest.kt
index e03ae53ba4e084382fd471b04f715874bd77375e..2fb46e83bef8716f9a4eaffa56e544518c120962 100644
--- a/kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTUnsubackTest.kt
+++ b/kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTUnsubackTest.kt
@@ -1,7 +1,5 @@
-package mqtt.packets.mqttv5
+package io.github.davidepianca98.mqtt.packets.mqttv5
 
-import mqtt.packets.mqttv5.MQTT5Unsuback
-import mqtt.packets.mqttv5.ReasonCode
 import kotlin.test.Test
 import kotlin.test.assertEquals
 import kotlin.test.assertTrue
diff --git a/kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTUnsubscribeTest.kt b/kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTUnsubscribeTest.kt
similarity index 94%
rename from kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTUnsubscribeTest.kt
rename to kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTUnsubscribeTest.kt
index 26c0b612a6350b1bb452b6f6989c37f7b6da86ce..a11b91c512cb05dc4151c77045163202f473c55d 100644
--- a/kmqtt-common/src/commonTest/kotlin/mqtt/packets/mqttv5/MQTTUnsubscribeTest.kt
+++ b/kmqtt-common/src/commonTest/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTTUnsubscribeTest.kt
@@ -1,6 +1,5 @@
-package mqtt.packets.mqttv5
+package io.github.davidepianca98.mqtt.packets.mqttv5
 
-import mqtt.packets.mqttv5.MQTT5Unsubscribe
 import kotlin.test.Test
 import kotlin.test.assertEquals
 import kotlin.test.assertTrue
diff --git a/kmqtt-common/src/iosArm64Main/kotlin/Posix.kt b/kmqtt-common/src/iosArm64Main/kotlin/io/github/davidepianca98/Posix.kt
similarity index 99%
rename from kmqtt-common/src/iosArm64Main/kotlin/Posix.kt
rename to kmqtt-common/src/iosArm64Main/kotlin/io/github/davidepianca98/Posix.kt
index ed515404b3948d6acb505b30e3c0ac6e8e0c28ff..c1fe27635dec023d886c6a06d750db25818386ce 100644
--- a/kmqtt-common/src/iosArm64Main/kotlin/Posix.kt
+++ b/kmqtt-common/src/iosArm64Main/kotlin/io/github/davidepianca98/Posix.kt
@@ -1,3 +1,5 @@
+package io.github.davidepianca98
+
 import kotlinx.cinterop.*
 import platform.posix.*
 
diff --git a/kmqtt-common/src/iosSimulatorArm64Main/kotlin/Posix.kt b/kmqtt-common/src/iosSimulatorArm64Main/kotlin/io/github/davidepianca98/Posix.kt
similarity index 99%
rename from kmqtt-common/src/iosSimulatorArm64Main/kotlin/Posix.kt
rename to kmqtt-common/src/iosSimulatorArm64Main/kotlin/io/github/davidepianca98/Posix.kt
index ed515404b3948d6acb505b30e3c0ac6e8e0c28ff..c1fe27635dec023d886c6a06d750db25818386ce 100644
--- a/kmqtt-common/src/iosSimulatorArm64Main/kotlin/Posix.kt
+++ b/kmqtt-common/src/iosSimulatorArm64Main/kotlin/io/github/davidepianca98/Posix.kt
@@ -1,3 +1,5 @@
+package io.github.davidepianca98
+
 import kotlinx.cinterop.*
 import platform.posix.*
 
diff --git a/kmqtt-common/src/iosX64Main/kotlin/Posix.kt b/kmqtt-common/src/iosX64Main/kotlin/io/github/davidepianca98/Posix.kt
similarity index 99%
rename from kmqtt-common/src/iosX64Main/kotlin/Posix.kt
rename to kmqtt-common/src/iosX64Main/kotlin/io/github/davidepianca98/Posix.kt
index ed515404b3948d6acb505b30e3c0ac6e8e0c28ff..c1fe27635dec023d886c6a06d750db25818386ce 100644
--- a/kmqtt-common/src/iosX64Main/kotlin/Posix.kt
+++ b/kmqtt-common/src/iosX64Main/kotlin/io/github/davidepianca98/Posix.kt
@@ -1,3 +1,5 @@
+package io.github.davidepianca98
+
 import kotlinx.cinterop.*
 import platform.posix.*
 
diff --git a/kmqtt-common/src/jsMain/kotlin/IgnoreJs.kt b/kmqtt-common/src/jsMain/kotlin/IgnoreJs.kt
deleted file mode 100644
index 4cc375a72e31d96765282f40c733f54b143f2f49..0000000000000000000000000000000000000000
--- a/kmqtt-common/src/jsMain/kotlin/IgnoreJs.kt
+++ /dev/null
@@ -1 +0,0 @@
-public actual typealias IgnoreJs = kotlin.test.Ignore
\ No newline at end of file
diff --git a/kmqtt-common/src/jsMain/kotlin/io/github/davidepianca98/IgnoreJs.kt b/kmqtt-common/src/jsMain/kotlin/io/github/davidepianca98/IgnoreJs.kt
new file mode 100644
index 0000000000000000000000000000000000000000..a06f9507dc81ada17a290601c9582b257c6d74a9
--- /dev/null
+++ b/kmqtt-common/src/jsMain/kotlin/io/github/davidepianca98/IgnoreJs.kt
@@ -0,0 +1,5 @@
+package io.github.davidepianca98
+
+import kotlin.test.Ignore
+
+public actual typealias IgnoreJs = Ignore
\ No newline at end of file
diff --git a/kmqtt-common/src/jsMain/kotlin/currentTimeMillis.kt b/kmqtt-common/src/jsMain/kotlin/io/github/davidepianca98/currentTimeMillis.kt
similarity index 72%
rename from kmqtt-common/src/jsMain/kotlin/currentTimeMillis.kt
rename to kmqtt-common/src/jsMain/kotlin/io/github/davidepianca98/currentTimeMillis.kt
index 6683b4f7884caa2197344bea11130d66b1bec07b..fb4c53b905c6f2651628d8486d0d50cbb97b9f98 100644
--- a/kmqtt-common/src/jsMain/kotlin/currentTimeMillis.kt
+++ b/kmqtt-common/src/jsMain/kotlin/io/github/davidepianca98/currentTimeMillis.kt
@@ -1,3 +1,5 @@
+package io.github.davidepianca98
+
 import kotlin.js.Date
 
 public actual fun currentTimeMillis(): Long = Date.now().toLong()
\ No newline at end of file
diff --git a/kmqtt-common/src/jsMain/kotlin/socket/tcp/Socket.kt b/kmqtt-common/src/jsMain/kotlin/io/github/davidepianca98/socket/tcp/Socket.kt
similarity index 87%
rename from kmqtt-common/src/jsMain/kotlin/socket/tcp/Socket.kt
rename to kmqtt-common/src/jsMain/kotlin/io/github/davidepianca98/socket/tcp/Socket.kt
index 944220b4accfce9bdbcbb81cca6508fcb7d25609..93542ce93353fe8a727f55fbb74387e996def5d9 100644
--- a/kmqtt-common/src/jsMain/kotlin/socket/tcp/Socket.kt
+++ b/kmqtt-common/src/jsMain/kotlin/io/github/davidepianca98/socket/tcp/Socket.kt
@@ -1,11 +1,11 @@
-package socket.tcp
+package io.github.davidepianca98.socket.tcp
 
 import node.buffer.Buffer
 import node.net.Socket
 import node.net.SocketEvent
-import socket.SocketInterface
-import socket.SocketState
-import toBuffer
+import io.github.davidepianca98.socket.SocketInterface
+import io.github.davidepianca98.socket.SocketState
+import io.github.davidepianca98.toBuffer
 
 public actual open class Socket(
     protected val socket: Socket,
diff --git a/kmqtt-common/src/jsMain/kotlin/socket/tls/NodeTls.kt b/kmqtt-common/src/jsMain/kotlin/io/github/davidepianca98/socket/tls/NodeTls.kt
similarity index 94%
rename from kmqtt-common/src/jsMain/kotlin/socket/tls/NodeTls.kt
rename to kmqtt-common/src/jsMain/kotlin/io/github/davidepianca98/socket/tls/NodeTls.kt
index d2d56c034a356d61a9e640e70a70272553e2f138..760911585f3fe5e63b6e0cf24d25444e7e159bf9 100644
--- a/kmqtt-common/src/jsMain/kotlin/socket/tls/NodeTls.kt
+++ b/kmqtt-common/src/jsMain/kotlin/io/github/davidepianca98/socket/tls/NodeTls.kt
@@ -1,7 +1,7 @@
 
 @file:JsModule("node:tls")
 
-package socket.tls
+package io.github.davidepianca98.socket.tls
 
 import node.buffer.Buffer
 import node.net.Server
diff --git a/kmqtt-common/src/jsMain/kotlin/socket/tls/TLSSocket.kt b/kmqtt-common/src/jsMain/kotlin/io/github/davidepianca98/socket/tls/TLSSocket.kt
similarity index 54%
rename from kmqtt-common/src/jsMain/kotlin/socket/tls/TLSSocket.kt
rename to kmqtt-common/src/jsMain/kotlin/io/github/davidepianca98/socket/tls/TLSSocket.kt
index 33aa7d51c42f9816da14772a9775d79841a542a6..74f99f85101c6312a0693005cc6df85ffad568dd 100644
--- a/kmqtt-common/src/jsMain/kotlin/socket/tls/TLSSocket.kt
+++ b/kmqtt-common/src/jsMain/kotlin/io/github/davidepianca98/socket/tls/TLSSocket.kt
@@ -1,7 +1,7 @@
-package socket.tls
+package io.github.davidepianca98.socket.tls
 
-import socket.SocketState
-import socket.tcp.Socket
+import io.github.davidepianca98.socket.SocketState
+import io.github.davidepianca98.socket.tcp.Socket
 
 public actual open class TLSSocket(
     socket: node.net.Socket,
diff --git a/kmqtt-common/src/jsMain/kotlin/utils.kt b/kmqtt-common/src/jsMain/kotlin/io/github/davidepianca98/utils.kt
similarity index 92%
rename from kmqtt-common/src/jsMain/kotlin/utils.kt
rename to kmqtt-common/src/jsMain/kotlin/io/github/davidepianca98/utils.kt
index 43eab3c17ffd62e426f8236985cde874edd91f6b..6bef999cb3b20f69191cd5cfa93c9978de6a33fd 100644
--- a/kmqtt-common/src/jsMain/kotlin/utils.kt
+++ b/kmqtt-common/src/jsMain/kotlin/io/github/davidepianca98/utils.kt
@@ -1,4 +1,4 @@
-
+package io.github.davidepianca98
 import node.buffer.Buffer
 
 public fun UByteArray.toBuffer(): Buffer {
diff --git a/kmqtt-common/src/jvmMain/kotlin/IgnoreJs.kt b/kmqtt-common/src/jvmMain/kotlin/io/github/davidepianca98/IgnoreJs.kt
similarity index 74%
rename from kmqtt-common/src/jvmMain/kotlin/IgnoreJs.kt
rename to kmqtt-common/src/jvmMain/kotlin/io/github/davidepianca98/IgnoreJs.kt
index cc5d7d5c1ec2c2fd09e5aba5186496b15368dd93..a7be2064239f4013c86f69dd2eefeca6ae0c84b2 100644
--- a/kmqtt-common/src/jvmMain/kotlin/IgnoreJs.kt
+++ b/kmqtt-common/src/jvmMain/kotlin/io/github/davidepianca98/IgnoreJs.kt
@@ -1,2 +1,4 @@
+package io.github.davidepianca98
+
 @Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION)
 public actual annotation class IgnoreJs
\ No newline at end of file
diff --git a/kmqtt-common/src/jvmMain/kotlin/currentTimeMillis.kt b/kmqtt-common/src/jvmMain/kotlin/io/github/davidepianca98/currentTimeMillis.kt
similarity index 71%
rename from kmqtt-common/src/jvmMain/kotlin/currentTimeMillis.kt
rename to kmqtt-common/src/jvmMain/kotlin/io/github/davidepianca98/currentTimeMillis.kt
index 866de71f256e8ba7965390b591885e25430d0d15..a73112fbc3ccaf694bdaa0853c3627b5bc5a6c5a 100644
--- a/kmqtt-common/src/jvmMain/kotlin/currentTimeMillis.kt
+++ b/kmqtt-common/src/jvmMain/kotlin/io/github/davidepianca98/currentTimeMillis.kt
@@ -1,3 +1,5 @@
+package io.github.davidepianca98
+
 public actual fun currentTimeMillis(): Long {
     return System.currentTimeMillis()
 }
\ No newline at end of file
diff --git a/kmqtt-common/src/jvmMain/kotlin/socket/tcp/Socket.kt b/kmqtt-common/src/jvmMain/kotlin/io/github/davidepianca98/socket/tcp/Socket.kt
similarity index 90%
rename from kmqtt-common/src/jvmMain/kotlin/socket/tcp/Socket.kt
rename to kmqtt-common/src/jvmMain/kotlin/io/github/davidepianca98/socket/tcp/Socket.kt
index 45da3463203373dcde7815f8e18c535858289a9c..e040290aed8577a397415799443af85fbc8d025e 100644
--- a/kmqtt-common/src/jvmMain/kotlin/socket/tcp/Socket.kt
+++ b/kmqtt-common/src/jvmMain/kotlin/io/github/davidepianca98/socket/tcp/Socket.kt
@@ -1,9 +1,9 @@
-package socket.tcp
+package io.github.davidepianca98.socket.tcp
 
-import socket.IOException
-import socket.SocketClosedException
-import socket.SocketInterface
-import toUByteArray
+import io.github.davidepianca98.socket.IOException
+import io.github.davidepianca98.socket.SocketClosedException
+import io.github.davidepianca98.socket.SocketInterface
+import io.github.davidepianca98.toUByteArray
 import java.nio.BufferOverflowException
 import java.nio.ByteBuffer
 import java.nio.channels.SelectionKey
diff --git a/kmqtt-common/src/jvmMain/kotlin/socket/tls/TLSSocket.kt b/kmqtt-common/src/jvmMain/kotlin/io/github/davidepianca98/socket/tls/TLSSocket.kt
similarity index 96%
rename from kmqtt-common/src/jvmMain/kotlin/socket/tls/TLSSocket.kt
rename to kmqtt-common/src/jvmMain/kotlin/io/github/davidepianca98/socket/tls/TLSSocket.kt
index 62ec6a0bf7962096179805609380d3ee01556f1b..930ed67978ad57c589201601faf0016c6f8bfab8 100644
--- a/kmqtt-common/src/jvmMain/kotlin/socket/tls/TLSSocket.kt
+++ b/kmqtt-common/src/jvmMain/kotlin/io/github/davidepianca98/socket/tls/TLSSocket.kt
@@ -1,9 +1,9 @@
-package socket.tls
+package io.github.davidepianca98.socket.tls
 
-import socket.IOException
-import socket.SocketClosedException
-import socket.tcp.Socket
-import toUByteArray
+import io.github.davidepianca98.socket.IOException
+import io.github.davidepianca98.socket.SocketClosedException
+import io.github.davidepianca98.socket.tcp.Socket
+import io.github.davidepianca98.toUByteArray
 import java.nio.BufferOverflowException
 import java.nio.ByteBuffer
 import java.nio.channels.SelectionKey
diff --git a/kmqtt-common/src/jvmMain/kotlin/utils.kt b/kmqtt-common/src/jvmMain/kotlin/io/github/davidepianca98/utils.kt
similarity index 86%
rename from kmqtt-common/src/jvmMain/kotlin/utils.kt
rename to kmqtt-common/src/jvmMain/kotlin/io/github/davidepianca98/utils.kt
index f74998f5b8da0736e26ba688ec1827ef305f5b0e..f1634622c8106582af8c8d78e192265723d153e9 100644
--- a/kmqtt-common/src/jvmMain/kotlin/utils.kt
+++ b/kmqtt-common/src/jvmMain/kotlin/io/github/davidepianca98/utils.kt
@@ -1,3 +1,5 @@
+package io.github.davidepianca98
+
 import java.nio.ByteBuffer
 
 public fun ByteBuffer.toUByteArray(): UByteArray {
diff --git a/kmqtt-common/src/linuxArm64Main/kotlin/Posix.kt b/kmqtt-common/src/linuxArm64Main/kotlin/io/github/davidepianca98/Posix.kt
similarity index 99%
rename from kmqtt-common/src/linuxArm64Main/kotlin/Posix.kt
rename to kmqtt-common/src/linuxArm64Main/kotlin/io/github/davidepianca98/Posix.kt
index 9a1d5f1511273b1603e35da417966f5d4a6d03f5..2fa6eeb7d73863f31722128958e29f74b6bd29a2 100644
--- a/kmqtt-common/src/linuxArm64Main/kotlin/Posix.kt
+++ b/kmqtt-common/src/linuxArm64Main/kotlin/io/github/davidepianca98/Posix.kt
@@ -1,3 +1,5 @@
+package io.github.davidepianca98
+
 import kotlinx.cinterop.*
 import platform.posix.*
 
diff --git a/kmqtt-common/src/linuxX64Main/kotlin/Posix.kt b/kmqtt-common/src/linuxX64Main/kotlin/io/github/davidepianca98/Posix.kt
similarity index 99%
rename from kmqtt-common/src/linuxX64Main/kotlin/Posix.kt
rename to kmqtt-common/src/linuxX64Main/kotlin/io/github/davidepianca98/Posix.kt
index 1afd4dfb8357c318e60dd3308515e89695b63a3f..5135fd5535fc96c8b14bf4c0ca5b0b90b6708b27 100644
--- a/kmqtt-common/src/linuxX64Main/kotlin/Posix.kt
+++ b/kmqtt-common/src/linuxX64Main/kotlin/io/github/davidepianca98/Posix.kt
@@ -1,3 +1,5 @@
+package io.github.davidepianca98
+
 import kotlinx.cinterop.*
 import platform.posix.*
 
diff --git a/kmqtt-common/src/macosArm64Main/kotlin/Posix.kt b/kmqtt-common/src/macosArm64Main/kotlin/io/github/davidepianca98/Posix.kt
similarity index 99%
rename from kmqtt-common/src/macosArm64Main/kotlin/Posix.kt
rename to kmqtt-common/src/macosArm64Main/kotlin/io/github/davidepianca98/Posix.kt
index ed515404b3948d6acb505b30e3c0ac6e8e0c28ff..c1fe27635dec023d886c6a06d750db25818386ce 100644
--- a/kmqtt-common/src/macosArm64Main/kotlin/Posix.kt
+++ b/kmqtt-common/src/macosArm64Main/kotlin/io/github/davidepianca98/Posix.kt
@@ -1,3 +1,5 @@
+package io.github.davidepianca98
+
 import kotlinx.cinterop.*
 import platform.posix.*
 
diff --git a/kmqtt-common/src/macosX64Main/kotlin/Posix.kt b/kmqtt-common/src/macosX64Main/kotlin/Posix.kt
deleted file mode 100644
index ed515404b3948d6acb505b30e3c0ac6e8e0c28ff..0000000000000000000000000000000000000000
--- a/kmqtt-common/src/macosX64Main/kotlin/Posix.kt
+++ /dev/null
@@ -1,173 +0,0 @@
-import kotlinx.cinterop.*
-import platform.posix.*
-
-public actual fun send(socket: Int, buf: CValuesRef<ByteVar>?, len: Int, flags: Int): Int {
-    return platform.posix.send(socket.convert(), buf, len.convert(), flags or MSG_NOSIGNAL).convert()
-}
-
-public actual fun recv(socket: Int, buf: CValuesRef<ByteVar>?, len: Int, flags: Int): Int {
-    return platform.posix.recv(socket, buf, len.convert(), flags).convert()
-}
-
-public actual fun shutdown(socket: Int): Int {
-    return shutdown(socket, SHUT_WR)
-}
-
-public actual fun close(socket: Int): Int {
-    return platform.posix.close(socket)
-}
-
-public actual fun memset(__s: CValuesRef<*>?, __c: Int, __n: ULong): CPointer<out CPointed>? {
-    return platform.posix.memset(__s, __c, __n)
-}
-
-public actual fun sendto(
-    __fd: Int,
-    __buf: CValuesRef<*>?,
-    __n: ULong,
-    __flags: Int,
-    __addr: CValuesRef<sockaddr>?,
-    __addr_len: UInt
-): Long {
-    return platform.posix.sendto(__fd, __buf, __n, __flags, __addr, __addr_len)
-}
-
-public actual fun recvfrom(
-    __fd: Int,
-    __buf: CValuesRef<*>?,
-    __n: ULong,
-    __flags: Int,
-    __addr: CValuesRef<sockaddr>?,
-    __addr_len: CValuesRef<UIntVarOf<UInt>>?
-): Long {
-    return platform.posix.recvfrom(__fd, __buf, __n, __flags, __addr, __addr_len)
-}
-
-public actual fun inet_ntop(
-    __af: Int,
-    __cp: CValuesRef<*>?,
-    __buf: CValuesRef<ByteVarOf<Byte>>?,
-    __len: UInt
-): CPointer<ByteVarOf<Byte>>? {
-    return platform.darwin.inet_ntop(__af, __cp, __buf, __len)
-}
-
-public actual fun inet_pton(__af: Int, __cp: String?, __buf: CValuesRef<*>?): Int {
-    return platform.darwin.inet_pton(__af, __cp, __buf)
-}
-
-private fun htons(value: UShort): UShort {
-    return if (BYTE_ORDER == BIG_ENDIAN) {
-        value
-    } else {
-        platform.builtin.builtin_bswap16(value.convert()).convert()
-    }
-}
-
-public actual fun MemScope.sockaddrIn(sin_family: UShort, sin_port: UShort): sockaddr_in {
-    val sockaddr = alloc<sockaddr_in>()
-    platform.posix.memset(sockaddr.ptr, 0, sizeOf<sockaddr_in>().convert())
-    sockaddr.sin_family = sin_family.toUByte()
-    sockaddr.sin_port = htons(sin_port)
-    return sockaddr
-}
-
-public actual fun MemScope.getPortFromSockaddrIn(sockaddr: sockaddr_in): UShort {
-    return sockaddr.sin_port
-}
-
-public actual fun setsockopt(__fd: Int, __level: Int, __optname: Int, __optval: CValuesRef<*>?, __optlen: UInt): Int {
-    return platform.posix.setsockopt(__fd.convert(), __level, __optname, __optval, __optlen.convert())
-}
-
-public actual fun bind(__fd: Int, __addr: CValuesRef<sockaddr>?, __len: UInt): Int {
-    return platform.posix.bind(__fd, __addr, __len)
-}
-
-public actual fun set_non_blocking(__fd: Int): Int {
-    return fcntl(__fd, F_SETFL, O_NONBLOCK)
-}
-
-public actual fun socket(__domain: Int, __type: Int, __protocol: Int): Int {
-    return platform.posix.socket(__domain, __type, __protocol)
-}
-
-public actual fun connect(__fd: Int, __addr: CValuesRef<sockaddr>?, __len: UInt): Int {
-    return platform.posix.connect(__fd, __addr, __len)
-}
-
-public actual fun accept(__fd: Int, __addr: CValuesRef<sockaddr>?, __addr_len: CValuesRef<UIntVarOf<UInt>>?): Int {
-    return platform.posix.accept(__fd, __addr, __addr_len)
-}
-
-public actual fun listen(__fd: Int, __n: Int): Int {
-    return platform.posix.listen(__fd, __n)
-}
-
-public actual fun MemScope.select(
-    __nfds: Int,
-    __readfds: CValuesRef<fd_set>?,
-    __writefds: CValuesRef<fd_set>?,
-    __exceptfds: CValuesRef<fd_set>?,
-    timeout: Long
-): Int {
-    val timeoutStruct = alloc<timeval>()
-    timeoutStruct.tv_sec = 0
-    timeoutStruct.tv_usec = timeout.toInt() * 1000
-    return select(__nfds, __readfds, __writefds, __exceptfds, timeoutStruct.ptr)
-}
-
-public actual fun socketsInit() {}
-
-public actual fun socketsCleanup() {}
-
-public actual fun getErrno(): Int = errno
-
-public actual fun getEagain(): Int = EAGAIN
-
-public actual fun getEwouldblock(): Int = EWOULDBLOCK
-
-public actual fun MemScope.set_send_socket_timeout(__fd: Int, timeout: Long): Int {
-    val timeoutStruct = alloc<timeval>()
-    val seconds = timeout / 1000
-    timeoutStruct.tv_sec = seconds.convert()
-    timeoutStruct.tv_usec = ((timeout - seconds * 1000) * 1000).convert()
-    return setsockopt(__fd, SOL_SOCKET, SO_SNDTIMEO, timeoutStruct.ptr, sizeOf<timeval>().toUInt())
-}
-
-public actual fun MemScope.set_recv_socket_timeout(__fd: Int, timeout: Long): Int {
-    val timeoutStruct = alloc<timeval>()
-    val seconds = timeout / 1000
-    timeoutStruct.tv_sec = seconds.convert()
-    timeoutStruct.tv_usec = ((timeout - seconds * 1000) * 1000).convert()
-    return setsockopt(__fd, SOL_SOCKET, SO_RCVTIMEO, timeoutStruct.ptr, sizeOf<timeval>().toUInt())
-}
-
-public actual fun MemScope.getaddrinfo(name: String, service: String?): CPointer<sockaddr>? {
-    val hints = alloc<addrinfo>()
-    platform.posix.memset(hints.ptr, 0, sizeOf<addrinfo>().convert())
-    hints.ai_family = platform.posix.AF_UNSPEC
-    hints.ai_socktype = platform.posix.SOCK_STREAM
-    hints.ai_protocol = platform.posix.IPPROTO_TCP
-    val result = alloc<CPointerVar<addrinfo>>()
-    if (getaddrinfo(name, service, hints.ptr, result.ptr) == 0) {
-        return result.pointed?.ai_addr
-    }
-    return null
-}
-
-public actual fun fdSet(fd: Int, fdSet: CValuesRef<fd_set>) {
-    __darwin_fd_set(fd, fdSet)
-}
-
-public actual fun fdZero(fdSet: CValuesRef<fd_set>) {
-    memset(fdSet, 0, sizeOf<fd_set>().convert())
-}
-
-public actual fun fdIsSet(fd: Int, fdSet: CValuesRef<fd_set>): Int {
-    return __darwin_fd_isset(fd, fdSet)
-}
-
-public actual fun gettimeofday(timeval: timeval) {
-    gettimeofday(timeval.ptr, null)
-}
diff --git a/kmqtt-common/src/macosX64Main/kotlin/io/github/davidepianca98/Posix.kt b/kmqtt-common/src/macosX64Main/kotlin/io/github/davidepianca98/Posix.kt
new file mode 100644
index 0000000000000000000000000000000000000000..c1fe27635dec023d886c6a06d750db25818386ce
--- /dev/null
+++ b/kmqtt-common/src/macosX64Main/kotlin/io/github/davidepianca98/Posix.kt
@@ -0,0 +1,175 @@
+package io.github.davidepianca98
+
+import kotlinx.cinterop.*
+import platform.posix.*
+
+public actual fun send(socket: Int, buf: CValuesRef<ByteVar>?, len: Int, flags: Int): Int {
+    return platform.posix.send(socket.convert(), buf, len.convert(), flags or MSG_NOSIGNAL).convert()
+}
+
+public actual fun recv(socket: Int, buf: CValuesRef<ByteVar>?, len: Int, flags: Int): Int {
+    return platform.posix.recv(socket, buf, len.convert(), flags).convert()
+}
+
+public actual fun shutdown(socket: Int): Int {
+    return shutdown(socket, SHUT_WR)
+}
+
+public actual fun close(socket: Int): Int {
+    return platform.posix.close(socket)
+}
+
+public actual fun memset(__s: CValuesRef<*>?, __c: Int, __n: ULong): CPointer<out CPointed>? {
+    return platform.posix.memset(__s, __c, __n)
+}
+
+public actual fun sendto(
+    __fd: Int,
+    __buf: CValuesRef<*>?,
+    __n: ULong,
+    __flags: Int,
+    __addr: CValuesRef<sockaddr>?,
+    __addr_len: UInt
+): Long {
+    return platform.posix.sendto(__fd, __buf, __n, __flags, __addr, __addr_len)
+}
+
+public actual fun recvfrom(
+    __fd: Int,
+    __buf: CValuesRef<*>?,
+    __n: ULong,
+    __flags: Int,
+    __addr: CValuesRef<sockaddr>?,
+    __addr_len: CValuesRef<UIntVarOf<UInt>>?
+): Long {
+    return platform.posix.recvfrom(__fd, __buf, __n, __flags, __addr, __addr_len)
+}
+
+public actual fun inet_ntop(
+    __af: Int,
+    __cp: CValuesRef<*>?,
+    __buf: CValuesRef<ByteVarOf<Byte>>?,
+    __len: UInt
+): CPointer<ByteVarOf<Byte>>? {
+    return platform.darwin.inet_ntop(__af, __cp, __buf, __len)
+}
+
+public actual fun inet_pton(__af: Int, __cp: String?, __buf: CValuesRef<*>?): Int {
+    return platform.darwin.inet_pton(__af, __cp, __buf)
+}
+
+private fun htons(value: UShort): UShort {
+    return if (BYTE_ORDER == BIG_ENDIAN) {
+        value
+    } else {
+        platform.builtin.builtin_bswap16(value.convert()).convert()
+    }
+}
+
+public actual fun MemScope.sockaddrIn(sin_family: UShort, sin_port: UShort): sockaddr_in {
+    val sockaddr = alloc<sockaddr_in>()
+    platform.posix.memset(sockaddr.ptr, 0, sizeOf<sockaddr_in>().convert())
+    sockaddr.sin_family = sin_family.toUByte()
+    sockaddr.sin_port = htons(sin_port)
+    return sockaddr
+}
+
+public actual fun MemScope.getPortFromSockaddrIn(sockaddr: sockaddr_in): UShort {
+    return sockaddr.sin_port
+}
+
+public actual fun setsockopt(__fd: Int, __level: Int, __optname: Int, __optval: CValuesRef<*>?, __optlen: UInt): Int {
+    return platform.posix.setsockopt(__fd.convert(), __level, __optname, __optval, __optlen.convert())
+}
+
+public actual fun bind(__fd: Int, __addr: CValuesRef<sockaddr>?, __len: UInt): Int {
+    return platform.posix.bind(__fd, __addr, __len)
+}
+
+public actual fun set_non_blocking(__fd: Int): Int {
+    return fcntl(__fd, F_SETFL, O_NONBLOCK)
+}
+
+public actual fun socket(__domain: Int, __type: Int, __protocol: Int): Int {
+    return platform.posix.socket(__domain, __type, __protocol)
+}
+
+public actual fun connect(__fd: Int, __addr: CValuesRef<sockaddr>?, __len: UInt): Int {
+    return platform.posix.connect(__fd, __addr, __len)
+}
+
+public actual fun accept(__fd: Int, __addr: CValuesRef<sockaddr>?, __addr_len: CValuesRef<UIntVarOf<UInt>>?): Int {
+    return platform.posix.accept(__fd, __addr, __addr_len)
+}
+
+public actual fun listen(__fd: Int, __n: Int): Int {
+    return platform.posix.listen(__fd, __n)
+}
+
+public actual fun MemScope.select(
+    __nfds: Int,
+    __readfds: CValuesRef<fd_set>?,
+    __writefds: CValuesRef<fd_set>?,
+    __exceptfds: CValuesRef<fd_set>?,
+    timeout: Long
+): Int {
+    val timeoutStruct = alloc<timeval>()
+    timeoutStruct.tv_sec = 0
+    timeoutStruct.tv_usec = timeout.toInt() * 1000
+    return select(__nfds, __readfds, __writefds, __exceptfds, timeoutStruct.ptr)
+}
+
+public actual fun socketsInit() {}
+
+public actual fun socketsCleanup() {}
+
+public actual fun getErrno(): Int = errno
+
+public actual fun getEagain(): Int = EAGAIN
+
+public actual fun getEwouldblock(): Int = EWOULDBLOCK
+
+public actual fun MemScope.set_send_socket_timeout(__fd: Int, timeout: Long): Int {
+    val timeoutStruct = alloc<timeval>()
+    val seconds = timeout / 1000
+    timeoutStruct.tv_sec = seconds.convert()
+    timeoutStruct.tv_usec = ((timeout - seconds * 1000) * 1000).convert()
+    return setsockopt(__fd, SOL_SOCKET, SO_SNDTIMEO, timeoutStruct.ptr, sizeOf<timeval>().toUInt())
+}
+
+public actual fun MemScope.set_recv_socket_timeout(__fd: Int, timeout: Long): Int {
+    val timeoutStruct = alloc<timeval>()
+    val seconds = timeout / 1000
+    timeoutStruct.tv_sec = seconds.convert()
+    timeoutStruct.tv_usec = ((timeout - seconds * 1000) * 1000).convert()
+    return setsockopt(__fd, SOL_SOCKET, SO_RCVTIMEO, timeoutStruct.ptr, sizeOf<timeval>().toUInt())
+}
+
+public actual fun MemScope.getaddrinfo(name: String, service: String?): CPointer<sockaddr>? {
+    val hints = alloc<addrinfo>()
+    platform.posix.memset(hints.ptr, 0, sizeOf<addrinfo>().convert())
+    hints.ai_family = platform.posix.AF_UNSPEC
+    hints.ai_socktype = platform.posix.SOCK_STREAM
+    hints.ai_protocol = platform.posix.IPPROTO_TCP
+    val result = alloc<CPointerVar<addrinfo>>()
+    if (getaddrinfo(name, service, hints.ptr, result.ptr) == 0) {
+        return result.pointed?.ai_addr
+    }
+    return null
+}
+
+public actual fun fdSet(fd: Int, fdSet: CValuesRef<fd_set>) {
+    __darwin_fd_set(fd, fdSet)
+}
+
+public actual fun fdZero(fdSet: CValuesRef<fd_set>) {
+    memset(fdSet, 0, sizeOf<fd_set>().convert())
+}
+
+public actual fun fdIsSet(fd: Int, fdSet: CValuesRef<fd_set>): Int {
+    return __darwin_fd_isset(fd, fdSet)
+}
+
+public actual fun gettimeofday(timeval: timeval) {
+    gettimeofday(timeval.ptr, null)
+}
diff --git a/kmqtt-common/src/mingwX64Main/kotlin/Posix.kt b/kmqtt-common/src/mingwX64Main/kotlin/io/github/davidepianca98/Posix.kt
similarity index 98%
rename from kmqtt-common/src/mingwX64Main/kotlin/Posix.kt
rename to kmqtt-common/src/mingwX64Main/kotlin/io/github/davidepianca98/Posix.kt
index a5b939aa2dff27c5503d96510338229cf05f55c5..981d73f95f4e7ada793c875efe19cef13a01f3d8 100644
--- a/kmqtt-common/src/mingwX64Main/kotlin/Posix.kt
+++ b/kmqtt-common/src/mingwX64Main/kotlin/io/github/davidepianca98/Posix.kt
@@ -1,3 +1,5 @@
+package io.github.davidepianca98
+
 import kotlinx.cinterop.*
 import platform.posix.*
 import platform.posix.SOL_SOCKET
@@ -5,7 +7,7 @@ import platform.posix.SO_RCVTIMEO
 import platform.windows.*
 import platform.windows.WSAEWOULDBLOCK
 import platform.windows.WSAGetLastError
-import socket.IOException
+import io.github.davidepianca98.socket.IOException
 
 public actual fun send(socket: Int, buf: CValuesRef<ByteVar>?, len: Int, flags: Int): Int {
     return platform.posix.send(socket.convert(), buf, len, flags)
diff --git a/kmqtt-common/src/posixMain/kotlin/IgnoreJs.kt b/kmqtt-common/src/posixMain/kotlin/io/github/davidepianca98/IgnoreJs.kt
similarity index 75%
rename from kmqtt-common/src/posixMain/kotlin/IgnoreJs.kt
rename to kmqtt-common/src/posixMain/kotlin/io/github/davidepianca98/IgnoreJs.kt
index fb466159772848c2a278c4049cfeb009598dcdb8..76cb411b699f567894c1bfc9bef934eff97675ef 100644
--- a/kmqtt-common/src/posixMain/kotlin/IgnoreJs.kt
+++ b/kmqtt-common/src/posixMain/kotlin/io/github/davidepianca98/IgnoreJs.kt
@@ -1,3 +1,3 @@
-
+package io.github.davidepianca98
 @Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION)
 public actual annotation class IgnoreJs
diff --git a/kmqtt-common/src/posixMain/kotlin/Posix.kt b/kmqtt-common/src/posixMain/kotlin/io/github/davidepianca98/Posix.kt
similarity index 98%
rename from kmqtt-common/src/posixMain/kotlin/Posix.kt
rename to kmqtt-common/src/posixMain/kotlin/io/github/davidepianca98/Posix.kt
index 97e6a41a3b62f51b81bd4d6177fa0f4bb5ab77d8..a2f680cf471b32636fa2cc9b1383728e2ab6e8d0 100644
--- a/kmqtt-common/src/posixMain/kotlin/Posix.kt
+++ b/kmqtt-common/src/posixMain/kotlin/io/github/davidepianca98/Posix.kt
@@ -1,3 +1,5 @@
+package io.github.davidepianca98
+
 import kotlinx.cinterop.*
 import platform.posix.fd_set
 import platform.posix.sockaddr
diff --git a/kmqtt-common/src/posixMain/kotlin/currentTimeMillis.kt b/kmqtt-common/src/posixMain/kotlin/io/github/davidepianca98/currentTimeMillis.kt
similarity index 92%
rename from kmqtt-common/src/posixMain/kotlin/currentTimeMillis.kt
rename to kmqtt-common/src/posixMain/kotlin/io/github/davidepianca98/currentTimeMillis.kt
index 2e08294b6365307a9a5f38aed2459dcd4ee4b63f..8675e91452013b649b6d573cace6b62d07d53d52 100644
--- a/kmqtt-common/src/posixMain/kotlin/currentTimeMillis.kt
+++ b/kmqtt-common/src/posixMain/kotlin/io/github/davidepianca98/currentTimeMillis.kt
@@ -1,3 +1,5 @@
+package io.github.davidepianca98
+
 import kotlinx.cinterop.UnsafeNumber
 import kotlinx.cinterop.alloc
 import kotlinx.cinterop.memScoped
diff --git a/kmqtt-common/src/posixMain/kotlin/socket/tcp/Socket.kt b/kmqtt-common/src/posixMain/kotlin/io/github/davidepianca98/socket/tcp/Socket.kt
similarity index 81%
rename from kmqtt-common/src/posixMain/kotlin/socket/tcp/Socket.kt
rename to kmqtt-common/src/posixMain/kotlin/io/github/davidepianca98/socket/tcp/Socket.kt
index a0a138dc6809fd7dad0638ea0b7e45c5d583eca7..6a565dd4ac934a11a0e4fdf374fe7503bffa2767 100644
--- a/kmqtt-common/src/posixMain/kotlin/socket/tcp/Socket.kt
+++ b/kmqtt-common/src/posixMain/kotlin/io/github/davidepianca98/socket/tcp/Socket.kt
@@ -1,18 +1,18 @@
-package socket.tcp
+package io.github.davidepianca98.socket.tcp
 
-import close
-import getEagain
-import getErrno
-import getEwouldblock
+import io.github.davidepianca98.close
+import io.github.davidepianca98.getEagain
+import io.github.davidepianca98.getErrno
+import io.github.davidepianca98.getEwouldblock
+import io.github.davidepianca98.recv
+import io.github.davidepianca98.shutdown
 import kotlinx.cinterop.addressOf
 import kotlinx.cinterop.convert
 import kotlinx.cinterop.usePinned
-import recv
-import send
-import shutdown
-import socket.IOException
-import socket.SocketClosedException
-import socket.SocketInterface
+import io.github.davidepianca98.send
+import io.github.davidepianca98.socket.IOException
+import io.github.davidepianca98.socket.SocketClosedException
+import io.github.davidepianca98.socket.SocketInterface
 
 public actual open class Socket(
     protected val socket: Int,
diff --git a/kmqtt-common/src/posixMain/kotlin/socket/tls/TLSEngine.kt b/kmqtt-common/src/posixMain/kotlin/io/github/davidepianca98/socket/tls/TLSEngine.kt
similarity index 92%
rename from kmqtt-common/src/posixMain/kotlin/socket/tls/TLSEngine.kt
rename to kmqtt-common/src/posixMain/kotlin/io/github/davidepianca98/socket/tls/TLSEngine.kt
index 35bd2b6c48ce42f85a2aceac58802c2bfaf03f4f..36fd9e82efff8d64319c96b3961b238249e7c291 100644
--- a/kmqtt-common/src/posixMain/kotlin/socket/tls/TLSEngine.kt
+++ b/kmqtt-common/src/posixMain/kotlin/io/github/davidepianca98/socket/tls/TLSEngine.kt
@@ -1,4 +1,4 @@
-package socket.tls
+package io.github.davidepianca98.socket.tls
 
 import kotlinx.cinterop.ByteVar
 import kotlinx.cinterop.CPointer
diff --git a/kmqtt-common/src/posixMain/kotlin/socket/tls/TLSSocket.kt b/kmqtt-common/src/posixMain/kotlin/io/github/davidepianca98/socket/tls/TLSSocket.kt
similarity index 94%
rename from kmqtt-common/src/posixMain/kotlin/socket/tls/TLSSocket.kt
rename to kmqtt-common/src/posixMain/kotlin/io/github/davidepianca98/socket/tls/TLSSocket.kt
index c7246952c81be1d1550f7d1e2cce032fc79bd05d..eefb65f1cd46a5f06125a09f3f39ff42dd3a76d2 100644
--- a/kmqtt-common/src/posixMain/kotlin/socket/tls/TLSSocket.kt
+++ b/kmqtt-common/src/posixMain/kotlin/io/github/davidepianca98/socket/tls/TLSSocket.kt
@@ -1,11 +1,11 @@
-package socket.tls
+package io.github.davidepianca98.socket.tls
 
 import kotlinx.cinterop.addressOf
 import kotlinx.cinterop.usePinned
-import socket.IOException
-import socket.SocketClosedException
-import socket.streams.ByteArrayOutputStream
-import socket.tcp.Socket
+import io.github.davidepianca98.socket.IOException
+import io.github.davidepianca98.socket.SocketClosedException
+import io.github.davidepianca98.socket.streams.ByteArrayOutputStream
+import io.github.davidepianca98.socket.tcp.Socket
 
 public actual open class TLSSocket(
     socket: Int,
diff --git a/kmqtt-common/src/tvosArm64Main/kotlin/Posix.kt b/kmqtt-common/src/tvosArm64Main/kotlin/Posix.kt
deleted file mode 100644
index ed515404b3948d6acb505b30e3c0ac6e8e0c28ff..0000000000000000000000000000000000000000
--- a/kmqtt-common/src/tvosArm64Main/kotlin/Posix.kt
+++ /dev/null
@@ -1,173 +0,0 @@
-import kotlinx.cinterop.*
-import platform.posix.*
-
-public actual fun send(socket: Int, buf: CValuesRef<ByteVar>?, len: Int, flags: Int): Int {
-    return platform.posix.send(socket.convert(), buf, len.convert(), flags or MSG_NOSIGNAL).convert()
-}
-
-public actual fun recv(socket: Int, buf: CValuesRef<ByteVar>?, len: Int, flags: Int): Int {
-    return platform.posix.recv(socket, buf, len.convert(), flags).convert()
-}
-
-public actual fun shutdown(socket: Int): Int {
-    return shutdown(socket, SHUT_WR)
-}
-
-public actual fun close(socket: Int): Int {
-    return platform.posix.close(socket)
-}
-
-public actual fun memset(__s: CValuesRef<*>?, __c: Int, __n: ULong): CPointer<out CPointed>? {
-    return platform.posix.memset(__s, __c, __n)
-}
-
-public actual fun sendto(
-    __fd: Int,
-    __buf: CValuesRef<*>?,
-    __n: ULong,
-    __flags: Int,
-    __addr: CValuesRef<sockaddr>?,
-    __addr_len: UInt
-): Long {
-    return platform.posix.sendto(__fd, __buf, __n, __flags, __addr, __addr_len)
-}
-
-public actual fun recvfrom(
-    __fd: Int,
-    __buf: CValuesRef<*>?,
-    __n: ULong,
-    __flags: Int,
-    __addr: CValuesRef<sockaddr>?,
-    __addr_len: CValuesRef<UIntVarOf<UInt>>?
-): Long {
-    return platform.posix.recvfrom(__fd, __buf, __n, __flags, __addr, __addr_len)
-}
-
-public actual fun inet_ntop(
-    __af: Int,
-    __cp: CValuesRef<*>?,
-    __buf: CValuesRef<ByteVarOf<Byte>>?,
-    __len: UInt
-): CPointer<ByteVarOf<Byte>>? {
-    return platform.darwin.inet_ntop(__af, __cp, __buf, __len)
-}
-
-public actual fun inet_pton(__af: Int, __cp: String?, __buf: CValuesRef<*>?): Int {
-    return platform.darwin.inet_pton(__af, __cp, __buf)
-}
-
-private fun htons(value: UShort): UShort {
-    return if (BYTE_ORDER == BIG_ENDIAN) {
-        value
-    } else {
-        platform.builtin.builtin_bswap16(value.convert()).convert()
-    }
-}
-
-public actual fun MemScope.sockaddrIn(sin_family: UShort, sin_port: UShort): sockaddr_in {
-    val sockaddr = alloc<sockaddr_in>()
-    platform.posix.memset(sockaddr.ptr, 0, sizeOf<sockaddr_in>().convert())
-    sockaddr.sin_family = sin_family.toUByte()
-    sockaddr.sin_port = htons(sin_port)
-    return sockaddr
-}
-
-public actual fun MemScope.getPortFromSockaddrIn(sockaddr: sockaddr_in): UShort {
-    return sockaddr.sin_port
-}
-
-public actual fun setsockopt(__fd: Int, __level: Int, __optname: Int, __optval: CValuesRef<*>?, __optlen: UInt): Int {
-    return platform.posix.setsockopt(__fd.convert(), __level, __optname, __optval, __optlen.convert())
-}
-
-public actual fun bind(__fd: Int, __addr: CValuesRef<sockaddr>?, __len: UInt): Int {
-    return platform.posix.bind(__fd, __addr, __len)
-}
-
-public actual fun set_non_blocking(__fd: Int): Int {
-    return fcntl(__fd, F_SETFL, O_NONBLOCK)
-}
-
-public actual fun socket(__domain: Int, __type: Int, __protocol: Int): Int {
-    return platform.posix.socket(__domain, __type, __protocol)
-}
-
-public actual fun connect(__fd: Int, __addr: CValuesRef<sockaddr>?, __len: UInt): Int {
-    return platform.posix.connect(__fd, __addr, __len)
-}
-
-public actual fun accept(__fd: Int, __addr: CValuesRef<sockaddr>?, __addr_len: CValuesRef<UIntVarOf<UInt>>?): Int {
-    return platform.posix.accept(__fd, __addr, __addr_len)
-}
-
-public actual fun listen(__fd: Int, __n: Int): Int {
-    return platform.posix.listen(__fd, __n)
-}
-
-public actual fun MemScope.select(
-    __nfds: Int,
-    __readfds: CValuesRef<fd_set>?,
-    __writefds: CValuesRef<fd_set>?,
-    __exceptfds: CValuesRef<fd_set>?,
-    timeout: Long
-): Int {
-    val timeoutStruct = alloc<timeval>()
-    timeoutStruct.tv_sec = 0
-    timeoutStruct.tv_usec = timeout.toInt() * 1000
-    return select(__nfds, __readfds, __writefds, __exceptfds, timeoutStruct.ptr)
-}
-
-public actual fun socketsInit() {}
-
-public actual fun socketsCleanup() {}
-
-public actual fun getErrno(): Int = errno
-
-public actual fun getEagain(): Int = EAGAIN
-
-public actual fun getEwouldblock(): Int = EWOULDBLOCK
-
-public actual fun MemScope.set_send_socket_timeout(__fd: Int, timeout: Long): Int {
-    val timeoutStruct = alloc<timeval>()
-    val seconds = timeout / 1000
-    timeoutStruct.tv_sec = seconds.convert()
-    timeoutStruct.tv_usec = ((timeout - seconds * 1000) * 1000).convert()
-    return setsockopt(__fd, SOL_SOCKET, SO_SNDTIMEO, timeoutStruct.ptr, sizeOf<timeval>().toUInt())
-}
-
-public actual fun MemScope.set_recv_socket_timeout(__fd: Int, timeout: Long): Int {
-    val timeoutStruct = alloc<timeval>()
-    val seconds = timeout / 1000
-    timeoutStruct.tv_sec = seconds.convert()
-    timeoutStruct.tv_usec = ((timeout - seconds * 1000) * 1000).convert()
-    return setsockopt(__fd, SOL_SOCKET, SO_RCVTIMEO, timeoutStruct.ptr, sizeOf<timeval>().toUInt())
-}
-
-public actual fun MemScope.getaddrinfo(name: String, service: String?): CPointer<sockaddr>? {
-    val hints = alloc<addrinfo>()
-    platform.posix.memset(hints.ptr, 0, sizeOf<addrinfo>().convert())
-    hints.ai_family = platform.posix.AF_UNSPEC
-    hints.ai_socktype = platform.posix.SOCK_STREAM
-    hints.ai_protocol = platform.posix.IPPROTO_TCP
-    val result = alloc<CPointerVar<addrinfo>>()
-    if (getaddrinfo(name, service, hints.ptr, result.ptr) == 0) {
-        return result.pointed?.ai_addr
-    }
-    return null
-}
-
-public actual fun fdSet(fd: Int, fdSet: CValuesRef<fd_set>) {
-    __darwin_fd_set(fd, fdSet)
-}
-
-public actual fun fdZero(fdSet: CValuesRef<fd_set>) {
-    memset(fdSet, 0, sizeOf<fd_set>().convert())
-}
-
-public actual fun fdIsSet(fd: Int, fdSet: CValuesRef<fd_set>): Int {
-    return __darwin_fd_isset(fd, fdSet)
-}
-
-public actual fun gettimeofday(timeval: timeval) {
-    gettimeofday(timeval.ptr, null)
-}
diff --git a/kmqtt-common/src/tvosArm64Main/kotlin/io/github/davidepianca98/Posix.kt b/kmqtt-common/src/tvosArm64Main/kotlin/io/github/davidepianca98/Posix.kt
new file mode 100644
index 0000000000000000000000000000000000000000..c1fe27635dec023d886c6a06d750db25818386ce
--- /dev/null
+++ b/kmqtt-common/src/tvosArm64Main/kotlin/io/github/davidepianca98/Posix.kt
@@ -0,0 +1,175 @@
+package io.github.davidepianca98
+
+import kotlinx.cinterop.*
+import platform.posix.*
+
+public actual fun send(socket: Int, buf: CValuesRef<ByteVar>?, len: Int, flags: Int): Int {
+    return platform.posix.send(socket.convert(), buf, len.convert(), flags or MSG_NOSIGNAL).convert()
+}
+
+public actual fun recv(socket: Int, buf: CValuesRef<ByteVar>?, len: Int, flags: Int): Int {
+    return platform.posix.recv(socket, buf, len.convert(), flags).convert()
+}
+
+public actual fun shutdown(socket: Int): Int {
+    return shutdown(socket, SHUT_WR)
+}
+
+public actual fun close(socket: Int): Int {
+    return platform.posix.close(socket)
+}
+
+public actual fun memset(__s: CValuesRef<*>?, __c: Int, __n: ULong): CPointer<out CPointed>? {
+    return platform.posix.memset(__s, __c, __n)
+}
+
+public actual fun sendto(
+    __fd: Int,
+    __buf: CValuesRef<*>?,
+    __n: ULong,
+    __flags: Int,
+    __addr: CValuesRef<sockaddr>?,
+    __addr_len: UInt
+): Long {
+    return platform.posix.sendto(__fd, __buf, __n, __flags, __addr, __addr_len)
+}
+
+public actual fun recvfrom(
+    __fd: Int,
+    __buf: CValuesRef<*>?,
+    __n: ULong,
+    __flags: Int,
+    __addr: CValuesRef<sockaddr>?,
+    __addr_len: CValuesRef<UIntVarOf<UInt>>?
+): Long {
+    return platform.posix.recvfrom(__fd, __buf, __n, __flags, __addr, __addr_len)
+}
+
+public actual fun inet_ntop(
+    __af: Int,
+    __cp: CValuesRef<*>?,
+    __buf: CValuesRef<ByteVarOf<Byte>>?,
+    __len: UInt
+): CPointer<ByteVarOf<Byte>>? {
+    return platform.darwin.inet_ntop(__af, __cp, __buf, __len)
+}
+
+public actual fun inet_pton(__af: Int, __cp: String?, __buf: CValuesRef<*>?): Int {
+    return platform.darwin.inet_pton(__af, __cp, __buf)
+}
+
+private fun htons(value: UShort): UShort {
+    return if (BYTE_ORDER == BIG_ENDIAN) {
+        value
+    } else {
+        platform.builtin.builtin_bswap16(value.convert()).convert()
+    }
+}
+
+public actual fun MemScope.sockaddrIn(sin_family: UShort, sin_port: UShort): sockaddr_in {
+    val sockaddr = alloc<sockaddr_in>()
+    platform.posix.memset(sockaddr.ptr, 0, sizeOf<sockaddr_in>().convert())
+    sockaddr.sin_family = sin_family.toUByte()
+    sockaddr.sin_port = htons(sin_port)
+    return sockaddr
+}
+
+public actual fun MemScope.getPortFromSockaddrIn(sockaddr: sockaddr_in): UShort {
+    return sockaddr.sin_port
+}
+
+public actual fun setsockopt(__fd: Int, __level: Int, __optname: Int, __optval: CValuesRef<*>?, __optlen: UInt): Int {
+    return platform.posix.setsockopt(__fd.convert(), __level, __optname, __optval, __optlen.convert())
+}
+
+public actual fun bind(__fd: Int, __addr: CValuesRef<sockaddr>?, __len: UInt): Int {
+    return platform.posix.bind(__fd, __addr, __len)
+}
+
+public actual fun set_non_blocking(__fd: Int): Int {
+    return fcntl(__fd, F_SETFL, O_NONBLOCK)
+}
+
+public actual fun socket(__domain: Int, __type: Int, __protocol: Int): Int {
+    return platform.posix.socket(__domain, __type, __protocol)
+}
+
+public actual fun connect(__fd: Int, __addr: CValuesRef<sockaddr>?, __len: UInt): Int {
+    return platform.posix.connect(__fd, __addr, __len)
+}
+
+public actual fun accept(__fd: Int, __addr: CValuesRef<sockaddr>?, __addr_len: CValuesRef<UIntVarOf<UInt>>?): Int {
+    return platform.posix.accept(__fd, __addr, __addr_len)
+}
+
+public actual fun listen(__fd: Int, __n: Int): Int {
+    return platform.posix.listen(__fd, __n)
+}
+
+public actual fun MemScope.select(
+    __nfds: Int,
+    __readfds: CValuesRef<fd_set>?,
+    __writefds: CValuesRef<fd_set>?,
+    __exceptfds: CValuesRef<fd_set>?,
+    timeout: Long
+): Int {
+    val timeoutStruct = alloc<timeval>()
+    timeoutStruct.tv_sec = 0
+    timeoutStruct.tv_usec = timeout.toInt() * 1000
+    return select(__nfds, __readfds, __writefds, __exceptfds, timeoutStruct.ptr)
+}
+
+public actual fun socketsInit() {}
+
+public actual fun socketsCleanup() {}
+
+public actual fun getErrno(): Int = errno
+
+public actual fun getEagain(): Int = EAGAIN
+
+public actual fun getEwouldblock(): Int = EWOULDBLOCK
+
+public actual fun MemScope.set_send_socket_timeout(__fd: Int, timeout: Long): Int {
+    val timeoutStruct = alloc<timeval>()
+    val seconds = timeout / 1000
+    timeoutStruct.tv_sec = seconds.convert()
+    timeoutStruct.tv_usec = ((timeout - seconds * 1000) * 1000).convert()
+    return setsockopt(__fd, SOL_SOCKET, SO_SNDTIMEO, timeoutStruct.ptr, sizeOf<timeval>().toUInt())
+}
+
+public actual fun MemScope.set_recv_socket_timeout(__fd: Int, timeout: Long): Int {
+    val timeoutStruct = alloc<timeval>()
+    val seconds = timeout / 1000
+    timeoutStruct.tv_sec = seconds.convert()
+    timeoutStruct.tv_usec = ((timeout - seconds * 1000) * 1000).convert()
+    return setsockopt(__fd, SOL_SOCKET, SO_RCVTIMEO, timeoutStruct.ptr, sizeOf<timeval>().toUInt())
+}
+
+public actual fun MemScope.getaddrinfo(name: String, service: String?): CPointer<sockaddr>? {
+    val hints = alloc<addrinfo>()
+    platform.posix.memset(hints.ptr, 0, sizeOf<addrinfo>().convert())
+    hints.ai_family = platform.posix.AF_UNSPEC
+    hints.ai_socktype = platform.posix.SOCK_STREAM
+    hints.ai_protocol = platform.posix.IPPROTO_TCP
+    val result = alloc<CPointerVar<addrinfo>>()
+    if (getaddrinfo(name, service, hints.ptr, result.ptr) == 0) {
+        return result.pointed?.ai_addr
+    }
+    return null
+}
+
+public actual fun fdSet(fd: Int, fdSet: CValuesRef<fd_set>) {
+    __darwin_fd_set(fd, fdSet)
+}
+
+public actual fun fdZero(fdSet: CValuesRef<fd_set>) {
+    memset(fdSet, 0, sizeOf<fd_set>().convert())
+}
+
+public actual fun fdIsSet(fd: Int, fdSet: CValuesRef<fd_set>): Int {
+    return __darwin_fd_isset(fd, fdSet)
+}
+
+public actual fun gettimeofday(timeval: timeval) {
+    gettimeofday(timeval.ptr, null)
+}
diff --git a/kmqtt-common/src/tvosSimulatorArm64Main/kotlin/Posix.kt b/kmqtt-common/src/tvosSimulatorArm64Main/kotlin/Posix.kt
deleted file mode 100644
index ed515404b3948d6acb505b30e3c0ac6e8e0c28ff..0000000000000000000000000000000000000000
--- a/kmqtt-common/src/tvosSimulatorArm64Main/kotlin/Posix.kt
+++ /dev/null
@@ -1,173 +0,0 @@
-import kotlinx.cinterop.*
-import platform.posix.*
-
-public actual fun send(socket: Int, buf: CValuesRef<ByteVar>?, len: Int, flags: Int): Int {
-    return platform.posix.send(socket.convert(), buf, len.convert(), flags or MSG_NOSIGNAL).convert()
-}
-
-public actual fun recv(socket: Int, buf: CValuesRef<ByteVar>?, len: Int, flags: Int): Int {
-    return platform.posix.recv(socket, buf, len.convert(), flags).convert()
-}
-
-public actual fun shutdown(socket: Int): Int {
-    return shutdown(socket, SHUT_WR)
-}
-
-public actual fun close(socket: Int): Int {
-    return platform.posix.close(socket)
-}
-
-public actual fun memset(__s: CValuesRef<*>?, __c: Int, __n: ULong): CPointer<out CPointed>? {
-    return platform.posix.memset(__s, __c, __n)
-}
-
-public actual fun sendto(
-    __fd: Int,
-    __buf: CValuesRef<*>?,
-    __n: ULong,
-    __flags: Int,
-    __addr: CValuesRef<sockaddr>?,
-    __addr_len: UInt
-): Long {
-    return platform.posix.sendto(__fd, __buf, __n, __flags, __addr, __addr_len)
-}
-
-public actual fun recvfrom(
-    __fd: Int,
-    __buf: CValuesRef<*>?,
-    __n: ULong,
-    __flags: Int,
-    __addr: CValuesRef<sockaddr>?,
-    __addr_len: CValuesRef<UIntVarOf<UInt>>?
-): Long {
-    return platform.posix.recvfrom(__fd, __buf, __n, __flags, __addr, __addr_len)
-}
-
-public actual fun inet_ntop(
-    __af: Int,
-    __cp: CValuesRef<*>?,
-    __buf: CValuesRef<ByteVarOf<Byte>>?,
-    __len: UInt
-): CPointer<ByteVarOf<Byte>>? {
-    return platform.darwin.inet_ntop(__af, __cp, __buf, __len)
-}
-
-public actual fun inet_pton(__af: Int, __cp: String?, __buf: CValuesRef<*>?): Int {
-    return platform.darwin.inet_pton(__af, __cp, __buf)
-}
-
-private fun htons(value: UShort): UShort {
-    return if (BYTE_ORDER == BIG_ENDIAN) {
-        value
-    } else {
-        platform.builtin.builtin_bswap16(value.convert()).convert()
-    }
-}
-
-public actual fun MemScope.sockaddrIn(sin_family: UShort, sin_port: UShort): sockaddr_in {
-    val sockaddr = alloc<sockaddr_in>()
-    platform.posix.memset(sockaddr.ptr, 0, sizeOf<sockaddr_in>().convert())
-    sockaddr.sin_family = sin_family.toUByte()
-    sockaddr.sin_port = htons(sin_port)
-    return sockaddr
-}
-
-public actual fun MemScope.getPortFromSockaddrIn(sockaddr: sockaddr_in): UShort {
-    return sockaddr.sin_port
-}
-
-public actual fun setsockopt(__fd: Int, __level: Int, __optname: Int, __optval: CValuesRef<*>?, __optlen: UInt): Int {
-    return platform.posix.setsockopt(__fd.convert(), __level, __optname, __optval, __optlen.convert())
-}
-
-public actual fun bind(__fd: Int, __addr: CValuesRef<sockaddr>?, __len: UInt): Int {
-    return platform.posix.bind(__fd, __addr, __len)
-}
-
-public actual fun set_non_blocking(__fd: Int): Int {
-    return fcntl(__fd, F_SETFL, O_NONBLOCK)
-}
-
-public actual fun socket(__domain: Int, __type: Int, __protocol: Int): Int {
-    return platform.posix.socket(__domain, __type, __protocol)
-}
-
-public actual fun connect(__fd: Int, __addr: CValuesRef<sockaddr>?, __len: UInt): Int {
-    return platform.posix.connect(__fd, __addr, __len)
-}
-
-public actual fun accept(__fd: Int, __addr: CValuesRef<sockaddr>?, __addr_len: CValuesRef<UIntVarOf<UInt>>?): Int {
-    return platform.posix.accept(__fd, __addr, __addr_len)
-}
-
-public actual fun listen(__fd: Int, __n: Int): Int {
-    return platform.posix.listen(__fd, __n)
-}
-
-public actual fun MemScope.select(
-    __nfds: Int,
-    __readfds: CValuesRef<fd_set>?,
-    __writefds: CValuesRef<fd_set>?,
-    __exceptfds: CValuesRef<fd_set>?,
-    timeout: Long
-): Int {
-    val timeoutStruct = alloc<timeval>()
-    timeoutStruct.tv_sec = 0
-    timeoutStruct.tv_usec = timeout.toInt() * 1000
-    return select(__nfds, __readfds, __writefds, __exceptfds, timeoutStruct.ptr)
-}
-
-public actual fun socketsInit() {}
-
-public actual fun socketsCleanup() {}
-
-public actual fun getErrno(): Int = errno
-
-public actual fun getEagain(): Int = EAGAIN
-
-public actual fun getEwouldblock(): Int = EWOULDBLOCK
-
-public actual fun MemScope.set_send_socket_timeout(__fd: Int, timeout: Long): Int {
-    val timeoutStruct = alloc<timeval>()
-    val seconds = timeout / 1000
-    timeoutStruct.tv_sec = seconds.convert()
-    timeoutStruct.tv_usec = ((timeout - seconds * 1000) * 1000).convert()
-    return setsockopt(__fd, SOL_SOCKET, SO_SNDTIMEO, timeoutStruct.ptr, sizeOf<timeval>().toUInt())
-}
-
-public actual fun MemScope.set_recv_socket_timeout(__fd: Int, timeout: Long): Int {
-    val timeoutStruct = alloc<timeval>()
-    val seconds = timeout / 1000
-    timeoutStruct.tv_sec = seconds.convert()
-    timeoutStruct.tv_usec = ((timeout - seconds * 1000) * 1000).convert()
-    return setsockopt(__fd, SOL_SOCKET, SO_RCVTIMEO, timeoutStruct.ptr, sizeOf<timeval>().toUInt())
-}
-
-public actual fun MemScope.getaddrinfo(name: String, service: String?): CPointer<sockaddr>? {
-    val hints = alloc<addrinfo>()
-    platform.posix.memset(hints.ptr, 0, sizeOf<addrinfo>().convert())
-    hints.ai_family = platform.posix.AF_UNSPEC
-    hints.ai_socktype = platform.posix.SOCK_STREAM
-    hints.ai_protocol = platform.posix.IPPROTO_TCP
-    val result = alloc<CPointerVar<addrinfo>>()
-    if (getaddrinfo(name, service, hints.ptr, result.ptr) == 0) {
-        return result.pointed?.ai_addr
-    }
-    return null
-}
-
-public actual fun fdSet(fd: Int, fdSet: CValuesRef<fd_set>) {
-    __darwin_fd_set(fd, fdSet)
-}
-
-public actual fun fdZero(fdSet: CValuesRef<fd_set>) {
-    memset(fdSet, 0, sizeOf<fd_set>().convert())
-}
-
-public actual fun fdIsSet(fd: Int, fdSet: CValuesRef<fd_set>): Int {
-    return __darwin_fd_isset(fd, fdSet)
-}
-
-public actual fun gettimeofday(timeval: timeval) {
-    gettimeofday(timeval.ptr, null)
-}
diff --git a/kmqtt-common/src/tvosSimulatorArm64Main/kotlin/io/github/davidepianca98/Posix.kt b/kmqtt-common/src/tvosSimulatorArm64Main/kotlin/io/github/davidepianca98/Posix.kt
new file mode 100644
index 0000000000000000000000000000000000000000..c1fe27635dec023d886c6a06d750db25818386ce
--- /dev/null
+++ b/kmqtt-common/src/tvosSimulatorArm64Main/kotlin/io/github/davidepianca98/Posix.kt
@@ -0,0 +1,175 @@
+package io.github.davidepianca98
+
+import kotlinx.cinterop.*
+import platform.posix.*
+
+public actual fun send(socket: Int, buf: CValuesRef<ByteVar>?, len: Int, flags: Int): Int {
+    return platform.posix.send(socket.convert(), buf, len.convert(), flags or MSG_NOSIGNAL).convert()
+}
+
+public actual fun recv(socket: Int, buf: CValuesRef<ByteVar>?, len: Int, flags: Int): Int {
+    return platform.posix.recv(socket, buf, len.convert(), flags).convert()
+}
+
+public actual fun shutdown(socket: Int): Int {
+    return shutdown(socket, SHUT_WR)
+}
+
+public actual fun close(socket: Int): Int {
+    return platform.posix.close(socket)
+}
+
+public actual fun memset(__s: CValuesRef<*>?, __c: Int, __n: ULong): CPointer<out CPointed>? {
+    return platform.posix.memset(__s, __c, __n)
+}
+
+public actual fun sendto(
+    __fd: Int,
+    __buf: CValuesRef<*>?,
+    __n: ULong,
+    __flags: Int,
+    __addr: CValuesRef<sockaddr>?,
+    __addr_len: UInt
+): Long {
+    return platform.posix.sendto(__fd, __buf, __n, __flags, __addr, __addr_len)
+}
+
+public actual fun recvfrom(
+    __fd: Int,
+    __buf: CValuesRef<*>?,
+    __n: ULong,
+    __flags: Int,
+    __addr: CValuesRef<sockaddr>?,
+    __addr_len: CValuesRef<UIntVarOf<UInt>>?
+): Long {
+    return platform.posix.recvfrom(__fd, __buf, __n, __flags, __addr, __addr_len)
+}
+
+public actual fun inet_ntop(
+    __af: Int,
+    __cp: CValuesRef<*>?,
+    __buf: CValuesRef<ByteVarOf<Byte>>?,
+    __len: UInt
+): CPointer<ByteVarOf<Byte>>? {
+    return platform.darwin.inet_ntop(__af, __cp, __buf, __len)
+}
+
+public actual fun inet_pton(__af: Int, __cp: String?, __buf: CValuesRef<*>?): Int {
+    return platform.darwin.inet_pton(__af, __cp, __buf)
+}
+
+private fun htons(value: UShort): UShort {
+    return if (BYTE_ORDER == BIG_ENDIAN) {
+        value
+    } else {
+        platform.builtin.builtin_bswap16(value.convert()).convert()
+    }
+}
+
+public actual fun MemScope.sockaddrIn(sin_family: UShort, sin_port: UShort): sockaddr_in {
+    val sockaddr = alloc<sockaddr_in>()
+    platform.posix.memset(sockaddr.ptr, 0, sizeOf<sockaddr_in>().convert())
+    sockaddr.sin_family = sin_family.toUByte()
+    sockaddr.sin_port = htons(sin_port)
+    return sockaddr
+}
+
+public actual fun MemScope.getPortFromSockaddrIn(sockaddr: sockaddr_in): UShort {
+    return sockaddr.sin_port
+}
+
+public actual fun setsockopt(__fd: Int, __level: Int, __optname: Int, __optval: CValuesRef<*>?, __optlen: UInt): Int {
+    return platform.posix.setsockopt(__fd.convert(), __level, __optname, __optval, __optlen.convert())
+}
+
+public actual fun bind(__fd: Int, __addr: CValuesRef<sockaddr>?, __len: UInt): Int {
+    return platform.posix.bind(__fd, __addr, __len)
+}
+
+public actual fun set_non_blocking(__fd: Int): Int {
+    return fcntl(__fd, F_SETFL, O_NONBLOCK)
+}
+
+public actual fun socket(__domain: Int, __type: Int, __protocol: Int): Int {
+    return platform.posix.socket(__domain, __type, __protocol)
+}
+
+public actual fun connect(__fd: Int, __addr: CValuesRef<sockaddr>?, __len: UInt): Int {
+    return platform.posix.connect(__fd, __addr, __len)
+}
+
+public actual fun accept(__fd: Int, __addr: CValuesRef<sockaddr>?, __addr_len: CValuesRef<UIntVarOf<UInt>>?): Int {
+    return platform.posix.accept(__fd, __addr, __addr_len)
+}
+
+public actual fun listen(__fd: Int, __n: Int): Int {
+    return platform.posix.listen(__fd, __n)
+}
+
+public actual fun MemScope.select(
+    __nfds: Int,
+    __readfds: CValuesRef<fd_set>?,
+    __writefds: CValuesRef<fd_set>?,
+    __exceptfds: CValuesRef<fd_set>?,
+    timeout: Long
+): Int {
+    val timeoutStruct = alloc<timeval>()
+    timeoutStruct.tv_sec = 0
+    timeoutStruct.tv_usec = timeout.toInt() * 1000
+    return select(__nfds, __readfds, __writefds, __exceptfds, timeoutStruct.ptr)
+}
+
+public actual fun socketsInit() {}
+
+public actual fun socketsCleanup() {}
+
+public actual fun getErrno(): Int = errno
+
+public actual fun getEagain(): Int = EAGAIN
+
+public actual fun getEwouldblock(): Int = EWOULDBLOCK
+
+public actual fun MemScope.set_send_socket_timeout(__fd: Int, timeout: Long): Int {
+    val timeoutStruct = alloc<timeval>()
+    val seconds = timeout / 1000
+    timeoutStruct.tv_sec = seconds.convert()
+    timeoutStruct.tv_usec = ((timeout - seconds * 1000) * 1000).convert()
+    return setsockopt(__fd, SOL_SOCKET, SO_SNDTIMEO, timeoutStruct.ptr, sizeOf<timeval>().toUInt())
+}
+
+public actual fun MemScope.set_recv_socket_timeout(__fd: Int, timeout: Long): Int {
+    val timeoutStruct = alloc<timeval>()
+    val seconds = timeout / 1000
+    timeoutStruct.tv_sec = seconds.convert()
+    timeoutStruct.tv_usec = ((timeout - seconds * 1000) * 1000).convert()
+    return setsockopt(__fd, SOL_SOCKET, SO_RCVTIMEO, timeoutStruct.ptr, sizeOf<timeval>().toUInt())
+}
+
+public actual fun MemScope.getaddrinfo(name: String, service: String?): CPointer<sockaddr>? {
+    val hints = alloc<addrinfo>()
+    platform.posix.memset(hints.ptr, 0, sizeOf<addrinfo>().convert())
+    hints.ai_family = platform.posix.AF_UNSPEC
+    hints.ai_socktype = platform.posix.SOCK_STREAM
+    hints.ai_protocol = platform.posix.IPPROTO_TCP
+    val result = alloc<CPointerVar<addrinfo>>()
+    if (getaddrinfo(name, service, hints.ptr, result.ptr) == 0) {
+        return result.pointed?.ai_addr
+    }
+    return null
+}
+
+public actual fun fdSet(fd: Int, fdSet: CValuesRef<fd_set>) {
+    __darwin_fd_set(fd, fdSet)
+}
+
+public actual fun fdZero(fdSet: CValuesRef<fd_set>) {
+    memset(fdSet, 0, sizeOf<fd_set>().convert())
+}
+
+public actual fun fdIsSet(fd: Int, fdSet: CValuesRef<fd_set>): Int {
+    return __darwin_fd_isset(fd, fdSet)
+}
+
+public actual fun gettimeofday(timeval: timeval) {
+    gettimeofday(timeval.ptr, null)
+}
diff --git a/kmqtt-common/src/tvosX64Main/kotlin/Posix.kt b/kmqtt-common/src/tvosX64Main/kotlin/Posix.kt
deleted file mode 100644
index ed515404b3948d6acb505b30e3c0ac6e8e0c28ff..0000000000000000000000000000000000000000
--- a/kmqtt-common/src/tvosX64Main/kotlin/Posix.kt
+++ /dev/null
@@ -1,173 +0,0 @@
-import kotlinx.cinterop.*
-import platform.posix.*
-
-public actual fun send(socket: Int, buf: CValuesRef<ByteVar>?, len: Int, flags: Int): Int {
-    return platform.posix.send(socket.convert(), buf, len.convert(), flags or MSG_NOSIGNAL).convert()
-}
-
-public actual fun recv(socket: Int, buf: CValuesRef<ByteVar>?, len: Int, flags: Int): Int {
-    return platform.posix.recv(socket, buf, len.convert(), flags).convert()
-}
-
-public actual fun shutdown(socket: Int): Int {
-    return shutdown(socket, SHUT_WR)
-}
-
-public actual fun close(socket: Int): Int {
-    return platform.posix.close(socket)
-}
-
-public actual fun memset(__s: CValuesRef<*>?, __c: Int, __n: ULong): CPointer<out CPointed>? {
-    return platform.posix.memset(__s, __c, __n)
-}
-
-public actual fun sendto(
-    __fd: Int,
-    __buf: CValuesRef<*>?,
-    __n: ULong,
-    __flags: Int,
-    __addr: CValuesRef<sockaddr>?,
-    __addr_len: UInt
-): Long {
-    return platform.posix.sendto(__fd, __buf, __n, __flags, __addr, __addr_len)
-}
-
-public actual fun recvfrom(
-    __fd: Int,
-    __buf: CValuesRef<*>?,
-    __n: ULong,
-    __flags: Int,
-    __addr: CValuesRef<sockaddr>?,
-    __addr_len: CValuesRef<UIntVarOf<UInt>>?
-): Long {
-    return platform.posix.recvfrom(__fd, __buf, __n, __flags, __addr, __addr_len)
-}
-
-public actual fun inet_ntop(
-    __af: Int,
-    __cp: CValuesRef<*>?,
-    __buf: CValuesRef<ByteVarOf<Byte>>?,
-    __len: UInt
-): CPointer<ByteVarOf<Byte>>? {
-    return platform.darwin.inet_ntop(__af, __cp, __buf, __len)
-}
-
-public actual fun inet_pton(__af: Int, __cp: String?, __buf: CValuesRef<*>?): Int {
-    return platform.darwin.inet_pton(__af, __cp, __buf)
-}
-
-private fun htons(value: UShort): UShort {
-    return if (BYTE_ORDER == BIG_ENDIAN) {
-        value
-    } else {
-        platform.builtin.builtin_bswap16(value.convert()).convert()
-    }
-}
-
-public actual fun MemScope.sockaddrIn(sin_family: UShort, sin_port: UShort): sockaddr_in {
-    val sockaddr = alloc<sockaddr_in>()
-    platform.posix.memset(sockaddr.ptr, 0, sizeOf<sockaddr_in>().convert())
-    sockaddr.sin_family = sin_family.toUByte()
-    sockaddr.sin_port = htons(sin_port)
-    return sockaddr
-}
-
-public actual fun MemScope.getPortFromSockaddrIn(sockaddr: sockaddr_in): UShort {
-    return sockaddr.sin_port
-}
-
-public actual fun setsockopt(__fd: Int, __level: Int, __optname: Int, __optval: CValuesRef<*>?, __optlen: UInt): Int {
-    return platform.posix.setsockopt(__fd.convert(), __level, __optname, __optval, __optlen.convert())
-}
-
-public actual fun bind(__fd: Int, __addr: CValuesRef<sockaddr>?, __len: UInt): Int {
-    return platform.posix.bind(__fd, __addr, __len)
-}
-
-public actual fun set_non_blocking(__fd: Int): Int {
-    return fcntl(__fd, F_SETFL, O_NONBLOCK)
-}
-
-public actual fun socket(__domain: Int, __type: Int, __protocol: Int): Int {
-    return platform.posix.socket(__domain, __type, __protocol)
-}
-
-public actual fun connect(__fd: Int, __addr: CValuesRef<sockaddr>?, __len: UInt): Int {
-    return platform.posix.connect(__fd, __addr, __len)
-}
-
-public actual fun accept(__fd: Int, __addr: CValuesRef<sockaddr>?, __addr_len: CValuesRef<UIntVarOf<UInt>>?): Int {
-    return platform.posix.accept(__fd, __addr, __addr_len)
-}
-
-public actual fun listen(__fd: Int, __n: Int): Int {
-    return platform.posix.listen(__fd, __n)
-}
-
-public actual fun MemScope.select(
-    __nfds: Int,
-    __readfds: CValuesRef<fd_set>?,
-    __writefds: CValuesRef<fd_set>?,
-    __exceptfds: CValuesRef<fd_set>?,
-    timeout: Long
-): Int {
-    val timeoutStruct = alloc<timeval>()
-    timeoutStruct.tv_sec = 0
-    timeoutStruct.tv_usec = timeout.toInt() * 1000
-    return select(__nfds, __readfds, __writefds, __exceptfds, timeoutStruct.ptr)
-}
-
-public actual fun socketsInit() {}
-
-public actual fun socketsCleanup() {}
-
-public actual fun getErrno(): Int = errno
-
-public actual fun getEagain(): Int = EAGAIN
-
-public actual fun getEwouldblock(): Int = EWOULDBLOCK
-
-public actual fun MemScope.set_send_socket_timeout(__fd: Int, timeout: Long): Int {
-    val timeoutStruct = alloc<timeval>()
-    val seconds = timeout / 1000
-    timeoutStruct.tv_sec = seconds.convert()
-    timeoutStruct.tv_usec = ((timeout - seconds * 1000) * 1000).convert()
-    return setsockopt(__fd, SOL_SOCKET, SO_SNDTIMEO, timeoutStruct.ptr, sizeOf<timeval>().toUInt())
-}
-
-public actual fun MemScope.set_recv_socket_timeout(__fd: Int, timeout: Long): Int {
-    val timeoutStruct = alloc<timeval>()
-    val seconds = timeout / 1000
-    timeoutStruct.tv_sec = seconds.convert()
-    timeoutStruct.tv_usec = ((timeout - seconds * 1000) * 1000).convert()
-    return setsockopt(__fd, SOL_SOCKET, SO_RCVTIMEO, timeoutStruct.ptr, sizeOf<timeval>().toUInt())
-}
-
-public actual fun MemScope.getaddrinfo(name: String, service: String?): CPointer<sockaddr>? {
-    val hints = alloc<addrinfo>()
-    platform.posix.memset(hints.ptr, 0, sizeOf<addrinfo>().convert())
-    hints.ai_family = platform.posix.AF_UNSPEC
-    hints.ai_socktype = platform.posix.SOCK_STREAM
-    hints.ai_protocol = platform.posix.IPPROTO_TCP
-    val result = alloc<CPointerVar<addrinfo>>()
-    if (getaddrinfo(name, service, hints.ptr, result.ptr) == 0) {
-        return result.pointed?.ai_addr
-    }
-    return null
-}
-
-public actual fun fdSet(fd: Int, fdSet: CValuesRef<fd_set>) {
-    __darwin_fd_set(fd, fdSet)
-}
-
-public actual fun fdZero(fdSet: CValuesRef<fd_set>) {
-    memset(fdSet, 0, sizeOf<fd_set>().convert())
-}
-
-public actual fun fdIsSet(fd: Int, fdSet: CValuesRef<fd_set>): Int {
-    return __darwin_fd_isset(fd, fdSet)
-}
-
-public actual fun gettimeofday(timeval: timeval) {
-    gettimeofday(timeval.ptr, null)
-}
diff --git a/kmqtt-common/src/tvosX64Main/kotlin/io/github/davidepianca98/Posix.kt b/kmqtt-common/src/tvosX64Main/kotlin/io/github/davidepianca98/Posix.kt
new file mode 100644
index 0000000000000000000000000000000000000000..c1fe27635dec023d886c6a06d750db25818386ce
--- /dev/null
+++ b/kmqtt-common/src/tvosX64Main/kotlin/io/github/davidepianca98/Posix.kt
@@ -0,0 +1,175 @@
+package io.github.davidepianca98
+
+import kotlinx.cinterop.*
+import platform.posix.*
+
+public actual fun send(socket: Int, buf: CValuesRef<ByteVar>?, len: Int, flags: Int): Int {
+    return platform.posix.send(socket.convert(), buf, len.convert(), flags or MSG_NOSIGNAL).convert()
+}
+
+public actual fun recv(socket: Int, buf: CValuesRef<ByteVar>?, len: Int, flags: Int): Int {
+    return platform.posix.recv(socket, buf, len.convert(), flags).convert()
+}
+
+public actual fun shutdown(socket: Int): Int {
+    return shutdown(socket, SHUT_WR)
+}
+
+public actual fun close(socket: Int): Int {
+    return platform.posix.close(socket)
+}
+
+public actual fun memset(__s: CValuesRef<*>?, __c: Int, __n: ULong): CPointer<out CPointed>? {
+    return platform.posix.memset(__s, __c, __n)
+}
+
+public actual fun sendto(
+    __fd: Int,
+    __buf: CValuesRef<*>?,
+    __n: ULong,
+    __flags: Int,
+    __addr: CValuesRef<sockaddr>?,
+    __addr_len: UInt
+): Long {
+    return platform.posix.sendto(__fd, __buf, __n, __flags, __addr, __addr_len)
+}
+
+public actual fun recvfrom(
+    __fd: Int,
+    __buf: CValuesRef<*>?,
+    __n: ULong,
+    __flags: Int,
+    __addr: CValuesRef<sockaddr>?,
+    __addr_len: CValuesRef<UIntVarOf<UInt>>?
+): Long {
+    return platform.posix.recvfrom(__fd, __buf, __n, __flags, __addr, __addr_len)
+}
+
+public actual fun inet_ntop(
+    __af: Int,
+    __cp: CValuesRef<*>?,
+    __buf: CValuesRef<ByteVarOf<Byte>>?,
+    __len: UInt
+): CPointer<ByteVarOf<Byte>>? {
+    return platform.darwin.inet_ntop(__af, __cp, __buf, __len)
+}
+
+public actual fun inet_pton(__af: Int, __cp: String?, __buf: CValuesRef<*>?): Int {
+    return platform.darwin.inet_pton(__af, __cp, __buf)
+}
+
+private fun htons(value: UShort): UShort {
+    return if (BYTE_ORDER == BIG_ENDIAN) {
+        value
+    } else {
+        platform.builtin.builtin_bswap16(value.convert()).convert()
+    }
+}
+
+public actual fun MemScope.sockaddrIn(sin_family: UShort, sin_port: UShort): sockaddr_in {
+    val sockaddr = alloc<sockaddr_in>()
+    platform.posix.memset(sockaddr.ptr, 0, sizeOf<sockaddr_in>().convert())
+    sockaddr.sin_family = sin_family.toUByte()
+    sockaddr.sin_port = htons(sin_port)
+    return sockaddr
+}
+
+public actual fun MemScope.getPortFromSockaddrIn(sockaddr: sockaddr_in): UShort {
+    return sockaddr.sin_port
+}
+
+public actual fun setsockopt(__fd: Int, __level: Int, __optname: Int, __optval: CValuesRef<*>?, __optlen: UInt): Int {
+    return platform.posix.setsockopt(__fd.convert(), __level, __optname, __optval, __optlen.convert())
+}
+
+public actual fun bind(__fd: Int, __addr: CValuesRef<sockaddr>?, __len: UInt): Int {
+    return platform.posix.bind(__fd, __addr, __len)
+}
+
+public actual fun set_non_blocking(__fd: Int): Int {
+    return fcntl(__fd, F_SETFL, O_NONBLOCK)
+}
+
+public actual fun socket(__domain: Int, __type: Int, __protocol: Int): Int {
+    return platform.posix.socket(__domain, __type, __protocol)
+}
+
+public actual fun connect(__fd: Int, __addr: CValuesRef<sockaddr>?, __len: UInt): Int {
+    return platform.posix.connect(__fd, __addr, __len)
+}
+
+public actual fun accept(__fd: Int, __addr: CValuesRef<sockaddr>?, __addr_len: CValuesRef<UIntVarOf<UInt>>?): Int {
+    return platform.posix.accept(__fd, __addr, __addr_len)
+}
+
+public actual fun listen(__fd: Int, __n: Int): Int {
+    return platform.posix.listen(__fd, __n)
+}
+
+public actual fun MemScope.select(
+    __nfds: Int,
+    __readfds: CValuesRef<fd_set>?,
+    __writefds: CValuesRef<fd_set>?,
+    __exceptfds: CValuesRef<fd_set>?,
+    timeout: Long
+): Int {
+    val timeoutStruct = alloc<timeval>()
+    timeoutStruct.tv_sec = 0
+    timeoutStruct.tv_usec = timeout.toInt() * 1000
+    return select(__nfds, __readfds, __writefds, __exceptfds, timeoutStruct.ptr)
+}
+
+public actual fun socketsInit() {}
+
+public actual fun socketsCleanup() {}
+
+public actual fun getErrno(): Int = errno
+
+public actual fun getEagain(): Int = EAGAIN
+
+public actual fun getEwouldblock(): Int = EWOULDBLOCK
+
+public actual fun MemScope.set_send_socket_timeout(__fd: Int, timeout: Long): Int {
+    val timeoutStruct = alloc<timeval>()
+    val seconds = timeout / 1000
+    timeoutStruct.tv_sec = seconds.convert()
+    timeoutStruct.tv_usec = ((timeout - seconds * 1000) * 1000).convert()
+    return setsockopt(__fd, SOL_SOCKET, SO_SNDTIMEO, timeoutStruct.ptr, sizeOf<timeval>().toUInt())
+}
+
+public actual fun MemScope.set_recv_socket_timeout(__fd: Int, timeout: Long): Int {
+    val timeoutStruct = alloc<timeval>()
+    val seconds = timeout / 1000
+    timeoutStruct.tv_sec = seconds.convert()
+    timeoutStruct.tv_usec = ((timeout - seconds * 1000) * 1000).convert()
+    return setsockopt(__fd, SOL_SOCKET, SO_RCVTIMEO, timeoutStruct.ptr, sizeOf<timeval>().toUInt())
+}
+
+public actual fun MemScope.getaddrinfo(name: String, service: String?): CPointer<sockaddr>? {
+    val hints = alloc<addrinfo>()
+    platform.posix.memset(hints.ptr, 0, sizeOf<addrinfo>().convert())
+    hints.ai_family = platform.posix.AF_UNSPEC
+    hints.ai_socktype = platform.posix.SOCK_STREAM
+    hints.ai_protocol = platform.posix.IPPROTO_TCP
+    val result = alloc<CPointerVar<addrinfo>>()
+    if (getaddrinfo(name, service, hints.ptr, result.ptr) == 0) {
+        return result.pointed?.ai_addr
+    }
+    return null
+}
+
+public actual fun fdSet(fd: Int, fdSet: CValuesRef<fd_set>) {
+    __darwin_fd_set(fd, fdSet)
+}
+
+public actual fun fdZero(fdSet: CValuesRef<fd_set>) {
+    memset(fdSet, 0, sizeOf<fd_set>().convert())
+}
+
+public actual fun fdIsSet(fd: Int, fdSet: CValuesRef<fd_set>): Int {
+    return __darwin_fd_isset(fd, fdSet)
+}
+
+public actual fun gettimeofday(timeval: timeval) {
+    gettimeofday(timeval.ptr, null)
+}
diff --git a/kmqtt-common/src/watchosArm32Main/kotlin/Posix.kt b/kmqtt-common/src/watchosArm32Main/kotlin/io/github/davidepianca98/Posix.kt
similarity index 99%
rename from kmqtt-common/src/watchosArm32Main/kotlin/Posix.kt
rename to kmqtt-common/src/watchosArm32Main/kotlin/io/github/davidepianca98/Posix.kt
index 5d13333de4536de09b5b7304d8ab6494975bdb6b..ee623301dca3bd92a2131dc57d621a76ca9a9b5b 100644
--- a/kmqtt-common/src/watchosArm32Main/kotlin/Posix.kt
+++ b/kmqtt-common/src/watchosArm32Main/kotlin/io/github/davidepianca98/Posix.kt
@@ -1,3 +1,5 @@
+package io.github.davidepianca98
+
 import kotlinx.cinterop.*
 import platform.posix.*
 
diff --git a/kmqtt-common/src/watchosArm64Main/kotlin/Posix.kt b/kmqtt-common/src/watchosArm64Main/kotlin/io/github/davidepianca98/Posix.kt
similarity index 99%
rename from kmqtt-common/src/watchosArm64Main/kotlin/Posix.kt
rename to kmqtt-common/src/watchosArm64Main/kotlin/io/github/davidepianca98/Posix.kt
index 5d13333de4536de09b5b7304d8ab6494975bdb6b..ee623301dca3bd92a2131dc57d621a76ca9a9b5b 100644
--- a/kmqtt-common/src/watchosArm64Main/kotlin/Posix.kt
+++ b/kmqtt-common/src/watchosArm64Main/kotlin/io/github/davidepianca98/Posix.kt
@@ -1,3 +1,5 @@
+package io.github.davidepianca98
+
 import kotlinx.cinterop.*
 import platform.posix.*
 
diff --git a/kmqtt-common/src/watchosSimulatorArm64Main/kotlin/Posix.kt b/kmqtt-common/src/watchosSimulatorArm64Main/kotlin/io/github/davidepianca98/Posix.kt
similarity index 99%
rename from kmqtt-common/src/watchosSimulatorArm64Main/kotlin/Posix.kt
rename to kmqtt-common/src/watchosSimulatorArm64Main/kotlin/io/github/davidepianca98/Posix.kt
index 5d13333de4536de09b5b7304d8ab6494975bdb6b..ee623301dca3bd92a2131dc57d621a76ca9a9b5b 100644
--- a/kmqtt-common/src/watchosSimulatorArm64Main/kotlin/Posix.kt
+++ b/kmqtt-common/src/watchosSimulatorArm64Main/kotlin/io/github/davidepianca98/Posix.kt
@@ -1,3 +1,5 @@
+package io.github.davidepianca98
+
 import kotlinx.cinterop.*
 import platform.posix.*
 
diff --git a/kmqtt-common/src/watchosX64Main/kotlin/Posix.kt b/kmqtt-common/src/watchosX64Main/kotlin/io/github/davidepianca98/Posix.kt
similarity index 99%
rename from kmqtt-common/src/watchosX64Main/kotlin/Posix.kt
rename to kmqtt-common/src/watchosX64Main/kotlin/io/github/davidepianca98/Posix.kt
index 5d13333de4536de09b5b7304d8ab6494975bdb6b..ee623301dca3bd92a2131dc57d621a76ca9a9b5b 100644
--- a/kmqtt-common/src/watchosX64Main/kotlin/Posix.kt
+++ b/kmqtt-common/src/watchosX64Main/kotlin/io/github/davidepianca98/Posix.kt
@@ -1,3 +1,5 @@
+package io.github.davidepianca98
+
 import kotlinx.cinterop.*
 import platform.posix.*