diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,6 +1,9 @@
 # discord-haskell           [![Build Status](https://travis-ci.org/aquarial/discord-haskell.png?branch=master)](https://travis-ci.org/aquarial/discord-haskell)        [![Hackage version](http://img.shields.io/hackage/v/discord-haskell.svg?label=Hackage)](https://hackage.haskell.org/package/discord-haskell)
 
-Build that discord bot in Haskell! This is an example bot that replies "pong" to messages that start with "ping".
+Build that discord bot in Haskell! Also checkout the [calamity](https://github.com/nitros12/calamity) 
+haskell discord library for a more advanced interface than `discord-haskell`.
+
+This is an example bot that replies "pong" to messages that start with "ping".
 
 ```haskell
 {-# LANGUAGE OverloadedStrings #-}  -- allows "string literals" to be Text
diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -4,6 +4,11 @@
 
 Discord API changes, so use the most recent version at all times
 
+
+## 1.8.1
+
+Added `MessageReaction` to Message https://github.com/aquarial/discord-haskell/issues/56
+
 ## 1.8.0
 
 Fixed [null parent_id on channel](https://github.com/aquarial/discord-haskell/issues/55)
diff --git a/discord-haskell.cabal b/discord-haskell.cabal
--- a/discord-haskell.cabal
+++ b/discord-haskell.cabal
@@ -1,7 +1,7 @@
 cabal-version:       2.0
 name:                discord-haskell
 -- library version is also noted at src/Discord/Rest/Prelude.hs
-version:             1.8.0
+version:             1.8.1
 description:         Functions and data types to write discord bots.
                      Official discord docs <https://discord.com/developers/docs/reference>.
                      .
diff --git a/src/Discord.hs b/src/Discord.hs
--- a/src/Discord.hs
+++ b/src/Discord.hs
@@ -20,7 +20,7 @@
   ) where
 
 import Prelude hiding (log)
-import Control.Monad.Reader
+import Control.Monad.Reader (ReaderT, runReaderT, void, ask, liftIO, forever)
 import Data.Aeson (FromJSON)
 import Data.Default (Default, def)
 import qualified Data.Text as T
diff --git a/src/Discord/Internal/Rest/Channel.hs b/src/Discord/Internal/Rest/Channel.hs
--- a/src/Discord/Internal/Rest/Channel.hs
+++ b/src/Discord/Internal/Rest/Channel.hs
@@ -226,11 +226,6 @@
                                           , ("footer.png", createEmbedFooterIcon) ]]
       in maybe [] (map mkPart . uploads)
 
--- | The base url (Req) for API requests
-baseUrl :: R.Url 'R.Https
-baseUrl = R.https "discord.com" R./: "api" R./: apiVersion
-  where apiVersion = "v6"
-
 channels :: R.Url 'R.Https
 channels = baseUrl /: "channels"
 
diff --git a/src/Discord/Internal/Rest/Emoji.hs b/src/Discord/Internal/Rest/Emoji.hs
--- a/src/Discord/Internal/Rest/Emoji.hs
+++ b/src/Discord/Internal/Rest/Emoji.hs
@@ -84,11 +84,6 @@
   (ModifyGuildEmoji g _ _) -> "emoji " <> show g
   (DeleteGuildEmoji g _)   -> "emoji " <> show g
 
--- | The base url (Req) for API requests
-baseUrl :: R.Url 'R.Https
-baseUrl = R.https "discord.com" R./: "api" R./: apiVersion
-  where apiVersion = "v6"
-
 guilds :: R.Url 'R.Https
 guilds = baseUrl /: "guilds"
 
diff --git a/src/Discord/Internal/Rest/Guild.hs b/src/Discord/Internal/Rest/Guild.hs
--- a/src/Discord/Internal/Rest/Guild.hs
+++ b/src/Discord/Internal/Rest/Guild.hs
@@ -339,11 +339,6 @@
   (GetGuildVanityURL g) ->                "guild " <> show g
 
 
--- | The base url (Req) for API requests
-baseUrl :: R.Url 'R.Https
-baseUrl = R.https "discord.com" R./: "api" R./: apiVersion
-  where apiVersion = "v6"
-
 guilds :: R.Url 'R.Https
 guilds = baseUrl /: "guilds"
 
diff --git a/src/Discord/Internal/Rest/Invite.hs b/src/Discord/Internal/Rest/Invite.hs
--- a/src/Discord/Internal/Rest/Invite.hs
+++ b/src/Discord/Internal/Rest/Invite.hs
@@ -34,11 +34,6 @@
   (GetInvite _) ->     "invite "
   (DeleteInvite _) ->  "invite "
 
--- | The base url (Req) for API requests
-baseUrl :: R.Url 'R.Https
-baseUrl = R.https "discord.com" R./: "api" R./: apiVersion
-  where apiVersion = "v6"
-
 invite :: R.Url 'R.Https
 invite = baseUrl /: "invites"
 
diff --git a/src/Discord/Internal/Rest/Prelude.hs b/src/Discord/Internal/Rest/Prelude.hs
--- a/src/Discord/Internal/Rest/Prelude.hs
+++ b/src/Discord/Internal/Rest/Prelude.hs
@@ -16,6 +16,11 @@
 
 import Discord.Internal.Types
 
+-- | The base url (Req) for API requests
+baseUrl :: R.Url 'R.Https
+baseUrl = R.https "discord.com" R./: "api" R./: apiVersion
+  where apiVersion = "v6"
+
 -- | Discord requires HTTP headers for authentication.
 authHeader :: Auth -> R.Option 'R.Https
 authHeader auth =
@@ -24,7 +29,7 @@
   where
   -- | https://discord.com/developers/docs/reference#user-agent
   -- Second place where the library version is noted
-  agent = "DiscordBot (https://github.com/aquarial/discord-haskell, 1.8.0)"
+  agent = "DiscordBot (https://github.com/aquarial/discord-haskell, 1.8.1)"
 
 -- Append to an URL
 infixl 5 //
diff --git a/src/Discord/Internal/Rest/User.hs b/src/Discord/Internal/Rest/User.hs
--- a/src/Discord/Internal/Rest/User.hs
+++ b/src/Discord/Internal/Rest/User.hs
@@ -74,11 +74,6 @@
   (CreateDM _) ->                       "make_dm "
   (GetUserConnections) ->           "connections "
 
--- | The base url (Req) for API requests
-baseUrl :: R.Url 'R.Https
-baseUrl = R.https "discord.com" R./: "api" R./: apiVersion
-  where apiVersion = "v6"
-
 users :: R.Url 'R.Https
 users = baseUrl /: "users"
 
diff --git a/src/Discord/Internal/Rest/Voice.hs b/src/Discord/Internal/Rest/Voice.hs
--- a/src/Discord/Internal/Rest/Voice.hs
+++ b/src/Discord/Internal/Rest/Voice.hs
@@ -28,11 +28,6 @@
 voiceMajorRoute c = case c of
   (ListVoiceRegions) -> "whatever "
 
--- | The base url (Req) for API requests
-baseUrl :: R.Url 'R.Https
-baseUrl = R.https "discord.com" R./: "api" R./: apiVersion
-  where apiVersion = "v6"
-
 voices :: R.Url 'R.Https
 voices = baseUrl /: "voice"
 
diff --git a/src/Discord/Internal/Rest/Webhook.hs b/src/Discord/Internal/Rest/Webhook.hs
--- a/src/Discord/Internal/Rest/Webhook.hs
+++ b/src/Discord/Internal/Rest/Webhook.hs
@@ -102,11 +102,6 @@
   (DeleteWebhookWithToken w _) ->   "deletehook " <> show w
   (ExecuteWebhookWithToken w _ _) -> "executehk " <> show w
 
--- | The base url (Req) for API requests
-baseUrl :: R.Url 'R.Https
-baseUrl = R.https "discord.com" R./: "api" R./: apiVersion
-  where apiVersion = "v6"
-
 webhookJsonRequest :: WebhookRequest r -> JsonRequest
 webhookJsonRequest ch = case ch of
   (CreateWebhook channel patch) ->
diff --git a/src/Discord/Internal/Types/Channel.hs b/src/Discord/Internal/Types/Channel.hs
--- a/src/Discord/Internal/Types/Channel.hs
+++ b/src/Discord/Internal/Types/Channel.hs
@@ -245,6 +245,7 @@
                                            --   the message
   , messageAttachments  :: [Attachment]    -- ^ Any attached files
   , messageEmbeds       :: [Embed]         -- ^ Any embedded content
+  , messageReactions    :: [MessageReaction] -- ^ Any reactions to message
   , messageNonce        :: Maybe Nonce     -- ^ Used for validating if a message
                                            --   was sent
   , messagePinned       :: Bool            -- ^ Whether this message is pinned
@@ -269,10 +270,42 @@
             <*> o .:? "mention_roles" .!= []
             <*> o .:? "attachments" .!= []
             <*> o .:  "embeds"
+            <*> o .:? "reactions" .!= []
             <*> o .:? "nonce"
             <*> o .:? "pinned" .!= False
             <*> o .:? "guild_id" .!= Nothing
 
+
+data MessageReaction = MessageReaction
+  { messageReactionCount :: Int
+  , messageReactionMeIncluded :: Bool
+  , messageReactionEmoji :: Emoji
+  } deriving (Show, Eq, Ord)
+
+instance FromJSON MessageReaction where
+  parseJSON = withObject "MessageReaction" $ \o ->
+    MessageReaction <$> o .: "count"
+                    <*> o .: "me"
+                    <*> o .: "emoji"
+
+-- | Represents an emoticon (emoji)
+data Emoji = Emoji
+  { emojiId      :: Maybe EmojiId  -- ^ The emoji id
+  , emojiName    :: T.Text         -- ^ The emoji name
+  , emojiRoles   :: Maybe [RoleId] -- ^ Roles the emoji is active for
+  , emojiUser    :: Maybe User     -- ^ User that created this emoji
+  , emojiManaged :: Maybe Bool     -- ^ Whether this emoji is managed
+  } deriving (Show, Eq, Ord)
+
+instance FromJSON Emoji where
+  parseJSON = withObject "Emoji" $ \o ->
+    Emoji <$> o .:  "id"
+          <*> o .:  "name"
+          <*> o .:? "roles"
+          <*> o .:? "user"
+          <*> o .:? "managed"
+
+  
 -- | Represents an attached to a message file.
 data Attachment = Attachment
   { attachmentId       :: Snowflake     -- ^ Attachment id
diff --git a/src/Discord/Internal/Types/Guild.hs b/src/Discord/Internal/Types/Guild.hs
--- a/src/Discord/Internal/Types/Guild.hs
+++ b/src/Discord/Internal/Types/Guild.hs
@@ -9,7 +9,7 @@
 import qualified Data.Text as T
 
 import Discord.Internal.Types.Prelude
-import Discord.Internal.Types.Channel (Channel)
+import Discord.Internal.Types.Channel (Channel, Emoji)
 import Discord.Internal.Types.User (User)
 
 -- | Representation of a guild member.
@@ -123,22 +123,6 @@
                  <*> o .:?  "owner" .!= False
                  <*> o .:  "permissions"
 
--- | Represents an emoticon (emoji)
-data Emoji = Emoji
-  { emojiId      :: Maybe EmojiId   -- ^ The emoji id
-  , emojiName    :: T.Text            -- ^ The emoji name
-  , emojiRoles   :: Maybe [RoleId] -- ^ Roles the emoji is active for
-  , emojiUser    :: Maybe User     -- ^ User that created this emoji
-  , emojiManaged :: Maybe Bool        -- ^ Whether this emoji is managed
-  } deriving (Show, Eq, Ord)
-
-instance FromJSON Emoji where
-  parseJSON = withObject "Emoji" $ \o ->
-    Emoji <$> o .:  "id"
-          <*> o .:  "name"
-          <*> o .:? "roles"
-          <*> o .:? "user"
-          <*> o .:? "managed"
 
 -- | Roles represent a set of permissions attached to a group of users. Roles have unique
 --   names, colors, and can be "pinned" to the side bar, causing their members to be listed separately.
