From be3610451541d46711c27cd299f8d3fac5557464 Mon Sep 17 00:00:00 2001
From: Davide Pianca <davidepianca98@gmail.com>
Date: Wed, 11 Dec 2024 12:20:58 +0100
Subject: [PATCH] Move files from root package to io.github.davidepianca98

---
 kmqtt-broker/src/commonMain/kotlin/Main.kt    |   5 +-
 .../github/davidepianca98}/ShutdownHook.kt    |   2 +
 .../davidepianca98}/datastructures/Trie.kt    |   6 +-
 .../github/davidepianca98}/mqtt/Will.kt       |  12 +-
 .../davidepianca98}/mqtt/broker/Broker.kt     |  39 +--
 .../mqtt/broker/ClientConnection.kt           |  78 ++++--
 .../davidepianca98}/mqtt/broker/ISession.kt   |  12 +-
 .../davidepianca98}/mqtt/broker/Session.kt    |  26 +-
 .../mqtt/broker/cluster/ClusterConnection.kt  |  28 ++-
 .../broker/cluster/ClusterCurrentPacket.kt    |  19 +-
 .../cluster/ClusterDiscoveryConnection.kt     |   8 +-
 .../mqtt/broker/cluster/ClusterExtensions.kt  |   9 +-
 .../mqtt/broker/cluster/ClusterSettings.kt    |   2 +-
 .../mqtt/broker/cluster/DiscoveryPacket.kt    |   2 +-
 .../mqtt/broker/cluster/RemoteSession.kt      |  22 +-
 .../cluster/packets/AddSessionPacket.kt       |   8 +-
 .../cluster/packets/AddSubscriptionPacket.kt  |  16 +-
 .../broker/cluster/packets/ClusterPacket.kt   |   5 +
 .../packets/ClusterPacketDeserializer.kt      |  10 +-
 .../broker/cluster/packets/PublishPacket.kt   |  10 +-
 .../packets/RemoveSubscriptionPacket.kt       |   8 +-
 .../cluster/packets/SessionTakenOverPacket.kt |   8 +-
 .../cluster/packets/SessionUpdatePacket.kt    |   8 +-
 .../cluster/packets/SetRetainedPacket.kt      |  10 +-
 .../mqtt/broker/interfaces/Authentication.kt  |   2 +-
 .../mqtt/broker/interfaces/Authorization.kt   |   2 +-
 .../mqtt/broker/interfaces/BytesMetrics.kt    |   2 +-
 .../broker/interfaces/ConnectionCallbacks.kt  |   2 +-
 .../interfaces/EnhancedAuthentication.kt      |   2 +-
 .../mqtt/broker/interfaces/MiscCallbacks.kt   |   2 +-
 .../broker/interfaces/PacketInterceptor.kt    |   4 +-
 .../mqtt/broker/interfaces/Persistence.kt     |   8 +-
 .../mqtt/broker/udp/UDPConnectionsMap.kt      |  12 +-
 .../davidepianca98}/socket/ServerSocket.kt    |   6 +-
 .../socket/ServerSocketInterface.kt           |   4 +-
 .../socket/ServerSocketLoop.kt                |  12 +-
 .../socket/tcp/TCPEventHandler.kt             |   2 +-
 .../davidepianca98}/socket/tcp/WebSocket.kt   |  18 +-
 .../socket/tls/TLSServerSocket.kt             |  10 +
 .../davidepianca98}/socket/tls/TLSSettings.kt |   2 +-
 .../socket/udp/UDPEventHandler.kt             |   2 +-
 .../davidepianca98}/socket/udp/UDPReadData.kt |   2 +-
 .../davidepianca98}/socket/udp/UDPSocket.kt   |   2 +-
 .../broker/cluster/packets/ClusterPacket.kt   |   5 -
 .../kotlin/socket/tls/TLSServerSocket.kt      |  11 -
 .../datastructures/TrieTest.kt                |   4 +-
 .../integration/AuthenticationTest.kt         |  16 +-
 .../PublishSubscribeMultipleClientsTest.kt    |  16 +-
 .../PublishSubscribeSingleClientTest.kt       |  18 +-
 .../integration/RetainedPublishTest.kt        |  18 +-
 .../davidepianca98}/integration/TLSTest.kt    |  22 +-
 .../mqtt/MQTTCurrentPacketTest.kt             |   4 +-
 .../github/davidepianca98/setShutdownHook.kt  |  10 +
 .../davidepianca98}/socket/ServerSocket.kt    |  19 +-
 .../socket/tls/TLSServerSocket.kt             |  19 +-
 .../davidepianca98}/socket/udp/UDPSocket.kt   |  12 +-
 .../src/jsMain/kotlin/setShutdownHook.kt      |   7 -
 .../github/davidepianca98}/setShutdownHook.kt |   2 +
 .../davidepianca98}/socket/ServerSocket.kt    |  18 +-
 .../socket/tls/TLSServerSocket.kt             |  10 +-
 .../davidepianca98}/socket/udp/UDPSocket.kt   |   4 +-
 kmqtt-broker/src/jvmTest/kotlin/RunLocal.kt   |   6 +-
 .../github/davidepianca98}/setShutdownHook.kt |   2 +
 .../socket.tls/TLSServerContext.kt            |   2 +-
 .../socket.tls/TLSServerEngine.kt             |   4 +-
 .../github/davidepianca98}/setShutdownHook.kt |   2 +
 .../socket/tls/TLSServerContext.kt            |   3 +-
 .../socket/tls/TLSServerEngine.kt             |   4 +-
 .../github/davidepianca98}/setShutdownHook.kt |   2 +
 .../socket/tls/TLSServerContext.kt            |   3 +-
 .../socket/tls/TLSServerEngine.kt             |   4 +-
 .../github/davidepianca98}/setShutdownHook.kt |   2 +
 .../socket/tls/TLSServerContext.kt            |   3 +-
 .../socket/tls/TLSServerEngine.kt             |   4 +-
 .../github/davidepianca98}/setShutdownHook.kt |   2 +
 .../socket/tls/TLSServerContext.kt            |   3 +-
 .../socket/tls/TLSServerEngine.kt             |   4 +-
 .../davidepianca98}/socket/ServerSocket.kt    |  52 ++--
 .../socket/tls/TLSServerContext.kt            |   2 +-
 .../socket/tls/TLSServerEngine.kt             |   2 +-
 .../socket/tls/TLSServerSocket.kt             |  16 +-
 .../davidepianca98}/socket/udp/UDPSocket.kt   |  30 +--
 .../github/davidepianca98}/ClientSocket.kt    |   4 +-
 .../github/davidepianca98}/MQTTClient.kt      | 100 ++++++--
 .../github/davidepianca98}/TLSClientSocket.kt |   6 +-
 .../github/davidepianca98}/WebSocket.kt       |  12 +-
 .../github/davidepianca98/TLSClientEngine.kt  | 235 ++++++++++++++++++
 .../github/davidepianca98/TLSClientEngine.kt  | 235 ++++++++++++++++++
 .../github/davidepianca98}/TLSClientEngine.kt |   8 +-
 .../github/davidepianca98}/ClientSocket.kt    |   6 +-
 .../github/davidepianca98}/TLSClientSocket.kt |  19 +-
 .../github/davidepianca98}/ClientSocket.kt    |   4 +-
 .../github/davidepianca98}/TLSClientSocket.kt |   6 +-
 .../github/davidepianca98}/TLSClientEngine.kt |   8 +-
 .../linuxX64Main/kotlin/TLSClientEngine.kt    | 183 --------------
 .../github/davidepianca98}/TLSClientEngine.kt |   8 +-
 .../macosArm64Main/kotlin/TLSClientEngine.kt  | 183 --------------
 .../github/davidepianca98}/TLSClientEngine.kt |   8 +-
 .../macosX64Main/kotlin/TLSClientEngine.kt    | 183 --------------
 .../github/davidepianca98/TLSClientEngine.kt  | 185 ++++++++++++++
 .../mingwX64Main/kotlin/TLSClientEngine.kt    | 183 --------------
 .../github/davidepianca98/TLSClientEngine.kt  | 185 ++++++++++++++
 .../github/davidepianca98}/ClientSocket.kt    |   6 +-
 .../github/davidepianca98}/TLSClientEngine.kt |   6 +-
 .../github/davidepianca98}/TLSClientSocket.kt |   8 +-
 .../tvosArm64Main/kotlin/TLSClientEngine.kt   | 183 --------------
 .../github/davidepianca98/TLSClientEngine.kt  | 185 ++++++++++++++
 .../kotlin/TLSClientEngine.kt                 | 183 --------------
 .../github/davidepianca98/TLSClientEngine.kt  | 185 ++++++++++++++
 .../src/tvosX64Main/kotlin/TLSClientEngine.kt | 183 --------------
 .../github/davidepianca98/TLSClientEngine.kt  | 185 ++++++++++++++
 .../kotlin/TLSClientEngine.kt                 | 183 --------------
 .../github/davidepianca98/TLSClientEngine.kt  | 185 ++++++++++++++
 .../kotlin/TLSClientEngine.kt                 | 183 --------------
 .../github/davidepianca98/TLSClientEngine.kt  | 185 ++++++++++++++
 .../kotlin/TLSClientEngine.kt                 | 183 --------------
 .../github/davidepianca98/TLSClientEngine.kt  | 185 ++++++++++++++
 .../watchosX64Main/kotlin/TLSClientEngine.kt  | 183 --------------
 .../github/davidepianca98/TLSClientEngine.kt  | 235 ++++++++++++++++++
 .../github/davidepianca98}/CommonUtils.kt     |   4 +-
 .../github/davidepianca98}/IgnoreJs.kt        |   2 +
 .../davidepianca98}/mqtt/MQTTCurrentPacket.kt |  53 +++-
 .../davidepianca98/mqtt/MQTTException.kt      |   5 +
 .../davidepianca98}/mqtt/MQTTVersion.kt       |   2 +-
 .../davidepianca98}/mqtt/Subscription.kt      |   4 +-
 .../github/davidepianca98}/mqtt/TopicUtils.kt |   2 +-
 .../mqtt/packets/ConnectAcknowledgeFlags.kt   |   2 +-
 .../mqtt/packets/ConnectFlags.kt              |   6 +-
 .../mqtt/packets/MQTTControlPacketType.kt     |   2 +-
 .../mqtt/packets/MQTTDeserializer.kt          |  18 +-
 .../mqtt/packets/MQTTPacket.kt                |   4 +-
 .../davidepianca98}/mqtt/packets/Qos.kt       |   4 +-
 .../mqtt/packets/mqtt/MQTTAuth.kt             |   5 +
 .../mqtt/packets/mqtt/MQTTConnack.kt          |   6 +
 .../mqtt/packets/mqtt/MQTTConnect.kt          |   6 +-
 .../mqtt/packets/mqtt/MQTTDisconnect.kt       |   5 +
 .../mqtt/packets/mqtt/MQTTPingreq.kt          |   5 +
 .../mqtt/packets/mqtt/MQTTPingresp.kt         |   5 +
 .../mqtt/packets/mqtt/MQTTPuback.kt           |   5 +
 .../mqtt/packets/mqtt/MQTTPubcomp.kt          |   5 +
 .../mqtt/packets/mqtt/MQTTPublish.kt          |  20 +-
 .../mqtt/packets/mqtt/MQTTPubrec.kt           |   5 +
 .../mqtt/packets/mqtt/MQTTPubrel.kt           |   5 +
 .../mqtt/packets/mqtt/MQTTSuback.kt           |   5 +
 .../mqtt/packets/mqtt/MQTTSubscribe.kt        |   9 +
 .../mqtt/packets/mqtt/MQTTUnsuback.kt         |   5 +
 .../mqtt/packets/mqtt/MQTTUnsubscribe.kt      |   4 +-
 .../mqtt/packets/mqttv4/ConnectReturnCode.kt  |   2 +-
 .../mqtt/packets/mqttv4/MQTT4Connack.kt       |  20 +-
 .../mqtt/packets/mqttv4/MQTT4Connect.kt       |  20 +-
 .../mqtt/packets/mqttv4/MQTT4Disconnect.kt    |  10 +-
 .../mqtt/packets/mqttv4/MQTT4Packet.kt        |   5 +
 .../mqtt/packets/mqttv4/MQTT4Pingreq.kt       |  10 +-
 .../mqtt/packets/mqttv4/MQTT4Pingresp.kt      |  10 +-
 .../mqtt/packets/mqttv4/MQTT4Puback.kt        |  12 +-
 .../mqtt/packets/mqttv4/MQTT4Pubcomp.kt       |  12 +-
 .../mqtt/packets/mqttv4/MQTT4Publish.kt       |  24 +-
 .../mqtt/packets/mqttv4/MQTT4Pubrec.kt        |  12 +-
 .../mqtt/packets/mqttv4/MQTT4Pubrel.kt        |  18 +-
 .../mqtt/packets/mqttv4/MQTT4Suback.kt        |  18 +-
 .../mqtt/packets/mqttv4/MQTT4Subscribe.kt     |  22 +-
 .../mqtt/packets/mqttv4/MQTT4Unsuback.kt      |  12 +-
 .../mqtt/packets/mqttv4/MQTT4Unsubscribe.kt   |  18 +-
 .../mqtt/packets/mqttv4/SubackReturnCode.kt   |   4 +-
 .../mqtt/packets/mqttv5/MQTT5Auth.kt          |  14 +-
 .../mqtt/packets/mqttv5/MQTT5Connack.kt       |  16 +-
 .../mqtt/packets/mqttv5/MQTT5Connect.kt       |  20 +-
 .../mqtt/packets/mqttv5/MQTT5Disconnect.kt    |  14 +-
 .../mqtt/packets/mqttv5/MQTT5Packet.kt        |   5 +
 .../mqtt/packets/mqttv5/MQTT5Pingreq.kt       |  12 +-
 .../mqtt/packets/mqttv5/MQTT5Pingresp.kt      |  12 +-
 .../mqtt/packets/mqttv5/MQTT5Properties.kt    |   2 +-
 .../mqtt/packets/mqttv5/MQTT5Puback.kt        |  14 +-
 .../mqtt/packets/mqttv5/MQTT5Pubcomp.kt       |  14 +-
 .../mqtt/packets/mqttv5/MQTT5Publish.kt       |  24 +-
 .../mqtt/packets/mqttv5/MQTT5Pubrec.kt        |  14 +-
 .../mqtt/packets/mqttv5/MQTT5Pubrel.kt        |  14 +-
 .../mqtt/packets/mqttv5/MQTT5Suback.kt        |  14 +-
 .../mqtt/packets/mqttv5/MQTT5Subscribe.kt     |  20 +-
 .../mqtt/packets/mqttv5/MQTT5Unsuback.kt      |  14 +-
 .../mqtt/packets/mqttv5/MQTT5Unsubscribe.kt   |  16 +-
 .../mqtt/packets/mqttv5/MQTTSerializer.kt     |  12 +-
 .../mqtt/packets/mqttv5/Property.kt           |   2 +-
 .../mqtt/packets/mqttv5/ReasonCode.kt         |   2 +-
 .../packets/mqttv5/SubscriptionOptions.kt     |   6 +-
 .../davidepianca98}/socket/IOException.kt     |   2 +-
 .../socket/SocketClosedException.kt           |   2 +-
 .../davidepianca98}/socket/SocketInterface.kt |   2 +-
 .../davidepianca98}/socket/SocketState.kt     |   2 +-
 .../socket/streams/ByteArrayInputStream.kt    |   2 +-
 .../socket/streams/ByteArrayOutputStream.kt   |   2 +-
 .../socket/streams/DynamicByteBuffer.kt       |   2 +-
 .../socket/streams/EOFException.kt            |   5 +
 .../socket/streams/InputStream.kt             |   2 +-
 .../socket/streams/OutputStream.kt            |   2 +-
 .../socket/streams/StreamExtensions.kt        |   2 +-
 .../davidepianca98}/socket/tcp/Socket.kt      |   4 +-
 .../socket/tls/TLSClientSettings.kt           |   2 +-
 .../davidepianca98/socket/tls/TLSSocket.kt    |   5 +
 .../commonMain/kotlin/mqtt/MQTTException.kt   |   5 -
 .../kotlin/mqtt/packets/mqtt/MQTTAuth.kt      |   5 -
 .../kotlin/mqtt/packets/mqtt/MQTTConnack.kt   |   6 -
 .../mqtt/packets/mqtt/MQTTDisconnect.kt       |   5 -
 .../kotlin/mqtt/packets/mqtt/MQTTPingreq.kt   |   5 -
 .../kotlin/mqtt/packets/mqtt/MQTTPingresp.kt  |   5 -
 .../kotlin/mqtt/packets/mqtt/MQTTPuback.kt    |   5 -
 .../kotlin/mqtt/packets/mqtt/MQTTPubcomp.kt   |   5 -
 .../kotlin/mqtt/packets/mqtt/MQTTPubrec.kt    |   5 -
 .../kotlin/mqtt/packets/mqtt/MQTTPubrel.kt    |   5 -
 .../kotlin/mqtt/packets/mqtt/MQTTSuback.kt    |   5 -
 .../kotlin/mqtt/packets/mqtt/MQTTSubscribe.kt |   9 -
 .../kotlin/mqtt/packets/mqtt/MQTTUnsuback.kt  |   5 -
 .../kotlin/mqtt/packets/mqttv4/MQTT4Packet.kt |   5 -
 .../kotlin/mqtt/packets/mqttv5/MQTT5Packet.kt |   5 -
 .../kotlin/socket/streams/EOFException.kt     |   5 -
 .../commonMain/kotlin/socket/tls/TLSSocket.kt |   5 -
 .../davidepianca98}/mqtt/CommonUtilsTest.kt   |   8 +-
 .../davidepianca98}/mqtt/TopicUtilsTest.kt    |   3 +-
 .../mqtt/packets/mqttv5/MQTTAuthTest.kt       |   5 +-
 .../mqtt/packets/mqttv5/MQTTConnackTest.kt    |   7 +-
 .../mqtt/packets/mqttv5/MQTTConnectTest.kt    |   7 +-
 .../mqtt/packets/mqttv5/MQTTDisconnectTest.kt |   4 +-
 .../mqtt/packets/mqttv5/MQTTPingreqTest.kt    |   3 +-
 .../mqtt/packets/mqttv5/MQTTPingrespTest.kt   |   3 +-
 .../mqtt/packets/mqttv5/MQTTPubackTest.kt     |   3 +-
 .../mqtt/packets/mqttv5/MQTTPubcompTest.kt    |   3 +-
 .../mqtt/packets/mqttv5/MQTTPublishTest.kt    |   5 +-
 .../mqtt/packets/mqttv5/MQTTPubrecTest.kt     |   3 +-
 .../mqtt/packets/mqttv5/MQTTPubrelTest.kt     |   3 +-
 .../mqtt/packets/mqttv5/MQTTSubackTest.kt     |   4 +-
 .../mqtt/packets/mqttv5/MQTTSubscribeTest.kt  |   8 +-
 .../mqtt/packets/mqttv5/MQTTUnsubackTest.kt   |   4 +-
 .../packets/mqttv5/MQTTUnsubscribeTest.kt     |   3 +-
 .../{ => io/github/davidepianca98}/Posix.kt   |   2 +
 .../{ => io/github/davidepianca98}/Posix.kt   |   2 +
 .../{ => io/github/davidepianca98}/Posix.kt   |   2 +
 kmqtt-common/src/jsMain/kotlin/IgnoreJs.kt    |   1 -
 .../io/github/davidepianca98/IgnoreJs.kt      |   5 +
 .../davidepianca98}/currentTimeMillis.kt      |   2 +
 .../davidepianca98}/socket/tcp/Socket.kt      |   8 +-
 .../davidepianca98}/socket/tls/NodeTls.kt     |   2 +-
 .../davidepianca98}/socket/tls/TLSSocket.kt   |   6 +-
 .../{ => io/github/davidepianca98}/utils.kt   |   2 +-
 .../github/davidepianca98}/IgnoreJs.kt        |   2 +
 .../davidepianca98}/currentTimeMillis.kt      |   2 +
 .../davidepianca98}/socket/tcp/Socket.kt      |  10 +-
 .../davidepianca98}/socket/tls/TLSSocket.kt   |  10 +-
 .../{ => io/github/davidepianca98}/utils.kt   |   2 +
 .../{ => io/github/davidepianca98}/Posix.kt   |   2 +
 .../{ => io/github/davidepianca98}/Posix.kt   |   2 +
 .../{ => io/github/davidepianca98}/Posix.kt   |   2 +
 kmqtt-common/src/macosX64Main/kotlin/Posix.kt | 173 -------------
 .../kotlin/io/github/davidepianca98/Posix.kt  | 175 +++++++++++++
 .../{ => io/github/davidepianca98}/Posix.kt   |   4 +-
 .../github/davidepianca98}/IgnoreJs.kt        |   2 +-
 .../{ => io/github/davidepianca98}/Posix.kt   |   2 +
 .../davidepianca98}/currentTimeMillis.kt      |   2 +
 .../davidepianca98}/socket/tcp/Socket.kt      |  22 +-
 .../davidepianca98}/socket/tls/TLSEngine.kt   |   2 +-
 .../davidepianca98}/socket/tls/TLSSocket.kt   |  10 +-
 .../src/tvosArm64Main/kotlin/Posix.kt         | 173 -------------
 .../kotlin/io/github/davidepianca98/Posix.kt  | 175 +++++++++++++
 .../tvosSimulatorArm64Main/kotlin/Posix.kt    | 173 -------------
 .../kotlin/io/github/davidepianca98/Posix.kt  | 175 +++++++++++++
 kmqtt-common/src/tvosX64Main/kotlin/Posix.kt  | 173 -------------
 .../kotlin/io/github/davidepianca98/Posix.kt  | 175 +++++++++++++
 .../{ => io/github/davidepianca98}/Posix.kt   |   2 +
 .../{ => io/github/davidepianca98}/Posix.kt   |   2 +
 .../{ => io/github/davidepianca98}/Posix.kt   |   2 +
 .../{ => io/github/davidepianca98}/Posix.kt   |   2 +
 270 files changed, 4008 insertions(+), 3618 deletions(-)
 rename kmqtt-broker/src/commonMain/kotlin/{ => io/github/davidepianca98}/ShutdownHook.kt (61%)
 rename kmqtt-broker/src/commonMain/kotlin/{ => io/github/davidepianca98}/datastructures/Trie.kt (96%)
 rename kmqtt-broker/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/Will.kt (80%)
 rename kmqtt-broker/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/broker/Broker.kt (93%)
 rename kmqtt-broker/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/broker/ClientConnection.kt (89%)
 rename kmqtt-broker/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/broker/ISession.kt (75%)
 rename kmqtt-broker/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/broker/Session.kt (90%)
 rename kmqtt-broker/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/broker/cluster/ClusterConnection.kt (73%)
 rename kmqtt-broker/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/broker/cluster/ClusterCurrentPacket.kt (66%)
 rename kmqtt-broker/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/broker/cluster/ClusterDiscoveryConnection.kt (77%)
 rename kmqtt-broker/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/broker/cluster/ClusterExtensions.kt (75%)
 rename kmqtt-broker/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/broker/cluster/ClusterSettings.kt (83%)
 rename kmqtt-broker/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/broker/cluster/DiscoveryPacket.kt (78%)
 rename kmqtt-broker/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/broker/cluster/RemoteSession.kt (75%)
 rename kmqtt-broker/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/broker/cluster/packets/AddSessionPacket.kt (80%)
 rename kmqtt-broker/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/broker/cluster/packets/AddSubscriptionPacket.kt (82%)
 create mode 100644 kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/mqtt/broker/cluster/packets/ClusterPacket.kt
 rename kmqtt-broker/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/broker/cluster/packets/ClusterPacketDeserializer.kt (72%)
 rename kmqtt-broker/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/broker/cluster/packets/PublishPacket.kt (72%)
 rename kmqtt-broker/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/broker/cluster/packets/RemoveSubscriptionPacket.kt (79%)
 rename kmqtt-broker/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/broker/cluster/packets/SessionTakenOverPacket.kt (75%)
 rename kmqtt-broker/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/broker/cluster/packets/SessionUpdatePacket.kt (86%)
 rename kmqtt-broker/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/broker/cluster/packets/SetRetainedPacket.kt (76%)
 rename kmqtt-broker/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/broker/interfaces/Authentication.kt (89%)
 rename kmqtt-broker/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/broker/interfaces/Authorization.kt (94%)
 rename kmqtt-broker/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/broker/interfaces/BytesMetrics.kt (90%)
 rename kmqtt-broker/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/broker/interfaces/ConnectionCallbacks.kt (85%)
 rename kmqtt-broker/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/broker/interfaces/EnhancedAuthentication.kt (93%)
 rename kmqtt-broker/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/broker/interfaces/MiscCallbacks.kt (80%)
 rename kmqtt-broker/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/broker/interfaces/PacketInterceptor.kt (84%)
 rename kmqtt-broker/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/broker/interfaces/Persistence.kt (90%)
 rename kmqtt-broker/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/broker/udp/UDPConnectionsMap.kt (74%)
 rename kmqtt-broker/src/commonMain/kotlin/{ => io/github/davidepianca98}/socket/ServerSocket.kt (66%)
 rename kmqtt-broker/src/commonMain/kotlin/{ => io/github/davidepianca98}/socket/ServerSocketInterface.kt (50%)
 rename kmqtt-broker/src/commonMain/kotlin/{ => io/github/davidepianca98}/socket/ServerSocketLoop.kt (88%)
 rename kmqtt-broker/src/commonMain/kotlin/{ => io/github/davidepianca98}/socket/tcp/TCPEventHandler.kt (81%)
 rename kmqtt-broker/src/commonMain/kotlin/{ => io/github/davidepianca98}/socket/tcp/WebSocket.kt (92%)
 create mode 100644 kmqtt-broker/src/commonMain/kotlin/io/github/davidepianca98/socket/tls/TLSServerSocket.kt
 rename kmqtt-broker/src/commonMain/kotlin/{ => io/github/davidepianca98}/socket/tls/TLSSettings.kt (83%)
 rename kmqtt-broker/src/commonMain/kotlin/{ => io/github/davidepianca98}/socket/udp/UDPEventHandler.kt (59%)
 rename kmqtt-broker/src/commonMain/kotlin/{ => io/github/davidepianca98}/socket/udp/UDPReadData.kt (70%)
 rename kmqtt-broker/src/commonMain/kotlin/{ => io/github/davidepianca98}/socket/udp/UDPSocket.kt (74%)
 delete mode 100644 kmqtt-broker/src/commonMain/kotlin/mqtt/broker/cluster/packets/ClusterPacket.kt
 delete mode 100644 kmqtt-broker/src/commonMain/kotlin/socket/tls/TLSServerSocket.kt
 rename kmqtt-broker/src/commonTest/kotlin/{ => io/github/davidepianca98}/datastructures/TrieTest.kt (97%)
 rename kmqtt-broker/src/commonTest/kotlin/{ => io/github/davidepianca98}/integration/AuthenticationTest.kt (86%)
 rename kmqtt-broker/src/commonTest/kotlin/{ => io/github/davidepianca98}/integration/PublishSubscribeMultipleClientsTest.kt (84%)
 rename kmqtt-broker/src/commonTest/kotlin/{ => io/github/davidepianca98}/integration/PublishSubscribeSingleClientTest.kt (74%)
 rename kmqtt-broker/src/commonTest/kotlin/{ => io/github/davidepianca98}/integration/RetainedPublishTest.kt (82%)
 rename kmqtt-broker/src/commonTest/kotlin/{ => io/github/davidepianca98}/integration/TLSTest.kt (77%)
 rename kmqtt-broker/src/commonTest/kotlin/{ => io/github/davidepianca98}/mqtt/MQTTCurrentPacketTest.kt (96%)
 create mode 100644 kmqtt-broker/src/jsMain/kotlin/io/github/davidepianca98/setShutdownHook.kt
 rename kmqtt-broker/src/jsMain/kotlin/{ => io/github/davidepianca98}/socket/ServerSocket.kt (82%)
 rename kmqtt-broker/src/jsMain/kotlin/{ => io/github/davidepianca98}/socket/tls/TLSServerSocket.kt (76%)
 rename kmqtt-broker/src/jsMain/kotlin/{ => io/github/davidepianca98}/socket/udp/UDPSocket.kt (73%)
 delete mode 100644 kmqtt-broker/src/jsMain/kotlin/setShutdownHook.kt
 rename kmqtt-broker/src/jvmMain/kotlin/{ => io/github/davidepianca98}/setShutdownHook.kt (84%)
 rename kmqtt-broker/src/jvmMain/kotlin/{ => io/github/davidepianca98}/socket/ServerSocket.kt (92%)
 rename kmqtt-broker/src/jvmMain/kotlin/{ => io/github/davidepianca98}/socket/tls/TLSServerSocket.kt (93%)
 rename kmqtt-broker/src/jvmMain/kotlin/{ => io/github/davidepianca98}/socket/udp/UDPSocket.kt (91%)
 rename kmqtt-broker/src/{macosX64Main/kotlin => linuxArm64Main/kotlin/io/github/davidepianca98}/setShutdownHook.kt (92%)
 rename kmqtt-broker/src/linuxArm64Main/kotlin/{ => io/github/davidepianca98}/socket.tls/TLSServerContext.kt (97%)
 rename kmqtt-broker/src/linuxArm64Main/kotlin/{ => io/github/davidepianca98}/socket.tls/TLSServerEngine.kt (95%)
 rename kmqtt-broker/src/{macosArm64Main/kotlin => linuxX64Main/kotlin/io/github/davidepianca98}/setShutdownHook.kt (92%)
 rename kmqtt-broker/src/{macosArm64Main/kotlin => linuxX64Main/kotlin/io/github/davidepianca98}/socket/tls/TLSServerContext.kt (97%)
 rename kmqtt-broker/src/{macosX64Main/kotlin => linuxX64Main/kotlin/io/github/davidepianca98}/socket/tls/TLSServerEngine.kt (95%)
 rename kmqtt-broker/src/{linuxArm64Main/kotlin => macosArm64Main/kotlin/io/github/davidepianca98}/setShutdownHook.kt (92%)
 rename kmqtt-broker/src/{linuxX64Main/kotlin => macosArm64Main/kotlin/io/github/davidepianca98}/socket/tls/TLSServerContext.kt (97%)
 rename kmqtt-broker/src/macosArm64Main/kotlin/{ => io/github/davidepianca98}/socket/tls/TLSServerEngine.kt (95%)
 rename kmqtt-broker/src/{linuxX64Main/kotlin => macosX64Main/kotlin/io/github/davidepianca98}/setShutdownHook.kt (92%)
 rename kmqtt-broker/src/{mingwX64Main/kotlin => macosX64Main/kotlin/io/github/davidepianca98}/socket/tls/TLSServerContext.kt (97%)
 rename kmqtt-broker/src/{linuxX64Main/kotlin => macosX64Main/kotlin/io/github/davidepianca98}/socket/tls/TLSServerEngine.kt (95%)
 rename kmqtt-broker/src/mingwX64Main/kotlin/{ => io/github/davidepianca98}/setShutdownHook.kt (92%)
 rename kmqtt-broker/src/{macosX64Main/kotlin => mingwX64Main/kotlin/io/github/davidepianca98}/socket/tls/TLSServerContext.kt (97%)
 rename kmqtt-broker/src/mingwX64Main/kotlin/{ => io/github/davidepianca98}/socket/tls/TLSServerEngine.kt (95%)
 rename kmqtt-broker/src/posixMain/kotlin/{ => io/github/davidepianca98}/socket/ServerSocket.kt (89%)
 rename kmqtt-broker/src/posixMain/kotlin/{ => io/github/davidepianca98}/socket/tls/TLSServerContext.kt (65%)
 rename kmqtt-broker/src/posixMain/kotlin/{ => io/github/davidepianca98}/socket/tls/TLSServerEngine.kt (93%)
 rename kmqtt-broker/src/posixMain/kotlin/{ => io/github/davidepianca98}/socket/tls/TLSServerSocket.kt (76%)
 rename kmqtt-broker/src/posixMain/kotlin/{ => io/github/davidepianca98}/socket/udp/UDPSocket.kt (80%)
 rename kmqtt-client/src/commonMain/kotlin/{ => io/github/davidepianca98}/ClientSocket.kt (69%)
 rename kmqtt-client/src/commonMain/kotlin/{ => io/github/davidepianca98}/MQTTClient.kt (86%)
 rename kmqtt-client/src/commonMain/kotlin/{ => io/github/davidepianca98}/TLSClientSocket.kt (65%)
 rename kmqtt-client/src/commonMain/kotlin/{ => io/github/davidepianca98}/WebSocket.kt (95%)
 create mode 100644 kmqtt-client/src/iosArm64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
 create mode 100644 kmqtt-client/src/iosSimulatorArm64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
 rename kmqtt-client/src/{iosArm64Main/kotlin => iosX64Main/kotlin/io/github/davidepianca98}/TLSClientEngine.kt (97%)
 rename kmqtt-client/src/jsMain/kotlin/{ => io/github/davidepianca98}/ClientSocket.kt (88%)
 rename kmqtt-client/src/jsMain/kotlin/{ => io/github/davidepianca98}/TLSClientSocket.kt (75%)
 rename kmqtt-client/src/jvmMain/kotlin/{ => io/github/davidepianca98}/ClientSocket.kt (92%)
 rename kmqtt-client/src/jvmMain/kotlin/{ => io/github/davidepianca98}/TLSClientSocket.kt (97%)
 rename kmqtt-client/src/linuxArm64Main/kotlin/{ => io/github/davidepianca98}/TLSClientEngine.kt (97%)
 delete mode 100644 kmqtt-client/src/linuxX64Main/kotlin/TLSClientEngine.kt
 rename kmqtt-client/src/{iosSimulatorArm64Main/kotlin => linuxX64Main/kotlin/io/github/davidepianca98}/TLSClientEngine.kt (97%)
 delete mode 100644 kmqtt-client/src/macosArm64Main/kotlin/TLSClientEngine.kt
 rename kmqtt-client/src/{iosX64Main/kotlin => macosArm64Main/kotlin/io/github/davidepianca98}/TLSClientEngine.kt (97%)
 delete mode 100644 kmqtt-client/src/macosX64Main/kotlin/TLSClientEngine.kt
 create mode 100644 kmqtt-client/src/macosX64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
 delete mode 100644 kmqtt-client/src/mingwX64Main/kotlin/TLSClientEngine.kt
 create mode 100644 kmqtt-client/src/mingwX64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
 rename kmqtt-client/src/posixMain/kotlin/{ => io/github/davidepianca98}/ClientSocket.kt (92%)
 rename kmqtt-client/src/posixMain/kotlin/{ => io/github/davidepianca98}/TLSClientEngine.kt (79%)
 rename kmqtt-client/src/posixMain/kotlin/{ => io/github/davidepianca98}/TLSClientSocket.kt (90%)
 delete mode 100644 kmqtt-client/src/tvosArm64Main/kotlin/TLSClientEngine.kt
 create mode 100644 kmqtt-client/src/tvosArm64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
 delete mode 100644 kmqtt-client/src/tvosSimulatorArm64Main/kotlin/TLSClientEngine.kt
 create mode 100644 kmqtt-client/src/tvosSimulatorArm64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
 delete mode 100644 kmqtt-client/src/tvosX64Main/kotlin/TLSClientEngine.kt
 create mode 100644 kmqtt-client/src/tvosX64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
 delete mode 100644 kmqtt-client/src/watchosArm32Main/kotlin/TLSClientEngine.kt
 create mode 100644 kmqtt-client/src/watchosArm32Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
 delete mode 100644 kmqtt-client/src/watchosArm64Main/kotlin/TLSClientEngine.kt
 create mode 100644 kmqtt-client/src/watchosArm64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
 delete mode 100644 kmqtt-client/src/watchosSimulatorArm64Main/kotlin/TLSClientEngine.kt
 create mode 100644 kmqtt-client/src/watchosSimulatorArm64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
 delete mode 100644 kmqtt-client/src/watchosX64Main/kotlin/TLSClientEngine.kt
 create mode 100644 kmqtt-client/src/watchosX64Main/kotlin/io/github/davidepianca98/TLSClientEngine.kt
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/CommonUtils.kt (98%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/IgnoreJs.kt (74%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/MQTTCurrentPacket.kt (65%)
 create mode 100644 kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/MQTTException.kt
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/MQTTVersion.kt (69%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/Subscription.kt (81%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/TopicUtils.kt (98%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/ConnectAcknowledgeFlags.kt (62%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/ConnectFlags.kt (91%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/MQTTControlPacketType.kt (91%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/MQTTDeserializer.kt (94%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/MQTTPacket.kt (52%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/Qos.kt (65%)
 create mode 100644 kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTAuth.kt
 create mode 100644 kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTConnack.kt
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqtt/MQTTConnect.kt (71%)
 create mode 100644 kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTDisconnect.kt
 create mode 100644 kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTPingreq.kt
 create mode 100644 kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTPingresp.kt
 create mode 100644 kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTPuback.kt
 create mode 100644 kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTPubcomp.kt
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqtt/MQTTPublish.kt (72%)
 create mode 100644 kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTPubrec.kt
 create mode 100644 kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTPubrel.kt
 create mode 100644 kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTSuback.kt
 create mode 100644 kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTSubscribe.kt
 create mode 100644 kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqtt/MQTTUnsuback.kt
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqtt/MQTTUnsubscribe.kt (56%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv4/ConnectReturnCode.kt (87%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv4/MQTT4Connack.kt (72%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv4/MQTT4Connect.kt (83%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv4/MQTT4Disconnect.kt (57%)
 create mode 100644 kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/MQTT4Packet.kt
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv4/MQTT4Pingreq.kt (57%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv4/MQTT4Pingresp.kt (57%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv4/MQTT4Puback.kt (62%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv4/MQTT4Pubcomp.kt (63%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv4/MQTT4Publish.kt (78%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv4/MQTT4Pubrec.kt (62%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv4/MQTT4Pubrel.kt (65%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv4/MQTT4Suback.kt (70%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv4/MQTT4Subscribe.kt (76%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv4/MQTT4Unsuback.kt (64%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv4/MQTT4Unsubscribe.kt (72%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv4/SubackReturnCode.kt (85%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv5/MQTT5Auth.kt (82%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv5/MQTT5Connack.kt (88%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv5/MQTT5Connect.kt (89%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv5/MQTT5Disconnect.kt (88%)
 create mode 100644 kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/MQTT5Packet.kt
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv5/MQTT5Pingreq.kt (58%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv5/MQTT5Pingresp.kt (58%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv5/MQTT5Properties.kt (96%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv5/MQTT5Puback.kt (85%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv5/MQTT5Pubcomp.kt (84%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv5/MQTT5Publish.kt (86%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv5/MQTT5Pubrec.kt (85%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv5/MQTT5Pubrel.kt (85%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv5/MQTT5Suback.kt (86%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv5/MQTT5Subscribe.kt (87%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv5/MQTT5Unsuback.kt (85%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv5/MQTT5Unsubscribe.kt (78%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv5/MQTTSerializer.kt (95%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv5/Property.kt (95%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv5/ReasonCode.kt (96%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv5/SubscriptionOptions.kt (81%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/socket/IOException.kt (65%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/socket/SocketClosedException.kt (67%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/socket/SocketInterface.kt (80%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/socket/SocketState.kt (57%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/socket/streams/ByteArrayInputStream.kt (93%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/socket/streams/ByteArrayOutputStream.kt (95%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/socket/streams/DynamicByteBuffer.kt (96%)
 create mode 100644 kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/streams/EOFException.kt
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/socket/streams/InputStream.kt (92%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/socket/streams/OutputStream.kt (91%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/socket/streams/StreamExtensions.kt (94%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/socket/tcp/Socket.kt (66%)
 rename kmqtt-common/src/commonMain/kotlin/{ => io/github/davidepianca98}/socket/tls/TLSClientSettings.kt (96%)
 create mode 100644 kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/socket/tls/TLSSocket.kt
 delete mode 100644 kmqtt-common/src/commonMain/kotlin/mqtt/MQTTException.kt
 delete mode 100644 kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTAuth.kt
 delete mode 100644 kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTConnack.kt
 delete mode 100644 kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTDisconnect.kt
 delete mode 100644 kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTPingreq.kt
 delete mode 100644 kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTPingresp.kt
 delete mode 100644 kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTPuback.kt
 delete mode 100644 kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTPubcomp.kt
 delete mode 100644 kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTPubrec.kt
 delete mode 100644 kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTPubrel.kt
 delete mode 100644 kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTSuback.kt
 delete mode 100644 kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTSubscribe.kt
 delete mode 100644 kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqtt/MQTTUnsuback.kt
 delete mode 100644 kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv4/MQTT4Packet.kt
 delete mode 100644 kmqtt-common/src/commonMain/kotlin/mqtt/packets/mqttv5/MQTT5Packet.kt
 delete mode 100644 kmqtt-common/src/commonMain/kotlin/socket/streams/EOFException.kt
 delete mode 100644 kmqtt-common/src/commonMain/kotlin/socket/tls/TLSSocket.kt
 rename kmqtt-common/src/commonTest/kotlin/{ => io/github/davidepianca98}/mqtt/CommonUtilsTest.kt (93%)
 rename kmqtt-common/src/commonTest/kotlin/{ => io/github/davidepianca98}/mqtt/TopicUtilsTest.kt (98%)
 rename kmqtt-common/src/commonTest/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv5/MQTTAuthTest.kt (89%)
 rename kmqtt-common/src/commonTest/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv5/MQTTConnackTest.kt (88%)
 rename kmqtt-common/src/commonTest/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv5/MQTTConnectTest.kt (92%)
 rename kmqtt-common/src/commonTest/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv5/MQTTDisconnectTest.kt (83%)
 rename kmqtt-common/src/commonTest/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv5/MQTTPingreqTest.kt (85%)
 rename kmqtt-common/src/commonTest/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv5/MQTTPingrespTest.kt (85%)
 rename kmqtt-common/src/commonTest/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv5/MQTTPubackTest.kt (89%)
 rename kmqtt-common/src/commonTest/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv5/MQTTPubcompTest.kt (89%)
 rename kmqtt-common/src/commonTest/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv5/MQTTPublishTest.kt (91%)
 rename kmqtt-common/src/commonTest/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv5/MQTTPubrecTest.kt (88%)
 rename kmqtt-common/src/commonTest/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv5/MQTTPubrelTest.kt (88%)
 rename kmqtt-common/src/commonTest/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv5/MQTTSubackTest.kt (87%)
 rename kmqtt-common/src/commonTest/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv5/MQTTSubscribeTest.kt (87%)
 rename kmqtt-common/src/commonTest/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv5/MQTTUnsubackTest.kt (87%)
 rename kmqtt-common/src/commonTest/kotlin/{ => io/github/davidepianca98}/mqtt/packets/mqttv5/MQTTUnsubscribeTest.kt (94%)
 rename kmqtt-common/src/iosArm64Main/kotlin/{ => io/github/davidepianca98}/Posix.kt (99%)
 rename kmqtt-common/src/iosSimulatorArm64Main/kotlin/{ => io/github/davidepianca98}/Posix.kt (99%)
 rename kmqtt-common/src/iosX64Main/kotlin/{ => io/github/davidepianca98}/Posix.kt (99%)
 delete mode 100644 kmqtt-common/src/jsMain/kotlin/IgnoreJs.kt
 create mode 100644 kmqtt-common/src/jsMain/kotlin/io/github/davidepianca98/IgnoreJs.kt
 rename kmqtt-common/src/jsMain/kotlin/{ => io/github/davidepianca98}/currentTimeMillis.kt (72%)
 rename kmqtt-common/src/jsMain/kotlin/{ => io/github/davidepianca98}/socket/tcp/Socket.kt (87%)
 rename kmqtt-common/src/jsMain/kotlin/{ => io/github/davidepianca98}/socket/tls/NodeTls.kt (94%)
 rename kmqtt-common/src/jsMain/kotlin/{ => io/github/davidepianca98}/socket/tls/TLSSocket.kt (54%)
 rename kmqtt-common/src/jsMain/kotlin/{ => io/github/davidepianca98}/utils.kt (92%)
 rename kmqtt-common/src/jvmMain/kotlin/{ => io/github/davidepianca98}/IgnoreJs.kt (74%)
 rename kmqtt-common/src/jvmMain/kotlin/{ => io/github/davidepianca98}/currentTimeMillis.kt (71%)
 rename kmqtt-common/src/jvmMain/kotlin/{ => io/github/davidepianca98}/socket/tcp/Socket.kt (90%)
 rename kmqtt-common/src/jvmMain/kotlin/{ => io/github/davidepianca98}/socket/tls/TLSSocket.kt (96%)
 rename kmqtt-common/src/jvmMain/kotlin/{ => io/github/davidepianca98}/utils.kt (86%)
 rename kmqtt-common/src/linuxArm64Main/kotlin/{ => io/github/davidepianca98}/Posix.kt (99%)
 rename kmqtt-common/src/linuxX64Main/kotlin/{ => io/github/davidepianca98}/Posix.kt (99%)
 rename kmqtt-common/src/macosArm64Main/kotlin/{ => io/github/davidepianca98}/Posix.kt (99%)
 delete mode 100644 kmqtt-common/src/macosX64Main/kotlin/Posix.kt
 create mode 100644 kmqtt-common/src/macosX64Main/kotlin/io/github/davidepianca98/Posix.kt
 rename kmqtt-common/src/mingwX64Main/kotlin/{ => io/github/davidepianca98}/Posix.kt (98%)
 rename kmqtt-common/src/posixMain/kotlin/{ => io/github/davidepianca98}/IgnoreJs.kt (75%)
 rename kmqtt-common/src/posixMain/kotlin/{ => io/github/davidepianca98}/Posix.kt (98%)
 rename kmqtt-common/src/posixMain/kotlin/{ => io/github/davidepianca98}/currentTimeMillis.kt (92%)
 rename kmqtt-common/src/posixMain/kotlin/{ => io/github/davidepianca98}/socket/tcp/Socket.kt (81%)
 rename kmqtt-common/src/posixMain/kotlin/{ => io/github/davidepianca98}/socket/tls/TLSEngine.kt (92%)
 rename kmqtt-common/src/posixMain/kotlin/{ => io/github/davidepianca98}/socket/tls/TLSSocket.kt (94%)
 delete mode 100644 kmqtt-common/src/tvosArm64Main/kotlin/Posix.kt
 create mode 100644 kmqtt-common/src/tvosArm64Main/kotlin/io/github/davidepianca98/Posix.kt
 delete mode 100644 kmqtt-common/src/tvosSimulatorArm64Main/kotlin/Posix.kt
 create mode 100644 kmqtt-common/src/tvosSimulatorArm64Main/kotlin/io/github/davidepianca98/Posix.kt
 delete mode 100644 kmqtt-common/src/tvosX64Main/kotlin/Posix.kt
 create mode 100644 kmqtt-common/src/tvosX64Main/kotlin/io/github/davidepianca98/Posix.kt
 rename kmqtt-common/src/watchosArm32Main/kotlin/{ => io/github/davidepianca98}/Posix.kt (99%)
 rename kmqtt-common/src/watchosArm64Main/kotlin/{ => io/github/davidepianca98}/Posix.kt (99%)
 rename kmqtt-common/src/watchosSimulatorArm64Main/kotlin/{ => io/github/davidepianca98}/Posix.kt (99%)
 rename kmqtt-common/src/watchosX64Main/kotlin/{ => io/github/davidepianca98}/Posix.kt (99%)

diff --git a/kmqtt-broker/src/commonMain/kotlin/Main.kt b/kmqtt-broker/src/commonMain/kotlin/Main.kt
index 5fa61d3..02071db 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 82616b0..4d8edcf 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 2fc9e56..02b6b01 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 3b3a75e..76906ee 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 3e2fe0c..72be9db 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 57f0b64..6019c94 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 e91bde1..84de90a 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 f8118a4..ce6af4c 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 b9eb409..24f319b 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 2a75b8a..22a72b3 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 d05d7fe..a209845 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 6f393d9..3d60807 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 d7b9e50..cca0fb4 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 b3d019c..c128763 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 41fad0a..50c6d63 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 75d47ab..8e9af10 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 2c5bbb1..e126fee 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 0000000..55a0393
--- /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 b8e06d8..ad222f0 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 4cbbbf6..a9fd9c4 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 dd197c2..0c96bca 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 0ee7b0b..171e2e9 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 36d9429..3e26798 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 adbeb5d..48a67e6 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 09d0f55..a08a9ae 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 3262347..40858bc 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 743b2f5..5c13213 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 ee1899b..2960baa 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 736e2c6..01e3495 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 f549e59..ebdac94 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 4fe3348..05f281d 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 0d546c3..162b041 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 f1c3d91..9d9bc24 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 17e6849..550c5c9 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 88d72a6..5115abe 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 e351ff6..4d9aa59 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 f3b98b2..a1f5ef9 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 124b0e9..c1a4ba8 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 0000000..35a2dc1
--- /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 b744230..e287239 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 29a56c4..da56113 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 d315b19..546ee81 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 24864c3..b737d35 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 96a2761..0000000
--- 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 bdf6ab0..0000000
--- 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 7710b14..2cab901 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 67c98d6..884233b 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 2e4a460..36ff0c2 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 28b255e..5fd23bd 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 79b0d5f..4a89bd5 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 077b5cc..aab3fe9 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 3774afa..82f9720 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 0000000..05a5e80
--- /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 6784551..40515bc 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 fad911c..c4cebb0 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 fac7aa2..63b721b 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 f408c18..0000000
--- 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 c07a9a5..70ba797 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 dee547f..285c589 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 7d252a7..42b2fd9 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 a08a678..39589d2 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 d9a6718..e3e6b08 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 f8ec7b8..6fd0753 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 d55a78f..29106e7 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 0dc5def..62574c5 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 f8ec7b8..6fd0753 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 afbbd66..3b7f599 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 3c08335..d8a8e6c 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 f8ec7b8..6fd0753 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 afbbd66..3b7f599 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 3c08335..d8a8e6c 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 f8ec7b8..6fd0753 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 afbbd66..3b7f599 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 3c08335..d8a8e6c 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 801378a..3b206f3 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 afbbd66..3b7f599 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 3c08335..d8a8e6c 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 f73b772..5524be8 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 0e2a7f7..4fd9633 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 dee0771..3f1d306 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 7291574..bff7d0e 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 6a75a8f..a3eb9a9 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 46d4841..d242be1 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 218fd46..6ec25e4 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 1964002..f7a20b4 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 9d599bd..a81c6b1 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 0000000..6a7fddc
--- /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 0000000..6a7fddc
--- /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 b180dea..3521467 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 86c8521..df89e3f 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 a72f491..4cfa354 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 6aaf823..881b028 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 d01d03d..49b53f0 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 b180dea..3521467 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 b180dea..0000000
--- 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 b180dea..3521467 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 b180dea..0000000
--- 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 b180dea..3521467 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 b180dea..0000000
--- 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 0000000..3521467
--- /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 b180dea..0000000
--- 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 0000000..3521467
--- /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 6fcf934..ea1f393 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 f6fa7a9..d16c003 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 bb1629b..ce4fca9 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 b180dea..0000000
--- 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 0000000..3521467
--- /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 b180dea..0000000
--- 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 0000000..3521467
--- /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 b180dea..0000000
--- 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 0000000..3521467
--- /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 b180dea..0000000
--- 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 0000000..3521467
--- /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 b180dea..0000000
--- 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 0000000..3521467
--- /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 b180dea..0000000
--- 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 0000000..3521467
--- /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 b180dea..0000000
--- 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 0000000..6a7fddc
--- /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 a155695..574cac1 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 74df6db..e4f9ff5 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 89d2a59..d6987e5 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 0000000..eaf4504
--- /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 f1f9b55..dfda197 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 4d35a37..9445601 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 88e4b58..c5da6be 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 e305693..a362ba3 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 afe23bf..8fdd28a 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 57b6dce..cfcb9b7 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 92310b4..85abe2c 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 59e66fd..ccb482b 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 46e3c68..4b3b506 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 0000000..2735a48
--- /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 0000000..bf99c9b
--- /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 e2423bd..e031c22 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 0000000..3b34fff
--- /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 0000000..0ef0a64
--- /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 0000000..f0233d9
--- /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 0000000..8603413
--- /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 0000000..dac0e73
--- /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 3c5d632..f46e24d 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 0000000..b353026
--- /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 0000000..6f93737
--- /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 0000000..a62fd0f
--- /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 0000000..f2b0fc3
--- /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 0000000..22a2e55
--- /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 0332f01..367f1ac 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 647dc7f..8346c22 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 e7805ef..74dbc02 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 27e7f25..64d7067 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 66f3078..878aeb4 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 0000000..d89f638
--- /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 82e2730..bd38e72 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 0f8a0c7..a7a0cea 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 4a9ba66..0d4e06b 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 7606989..cfa9d72 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 f28ec77..bfa8839 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 1ce6844..2059561 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 f9df2b8..b04dd64 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 45cf1d5..6df7f08 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 c64ba5a..af2d735 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 cad93c2..da3d263 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 02926b0..4394c05 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 8446dd3..0c8331f 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 3777803..10971c1 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 9f5028d..b27e785 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 56f7ecd..fce84d0 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 9307ba5..ee8893d 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 0000000..eceeb66
--- /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 3404329..d5305ff 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 778a0c3..955768c 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 3bf034f..5546887 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 b424310..54f79a9 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 eff0994..7188fa5 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 9ee4340..92a9f51 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 3bd48d1..53ced26 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 80c9dca..105c8a5 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 c5f06e7..aa350b7 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 3984933..4de366f 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 13c0e59..57d3f4e 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 eebfd1e..23729a0 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 9942ef2..8ad882d 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 7b10129..a62bd4e 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 05bed9a..dfba46b 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 3e72d36..c4d1cfc 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 dbf173e..009100c 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 c1d92e1..5e028fc 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 49de172..032c99e 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 e5f078f..be78893 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 796ef24..b5bd189 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 4f79ddb..2496f3c 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 13bf16f..c2e4c7d 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 0000000..c25bee7
--- /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 bbf8575..5be09f7 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 b3049b5..ec39e1e 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 39abe02..2fd6076 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 6da9c65..81b2bda 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 9537a62..7aa1f58 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 0000000..1ed4e6f
--- /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 80774e0..0000000
--- 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 3873a95..0000000
--- 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 9153ca2..0000000
--- 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 2f40b11..0000000
--- 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 497c20e..0000000
--- 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 102132d..0000000
--- 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 3e3138b..0000000
--- 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 f07a742..0000000
--- 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 c295f9e..0000000
--- 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 9f4ab71..0000000
--- 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 46dcdd1..0000000
--- 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 bd399c5..0000000
--- 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 939a3b8..0000000
--- 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 1b43340..0000000
--- 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 5f5ac5a..0000000
--- 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 5a26fe9..0000000
--- 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 6ec585d..0000000
--- 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 9a9a024..7efdf90 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 22b10ff..2bc71cf 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 b591f86..63b69e4 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 59c0019..0a83bc3 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 cda2de1..d14003a 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 b1e2ee1..6bd86ad 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 b45a862..c54f1fa 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 f294d42..4da7635 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 4e7ec56..d437472 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 e4167a8..8e3ea2b 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 4a4198f..78e9237 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 4911f19..801e24a 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 708f2f3..0efc2bb 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 8e1c8d5..4d6a06a 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 9c93c75..3bb3d2f 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 e03ae53..2fb46e8 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 26c0b61..a11b91c 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 ed51540..c1fe276 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 ed51540..c1fe276 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 ed51540..c1fe276 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 4cc375a..0000000
--- 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 0000000..a06f950
--- /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 6683b4f..fb4c53b 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 944220b..93542ce 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 d2d56c0..7609115 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 33aa7d5..74f99f8 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 43eab3c..6bef999 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 cc5d7d5..a7be206 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 866de71..a73112f 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 45da346..e040290 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 62ec6a0..930ed67 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 f74998f..f163462 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 9a1d5f1..2fa6eeb 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 1afd4df..5135fd5 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 ed51540..c1fe276 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 ed51540..0000000
--- 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 0000000..c1fe276
--- /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 a5b939a..981d73f 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 fb46615..76cb411 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 97e6a41..a2f680c 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 2e08294..8675e91 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 a0a138d..6a565dd 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 35bd2b6..36fd9e8 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 c724695..eefb65f 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 ed51540..0000000
--- 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 0000000..c1fe276
--- /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 ed51540..0000000
--- 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 0000000..c1fe276
--- /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 ed51540..0000000
--- 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 0000000..c1fe276
--- /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 5d13333..ee62330 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 5d13333..ee62330 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 5d13333..ee62330 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 5d13333..ee62330 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.*
 
-- 
GitLab