diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -35,3 +35,14 @@
 * Use `UndecidableInstances` and `UndecidableSuperClasses` to use `Object` type family
 * Replace `Access` module with `Accessible` `Property`
 * Replace `Endpoint` module with `Persistable` `Property`
+
+# 0.1.6
+* Split `Message` on `Message` and `Content` datatypes
+* Add `Forward` constructor to `Message` datatype
+* Combine `Chat` and `From` objects into `Origin` datatype
+* Put `Content`, `From` and `Origin` objects into `Message` submodule
+* Put `Button` object into `Keyboard` submodule
+* Put `Notification` object into `Callback` submodule
+* Put `Keyboard` submodule into `Message` submodule
+* Put `Callback`, `Message` and `Moving` modules into `Update` submodule
+* Rename `From` to `Sender` and move it from `Message` and `Update` submodules
diff --git a/Network/Telegram/API/Bot/Object.hs b/Network/Telegram/API/Bot/Object.hs
--- a/Network/Telegram/API/Bot/Object.hs
+++ b/Network/Telegram/API/Bot/Object.hs
@@ -1,26 +1,20 @@
 module Network.Telegram.API.Bot.Object (module Exports, Object) where
 
 import Network.Telegram.API.Bot.Object.Update as Exports
-import Network.Telegram.API.Bot.Object.Notification as Exports
-import Network.Telegram.API.Bot.Object.Moving as Exports
-import Network.Telegram.API.Bot.Object.Message as Exports
+import Network.Telegram.API.Bot.Object.Sender as Exports
 import Network.Telegram.API.Bot.Object.Member as Exports
-import Network.Telegram.API.Bot.Object.Keyboard as Exports
-import Network.Telegram.API.Bot.Object.From as Exports
-import Network.Telegram.API.Bot.Object.Chat as Exports
-import Network.Telegram.API.Bot.Object.Callback as Exports
-import Network.Telegram.API.Bot.Object.Button as Exports
 
 import "base" Data.Kind (Constraint)
 
 type family Object (a :: *) :: Constraint
+type instance Object Sender = ()
 type instance Object Update = ()
 type instance Object Notification = ()
 type instance Object Moving = ()
 type instance Object Message = ()
 type instance Object Member = ()
 type instance Object Keyboard = ()
-type instance Object From = ()
-type instance Object Chat = ()
+type instance Object Content = ()
+type instance Object Origin = ()
 type instance Object Callback = ()
 type instance Object Button = ()
diff --git a/Network/Telegram/API/Bot/Object/Button.hs b/Network/Telegram/API/Bot/Object/Button.hs
deleted file mode 100644
--- a/Network/Telegram/API/Bot/Object/Button.hs
+++ /dev/null
@@ -1,35 +0,0 @@
-module Network.Telegram.API.Bot.Object.Button (Button (..), Pressed (..)) where
-
-import "aeson" Data.Aeson (FromJSON (parseJSON), ToJSON (toJSON)
-	, Object, Value (Object), object, withObject, (.:), (.:?), (.=))
-import "aeson" Data.Aeson.Types (Parser)
-import "base" Control.Applicative (Applicative (pure, (<*>)), Alternative ((<|>)))
-import "base" Control.Monad (Monad ((>>=)), fail)
-import "base" Data.Function ((.), ($))
-import "base" Data.Functor (Functor (fmap), (<$>))
-import "base" Data.Maybe (Maybe, maybe)
-import "base" Text.Show (Show)
-import "text" Data.Text (Text)
-
-data Button = Button Text Pressed deriving Show
-
-instance FromJSON Button where
-	parseJSON = withObject "Button" $ \v ->
-		Button <$> v .: "text" <*> parseJSON (Object v)
-
-instance ToJSON Button where
-	toJSON (Button text (Open url)) = object
-		["text" .= text, "url" .= url]
-	toJSON (Button text (Callback cbd)) = object
-		["text" .= text, "callback_data" .= cbd]
-
-data Pressed = Open Text | Callback Text deriving Show
-
-instance FromJSON Pressed where
-	parseJSON = withObject "Pressed" $ \v ->
-		(is_open v <|> is_callback v) >>= maybe
-			(fail "Action on pressing isn't set") pure where
-
-		is_open, is_callback :: Object -> Parser (Maybe Pressed)
-		is_open v = (fmap . fmap) Open $ v .:? "url"
-		is_callback v = (fmap . fmap) Callback $ v .:? "callback_data"
diff --git a/Network/Telegram/API/Bot/Object/Callback.hs b/Network/Telegram/API/Bot/Object/Callback.hs
deleted file mode 100644
--- a/Network/Telegram/API/Bot/Object/Callback.hs
+++ /dev/null
@@ -1,16 +0,0 @@
-module Network.Telegram.API.Bot.Object.Callback (Callback (..)) where
-
-import "aeson" Data.Aeson (FromJSON (parseJSON), withObject, (.:))
-import "base" Control.Applicative (Applicative ((<*>)))
-import "base" Data.Function (($))
-import "base" Data.Functor ((<$>))
-import "base" Text.Show (Show)
-import "text" Data.Text (Text)
-
-import Network.Telegram.API.Bot.Object.Message (Message)
-
-data Callback = Datatext Text Message Text deriving Show
-
-instance FromJSON Callback where
-	parseJSON = withObject "Callback" $ \v ->
-		Datatext <$> v .: "id" <*> v .: "message" <*> v .: "data"
diff --git a/Network/Telegram/API/Bot/Object/Chat.hs b/Network/Telegram/API/Bot/Object/Chat.hs
deleted file mode 100644
--- a/Network/Telegram/API/Bot/Object/Chat.hs
+++ /dev/null
@@ -1,25 +0,0 @@
-module Network.Telegram.API.Bot.Object.Chat (Chat (..)) where
-
-import "aeson" Data.Aeson (FromJSON (parseJSON), withObject, (.:))
-import "base" Data.Int (Int64)
-import "base" Control.Applicative (Applicative ((<*>)))
-import "base" Control.Monad (Monad ((>>=)), fail)
-import "base" Data.Function (($))
-import "base" Data.Functor ((<$>))
-import "base" Text.Show (Show)
-import "text" Data.Text (Text)
-
-data Chat
-	= Private Int64
-	| Group Int64 Text
-	| Supergroup Int64 Text
-	| Channel Int64 Text
-	deriving Show
-
-instance FromJSON Chat where
-	parseJSON = withObject "Chat" $ \v -> v .: "type" >>= \case
-		("private" :: Text) -> Private <$> v .: "id"
-		("group" :: Text) -> Group <$> v .: "id" <*> v .: "title"
-		("supergroup" :: Text) -> Supergroup <$> v .: "id" <*> v .: "title"
-		("channel" :: Text) -> Channel <$> v .: "id" <*> v .: "title"
-		_ -> fail "Type of chat is not defined"
diff --git a/Network/Telegram/API/Bot/Object/From.hs b/Network/Telegram/API/Bot/Object/From.hs
deleted file mode 100644
--- a/Network/Telegram/API/Bot/Object/From.hs
+++ /dev/null
@@ -1,51 +0,0 @@
-module Network.Telegram.API.Bot.Object.From
-	(From (..), nickname, firstname, lastname) where
-
-import "aeson" Data.Aeson (FromJSON (parseJSON), Object, withObject, (.:), (.:?))
-import "aeson" Data.Aeson.Types (Parser)
-import "base" Control.Applicative (Applicative ((<*>)))
-import "base" Control.Monad (Monad ((>>=)))
-import "base" Data.Bool (Bool (False), bool)
-import "base" Data.Eq (Eq ((==)))
-import "base" Data.Int (Int)
-import "base" Data.Function (($))
-import "base" Data.Functor ((<$>))
-import "base" Data.Maybe (Maybe)
-import "base" Text.Show (Show)
-import "lens" Control.Lens (Lens')
-import "text" Data.Text (Text)
-
-data From
-	= Bot Int (Maybe Text) Text (Maybe Text) (Maybe Text)
-	| User Int (Maybe Text) Text (Maybe Text) (Maybe Text)
-	deriving Show
-
-instance Eq From where
-	Bot i _ _ _ _ == Bot i' _ _ _ _ = i == i'
-	User i _ _ _ _ == User i' _ _ _ _ = i == i'
-	_ == _ = False
-
-type Whom = Int -> Maybe Text -> Text -> Maybe Text -> Maybe Text -> From
-
-instance FromJSON From where
-	parseJSON = withObject "From" $ \v -> v .: "is_bot"
-		>>= bool (from v User) (from v Bot) where
-
-		from :: Object -> Whom -> Parser From
-		from v f = f <$> v .: "id"
-			<*> v .:? "username"
-			<*> v .: "first_name"
-			<*> v .:? "last_name"
-			<*> v .:? "language_code"
-
-nickname :: Lens' From (Maybe Text)
-nickname f (Bot uid nn fn ln lng) = (\nn' -> Bot uid nn' fn ln lng) <$> f nn
-nickname f (User uid nn fn ln lng) = (\nn' -> User uid nn' fn ln lng) <$> f nn
-
-firstname :: Lens' From Text
-firstname f (Bot uid nn fn ln lng) = (\fn' -> Bot uid nn fn' ln lng) <$> f fn
-firstname f (User uid nn fn ln lng) = (\fn' -> User uid nn fn' ln lng) <$> f fn
-
-lastname :: Lens' From (Maybe Text)
-lastname f (Bot uid nn fn ln lng) = (\ln' -> Bot uid nn fn ln' lng) <$> f ln
-lastname f (User uid nn fn ln lng) = (\ln' -> User uid nn fn ln' lng) <$> f ln
diff --git a/Network/Telegram/API/Bot/Object/Keyboard.hs b/Network/Telegram/API/Bot/Object/Keyboard.hs
deleted file mode 100644
--- a/Network/Telegram/API/Bot/Object/Keyboard.hs
+++ /dev/null
@@ -1,18 +0,0 @@
-module Network.Telegram.API.Bot.Object.Keyboard (Keyboard (..)) where
-
-import "aeson" Data.Aeson (FromJSON (parseJSON), ToJSON (toJSON), object, withObject, (.:), (.=))
-import "base" Data.Function (($))
-import "base" Data.Functor ((<$>))
-import "base" Text.Show (Show)
-
-import Network.Telegram.API.Bot.Object.Button (Button)
-
-data Keyboard = Inline [[Button]] deriving Show
-
-instance FromJSON Keyboard where
-	parseJSON = withObject "Inline" $ \v ->
-		Inline <$> v .: "inline_keyboard"
-
-instance ToJSON Keyboard where
-	toJSON (Inline buttons) = object
-		["inline_keyboard" .= buttons]
diff --git a/Network/Telegram/API/Bot/Object/Member.hs b/Network/Telegram/API/Bot/Object/Member.hs
--- a/Network/Telegram/API/Bot/Object/Member.hs
+++ b/Network/Telegram/API/Bot/Object/Member.hs
@@ -9,15 +9,15 @@
 import "text" Data.Text (Text)
 import "time" Data.Time.Clock.POSIX (POSIXTime)
 
-import Network.Telegram.API.Bot.Object.From (From)
+import Network.Telegram.API.Bot.Object.Sender (Sender)
 
 data Member
-	= Creator From
-	| Administrator From
-	| Member From
-	| Restricted From POSIXTime
-	| Left From
-	| Kicked From POSIXTime
+	= Creator Sender
+	| Administrator Sender
+	| Member Sender
+	| Restricted Sender POSIXTime
+	| Left Sender
+	| Kicked Sender POSIXTime
 	deriving Show
 
 instance FromJSON Member where
diff --git a/Network/Telegram/API/Bot/Object/Message.hs b/Network/Telegram/API/Bot/Object/Message.hs
deleted file mode 100644
--- a/Network/Telegram/API/Bot/Object/Message.hs
+++ /dev/null
@@ -1,44 +0,0 @@
-module Network.Telegram.API.Bot.Object.Message (Message (..)) where
-
-import "aeson" Data.Aeson (FromJSON (parseJSON), withArray, withObject, (.:))
-import "aeson" Data.Aeson.Types (Object, Parser, Value)
-import "base" Control.Applicative (Applicative ((<*>)), Alternative (empty, (<|>)))
-import "base" Control.Monad (Monad ((>>=)), fail)
-import "base" Data.Function ((.), ($))
-import "base" Data.Functor ((<$>))
-import "base" Data.Foldable (Foldable (foldr))
-import "base" Data.Int (Int)
-import "base" Text.Show (Show)
-import "base" Prelude ((+))
-import "text" Data.Text (Text, drop, take)
-
-import Network.Telegram.API.Bot.Object.Chat (Chat)
-import Network.Telegram.API.Bot.Object.From (From)
-
-data Message
-	= Textual Int Chat From Text
-	| Command Int Chat From Text
-	deriving Show
-
-instance FromJSON Message where
-	parseJSON = withObject "Message" $ \v -> command v <|> textual v where
-
-		command :: Object -> Parser Message
-		command v = Command <$> v .: "message_id" <*> v .: "chat" <*> v .: "from"
-			<*> (v .: "entities" >>= command_entity >>= extract_command v)
-
-		textual :: Object -> Parser Message
-		textual v = Textual <$> v .: "message_id"
-			<*> v .: "chat" <*> v .: "from" <*> v .: "text"
-
-		command_entity :: Value -> Parser (Int, Int)
-		command_entity = withArray "Command entity" $ \a ->
-			foldr ((<|>) . entity) empty a where
-
-			entity :: Value -> Parser (Int, Int)
-			entity = withObject "Command entity" $ \v -> v .: "type" >>= \case
-				("bot_command" :: Text) -> (,) <$> v .: "offset" <*> v .: "length"
-				_ -> fail "It's not a bot command"
-
-		extract_command :: Object -> (Int, Int) -> Parser Text
-		extract_command v (ofs, len) = (take len . drop (ofs + 1)) <$> v .: "text"
diff --git a/Network/Telegram/API/Bot/Object/Moving.hs b/Network/Telegram/API/Bot/Object/Moving.hs
deleted file mode 100644
--- a/Network/Telegram/API/Bot/Object/Moving.hs
+++ /dev/null
@@ -1,22 +0,0 @@
-module Network.Telegram.API.Bot.Object.Moving (Moving (..)) where
-
-import "aeson" Data.Aeson (FromJSON (parseJSON), withObject, (.:))
-import "aeson" Data.Aeson.Types (Object, Parser)
-import "base" Control.Applicative (Applicative ((<*>)), Alternative ((<|>)))
-import "base" Data.Function (($))
-import "base" Data.Functor ((<$>))
-import "base" Text.Show (Show)
-
-import Network.Telegram.API.Bot.Object.Chat (Chat)
-import Network.Telegram.API.Bot.Object.From (From)
-
-data Moving = Gone Chat From | Joined Chat [From] deriving Show
-
-instance FromJSON Moving where
-	parseJSON = withObject "Moving" $ \v -> gone v <|> joined v where
-
-		gone :: Object -> Parser Moving
-		gone v = Gone <$> v .: "chat" <*> v .: "left_chat_member"
-
-		joined :: Object -> Parser Moving
-		joined v = Joined <$> v .: "chat" <*> v .: "new_chat_members"
diff --git a/Network/Telegram/API/Bot/Object/Notification.hs b/Network/Telegram/API/Bot/Object/Notification.hs
deleted file mode 100644
--- a/Network/Telegram/API/Bot/Object/Notification.hs
+++ /dev/null
@@ -1,3 +0,0 @@
-module Network.Telegram.API.Bot.Object.Notification (Notification) where
-
-data Notification
diff --git a/Network/Telegram/API/Bot/Object/Sender.hs b/Network/Telegram/API/Bot/Object/Sender.hs
new file mode 100644
--- /dev/null
+++ b/Network/Telegram/API/Bot/Object/Sender.hs
@@ -0,0 +1,50 @@
+module Network.Telegram.API.Bot.Object.Sender (Sender (..), nickname, firstname, lastname) where
+
+import "aeson" Data.Aeson (FromJSON (parseJSON), Object, withObject, (.:), (.:?))
+import "aeson" Data.Aeson.Types (Parser)
+import "base" Control.Applicative (Applicative ((<*>)))
+import "base" Control.Monad (Monad ((>>=)))
+import "base" Data.Bool (Bool (False), bool)
+import "base" Data.Eq (Eq ((==)))
+import "base" Data.Int (Int)
+import "base" Data.Function (($))
+import "base" Data.Functor ((<$>))
+import "base" Data.Maybe (Maybe)
+import "base" Text.Show (Show)
+import "lens" Control.Lens (Lens')
+import "text" Data.Text (Text)
+
+data Sender
+	= Bot Int (Maybe Text) Text (Maybe Text) (Maybe Text)
+	| User Int (Maybe Text) Text (Maybe Text) (Maybe Text)
+	deriving Show
+
+instance Eq Sender where
+	Bot i _ _ _ _ == Bot i' _ _ _ _ = i == i'
+	User i _ _ _ _ == User i' _ _ _ _ = i == i'
+	_ == _ = False
+
+type Whom = Int -> Maybe Text -> Text -> Maybe Text -> Maybe Text -> Sender
+
+instance FromJSON Sender where
+	parseJSON = withObject "Sender" $ \v -> v .: "is_bot"
+		>>= bool (sender v User) (sender v Bot) where
+
+		sender :: Object -> Whom -> Parser Sender
+		sender v f = f <$> v .: "id"
+			<*> v .:? "username"
+			<*> v .: "first_name"
+			<*> v .:? "last_name"
+			<*> v .:? "language_code"
+
+nickname :: Lens' Sender (Maybe Text)
+nickname f (Bot uid nn fn ln lng) = (\nn' -> Bot uid nn' fn ln lng) <$> f nn
+nickname f (User uid nn fn ln lng) = (\nn' -> User uid nn' fn ln lng) <$> f nn
+
+firstname :: Lens' Sender Text
+firstname f (Bot uid nn fn ln lng) = (\fn' -> Bot uid nn fn' ln lng) <$> f fn
+firstname f (User uid nn fn ln lng) = (\fn' -> User uid nn fn' ln lng) <$> f fn
+
+lastname :: Lens' Sender (Maybe Text)
+lastname f (Bot uid nn fn ln lng) = (\ln' -> Bot uid nn fn ln' lng) <$> f ln
+lastname f (User uid nn fn ln lng) = (\ln' -> User uid nn fn ln' lng) <$> f ln
diff --git a/Network/Telegram/API/Bot/Object/Update.hs b/Network/Telegram/API/Bot/Object/Update.hs
--- a/Network/Telegram/API/Bot/Object/Update.hs
+++ b/Network/Telegram/API/Bot/Object/Update.hs
@@ -1,5 +1,9 @@
-module Network.Telegram.API.Bot.Object.Update (Update (..)) where
+module Network.Telegram.API.Bot.Object.Update (Update (..), module Exports) where
 
+import Network.Telegram.API.Bot.Object.Update.Callback as Exports
+import Network.Telegram.API.Bot.Object.Update.Message as Exports
+import Network.Telegram.API.Bot.Object.Update.Moving as Exports
+
 import "aeson" Data.Aeson (FromJSON (parseJSON), withObject, (.:))
 import "aeson" Data.Aeson.Types (Object, Parser)
 import "base" Control.Applicative (Applicative ((<*>)), Alternative ((<|>)))
@@ -8,9 +12,9 @@
 import "base" Data.Int (Int)
 import "base" Text.Show (Show)
 
-import Network.Telegram.API.Bot.Object.Callback (Callback)
-import Network.Telegram.API.Bot.Object.Moving (Moving)
-import Network.Telegram.API.Bot.Object.Message (Message)
+import Network.Telegram.API.Bot.Object.Update.Callback (Callback)
+import Network.Telegram.API.Bot.Object.Update.Message (Message)
+import Network.Telegram.API.Bot.Object.Update.Moving (Moving)
 
 data Update
 	= Query Int Callback
diff --git a/Network/Telegram/API/Bot/Object/Update/Callback.hs b/Network/Telegram/API/Bot/Object/Update/Callback.hs
new file mode 100644
--- /dev/null
+++ b/Network/Telegram/API/Bot/Object/Update/Callback.hs
@@ -0,0 +1,18 @@
+module Network.Telegram.API.Bot.Object.Update.Callback (Callback (..), module Exports) where
+
+import Network.Telegram.API.Bot.Object.Update.Callback.Notification as Exports
+
+import "aeson" Data.Aeson (FromJSON (parseJSON), withObject, (.:))
+import "base" Control.Applicative (Applicative ((<*>)))
+import "base" Data.Function (($))
+import "base" Data.Functor ((<$>))
+import "base" Text.Show (Show)
+import "text" Data.Text (Text)
+
+import Network.Telegram.API.Bot.Object.Update.Message (Message)
+
+data Callback = Datatext Text Message Text deriving Show
+
+instance FromJSON Callback where
+	parseJSON = withObject "Callback" $ \v ->
+		Datatext <$> v .: "id" <*> v .: "message" <*> v .: "data"
diff --git a/Network/Telegram/API/Bot/Object/Update/Callback/Notification.hs b/Network/Telegram/API/Bot/Object/Update/Callback/Notification.hs
new file mode 100644
--- /dev/null
+++ b/Network/Telegram/API/Bot/Object/Update/Callback/Notification.hs
@@ -0,0 +1,3 @@
+module Network.Telegram.API.Bot.Object.Update.Callback.Notification (Notification) where
+
+data Notification
diff --git a/Network/Telegram/API/Bot/Object/Update/Message.hs b/Network/Telegram/API/Bot/Object/Update/Message.hs
new file mode 100644
--- /dev/null
+++ b/Network/Telegram/API/Bot/Object/Update/Message.hs
@@ -0,0 +1,49 @@
+module Network.Telegram.API.Bot.Object.Update.Message (Message (..), module Exports) where
+
+import Network.Telegram.API.Bot.Object.Update.Message.Content as Exports
+import Network.Telegram.API.Bot.Object.Update.Message.Keyboard as Exports
+import Network.Telegram.API.Bot.Object.Update.Message.Origin as Exports
+
+import "aeson" Data.Aeson (FromJSON (parseJSON), Value (Object), withObject, (.:))
+import "aeson" Data.Aeson.Types (Object, Parser)
+import "base" Control.Applicative (Applicative ((<*>)), Alternative ((<|>)))
+import "base" Control.Monad (Monad ((>>=)), fail)
+import "base" Data.Function (($))
+import "base" Data.Functor ((<$>))
+import "base" Data.Int (Int)
+import "base" Text.Show (Show)
+import "text" Data.Text (Text)
+
+import Network.Telegram.API.Bot.Object.Update.Message.Content (Content)
+import Network.Telegram.API.Bot.Object.Update.Message.Origin (Origin (Private, Group, Supergroup, Channel))
+
+data Message
+	= Direct Int Origin Content
+	| Forward Int Origin Content
+	deriving Show
+
+instance FromJSON Message where
+	parseJSON = withObject "Message" $ \v ->
+		forward_from_channel v <|> forward_from_chat v <|> direct v where
+
+		forward_from_channel :: Object -> Parser Message
+		forward_from_channel v = Forward <$> v .: "forward_from_message_id"
+			<*> (v .: "forward_from_chat" >>= channel) <*> parseJSON (Object v) where
+
+			channel :: Value -> Parser Origin
+			channel = withObject "Channel" $ \c -> Channel <$> c .: "id" <*> c .: "title"
+
+		forward_from_chat :: Object -> Parser Message
+		forward_from_chat v = Forward <$> v .: "message_id"
+			<*> (v .: "chat" >>= chat) <*> parseJSON (Object v) where
+
+			chat :: Value -> Parser Origin
+			chat = withObject "Origin" $ \c -> c .: "type" >>= \case
+				("private" :: Text) -> Private <$> c .: "id" <*> v .: "forward_from"
+				("group" :: Text) -> Group <$> c .: "id" <*> c .: "title" <*> v .: "forward_from"
+				("supergroup" :: Text) -> Supergroup <$> c .: "id" <*> c .: "title" <*> v .: "forward_from"
+				_ -> fail "Type of chat is not defined"
+
+		direct :: Object -> Parser Message
+		direct v = Direct <$> v .: "message_id"
+			<*> parseJSON (Object v) <*> parseJSON (Object v)
diff --git a/Network/Telegram/API/Bot/Object/Update/Message/Content.hs b/Network/Telegram/API/Bot/Object/Update/Message/Content.hs
new file mode 100644
--- /dev/null
+++ b/Network/Telegram/API/Bot/Object/Update/Message/Content.hs
@@ -0,0 +1,39 @@
+module Network.Telegram.API.Bot.Object.Update.Message.Content (Content (..)) where
+
+import "aeson" Data.Aeson (FromJSON (parseJSON), withArray, withObject, (.:))
+import "aeson" Data.Aeson.Types (Object, Parser, Value)
+import "base" Control.Applicative (Applicative ((<*>)), Alternative (empty, (<|>)))
+import "base" Control.Monad (Monad ((>>=)), fail)
+import "base" Data.Function ((.), ($))
+import "base" Data.Functor ((<$>))
+import "base" Data.Foldable (Foldable (foldr))
+import "base" Data.Int (Int)
+import "base" Text.Show (Show)
+import "base" Prelude ((+))
+import "text" Data.Text (Text, drop, take)
+
+data Content
+	= Textual Text
+	| Command Text
+	deriving Show
+
+instance FromJSON Content where
+	parseJSON = withObject "Content" $ \v -> command v <|> textual v where
+
+		command :: Object -> Parser Content
+		command v = Command <$> (v .: "entities" >>= command_entity >>= extract_command v)
+
+		textual :: Object -> Parser Content
+		textual v = Textual <$> v .: "text"
+
+		command_entity :: Value -> Parser (Int, Int)
+		command_entity = withArray "Command content" $ \a ->
+			foldr ((<|>) . entity) empty a where
+
+			entity :: Value -> Parser (Int, Int)
+			entity = withObject "Command entity" $ \v -> v .: "type" >>= \case
+				("bot_command" :: Text) -> (,) <$> v .: "offset" <*> v .: "length"
+				_ -> fail "It's not a bot command"
+
+		extract_command :: Object -> (Int, Int) -> Parser Text
+		extract_command v (ofs, len) = (take len . drop (ofs + 1)) <$> v .: "text"
diff --git a/Network/Telegram/API/Bot/Object/Update/Message/Keyboard.hs b/Network/Telegram/API/Bot/Object/Update/Message/Keyboard.hs
new file mode 100644
--- /dev/null
+++ b/Network/Telegram/API/Bot/Object/Update/Message/Keyboard.hs
@@ -0,0 +1,20 @@
+module Network.Telegram.API.Bot.Object.Update.Message.Keyboard (Keyboard (..), module Exports) where
+
+import Network.Telegram.API.Bot.Object.Update.Message.Keyboard.Button as Exports
+
+import "aeson" Data.Aeson (FromJSON (parseJSON), ToJSON (toJSON), object, withObject, (.:), (.=))
+import "base" Data.Function (($))
+import "base" Data.Functor ((<$>))
+import "base" Text.Show (Show)
+
+import Network.Telegram.API.Bot.Object.Update.Message.Keyboard.Button (Button)
+
+data Keyboard = Inline [[Button]] deriving Show
+
+instance FromJSON Keyboard where
+	parseJSON = withObject "Inline" $ \v ->
+		Inline <$> v .: "inline_keyboard"
+
+instance ToJSON Keyboard where
+	toJSON (Inline buttons) = object
+		["inline_keyboard" .= buttons]
diff --git a/Network/Telegram/API/Bot/Object/Update/Message/Keyboard/Button.hs b/Network/Telegram/API/Bot/Object/Update/Message/Keyboard/Button.hs
new file mode 100644
--- /dev/null
+++ b/Network/Telegram/API/Bot/Object/Update/Message/Keyboard/Button.hs
@@ -0,0 +1,35 @@
+module Network.Telegram.API.Bot.Object.Update.Message.Keyboard.Button (Button (..), Pressed (..)) where
+
+import "aeson" Data.Aeson (FromJSON (parseJSON), ToJSON (toJSON)
+	, Object, Value (Object), object, withObject, (.:), (.:?), (.=))
+import "aeson" Data.Aeson.Types (Parser)
+import "base" Control.Applicative (Applicative (pure, (<*>)), Alternative ((<|>)))
+import "base" Control.Monad (Monad ((>>=)), fail)
+import "base" Data.Function ((.), ($))
+import "base" Data.Functor (Functor (fmap), (<$>))
+import "base" Data.Maybe (Maybe, maybe)
+import "base" Text.Show (Show)
+import "text" Data.Text (Text)
+
+data Button = Button Text Pressed deriving Show
+
+instance FromJSON Button where
+	parseJSON = withObject "Button" $ \v ->
+		Button <$> v .: "text" <*> parseJSON (Object v)
+
+instance ToJSON Button where
+	toJSON (Button text (Open url)) = object
+		["text" .= text, "url" .= url]
+	toJSON (Button text (Callback cbd)) = object
+		["text" .= text, "callback_data" .= cbd]
+
+data Pressed = Open Text | Callback Text deriving Show
+
+instance FromJSON Pressed where
+	parseJSON = withObject "Pressed" $ \v ->
+		(is_open v <|> is_callback v) >>= maybe
+			(fail "Action on pressing isn't set") pure where
+
+		is_open, is_callback :: Object -> Parser (Maybe Pressed)
+		is_open v = (fmap . fmap) Open $ v .:? "url"
+		is_callback v = (fmap . fmap) Callback $ v .:? "callback_data"
diff --git a/Network/Telegram/API/Bot/Object/Update/Message/Origin.hs b/Network/Telegram/API/Bot/Object/Update/Message/Origin.hs
new file mode 100644
--- /dev/null
+++ b/Network/Telegram/API/Bot/Object/Update/Message/Origin.hs
@@ -0,0 +1,31 @@
+module Network.Telegram.API.Bot.Object.Update.Message.Origin (Origin (..)) where
+
+import "aeson" Data.Aeson (FromJSON (parseJSON), withObject, (.:))
+import "aeson" Data.Aeson.Types (Object, Parser, Value)
+import "base" Control.Applicative (Applicative ((<*>)))
+import "base" Control.Monad (Monad ((>>=)), fail)
+import "base" Data.Function (($))
+import "base" Data.Functor ((<$>))
+import "base" Data.Int (Int64)
+import "base" Text.Show (Show)
+import "text" Data.Text (Text)
+
+import Network.Telegram.API.Bot.Object.Sender (Sender)
+
+data Origin
+	= Private Int64 Sender
+	| Group Int64 Text Sender
+	| Supergroup Int64 Text Sender
+	| Channel Int64 Text
+	deriving Show
+
+instance FromJSON Origin where
+	parseJSON = withObject "Message" $ \v -> v .: "chat" >>= chat v where
+
+		chat :: Object -> Value -> Parser Origin
+		chat v = withObject "Origin" $ \c -> c .: "type" >>= \case
+			("private" :: Text) -> Private <$> c .: "id" <*> v .: "from"
+			("group" :: Text) -> Group <$> c .: "id" <*> c .: "title" <*> v .: "from"
+			("supergroup" :: Text) -> Supergroup <$> c .: "id" <*> c .: "title" <*> v .: "from"
+			("channel" :: Text) -> Channel <$> c .: "id" <*> c .: "title"
+			_ -> fail "Type of chat is not defined"
diff --git a/Network/Telegram/API/Bot/Object/Update/Moving.hs b/Network/Telegram/API/Bot/Object/Update/Moving.hs
new file mode 100644
--- /dev/null
+++ b/Network/Telegram/API/Bot/Object/Update/Moving.hs
@@ -0,0 +1,21 @@
+module Network.Telegram.API.Bot.Object.Update.Moving (Moving (..)) where
+
+import "aeson" Data.Aeson (FromJSON (parseJSON), withObject, (.:))
+import "aeson" Data.Aeson.Types (Object, Parser)
+import "base" Control.Applicative (Alternative ((<|>)))
+import "base" Data.Function (($))
+import "base" Data.Functor ((<$>))
+import "base" Text.Show (Show)
+
+import Network.Telegram.API.Bot.Object.Sender (Sender)
+
+data Moving = Gone Sender | Joined [Sender] deriving Show
+
+instance FromJSON Moving where
+	parseJSON = withObject "Moving" $ \v -> gone v <|> joined v where
+
+		gone :: Object -> Parser Moving
+		gone v = Gone <$> v .: "left_chat_member"
+
+		joined :: Object -> Parser Moving
+		joined v = Joined <$> v .: "new_chat_members"
diff --git a/Network/Telegram/API/Bot/Property/Accessible.hs b/Network/Telegram/API/Bot/Property/Accessible.hs
--- a/Network/Telegram/API/Bot/Property/Accessible.hs
+++ b/Network/Telegram/API/Bot/Property/Accessible.hs
@@ -5,37 +5,22 @@
 import "lens" Control.Lens (Lens')
 
 import Network.Telegram.API.Bot.Object (Object)
-import Network.Telegram.API.Bot.Object.Callback (Callback (Datatext))
-import Network.Telegram.API.Bot.Object.Chat (Chat)
-import Network.Telegram.API.Bot.Object.From (From)
-import Network.Telegram.API.Bot.Object.Message (Message (Textual, Command))
-import Network.Telegram.API.Bot.Object.Moving (Moving (Gone, Joined))
-import Network.Telegram.API.Bot.Object.Update (Update (Query, Membership, Incoming))
+import Network.Telegram.API.Bot.Object.Update.Callback (Callback (Datatext))
+import Network.Telegram.API.Bot.Object.Update.Message (Message (Direct, Forward))
+import Network.Telegram.API.Bot.Object.Update.Message.Content (Content)
+import Network.Telegram.API.Bot.Object.Update.Message.Origin (Origin)
 
 class Object source => Accessible target source where
 	access :: Lens' source target
 
-instance Accessible Chat Callback where
-	access f (Datatext cq_id msg dttxt) = flip
-		(Datatext cq_id) dttxt <$> access f msg
-
-instance Accessible Chat Message where
-	access f (Textual msg_id chat from txt) = (\chat' -> Textual msg_id chat' from txt) <$> f chat
-	access f (Command msg_id chat from cmd) = (\chat' -> Command msg_id chat' from cmd) <$> f chat
-
-instance Accessible Chat Moving where
-	access f (Gone chat from) = (\chat' -> Gone chat' from) <$> f chat
-	access f (Joined chat froms) = (\chat' -> Joined chat' froms) <$> f chat
-
-instance Accessible Chat Update where
-	access f (Incoming upd_id msg) = Incoming upd_id <$> access f msg
-	access f (Query upd_id cb) = Query upd_id <$> access f cb
-	access f (Membership upd_id mmb) = Membership upd_id <$> access f mmb
+instance Accessible Content Message where
+	access f (Direct msg_id origin content) = (\content' -> Direct msg_id origin content') <$> f content
+	access f (Forward msg_id origin content) = (\content' -> Forward msg_id origin content') <$> f content
 
-instance Accessible From Callback where
+instance Accessible Origin Callback where
 	access f (Datatext cq_id msg dttxt) = flip
 		(Datatext cq_id) dttxt <$> access f msg
 
-instance Accessible From Message where
-	access f (Textual msg_id chat from txt) = (\from' -> Textual msg_id chat from' txt) <$> f from
-	access f (Command msg_id chat from cmd) = (\from' -> Command msg_id chat from' cmd) <$> f from
+instance Accessible Origin Message where
+	access f (Direct msg_id origin content) = (\origin' -> Direct msg_id origin' content) <$> f origin
+	access f (Forward msg_id origin content) = (\origin' -> Forward msg_id origin' content) <$> f origin
diff --git a/Network/Telegram/API/Bot/Property/Identifiable.hs b/Network/Telegram/API/Bot/Property/Identifiable.hs
--- a/Network/Telegram/API/Bot/Property/Identifiable.hs
+++ b/Network/Telegram/API/Bot/Property/Identifiable.hs
@@ -3,10 +3,10 @@
 import "base" Data.Int (Int, Int64)
 
 import Network.Telegram.API.Bot.Object (Object)
-import Network.Telegram.API.Bot.Object.Chat (Chat (Private, Group, Supergroup, Channel))
-import Network.Telegram.API.Bot.Object.From (From (Bot, User))
-import Network.Telegram.API.Bot.Object.Message (Message (Textual, Command))
 import Network.Telegram.API.Bot.Object.Update (Update (Query, Membership, Incoming))
+import Network.Telegram.API.Bot.Object.Update.Message (Message (Direct, Forward))
+import Network.Telegram.API.Bot.Object.Update.Message.Origin (Origin (Private, Group, Supergroup, Channel))
+import Network.Telegram.API.Bot.Object.Sender (Sender (Bot, User))
 
 type family Identificator o = i
 
@@ -14,24 +14,24 @@
 	{-# MINIMAL identificator #-}
 	identificator :: o -> Identificator o
 
-type instance Identificator Chat = Int64
-type instance Identificator From = Int
 type instance Identificator Message = Int
+type instance Identificator Origin = Int64
+type instance Identificator Sender = Int
 type instance Identificator Update = Int
 
-instance Identifiable Chat where
-	identificator (Private i) = i
-	identificator (Group i _) = i
-	identificator (Supergroup i _) = i
+instance Identifiable Message where
+	identificator (Direct i _ _) = i
+	identificator (Forward i _ _) = i
+
+instance Identifiable Origin where
+	identificator (Private i _) = i
+	identificator (Group i _ _) = i
+	identificator (Supergroup i _ _) = i
 	identificator (Channel i _) = i
 
-instance Identifiable From where
+instance Identifiable Sender where
 	identificator (Bot i _ _ _ _) = i
 	identificator (User i _ _ _ _) = i
-
-instance Identifiable Message where
-	identificator (Textual i _ _ _) = i
-	identificator (Command i _ _ _) = i
 
 instance Identifiable Update where
 	identificator (Query i _) = i
diff --git a/Network/Telegram/API/Bot/Property/Persistable.hs b/Network/Telegram/API/Bot/Property/Persistable.hs
--- a/Network/Telegram/API/Bot/Property/Persistable.hs
+++ b/Network/Telegram/API/Bot/Property/Persistable.hs
@@ -18,10 +18,7 @@
 import "wreq" Network.Wreq.Session (post)
 
 import Network.Telegram.API.Bot.Core (Telegram, Token (Token), Ok, result)
-import Network.Telegram.API.Bot.Object (Object)
-import Network.Telegram.API.Bot.Object.Keyboard (Keyboard)
-import Network.Telegram.API.Bot.Object.Message (Message)
-import Network.Telegram.API.Bot.Object.Notification (Notification)
+import Network.Telegram.API.Bot.Object (Keyboard, Notification, Message, Object)
 
 data Capacity = Post | Edit | Purge
 
diff --git a/telega.cabal b/telega.cabal
--- a/telega.cabal
+++ b/telega.cabal
@@ -1,5 +1,5 @@
 name:                telega
-version:             0.1.5
+version:             0.1.6
 synopsis:            Telegram Bot API binding
 description:         High-level bindings, typed entities, inline mode only
 homepage:            https://github.com/iokasimov/telega
@@ -22,16 +22,17 @@
     Network.Telegram.API.Bot
     Network.Telegram.API.Bot.Core
     Network.Telegram.API.Bot.Object
-    Network.Telegram.API.Bot.Object.Chat
-    Network.Telegram.API.Bot.Object.From
-    Network.Telegram.API.Bot.Object.Button
-    Network.Telegram.API.Bot.Object.Callback
-    Network.Telegram.API.Bot.Object.Keyboard
     Network.Telegram.API.Bot.Object.Member
-    Network.Telegram.API.Bot.Object.Message
-    Network.Telegram.API.Bot.Object.Moving
-    Network.Telegram.API.Bot.Object.Notification
+    Network.Telegram.API.Bot.Object.Sender
     Network.Telegram.API.Bot.Object.Update
+    Network.Telegram.API.Bot.Object.Update.Callback
+    Network.Telegram.API.Bot.Object.Update.Callback.Notification
+    Network.Telegram.API.Bot.Object.Update.Message
+    Network.Telegram.API.Bot.Object.Update.Message.Content
+    Network.Telegram.API.Bot.Object.Update.Message.Keyboard
+    Network.Telegram.API.Bot.Object.Update.Message.Keyboard.Button
+    Network.Telegram.API.Bot.Object.Update.Message.Origin
+    Network.Telegram.API.Bot.Object.Update.Moving
     Network.Telegram.API.Bot.Property
     Network.Telegram.API.Bot.Property.Accessible
     Network.Telegram.API.Bot.Property.Identifiable
