diff --git a/Telegram/SourceFiles/apiwrap.cpp b/Telegram/SourceFiles/apiwrap.cpp
index b81d0e63f..24fb0ea18 100644
--- a/Telegram/SourceFiles/apiwrap.cpp
+++ b/Telegram/SourceFiles/apiwrap.cpp
@@ -2633,7 +2633,9 @@ void ApiWrap::resolveWebPages() {
 	if (!ids.isEmpty()) {
 		requestId = request(MTPmessages_GetMessages(
 			MTP_vector<MTPInputMessage>(ids)
-		)).done([=](const MTPmessages_Messages &result, mtpRequestId requestId) {
+		)).done([=](
+				const MTPmessages_Messages &result,
+				mtpRequestId requestId) {
 			gotWebPages(nullptr, result, requestId);
 		}).afterDelay(kSmallDelayMs).send();
 	}
@@ -2642,7 +2644,9 @@ void ApiWrap::resolveWebPages() {
 		reqsByIndex[i.value().first] = request(MTPchannels_GetMessages(
 			i.key()->inputChannel,
 			MTP_vector<MTPInputMessage>(i.value().second)
-		)).done([=, channel = i.key()](const MTPmessages_Messages &result, mtpRequestId requestId) {
+		)).done([=, channel = i.key()](
+				const MTPmessages_Messages &result,
+				mtpRequestId requestId) {
 			gotWebPages(channel, result, requestId);
 		}).afterDelay(kSmallDelayMs).send();
 	}
@@ -2957,58 +2961,8 @@ void ApiWrap::refreshFileReference(
 	});
 }
 
-void ApiWrap::gotWebPages(ChannelData *channel, const MTPmessages_Messages &msgs, mtpRequestId req) {
-	const QVector<MTPMessage> *v = 0;
-	switch (msgs.type()) {
-	case mtpc_messages_messages: {
-		auto &d = msgs.c_messages_messages();
-		_session->data().processUsers(d.vusers());
-		_session->data().processChats(d.vchats());
-		v = &d.vmessages().v;
-	} break;
-
-	case mtpc_messages_messagesSlice: {
-		auto &d = msgs.c_messages_messagesSlice();
-		_session->data().processUsers(d.vusers());
-		_session->data().processChats(d.vchats());
-		v = &d.vmessages().v;
-	} break;
-
-	case mtpc_messages_channelMessages: {
-		auto &d = msgs.c_messages_channelMessages();
-		if (channel) {
-			channel->ptsReceived(d.vpts().v);
-		} else {
-			LOG(("API Error: received messages.channelMessages when no channel was passed! (ApiWrap::gotWebPages)"));
-		}
-		_session->data().processUsers(d.vusers());
-		_session->data().processChats(d.vchats());
-		v = &d.vmessages().v;
-	} break;
-
-	case mtpc_messages_messagesNotModified: {
-		LOG(("API Error: received messages.messagesNotModified! (ApiWrap::gotWebPages)"));
-	} break;
-	}
-
-	if (!v) return;
-
-	auto indices = base::flat_map<uint64, int>(); // copied from feedMsgs
-	for (auto i = 0, l = v->size(); i != l; ++i) {
-		const auto msgId = IdFromMessage(v->at(i));
-		indices.emplace((uint64(uint32(msgId)) << 32) | uint64(i), i);
-	}
-
-	for (const auto &[position, index] : indices) {
-		const auto item = _session->data().addNewMessage(
-			v->at(index),
-			MTPDmessage_ClientFlags(),
-			NewMessageType::Existing);
-		if (item) {
-			_session->data().requestItemResize(item);
-		}
-	}
-
+void ApiWrap::gotWebPages(ChannelData *channel, const MTPmessages_Messages &result, mtpRequestId req) {
+	WebPageData::ApplyChanges(&session(), channel, result);
 	for (auto i = _webPagesPending.begin(); i != _webPagesPending.cend();) {
 		if (i.value() == req) {
 			if (i.key()->pendingTill > 0) {
diff --git a/Telegram/SourceFiles/data/data_web_page.cpp b/Telegram/SourceFiles/data/data_web_page.cpp
index 4d0500ae2..d3a5eaa93 100644
--- a/Telegram/SourceFiles/data/data_web_page.cpp
+++ b/Telegram/SourceFiles/data/data_web_page.cpp
@@ -12,6 +12,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 #include "mainwidget.h"
 #include "data/data_session.h"
 #include "data/data_photo.h"
+#include "data/data_channel.h"
 #include "data/data_document.h"
 #include "ui/image/image.h"
 #include "ui/text/text_entity.h"
@@ -240,3 +241,45 @@ void WebPageData::replaceDocumentGoodThumbnail() {
 		document->setGoodThumbnailPhoto(photo);
 	}
 }
+
+void WebPageData::ApplyChanges(
+		not_null<Main::Session*> session,
+		ChannelData *channel,
+		const MTPmessages_Messages &result) {
+	result.match([&](
+			const MTPDmessages_channelMessages &data) {
+		if (channel) {
+			channel->ptsReceived(data.vpts().v);
+		} else {
+			LOG(("API Error: received messages.channelMessages "
+				"when no channel was passed! (WebPageData::ApplyChanges)"));
+		}
+	}, [&](const auto &) {
+	});
+	const auto list = result.match([](
+			const MTPDmessages_messagesNotModified &) {
+		LOG(("API Error: received messages.messagesNotModified! "
+			"(WebPageData::ApplyChanges)"));
+		return static_cast<const QVector<MTPMessage>*>(nullptr);
+	}, [&](const auto &data) {
+		session->data().processUsers(data.vusers());
+		session->data().processChats(data.vchats());
+		return &data.vmessages().v;
+	});
+	if (!list) {
+		return;
+	}
+
+	for (const auto &message : *list) {
+		message.match([&](const MTPDmessage &data) {
+			if (const auto media = data.vmedia()) {
+				media->match([&](const MTPDmessageMediaWebPage &data) {
+					session->data().processWebpage(data.vwebpage());
+				}, [&](const auto &) {
+				});
+			}
+		}, [&](const auto &) {
+		});
+	}
+	session->data().sendWebPageGamePollNotifications();
+}
\ No newline at end of file
diff --git a/Telegram/SourceFiles/data/data_web_page.h b/Telegram/SourceFiles/data/data_web_page.h
index f3e6dfbae..74e0aaae2 100644
--- a/Telegram/SourceFiles/data/data_web_page.h
+++ b/Telegram/SourceFiles/data/data_web_page.h
@@ -10,6 +10,12 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 #include "data/data_photo.h"
 #include "data/data_document.h"
 
+class ChannelData;
+
+namespace Main {
+class Session;
+} // namespace Main
+
 enum class WebPageType {
 	Photo,
 	Video,
@@ -50,6 +56,11 @@ struct WebPageData {
 		const QString &newAuthor,
 		int newPendingTill);
 
+	static void ApplyChanges(
+		not_null<Main::Session*> session,
+		ChannelData *channel,
+		const MTPmessages_Messages &result);
+
 	WebPageId id = 0;
 	WebPageType type = WebPageType::Article;
 	QString url;