diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -15,6 +15,14 @@
 * Rename `Member` datatype to `Moving`
 * Define `Access Chat Callback` instance
 * Define `Access From Callback` instance
-* Define `Access From Moving` instance
+* Define `Access Chat Moving` instance
 * Define `Access Chat Message` instance
 * Define `Access From Message` instance
+
+# 0.1.4
+* Define `Member` datatype for chat users
+* No implicit `Prelude` anymore (NoImplicitPrelude)
+* Move HTTP request function into `Internal` module
+* Define `Endpoint` typeclass to replace `Capacity`
+* Remove `Capacity` classes and theirs instances
+* Define `Object` type family
diff --git a/Network/Telegram/API/Bot.hs b/Network/Telegram/API/Bot.hs
--- a/Network/Telegram/API/Bot.hs
+++ b/Network/Telegram/API/Bot.hs
@@ -1,7 +1,7 @@
 module Network.Telegram.API.Bot (module Exports) where
 
 import Network.Telegram.API.Bot.Property as Exports
-import Network.Telegram.API.Bot.Capacity as Exports
 import Network.Telegram.API.Bot.Object as Exports
+import Network.Telegram.API.Bot.Endpoint as Exports
 import Network.Telegram.API.Bot.Access as Exports
 import Network.Telegram.API.Bot.Core as Exports
diff --git a/Network/Telegram/API/Bot/Capacity.hs b/Network/Telegram/API/Bot/Capacity.hs
deleted file mode 100644
--- a/Network/Telegram/API/Bot/Capacity.hs
+++ /dev/null
@@ -1,6 +0,0 @@
-module Network.Telegram.API.Bot.Capacity (module Exports) where
-
-import Network.Telegram.API.Bot.Capacity.Purgeable as Exports
-import Network.Telegram.API.Bot.Capacity.Postable as Exports
-import Network.Telegram.API.Bot.Capacity.Editable as Exports
-import Network.Telegram.API.Bot.Capacity.Droppable as Exports
diff --git a/Network/Telegram/API/Bot/Capacity/Droppable.hs b/Network/Telegram/API/Bot/Capacity/Droppable.hs
deleted file mode 100644
--- a/Network/Telegram/API/Bot/Capacity/Droppable.hs
+++ /dev/null
@@ -1,28 +0,0 @@
-module Network.Telegram.API.Bot.Capacity.Droppable (Droppable (..), Drop) where
-
-import "aeson" Data.Aeson (Value, decode)
-import "base" Control.Exception (try)
-import "base" Control.Monad (join, void)
-import "base" Data.Maybe (fromJust)
-import "http-client" Network.HTTP.Client (Response (responseBody))
-import "text" Data.Text (unpack)
-import "transformers" Control.Monad.Trans.Class (lift)
-import "transformers" Control.Monad.Trans.Except (ExceptT (ExceptT))
-import "transformers" Control.Monad.Trans.Reader (ask)
-
-import qualified "wreq" Network.Wreq.Session as Wreq (post)
-
-import Network.Telegram.API.Bot.Core (Telegram, Token (Token), Ok, result)
-
-type family Drop a = r | r -> a
-
-class Droppable a where
-	{-# MINIMAL drop_value, drop_endpoint #-}
-	drop_value :: Drop a -> Value
-	drop_endpoint :: Drop a -> String
-
-	drop :: Drop a -> Telegram e ()
-	drop x = snd <$> ask >>= \(session, Token token) -> void . lift . ExceptT . try
-		. fmap (fromJust . join . fmap result . decode @(Ok ()) . responseBody)
-			. flip (Wreq.post session) (drop_value x) $
-				"https://api.telegram.org/" <> unpack token <> "/" <> drop_endpoint x
diff --git a/Network/Telegram/API/Bot/Capacity/Editable.hs b/Network/Telegram/API/Bot/Capacity/Editable.hs
deleted file mode 100644
--- a/Network/Telegram/API/Bot/Capacity/Editable.hs
+++ /dev/null
@@ -1,28 +0,0 @@
-module Network.Telegram.API.Bot.Capacity.Editable (Editable (..), Substitution) where
-
-import "aeson" Data.Aeson (FromJSON, Value, decode)
-import "base" Control.Exception (try)
-import "base" Control.Monad (join)
-import "base" Data.Maybe (fromJust)
-import "http-client" Network.HTTP.Client (Response (responseBody))
-import "text" Data.Text (unpack)
-import "transformers" Control.Monad.Trans.Class (lift)
-import "transformers" Control.Monad.Trans.Except (ExceptT (ExceptT))
-import "transformers" Control.Monad.Trans.Reader (ask)
-
-import qualified "wreq" Network.Wreq.Session as Wreq (post)
-
-import Network.Telegram.API.Bot.Core (Telegram, Token (Token), Ok, result)
-
-type family Substitution a = r | r -> a
-
-class FromJSON a => Editable a where
-	{-# MINIMAL substitution_value, edit_endpoint #-}
-	substitution_value :: Substitution a -> Value
-	edit_endpoint :: Substitution a -> String
-
-	edit :: Substitution a -> Telegram e a
-	edit x = snd <$> ask >>= \(session, Token token) -> lift . ExceptT . try
-		. fmap (fromJust . join . fmap result . decode @(Ok a) . responseBody)
-			. flip (Wreq.post session) (substitution_value x) $
-				"https://api.telegram.org/" <> unpack token <> "/" <> edit_endpoint x
diff --git a/Network/Telegram/API/Bot/Capacity/Postable.hs b/Network/Telegram/API/Bot/Capacity/Postable.hs
deleted file mode 100644
--- a/Network/Telegram/API/Bot/Capacity/Postable.hs
+++ /dev/null
@@ -1,28 +0,0 @@
-module Network.Telegram.API.Bot.Capacity.Postable (Postable (..), Initial) where
-
-import "aeson" Data.Aeson (FromJSON, Value, decode)
-import "base" Control.Exception (try)
-import "base" Control.Monad (join)
-import "base" Data.Maybe (fromJust)
-import "http-client" Network.HTTP.Client (Response (responseBody))
-import "text" Data.Text (unpack)
-import "transformers" Control.Monad.Trans.Class (lift)
-import "transformers" Control.Monad.Trans.Except (ExceptT (ExceptT))
-import "transformers" Control.Monad.Trans.Reader (ask)
-
-import qualified "wreq" Network.Wreq.Session as Wreq (post)
-
-import Network.Telegram.API.Bot.Core (Telegram, Token (Token), Ok, result)
-
-type family Initial a = r | r -> a
-
-class FromJSON a => Postable a where
-	{-# MINIMAL initial_value, post_endpoint #-}
-	initial_value :: Initial a -> Value
-	post_endpoint :: Initial a -> String
-
-	post :: Initial a -> Telegram e a
-	post x = snd <$> ask >>= \(session, Token token) -> lift . ExceptT . try
-		. fmap (fromJust . join . fmap result . decode @(Ok a) . responseBody)
-			. flip (Wreq.post session) (initial_value x) $
-				"https://api.telegram.org/" <> unpack token <> "/" <> post_endpoint x
diff --git a/Network/Telegram/API/Bot/Capacity/Purgeable.hs b/Network/Telegram/API/Bot/Capacity/Purgeable.hs
deleted file mode 100644
--- a/Network/Telegram/API/Bot/Capacity/Purgeable.hs
+++ /dev/null
@@ -1,28 +0,0 @@
-module Network.Telegram.API.Bot.Capacity.Purgeable (Purgeable (..), Marking) where
-
-import "aeson" Data.Aeson (Value, decode)
-import "base" Control.Exception (try)
-import "base" Control.Monad (join, void)
-import "base" Data.Maybe (fromJust)
-import "http-client" Network.HTTP.Client (Response (responseBody))
-import "text" Data.Text (unpack)
-import "transformers" Control.Monad.Trans.Class (lift)
-import "transformers" Control.Monad.Trans.Except (ExceptT (ExceptT))
-import "transformers" Control.Monad.Trans.Reader (ask)
-
-import qualified "wreq" Network.Wreq.Session as Wreq (post)
-
-import Network.Telegram.API.Bot.Core (Telegram, Token (Token), Ok, result)
-
-type family Marking a = r | r -> a
-
-class Purgeable a where
-	{-# MINIMAL marking_value, purge_endpoint #-}
-	marking_value :: Marking a -> Value
-	purge_endpoint :: Marking a -> String
-
-	purge :: Marking a -> Telegram e ()
-	purge x = snd <$> ask >>= \(session, Token token) -> void . lift . ExceptT . try
-		. fmap (fromJust . join . fmap result . decode @(Ok ()) . responseBody)
-			. flip (Wreq.post session) (marking_value x) $
-				"https://api.telegram.org/" <> unpack token <> "/" <> purge_endpoint x
diff --git a/Network/Telegram/API/Bot/Core.hs b/Network/Telegram/API/Bot/Core.hs
--- a/Network/Telegram/API/Bot/Core.hs
+++ b/Network/Telegram/API/Bot/Core.hs
@@ -1,7 +1,17 @@
 module Network.Telegram.API.Bot.Core (Telegram, telegram, ask', Token (..), Ok, result) where
 
 import "aeson" Data.Aeson (FromJSON (parseJSON), withObject, (.:))
+import "base" Control.Applicative (Applicative ((<*>)))
 import "base" Control.Exception (SomeException)
+import "base" Data.Bool (Bool (True, False))
+import "base" Data.Eq (Eq)
+import "base" Data.Either (Either)
+import "base" Data.Function (flip, (.), ($))
+import "base" Data.Functor ((<$>))
+import "base" Data.Maybe (Maybe (Just, Nothing))
+import "base" Data.Tuple (fst)
+import "base" System.IO (IO)
+import "base" Text.Show (Show)
 import "text" Data.Text (Text)
 import "transformers" Control.Monad.Trans.Reader (ReaderT (runReaderT), ask)
 import "transformers" Control.Monad.Trans.Except (ExceptT, runExceptT)
diff --git a/Network/Telegram/API/Bot/Endpoint.hs b/Network/Telegram/API/Bot/Endpoint.hs
new file mode 100644
--- /dev/null
+++ b/Network/Telegram/API/Bot/Endpoint.hs
@@ -0,0 +1,22 @@
+module Network.Telegram.API.Bot.Endpoint
+	(Endpoint (..), Payload, Drop, Edit, Post, Purge) where
+
+import "aeson" Data.Aeson (FromJSON, Value)
+import "base" Data.String (String)
+
+import Network.Telegram.API.Bot.Core (Telegram)
+import Network.Telegram.API.Bot.Internal (telegram_request)
+
+type family Payload a = r | r -> a
+
+data Drop a
+data Edit a
+data Post a
+data Purge a
+
+class Endpoint a where
+	{-# MINIMAL payload, endpoint #-}
+	payload :: Payload a -> Value
+	endpoint :: Payload a -> String
+	request :: FromJSON r => Payload a -> Telegram e r
+	request x = telegram_request (endpoint x) (payload x)
diff --git a/Network/Telegram/API/Bot/Internal.hs b/Network/Telegram/API/Bot/Internal.hs
new file mode 100644
--- /dev/null
+++ b/Network/Telegram/API/Bot/Internal.hs
@@ -0,0 +1,25 @@
+module Network.Telegram.API.Bot.Internal (telegram_request) where
+
+import "aeson" Data.Aeson (FromJSON, Value, decode)
+import "base" Control.Exception (try)
+import "base" Control.Monad (Monad ((>>=)), join)
+import "base" Data.Function (flip, (.), ($))
+import "base" Data.Functor (Functor (fmap), (<$>))
+import "base" Data.Maybe (fromJust)
+import "base" Data.Semigroup (Semigroup ((<>)))
+import "base" Data.String (String)
+import "base" Data.Tuple (snd)
+import "http-client" Network.HTTP.Client (Response (responseBody))
+import "text" Data.Text (unpack)
+import "transformers" Control.Monad.Trans.Class (lift)
+import "transformers" Control.Monad.Trans.Except (ExceptT (ExceptT))
+import "transformers" Control.Monad.Trans.Reader (ask)
+
+import qualified "wreq" Network.Wreq.Session as Wreq (post)
+
+import Network.Telegram.API.Bot.Core (Telegram, Token (Token), Ok, result)
+
+telegram_request :: forall a e . FromJSON a => String -> Value -> Telegram e a
+telegram_request endpoint payload = snd <$> ask >>= \(session, Token token) -> lift . ExceptT . try
+	. fmap (fromJust . join . fmap result . decode @(Ok a) . responseBody)
+		. flip (Wreq.post session) payload $ "https://api.telegram.org/" <> unpack token <> "/" <> endpoint
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,11 +1,26 @@
-module Network.Telegram.API.Bot.Object (module Exports) where
+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.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 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 Callback = ()
+type instance Object Button = ()
diff --git a/Network/Telegram/API/Bot/Object/Button.hs b/Network/Telegram/API/Bot/Object/Button.hs
--- a/Network/Telegram/API/Bot/Object/Button.hs
+++ b/Network/Telegram/API/Bot/Object/Button.hs
@@ -3,7 +3,12 @@
 import "aeson" Data.Aeson (FromJSON (parseJSON), ToJSON (toJSON)
 	, Object, Value (Object), object, withObject, (.:), (.:?), (.=))
 import "aeson" Data.Aeson.Types (Parser)
-import "base" Control.Applicative (Alternative ((<|>)))
+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
@@ -23,7 +28,7 @@
 instance FromJSON Pressed where
 	parseJSON = withObject "Pressed" $ \v ->
 		(is_open v <|> is_callback v) >>= maybe
-			(fail "Action on pressing isn't set") return where
+			(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"
diff --git a/Network/Telegram/API/Bot/Object/Callback.hs b/Network/Telegram/API/Bot/Object/Callback.hs
--- a/Network/Telegram/API/Bot/Object/Callback.hs
+++ b/Network/Telegram/API/Bot/Object/Callback.hs
@@ -1,6 +1,10 @@
 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 (flip, ($))
+import "base" Data.Functor ((<$>))
+import "base" Text.Show (Show)
 import "text" Data.Text (Text)
 
 import Network.Telegram.API.Bot.Access (Access (access))
@@ -15,7 +19,9 @@
 		Datatext <$> v .: "id" <*> v .: "message" <*> v .: "data"
 
 instance Access Chat Callback where
-	access f (Datatext cq_id msg dttxt) = flip (Datatext cq_id) dttxt <$> access f msg
+	access f (Datatext cq_id msg dttxt) = flip
+		(Datatext cq_id) dttxt <$> access f msg
 
 instance Access From Callback where
-	access f (Datatext cq_id msg dttxt) = flip (Datatext cq_id) dttxt <$> access f msg
+	access f (Datatext cq_id msg dttxt) = flip
+		(Datatext cq_id) dttxt <$> access f msg
diff --git a/Network/Telegram/API/Bot/Object/Chat.hs b/Network/Telegram/API/Bot/Object/Chat.hs
--- a/Network/Telegram/API/Bot/Object/Chat.hs
+++ b/Network/Telegram/API/Bot/Object/Chat.hs
@@ -2,6 +2,11 @@
 
 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)
 
 import Network.Telegram.API.Bot.Property.Identifiable
diff --git a/Network/Telegram/API/Bot/Object/From.hs b/Network/Telegram/API/Bot/Object/From.hs
--- a/Network/Telegram/API/Bot/Object/From.hs
+++ b/Network/Telegram/API/Bot/Object/From.hs
@@ -3,7 +3,15 @@
 
 import "aeson" Data.Aeson (FromJSON (parseJSON), Object, withObject, (.:), (.:?))
 import "aeson" Data.Aeson.Types (Parser)
-import "base" Data.Bool (bool)
+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)
 
diff --git a/Network/Telegram/API/Bot/Object/Keyboard.hs b/Network/Telegram/API/Bot/Object/Keyboard.hs
--- a/Network/Telegram/API/Bot/Object/Keyboard.hs
+++ b/Network/Telegram/API/Bot/Object/Keyboard.hs
@@ -1,16 +1,16 @@
-module Network.Telegram.API.Bot.Object.Keyboard (Keyboard (..), Substitution) where
+module Network.Telegram.API.Bot.Object.Keyboard (Keyboard (..), Payload) where
 
 import "aeson" Data.Aeson (FromJSON (parseJSON), ToJSON (toJSON), object, withObject, (.:), (.=))
-import "base" Data.Int (Int64)
+import "base" Data.Function (($))
+import "base" Data.Functor ((<$>))
+import "base" Data.Int (Int, Int64)
+import "base" Text.Show (Show)
 
-import Network.Telegram.API.Bot.Capacity.Editable
-	(Substitution, Editable (substitution_value, edit_endpoint))
+import Network.Telegram.API.Bot.Endpoint (Endpoint (payload, endpoint), Payload, Edit)
 import Network.Telegram.API.Bot.Object.Button (Button)
 
 data Keyboard = Inline [[Button]] deriving Show
 
-type instance Substitution Keyboard = (Int64, Int, Keyboard)
-
 instance FromJSON Keyboard where
 	parseJSON = withObject "Inline" $ \v ->
 		Inline <$> v .: "inline_keyboard"
@@ -19,7 +19,9 @@
 	toJSON (Inline buttons) = object
 		["inline_keyboard" .= buttons]
 
-instance Editable Keyboard where
-	substitution_value (chat_id, message_id, reply_markup) = object
+type instance Payload (Edit Keyboard) = (Int64, Int, Keyboard)
+
+instance Endpoint (Edit Keyboard) where
+	payload (chat_id, message_id, reply_markup) = object
 		["chat_id" .= chat_id, "message_id" .= message_id, "reply_markup" .= reply_markup]
-	edit_endpoint _ = "editMessageReplyMarkup"
+	endpoint _ = "editMessageReplyMarkup"
diff --git a/Network/Telegram/API/Bot/Object/Member.hs b/Network/Telegram/API/Bot/Object/Member.hs
new file mode 100644
--- /dev/null
+++ b/Network/Telegram/API/Bot/Object/Member.hs
@@ -0,0 +1,31 @@
+module Network.Telegram.API.Bot.Object.Member (Member (..)) where
+
+import "aeson" Data.Aeson (FromJSON (parseJSON), withObject, (.:))
+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)
+import "time" Data.Time.Clock.POSIX (POSIXTime)
+
+import Network.Telegram.API.Bot.Object.From (From)
+
+data Member
+	= Creator From
+	| Administrator From
+	| Member From
+	| Restricted From POSIXTime
+	-- | Left From
+	| Kicked From POSIXTime
+	deriving Show
+
+instance FromJSON Member where
+	parseJSON = withObject "Member" $ \v -> v .: "status" >>= \case
+		("creator" :: Text) -> Creator <$> v .: "user"
+		("administrator" :: Text) -> Administrator <$> v .: "user"
+		("member" :: Text) -> Member <$> v .: "user"
+		("restricted" :: Text) -> Restricted <$> v .: "user" <*> v .: "until_date"
+		-- ("left" :: Text) -> Left <$> v .: "user"
+		("kicked" :: Text) -> Kicked <$> v .: "user" <*> v.: "until_date"
+		_ -> fail "Status of chat member is not defined"
diff --git a/Network/Telegram/API/Bot/Object/Message.hs b/Network/Telegram/API/Bot/Object/Message.hs
--- a/Network/Telegram/API/Bot/Object/Message.hs
+++ b/Network/Telegram/API/Bot/Object/Message.hs
@@ -1,22 +1,26 @@
 module Network.Telegram.API.Bot.Object.Message
-	(Message (..), Initial, Marking) where
+	(Message (..), Payload) where
 
 import "aeson" Data.Aeson (FromJSON (parseJSON), object, withArray, withObject, (.:), (.=))
 import "aeson" Data.Aeson.Types (Object, Parser, Value)
-import "base" Control.Applicative (Alternative ((<|>), empty))
-import "base" Data.Int (Int64)
+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, Int64)
+import "base" Data.Maybe (Maybe (Just, Nothing))
+import "base" Text.Show (Show)
+import "base" Prelude ((+))
 import "text" Data.Text (Text)
 
 import qualified "text" Data.Text as T (drop, take)
 
 import Network.Telegram.API.Bot.Access (Access (access))
+import Network.Telegram.API.Bot.Endpoint (Endpoint (payload, endpoint), Payload, Post, Purge)
 import Network.Telegram.API.Bot.Object.Chat (Chat)
 import Network.Telegram.API.Bot.Object.From (From)
 import Network.Telegram.API.Bot.Object.Keyboard (Keyboard)
-import Network.Telegram.API.Bot.Capacity.Postable
-	(Initial, Postable (initial_value, post_endpoint))
-import Network.Telegram.API.Bot.Capacity.Purgeable
-	(Marking, Purgeable (marking_value, purge_endpoint))
 import Network.Telegram.API.Bot.Property.Identifiable
 	(Identifiable (identificator), Identificator)
 
@@ -25,8 +29,6 @@
 	| Command Int Chat From Text
 	deriving Show
 
-type instance Initial Message = (Int64, Text, Maybe Keyboard)
-type instance Marking Message = (Int64, Int)
 type instance Identificator Message = Int
 
 instance Identifiable Message where
@@ -56,18 +58,6 @@
 		extract_command :: Object -> (Int, Int) -> Parser Text
 		extract_command v (ofs, len) = (T.take len . T.drop (ofs + 1)) <$> v .: "text"
 
-instance Postable Message where
-	initial_value (chat_id, text, Nothing) =
-		object ["chat_id" .= chat_id, "text" .= text]
-	initial_value (chat_id, text, Just kb) =
-		object ["chat_id" .= chat_id, "text" .= text, "reply_markup" .= kb]
-	post_endpoint _ = "sendMessage"
-
-instance Purgeable Message where
-	marking_value (chat_id, message_id) =
-		object ["chat_id" .= chat_id, "message_id" .= message_id]
-	purge_endpoint _ = "deleteMessage"
-
 instance Access 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
@@ -75,3 +65,15 @@
 instance Access 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
+
+type instance Payload (Post Message) = (Int64, Text, Maybe Keyboard)
+type instance Payload (Purge Message) = (Int64, Int)
+
+instance Endpoint (Post Message) where
+	payload (chat_id, text, Nothing) = object ["chat_id" .= chat_id, "text" .= text]
+	payload (chat_id, text, Just kb) = object ["chat_id" .= chat_id, "text" .= text, "reply_markup" .= kb]
+	endpoint _ = "sendMessage"
+
+instance Endpoint (Purge Message) where
+	payload (chat_id, message_id) = object ["chat_id" .= chat_id, "message_id" .= message_id]
+	endpoint _ = "deleteMessage"
diff --git a/Network/Telegram/API/Bot/Object/Moving.hs b/Network/Telegram/API/Bot/Object/Moving.hs
--- a/Network/Telegram/API/Bot/Object/Moving.hs
+++ b/Network/Telegram/API/Bot/Object/Moving.hs
@@ -2,7 +2,10 @@
 
 import "aeson" Data.Aeson (FromJSON (parseJSON), withObject, (.:))
 import "aeson" Data.Aeson.Types (Object, Parser)
-import "base" Control.Applicative (Alternative ((<|>)))
+import "base" Control.Applicative (Applicative ((<*>)), Alternative ((<|>)))
+import "base" Data.Function (($))
+import "base" Data.Functor ((<$>))
+import "base" Text.Show (Show)
 
 import Network.Telegram.API.Bot.Access (Access (access))
 import Network.Telegram.API.Bot.Object.Chat (Chat)
diff --git a/Network/Telegram/API/Bot/Object/Notification.hs b/Network/Telegram/API/Bot/Object/Notification.hs
--- a/Network/Telegram/API/Bot/Object/Notification.hs
+++ b/Network/Telegram/API/Bot/Object/Notification.hs
@@ -1,16 +1,15 @@
-module Network.Telegram.API.Bot.Object.Notification (Notification) where
+module Network.Telegram.API.Bot.Object.Notification (Notification, Payload) where
 
 import "aeson" Data.Aeson (object, (.=))
 import "text" Data.Text (Text)
 
-import Network.Telegram.API.Bot.Capacity.Droppable
-	(Drop, Droppable (drop_value, drop_endpoint))
+import Network.Telegram.API.Bot.Endpoint (Endpoint (payload, endpoint), Payload, Drop)
 
 data Notification
 
-type instance Drop Notification = (Text, Text)
+type instance Payload (Drop Notification) = (Text, Text)
 
-instance Droppable Notification where
-	drop_value (cbq_id, text) =
-		object ["callback_query_id" .= cbq_id, "text" .= text]
-	drop_endpoint _ = "answerCallbackQuery"
+instance Endpoint (Drop Notification) where
+	payload (cbq_id, text) = object
+		["callback_query_id" .= cbq_id, "text" .= text]
+	endpoint _ = "answerCallbackQuery"
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
@@ -2,7 +2,11 @@
 
 import "aeson" Data.Aeson (FromJSON (parseJSON), withObject, (.:))
 import "aeson" Data.Aeson.Types (Object, Parser)
-import "base" Control.Applicative (Alternative ((<|>)))
+import "base" Control.Applicative (Applicative ((<*>)), Alternative ((<|>)))
+import "base" Data.Function (($))
+import "base" Data.Functor ((<$>))
+import "base" Data.Int (Int)
+import "base" Text.Show (Show)
 
 import Network.Telegram.API.Bot.Access (Access (access))
 import Network.Telegram.API.Bot.Object.Callback (Callback)
diff --git a/telega.cabal b/telega.cabal
--- a/telega.cabal
+++ b/telega.cabal
@@ -1,5 +1,5 @@
 name:                telega
-version:             0.1.3
+version:             0.1.4
 synopsis:            Telegram Bot API binding
 description:         High-level bindings, typed entities, inline mode only
 homepage:            https://github.com/iokasimov/telega
@@ -22,26 +22,25 @@
     Network.Telegram.API.Bot
     Network.Telegram.API.Bot.Core
     Network.Telegram.API.Bot.Access
+    Network.Telegram.API.Bot.Endpoint
     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.Moving
+    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.Update
-    Network.Telegram.API.Bot.Capacity
-    Network.Telegram.API.Bot.Capacity.Droppable
-    Network.Telegram.API.Bot.Capacity.Editable
-    Network.Telegram.API.Bot.Capacity.Postable
-    Network.Telegram.API.Bot.Capacity.Purgeable
     Network.Telegram.API.Bot.Property
     Network.Telegram.API.Bot.Property.Identifiable
-  build-depends: base == 4.*, transformers, lens, aeson, text, http-client, wreq
-  default-extensions: DataKinds, LambdaCase, OverloadedStrings,
-    MultiParamTypeClasses, PackageImports, ScopedTypeVariables,
+  other-modules:
+    Network.Telegram.API.Bot.Internal
+  build-depends: base == 4.*, transformers, lens, aeson, text, time, http-client, wreq
+  default-extensions: DataKinds, LambdaCase, OverloadedStrings, NoImplicitPrelude,
+    FlexibleInstances, MultiParamTypeClasses, PackageImports, ScopedTypeVariables,
     TypeApplications, TypeFamilies, TypeFamilyDependencies, TypeOperators
   default-language: Haskell2010
   ghc-options: -Wall -fno-warn-tabs
