diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,16 @@
+0.7
+---
+
+- Make package complaint with Telegram Bot API 6.3 (breaking changes included) (see [#133](https://github.com/fizruk/telegram-bot-simple/pull/133)):
+
+    - `Chat` extended with `is_forum`, `active_usernames` and `emoji_status_custom_emoji_id`;
+    - `Message` extended with `forum_topic_created`, `forum_topic_closed` and `forum_topic_reopened`;
+    - Following message events added `ForumTopicCreated`, `ForumTopicClosed` and `ForumTopicReopened`;
+    - `can_manage_topics` field added to `ChatAdministratorRights`, `ChatPermissions` and `ChatMember` data types;
+    - `PromoteChatMemberRequest` extended with `can_manage_topics` too;
+    - `message_thread_id` field added to following methods requests: `sendMessage`, `sendPhoto`, `sendVideo`, `sendAnimation`, `sendAudio`, `sendDocument`, `sendSticker`, `sendVideoNote`, `sendVoice`, `sendLocation`, `sendVenue`, `sendContact`, `sendPoll`, `sendDice`, `sendInvoice`, `sendGame`, `sendMediaGroup`, `copyMessage` and `forwardMessage`;
+    - Forum management, i.e. added following functions: `createForumTopic`, `editForumTopic`, `closeForumTopic`, `reopenForumTopic`, `deleteForumTopic`, `unpinAllForumTopicMessages` and `getForumTopicIconStickers`;
+
 0.6.2
 ---
 
diff --git a/examples/EchoBot.hs b/examples/EchoBot.hs
--- a/examples/EchoBot.hs
+++ b/examples/EchoBot.hs
@@ -60,7 +60,8 @@
     _ <- liftClientM 
       (sendSticker 
         (SendStickerRequest 
-          (SomeChatId chat) 
+          (SomeChatId chat)
+          Nothing
           file 
           Nothing
           Nothing
diff --git a/examples/EchoBotWebhook.hs b/examples/EchoBotWebhook.hs
--- a/examples/EchoBotWebhook.hs
+++ b/examples/EchoBotWebhook.hs
@@ -71,6 +71,7 @@
       (sendSticker
         (SendStickerRequest
           (SomeChatId chat)
+          Nothing
           file
           Nothing
           Nothing
diff --git a/examples/GameBot.hs b/examples/GameBot.hs
--- a/examples/GameBot.hs
+++ b/examples/GameBot.hs
@@ -96,7 +96,7 @@
   AFeedback sourceChatId msgId -> model <# do
     let shouldNotify  = Just True
         targetChatId  = SomeChatId (ChatId (fromIntegral supportChatId))
-        fwdMsgRequest = ForwardMessageRequest targetChatId sourceChatId shouldNotify Nothing msgId
+        fwdMsgRequest = ForwardMessageRequest targetChatId Nothing sourceChatId shouldNotify Nothing msgId
     _ <- liftClientM (forwardMessage fwdMsgRequest)
     return ()
 
@@ -124,6 +124,7 @@
   AGame targetChatId msg -> model <# do
     let sendGameRequest = SendGameRequest
           { sendGameRequestChatId                   = coerce targetChatId
+          , sendGameRequestMessageThreadId          = Nothing
           , sendGameRequestGameShortName            = gameId
           , sendGameRequestDisableNotification      = Nothing
           , sendGameProtectContent                  = Nothing
diff --git a/src/Telegram/Bot/API/Forum.hs b/src/Telegram/Bot/API/Forum.hs
new file mode 100644
--- /dev/null
+++ b/src/Telegram/Bot/API/Forum.hs
@@ -0,0 +1,152 @@
+{-# LANGUAGE DataKinds                  #-}
+{-# LANGUAGE DeriveGeneric              #-}
+{-# LANGUAGE OverloadedStrings          #-}
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE TypeApplications           #-}
+{-# LANGUAGE TypeOperators              #-}
+{-# LANGUAGE RecordWildCards            #-}
+{-# LANGUAGE MultiParamTypeClasses      #-}
+{-# LANGUAGE LambdaCase #-}
+
+module Telegram.Bot.API.Forum where
+
+import Data.Aeson (ToJSON (..))
+import Data.Proxy
+import Data.Text (Text)
+import GHC.Generics (Generic)
+import Servant.API
+import Servant.Client hiding (Response)
+
+import Telegram.Bot.API.Internal.Utils
+import Telegram.Bot.API.MakingRequests (Response)
+import Telegram.Bot.API.Types
+
+-- ** 'getForumTopicIconStickers'
+
+type GetForumTopicIconStickers
+  = "getForumTopicIconStickers"
+  :> Post '[JSON] (Response [Sticker])
+
+-- | Use this method to get custom emoji stickers, which can be used as a forum topic icon by any user.
+-- Requires no parameters. Returns an '[Sticker]' objects.
+getForumTopicIconStickers :: ClientM (Response [Sticker])
+getForumTopicIconStickers = client (Proxy @GetForumTopicIconStickers)
+
+-- ** 'createForumTopic'
+
+data CreateForumTopicRequest = CreateForumTopicRequest
+  { createForumTopicRequestChatId :: SomeChatId -- ^ Unique identifier for the target chat or username of the target supergroup (in the format @supergroupusername).
+  , createForumTopicRequestName :: Text -- ^ Topic name, 1-128 characters.
+  , createForumTopicRequestIconColor :: Maybe Integer -- ^ Color of the topic icon in RGB format. Currently, must be one of @7322096 (0x6FB9F0), 16766590 (0xFFD67E), 13338331 (0xCB86DB), 9367192 (0x8EEE98), 16749490 (0xFF93B2), or 16478047 (0xFB6F5F)@.
+  , createForumTopicRequestIconCustomEmojiId :: Maybe Text -- ^ Unique identifier of the custom emoji shown as the topic icon. Use 'getForumTopicIconStickers' to get all allowed custom emoji identifiers.
+  }
+  deriving Generic
+
+instance ToJSON CreateForumTopicRequest where toJSON = gtoJSON
+
+type CreateForumTopic
+  = "createForumTopic"
+  :> ReqBody '[JSON] CreateForumTopicRequest
+  :> Post '[JSON] (Response ForumTopic)
+
+-- | Use this method to create a topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the @can_manage_topics@ administrator rights. Returns information about the created topic as a 'ForumTopic' object.
+createForumTopic :: CreateForumTopicRequest -> ClientM (Response ForumTopic)
+createForumTopic = client (Proxy @CreateForumTopic)
+
+
+-- ** 'editForumTopic'
+
+data EditForumTopicRequest = EditForumTopicRequest
+  { editForumTopicChatId :: SomeChatId -- ^ Unique identifier for the target chat or username of the target supergroup (in the format @supergroupusername).
+  , editForumTopicMessageThreadId :: MessageThreadId -- ^ Unique identifier for the target message thread of the forum topic.
+  , editForumTopicName :: Maybe Text -- ^ New topic name, 0-128 characters. If not specified or empty, the current name of the topic will be kept.
+  , editForumTopicIconCustomEmojiId :: Maybe Text -- ^ New unique identifier of the custom emoji shown as the topic icon. Use 'getForumTopicIconStickers' to get all allowed custom emoji identifiers. Pass an empty string to remove the icon. If not specified, the current icon will be kept.
+  }
+  deriving Generic
+
+instance ToJSON EditForumTopicRequest where toJSON = gtoJSON
+
+type EditForumTopic
+  = "editForumTopic"
+  :> ReqBody '[JSON] EditForumTopicRequest
+  :> Post '[JSON] (Response Bool)
+
+-- | Use this method to edit name and icon of a topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have @can_manage_topics@ administrator rights, unless it is the creator of the topic. Returns 'True' on success.
+editForumTopic :: EditForumTopicRequest -> ClientM (Response Bool)
+editForumTopic = client (Proxy @EditForumTopic)
+
+-- ** 'closeForumTopic'
+
+data CloseForumTopicRequest = CloseForumTopicRequest
+  { closeForumTopicRequestChatId :: SomeChatId -- ^ Unique identifier for the target chat or username of the target supergroup (in the format @supergroupusername).
+  , closeForumTopicRequestMessageThreadId :: MessageThreadId -- ^ Unique identifier for the target message thread of the forum topic.
+  }
+  deriving Generic
+
+instance ToJSON CloseForumTopicRequest where toJSON = gtoJSON
+
+type CloseForumTopic
+  = "closeForumTopic"
+  :> ReqBody '[JSON] CloseForumTopicRequest
+  :> Post '[JSON] (Response Bool)
+
+-- | Use this method to close an open topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the @can_manage_topics@ administrator rights, unless it is the creator of the topic. Returns 'True' on success.
+closeForumTopic :: CloseForumTopicRequest -> ClientM (Response Bool)
+closeForumTopic = client (Proxy @CloseForumTopic)
+
+-- ** 'reopenForumTopic'
+
+data ReopenForumTopicRequest = ReopenForumTopicRequest
+  { reopenForumTopicRequestChatId :: SomeChatId -- ^ Unique identifier for the target chat or username of the target supergroup (in the format @supergroupusername).
+  , reopenForumTopicRequestMessageThreadId :: MessageThreadId -- ^ Unique identifier for the target message thread of the forum topic.
+  }
+  deriving Generic
+
+instance ToJSON ReopenForumTopicRequest where toJSON = gtoJSON
+
+type ReopenForumTopic
+  = "reopenForumTopic"
+  :> ReqBody '[JSON] ReopenForumTopicRequest
+  :> Post '[JSON] (Response Bool)
+
+-- | Use this method to reopen a closed topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the @can_manage_topics@ administrator rights, unless it is the creator of the topic. Returns 'True' on success.
+reopenForumTopic :: ReopenForumTopicRequest -> ClientM (Response Bool)
+reopenForumTopic = client (Proxy @ReopenForumTopic)
+
+-- ** 'deleteForumTopic'
+
+data DeleteForumTopicRequest = DeleteForumTopicRequest
+  { deleteForumTopicRequestChatId :: SomeChatId -- ^ Unique identifier for the target chat or username of the target supergroup (in the format @supergroupusername).
+  , deleteForumTopicRequestMessageThreadId :: MessageThreadId -- ^ Unique identifier for the target message thread of the forum topic.
+  }
+  deriving Generic
+
+instance ToJSON DeleteForumTopicRequest where toJSON = gtoJSON
+
+type DeleteForumTopic
+  = "deleteForumTopic"
+  :> ReqBody '[JSON] DeleteForumTopicRequest
+  :> Post '[JSON] (Response Bool)
+
+-- | Use this method to delete a forum topic along with all its messages in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the @can_delete_messages@ administrator rights. Returns 'True' on success.
+deleteForumTopic :: DeleteForumTopicRequest -> ClientM (Response Bool)
+deleteForumTopic = client (Proxy @DeleteForumTopic)
+
+-- ** 'unpinAllForumTopicMessages'
+
+data UnpinAllForumTopicMessagesRequest = UnpinAllForumTopicMessagesRequest
+  { unpinAllForumTopicMessagesRequestChatId :: SomeChatId -- ^ Unique identifier for the target chat or username of the target supergroup (in the format @supergroupusername)
+  , unpinAllForumTopicMessagesRequestMessageThreadId :: MessageThreadId -- ^ Unique identifier for the target message thread of the forum topic.
+  }
+  deriving Generic
+
+instance ToJSON UnpinAllForumTopicMessagesRequest where toJSON = gtoJSON
+
+type UnpinAllForumTopicMessages
+  = "unpinAllForumTopicMessages"
+  :> ReqBody '[JSON] UnpinAllForumTopicMessagesRequest
+  :> Post '[JSON] (Response Bool)
+
+-- | Use this method to clear the list of pinned messages in a forum topic. The bot must be an administrator in the chat for this to work and must have the @can_pin_messages@ administrator right in the supergroup. Returns 'True' on success.
+unpinAllForumTopicMessages :: UnpinAllForumTopicMessagesRequest -> ClientM (Response Bool)
+unpinAllForumTopicMessages = client (Proxy @UnpinAllForumTopicMessages)
diff --git a/src/Telegram/Bot/API/Games.hs b/src/Telegram/Bot/API/Games.hs
--- a/src/Telegram/Bot/API/Games.hs
+++ b/src/Telegram/Bot/API/Games.hs
@@ -15,7 +15,7 @@
 
 import Telegram.Bot.API.Internal.Utils (deriveJSON')
 import Telegram.Bot.API.MakingRequests (Response)
-import Telegram.Bot.API.Types (ChatId, GameHighScore, InlineKeyboardMarkup, Message, MessageId, UserId)
+import Telegram.Bot.API.Types (ChatId, GameHighScore, InlineKeyboardMarkup, Message, MessageId, MessageThreadId, UserId)
 
 -- * Types
 
@@ -23,6 +23,7 @@
 
 data SendGameRequest = SendGameRequest
   { sendGameRequestChatId                   :: ChatId                     -- ^ Unique identifier for the target chat.
+  , sendGameRequestMessageThreadId          :: Maybe MessageThreadId      -- ^ Unique identifier for the target message thread (topic) of the forum; for forum supergroups only.
   , sendGameRequestGameShortName            :: Text                       -- ^ Short name of the game, serves as the unique identifier for the game. Set up your games via Botfather.
   , sendGameRequestDisableNotification      :: Maybe Bool                 -- ^ Sends the message silently. Users will receive a notification with no sound.
   , sendGameProtectContent                  :: Maybe Bool                 -- ^ Protects the contents of the sent message from forwarding and saving.  
diff --git a/src/Telegram/Bot/API/Methods.hs b/src/Telegram/Bot/API/Methods.hs
--- a/src/Telegram/Bot/API/Methods.hs
+++ b/src/Telegram/Bot/API/Methods.hs
@@ -102,6 +102,7 @@
 -- | Request parameters for 'sendMessage'.
 data SendMessageRequest = SendMessageRequest
   { sendMessageChatId                :: SomeChatId -- ^ Unique identifier for the target chat or username of the target channel (in the format @\@channelusername@).
+  , sendMessageMessageThreadId       :: Maybe MessageThreadId -- ^ Unique identifier for the target message thread (topic) of the forum; for forum supergroups only.
   , sendMessageText                  :: Text -- ^ Text of the message to be sent.
   , sendMessageParseMode             :: Maybe ParseMode -- ^ Send 'MarkdownV2', 'HTML' or 'Markdown' (legacy), if you want Telegram apps to show bold, italic, fixed-width text or inline URLs in your bot's message.
   , sendMessageEntities              :: Maybe [MessageEntity] -- ^ A JSON-serialized list of special entities that appear in message text, which can be specified instead of /parse_mode/.
@@ -119,6 +120,7 @@
 -- | Request parameters for 'forwardMessage'.
 data ForwardMessageRequest = ForwardMessageRequest
   { forwardMessageChatId              :: SomeChatId -- ^ Unique identifier for the target chat or username of the target channel (in the format @\@channelusername).
+  , forwardMessageMessageThreadId     :: Maybe MessageThreadId -- ^ Unique identifier for the target message thread (topic) of the forum; for forum supergroups only.
   , forwardMessageFromChatId          :: SomeChatId -- ^ Unique identifier for the chat where the original message was sent (or channel username in the format @\@channelusername).
   , forwardMessageDisableNotification :: Maybe Bool -- ^ Sends the message silently. Users will receive a notification with no sound.
   , forwardMessageProtectContent      :: Maybe Bool -- ^ Protects the contents of the sent message from forwarding and saving.
@@ -154,6 +156,7 @@
 -- | Request parameters for 'sendDocument'
 data SendDocumentRequest = SendDocumentRequest
   { sendDocumentChatId :: SomeChatId -- ^ Unique identifier for the target chat or username of the target channel (in the format @\@channelusername@).
+  , sendDocumentMessageThreadId :: Maybe MessageThreadId -- ^ Unique identifier for the target message thread (topic) of the forum; for forum supergroups only.
   , sendDocumentDocument :: DocumentFile -- ^ Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data
   , sendDocumentThumb :: Maybe FilePath -- ^ Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://<file_attach_name>” if the thumbnail was uploaded using multipart/form-data under <file_attach_name>
   , sendDocumentCaption :: Maybe Text -- ^ Document caption (may also be used when resending documents by file_id), 0-1024 characters after entities parsing
@@ -190,12 +193,14 @@
           SomeChatId (ChatId chat_id) -> T.pack $ show chat_id
           SomeChatUsername txt -> txt
       ] <>
-      (   (maybe id (\_ -> ((Input "thumb" "attach://thumb"):)) sendDocumentThumb)
+      (   (maybe id (\t -> ((Input "message_thread_id") (T.pack $ show t):)) sendDocumentMessageThreadId)
+        $ (maybe id (\_ -> ((Input "thumb" "attach://thumb"):)) sendDocumentThumb)
         $ (maybe id (\t -> ((Input "caption" t):)) sendDocumentCaption)
         $ (maybe id (\t -> ((Input "parse_mode" (TL.toStrict $ encodeToLazyText t)):)) sendDocumentParseMode)
         $ (maybe id (\t -> ((Input "caption_entities" (TL.toStrict $ encodeToLazyText t)):)) sendDocumentCaptionEntities)
         $ (maybe id (\t -> ((Input "disable_notification" (bool "false" "true" t)):)) sendDocumentDisableNotification)
         $ (maybe id (\t -> ((Input "disable_content_type_detection" (bool "false" "true" t)):)) sendDocumentDisableContentTypeDetection)
+        $ (maybe id (\t -> ((Input "protect_content" (bool "false" "true" t)):)) sendDocumentProtectContent)
         $ (maybe id (\t -> ((Input "reply_to_message_id" (TL.toStrict $ encodeToLazyText t)):)) sendDocumentReplyToMessageId)
         $ (maybe id (\t -> ((Input "allow_sending_without_reply" (bool "false" "true" t)):)) sendDocumentAllowSendingWithoutReply)
         $ (maybe id (\t -> ((Input "reply_markup" (TL.toStrict $ encodeToLazyText t)):)) sendDocumentReplyMarkup)
@@ -213,6 +218,7 @@
 toSendDocument :: SomeChatId -> DocumentFile -> SendDocumentRequest
 toSendDocument ch df = SendDocumentRequest
   { sendDocumentChatId = ch
+  , sendDocumentMessageThreadId = Nothing
   , sendDocumentDocument = df
   , sendDocumentThumb = Nothing
   , sendDocumentCaption = Nothing
@@ -264,6 +270,7 @@
 -- | Request parameters for 'sendPhoto'
 data SendPhotoRequest = SendPhotoRequest
   { sendPhotoChatId :: SomeChatId -- ^ Unique identifier for the target chat or username of the target channel (in the format @\@channelusername@).
+  , sendPhotoMessageThreadId :: Maybe MessageThreadId -- ^ Unique identifier for the target message thread (topic) of the forum; for forum supergroups only.
   , sendPhotoPhoto :: PhotoFile -- ^ Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data
   , sendPhotoThumb :: Maybe FilePath -- ^ Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass “attach://<file_attach_name>” if the thumbnail was uploaded using multipart/form-data under <file_attach_name>
   , sendPhotoCaption :: Maybe Text -- ^ Photo caption (may also be used when resending Photos by file_id), 0-1024 characters after entities parsing
@@ -285,11 +292,13 @@
           SomeChatId (ChatId chat_id) -> T.pack $ show chat_id
           SomeChatUsername txt -> txt
       ] <>
-      (   (maybe id (\_ -> ((Input "thumb" "attach://thumb"):)) sendPhotoThumb)
+      (   (maybe id (\t -> ((Input "message_thread_id" (T.pack $ show t)):)) sendPhotoMessageThreadId)
+        $ (maybe id (\_ -> ((Input "thumb" "attach://thumb"):)) sendPhotoThumb)
         $ (maybe id (\t -> ((Input "caption" t):)) sendPhotoCaption)
         $ (maybe id (\t -> ((Input "parse_mode" (TL.toStrict . TL.replace "\"" "" $ encodeToLazyText t)):)) sendPhotoParseMode)
         $ (maybe id (\t -> ((Input "caption_entities" (TL.toStrict $ encodeToLazyText t)):)) sendPhotoCaptionEntities)
         $ (maybe id (\t -> ((Input "disable_notification" (bool "false" "true" t)):)) sendPhotoDisableNotification)
+        $ (maybe id (\t -> ((Input "protect_content" (bool "false" "true" t)):)) sendPhotoProtectContent)
         $ (maybe id (\t -> ((Input "reply_to_message_id" (TL.toStrict $ encodeToLazyText t)):)) sendPhotoReplyToMessageId)
         $ (maybe id (\t -> ((Input "allow_sending_without_reply" (bool "false" "true" t)):)) sendPhotoAllowSendingWithoutReply)
         $ (maybe id (\t -> ((Input "reply_markup" (TL.toStrict $ encodeToLazyText t)):)) sendPhotoReplyMarkup)
@@ -316,7 +325,8 @@
 
 -- | Request parameters for 'copyMessage'.
 data CopyMessageRequest = CopyMessageRequest
-  { copyMessageChatId :: SomeChatId -- ^ Unique identifier for the target chat or username of the target channel (in the format @channelusername)
+  { copyMessageChatId :: SomeChatId -- ^ Unique identifier for the target chat or username of the target channel (in the format @channelusername).
+  , copyMessageMessageThreadId :: Maybe Message -- ^ Unique identifier for the target message thread (topic) of the forum; for forum supergroups only.
   , copyMessageFromChatId :: SomeChatId -- ^ Unique identifier for the chat where the original message was sent (or channel username in the format @channelusername)
   , copyMessageMessageId :: MessageId -- ^ Message identifier in the chat specified in from_chat_id
   , copyMessageCaption :: Maybe Text -- ^ New caption for media, 0-1024 characters after entities parsing. If not specified, the original caption is kept
@@ -332,7 +342,8 @@
 
 -- | Request parameters for 'sendAudio'.
 data SendAudioRequest = SendAudioRequest
-  { sendAudioChatId :: SomeChatId -- ^ Unique identifier for the target chat or username of the target channel (in the format @channelusername)
+  { sendAudioChatId :: SomeChatId -- ^ Unique identifier for the target chat or username of the target channel (in the format @channelusername).
+  , sendAudioMessageThreadId :: Maybe MessageThreadId -- ^ Unique identifier for the target message thread (topic) of the forum; for forum supergroups only.
   , sendAudioAudio :: InputFile -- ^ Audio to send. Pass a file_id as String to send an audio that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a audio from the Internet, or upload a new audio using multipart/form-data. More info on Sending Files »
   , sendAudioDuration :: Maybe Int -- ^ Duration of sent audio in seconds
   , sendAudioPerformer :: Maybe Text -- ^ Performer
@@ -361,7 +372,9 @@
           SomeChatId (ChatId chat_id) -> T.pack $ show chat_id
           SomeChatUsername txt -> txt
       ] <> catMaybes
-      [ sendAudioCaption <&>
+      [ sendAudioMessageThreadId <&>
+        \t -> Input "message_thread_id" (T.pack $ show t)
+      , sendAudioCaption <&>
         \t -> Input "caption" t
       , sendAudioParseMode <&>
         \t -> Input "parse_mode" (TL.toStrict . TL.replace "\"" "" $ encodeToLazyText t)
@@ -376,7 +389,7 @@
       , sendAudioDisableNotification <&>
         \t -> Input "disable_notification" (bool "false" "true" t)
       , sendAudioProtectContent <&>
-        \t -> Input "protected_content" (bool "false" "true" t)
+        \t -> Input "protect_content" (bool "false" "true" t)
       , sendAudioReplyToMessageId <&>
         \t -> Input "reply_to_message_id" (TL.toStrict $ encodeToLazyText t)
       , sendAudioAllowSendingWithoutReply <&>
@@ -417,6 +430,7 @@
 -- | Request parameters for 'sendVideo'.
 data SendVideoRequest = SendVideoRequest
   { sendVideoChatId :: SomeChatId -- ^ Unique identifier for the target chat or username of the target channel (in the format @channelusername)
+  , sendVideoMessageThreadId :: Maybe MessageThreadId -- ^ Unique identifier for the target message thread (topic) of the forum; for forum supergroups only.
   , sendVideoVideo :: InputFile -- ^ Video to send. Pass a file_id as String to send an video that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a video from the Internet, or upload a new video using multipart/form-data. More info on Sending Files »
   , sendVideoDuration :: Maybe Int -- ^ Duration of sent video in seconds
   , sendVideoWidth :: Maybe Int -- ^ Video width
@@ -446,7 +460,9 @@
           SomeChatId (ChatId chat_id) -> T.pack $ show chat_id
           SomeChatUsername txt -> txt
       ] <> catMaybes
-      [ sendVideoCaption <&>
+      [ sendVideoMessageThreadId <&>
+        \t -> Input "message_thread_id" (T.pack $ show t)
+      , sendVideoCaption <&>
         \t -> Input "caption" t
       , sendVideoParseMode <&>
         \t -> Input "parse_mode" (TL.toStrict . TL.replace "\"" "" $ encodeToLazyText t)
@@ -463,7 +479,7 @@
       , sendVideoSupportsStreaming <&>
         \t -> Input "supports_streaming" (bool "false" "true" t)
       , sendVideoProtectContent <&>
-        \t -> Input "protected_content" (bool "false" "true" t)
+        \t -> Input "protect_content" (bool "false" "true" t)
       , sendVideoReplyToMessageId <&>
         \t -> Input "reply_to_message_id" (TL.toStrict $ encodeToLazyText t)
       , sendVideoAllowSendingWithoutReply <&>
@@ -501,6 +517,7 @@
 -- | Request parameters for 'sendAnimation'.
 data SendAnimationRequest = SendAnimationRequest
   { sendAnimationChatId :: SomeChatId -- ^ Unique identifier for the target chat or username of the target channel (in the format @channelusername)
+  , sendAnimationMessageThreadId :: Maybe MessageThreadId -- ^ Unique identifier for the target message thread (topic) of the forum; for forum supergroups only.
   , sendAnimationAnimation :: InputFile -- ^ Animation to send. Pass a file_id as String to send an animation that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an animation from the Internet, or upload a new animation using multipart/form-data. More info on Sending Files »
   , sendAnimationDuration :: Maybe Int -- ^ Duration of sent animation in seconds
   , sendAnimationWidth :: Maybe Int -- ^ Animation width
@@ -529,7 +546,9 @@
           SomeChatId (ChatId chat_id) -> T.pack $ show chat_id
           SomeChatUsername txt -> txt
       ] <> catMaybes
-      [ sendAnimationCaption <&>
+      [ sendAnimationMessageThreadId <&>
+        \t -> Input "message_thread_id" (T.pack $ show t)
+      , sendAnimationCaption <&>
         \t -> Input "caption" t
       , sendAnimationParseMode <&>
         \t -> Input "parse_mode" (TL.toStrict . TL.replace "\"" "" $ encodeToLazyText t)
@@ -544,7 +563,7 @@
       , sendAnimationDisableNotification <&>
         \t -> Input "disable_notification" (bool "false" "true" t)
       , sendAnimationProtectContent <&>
-        \t -> Input "protected_content" (bool "false" "true" t)
+        \t -> Input "protect_content" (bool "false" "true" t)
       , sendAnimationReplyToMessageId <&>
         \t -> Input "reply_to_message_id" (TL.toStrict $ encodeToLazyText t)
       , sendAnimationAllowSendingWithoutReply <&>
@@ -580,7 +599,8 @@
 
 -- | Request parameters for 'sendVoice'.
 data SendVoiceRequest = SendVoiceRequest
-  { sendVoiceChatId :: SomeChatId -- ^ Unique identifier for the target chat or username of the target channel (in the format @channelusername)
+  { sendVoiceChatId :: SomeChatId -- ^ Unique identifier for the target chat or username of the target channel (in the format @channelusername).
+  , sendVoiceMessageThreadId :: Maybe MessageThreadId -- ^ Unique identifier for the target message thread (topic) of the forum; for forum supergroups only.
   , sendVoiceVoice :: InputFile -- ^ Audio file to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. More info on Sending Files »
   , sendVoiceCaption :: Maybe Text -- ^ Voice message caption, 0-1024 characters after entities parsing
   , sendVoiceParseMode :: Maybe ParseMode  -- ^ Send 'MarkdownV2', 'HTML' or 'Markdown' (legacy), if you want Telegram apps to show bold, italic, fixed-width text or inline URLs in your bot's message.
@@ -605,7 +625,9 @@
           SomeChatId (ChatId chat_id) -> T.pack $ show chat_id
           SomeChatUsername txt -> txt
       ] <> catMaybes
-      [ sendVoiceCaption <&>
+      [ sendVoiceMessageThreadId <&>
+        \t -> Input "message_thread_id" (T.pack $ show t)
+      , sendVoiceCaption <&>
         \t -> Input "caption" t
       , sendVoiceParseMode <&>
         \t -> Input "parse_mode" (TL.toStrict . TL.replace "\"" "" $ encodeToLazyText t)
@@ -614,7 +636,7 @@
       , sendVoiceDuration <&>
         \t -> Input "duration" (TL.toStrict $ encodeToLazyText t)
       , sendVoiceProtectContent <&>
-        \t -> Input "protected_content" (bool "false" "true" t)
+        \t -> Input "protect_content" (bool "false" "true" t)
       , sendVoiceDisableNotification <&>
         \t -> Input "disable_notification" (bool "false" "true" t)
       , sendVoiceReplyToMessageId <&>
@@ -653,7 +675,8 @@
 
 -- | Request parameters for 'sendVideoNote'.
 data SendVideoNoteRequest = SendVideoNoteRequest
-  { sendVideoNoteChatId :: SomeChatId -- ^ Unique identifier for the target chat or username of the target channel (in the format @channelusername)
+  { sendVideoNoteChatId :: SomeChatId -- ^ Unique identifier for the target chat or username of the target channel (in the format @channelusername).
+  , sendVideoNoteMessageThreadId :: Maybe MessageThreadId -- ^ Unique identifier for the target message thread (topic) of the forum; for forum supergroups only.
   , sendVideoNoteVideoNote :: InputFile -- ^ Video note to send. Pass a file_id as String to send a video note that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. More info on Sending Files ». Sending video notes by a URL is currently unsupported
   , sendVideoNoteDuration :: Maybe Int -- ^ Duration of sent video in seconds
   , sendVideoNoteLength :: Maybe Int -- ^ Video width and height, i.e. diameter of the video message
@@ -678,10 +701,12 @@
           SomeChatId (ChatId chat_id) -> T.pack $ show chat_id
           SomeChatUsername txt -> txt
       ] <> catMaybes
-      [ sendVideoNoteDisableNotification <&>
+      [ sendVideoNoteMessageThreadId <&>
+        \t -> Input "message_thread_id" (T.pack $ show t)
+      , sendVideoNoteDisableNotification <&>
         \t -> Input "disable_notification" (bool "false" "true" t)
       , sendVideoNoteProtectContent <&>
-        \t -> Input "protected_content" (bool "false" "true" t)
+        \t -> Input "protect_content" (bool "false" "true" t)
       , sendVideoNoteReplyToMessageId <&>
         \t -> Input "reply_to_message_id" (TL.toStrict $ encodeToLazyText t)
       , sendVideoNoteAllowSendingWithoutReply <&>
@@ -716,7 +741,8 @@
 
 -- | Request parameters for 'sendMediaGroup'.
 data SendMediaGroupRequest = SendMediaGroupRequest
-  { sendMediaGroupChatId :: SomeChatId -- ^ Unique identifier for the target chat or username of the target channel (in the format @channelusername)
+  { sendMediaGroupChatId :: SomeChatId -- ^ Unique identifier for the target chat or username of the target channel (in the format @channelusername).
+  , sendMediaGroupMessageThreadId :: Maybe MessageThreadId -- ^ Unique identifier for the target message thread (topic) of the forum; for forum supergroups only.
   , sendMediaGroupMedia :: [InputMedia] -- ^ A JSON-serialized array describing messages to be sent, must include 2-10 items. InputMediaAudio, InputMediaDocument, InputMediaPhoto or InputMediaVideo.
   , sendMediaGroupDisableNotification :: Maybe Bool -- ^ Sends the message silently. Users will receive a notification with no sound.
   , sendMediaGroupProtectContent :: Maybe Bool -- ^ Protects the contents of the sent message from forwarding and saving
@@ -742,7 +768,8 @@
 
 -- | Request parameters for 'sendLocation'.
 data SendLocationRequest = SendLocationRequest
-  { sendLocationChatId :: SomeChatId -- ^ Unique identifier for the target chat or username of the target channel (in the format @channelusername)
+  { sendLocationChatId :: SomeChatId -- ^ Unique identifier for the target chat or username of the target channel (in the format @channelusername).
+  , sendLocationMessageThreadId :: Maybe MessageThreadId -- ^ Unique identifier for the target message thread (topic) of the forum; for forum supergroups only.
   , sendLocationLatitude :: Float -- ^ Latitude of new location
   , sendLocationLongitude :: Float -- ^ Longitude of new location
   , sendLocationHorizontalAccuracy :: Maybe Float -- ^ The radius of uncertainty for the location, measured in meters; 0-1500
@@ -782,7 +809,8 @@
 
 -- | Request parameters for 'sendVenue'.
 data SendVenueRequest = SendVenueRequest
-  { sendVenueChatId :: SomeChatId -- ^ Unique identifier for the target chat or username of the target channel (in the format @channelusername)
+  { sendVenueChatId :: SomeChatId -- ^ Unique identifier for the target chat or username of the target channel (in the format @channelusername).
+  , sendVenueMessageThreadId :: Maybe MessageThreadId -- ^ Unique identifier for the target message thread (topic) of the forum; for forum supergroups only.
   , sendVenueLatitude :: Float -- ^ Latitude of the venue
   , sendVenueLongitude :: Float -- ^ Longitude of the venue
   , sendVenueTitle :: Text -- ^ Name of the venue
@@ -801,7 +829,8 @@
 
 -- | Request parameters for 'sendContact'.
 data SendContactRequest = SendContactRequest
-  { sendContactChatId :: SomeChatId -- ^ Unique identifier for the target chat or username of the target channel (in the format @channelusername)
+  { sendContactChatId :: SomeChatId -- ^ Unique identifier for the target chat or username of the target channel (in the format @channelusername).
+  , sendContactMessageThreadId :: Maybe MessageThreadId -- ^ Unique identifier for the target message thread (topic) of the forum; for forum supergroups only.
   , sendContactPhoneNumber :: Text -- ^ Contact's phone number
   , sendContactFirstName  :: Text -- ^ Contact's first name
   , sendContactLastName  :: Text -- ^ Contact's last name
@@ -816,7 +845,8 @@
 
 -- | Request parameters for 'sendPoll'.
 data SendPollRequest = SendPollRequest
-  { sendPollChatId :: SomeChatId -- ^ Unique identifier for the target chat or username of the target channel (in the format @channelusername)
+  { sendPollChatId :: SomeChatId -- ^ Unique identifier for the target chat or username of the target channel (in the format @channelusername).
+  , sendPollMessageThreadId :: Maybe MessageThreadId -- ^ Unique identifier for the target message thread (topic) of the forum; for forum supergroups only.
   , sendPollQuestion :: Text -- ^ Poll question, 1-300 characters
   , sendPollOptions :: [Text] -- ^ A JSON-serialized list of answer options, 2-10 strings 1-100 characters each
   , sendPollIsAnonymous :: Maybe Bool -- ^ True, if the poll needs to be anonymous, defaults to True
@@ -839,7 +869,8 @@
 
 -- | Request parameters for 'sendDice'.
 data SendDiceRequest = SendDiceRequest
-  { sendDiceChatId :: SomeChatId -- ^ Unique identifier for the target chat or username of the target channel (in the format @channelusername)
+  { sendDiceChatId :: SomeChatId -- ^ Unique identifier for the target chat or username of the target channel (in the format @channelusername).
+  , sendDiceMessageThreadId :: Maybe MessageThreadId -- ^ Unique identifier for the target message thread (topic) of the forum; for forum supergroups only.
   , sendDiceEmoji :: Maybe Text -- ^ Emoji on which the dice throw animation is based. Currently, must be one of “🎲”, “🎯”, “🏀”, “⚽”, “🎳”, or “🎰”. Dice can have values 1-6 for “🎲”, “🎯” and “🎳”, values 1-5 for “🏀” and “⚽”, and values 1-64 for “🎰”. Defaults to “🎲”
   , sendDiceDisableNotification :: Maybe Bool -- ^ Sends the message silently. Users will receive a notification with no sound.
   , sendDiceProtectContent :: Maybe Bool -- ^ Protects the contents of the sent message from forwarding
@@ -912,19 +943,20 @@
 
 -- | Request parameters for 'promoteChatMember'.
 data PromoteChatMemberRequest = PromoteChatMemberRequest
-  { promoteChatMemberChatId :: SomeChatId -- ^ Unique identifier for the target chat or username of the target channel (in the format @channelusername)
-  , promoteChatMemberUserId :: UserId -- ^ Unique identifier of the target user
-  , promoteChatMemberIsAnonymous :: Maybe Bool -- ^ Pass True, if the administrator's presence in the chat is hidden
-  , promoteChatMemberCanManageChat :: Maybe Bool -- ^ Pass True, if the administrator can access the chat event log, chat statistics, message statistics in channels, see channel members, see anonymous administrators in supergroups and ignore slow mode. Implied by any other administrator privilege
-  , promoteChatMemberCanPostMessages :: Maybe Bool -- ^ Pass True, if the administrator can create channel posts, channels only
-  , promoteChatMemberCanEditMessages :: Maybe Bool -- ^ Pass True, if the administrator can edit messages of other users and can pin messages, channels only
-  , promoteChatMemberCanDeleteMessages :: Maybe Bool -- ^ Pass True, if the administrator can delete messages of other users
-  , promoteChatMemberCanManageVideoChats :: Maybe Bool -- ^ Pass True, if the administrator can manage video chats
-  , promoteChatMemberCanRestrictMembers :: Maybe Bool -- ^ Pass True, if the administrator can restrict, ban or unban chat members
-  , promoteChatMemberCanPromoteMembers :: Maybe Bool -- ^ Pass True, if the administrator can add new administrators with a subset of their own privileges or demote administrators that he has promoted, directly or indirectly (promoted by administrators that were appointed by him)
-  , promoteChatMemberCanChangeInfo :: Maybe Bool -- ^ Pass True, if the administrator can change chat title, photo and other settings
-  , promoteChatMemberCanInviteUsers :: Maybe Bool -- ^ Pass True, if the administrator can invite new users to the chat
-  , promoteChatMemberCanPinMessages :: Maybe Bool -- ^ Pass True, if the administrator can pin messages, supergroups only
+  { promoteChatMemberChatId :: SomeChatId -- ^ Unique identifier for the target chat or username of the target channel (in the format @channelusername).
+  , promoteChatMemberUserId :: UserId -- ^ Unique identifier of the target user.
+  , promoteChatMemberIsAnonymous :: Maybe Bool -- ^ Pass 'True', if the administrator's presence in the chat is hidden.
+  , promoteChatMemberCanManageChat :: Maybe Bool -- ^ Pass 'True', if the administrator can access the chat event log, chat statistics, message statistics in channels, see channel members, see anonymous administrators in supergroups and ignore slow mode. Implied by any other administrator privilege.
+  , promoteChatMemberCanPostMessages :: Maybe Bool -- ^ Pass 'True', if the administrator can create channel posts, channels only.
+  , promoteChatMemberCanEditMessages :: Maybe Bool -- ^ Pass 'True', if the administrator can edit messages of other users and can pin messages, channels only.
+  , promoteChatMemberCanDeleteMessages :: Maybe Bool -- ^ Pass 'True', if the administrator can delete messages of other users.
+  , promoteChatMemberCanManageVideoChats :: Maybe Bool -- ^ Pass 'True', if the administrator can manage video chats.
+  , promoteChatMemberCanRestrictMembers :: Maybe Bool -- ^ Pass 'True', if the administrator can restrict, ban or unban chat members.
+  , promoteChatMemberCanPromoteMembers :: Maybe Bool -- ^ Pass 'True', if the administrator can add new administrators with a subset of their own privileges or demote administrators that he has promoted, directly or indirectly (promoted by administrators that were appointed by him).
+  , promoteChatMemberCanChangeInfo :: Maybe Bool -- ^ Pass 'True', if the administrator can change chat title, photo and other settings.
+  , promoteChatMemberCanInviteUsers :: Maybe Bool -- ^ Pass 'True', if the administrator can invite new users to the chat.
+  , promoteChatMemberCanPinMessages :: Maybe Bool -- ^ Pass 'True', if the administrator can pin messages, supergroups only.
+  , promoteChatMemberCanManageTopics :: Maybe Bool -- ^ Pass 'True', if the user is allowed to create, rename, close, and reopen forum topics, supergroups only.
   }
   deriving Generic
 
diff --git a/src/Telegram/Bot/API/Payments.hs b/src/Telegram/Bot/API/Payments.hs
--- a/src/Telegram/Bot/API/Payments.hs
+++ b/src/Telegram/Bot/API/Payments.hs
@@ -21,6 +21,7 @@
 
 data SendInvoiceRequest = SendInvoiceRequest
   { sendInvoiceRequestChatId                    :: ChatId                     -- ^ Unique identifier for the target chat or username of the target channel (in the format @channelusername).
+  , sendInvoiceRequestMessageThreadId           :: Maybe MessageThreadId      -- ^ Unique identifier for the target message thread (topic) of the forum; for forum supergroups only.
   , sendInvoiceRequestTitle                     :: Text                       -- ^ Product name, 1-32 characters.
   , sendInvoiceRequestDescription               :: Text                       -- ^ Product description, 1-255 characters.
   , sendInvoiceRequestPayload                   :: Text                       -- ^ Bot-defined invoice payload, 1-128 bytes. This will not be displayed to the user, use for your internal processes.
diff --git a/src/Telegram/Bot/API/Stickers.hs b/src/Telegram/Bot/API/Stickers.hs
--- a/src/Telegram/Bot/API/Stickers.hs
+++ b/src/Telegram/Bot/API/Stickers.hs
@@ -53,7 +53,8 @@
 
 -- | Request parameters for 'sendSticker'.
 data SendStickerRequest = SendStickerRequest
-  { sendStickerChatId                   :: SomeChatId -- ^ Unique identifier for the target chat or username of the target channel (in the format @channelusername)
+  { sendStickerChatId                   :: SomeChatId -- ^ Unique identifier for the target chat or username of the target channel (in the format @channelusername).
+  , sendStickerMessageThreadId          :: Maybe MessageThreadId -- ^ Unique identifier for the target message thread (topic) of the forum; for forum supergroups only.
   , sendStickerSticker                  :: InputFile -- ^ Sticker to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a .WEBP file from the Internet, or upload a new one using multipart/form-data. 
   , sendStickerDisableNotification      :: Maybe Bool -- ^ Sends the message silently. Users will receive a notification with no sound.
   , sendStickerProtectContent           :: Maybe Bool -- ^ Protects the contents of the sent message from forwarding and saving.
@@ -73,8 +74,12 @@
           SomeChatId (ChatId chat_id) -> T.pack $ show chat_id
           SomeChatUsername txt -> txt
       ] <> catMaybes
-      [ sendStickerDisableNotification <&>
+      [ sendStickerMessageThreadId <&>
+        \t -> Input "message_thread_id" (T.pack $ show t)
+      , sendStickerDisableNotification <&>
         \t -> Input "disable_notification" (bool "false" "true" t)
+      , sendStickerProtectContent <&>
+        \t -> Input "protect_content" (bool "false" "true" t)
       , sendStickerReplyToMessageId <&>
         \t -> Input "reply_to_message_id" (TL.toStrict $ encodeToLazyText t)
       , sendStickerAllowSendingWithoutReply <&>
diff --git a/src/Telegram/Bot/API/Types.hs b/src/Telegram/Bot/API/Types.hs
--- a/src/Telegram/Bot/API/Types.hs
+++ b/src/Telegram/Bot/API/Types.hs
@@ -79,7 +79,10 @@
   , chatUsername         :: Maybe Text      -- ^ Username, for private chats, supergroups and channels if available
   , chatFirstName        :: Maybe Text      -- ^ First name of the other party in a private chat
   , chatLastName         :: Maybe Text      -- ^ Last name of the other party in a private chat
+  , chatIsForum          :: Maybe Bool      -- ^ 'True', if the supergroup chat is a forum (has topics enabled).
   , chatPhoto            :: Maybe ChatPhoto -- ^ Chat photo. Returned only in getChat.
+  , chatActiveUsernames  :: Maybe Text      -- ^ If non-empty, the list of all active chat usernames; for private chats, supergroups and channels. Returned only in 'getChat'.
+  , chatEmojiStatusCustomEmojiId :: Maybe Text -- ^ Custom emoji identifier of emoji status of the other party in a private chat. Returned only in 'getChat'.
   , chatBio              :: Maybe Text      -- ^ Bio of the other party in a private chat. Returned only in `getChat`.
   , chatHasPrivateForwards :: Maybe Bool    -- ^ 'True', if privacy settings of the other party in the private chat allows to use `tg://user?id=<user_id>` links only in chats with the user. Returned only in getChat.
   , chatHasRestrictedVoiceAndVideoMessages :: Maybe Bool -- ^ 'True', if the privacy settings of the other party restrict sending voice and video note messages in the private chat. Returned only in 'getChat'.
@@ -124,6 +127,7 @@
 -- | This object represents a message.
 data Message = Message
   { messageMessageId             :: MessageId -- ^ Unique message identifier inside this chat.
+  , messageMessageThreadId       :: Maybe MessageThreadId -- ^ Unique identifier of a message thread to which the message belongs; for supergroups only.
   , messageFrom                  :: Maybe User -- ^ Sender, empty for messages sent to channels.
   , messageSenderChat            :: Maybe Chat -- ^ Sender of the message, sent on behalf of a chat. For example, the channel itself for channel posts, the supergroup itself for messages from anonymous group administrators, the linked channel for messages automatically forwarded to the discussion group. For backward compatibility, the field from contains a fake sender user in non-channel chats, if the message was sent on behalf of a chat.
   , messageDate                  :: POSIXTime -- ^ Date the message was sent in Unix time.
@@ -134,6 +138,7 @@
   , messageForwardSignature      :: Maybe Text -- ^ For messages forwarded from channels, signature of the post author if present.
   , messageForwardSenderName     :: Maybe Text -- ^ Sender's name for messages forwarded from users who disallow adding a link to their account in forwarded messages.
   , messageForwardDate           :: Maybe POSIXTime -- ^ For forwarded messages, date the original message was sent in Unix time
+  , messageIsTopicMessage        :: Maybe Bool -- ^ 'True', if the message is sent to a forum topic.
   , messageIsAutomaticForward    :: Maybe Bool -- ^ 'True', if the message is a channel post that was automatically forwarded to the connected discussion group.
   , messageReplyToMessage        :: Maybe Message -- ^ For replies, the original message. Note that the Message object in this field will not contain further reply_to_message fields even if it itself is a reply.
   , messageViaBot                :: Maybe User -- ^ Bot through which the message was sent.
@@ -176,6 +181,9 @@
   , messageConnectedWebsite      :: Maybe Text -- ^ The domain name of the website on which the user has logged in.
   , messagePassportData          :: Maybe PassportData -- ^ Telegram Passport data.
   , messageProximityAlertTriggered :: Maybe ProximityAlertTriggered -- ^ Service message. A user in the chat triggered another user's proximity alert while sharing Live Location.
+  , messageForumTopicCreated     :: Maybe ForumTopicCreated -- ^ Service message: forum topic created.
+  , messageForumTopicClosed     :: Maybe ForumTopicClosed -- ^ Service message: forum topic closed.
+  , messageForumTopicReopened     :: Maybe ForumTopicReopened -- ^ Service message: forum topic reopened.
   , messageVideoChatScheduled    :: Maybe VideoChatScheduled -- ^ Service message: video chat scheduled.
   , messageVideoChatStarted      :: Maybe VideoChatStarted -- ^ Service message: video chat started
   , messageVideoChatEnded        :: Maybe VideoChatEnded -- ^ Service message: video chat ended.
@@ -189,6 +197,10 @@
 newtype MessageId = MessageId Integer
   deriving (Eq, Show, ToJSON, FromJSON, Hashable)
 
+-- | Unique identifier of a message thread to which the message belongs; for supergroups only.
+newtype MessageThreadId = MessageThreadId Integer
+  deriving (Eq, Show, ToJSON, FromJSON, Hashable)
+
 instance ToHttpApiData MessageId where
   toUrlPiece a = pack . show @Integer $ coerce a
 
@@ -444,6 +456,27 @@
   }
   deriving (Generic, Show)
 
+-- ** 'ForumTopicCreated'
+
+-- | This object represents a service message about a new forum topic created in the chat.
+data ForumTopicCreated = ForumTopicCreated
+  { forumTopicCreatedName              :: Text       -- ^ Name of the topic.
+  , forumTopicCreatedIconColor         :: Integer    -- ^ Color of the topic icon in RGB format.
+  , forumTopicCreatedIconCustomEmojiId :: Maybe Text -- ^ Unique identifier of the custom emoji shown as the topic icon.
+  }
+  deriving (Generic, Show)
+
+-- ** 'ForumTopicClosed'
+
+-- | This object represents a service message about a forum topic closed in the chat. Currently holds no information.
+newtype ForumTopicClosed = ForumTopicClosed Object
+  deriving (Generic, Show)
+
+-- ** 'ForumTopicReopened'
+
+newtype ForumTopicReopened = ForumTopicReopened Object
+  deriving (Generic, Show)
+
 -- ** 'VideoChatScheduled'
 
 -- | This object represents a service message about a video chat scheduled in the chat.
@@ -726,6 +759,7 @@
   , chatAdministratorRightsCanPostMessages     :: Maybe Bool -- ^ 'True', if the administrator can post in the channel; channels only.
   , chatAdministratorRightsCanEditMessages     :: Maybe Bool -- ^ 'True', if the administrator can edit messages of other users and can pin messages; channels only.
   , chatAdministratorRightsCanPinMessages      :: Maybe Bool -- ^ 'True', if the user is allowed to pin messages; groups and supergroups only
+  , chatAdministratorRightsCanManageTopics     :: Maybe Bool -- ^ 'True', if the user is allowed to create, rename, close, and reopen forum topics; supergroups only.
   }
   deriving (Generic, Show)
 
@@ -744,27 +778,28 @@
   , chatMemberCustomTitle           :: Maybe Text -- ^ Owners and administrators only. Custom title for this user.
 
   -- administrator
-  , chatMemberCanBeEdited           :: Maybe Bool -- ^ Administrators only. True, if the bot is allowed to edit administrator privileges of that user
+  , chatMemberCanBeEdited           :: Maybe Bool -- ^ Administrators only. 'True', if the bot is allowed to edit administrator privileges of that user
   , chatMemberCanManageChat         :: Maybe Bool -- ^ Administrators only. 'True', if the administrator can access the chat event log, chat statistics, message statistics in channels, see channel members, see anonymous administrators in supergroups and ignore slow mode. Implied by any other administrator privilege.
-  , chatMemberCanDeleteMessages     :: Maybe Bool -- ^ Administrators only. True, if the administrator can delete messages of other users.
-  , chatMemberCanManageVideoChats   :: Maybe Bool -- ^ Administrators only. True, if the administrator can manage video (previously, voice) chats.
-  , chatMemberCanRestrictMembers    :: Maybe Bool -- ^ Administrators only. True, if the administrator can restrict, ban or unban chat members.
-  , chatMemberCanPromoteMembers     :: Maybe Bool -- ^ Administrators only. True, if the administrator can add new administrators with a subset of his own privileges or demote administrators that he has promoted, directly or indirectly (promoted by administrators that were appointed by the user).
-  , chatMemberCanChangeInfo         :: Maybe Bool -- ^ Administrators only. True, if the administrator can change the chat title, photo and other settings.
-  , chatMemberCanPostMessages       :: Maybe Bool -- ^ Administrators only. True, if the administrator can post in the channel, channels only.
-  , chatMemberCanEditMessages       :: Maybe Bool -- ^ Administrators only. True, if the administrator can edit messages of other users and can pin messages, channels only.
+  , chatMemberCanDeleteMessages     :: Maybe Bool -- ^ Administrators only. 'True', if the administrator can delete messages of other users.
+  , chatMemberCanManageVideoChats   :: Maybe Bool -- ^ Administrators only. 'True', if the administrator can manage video (previously, voice) chats.
+  , chatMemberCanRestrictMembers    :: Maybe Bool -- ^ Administrators only. 'True', if the administrator can restrict, ban or unban chat members.
+  , chatMemberCanPromoteMembers     :: Maybe Bool -- ^ Administrators only. 'True', if the administrator can add new administrators with a subset of his own privileges or demote administrators that he has promoted, directly or indirectly (promoted by administrators that were appointed by the user).
+  , chatMemberCanChangeInfo         :: Maybe Bool -- ^ Administrators only. 'True', if the administrator can change the chat title, photo and other settings.
+  , chatMemberCanPostMessages       :: Maybe Bool -- ^ Administrators only. 'True', if the administrator can post in the channel, channels only.
+  , chatMemberCanEditMessages       :: Maybe Bool -- ^ Administrators only. 'True', if the administrator can edit messages of other users and can pin messages, channels only.
 
   -- administrator, restricted
-  , chatMemberCanInviteUsers        :: Maybe Bool -- ^ Administrators and restricted only. True, if the administrator can invite new users to the chat.
-  , chatMemberCanPinMessages        :: Maybe Bool -- ^ Administrators and restricted only. True, if the administrator can pin messages, supergroups only.
+  , chatMemberCanInviteUsers        :: Maybe Bool -- ^ Administrators and restricted only. 'True', if the administrator can invite new users to the chat.
+  , chatMemberCanPinMessages        :: Maybe Bool -- ^ Administrators and restricted only. 'True', if the administrator can pin messages, supergroups only.
+  , chatMemberCanManageTopics       :: Maybe Bool -- ^ Administrators and restricted only. 'True', if the user is allowed to create, rename, close, and reopen forum topics; supergroups only.
 
   -- restricted
-  , chatMemberIsMember              :: Maybe Bool -- ^ Restricted only. True, if the user is a member of the chat at the moment of the request.
-  , chatMemberCanSendMessages       :: Maybe Bool -- ^ Restricted only. True, if the user can send text messages, contacts, locations and venues.
-  , chatMemberCanSendMediaMessages  :: Maybe Bool -- ^ Restricted only. True, if the user can send audios, documents, photos, videos, video notes and voice notes, implies can_send_messages.
-  , chatMemberCanSendPolls          :: Maybe Bool -- ^ Restricted only. True, if the user is allowed to send polls.
-  , chatMemberCanSendOtherMessages  :: Maybe Bool -- ^ Restricted only. True, if the user can send animations, games, stickers and use inline bots, implies can_send_media_messages.
-  , chatMemberCanAddWebPagePreviews :: Maybe Bool -- ^ Restricted only. True, if user may add web page previews to his messages, implies can_send_media_messages.
+  , chatMemberIsMember              :: Maybe Bool -- ^ Restricted only. 'True', if the user is a member of the chat at the moment of the request.
+  , chatMemberCanSendMessages       :: Maybe Bool -- ^ Restricted only. 'True', if the user can send text messages, contacts, locations and venues.
+  , chatMemberCanSendMediaMessages  :: Maybe Bool -- ^ Restricted only. 'True', if the user can send audios, documents, photos, videos, video notes and voice notes, implies can_send_messages.
+  , chatMemberCanSendPolls          :: Maybe Bool -- ^ Restricted only. 'True', if the user is allowed to send polls.
+  , chatMemberCanSendOtherMessages  :: Maybe Bool -- ^ Restricted only. 'True', if the user can send animations, games, stickers and use inline bots, implies can_send_media_messages.
+  , chatMemberCanAddWebPagePreviews :: Maybe Bool -- ^ Restricted only. 'True', if user may add web page previews to his messages, implies can_send_media_messages.
   }
   deriving (Generic, Show)
 
@@ -797,14 +832,15 @@
 
 -- | Describes actions that a non-administrator user is allowed to take in a chat.
 data ChatPermissions = ChatPermissions
-  { chatPermissionsCanSendMessages :: Maybe Bool       -- ^ True, if the user is allowed to send text messages, contacts, locations and venues.
-  , chatPermissionsCanSendMediaMessages :: Maybe Bool  -- ^ True, if the user is allowed to send audios, documents, photos, videos, video notes and voice notes, implies can_send_messages.
-  , chatPermissionsCanSendPolls :: Maybe Bool          -- ^ True, if the user is allowed to send polls, implies can_send_messages.
-  , chatPermissionsCanSendOtherMessages :: Maybe Bool  -- ^ True, if the user is allowed to send animations, games, stickers and use inline bots, implies can_send_media_messages.
-  , chatPermissionsCanAddWebPagePreviews :: Maybe Bool -- ^ True, if the user is allowed to add web page previews to their messages, implies can_send_media_messages.
-  , chatPermissionsCanChangeInfo :: Maybe Bool         -- ^ True, if the user is allowed to change the chat title, photo and other settings. Ignored in public supergroups
-  , chatPermissionsCanInviteUsers :: Maybe Bool        -- ^ True, if the user is allowed to invite new users to the chat.
-  , chatPermissionsCanPinMessages :: Maybe Bool        -- ^ True, if the user is allowed to pin messages. Ignored in public supergroups.
+  { chatPermissionsCanSendMessages :: Maybe Bool       -- ^ 'True', if the user is allowed to send text messages, contacts, locations and venues.
+  , chatPermissionsCanSendMediaMessages :: Maybe Bool  -- ^ 'True', if the user is allowed to send audios, documents, photos, videos, video notes and voice notes, implies can_send_messages.
+  , chatPermissionsCanSendPolls :: Maybe Bool          -- ^ 'True', if the user is allowed to send polls, implies can_send_messages.
+  , chatPermissionsCanSendOtherMessages :: Maybe Bool  -- ^ 'True', if the user is allowed to send animations, games, stickers and use inline bots, implies can_send_media_messages.
+  , chatPermissionsCanAddWebPagePreviews :: Maybe Bool -- ^ 'True', if the user is allowed to add web page previews to their messages, implies can_send_media_messages.
+  , chatPermissionsCanChangeInfo :: Maybe Bool         -- ^ 'True', if the user is allowed to change the chat title, photo and other settings. Ignored in public supergroups
+  , chatPermissionsCanInviteUsers :: Maybe Bool        -- ^ 'True', if the user is allowed to invite new users to the chat.
+  , chatPermissionsCanPinMessages :: Maybe Bool        -- ^ 'True', if the user is allowed to pin messages. Ignored in public supergroups.
+  , chatPermissionsCanManageTopics :: Maybe Bool       -- ^ 'True', if the user is allowed to create forum topics. If omitted defaults to the value of can_pin_messages.
   }
   deriving (Generic, Show)
 
@@ -1143,6 +1179,15 @@
   toUrlPiece (SomeChatId chatid) = toUrlPiece chatid
   toUrlPiece (SomeChatUsername name) = name
   
+-- | This object represents a forum topic.
+data ForumTopic = ForumTopic
+  { forumTopicMessageThreadId   :: MessageThreadId -- ^ Unique identifier of the forum topic
+  , forumTopicName              :: Text            -- ^ Name of the topic
+  , forumTopicIconColor         :: Integer         -- ^ Color of the topic icon in RGB format.
+  , forumTopicIconCustomEmojiId :: Maybe Text      -- ^ Unique identifier of the custom emoji shown as the topic icon.
+  }
+  deriving Generic
+
 -- | This object represents a bot command.
 data BotCommand = BotCommand
   { botCommandCommand :: Text -- ^ Text of the command; 1-32 characters. Can contain only lowercase English letters, digits and underscores.
@@ -1269,6 +1314,9 @@
   , ''Poll
   , ''PollOption
   , ''MessageAutoDeleteTimerChanged
+  , ''ForumTopicCreated
+  , ''ForumTopicClosed
+  , ''ForumTopicReopened
   , ''Invoice
   , ''SuccessfulPayment
   , ''OrderInfo
@@ -1288,6 +1336,7 @@
   , ''ChatLocation
   , ''StickerSet
   , ''BotCommand
+  , ''ForumTopic
   , ''ChatInviteLink
   , ''LabeledPrice
   , ''ShippingOption
diff --git a/src/Telegram/Bot/Simple/Reply.hs b/src/Telegram/Bot/Simple/Reply.hs
--- a/src/Telegram/Bot/Simple/Reply.hs
+++ b/src/Telegram/Bot/Simple/Reply.hs
@@ -37,6 +37,7 @@
 -- This is just like 'SendMessageRequest' but without 'SomeChatId' specified.
 data ReplyMessage = ReplyMessage
   { replyMessageText                  :: Text -- ^ Text of the message to be sent.
+  , replyMessageMessageThreadId       :: Maybe MessageThreadId -- ^ Unique identifier for the target message thread (topic) of the forum; for forum supergroups only.
   , replyMessageParseMode             :: Maybe ParseMode -- ^ Send 'MarkdownV2', 'HTML' or 'Markdown' (legacy), if you want Telegram apps to show bold, italic, fixed-width text or inline URLs in your bot's message.
   , replyMessageEntities              :: Maybe [MessageEntity] -- ^ A JSON-serialized list of special entities that appear in message text, which can be specified instead of /parse_mode/.
   , replyMessageDisableWebPagePreview :: Maybe Bool -- ^ Disables link previews for links in this message.
@@ -53,11 +54,12 @@
 -- | Create a 'ReplyMessage' with just some 'Text' message.
 toReplyMessage :: Text -> ReplyMessage
 toReplyMessage text
-  = ReplyMessage text Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing
+  = ReplyMessage text Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing
 
 replyMessageToSendMessageRequest :: SomeChatId -> ReplyMessage -> SendMessageRequest
 replyMessageToSendMessageRequest someChatId ReplyMessage{..} = SendMessageRequest
   { sendMessageChatId = someChatId
+  , sendMessageMessageThreadId = replyMessageMessageThreadId
   , sendMessageText = replyMessageText
   , sendMessageParseMode = replyMessageParseMode
   , sendMessageEntities = replyMessageEntities
diff --git a/telegram-bot-simple.cabal b/telegram-bot-simple.cabal
--- a/telegram-bot-simple.cabal
+++ b/telegram-bot-simple.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           telegram-bot-simple
-version:        0.6.2
+version:        0.7
 synopsis:       Easy to use library for building Telegram bots.
 description:    Please see the README on Github at <https://github.com/fizruk/telegram-bot-simple#readme>
 category:       Web
@@ -34,6 +34,7 @@
   exposed-modules:
       Telegram.Bot.API
       Telegram.Bot.API.Chat
+      Telegram.Bot.API.Forum
       Telegram.Bot.API.Games
       Telegram.Bot.API.GettingUpdates
       Telegram.Bot.API.InlineMode
