diff --git a/hzulip.cabal b/hzulip.cabal
--- a/hzulip.cabal
+++ b/hzulip.cabal
@@ -1,5 +1,5 @@
 name:                hzulip
-version:             0.2.0.2
+version:             0.2.0.3
 synopsis:            A haskell wrapper for the Zulip API.
 description:         This a Zulip API wrapper for Haskell.
 homepage:            https://github.com/yamadapc/hzulip
diff --git a/src/HZulip.hs b/src/HZulip.hs
--- a/src/HZulip.hs
+++ b/src/HZulip.hs
@@ -14,8 +14,9 @@
               )
   where
 
+import Control.Concurrent
+import Control.Exception
 import Control.Lens ((.~), (&), (^.))
-import Control.Monad (forever)
 import qualified Data.ByteString.Char8 as BS (pack)
 import qualified Data.Text as T (pack)
 import Network.Wreq
@@ -44,7 +45,7 @@
 --
 -- It takes the message `mtype`, `mrecipients`, `msubject` and `mcontent`
 -- and returns the created message's `id` in the `IO` monad.
-sendMessage :: ZulipClient -> String -> [String] -> String -> String -> IO String
+sendMessage :: ZulipClient -> String -> [String] -> String -> String -> IO Int
 sendMessage z mtype mrecipients msubject mcontent = do
     let form = [ "type"    := mtype
                , "content" := mcontent
@@ -83,7 +84,7 @@
 
 -- |
 -- Fetches new set of events from a `Queue`.
-getEvents :: ZulipClient -> Queue -> Bool -> IO [Event]
+getEvents :: ZulipClient -> Queue -> Bool -> IO (Queue, [Event])
 getEvents z q b = do
     let opts = (reqOptions z) { WT.params = [ ("queue_id", T.pack $ queueId q)
                                             , ("last_event_id", T.pack $ show $
@@ -97,7 +98,10 @@
     let body = r ^. responseBody
 
     if wasSuccessful body
-        then let Just evs = responseEvents body in return evs
+        then let Just evs = responseEvents body
+                 -- Get the last event id and pass it back with the `Queue`
+                 lEvId = maximum $ map eventId evs in
+             return (q { lastEventId = lEvId }, evs)
         else fail $ responseMsg body
 
 -- |
@@ -105,8 +109,13 @@
 -- events as they come in. Will loop forever
 onNewEvent :: ZulipClient -> Bool -> EventCallback -> IO ()
 onNewEvent z b f = do
-    q <- registerQueue z [] b
-    forever $ getEvents z q b >>= mapM_ f
+    q <- registerQueue z ["message"] b
+    handle (tryAgain q) (loop q)
+  where tryAgain :: Queue -> SomeException -> IO ()
+        tryAgain q = const $ threadDelay 1000000 >> loop q
+        loop q = getEvents z q False >>=
+                 \(q', evts) -> mapM_ f evts >>
+                                loop q'
 
 -- Private functions:
 -------------------------------------------------------------------------------
diff --git a/src/HZulip/Types.hs b/src/HZulip/Types.hs
--- a/src/HZulip/Types.hs
+++ b/src/HZulip/Types.hs
@@ -1,4 +1,5 @@
 {-# LANGUAGE OverloadedStrings #-}
+
 module HZulip.Types where
 
 import Control.Applicative ((<$>), (<*>), pure)
@@ -18,7 +19,7 @@
 data Response = Response { responseResult      :: ResponseResult
                          , responseMsg         :: String
 
-                         , responseMessageId   :: Maybe String
+                         , responseMessageId   :: Maybe Int
                          , responseQueueId     :: Maybe String
                          , responseLastEventId :: Maybe Int
 
@@ -49,7 +50,7 @@
 -- |
 -- Represents zulip events
 data Event = Event { eventType    :: String
-                   , eventId      :: String
+                   , eventId      :: Int
                    , eventMessage :: Maybe Message
                    }
 
@@ -62,20 +63,20 @@
 
 -- |
 -- Represents a Zulip Message
-data Message = Message { messageId               :: String
+data Message = Message { messageId               :: Int
                        , messageType             :: String
                        , messageContent          :: String
 
                        , messageAvatarUrl        :: String
                        , messageTimestamp        :: Int
 
-                       , messageDisplayRecipient :: Either String [User]
+                       -- , messageDisplayRecipient :: Either String [User]
 
                        , messageSender           :: User
 
                        , messageGravatarHash     :: String
 
-                       , messageRecipientId      :: String
+                       , messageRecipientId      :: Int
                        , messageClient           :: String
                        , messageSubjectLinks     :: [String]
                        , messageSubject          :: String
@@ -90,14 +91,14 @@
                            o .: "avatar_url"        <*>
                            o .: "timestamp"         <*>
 
-                           o .: "display_recipient" <*>
+                           -- o .: "display_recipient" <*>
 
                            (User <$>
+                             o .: "sender_id"         <*>
                              o .: "sender_full_name"  <*>
                              o .: "sender_domain"     <*>
                              o .: "sender_email"      <*>
-                             o .: "sender_short_name" <*>
-                             o .: "sender_id"
+                             o .: "sender_short_name"
                            ) <*>
 
                            o .: "gravatar_hash"     <*>
@@ -111,7 +112,7 @@
 -- |
 -- Represents a zulip user account - for both `display_recipient` and
 -- `message_sender` representations
-data User = User { userId        :: String
+data User = User { userId        :: Int
                  , userFullName  :: String
                  , userEmail     :: String
                  , userDomain    :: String
@@ -120,11 +121,11 @@
 
 instance FromJSON User where
     parseJSON (Object o) = User <$>
+                           o .: "id" <*>
                            o .: "full_name"  <*>
                            o .: "domain"     <*>
                            o .: "email"      <*>
-                           o .: "short_name" <*>
-                           o .: "id"
+                           o .: "short_name"
     parseJSON _ = mzero
 
 -- |
