diff --git a/kmqtt-client/src/commonMain/kotlin/io/github/davidepianca98/MQTTClient.kt b/kmqtt-client/src/commonMain/kotlin/io/github/davidepianca98/MQTTClient.kt
index 5492e3b023a21cb74f6c0695916c8bcd8d8967e4..dd25daeaa4e902470fdb85b485e88127a3602352 100644
--- a/kmqtt-client/src/commonMain/kotlin/io/github/davidepianca98/MQTTClient.kt
+++ b/kmqtt-client/src/commonMain/kotlin/io/github/davidepianca98/MQTTClient.kt
@@ -41,6 +41,7 @@ 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.mqttv4.toReasonCode
 import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Auth
 import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Connack
 import io.github.davidepianca98.mqtt.packets.mqttv5.MQTT5Connect
@@ -539,7 +540,8 @@ public class MQTTClient(
             enhancedAuthCallback(packet.properties.authenticationData)
         } else if (packet is MQTT4Connack) {
             if (packet.connectReturnCode != ConnectReturnCode.CONNECTION_ACCEPTED) {
-                throw IOException("Connection failed with code: ${packet.connectReturnCode}")
+                throw MQTTException(packet.connectReturnCode.toReasonCode())
+//                throw IOException("Connection failed with code: ${packet.connectReturnCode}")
             }
         }
 
diff --git a/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/ConnectReturnCode.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/ConnectReturnCode.kt
index 8346c226a76091a54e5da7d80e50462f9212ab3f..09ad45dea9403abf059039495a48e6f83dacca3c 100644
--- a/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/ConnectReturnCode.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/ConnectReturnCode.kt
@@ -1,5 +1,8 @@
 package io.github.davidepianca98.mqtt.packets.mqttv4
 
+import io.github.davidepianca98.mqtt.packets.mqttv4.ConnectReturnCode.*
+import io.github.davidepianca98.mqtt.packets.mqttv5.ReasonCode
+
 public enum class ConnectReturnCode(public val value: Int) {
     CONNECTION_ACCEPTED(0),
     UNACCEPTABLE_PROTOCOL_VERSION(1),
@@ -9,6 +12,15 @@ public enum class ConnectReturnCode(public val value: Int) {
     NOT_AUTHORIZED(5);
 
     public companion object {
-        public fun valueOf(value: Int): ConnectReturnCode? = values().firstOrNull { it.value == value }
+        public fun valueOf(value: Int): ConnectReturnCode? = entries.firstOrNull { it.value == value }
     }
 }
+
+public fun ConnectReturnCode.toReasonCode() : ReasonCode = when (this) {
+    CONNECTION_ACCEPTED -> ReasonCode.SUCCESS
+    UNACCEPTABLE_PROTOCOL_VERSION -> ReasonCode.UNSUPPORTED_PROTOCOL_VERSION
+    IDENTIFIER_REJECTED -> ReasonCode.CLIENT_IDENTIFIER_NOT_VALID
+    SERVER_UNAVAILABLE -> ReasonCode.SERVER_UNAVAILABLE
+    BAD_USERNAME_PASSWORD -> ReasonCode.BAD_USER_NAME_OR_PASSWORD
+    NOT_AUTHORIZED -> ReasonCode.NOT_AUTHORIZED
+}
diff --git a/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/SubackReturnCode.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/SubackReturnCode.kt
index 0c8331fabc7ed530871afde4ba5b4a3e3748b9b0..797248372600fbd1e6dc5b40bf2cd01460a84015 100644
--- a/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/SubackReturnCode.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv4/SubackReturnCode.kt
@@ -9,7 +9,7 @@ public enum class SubackReturnCode(public val value: Int) {
     FAILURE(128);
 
     public companion object {
-        public fun valueOf(value: Int): SubackReturnCode? = values().firstOrNull { it.value == value }
+        public fun valueOf(value: Int): SubackReturnCode? = entries.firstOrNull { it.value == value }
     }
 }
 
diff --git a/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/ReasonCode.kt b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/ReasonCode.kt
index dfba46b5feba0b3bead849013486f754d6396288..2b61f538b50abde89a1d9ddd8b91b2c28b0c2d00 100644
--- a/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/ReasonCode.kt
+++ b/kmqtt-common/src/commonMain/kotlin/io/github/davidepianca98/mqtt/packets/mqttv5/ReasonCode.kt
@@ -46,6 +46,6 @@ public enum class ReasonCode(public val value: Int) {
     WILDCARD_SUBSCRIPTIONS_NOT_SUPPORTED(162);
 
     public companion object {
-        public fun valueOf(value: Int): ReasonCode? = values().firstOrNull { it.value == value }
+        public fun valueOf(value: Int): ReasonCode? = entries.firstOrNull { it.value == value }
     }
 }