diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -126,3 +126,10 @@
 * Define `Persistable` instance for sending `Photo`
 * Separate `Venue` and `Contact` into module and datatype from `Info` datatype
 * Rename `User` constructor of `Sender` datatype to `Human`
+
+# 0.2.6
+* Define `Eq` instance for `Update`, `Message`, `Callback`, `Origin`, `File` and `Size`
+* Start to write documentation step-by-step, show three simple examples
+* Add `Sender` field into `Callback` datatype to understand from whom action goes
+* Change endpoint for `Edit`ing `Keyboard` object, remove `Edit` `Text :&: Keyboard` instance
+* Replace `Group` and `Supergroup` constructors by including `Group` field in `Origin` datatype
diff --git a/Network/API/Telegram/Bot/Object/Update.hs b/Network/API/Telegram/Bot/Object/Update.hs
--- a/Network/API/Telegram/Bot/Object/Update.hs
+++ b/Network/API/Telegram/Bot/Object/Update.hs
@@ -1,20 +1,17 @@
-module Network.API.Telegram.Bot.Object.Update (Update (..), module Exports) where
+module Network.API.Telegram.Bot.Object.Update (module Exports, Update (..)) where
 
 import Network.API.Telegram.Bot.Object.Update.Callback as Exports
 import Network.API.Telegram.Bot.Object.Update.Message as Exports
 import Network.API.Telegram.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 ((<|>)))
+import "base" Control.Applicative ((<*>), (<|>))
+import "base" Data.Eq (Eq ((==)))
 import "base" Data.Function (($))
 import "base" Data.Functor ((<$>))
 import "base" Data.Int (Int)
 import "base" Text.Show (Show)
 
-import Network.API.Telegram.Bot.Object.Update.Callback (Callback)
-import Network.API.Telegram.Bot.Object.Update.Message (Message)
-import Network.API.Telegram.Bot.Object.Update.Moving (Moving)
 import Network.API.Telegram.Bot.Property.Identifiable (Identifiable (Identificator, ident))
 
 data Update
@@ -23,6 +20,9 @@
 	| Incoming Int Message
 	deriving Show
 
+instance Eq Update where
+	u == u' = ident u == ident u'
+
 instance Identifiable Update where
 	type Identificator Update = Int
 	ident (Query i _) = i
@@ -31,13 +31,6 @@
 
 instance FromJSON Update where
 	parseJSON = withObject "Update" $ \v ->
-		query v <|> membership v <|> incoming v where
-
-		query :: Object -> Parser Update
-		query v = Query <$> v .: "update_id" <*> v .: "callback_query"
-
-		membership :: Object -> Parser Update
-		membership v = Membership <$> v .: "update_id" <*> v .: "message"
-
-		incoming :: Object -> Parser Update
-		incoming v = Incoming <$> v .: "update_id" <*> v .: "message"
+		(Query <$> v .: "update_id" <*> v .: "callback_query") <|>
+		(Membership <$> v .: "update_id" <*> v .: "message") <|>
+		(Incoming <$> v .: "update_id" <*> v .: "message")
diff --git a/Network/API/Telegram/Bot/Object/Update/Callback.hs b/Network/API/Telegram/Bot/Object/Update/Callback.hs
--- a/Network/API/Telegram/Bot/Object/Update/Callback.hs
+++ b/Network/API/Telegram/Bot/Object/Update/Callback.hs
@@ -5,12 +5,14 @@
 
 import "aeson" Data.Aeson (FromJSON (parseJSON), withObject, (.:))
 import "base" Control.Applicative (Applicative ((<*>)))
+import "base" Data.Eq (Eq ((==)))
 import "base" Data.Function (flip, ($))
 import "base" Data.Functor ((<$>))
 import "base" Data.Semigroup ((<>))
 import "base" Text.Show (Show)
 import "text" Data.Text (Text)
 
+import Network.API.Telegram.Bot.Object.Sender (Sender)
 import Network.API.Telegram.Bot.Object.Update.Message (Message)
 import Network.API.Telegram.Bot.Object.Update.Message.Origin (Origin)
 import Network.API.Telegram.Bot.Property.Accessible (Accessible (access))
@@ -18,19 +20,23 @@
 import Network.API.Telegram.Bot.Property.Persistable (Persistable (Payload, Returning, payload, endpoint))
 import Network.API.Telegram.Bot.Utils (field)
 
-data Callback = Datatext Text Message Text deriving Show
+data Callback = Datatext Text Sender Message Text deriving Show
 
+instance Eq Callback where
+	c == c' = ident c == ident c'
+
 instance Accessible Origin Callback where
-	access f (Datatext cq_id msg dttxt) = flip
-		(Datatext cq_id) dttxt <$> access f msg
+	access f (Datatext cq_id from msg dttxt) = flip
+		(Datatext cq_id from) dttxt <$> access f msg
 
 instance FromJSON Callback where
 	parseJSON = withObject "Callback" $ \v ->
-		Datatext <$> v .: "id" <*> v .: "message" <*> v .: "data"
+		Datatext <$> v .: "id" <*> v .: "from"
+			<*> v .: "message" <*> v .: "data"
 
 instance Identifiable Callback where
 	type Identificator Callback = Text
-	ident (Datatext i _ _) = i
+	ident (Datatext i _ _ _) = i
 
 data Trigger a = Trigger Text Text
 
diff --git a/Network/API/Telegram/Bot/Object/Update/Message.hs b/Network/API/Telegram/Bot/Object/Update/Message.hs
--- a/Network/API/Telegram/Bot/Object/Update/Message.hs
+++ b/Network/API/Telegram/Bot/Object/Update/Message.hs
@@ -10,6 +10,7 @@
 import "base" Control.Applicative (Applicative ((<*>)), Alternative ((<|>)))
 import "base" Control.Monad (Monad ((>>=)), fail)
 import "base" Data.Bool (Bool (True))
+import "base" Data.Eq (Eq ((==)))
 import "base" Data.Function (($))
 import "base" Data.Functor ((<$>))
 import "base" Data.Int (Int, Int64)
@@ -19,7 +20,7 @@
 import "with" Data.With (type (:&:)((:&:)))
 
 import Network.API.Telegram.Bot.Object.Update.Message.Content (Content)
-import Network.API.Telegram.Bot.Object.Update.Message.Origin (Origin (Private, Group, Supergroup, Channel))
+import Network.API.Telegram.Bot.Object.Update.Message.Origin (Origin (Private, Group, Channel))
 import Network.API.Telegram.Bot.Property.Accessible (Accessible (access))
 import Network.API.Telegram.Bot.Property.Identifiable (Identifiable (Identificator, ident))
 import Network.API.Telegram.Bot.Property.Persistable (Persistable (Payload, Returning, payload, endpoint))
@@ -31,6 +32,9 @@
 	| Replied Int Origin Content Message
 	deriving Show
 
+instance Eq Message where
+	m == m' = ident m == ident m'
+
 instance Accessible Content Message where
 	access f (Direct msg_id origin content) = (\content' -> Direct msg_id origin content') <$> f content
 	access f (Forwarded msg_id origin content) = (\content' -> Forwarded msg_id origin content') <$> f content
@@ -41,6 +45,12 @@
 	access f (Forwarded msg_id origin content) = (\origin' -> Forwarded msg_id origin' content) <$> f origin
 	access f (Replied msg_id origin content msg) = (\origin' -> Replied msg_id origin' content msg) <$> f origin
 
+instance Identifiable Message where
+	type Identificator Message = Int
+	ident (Direct i _ _) = i
+	ident (Forwarded i _ _) = i
+	ident (Replied i _ _ _) = i
+
 instance FromJSON Message where
 	parseJSON = withObject "Message" $ \v ->
 		forward_channel v <|> forward_chat v <|> reply v <|> direct v where
@@ -59,8 +69,8 @@
 			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"
+				("group" :: Text) -> Group <$> parseJSON (Object c) <*> v .: "forward_from"
+				("supergroup" :: Text) -> Group <$> parseJSON (Object c) <*> v .: "forward_from"
 				_ -> fail "Type of chat is not defined"
 
 		reply :: Object -> Parser Message
@@ -71,12 +81,6 @@
 		direct v = Direct <$> v .: "message_id"
 			<*> parseJSON (Object v) <*> parseJSON (Object v)
 
-instance Identifiable Message where
-	type Identificator Message = Int
-	ident (Direct i _ _) = i
-	ident (Forwarded i _ _) = i
-	ident (Replied i _ _ _) = i
-
 data Forward a = Forward Int Int64 Int64
 
 instance Persistable (Forward Message) where
@@ -215,15 +219,7 @@
 	type Returning (Edit Keyboard) = Message
 	payload (Edit chat_id message_id reply_markup) = field "chat_id" chat_id
 		<> field "message_id" message_id <> field "reply_markup" reply_markup
-	endpoint _ = "editMessageText"
-
-instance Persistable (Edit (Text :&: Keyboard)) where
-	type Payload (Edit (Text :&: Keyboard)) = Edit (Text :&: Keyboard)
-	type Returning (Edit (Text :&: Keyboard)) = Message
-	payload (Edit chat_id message_id (text :&: reply_markup)) =
-		field "chat_id" chat_id <> field "message_id" message_id
-		<> field "text" text <> field "reply_markup" reply_markup
-	endpoint _ = "editMessageText"
+	endpoint _ = "editMessageReplyMarkup"
 
 instance Persistable (Edit (Live Location)) where
 	type Payload (Edit (Live Location)) = Edit Location
diff --git a/Network/API/Telegram/Bot/Object/Update/Message/Content/File.hs b/Network/API/Telegram/Bot/Object/Update/Message/Content/File.hs
--- a/Network/API/Telegram/Bot/Object/Update/Message/Content/File.hs
+++ b/Network/API/Telegram/Bot/Object/Update/Message/Content/File.hs
@@ -10,8 +10,9 @@
 import Network.API.Telegram.Bot.Object.Update.Message.Content.File.Voice as Exports
 
 import "aeson" Data.Aeson (FromJSON (parseJSON), withObject, (.:))
-import "aeson" Data.Aeson.Types (Object, Parser)
 import "base" Control.Applicative ((<*>), (<|>))
+import "base" Data.Bool (Bool (False))
+import "base" Data.Eq (Eq ((==)))
 import "base" Control.Monad ((>>=))
 import "base" Data.Function (($))
 import "base" Data.Functor ((<$>))
@@ -25,21 +26,18 @@
 	| Photography [Size]
 	deriving Show
 
+instance Eq File where
+	Audiofile i _ == Audiofile i' _ = i == i'
+	Videofile i _ == Videofile i' _ = i == i'
+	General i _ == General i' _ = i == i'
+	Voicerecord i _ == Voicerecord i' _ = i == i'
+	Photography ss == Photography ss' = ss == ss'
+	_ == _ = False
+
 instance FromJSON File where
 	parseJSON = withObject "Message" $ \v ->
-		photo v <|> document v <|> audio v <|> video v <|> voice v where
-
-		photo :: Object -> Parser File
-		photo v = Photography <$> v .: "photo"
-
-		audio :: Object -> Parser File
-		audio v = Audiofile <$> (v .: "audio" >>= parseJSON) <*> v .: "audio"
-
-		document :: Object -> Parser File
-		document v = General <$> (v .: "document" >>= parseJSON) <*> v .: "document"
-
-		video :: Object -> Parser File
-		video v = Videofile <$> (v .: "video" >>= parseJSON) <*> v .: "video"
-
-		voice :: Object -> Parser File
-		voice v = Voicerecord <$> (v .: "voice" >>= parseJSON) <*> v .: "voice"
+		(Photography <$> v .: "photo") <|>
+		(Audiofile <$> (v .: "audio" >>= parseJSON) <*> v .: "audio") <|>
+		(General <$> (v .: "document" >>= parseJSON) <*> v .: "document") <|>
+		(Videofile <$> (v .: "video" >>= parseJSON) <*> v .: "video") <|>
+		(Voicerecord <$> (v .: "voice" >>= parseJSON) <*> v .: "voice")
diff --git a/Network/API/Telegram/Bot/Object/Update/Message/Content/File/Size.hs b/Network/API/Telegram/Bot/Object/Update/Message/Content/File/Size.hs
--- a/Network/API/Telegram/Bot/Object/Update/Message/Content/File/Size.hs
+++ b/Network/API/Telegram/Bot/Object/Update/Message/Content/File/Size.hs
@@ -2,6 +2,7 @@
 
 import "aeson" Data.Aeson (FromJSON (parseJSON), withObject, (.:))
 import "base" Control.Applicative ((<*>))
+import "base" Data.Eq (Eq ((==)))
 import "base" Data.Int (Int)
 import "base" Data.Function (($))
 import "base" Data.Functor ((<$>))
@@ -12,6 +13,9 @@
 import Network.API.Telegram.Bot.Property.Identifiable (Identifiable (Identificator, ident))
 
 data Size = Size Text Int Int (Maybe Int) deriving Show
+
+instance Eq Size where
+	s == s' = ident s == ident s'
 
 instance Identifiable Size where
 	type Identificator Size = Text
diff --git a/Network/API/Telegram/Bot/Object/Update/Message/Content/File/URI.hs b/Network/API/Telegram/Bot/Object/Update/Message/Content/File/URI.hs
--- a/Network/API/Telegram/Bot/Object/Update/Message/Content/File/URI.hs
+++ b/Network/API/Telegram/Bot/Object/Update/Message/Content/File/URI.hs
@@ -1,13 +1,14 @@
 module Network.API.Telegram.Bot.Object.Update.Message.Content.File.URI (URI (..)) where
 
 import "aeson" Data.Aeson (FromJSON (parseJSON), ToJSON (toJSON), Value (String), withObject, (.:))
+import "base" Data.Eq (Eq)
 import "base" Data.Functor ((<$>))
 import "base" Data.Function (($))
 import "base" Text.Show (Show)
 import "text" Data.Text (Text)
 
 newtype URI = URI Text
-	deriving Show
+	deriving (Eq, Show)
 
 instance FromJSON URI where
 	parseJSON = withObject "URI" $ \v ->
diff --git a/Network/API/Telegram/Bot/Object/Update/Message/Content/Info/Contact.hs b/Network/API/Telegram/Bot/Object/Update/Message/Content/Info/Contact.hs
--- a/Network/API/Telegram/Bot/Object/Update/Message/Content/Info/Contact.hs
+++ b/Network/API/Telegram/Bot/Object/Update/Message/Content/Info/Contact.hs
@@ -8,8 +8,6 @@
 import "base" Text.Show (Show)
 import "text" Data.Text (Text)
 
-import Network.API.Telegram.Bot.Object.Update.Message.Content.Info.Location (Location)
-
 data Contact = Contact Text (Maybe Text) (Maybe Text) Text (Maybe Text)
 	deriving Show
 
diff --git a/Network/API/Telegram/Bot/Object/Update/Message/Origin.hs b/Network/API/Telegram/Bot/Object/Update/Message/Origin.hs
--- a/Network/API/Telegram/Bot/Object/Update/Message/Origin.hs
+++ b/Network/API/Telegram/Bot/Object/Update/Message/Origin.hs
@@ -1,9 +1,10 @@
 module Network.API.Telegram.Bot.Object.Update.Message.Origin (Origin (..)) where
 
 import "aeson" Data.Aeson (FromJSON (parseJSON), withObject, (.:))
-import "aeson" Data.Aeson.Types (Object, Parser, Value)
+import "aeson" Data.Aeson.Types (Object, Parser, Value (Object))
 import "base" Control.Applicative (Applicative ((<*>)))
-import "base" Control.Monad (Monad ((>>=)), fail)
+import "base" Control.Monad (Monad ((>>=)))
+import "base" Data.Eq (Eq ((==)))
 import "base" Data.Function (($))
 import "base" Data.Functor ((<$>))
 import "base" Data.Int (Int64)
@@ -11,29 +12,29 @@
 import "text" Data.Text (Text)
 
 import Network.API.Telegram.Bot.Object.Sender (Sender)
+import Network.API.Telegram.Bot.Object.Update.Moving.Group (Group)
 import Network.API.Telegram.Bot.Property.Identifiable (Identifiable (Identificator, ident))
 
 data Origin
 	= Private Int64 Sender
-	| Group Int64 Text Sender
-	| Supergroup Int64 Text Sender
+	| Group Group Sender
 	| Channel Int64 Text
 	deriving Show
 
+instance Eq Origin where
+	o == o' = ident o == ident o'
+
+instance Identifiable Origin where
+	type Identificator Origin = Int64
+	ident (Private i _) = i
+	ident (Group g _) = ident g
+	ident (Channel i _) = i
+
 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"
-
-instance Identifiable Origin where
-	type Identificator Origin = Int64
-	ident (Private i _) = i
-	ident (Group i _ _) = i
-	ident (Supergroup i _ _) = i
-	ident (Channel i _) = i
+			_ -> parseJSON (Object v)
diff --git a/Network/API/Telegram/Bot/Object/Update/Moving.hs b/Network/API/Telegram/Bot/Object/Update/Moving.hs
--- a/Network/API/Telegram/Bot/Object/Update/Moving.hs
+++ b/Network/API/Telegram/Bot/Object/Update/Moving.hs
@@ -3,7 +3,6 @@
 import Network.API.Telegram.Bot.Object.Update.Moving.Group as Exports
 
 import "aeson" Data.Aeson (FromJSON (parseJSON), withObject, (.:))
-import "aeson" Data.Aeson.Types (Object, Parser)
 import "base" Control.Applicative ((<*>), (<|>))
 import "base" Data.Function (($))
 import "base" Data.Functor ((<$>))
@@ -17,10 +16,6 @@
 	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" <*> v .: "chat"
-
-		joined :: Object -> Parser Moving
-		joined v = Joined <$> v .: "new_chat_members" <*> v .: "chat"
+	parseJSON = withObject "Moving" $ \v ->
+		(Gone <$> v .: "left_chat_member" <*> v .: "chat") <|>
+		(Joined <$> v .: "new_chat_members" <*> v .: "chat")
diff --git a/Network/API/Telegram/Bot/Object/Update/Moving/Group.hs b/Network/API/Telegram/Bot/Object/Update/Moving/Group.hs
--- a/Network/API/Telegram/Bot/Object/Update/Moving/Group.hs
+++ b/Network/API/Telegram/Bot/Object/Update/Moving/Group.hs
@@ -10,10 +10,17 @@
 import "base" Text.Show (Show)
 import "text" Data.Text (Text)
 
+import Network.API.Telegram.Bot.Property.Identifiable (Identifiable (Identificator, ident))
+
 data Group
 	= Basic Int64 Text
 	| Super Int64 Text (Maybe Text)
 	deriving Show
+
+instance Identifiable Group where
+	type Identificator Group = Int64
+	ident (Basic i _ ) = i
+	ident (Super i _ _) = i
 
 instance FromJSON Group where
 	parseJSON = withObject "Group" $ \v -> v .: "type" >>= \case
diff --git a/telega.cabal b/telega.cabal
--- a/telega.cabal
+++ b/telega.cabal
@@ -1,5 +1,5 @@
 name:                telega
-version:             0.2.5
+version:             0.2.6
 synopsis:            Telegram Bot API binding
 description:         High-level bindings, typed entities, inline mode only
 homepage:            https://github.com/iokasimov/telega
@@ -58,7 +58,7 @@
     Network.API.Telegram.Bot.Utils
   build-depends: base == 4.*, data-default, transformers, with, lens, aeson, text, unordered-containers, http-client, wreq
   default-extensions: DataKinds, LambdaCase, OverloadedStrings, NoImplicitPrelude, PackageImports, GADTs,
-    FlexibleContexts, FlexibleInstances, MultiParamTypeClasses, UndecidableInstances, UndecidableSuperClasses,
-    TypeApplications, TypeFamilies, TypeFamilyDependencies, TypeOperators, ScopedTypeVariables, PolyKinds
+    FlexibleContexts, FlexibleInstances, MultiParamTypeClasses, UndecidableInstances
+    TypeApplications, TypeFamilies, TypeFamilyDependencies, TypeOperators, ScopedTypeVariables
   default-language: Haskell2010
-  ghc-options: -Wall -fno-warn-tabs -fprint-explicit-kinds
+  ghc-options: -Wall -fno-warn-tabs
