diff --git a/Telegram/SourceFiles/chat_helpers/emoji_sets_manager.cpp b/Telegram/SourceFiles/chat_helpers/emoji_sets_manager.cpp
index eb2d55526..c7fbb5116 100644
--- a/Telegram/SourceFiles/chat_helpers/emoji_sets_manager.cpp
+++ b/Telegram/SourceFiles/chat_helpers/emoji_sets_manager.cpp
@@ -31,6 +31,25 @@ namespace Ui {
 namespace Emoji {
 namespace {
 
+struct Set : public Storage::Blob {
+	QString previewPath;
+};
+
+inline auto PreviewPath(int i) {
+	return qsl(":/gui/emoji/set%1_preview.webp").arg(i);
+}
+
+const auto kSets = {
+	Set{ {0,   0,         0, "Mac"},       PreviewPath(0) },
+	Set{ {1, 246, 7'336'383, "Android"},   PreviewPath(1) },
+	Set{ {2, 206, 5'038'738, "Twemoji"},   PreviewPath(2) },
+	Set{ {3, 238, 6'992'260, "JoyPixels"}, PreviewPath(3) },
+};
+
+auto Sets() {
+	return kSets;
+}
+
 struct Available {
 	int size = 0;
 
diff --git a/Telegram/SourceFiles/chat_helpers/spellchecker_common.cpp b/Telegram/SourceFiles/chat_helpers/spellchecker_common.cpp
index fce0a12d9..38ca1d0b7 100644
--- a/Telegram/SourceFiles/chat_helpers/spellchecker_common.cpp
+++ b/Telegram/SourceFiles/chat_helpers/spellchecker_common.cpp
@@ -9,8 +9,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 
 #ifndef TDESKTOP_DISABLE_SPELLCHECK
 
-#include "storage/storage_cloud_blob.h"
-
 #include "base/zlib_help.h"
 
 namespace Spellchecker {
@@ -27,47 +25,47 @@ inline auto LWC(QLocale::Country country) {
 }
 
 const auto kDictionaries = {
-	Dict{ QLocale::Bulgarian,            12,   229'658, "\xd0\x91\xd1\x8a\xd0\xbb\xd0\xb3\xd0\xb0\xd1\x80\xd1\x81\xd0\xba\xd0\xb8" },
-	Dict{ QLocale::Catalan,              13,   417'611, "\x43\x61\x74\x61\x6c\xc3\xa0" },
-	Dict{ QLocale::Czech,                14,   860'286, "\xc4\x8c\x65\xc5\xa1\x74\x69\x6e\x61" },
-	Dict{ QLocale::Welsh,                15,   177'305, "\x43\x79\x6d\x72\x61\x65\x67" },
-	Dict{ QLocale::Danish,               16,   345'874, "\x44\x61\x6e\x73\x6b" },
-	Dict{ QLocale::German,               17, 2'412'780, "\x44\x65\x75\x74\x73\x63\x68" },
-	Dict{ QLocale::Greek,                18, 1'389'160, "\xce\x95\xce\xbb\xce\xbb\xce\xb7\xce\xbd\xce\xb9\xce\xba\xce\xac" },
-	Dict{ LWC(QLocale::Australia),       19,   175'266, "English (Australia)" },
-	Dict{ LWC(QLocale::Canada),          20,   174'295, "English (Canada)" },
-	Dict{ LWC(QLocale::UnitedKingdom),   21,   174'433, "English (United Kingdom)" },
-	Dict{ QLocale::English,              22,   174'516, "English" },
-	Dict{ QLocale::Spanish,              23,   264'717, "\x45\x73\x70\x61\xc3\xb1\x6f\x6c" },
-	Dict{ QLocale::Estonian,             24,   757'394, "\x45\x65\x73\x74\x69" },
-	Dict{ QLocale::Persian,              25,   333'911, "\xd9\x81\xd8\xa7\xd8\xb1\xd8\xb3\xdb\x8c" },
-	Dict{ QLocale::French,               26,   321'391, "\x46\x72\x61\x6e\xc3\xa7\x61\x69\x73" },
-	Dict{ QLocale::Hebrew,               27,   622'550, "\xd7\xa2\xd7\x91\xd7\xa8\xd7\x99\xd7\xaa" },
-	Dict{ QLocale::Hindi,                28,    56'105, "\xe0\xa4\xb9\xe0\xa4\xbf\xe0\xa4\xa8\xe0\xa5\x8d\xe0\xa4\xa6\xe0\xa5\x80" },
-	Dict{ QLocale::Croatian,             29,   668'876, "\x48\x72\x76\x61\x74\x73\x6b\x69" },
-	Dict{ QLocale::Hungarian,            30,   660'402, "\x4d\x61\x67\x79\x61\x72" },
-	Dict{ QLocale::Armenian,             31,   928'746, "\xd5\x80\xd5\xa1\xd5\xb5\xd5\xa5\xd6\x80\xd5\xa5\xd5\xb6" },
-	Dict{ QLocale::Indonesian,           32,   100'134, "\x49\x6e\x64\x6f\x6e\x65\x73\x69\x61" },
-	Dict{ QLocale::Italian,              33,   324'613, "\x49\x74\x61\x6c\x69\x61\x6e\x6f" },
-	Dict{ QLocale::Korean,               34, 1'256'987, "\xed\x95\x9c\xea\xb5\xad\xec\x96\xb4" },
-	Dict{ QLocale::Lithuanian,           35,   267'427, "\x4c\x69\x65\x74\x75\x76\x69\xc5\xb3" },
-	Dict{ QLocale::Latvian,              36,   641'602, "\x4c\x61\x74\x76\x69\x65\xc5\xa1\x75" },
-	Dict{ QLocale::Norwegian,            37,   588'650, "\x4e\x6f\x72\x73\x6b" },
-	Dict{ QLocale::Dutch,                38,   743'406, "\x4e\x65\x64\x65\x72\x6c\x61\x6e\x64\x73" },
-	Dict{ QLocale::Polish,               39, 1'015'747, "\x50\x6f\x6c\x73\x6b\x69" },
-	Dict{ LWC(QLocale::Brazil),          40, 1'231'999, "\x50\x6f\x72\x74\x75\x67\x75\xc3\xaa\x73 (Brazil)" },
-	Dict{ QLocale::Portugal,             41,   138'571, "\x50\x6f\x72\x74\x75\x67\x75\xc3\xaa\x73" },
-	Dict{ QLocale::Romanian,             42,   455'643, "\x52\x6f\x6d\xc3\xa2\x6e\xc4\x83" },
-	Dict{ QLocale::Russian,              43,   463'194, "\xd0\xa0\xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9" },
-	Dict{ QLocale::Slovak,               44,   525'328, "\x53\x6c\x6f\x76\x65\x6e\xc4\x8d\x69\x6e\x61" },
-	Dict{ QLocale::Slovenian,            45, 1'143'710, "\x53\x6c\x6f\x76\x65\x6e\xc5\xa1\xc4\x8d\x69\x6e\x61" },
-	Dict{ QLocale::Albanian,             46,   583'412, "\x53\x68\x71\x69\x70" },
-	Dict{ QLocale::Swedish,              47,   593'877, "\x53\x76\x65\x6e\x73\x6b\x61" },
-	Dict{ QLocale::Tamil,                48,   323'193, "\xe0\xae\xa4\xe0\xae\xae\xe0\xae\xbf\xe0\xae\xb4\xe0\xaf\x8d" },
-	Dict{ QLocale::Tajik,                49,   369'931, "\xd0\xa2\xd0\xbe\xd2\xb7\xd0\xb8\xd0\xba\xd3\xa3" },
-	Dict{ QLocale::Turkish,              50, 4'301'099, "\x54\xc3\xbc\x72\x6b\xc3\xa7\x65" },
-	Dict{ QLocale::Ukrainian,            51,   445'711, "\xd0\xa3\xd0\xba\xd1\x80\xd0\xb0\xd1\x97\xd0\xbd\xd1\x81\xd1\x8c\xd0\xba\xd0\xb0" },
-	Dict{ QLocale::Vietnamese,           52,    12'949, "\x54\x69\xe1\xba\xbf\x6e\x67\x20\x56\x69\xe1\xbb\x87\x74" },
+	Dict{{ QLocale::Bulgarian,            12,   229'658, "\xd0\x91\xd1\x8a\xd0\xbb\xd0\xb3\xd0\xb0\xd1\x80\xd1\x81\xd0\xba\xd0\xb8" }},
+	Dict{{ QLocale::Catalan,              13,   417'611, "\x43\x61\x74\x61\x6c\xc3\xa0" }},
+	Dict{{ QLocale::Czech,                14,   860'286, "\xc4\x8c\x65\xc5\xa1\x74\x69\x6e\x61" }},
+	Dict{{ QLocale::Welsh,                15,   177'305, "\x43\x79\x6d\x72\x61\x65\x67" }},
+	Dict{{ QLocale::Danish,               16,   345'874, "\x44\x61\x6e\x73\x6b" }},
+	Dict{{ QLocale::German,               17, 2'412'780, "\x44\x65\x75\x74\x73\x63\x68" }},
+	Dict{{ QLocale::Greek,                18, 1'389'160, "\xce\x95\xce\xbb\xce\xbb\xce\xb7\xce\xbd\xce\xb9\xce\xba\xce\xac" }},
+	Dict{{ LWC(QLocale::Australia),       19,   175'266, "English (Australia)" }},
+	Dict{{ LWC(QLocale::Canada),          20,   174'295, "English (Canada)" }},
+	Dict{{ LWC(QLocale::UnitedKingdom),   21,   174'433, "English (United Kingdom)" }},
+	Dict{{ QLocale::English,              22,   174'516, "English" }},
+	Dict{{ QLocale::Spanish,              23,   264'717, "\x45\x73\x70\x61\xc3\xb1\x6f\x6c" }},
+	Dict{{ QLocale::Estonian,             24,   757'394, "\x45\x65\x73\x74\x69" }},
+	Dict{{ QLocale::Persian,              25,   333'911, "\xd9\x81\xd8\xa7\xd8\xb1\xd8\xb3\xdb\x8c" }},
+	Dict{{ QLocale::French,               26,   321'391, "\x46\x72\x61\x6e\xc3\xa7\x61\x69\x73" }},
+	Dict{{ QLocale::Hebrew,               27,   622'550, "\xd7\xa2\xd7\x91\xd7\xa8\xd7\x99\xd7\xaa" }},
+	Dict{{ QLocale::Hindi,                28,    56'105, "\xe0\xa4\xb9\xe0\xa4\xbf\xe0\xa4\xa8\xe0\xa5\x8d\xe0\xa4\xa6\xe0\xa5\x80" }},
+	Dict{{ QLocale::Croatian,             29,   668'876, "\x48\x72\x76\x61\x74\x73\x6b\x69" }},
+	Dict{{ QLocale::Hungarian,            30,   660'402, "\x4d\x61\x67\x79\x61\x72" }},
+	Dict{{ QLocale::Armenian,             31,   928'746, "\xd5\x80\xd5\xa1\xd5\xb5\xd5\xa5\xd6\x80\xd5\xa5\xd5\xb6" }},
+	Dict{{ QLocale::Indonesian,           32,   100'134, "\x49\x6e\x64\x6f\x6e\x65\x73\x69\x61" }},
+	Dict{{ QLocale::Italian,              33,   324'613, "\x49\x74\x61\x6c\x69\x61\x6e\x6f" }},
+	Dict{{ QLocale::Korean,               34, 1'256'987, "\xed\x95\x9c\xea\xb5\xad\xec\x96\xb4" }},
+	Dict{{ QLocale::Lithuanian,           35,   267'427, "\x4c\x69\x65\x74\x75\x76\x69\xc5\xb3" }},
+	Dict{{ QLocale::Latvian,              36,   641'602, "\x4c\x61\x74\x76\x69\x65\xc5\xa1\x75" }},
+	Dict{{ QLocale::Norwegian,            37,   588'650, "\x4e\x6f\x72\x73\x6b" }},
+	Dict{{ QLocale::Dutch,                38,   743'406, "\x4e\x65\x64\x65\x72\x6c\x61\x6e\x64\x73" }},
+	Dict{{ QLocale::Polish,               39, 1'015'747, "\x50\x6f\x6c\x73\x6b\x69" }},
+	Dict{{ LWC(QLocale::Brazil),          40, 1'231'999, "\x50\x6f\x72\x74\x75\x67\x75\xc3\xaa\x73 (Brazil)" }},
+	Dict{{ QLocale::Portugal,             41,   138'571, "\x50\x6f\x72\x74\x75\x67\x75\xc3\xaa\x73" }},
+	Dict{{ QLocale::Romanian,             42,   455'643, "\x52\x6f\x6d\xc3\xa2\x6e\xc4\x83" }},
+	Dict{{ QLocale::Russian,              43,   463'194, "\xd0\xa0\xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9" }},
+	Dict{{ QLocale::Slovak,               44,   525'328, "\x53\x6c\x6f\x76\x65\x6e\xc4\x8d\x69\x6e\x61" }},
+	Dict{{ QLocale::Slovenian,            45, 1'143'710, "\x53\x6c\x6f\x76\x65\x6e\xc5\xa1\xc4\x8d\x69\x6e\x61" }},
+	Dict{{ QLocale::Albanian,             46,   583'412, "\x53\x68\x71\x69\x70" }},
+	Dict{{ QLocale::Swedish,              47,   593'877, "\x53\x76\x65\x6e\x73\x6b\x61" }},
+	Dict{{ QLocale::Tamil,                48,   323'193, "\xe0\xae\xa4\xe0\xae\xae\xe0\xae\xbf\xe0\xae\xb4\xe0\xaf\x8d" }},
+	Dict{{ QLocale::Tajik,                49,   369'931, "\xd0\xa2\xd0\xbe\xd2\xb7\xd0\xb8\xd0\xba\xd3\xa3" }},
+	Dict{{ QLocale::Turkish,              50, 4'301'099, "\x54\xc3\xbc\x72\x6b\xc3\xa7\x65" }},
+	Dict{{ QLocale::Ukrainian,            51,   445'711, "\xd0\xa3\xd0\xba\xd1\x80\xd0\xb0\xd1\x97\xd0\xbd\xd1\x81\xd1\x8c\xd0\xba\xd0\xb0" }},
+	Dict{{ QLocale::Vietnamese,           52,    12'949, "\x54\x69\xe1\xba\xbf\x6e\x67\x20\x56\x69\xe1\xbb\x87\x74" }},
 };
 
 QLocale LocaleFromLangId(int langId) {
diff --git a/Telegram/SourceFiles/chat_helpers/spellchecker_common.h b/Telegram/SourceFiles/chat_helpers/spellchecker_common.h
index ec0de1e56..5f08db09b 100644
--- a/Telegram/SourceFiles/chat_helpers/spellchecker_common.h
+++ b/Telegram/SourceFiles/chat_helpers/spellchecker_common.h
@@ -9,13 +9,11 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 
 #ifndef TDESKTOP_DISABLE_SPELLCHECK
 
+#include "storage/storage_cloud_blob.h"
+
 namespace Spellchecker {
 
-struct Dict {
-	int id = 0;
-	int postId = 0;
-	int size = 0;
-	QString name;
+struct Dict : public Storage::Blob {
 };
 
 [[nodiscard]] QString DictionariesPath();
diff --git a/Telegram/SourceFiles/storage/storage_cloud_blob.h b/Telegram/SourceFiles/storage/storage_cloud_blob.h
index 5728803d1..064b0cd1a 100644
--- a/Telegram/SourceFiles/storage/storage_cloud_blob.h
+++ b/Telegram/SourceFiles/storage/storage_cloud_blob.h
@@ -9,6 +9,13 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 
 namespace Storage {
 
+struct Blob {
+	int id = 0;
+	int postId = 0;
+	int size = 0;
+	QString name;
+};
+
 bool UnpackBlob(
 	const QString &path,
 	const QString &folder,
diff --git a/Telegram/lib_ui b/Telegram/lib_ui
index 44c463368..be5ed0053 160000
--- a/Telegram/lib_ui
+++ b/Telegram/lib_ui
@@ -1 +1 @@
-Subproject commit 44c46336847a8d8ece3fb00301875af58ca69bf4
+Subproject commit be5ed0053adddfa70a739bf19b8d84e540e7e0f8