diff --git a/jtelegrambotapi-core/pom.xml b/jtelegrambotapi-core/pom.xml
index 2abf92482..51a182542 100644
--- a/jtelegrambotapi-core/pom.xml
+++ b/jtelegrambotapi-core/pom.xml
@@ -29,6 +29,11 @@
             okhttp
         
 
+        
+            com.google.code.findbugs
+            jsr305
+        
+
         
 
         
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/TelegramBotRegistry.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/TelegramBotRegistry.java
index 801e972cc..e48a02863 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/TelegramBotRegistry.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/TelegramBotRegistry.java
@@ -11,6 +11,8 @@
 import com.jtelegram.api.inline.keyboard.InlineKeyboardRow;
 import com.jtelegram.api.inline.result.framework.InlineResultType;
 import com.jtelegram.api.message.entity.MessageEntity;
+import com.jtelegram.api.message.entity.MessageEntityType;
+import com.jtelegram.api.message.media.Photo;
 import com.jtelegram.api.update.Update;
 import com.jtelegram.api.update.UpdateProvider;
 import com.jtelegram.api.update.UpdateType;
@@ -46,9 +48,11 @@ public class TelegramBotRegistry {
             .registerTypeAdapter(InlineKeyboardRow.class, new InlineKeyboardRow.Serializer())
             .registerTypeAdapter(ReplyKeyboardRow.class, new ReplyKeyboardRow.Serializer())
             .registerTypeAdapter(Update.class, new Update.Deserializer())
+            .registerTypeAdapter(Photo.class, new Photo.Deserializer())
             .registerTypeAdapter(Chat.class, new Chat.Deserializer())
             .registerTypeAdapter(Message.class, new Message.Deserializer())
             .registerTypeAdapter(MessageEntity.class, new MessageEntity.Deserializer())
+            .registerTypeAdapter(MessageEntityType.class, new MessageEntityType.Adapter())
             .registerTypeHierarchyAdapter(InputFile.class, new InputFile.Serializer())
             .registerTypeHierarchyAdapter(ChatId.class, new ChatId.Serializer())
             .create();
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/Event.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/Event.java
index 29e7b7033..b249533f2 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/Event.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/Event.java
@@ -1,6 +1,7 @@
 package com.jtelegram.api.events;
 
 import com.jtelegram.api.TelegramBot;
+import javax.annotation.Nonnull;
 import lombok.AccessLevel;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
@@ -10,8 +11,10 @@
 @AllArgsConstructor(access = AccessLevel.PROTECTED)
 public abstract class Event {
     @Getter
+    @Nonnull
     private final TelegramBot bot;
 
+    @Nonnull
     public Class extends Event> getType() {
         return getClass();
     }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/EventRegistry.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/EventRegistry.java
index 499c4945c..cd00dc6b9 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/EventRegistry.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/EventRegistry.java
@@ -4,7 +4,6 @@
 import com.jtelegram.api.events.inline.ChosenInlineResultEvent;
 import com.jtelegram.api.requests.inline.AnswerInlineQuery;
 import com.jtelegram.api.util.ExceptionThreadFactory;
-
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -58,14 +57,20 @@ public  void dispatch(E event) {
         }
 
         this.threadPool.submit(() -> {
-            List> h = handlers.get(event.getType());
-
-            if (h != null) {
-                h.forEach(handler -> {
-                    EventHandler eh = (EventHandler) handler;
-                    eh.onEvent(event);
-                });
+            Class> eventClass = event.getClass();
+            List> h = new ArrayList<>();
+            while (Event.class.isAssignableFrom(eventClass) && eventClass != Event.class) {
+                List> handlerList = handlers.get(eventClass.asSubclass(Event.class));
+                if (handlerList != null) {
+                    h.addAll(handlerList);
+                }
+                eventClass = eventClass.getSuperclass();
             }
+
+            h.forEach(handler -> {
+                EventHandler eh = (EventHandler) handler;
+                eh.onEvent(event);
+            });
         });
     }
 }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/UpdateEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/UpdateEvent.java
new file mode 100644
index 000000000..87524ea3c
--- /dev/null
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/UpdateEvent.java
@@ -0,0 +1,22 @@
+package com.jtelegram.api.events;
+
+import com.jtelegram.api.TelegramBot;
+import com.jtelegram.api.update.Update;
+import javax.annotation.Nonnull;
+import lombok.Getter;
+
+/**
+ * @author Nick Robson
+ */
+@Getter
+public abstract class UpdateEvent> extends Event {
+
+    @Nonnull
+    private T update;
+
+    protected UpdateEvent(@Nonnull TelegramBot bot, @Nonnull T update) {
+        super(bot);
+        this.update = update;
+    }
+
+}
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/channel/ChannelPostEditEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/channel/ChannelPostEditEvent.java
index 67367e342..2df8fee1d 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/channel/ChannelPostEditEvent.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/channel/ChannelPostEditEvent.java
@@ -1,8 +1,9 @@
 package com.jtelegram.api.events.channel;
 
 import com.jtelegram.api.TelegramBot;
-import com.jtelegram.api.events.Event;
+import com.jtelegram.api.events.UpdateEvent;
 import com.jtelegram.api.message.Message;
+import com.jtelegram.api.update.Update;
 import lombok.Getter;
 import lombok.ToString;
 
@@ -11,11 +12,11 @@
  */
 @Getter
 @ToString(callSuper = true)
-public class ChannelPostEditEvent extends Event {
+public class ChannelPostEditEvent extends UpdateEvent {
     private Message post;
 
-    public ChannelPostEditEvent(TelegramBot bot, Message post) {
-        super(bot);
-        this.post = post;
+    public ChannelPostEditEvent(TelegramBot bot, Update.EditedChannelPostUpdate update) {
+        super(bot, update);
+        this.post = update.getEditedChannelPost();
     }
 }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/channel/ChannelPostEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/channel/ChannelPostEvent.java
index f152cfb0c..921b91013 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/channel/ChannelPostEvent.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/channel/ChannelPostEvent.java
@@ -1,8 +1,9 @@
 package com.jtelegram.api.events.channel;
 
 import com.jtelegram.api.TelegramBot;
-import com.jtelegram.api.events.Event;
+import com.jtelegram.api.events.UpdateEvent;
 import com.jtelegram.api.message.Message;
+import com.jtelegram.api.update.Update;
 import lombok.Getter;
 import lombok.ToString;
 
@@ -11,11 +12,11 @@
  */
 @Getter
 @ToString(callSuper = true)
-public class ChannelPostEvent extends Event {
+public class ChannelPostEvent extends UpdateEvent {
     private Message post;
 
-    public ChannelPostEvent(TelegramBot bot, Message post) {
-        super(bot);
-        this.post = post;
+    public ChannelPostEvent(TelegramBot bot, Update.ChannelPostUpdate update) {
+        super(bot, update);
+        this.post = update.getChannelPost();
     }
 }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/ChatMemberJoinedEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/ChatMemberJoinedEvent.java
index f50fd9d0b..698905483 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/ChatMemberJoinedEvent.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/ChatMemberJoinedEvent.java
@@ -3,6 +3,7 @@
 import com.jtelegram.api.TelegramBot;
 import com.jtelegram.api.events.message.ServiceMessageEvent;
 import com.jtelegram.api.message.impl.service.NewChatMembersMessage;
+import com.jtelegram.api.update.Update;
 import com.jtelegram.api.user.User;
 import lombok.Getter;
 
@@ -14,8 +15,8 @@
 public class ChatMemberJoinedEvent extends ServiceMessageEvent {
     private List newMembers;
 
-    public ChatMemberJoinedEvent(TelegramBot bot, NewChatMembersMessage originMessage) {
-        super(bot, originMessage);
+    public ChatMemberJoinedEvent(TelegramBot bot, Update.MessageUpdate update, NewChatMembersMessage originMessage) {
+        super(bot, update, originMessage);
         this.newMembers = originMessage.getNewChatMembers();
     }
 }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/ChatMemberLeftEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/ChatMemberLeftEvent.java
index 49f41dd16..4472e99be 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/ChatMemberLeftEvent.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/ChatMemberLeftEvent.java
@@ -2,6 +2,7 @@
 
 import com.jtelegram.api.TelegramBot;
 import com.jtelegram.api.events.message.ServiceMessageEvent;
+import com.jtelegram.api.update.Update;
 import com.jtelegram.api.user.User;
 import com.jtelegram.api.message.impl.service.LeftChatMemberMessage;
 import lombok.Getter;
@@ -12,8 +13,8 @@
 public class ChatMemberLeftEvent extends ServiceMessageEvent {
     private User leftMember;
 
-    public ChatMemberLeftEvent(TelegramBot bot, LeftChatMemberMessage originMessage) {
-        super(bot, originMessage);
+    public ChatMemberLeftEvent(TelegramBot bot, Update.MessageUpdate update, LeftChatMemberMessage originMessage) {
+        super(bot, update, originMessage);
         this.leftMember = originMessage.getLeftChatMember();
     }
 }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/ChatMigratedFromChatEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/ChatMigratedFromChatEvent.java
index 96a886672..1f79f6c2a 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/ChatMigratedFromChatEvent.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/ChatMigratedFromChatEvent.java
@@ -4,6 +4,7 @@
 import com.jtelegram.api.chat.Chat;
 import com.jtelegram.api.events.message.ServiceMessageEvent;
 import com.jtelegram.api.message.impl.service.MigrateFromChatIdMessage;
+import com.jtelegram.api.update.Update;
 import lombok.Getter;
 import lombok.ToString;
 
@@ -12,8 +13,8 @@
 public class ChatMigratedFromChatEvent extends ServiceMessageEvent {
     private Chat newChat;
 
-    public ChatMigratedFromChatEvent(TelegramBot bot, MigrateFromChatIdMessage originMessage) {
-        super(bot, originMessage);
+    public ChatMigratedFromChatEvent(TelegramBot bot, Update.MessageUpdate update, MigrateFromChatIdMessage originMessage) {
+        super(bot, update, originMessage);
         this.newChat = originMessage.getChat();
     }
 }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/ChatMigratedToChatEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/ChatMigratedToChatEvent.java
index 3968f1bb6..7be2c3636 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/ChatMigratedToChatEvent.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/ChatMigratedToChatEvent.java
@@ -4,6 +4,7 @@
 import com.jtelegram.api.chat.Chat;
 import com.jtelegram.api.events.message.ServiceMessageEvent;
 import com.jtelegram.api.message.impl.service.MigrateToChatIdMessage;
+import com.jtelegram.api.update.Update;
 import lombok.Getter;
 import lombok.ToString;
 
@@ -12,8 +13,8 @@
 public class ChatMigratedToChatEvent extends ServiceMessageEvent {
     private Chat newChat;
 
-    public ChatMigratedToChatEvent(TelegramBot bot, MigrateToChatIdMessage originMessage) {
-        super(bot, originMessage);
+    public ChatMigratedToChatEvent(TelegramBot bot, Update.MessageUpdate update, MigrateToChatIdMessage originMessage) {
+        super(bot, update, originMessage);
         this.newChat = originMessage.getChat();
     }
 }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/ChatPhotoDeletedEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/ChatPhotoDeletedEvent.java
index 59fcda4d0..8763a0dfb 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/ChatPhotoDeletedEvent.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/ChatPhotoDeletedEvent.java
@@ -3,11 +3,12 @@
 import com.jtelegram.api.TelegramBot;
 import com.jtelegram.api.events.message.ServiceMessageEvent;
 import com.jtelegram.api.message.impl.service.DeleteChatPhotoMessage;
+import com.jtelegram.api.update.Update;
 import lombok.ToString;
 
 @ToString(callSuper = true)
 public class ChatPhotoDeletedEvent extends ServiceMessageEvent {
-    public ChatPhotoDeletedEvent(TelegramBot bot, DeleteChatPhotoMessage originMessage) {
-        super(bot, originMessage);
+    public ChatPhotoDeletedEvent(TelegramBot bot, Update.MessageUpdate update, DeleteChatPhotoMessage originMessage) {
+        super(bot, update, originMessage);
     }
 }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/GroupChatCreatedEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/GroupChatCreatedEvent.java
index 825574c6b..741d6afca 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/GroupChatCreatedEvent.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/GroupChatCreatedEvent.java
@@ -4,6 +4,7 @@
 import com.jtelegram.api.TelegramBot;
 import com.jtelegram.api.events.message.ServiceMessageEvent;
 import com.jtelegram.api.message.impl.service.GroupChatCreatedMessage;
+import com.jtelegram.api.update.Update;
 import lombok.Getter;
 import lombok.ToString;
 
@@ -12,8 +13,8 @@
 public class GroupChatCreatedEvent extends ServiceMessageEvent {
     private Chat newChat;
 
-    public GroupChatCreatedEvent(TelegramBot bot, GroupChatCreatedMessage originMessage) {
-        super(bot, originMessage);
+    public GroupChatCreatedEvent(TelegramBot bot, Update.MessageUpdate update, GroupChatCreatedMessage originMessage) {
+        super(bot, update, originMessage);
         this.newChat = originMessage.getChat();
     }
 }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/NewChatPhotoEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/NewChatPhotoEvent.java
index 791a2c962..8ce1d9064 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/NewChatPhotoEvent.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/NewChatPhotoEvent.java
@@ -4,6 +4,7 @@
 import com.jtelegram.api.events.message.ServiceMessageEvent;
 import com.jtelegram.api.message.impl.service.NewChatPhotoMessage;
 import com.jtelegram.api.message.media.PhotoSize;
+import com.jtelegram.api.update.Update;
 import java.util.List;
 import lombok.Getter;
 import lombok.ToString;
@@ -13,8 +14,8 @@
 public class NewChatPhotoEvent extends ServiceMessageEvent {
     private List newChatPhoto;
 
-    public NewChatPhotoEvent(TelegramBot bot, NewChatPhotoMessage originMessage) {
-        super(bot, originMessage);
+    public NewChatPhotoEvent(TelegramBot bot, Update.MessageUpdate update, NewChatPhotoMessage originMessage) {
+        super(bot, update, originMessage);
         this.newChatPhoto = originMessage.getNewChatPhoto();
     }
 }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/NewChatTitleEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/NewChatTitleEvent.java
index fcff36e48..2838b9394 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/NewChatTitleEvent.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/NewChatTitleEvent.java
@@ -3,6 +3,7 @@
 import com.jtelegram.api.events.message.ServiceMessageEvent;
 import com.jtelegram.api.message.impl.service.NewChatTitleMessage;
 import com.jtelegram.api.TelegramBot;
+import com.jtelegram.api.update.Update;
 import lombok.Getter;
 import lombok.ToString;
 
@@ -11,8 +12,8 @@
 public class NewChatTitleEvent extends ServiceMessageEvent {
     private String newTitle;
 
-    public NewChatTitleEvent(TelegramBot bot, NewChatTitleMessage originMessage) {
-        super(bot, originMessage);
+    public NewChatTitleEvent(TelegramBot bot, Update.MessageUpdate update, NewChatTitleMessage originMessage) {
+        super(bot, update, originMessage);
         this.newTitle = originMessage.getNewChatTitle();
     }
 }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/PinnedMessageEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/PinnedMessageEvent.java
index 55a31f2db..b3a708ea8 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/PinnedMessageEvent.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/PinnedMessageEvent.java
@@ -4,6 +4,7 @@
 import com.jtelegram.api.TelegramBot;
 import com.jtelegram.api.message.Message;
 import com.jtelegram.api.message.impl.service.PinnedMessageMessage;
+import com.jtelegram.api.update.Update;
 import lombok.Getter;
 import lombok.ToString;
 
@@ -12,8 +13,8 @@
 public class PinnedMessageEvent extends ServiceMessageEvent {
     private Message pinnedMessage;
 
-    public PinnedMessageEvent(TelegramBot bot, PinnedMessageMessage originMessage) {
-        super(bot, originMessage);
+    public PinnedMessageEvent(TelegramBot bot, Update.MessageUpdate update, PinnedMessageMessage originMessage) {
+        super(bot, update, originMessage);
         this.pinnedMessage = originMessage.getPinnedMessage();
     }
 }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/SupergroupChatCreatedEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/SupergroupChatCreatedEvent.java
new file mode 100644
index 000000000..0d17c66fd
--- /dev/null
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/SupergroupChatCreatedEvent.java
@@ -0,0 +1,20 @@
+package com.jtelegram.api.events.chat;
+
+import com.jtelegram.api.TelegramBot;
+import com.jtelegram.api.chat.Chat;
+import com.jtelegram.api.events.message.ServiceMessageEvent;
+import com.jtelegram.api.message.impl.service.SupergroupChatCreatedMessage;
+import com.jtelegram.api.update.Update;
+import lombok.Getter;
+import lombok.ToString;
+
+@Getter
+@ToString(callSuper = true)
+public class SupergroupChatCreatedEvent extends ServiceMessageEvent {
+    private Chat newChat;
+
+    public SupergroupChatCreatedEvent(TelegramBot bot, Update.MessageUpdate update, SupergroupChatCreatedMessage originMessage) {
+        super(bot, update, originMessage);
+        this.newChat = originMessage.getChat();
+    }
+}
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/UserLoggedInEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/UserLoggedInEvent.java
index f3b34bf7c..6ce857571 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/UserLoggedInEvent.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/UserLoggedInEvent.java
@@ -3,6 +3,7 @@
 import com.jtelegram.api.TelegramBot;
 import com.jtelegram.api.events.message.ServiceMessageEvent;
 import com.jtelegram.api.message.impl.service.UserLoggedInMessage;
+import com.jtelegram.api.update.Update;
 import lombok.ToString;
 
 /**
@@ -14,7 +15,7 @@
  */
 @ToString(callSuper = true)
 public class UserLoggedInEvent extends ServiceMessageEvent {
-    public UserLoggedInEvent(TelegramBot bot, UserLoggedInMessage originMessage) {
-        super(bot, originMessage);
+    public UserLoggedInEvent(TelegramBot bot, Update.MessageUpdate update, UserLoggedInMessage originMessage) {
+        super(bot, update, originMessage);
     }
 }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/inline/ChosenInlineResultEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/inline/ChosenInlineResultEvent.java
index 0f0803931..36479ae03 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/inline/ChosenInlineResultEvent.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/inline/ChosenInlineResultEvent.java
@@ -2,7 +2,9 @@
 
 import com.jtelegram.api.TelegramBot;
 import com.jtelegram.api.events.Event;
+import com.jtelegram.api.events.UpdateEvent;
 import com.jtelegram.api.inline.result.ChosenInlineResult;
+import com.jtelegram.api.update.Update;
 import lombok.Getter;
 import lombok.ToString;
 
@@ -11,11 +13,11 @@
  */
 @Getter
 @ToString(callSuper = true)
-public class ChosenInlineResultEvent extends Event {
+public class ChosenInlineResultEvent extends UpdateEvent {
     private ChosenInlineResult chosenResult;
 
-    public ChosenInlineResultEvent(TelegramBot bot, ChosenInlineResult chosenResult) {
-        super(bot);
-        this.chosenResult = chosenResult;
+    public ChosenInlineResultEvent(TelegramBot bot, Update.ChosenInlineResultUpdate update) {
+        super(bot, update);
+        this.chosenResult = update.getChosenInlineResult();
     }
 }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/inline/InlineQueryEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/inline/InlineQueryEvent.java
index 5b626fc6c..fa3b4121e 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/inline/InlineQueryEvent.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/inline/InlineQueryEvent.java
@@ -1,8 +1,9 @@
 package com.jtelegram.api.events.inline;
 
 import com.jtelegram.api.TelegramBot;
-import com.jtelegram.api.events.Event;
+import com.jtelegram.api.events.UpdateEvent;
 import com.jtelegram.api.inline.InlineQuery;
+import com.jtelegram.api.update.Update;
 import lombok.Getter;
 import lombok.ToString;
 
@@ -11,11 +12,11 @@
  */
 @Getter
 @ToString(callSuper = true)
-public class InlineQueryEvent extends Event {
+public class InlineQueryEvent extends UpdateEvent {
     private InlineQuery query;
 
-    public InlineQueryEvent(TelegramBot bot, InlineQuery query) {
-        super(bot);
-        this.query = query;
+    public InlineQueryEvent(TelegramBot bot, Update.InlineQueryUpdate update) {
+        super(bot, update);
+        this.query = update.getInlineQuery();
     }
 }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/inline/keyboard/CallbackQueryEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/inline/keyboard/CallbackQueryEvent.java
index 0b780d967..7a8334b68 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/inline/keyboard/CallbackQueryEvent.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/inline/keyboard/CallbackQueryEvent.java
@@ -1,18 +1,19 @@
 package com.jtelegram.api.events.inline.keyboard;
 
 import com.jtelegram.api.TelegramBot;
-import com.jtelegram.api.events.Event;
+import com.jtelegram.api.events.UpdateEvent;
 import com.jtelegram.api.inline.CallbackQuery;
+import com.jtelegram.api.update.Update;
 import lombok.Getter;
 import lombok.ToString;
 
 @Getter
 @ToString(callSuper = true)
-public class CallbackQueryEvent extends Event {
+public class CallbackQueryEvent extends UpdateEvent {
     private CallbackQuery query;
 
-    public CallbackQueryEvent(TelegramBot bot, CallbackQuery query) {
-        super(bot);
-        this.query = query;
+    public CallbackQueryEvent(TelegramBot bot, Update.CallbackQueryUpdate update) {
+        super(bot, update);
+        this.query = update.getCallbackQuery();
     }
 }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/location/LocationUpdateEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/location/LocationUpdateEvent.java
index f3d476f62..6e0b74ed7 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/location/LocationUpdateEvent.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/location/LocationUpdateEvent.java
@@ -1,20 +1,21 @@
 package com.jtelegram.api.events.location;
 
-import com.jtelegram.api.message.impl.LocationMessage;
 import com.jtelegram.api.TelegramBot;
-import com.jtelegram.api.events.Event;
+import com.jtelegram.api.events.UpdateEvent;
+import com.jtelegram.api.message.impl.LocationMessage;
 import com.jtelegram.api.message.media.Location;
+import com.jtelegram.api.update.Update;
 import lombok.Getter;
 import lombok.ToString;
 
 @Getter
 @ToString(callSuper = true)
-public class LocationUpdateEvent extends Event {
+public class LocationUpdateEvent extends UpdateEvent {
     private Location location;
     private LocationMessage message;
 
-    public LocationUpdateEvent(TelegramBot bot, LocationMessage message) {
-        super(bot);
+    public LocationUpdateEvent(TelegramBot bot, Update.EditedMessageUpdate update, LocationMessage message) {
+        super(bot, update);
         this.location = message.getLocation();
         this.message = message;
     }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/AnimationMessageEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/AnimationMessageEvent.java
index b3bdeb4e0..2979e63e5 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/AnimationMessageEvent.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/AnimationMessageEvent.java
@@ -2,9 +2,10 @@
 
 import com.jtelegram.api.TelegramBot;
 import com.jtelegram.api.message.impl.AnimationMessage;
+import com.jtelegram.api.update.Update;
 
 public class AnimationMessageEvent extends MessageEvent {
-    public AnimationMessageEvent(TelegramBot bot, AnimationMessage message) {
-        super(bot, message);
+    public AnimationMessageEvent(TelegramBot bot, Update.MessageUpdate update, AnimationMessage message) {
+        super(bot, update, message);
     }
 }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/AudioMessageEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/AudioMessageEvent.java
index 21a175fdf..eb5bc2482 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/AudioMessageEvent.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/AudioMessageEvent.java
@@ -2,11 +2,12 @@
 
 import com.jtelegram.api.TelegramBot;
 import com.jtelegram.api.message.impl.AudioMessage;
+import com.jtelegram.api.update.Update;
 import lombok.ToString;
 
 @ToString(callSuper = true)
 public class AudioMessageEvent extends MessageEvent {
-    public AudioMessageEvent(TelegramBot bot, AudioMessage message) {
-        super(bot, message);
+    public AudioMessageEvent(TelegramBot bot, Update.MessageUpdate update, AudioMessage message) {
+        super(bot, update, message);
     }
 }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/ContactMessageEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/ContactMessageEvent.java
index df2ed5729..167fe880b 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/ContactMessageEvent.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/ContactMessageEvent.java
@@ -2,11 +2,12 @@
 
 import com.jtelegram.api.TelegramBot;
 import com.jtelegram.api.message.impl.ContactMessage;
+import com.jtelegram.api.update.Update;
 import lombok.ToString;
 
 @ToString(callSuper = true)
 public class ContactMessageEvent extends MessageEvent {
-    public ContactMessageEvent(TelegramBot bot, ContactMessage message) {
-        super(bot, message);
+    public ContactMessageEvent(TelegramBot bot, Update.MessageUpdate update, ContactMessage message) {
+        super(bot, update, message);
     }
 }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/DocumentMessageEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/DocumentMessageEvent.java
index 12924263e..a0cdcb7a9 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/DocumentMessageEvent.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/DocumentMessageEvent.java
@@ -2,11 +2,12 @@
 
 import com.jtelegram.api.TelegramBot;
 import com.jtelegram.api.message.impl.DocumentMessage;
+import com.jtelegram.api.update.Update;
 import lombok.ToString;
 
 @ToString(callSuper = true)
 public class DocumentMessageEvent extends MessageEvent {
-    public DocumentMessageEvent(TelegramBot bot, DocumentMessage message) {
-        super(bot, message);
+    public DocumentMessageEvent(TelegramBot bot, Update.MessageUpdate update, DocumentMessage message) {
+        super(bot, update, message);
     }
 }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/GameMessageEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/GameMessageEvent.java
index 08dacd869..d1158d751 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/GameMessageEvent.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/GameMessageEvent.java
@@ -2,11 +2,12 @@
 
 import com.jtelegram.api.TelegramBot;
 import com.jtelegram.api.message.impl.GameMessage;
+import com.jtelegram.api.update.Update;
 import lombok.ToString;
 
 @ToString(callSuper = true)
 public class GameMessageEvent extends MessageEvent {
-    public GameMessageEvent(TelegramBot bot, GameMessage message) {
-        super(bot, message);
+    public GameMessageEvent(TelegramBot bot, Update.MessageUpdate update, GameMessage message) {
+        super(bot, update, message);
     }
 }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/InvoiceMessageEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/InvoiceMessageEvent.java
index f90785e88..71fb08a83 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/InvoiceMessageEvent.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/InvoiceMessageEvent.java
@@ -2,9 +2,10 @@
 
 import com.jtelegram.api.TelegramBot;
 import com.jtelegram.api.message.impl.InvoiceMessage;
+import com.jtelegram.api.update.Update;
 
 public class InvoiceMessageEvent extends MessageEvent {
-    public InvoiceMessageEvent(TelegramBot bot, InvoiceMessage message) {
-        super(bot, message);
+    public InvoiceMessageEvent(TelegramBot bot, Update.MessageUpdate update, InvoiceMessage message) {
+        super(bot, update, message);
     }
 }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/LocationMessageEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/LocationMessageEvent.java
index 315dcecdf..537ffc68d 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/LocationMessageEvent.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/LocationMessageEvent.java
@@ -2,11 +2,12 @@
 
 import com.jtelegram.api.message.impl.LocationMessage;
 import com.jtelegram.api.TelegramBot;
+import com.jtelegram.api.update.Update;
 import lombok.ToString;
 
 @ToString(callSuper = true)
 public class LocationMessageEvent extends MessageEvent {
-    public LocationMessageEvent(TelegramBot bot, LocationMessage message) {
-        super(bot, message);
+    public LocationMessageEvent(TelegramBot bot, Update.MessageUpdate update, LocationMessage message) {
+        super(bot, update, message);
     }
 }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/MessageEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/MessageEvent.java
index 6841690b8..84f1e5c42 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/MessageEvent.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/MessageEvent.java
@@ -1,18 +1,19 @@
 package com.jtelegram.api.events.message;
 
 import com.jtelegram.api.TelegramBot;
-import com.jtelegram.api.events.Event;
+import com.jtelegram.api.events.UpdateEvent;
 import com.jtelegram.api.message.Message;
+import com.jtelegram.api.update.Update;
 import lombok.Getter;
 import lombok.ToString;
 
 @ToString(callSuper = true)
-public class MessageEvent extends Event {
+public class MessageEvent> extends UpdateEvent {
     @Getter
     private T message;
 
-    public MessageEvent(TelegramBot bot, T message) {
-        super(bot);
+    public MessageEvent(TelegramBot bot, Update.MessageUpdate update, T message) {
+        super(bot, update);
         this.message = message;
     }
 }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/PhotoMessageEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/PhotoMessageEvent.java
index 80901684b..cd94413ca 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/PhotoMessageEvent.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/PhotoMessageEvent.java
@@ -2,11 +2,12 @@
 
 import com.jtelegram.api.TelegramBot;
 import com.jtelegram.api.message.impl.PhotoMessage;
+import com.jtelegram.api.update.Update;
 import lombok.ToString;
 
 @ToString(callSuper = true)
 public class PhotoMessageEvent extends MessageEvent {
-    public PhotoMessageEvent(TelegramBot bot, PhotoMessage message) {
-        super(bot, message);
+    public PhotoMessageEvent(TelegramBot bot, Update.MessageUpdate update, PhotoMessage message) {
+        super(bot, update, message);
     }
 }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/ServiceMessageEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/ServiceMessageEvent.java
index afc0a0109..4fa0eb3ab 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/ServiceMessageEvent.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/ServiceMessageEvent.java
@@ -2,11 +2,12 @@
 
 import com.jtelegram.api.message.impl.service.ServiceMessage;
 import com.jtelegram.api.TelegramBot;
+import com.jtelegram.api.update.Update;
 import lombok.ToString;
 
 @ToString(callSuper = true)
 public abstract class ServiceMessageEvent extends MessageEvent {
-    protected ServiceMessageEvent(TelegramBot bot, T originMessage) {
-        super(bot, originMessage);
+    protected ServiceMessageEvent(TelegramBot bot, Update.MessageUpdate update, T originMessage) {
+        super(bot, update, originMessage);
     }
 }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/StickerMessageEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/StickerMessageEvent.java
index 1d234134a..5356764a6 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/StickerMessageEvent.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/StickerMessageEvent.java
@@ -2,11 +2,12 @@
 
 import com.jtelegram.api.TelegramBot;
 import com.jtelegram.api.message.impl.StickerMessage;
+import com.jtelegram.api.update.Update;
 import lombok.ToString;
 
 @ToString(callSuper = true)
 public class StickerMessageEvent extends MessageEvent {
-    public StickerMessageEvent(TelegramBot bot, StickerMessage message) {
-        super(bot, message);
+    public StickerMessageEvent(TelegramBot bot, Update.MessageUpdate update, StickerMessage message) {
+        super(bot, update, message);
     }
 }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/TextMessageEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/TextMessageEvent.java
index 21537d062..1764cc67e 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/TextMessageEvent.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/TextMessageEvent.java
@@ -2,11 +2,12 @@
 
 import com.jtelegram.api.message.impl.TextMessage;
 import com.jtelegram.api.TelegramBot;
+import com.jtelegram.api.update.Update;
 import lombok.ToString;
 
 @ToString(callSuper = true)
 public class TextMessageEvent extends MessageEvent {
-    public TextMessageEvent(TelegramBot bot, TextMessage message) {
-        super(bot, message);
+    public TextMessageEvent(TelegramBot bot, Update.MessageUpdate update, TextMessage message) {
+        super(bot, update, message);
     }
 }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/VenueMessageEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/VenueMessageEvent.java
index 74092832a..cb9a83124 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/VenueMessageEvent.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/VenueMessageEvent.java
@@ -2,11 +2,12 @@
 
 import com.jtelegram.api.TelegramBot;
 import com.jtelegram.api.message.impl.VenueMessage;
+import com.jtelegram.api.update.Update;
 import lombok.ToString;
 
 @ToString(callSuper = true)
 public class VenueMessageEvent extends MessageEvent {
-    public VenueMessageEvent(TelegramBot bot, VenueMessage message) {
-        super(bot, message);
+    public VenueMessageEvent(TelegramBot bot, Update.MessageUpdate update, VenueMessage message) {
+        super(bot, update, message);
     }
 }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/VideoMessageEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/VideoMessageEvent.java
index d9945ee78..c67c44ca9 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/VideoMessageEvent.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/VideoMessageEvent.java
@@ -2,11 +2,12 @@
 
 import com.jtelegram.api.message.impl.VideoMessage;
 import com.jtelegram.api.TelegramBot;
+import com.jtelegram.api.update.Update;
 import lombok.ToString;
 
 @ToString(callSuper = true)
 public class VideoMessageEvent extends MessageEvent {
-    public VideoMessageEvent(TelegramBot bot, VideoMessage message) {
-        super(bot, message);
+    public VideoMessageEvent(TelegramBot bot, Update.MessageUpdate update, VideoMessage message) {
+        super(bot, update, message);
     }
 }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/VideoNoteMessageEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/VideoNoteMessageEvent.java
index c66bcee09..909b3eb22 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/VideoNoteMessageEvent.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/VideoNoteMessageEvent.java
@@ -2,11 +2,12 @@
 
 import com.jtelegram.api.TelegramBot;
 import com.jtelegram.api.message.impl.VideoNoteMessage;
+import com.jtelegram.api.update.Update;
 import lombok.ToString;
 
 @ToString(callSuper = true)
 public class VideoNoteMessageEvent extends MessageEvent {
-    public VideoNoteMessageEvent(TelegramBot bot, VideoNoteMessage message) {
-        super(bot, message);
+    public VideoNoteMessageEvent(TelegramBot bot, Update.MessageUpdate update, VideoNoteMessage message) {
+        super(bot, update, message);
     }
 }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/VoiceMessageEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/VoiceMessageEvent.java
index 695441fa9..941cda54b 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/VoiceMessageEvent.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/VoiceMessageEvent.java
@@ -2,11 +2,12 @@
 
 import com.jtelegram.api.TelegramBot;
 import com.jtelegram.api.message.impl.VoiceMessage;
+import com.jtelegram.api.update.Update;
 import lombok.ToString;
 
 @ToString(callSuper = true)
 public class VoiceMessageEvent extends MessageEvent {
-    public VoiceMessageEvent(TelegramBot bot, VoiceMessage message) {
-        super(bot, message);
+    public VoiceMessageEvent(TelegramBot bot, Update.MessageUpdate update, VoiceMessage message) {
+        super(bot, update, message);
     }
 }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/edit/CaptionEditEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/edit/CaptionEditEvent.java
index fe8cd73ad..8b4c47e8c 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/edit/CaptionEditEvent.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/edit/CaptionEditEvent.java
@@ -1,18 +1,19 @@
 package com.jtelegram.api.events.message.edit;
 
 import com.jtelegram.api.TelegramBot;
-import com.jtelegram.api.events.Event;
+import com.jtelegram.api.events.UpdateEvent;
 import com.jtelegram.api.message.CaptionableMessage;
+import com.jtelegram.api.update.Update;
 import lombok.Getter;
 import lombok.ToString;
 
 @ToString(callSuper = true)
-public class CaptionEditEvent extends Event {
+public class CaptionEditEvent extends UpdateEvent {
     @Getter
     private CaptionableMessage message;
 
-    public CaptionEditEvent(TelegramBot bot, CaptionableMessage message) {
-        super(bot);
+    public CaptionEditEvent(TelegramBot bot, Update.EditedMessageUpdate update, CaptionableMessage message) {
+        super(bot, update);
         this.message = message;
     }
 }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/edit/TextMessageEditEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/edit/TextMessageEditEvent.java
index e4da2e54b..caedcd837 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/edit/TextMessageEditEvent.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/edit/TextMessageEditEvent.java
@@ -1,18 +1,20 @@
 package com.jtelegram.api.events.message.edit;
 
+import com.jtelegram.api.events.UpdateEvent;
 import com.jtelegram.api.message.impl.TextMessage;
 import com.jtelegram.api.TelegramBot;
 import com.jtelegram.api.events.Event;
+import com.jtelegram.api.update.Update;
 import lombok.Getter;
 import lombok.ToString;
 
 @ToString(callSuper = true)
-public class TextMessageEditEvent extends Event {
+public class TextMessageEditEvent extends UpdateEvent {
     @Getter
     private TextMessage newMessage;
 
-    public TextMessageEditEvent(TelegramBot bot, TextMessage newMessage) {
-        super(bot);
+    public TextMessageEditEvent(TelegramBot bot, Update.EditedMessageUpdate update, TextMessage newMessage) {
+        super(bot, update);
         this.newMessage = newMessage;
     }
 }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/payment/PreCheckoutQueryEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/payment/PreCheckoutQueryEvent.java
index c2c0a29c9..dc4cde810 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/payment/PreCheckoutQueryEvent.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/payment/PreCheckoutQueryEvent.java
@@ -2,17 +2,19 @@
 
 import com.jtelegram.api.TelegramBot;
 import com.jtelegram.api.events.Event;
+import com.jtelegram.api.events.UpdateEvent;
 import com.jtelegram.api.message.payments.PreCheckoutQuery;
+import com.jtelegram.api.update.Update;
 import lombok.Getter;
 import lombok.ToString;
 
 @Getter
 @ToString(callSuper = true)
-public class PreCheckoutQueryEvent extends Event {
+public class PreCheckoutQueryEvent extends UpdateEvent {
     private PreCheckoutQuery checkoutQuery;
 
-    public PreCheckoutQueryEvent(TelegramBot bot, PreCheckoutQuery checkoutQuery) {
-        super(bot);
-        this.checkoutQuery = checkoutQuery;
+    public PreCheckoutQueryEvent(TelegramBot bot, Update.PreCheckoutQueryUpdate update) {
+        super(bot, update);
+        this.checkoutQuery = update.getPreCheckoutQuery();
     }
 }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/payment/ShippingQueryEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/payment/ShippingQueryEvent.java
index d297143ca..c960713f1 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/payment/ShippingQueryEvent.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/payment/ShippingQueryEvent.java
@@ -1,19 +1,20 @@
 package com.jtelegram.api.events.payment;
 
 import com.jtelegram.api.TelegramBot;
-import com.jtelegram.api.events.Event;
+import com.jtelegram.api.events.UpdateEvent;
 import com.jtelegram.api.message.payments.ShippingQuery;
+import com.jtelegram.api.update.Update;
 import lombok.ToString;
 
 /**
  * When a new shipping query is received
  */
 @ToString(callSuper = true)
-public class ShippingQueryEvent extends Event {
+public class ShippingQueryEvent extends UpdateEvent {
     private ShippingQuery shippingQuery;
 
-    public ShippingQueryEvent(TelegramBot bot, ShippingQuery shippingQuery) {
-        super(bot);
-        this.shippingQuery = shippingQuery;
+    public ShippingQueryEvent(TelegramBot bot, Update.ShippingQueryUpdate update) {
+        super(bot, update);
+        this.shippingQuery = update.getShippingQuery();
     }
 }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/payment/SuccessfulPaymentEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/payment/SuccessfulPaymentEvent.java
index 37d59dfc0..8d3d4d646 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/payment/SuccessfulPaymentEvent.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/payment/SuccessfulPaymentEvent.java
@@ -4,6 +4,7 @@
 import com.jtelegram.api.message.impl.SuccessfulPaymentMessage;
 import com.jtelegram.api.message.payments.SuccessfulPayment;
 import com.jtelegram.api.TelegramBot;
+import com.jtelegram.api.update.Update;
 import lombok.Getter;
 import lombok.ToString;
 
@@ -12,8 +13,8 @@
 public class SuccessfulPaymentEvent extends MessageEvent {
     private SuccessfulPayment payment;
 
-    public SuccessfulPaymentEvent(TelegramBot bot, SuccessfulPaymentMessage message) {
-        super(bot, message);
+    public SuccessfulPaymentEvent(TelegramBot bot, Update.MessageUpdate update, SuccessfulPaymentMessage message) {
+        super(bot, update, message);
         this.payment = message.getSuccessfulPayment();
     }
 }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/CallbackQuery.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/CallbackQuery.java
index e784988bc..d342853ab 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/CallbackQuery.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/CallbackQuery.java
@@ -1,5 +1,6 @@
 package com.jtelegram.api.inline;
 
+import com.jtelegram.api.update.UpdateContents;
 import com.jtelegram.api.user.User;
 import com.jtelegram.api.message.Message;
 import lombok.AccessLevel;
@@ -12,7 +13,7 @@
 @ToString
 @EqualsAndHashCode(of = "id")
 @NoArgsConstructor(access = AccessLevel.PROTECTED)
-public class CallbackQuery {
+public class CallbackQuery implements UpdateContents {
     private String id;
     private User from;
     private Message message;
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/InlineQuery.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/InlineQuery.java
index 0f5280c50..17ccc9ff4 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/InlineQuery.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/InlineQuery.java
@@ -1,5 +1,6 @@
 package com.jtelegram.api.inline;
 
+import com.jtelegram.api.update.UpdateContents;
 import com.jtelegram.api.user.User;
 import com.jtelegram.api.message.media.Location;
 import lombok.*;
@@ -8,7 +9,7 @@
 @ToString
 @EqualsAndHashCode(of = "id")
 @NoArgsConstructor(access = AccessLevel.PROTECTED)
-public class InlineQuery {
+public class InlineQuery implements UpdateContents {
     private String id;
     private User from;
     private Location location;
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/ChosenInlineResult.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/ChosenInlineResult.java
index 6f0a35cb9..dfabba5f1 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/ChosenInlineResult.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/ChosenInlineResult.java
@@ -1,6 +1,7 @@
 package com.jtelegram.api.inline.result;
 
 import com.jtelegram.api.message.media.Location;
+import com.jtelegram.api.update.UpdateContents;
 import com.jtelegram.api.user.User;
 import lombok.*;
 
@@ -8,7 +9,7 @@
 @ToString
 @EqualsAndHashCode(of = "resultId")
 @NoArgsConstructor(access = AccessLevel.PROTECTED)
-public class ChosenInlineResult {
+public class ChosenInlineResult implements UpdateContents {
     private String resultId;
     private User from;
     private String query;
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultAudio.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultAudio.java
index 80c1da9e8..88314919e 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultAudio.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultAudio.java
@@ -4,6 +4,7 @@
 import com.jtelegram.api.inline.keyboard.InlineKeyboardMarkup;
 import com.jtelegram.api.inline.result.framework.InlineResult;
 import com.jtelegram.api.inline.input.InputMessageContent;
+import com.jtelegram.api.requests.message.framework.ParseMode;
 import lombok.Builder;
 import lombok.Getter;
 import lombok.ToString;
@@ -14,6 +15,7 @@ public class InlineResultAudio extends InlineResult implements InlineResult.Dura
         InlineResult.Titled, InlineResult.Urlable {
     private String title;
     private String caption;
+    private ParseMode captionParseMode;
     private String performer;
     @SerializedName("audio_duration")
     private Integer duration;
@@ -21,10 +23,11 @@ public class InlineResultAudio extends InlineResult implements InlineResult.Dura
     private String url;
 
     @Builder
-    private InlineResultAudio(String id, InlineKeyboardMarkup replyMarkup, InputMessageContent inputMessageContent, String title, String caption, String performer, Integer duration, String url) {
+    private InlineResultAudio(String id, InlineKeyboardMarkup replyMarkup, InputMessageContent inputMessageContent, String title, String caption, ParseMode captionParseMode, String performer, Integer duration, String url) {
         super(id, replyMarkup, inputMessageContent);
         this.title = title;
         this.caption = caption;
+        this.captionParseMode = captionParseMode;
         this.performer = performer;
         this.duration = duration;
         this.url = url;
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultDocument.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultDocument.java
index 2acb5c371..66da2cc11 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultDocument.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultDocument.java
@@ -5,6 +5,7 @@
 import com.jtelegram.api.inline.keyboard.InlineKeyboardMarkup;
 import com.jtelegram.api.inline.result.framework.DimensionalThumbableInlineResult;
 import com.jtelegram.api.inline.result.framework.InlineResult;
+import com.jtelegram.api.requests.message.framework.ParseMode;
 import lombok.Builder;
 import lombok.Getter;
 import lombok.ToString;
@@ -15,6 +16,7 @@ public class InlineResultDocument extends DimensionalThumbableInlineResult imple
         InlineResult.Captioned, InlineResult.Describeable, InlineResult.Urlable {
     private String title;
     private String caption;
+    private ParseMode captionParseMode;
     private String description;
     private String mimeType;
     @SerializedName("document_url")
@@ -22,7 +24,8 @@ public class InlineResultDocument extends DimensionalThumbableInlineResult imple
 
     @Builder
     private InlineResultDocument(String id, InlineKeyboardMarkup replyMarkup, InputMessageContent inputMessageContent, String thumbUrl,
-                                 Integer thumbWidth, Integer thumbHeight, String title, String caption, String description, String mimeType, String url) {
+                                 Integer thumbWidth, Integer thumbHeight, String title, String caption, ParseMode captionParseMode,
+                                 String description, String mimeType, String url) {
         super(id, replyMarkup, inputMessageContent, thumbUrl, thumbWidth, thumbHeight);
         this.title = title;
         this.caption = caption;
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultGif.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultGif.java
index f9c3f444b..52713506f 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultGif.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultGif.java
@@ -5,6 +5,7 @@
 import com.jtelegram.api.inline.result.framework.InlineResult;
 import com.jtelegram.api.inline.input.InputMessageContent;
 import com.jtelegram.api.inline.result.framework.ThumbableInlineResult;
+import com.jtelegram.api.requests.message.framework.ParseMode;
 import lombok.Builder;
 import lombok.Getter;
 import lombok.ToString;
@@ -15,6 +16,7 @@ public class InlineResultGif extends ThumbableInlineResult implements InlineResu
         InlineResult.Titled, InlineResult.Captioned, InlineResult.Duratable {
     private String title;
     private String caption;
+    private ParseMode captionParseMode;
     @SerializedName("gif_url")
     private String url;
     @SerializedName("gif_width")
@@ -25,10 +27,11 @@ public class InlineResultGif extends ThumbableInlineResult implements InlineResu
     private Integer duration;
 
     @Builder
-    private InlineResultGif(String id, InlineKeyboardMarkup replyMarkup, InputMessageContent inputMessageContent, String thumbUrl, String title, String caption, String url, Integer width, Integer height, Integer duration) {
+    private InlineResultGif(String id, InlineKeyboardMarkup replyMarkup, InputMessageContent inputMessageContent, String thumbUrl, String title, String caption, ParseMode captionParseMode, String url, Integer width, Integer height, Integer duration) {
         super(id, replyMarkup, inputMessageContent, thumbUrl);
         this.title = title;
         this.caption = caption;
+        this.captionParseMode = captionParseMode;
         this.url = url;
         this.width = width;
         this.height = height;
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultMpegGif.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultMpegGif.java
index 685f7b4bf..162318b67 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultMpegGif.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultMpegGif.java
@@ -5,6 +5,7 @@
 import com.jtelegram.api.inline.result.framework.InlineResult;
 import com.jtelegram.api.inline.input.InputMessageContent;
 import com.jtelegram.api.inline.result.framework.ThumbableInlineResult;
+import com.jtelegram.api.requests.message.framework.ParseMode;
 import lombok.Builder;
 import lombok.Getter;
 import lombok.ToString;
@@ -15,6 +16,7 @@ public class InlineResultMpegGif extends ThumbableInlineResult implements Inline
         InlineResult.Titled, InlineResult.Captioned, InlineResult.Duratable {
     private String title;
     private String caption;
+    private  ParseMode captionParseMode;
     @SerializedName("mpeg4_duration")
     private Integer duration;
     @SerializedName("mpeg4_width")
@@ -25,10 +27,11 @@ public class InlineResultMpegGif extends ThumbableInlineResult implements Inline
     private String url;
 
     @Builder
-    private InlineResultMpegGif(String id, InlineKeyboardMarkup replyMarkup, InputMessageContent inputMessageContent, String thumbUrl, String title, String caption, Integer duration, Integer width, Integer height, String url) {
+    private InlineResultMpegGif(String id, InlineKeyboardMarkup replyMarkup, InputMessageContent inputMessageContent, String thumbUrl, String title, String caption, ParseMode captionParseMode, Integer duration, Integer width, Integer height, String url) {
         super(id, replyMarkup, inputMessageContent, thumbUrl);
         this.title = title;
         this.caption = caption;
+        this.captionParseMode = captionParseMode;
         this.duration = duration;
         this.width = width;
         this.height = height;
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultPhoto.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultPhoto.java
index fd8beedc0..320be8d90 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultPhoto.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultPhoto.java
@@ -5,6 +5,7 @@
 import com.jtelegram.api.inline.keyboard.InlineKeyboardMarkup;
 import com.jtelegram.api.inline.result.framework.InlineResult;
 import com.jtelegram.api.inline.result.framework.ThumbableInlineResult;
+import com.jtelegram.api.requests.message.framework.ParseMode;
 import lombok.Builder;
 import lombok.Getter;
 import lombok.ToString;
@@ -14,6 +15,7 @@
 public class InlineResultPhoto extends ThumbableInlineResult implements InlineResult.Visual,
         InlineResult.Titled, InlineResult.Captioned, InlineResult.Describeable {
     private String caption;
+    private ParseMode captionParseMode;
     private String title;
     private String description;
     @SerializedName("photo_url")
@@ -25,9 +27,10 @@ public class InlineResultPhoto extends ThumbableInlineResult implements InlineRe
 
     @Builder
     private InlineResultPhoto(String id, InlineKeyboardMarkup replyMarkup, InputMessageContent inputMessageContent, String thumbUrl,
-                              String caption, String title, String description, String url, Integer width, Integer height) {
+                              String caption, ParseMode captionParseMode, String title, String description, String url, Integer width, Integer height) {
         super(id, replyMarkup, inputMessageContent, thumbUrl);
         this.caption = caption;
+        this.captionParseMode = captionParseMode;
         this.title = title;
         this.description = description;
         this.url = url;
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultVideo.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultVideo.java
index 0cabdb152..6c79eabe7 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultVideo.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultVideo.java
@@ -5,6 +5,7 @@
 import com.jtelegram.api.inline.result.framework.InlineResult;
 import com.jtelegram.api.inline.result.framework.ThumbableInlineResult;
 import com.jtelegram.api.inline.input.InputMessageContent;
+import com.jtelegram.api.requests.message.framework.ParseMode;
 import lombok.Builder;
 import lombok.Getter;
 import lombok.ToString;
@@ -16,6 +17,7 @@ public class InlineResultVideo extends ThumbableInlineResult implements InlineRe
     private String description;
     private String title;
     private String caption;
+    private ParseMode captionParseMode;
     private String mimeType;
     @SerializedName("video_url")
     private String url;
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultVoice.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultVoice.java
index eddbdc0c5..bef01ae14 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultVoice.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultVoice.java
@@ -4,6 +4,7 @@
 import com.jtelegram.api.inline.result.framework.InlineResult;
 import com.jtelegram.api.inline.input.InputMessageContent;
 import com.jtelegram.api.inline.keyboard.InlineKeyboardMarkup;
+import com.jtelegram.api.requests.message.framework.ParseMode;
 import lombok.Builder;
 import lombok.Getter;
 import lombok.ToString;
@@ -14,6 +15,7 @@ public class InlineResultVoice extends InlineResult implements InlineResult.Urla
         InlineResult.Titled, InlineResult.Duratable {
     private String title;
     private String caption;
+    private ParseMode captionParseMode;
     @SerializedName("voice_duration")
     private Integer duration;
     @SerializedName("voice_url")
@@ -21,10 +23,11 @@ public class InlineResultVoice extends InlineResult implements InlineResult.Urla
 
     @Builder
     private InlineResultVoice(String id, InlineKeyboardMarkup replyMarkup, InputMessageContent inputMessageContent,
-                              String title, String caption, Integer duration, String url) {
+                              String title, String caption, ParseMode captionParseMode, Integer duration, String url) {
         super(id, replyMarkup, inputMessageContent);
         this.title = title;
         this.caption = caption;
+        this.captionParseMode = captionParseMode;
         this.duration = duration;
         this.url = url;
     }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultAudio.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultAudio.java
index 19e395d4e..7beda5d1e 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultAudio.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultAudio.java
@@ -5,6 +5,7 @@
 import com.jtelegram.api.inline.result.framework.InlineResult;
 import com.jtelegram.api.message.input.file.IdInputFile;
 import com.jtelegram.api.inline.input.InputMessageContent;
+import com.jtelegram.api.requests.message.framework.ParseMode;
 import lombok.Builder;
 import lombok.Getter;
 import lombok.ToString;
@@ -15,12 +16,14 @@ public class InlineCachedResultAudio extends InlineResult implements InlineResul
     @SerializedName("audio_file_id")
     private IdInputFile fileId;
     private String caption;
+    private ParseMode captionParseMode;
 
     @Builder
     private InlineCachedResultAudio(String id, InlineKeyboardMarkup replyMarkup, InputMessageContent inputMessageContent,
-                                    IdInputFile fileId, String caption) {
+                                    IdInputFile fileId, String caption, ParseMode captionParseMode) {
         super(id, replyMarkup, inputMessageContent);
         this.fileId = fileId;
         this.caption = caption;
+        this.captionParseMode = captionParseMode;
     }
 }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultDocument.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultDocument.java
index 6b3d3ec59..64b98d1c7 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultDocument.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultDocument.java
@@ -5,6 +5,7 @@
 import com.jtelegram.api.inline.result.framework.InlineResult;
 import com.jtelegram.api.message.input.file.IdInputFile;
 import com.jtelegram.api.inline.input.InputMessageContent;
+import com.jtelegram.api.requests.message.framework.ParseMode;
 import lombok.Builder;
 import lombok.Getter;
 import lombok.ToString;
@@ -17,13 +18,15 @@ public class InlineCachedResultDocument extends InlineResult implements InlineRe
     private IdInputFile fileId;
     private String title;
     private String caption;
+    private ParseMode captionParseMode;
 
     @Builder
     private InlineCachedResultDocument(String id, InlineKeyboardMarkup replyMarkup, InputMessageContent inputMessageContent,
-                                       IdInputFile fileId, String title, String caption) {
+                                       IdInputFile fileId, String title, String caption, ParseMode captionParseMode) {
         super(id, replyMarkup, inputMessageContent);
         this.fileId = fileId;
         this.title = title;
         this.caption = caption;
+        this.captionParseMode = captionParseMode;
     }
 }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultGif.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultGif.java
index 735d0a38d..09d16e7ec 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultGif.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultGif.java
@@ -5,6 +5,7 @@
 import com.jtelegram.api.inline.result.framework.InlineResult;
 import com.jtelegram.api.message.input.file.IdInputFile;
 import com.jtelegram.api.inline.input.InputMessageContent;
+import com.jtelegram.api.requests.message.framework.ParseMode;
 import lombok.Builder;
 import lombok.Getter;
 import lombok.ToString;
@@ -17,13 +18,15 @@ public class InlineCachedResultGif extends InlineResult implements InlineResult.
     private IdInputFile fileId;
     private String title;
     private String caption;
+    private ParseMode captionParseMode;
 
     @Builder
     private InlineCachedResultGif(String id, InlineKeyboardMarkup replyMarkup, InputMessageContent inputMessageContent,
-                                  IdInputFile fileId, String title, String caption) {
+                                  IdInputFile fileId, String title, String caption, ParseMode captionParseMode) {
         super(id, replyMarkup, inputMessageContent);
         this.fileId = fileId;
         this.title = title;
         this.caption = caption;
+        this.captionParseMode = captionParseMode;
     }
 }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultMpegGif.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultMpegGif.java
index c8437267d..a2336b19b 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultMpegGif.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultMpegGif.java
@@ -5,6 +5,7 @@
 import com.jtelegram.api.inline.keyboard.InlineKeyboardMarkup;
 import com.jtelegram.api.inline.result.framework.InlineResult;
 import com.jtelegram.api.message.input.file.IdInputFile;
+import com.jtelegram.api.requests.message.framework.ParseMode;
 import lombok.Builder;
 import lombok.Getter;
 import lombok.ToString;
@@ -17,13 +18,15 @@ public class InlineCachedResultMpegGif extends InlineResult implements InlineRes
     private IdInputFile fileId;
     private String title;
     private String caption;
+    private ParseMode captionParseMode;
 
     @Builder
     private InlineCachedResultMpegGif(String id, InlineKeyboardMarkup replyMarkup, InputMessageContent inputMessageContent,
-                                      IdInputFile fileId, String title, String caption) {
+                                      IdInputFile fileId, String title, String caption, ParseMode captionParseMode) {
         super(id, replyMarkup, inputMessageContent);
         this.fileId = fileId;
         this.title = title;
         this.caption = caption;
+        this.captionParseMode = captionParseMode;
     }
 }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultPhoto.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultPhoto.java
index 221fc2b56..aa150abd6 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultPhoto.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultPhoto.java
@@ -5,6 +5,7 @@
 import com.jtelegram.api.message.input.file.IdInputFile;
 import com.jtelegram.api.inline.input.InputMessageContent;
 import com.jtelegram.api.inline.keyboard.InlineKeyboardMarkup;
+import com.jtelegram.api.requests.message.framework.ParseMode;
 import lombok.Builder;
 import lombok.Getter;
 import lombok.ToString;
@@ -17,15 +18,17 @@ public class InlineCachedResultPhoto extends InlineResult implements InlineResul
     private IdInputFile fileId;
     private String description;
     private String caption;
+    private ParseMode captionParseMode;
     private String title;
 
     @Builder
     private InlineCachedResultPhoto(String id, InlineKeyboardMarkup replyMarkup, InputMessageContent inputMessageContent,
-                                   IdInputFile fileId, String description, String caption, String title) {
+                                   IdInputFile fileId, String description, String caption, ParseMode captionParseMode, String title) {
         super(id, replyMarkup, inputMessageContent);
         this.fileId = fileId;
         this.description = description;
         this.caption = caption;
+        this.captionParseMode = captionParseMode;
         this.title = title;
     }
 }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultVideo.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultVideo.java
index 191325a40..0c2bb2892 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultVideo.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultVideo.java
@@ -5,6 +5,7 @@
 import com.jtelegram.api.inline.result.framework.InlineResult;
 import com.jtelegram.api.message.input.file.IdInputFile;
 import com.jtelegram.api.inline.input.InputMessageContent;
+import com.jtelegram.api.requests.message.framework.ParseMode;
 import lombok.Builder;
 import lombok.Getter;
 import lombok.ToString;
@@ -17,13 +18,15 @@ public class InlineCachedResultVideo extends InlineResult implements InlineResul
     private IdInputFile fileId;
     private String title;
     private String caption;
+    private ParseMode captionParseMode;
 
     @Builder
     private InlineCachedResultVideo(String id, InlineKeyboardMarkup replyMarkup, InputMessageContent inputMessageContent,
-                                    IdInputFile fileId, String title, String caption) {
+                                    IdInputFile fileId, String title, String caption, ParseMode captionParseMode) {
         super(id, replyMarkup, inputMessageContent);
         this.fileId = fileId;
         this.title = title;
         this.caption = caption;
+        this.captionParseMode = captionParseMode;
     }
 }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultVoice.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultVoice.java
index 4dcc3b9b5..e5cf7e2d3 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultVoice.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultVoice.java
@@ -5,6 +5,7 @@
 import com.jtelegram.api.inline.keyboard.InlineKeyboardMarkup;
 import com.jtelegram.api.inline.result.framework.InlineResult;
 import com.jtelegram.api.message.input.file.IdInputFile;
+import com.jtelegram.api.requests.message.framework.ParseMode;
 import lombok.Builder;
 import lombok.Getter;
 import lombok.ToString;
@@ -17,14 +18,16 @@ public class InlineCachedResultVoice extends InlineResult implements InlineResul
     private IdInputFile fileId;
     private String title;
     private String caption;
+    private ParseMode captionParseMode;
 
     @Builder
     private InlineCachedResultVoice(String id, InlineKeyboardMarkup replyMarkup, InputMessageContent inputMessageContent,
-                                    IdInputFile fileId, String title, String caption) {
+                                    IdInputFile fileId, String title, String caption, ParseMode captionParseMode) {
         super(id, replyMarkup, inputMessageContent);
         this.fileId = fileId;
         this.title = title;
         this.caption = caption;
+        this.captionParseMode = captionParseMode;
     }
 }
 
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/framework/InlineResult.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/framework/InlineResult.java
index a74555671..ce40e2314 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/framework/InlineResult.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/framework/InlineResult.java
@@ -3,6 +3,7 @@
 import com.jtelegram.api.inline.input.InputMessageContent;
 import com.jtelegram.api.inline.keyboard.InlineKeyboardMarkup;
 import com.jtelegram.api.message.input.file.IdInputFile;
+import com.jtelegram.api.requests.message.framework.ParseMode;
 import lombok.Getter;
 import lombok.ToString;
 
@@ -26,6 +27,7 @@ public interface Cached {
 
     public interface Captioned {
         String getCaption();
+        ParseMode getCaptionParseMode();
     }
 
     public interface Describeable {
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/Message.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/Message.java
index ddebe8cc6..eeaeb26d9 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/Message.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/Message.java
@@ -9,6 +9,7 @@
 import com.jtelegram.api.requests.message.DeleteMessage;
 import com.jtelegram.api.requests.message.ForwardMessage;
 import com.jtelegram.api.requests.message.edit.EditMessageReplyMarkup;
+import com.jtelegram.api.update.UpdateContents;
 import com.jtelegram.api.user.User;
 import java.lang.reflect.Type;
 import lombok.Getter;
@@ -16,7 +17,7 @@
 
 @Getter
 @ToString
-public abstract class Message {
+public abstract class Message implements UpdateContents {
     private int messageId;
     private User from;
     private long date;
@@ -70,8 +71,8 @@ public static class Deserializer implements JsonDeserializer {
         public Message deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext context) throws JsonParseException {
             JsonObject object = jsonElement.getAsJsonObject();
 
-            for (MessageType messageType : MessageType.values()) {
-                if (object.has(messageType.name().toLowerCase())) {
+            for (MessageType messageType : MessageType.values) {
+                if (object.has(messageType.getName().toLowerCase())) {
                     return context.deserialize(object, messageType.getMessageClass());
                 }
             }
diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/MessageType.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/MessageType.java
index 0b4dedb34..020d778e3 100644
--- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/MessageType.java
+++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/MessageType.java
@@ -1,54 +1,119 @@
 package com.jtelegram.api.message;
 
-import com.jtelegram.api.events.chat.*;
-import com.jtelegram.api.events.message.*;
+import com.jtelegram.api.events.chat.ChatMemberJoinedEvent;
+import com.jtelegram.api.events.chat.ChatMemberLeftEvent;
+import com.jtelegram.api.events.chat.ChatMigratedFromChatEvent;
+import com.jtelegram.api.events.chat.ChatMigratedToChatEvent;
+import com.jtelegram.api.events.chat.ChatPhotoDeletedEvent;
+import com.jtelegram.api.events.chat.GroupChatCreatedEvent;
+import com.jtelegram.api.events.chat.NewChatPhotoEvent;
+import com.jtelegram.api.events.chat.NewChatTitleEvent;
+import com.jtelegram.api.events.chat.PinnedMessageEvent;
+import com.jtelegram.api.events.chat.SupergroupChatCreatedEvent;
+import com.jtelegram.api.events.chat.UserLoggedInEvent;
+import com.jtelegram.api.events.message.AnimationMessageEvent;
+import com.jtelegram.api.events.message.AudioMessageEvent;
+import com.jtelegram.api.events.message.ContactMessageEvent;
+import com.jtelegram.api.events.message.DocumentMessageEvent;
+import com.jtelegram.api.events.message.GameMessageEvent;
+import com.jtelegram.api.events.message.InvoiceMessageEvent;
+import com.jtelegram.api.events.message.LocationMessageEvent;
+import com.jtelegram.api.events.message.MessageEvent;
+import com.jtelegram.api.events.message.PhotoMessageEvent;
+import com.jtelegram.api.events.message.StickerMessageEvent;
+import com.jtelegram.api.events.message.TextMessageEvent;
+import com.jtelegram.api.events.message.VenueMessageEvent;
+import com.jtelegram.api.events.message.VideoMessageEvent;
+import com.jtelegram.api.events.message.VideoNoteMessageEvent;
+import com.jtelegram.api.events.message.VoiceMessageEvent;
 import com.jtelegram.api.events.payment.SuccessfulPaymentEvent;
-import com.jtelegram.api.message.impl.*;
-import com.jtelegram.api.message.impl.service.*;
+import com.jtelegram.api.message.games.Game;
+import com.jtelegram.api.message.impl.AnimationMessage;
+import com.jtelegram.api.message.impl.AudioMessage;
+import com.jtelegram.api.message.impl.ContactMessage;
+import com.jtelegram.api.message.impl.DocumentMessage;
+import com.jtelegram.api.message.impl.GameMessage;
+import com.jtelegram.api.message.impl.InvoiceMessage;
+import com.jtelegram.api.message.impl.LocationMessage;
+import com.jtelegram.api.message.impl.PhotoMessage;
+import com.jtelegram.api.message.impl.StickerMessage;
+import com.jtelegram.api.message.impl.SuccessfulPaymentMessage;
+import com.jtelegram.api.message.impl.TextMessage;
+import com.jtelegram.api.message.impl.VenueMessage;
+import com.jtelegram.api.message.impl.VideoMessage;
+import com.jtelegram.api.message.impl.VideoNoteMessage;
+import com.jtelegram.api.message.impl.VoiceMessage;
+import com.jtelegram.api.message.impl.service.DeleteChatPhotoMessage;
+import com.jtelegram.api.message.impl.service.GroupChatCreatedMessage;
+import com.jtelegram.api.message.impl.service.LeftChatMemberMessage;
+import com.jtelegram.api.message.impl.service.MigrateFromChatIdMessage;
+import com.jtelegram.api.message.impl.service.MigrateToChatIdMessage;
+import com.jtelegram.api.message.impl.service.NewChatMembersMessage;
+import com.jtelegram.api.message.impl.service.NewChatPhotoMessage;
+import com.jtelegram.api.message.impl.service.NewChatTitleMessage;
+import com.jtelegram.api.message.impl.service.PinnedMessageMessage;
+import com.jtelegram.api.message.impl.service.SupergroupChatCreatedMessage;
+import com.jtelegram.api.message.impl.service.UserLoggedInMessage;
+import com.jtelegram.api.message.media.Animation;
+import com.jtelegram.api.message.media.Audio;
+import com.jtelegram.api.message.media.Contact;
+import com.jtelegram.api.message.media.Document;
+import com.jtelegram.api.message.media.Location;
+import com.jtelegram.api.message.media.Photo;
+import com.jtelegram.api.message.media.Venue;
+import com.jtelegram.api.message.media.Video;
+import com.jtelegram.api.message.media.VideoNote;
+import com.jtelegram.api.message.media.Voice;
+import com.jtelegram.api.message.payments.Invoice;
+import com.jtelegram.api.message.payments.SuccessfulPayment;
+import com.jtelegram.api.message.sticker.Sticker;
+import lombok.AccessLevel;
+import lombok.AllArgsConstructor;
 import lombok.Getter;
 
-public enum MessageType {
-    TEXT(TextMessage.class, TextMessageEvent.class),
-    ANIMATION(AnimationMessage.class, AnimationMessageEvent.class),
-    AUDIO(AudioMessage.class, AudioMessageEvent.class),
-    DOCUMENT(DocumentMessage.class, DocumentMessageEvent.class),
-    GAME(GameMessage.class, GameMessageEvent.class),
-    PHOTO(PhotoMessage.class, PhotoMessageEvent.class),
-    STICKER(StickerMessage.class, StickerMessageEvent.class),
-    VIDEO(VideoMessage.class, VideoMessageEvent.class),
-    VOICE(VoiceMessage.class, VoiceMessageEvent.class),
-    VIDEO_NOTE(VideoNoteMessage.class, VideoNoteMessageEvent.class),
-    CONTACT(ContactMessage.class, ContactMessageEvent.class),
-    VENUE(VenueMessage.class, VenueMessageEvent.class),
-    LOCATION(LocationMessage.class, LocationMessageEvent.class),
-    INVOICE(InvoiceMessage.class, InvoiceMessageEvent.class),
-    SUCCESSFUL_PAYMENT(SuccessfulPaymentMessage.class, SuccessfulPaymentEvent.class),
-
-    NEW_CHAT_MEMBERS(NewChatMembersMessage.class, ChatMemberJoinedEvent.class),
-    LEFT_CHAT_MEMBER(LeftChatMemberMessage.class, ChatMemberLeftEvent.class),
-    NEW_CHAT_TITLE(NewChatTitleMessage.class, NewChatTitleEvent.class),
-    NEW_CHAT_PHOTO(NewChatPhotoMessage.class, NewChatPhotoEvent.class),
-    DELETE_CHAT_PHOTO(DeleteChatPhotoMessage.class, ChatPhotoDeletedEvent.class),
-    GROUP_CHAT_CREATED(GroupChatCreatedMessage.class, GroupChatCreatedEvent.class),
-    PINNED_MESSAGE(PinnedMessageMessage.class, PinnedMessageEvent.class),
-    CONNECTED_WEBSITE(UserLoggedInMessage.class, UserLoggedInEvent.class),
-    SUPERGROUP_CHAT_CREATED(SupergroupChatCreatedMessage.class, GroupChatCreatedEvent.class),
-    MIGRATE_TO_CHAT_ID(MigrateToChatIdMessage.class, ChatMigratedToChatEvent.class),
-    MIGRATE_FROM_CHAT_ID(MigrateFromChatIdMessage.class, ChatMigratedFromChatEvent.class)
-    ;
-
-    @Getter
-    private Class extends Message> messageClass;
-    @Getter
-    private Class extends MessageEvent> receiveEventClass;
-
-    MessageType(Class extends Message> messageClass, Class extends MessageEvent> receiveEventClass) {
-        this.messageClass = messageClass;
-        this.receiveEventClass = receiveEventClass;
-    }
+@Getter
+@AllArgsConstructor(access = AccessLevel.PACKAGE)
+public class MessageType, E extends MessageEvent> {
+    public static final MessageType TEXT = new MessageType<>("TEXT", String.class, TextMessage.class, TextMessageEvent.class);
+    public static final MessageType ANIMATION = new MessageType<>("ANIMATION", Animation.class, AnimationMessage.class, AnimationMessageEvent.class);
+    public static final MessageType