diff --git a/Changelog.md b/Changelog.md
--- a/Changelog.md
+++ b/Changelog.md
@@ -1,5 +1,13 @@
 # Changelog for net-mqtt
 
+## 0.2.4.2
+
+Don't set a message ID of 0.
+
+This had been working fine for a while, but starting in mosquitto 1.6,
+the server would just hang up on a subscribe request with a message ID
+of zero.
+
 ## 0.2.4.1
 
 Link QoS2 completion thread on subscriber.
diff --git a/net-mqtt.cabal b/net-mqtt.cabal
--- a/net-mqtt.cabal
+++ b/net-mqtt.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: dc7e4a1db1c001ec1c63bdbb3da55fd4ff4a6f42aaf09aac10288f50eb11d858
+-- hash: 90cb428a2c77b19e3ed4d018bbbcb1db82904497e9599d297097926ab1bfe039
 
 name:           net-mqtt
-version:        0.2.4.1
+version:        0.2.4.2
 synopsis:       An MQTT Protocol Implementation.
 description:    Please see the README on GitHub at <https://github.com/dustin/mqtt-hs#readme>
 category:       Network
diff --git a/src/Network/MQTT/Client.hs b/src/Network/MQTT/Client.hs
--- a/src/Network/MQTT/Client.hs
+++ b/src/Network/MQTT/Client.hs
@@ -145,7 +145,7 @@
 runClientAppData :: ((AppData -> IO ()) -> IO ()) -> MQTTConfig -> IO MQTTClient
 runClientAppData mkconn MQTTConfig{..} = do
   ch <- newTChanIO
-  pid <- newTVarIO 0
+  pid <- newTVarIO 1
   thr <- newTVarIO []
   acks <- newTVarIO mempty
   st <- newTVarIO Starting
@@ -302,7 +302,7 @@
 reservePktID MQTTClient{..} dts = do
   ch <- newTChan
   pid <- readTVar _pktID
-  modifyTVar' _pktID succ
+  modifyTVar' _pktID (\x -> case succ x of 0 -> 1; x' -> x')
   modifyTVar' _acks (Map.union (Map.fromList [((t, pid), ch) | t <- dts]))
   pure (ch,pid)
 
@@ -321,7 +321,11 @@
     pure (ch,pid)
 
   -- Wait for the response in a separate transaction.
-  atomically $ releasePktID c (dt,pid) >> readTChan ch
+  atomically $ do
+    st <- readTVar _st
+    when (st /= Connected) $ fail "disconnected waiting for response"
+    releasePktID c (dt,pid)
+    readTChan ch
 
 -- | Subscribe to a list of topic filters with their respective QoSes.
 -- The accepted QoSes are returned in the same order as requested.
