From 30ae07308075d119b21060697231f99cbef8f89c Mon Sep 17 00:00:00 2001
From: John Preston <johnprestonmail@gmail.com>
Date: Wed, 22 Oct 2014 22:39:03 +0400
Subject: [PATCH] username support added, layer 18

---
 Telegram/Resources/lang.txt                  |   48 +-
 Telegram/Resources/style.txt                 |   21 +-
 Telegram/SourceFiles/app.cpp                 |   14 +-
 Telegram/SourceFiles/boxes/addcontactbox.cpp |    4 +-
 Telegram/SourceFiles/boxes/addcontactbox.h   |    2 +-
 Telegram/SourceFiles/boxes/usernamebox.cpp   |  272 ++
 Telegram/SourceFiles/boxes/usernamebox.h     |   82 +
 Telegram/SourceFiles/config.h                |    5 +
 Telegram/SourceFiles/dialogswidget.cpp       |  341 +-
 Telegram/SourceFiles/dialogswidget.h         |   31 +-
 Telegram/SourceFiles/gui/flatinput.h         |    1 -
 Telegram/SourceFiles/history.cpp             |   61 +-
 Telegram/SourceFiles/history.h               |   27 +-
 Telegram/SourceFiles/historywidget.cpp       |   20 +-
 Telegram/SourceFiles/intro/introphone.cpp    |   12 +-
 Telegram/SourceFiles/mainwidget.cpp          |   40 +-
 Telegram/SourceFiles/mainwidget.h            |    2 +-
 Telegram/SourceFiles/mtproto/mtpCoreTypes.h  |    6 +
 Telegram/SourceFiles/mtproto/mtpScheme.cpp   | 4179 +++++++++---------
 Telegram/SourceFiles/mtproto/mtpScheme.h     | 2109 ++++-----
 Telegram/SourceFiles/mtproto/scheme.tl       |   89 +-
 Telegram/SourceFiles/profilewidget.cpp       |   14 +-
 Telegram/SourceFiles/settingswidget.cpp      |  159 +-
 Telegram/SourceFiles/settingswidget.h        |   14 +-
 Telegram/SourceFiles/window.cpp              |    6 +
 Telegram/SourceFiles/window.h                |    1 +
 Telegram/Telegram.vcxproj                    |   27 +
 Telegram/Telegram.vcxproj.filters            |   15 +
 28 files changed, 4000 insertions(+), 3602 deletions(-)
 create mode 100644 Telegram/SourceFiles/boxes/usernamebox.cpp
 create mode 100644 Telegram/SourceFiles/boxes/usernamebox.h

diff --git a/Telegram/Resources/lang.txt b/Telegram/Resources/lang.txt
index f1796dbb74..8bb1a994e8 100644
--- a/Telegram/Resources/lang.txt
+++ b/Telegram/Resources/lang.txt
@@ -57,8 +57,8 @@ lng_month_day: "{month} {day}";
 
 lng_cancel: "Cancel";
 lng_continue: "Continue";
-lng_connecting: "Connecting...";
-lng_reconnecting: "Reconnect in %1 s...";
+lng_connecting: "Connecting..";
+lng_reconnecting: "Reconnect in %1 s..";
 lng_reconnecting_try_now: "Try now";
 
 lng_status_offline: "offline";
@@ -74,6 +74,7 @@ lng_status_lastseen_yesterday: "yesterday at {time}";
 lng_status_lastseen_date: "{date}";
 lng_status_lastseen_date_time: "{date} at {time}";
 lng_status_online: "online";
+lng_status_connecting: "connecting..";
 
 lng_chat_no_members: "Group is unaccessible";
 lng_chat_members: "%1 members";
@@ -109,7 +110,7 @@ lng_code_ph: "Your code";
 lng_code_desc: "We have sent you an SMS with activation
 code to your phone. Please enter it below.";
 lng_code_call: "Telegram will dial your number in %1:%2";
-lng_code_calling: "Requesting a call from Telegram...";
+lng_code_calling: "Requesting a call from Telegram..";
 lng_code_called: "Telegram dialed your number";
 
 lng_bad_phone: "Invalid phone number. Please try again.";
@@ -136,7 +137,25 @@ lng_settings_cancel: "Cancel";
 lng_settings_upload: "Set Profile Photo";
 lng_settings_badsize: "This image has bad size, please try other.";
 lng_settings_crop_profile: "Select square area for your profile photo";
-lng_settings_uploading_photo: "Uploading photo...";
+lng_settings_uploading_photo: "Uploading photo..";
+
+lng_username_title: "Change username";
+lng_username_about: "You can choose a username on Telegram.
+If you do, other people will be able to find
+you by this username and contact you
+without knowing your phone number.
+
+You can use a-z, 0-9 and underscores.
+Minimum length is 5 characters.";
+lng_username_invalid: "This name is invalid.";
+lng_username_occupied: "This name is already occupied.";
+lng_username_too_short: "This name is too short.";
+
+lng_settings_section_contact_info: "Contact info";
+lng_settings_phone_number: "Phone number:";
+lng_settings_username: "Username:";
+lng_settings_choose_username: "choose username";
+lng_settings_change_username: "Change";
 
 lng_settings_section_notify: "Notifications";
 lng_settings_desktop_notify: "Desktop notifications";
@@ -151,9 +170,9 @@ lng_settings_section_general: "General";
 lng_settings_auto_update: "Update automatically";
 lng_settings_current_version: "Version {version}";
 lng_settings_check_now: "Check for updates";
-lng_settings_update_checking: "Checking for updates...";
+lng_settings_update_checking: "Checking for updates..";
 lng_settings_latest_installed: "Latest version is installed";
-lng_settings_downloading: "Downloading update {ready} / {total} Mb...";
+lng_settings_downloading: "Downloading update {ready} / {total} Mb..";
 lng_settings_update_ready: "New version is ready";
 lng_settings_update_now: "Restart Now";
 lng_settings_update_fail: "Update check failed :(";
@@ -192,7 +211,7 @@ lng_download_path_settings: "Go to Settings";
 lng_download_finish_failed: "File download could not be finished.
 
 Would you like to try again?";
-lng_download_path_clearing: "Clearing...";
+lng_download_path_clearing: "Clearing..";
 lng_download_path_cleared: "Cleared!";
 lng_download_path_clear_failed: "Clear failed :(";
 
@@ -238,7 +257,7 @@ lng_profile_add_participant: "Add Member";
 lng_profile_delete_and_exit: "Leave";
 lng_profile_kick: "Kick";
 lng_profile_sure_kick: "Kick {user} from the group?";
-lng_profile_loading: "Loading...";
+lng_profile_loading: "Loading..";
 lng_profile_shared_media: "Shared media";
 lng_profile_no_media: "No media in this conversation.";
 lng_profile_photo: "{count} photo »";
@@ -315,7 +334,7 @@ lng_in_dlg_audio: "Audio";
 lng_in_dlg_document: "Document";
 
 lng_send_button: "Send";
-lng_message_ph: "Write a message...";
+lng_message_ph: "Write a message..";
 lng_empty_history: "";
 lng_willbe_history: "Please select chat to start messaging";
 lng_message_with_from: "[c]{from}:[/c] {message}";
@@ -343,7 +362,7 @@ lng_context_copy_email: "Copy email address";
 lng_context_open_hashtag: "Search by hashtag";
 lng_context_copy_hashtag: "Copy hashtag";
 lng_context_open_image: "Open Image";
-lng_context_save_image: "Save Image As...";
+lng_context_save_image: "Save Image As..";
 lng_context_forward_image: "Forward Image";
 lng_context_delete_image: "Delete Image";
 lng_context_copy_image: "Copy Image";
@@ -352,11 +371,11 @@ lng_context_cancel_download: "Cancel Download";
 lng_context_show_in_folder: "Show in Folder";
 lng_context_show_in_finder: "Show in Finder";
 lng_context_open_video: "Open Video";
-lng_context_save_video: "Save Video As...";
+lng_context_save_video: "Save Video As..";
 lng_context_open_audio: "Open Audio";
-lng_context_save_audio: "Save Audio As...";
+lng_context_save_audio: "Save Audio As..";
 lng_context_open_document: "Open File";
-lng_context_save_document: "Save File As...";
+lng_context_save_document: "Save File As..";
 lng_context_forward_file: "Forward File";
 lng_context_delete_file: "Delete File";
 lng_context_close_file: "Close File";
@@ -375,7 +394,7 @@ lng_really_send_file: "Do you want to send this file?";
 lng_really_share_contact: "Do you want to share this contact?";
 lng_send_image_compressed: "Send compressed image";
 
-lng_forward_choose: "Choose recipient...";
+lng_forward_choose: "Choose recipient..";
 lng_forward_confirm: "Forward to {recipient}?";
 lng_forward_share_contact: "Share contact to {recipient}?";
 lng_forward_send_file_confirm: "Send «{name}» to {recipient}?";
@@ -430,6 +449,7 @@ lng_about_done: "Done";
 lng_search_no_results: "No messages found";
 lng_search_one_result: "Found {count} message";
 lng_search_n_results: "Found {count} messages";
+lng_search_global_results: "Global search results";
 
 lng_mediaview_save: "Download";
 lng_mediaview_forward: "Forward";
diff --git a/Telegram/Resources/style.txt b/Telegram/Resources/style.txt
index 46aed16865..fa36ae79d7 100644
--- a/Telegram/Resources/style.txt
+++ b/Telegram/Resources/style.txt
@@ -484,10 +484,9 @@ setTop: 26px;
 setNameLeft: 3px;
 setNameTop: 1px;
 setNameFont: font(22px);
-setPhoneFont: font(16px);
-setPhoneColor: #999;
-setPhoneTop: 39px;
-setPhoneLeft: 1px;
+setStatusTop: 39px;
+setStatusLeft: 1px;
+setStatusFont: font(16px);
 setPhotoSize: 120px;
 setHeaderFont: font(20px);
 setHeaderColor: black;
@@ -1622,3 +1621,17 @@ mediaviewLoaderSkip: 9px;
 
 minPhotoWidth: 90px;
 minPhotoHeight: 90px;
+
+usernameFont: font(14px);
+usernameColor: #777;
+usernameWidth: 336px;
+usernameSkip: 32px;
+usernameInput: flatInput(inpAddContact) {
+	bgColor: transparent;
+}
+usernameDone: flatButton(btnSelectDone) {
+	width: 168px;
+}
+usernameCancel: flatButton(btnSelectCancel) {
+	width: 167px;
+}
diff --git a/Telegram/SourceFiles/app.cpp b/Telegram/SourceFiles/app.cpp
index 02b1706b57..d39db1210e 100644
--- a/Telegram/SourceFiles/app.cpp
+++ b/Telegram/SourceFiles/app.cpp
@@ -240,7 +240,7 @@ namespace App {
 				data = App::user(peer);
 				data->input = MTP_inputPeerContact(d.vid);
 				data->inputUser = MTP_inputUserContact(d.vid);
-				data->setName(lang(lng_deleted), QString(), QString());
+				data->setName(lang(lng_deleted), QString(), QString(), QString());
 				data->setPhoto(MTP_userProfilePhotoEmpty());
 				data->access = 0;
 				wasContact = (data->contact > 0);
@@ -253,7 +253,7 @@ namespace App {
 				data = App::user(peer);
 				data->input = MTP_inputPeerContact(d.vid);
 				data->inputUser = MTP_inputUserContact(d.vid);
-				data->setName(textOneLine(qs(d.vfirst_name)), textOneLine(qs(d.vlast_name)), QString());
+				data->setName(textOneLine(qs(d.vfirst_name)), textOneLine(qs(d.vlast_name)), QString(), textOneLine(qs(d.vusername)));
 				data->setPhoto(MTP_userProfilePhotoEmpty());
 				data->access = 0;
 				wasContact = (data->contact > 0);
@@ -266,7 +266,7 @@ namespace App {
 				data = App::user(peer);
 				data->input = MTP_inputPeerSelf();
 				data->inputUser = MTP_inputUserSelf();
-				data->setName(textOneLine(qs(d.vfirst_name)), textOneLine(qs(d.vlast_name)), QString());
+				data->setName(textOneLine(qs(d.vfirst_name)), textOneLine(qs(d.vlast_name)), QString(), textOneLine(qs(d.vusername)));
 				data->setPhoto(d.vphoto);
 				data->setPhone(qs(d.vphone));
 				data->access = 0;
@@ -283,7 +283,7 @@ namespace App {
 				data = App::user(peer);
 				data->input = MTP_inputPeerContact(d.vid);
 				data->inputUser = MTP_inputUserContact(d.vid);
-				data->setName(textOneLine(qs(d.vfirst_name)), textOneLine(qs(d.vlast_name)), QString());
+				data->setName(textOneLine(qs(d.vfirst_name)), textOneLine(qs(d.vlast_name)), QString(), textOneLine(qs(d.vusername)));
 				data->setPhoto(d.vphoto);
 				data->setPhone(qs(d.vphone));
 				data->access = d.vaccess_hash.v;
@@ -299,7 +299,7 @@ namespace App {
 				data->input = MTP_inputPeerForeign(d.vid, d.vaccess_hash);
 				data->inputUser = MTP_inputUserForeign(d.vid, d.vaccess_hash);
 				data->setPhone(qs(d.vphone));
-				data->setName(textOneLine(qs(d.vfirst_name)), textOneLine(qs(d.vlast_name)), (data->id != 333000 && !data->phone.isEmpty()) ? formatPhone(data->phone) : QString());
+				data->setName(textOneLine(qs(d.vfirst_name)), textOneLine(qs(d.vlast_name)), (data->id != 333000 && !data->phone.isEmpty()) ? formatPhone(data->phone) : QString(), textOneLine(qs(d.vusername)));
 				data->setPhoto(d.vphoto);
 				data->access = d.vaccess_hash.v;
 				wasContact = (data->contact > 0);
@@ -313,7 +313,7 @@ namespace App {
 				data = App::user(peer);
 				data->input = MTP_inputPeerForeign(d.vid, d.vaccess_hash);
 				data->inputUser = MTP_inputUserForeign(d.vid, d.vaccess_hash);
-				data->setName(textOneLine(qs(d.vfirst_name)), textOneLine(qs(d.vlast_name)), QString());
+				data->setName(textOneLine(qs(d.vfirst_name)), textOneLine(qs(d.vlast_name)), QString(), textOneLine(qs(d.vusername)));
 				data->setPhoto(d.vphoto);
 				data->access = d.vaccess_hash.v;
 				wasContact = (data->contact > 0);
@@ -634,7 +634,7 @@ namespace App {
 					App::main()->removeContact(user);
 				}
 			}
-			user->setName(textOneLine(user->firstName), textOneLine(user->lastName), (user->contact || user->id == 333000 || user->phone.isEmpty()) ? QString() : App::formatPhone(user->phone));
+			user->setName(textOneLine(user->firstName), textOneLine(user->lastName), (user->contact || user->id == 333000 || user->phone.isEmpty()) ? QString() : App::formatPhone(user->phone), textOneLine(user->username));
 			if (App::main()) App::main()->peerUpdated(user);
 		}
 	}
diff --git a/Telegram/SourceFiles/boxes/addcontactbox.cpp b/Telegram/SourceFiles/boxes/addcontactbox.cpp
index 5638554b25..b767cee1b4 100644
--- a/Telegram/SourceFiles/boxes/addcontactbox.cpp
+++ b/Telegram/SourceFiles/boxes/addcontactbox.cpp
@@ -256,10 +256,11 @@ void AddContactBox::onSaveSelfDone(const MTPUser &user) {
 }
 
 bool AddContactBox::onSaveSelfFail(const RPCError &error) {
+	_addRequest = 0;
 	QString err(error.type());
 	QString firstName = textOneLine(_firstInput.text()), lastName = textOneLine(_lastInput.text());
 	if (err == "NAME_NOT_MODIFIED") {
-		App::self()->setName(firstName, lastName, firstName + ' ' + lastName);
+		App::self()->setName(firstName, lastName, firstName + ' ' + lastName, textOneLine(App::self()->username));
 		emit closed();
 		return true;
 	} else if (err == "FIRSTNAME_INVALID") {
@@ -276,6 +277,7 @@ bool AddContactBox::onSaveSelfFail(const RPCError &error) {
 }
 
 bool AddContactBox::onSaveFail(const RPCError &error) {
+	_addRequest = 0;
 	QString err(error.type());
 	QString firstName = _firstInput.text().trimmed(), lastName = _lastInput.text().trimmed();
 	if (err == "CHAT_TITLE_NOT_MODIFIED") {
diff --git a/Telegram/SourceFiles/boxes/addcontactbox.h b/Telegram/SourceFiles/boxes/addcontactbox.h
index f3ba5f417b..bb4076e565 100644
--- a/Telegram/SourceFiles/boxes/addcontactbox.h
+++ b/Telegram/SourceFiles/boxes/addcontactbox.h
@@ -58,7 +58,7 @@ private:
 	PeerData *_peer;
 	QString _boxTitle;
 
-	int32 _width, _height, _thumbw, _thumbh;
+	int32 _width, _height;
 	FlatButton _addButton, _retryButton, _cancelButton;
 	FlatInput _firstInput, _lastInput, _phoneInput;
 
diff --git a/Telegram/SourceFiles/boxes/usernamebox.cpp b/Telegram/SourceFiles/boxes/usernamebox.cpp
new file mode 100644
index 0000000000..4bac482ce9
--- /dev/null
+++ b/Telegram/SourceFiles/boxes/usernamebox.cpp
@@ -0,0 +1,272 @@
+/*
+This file is part of Telegram Desktop,
+an unofficial desktop messaging app, see https://telegram.org
+
+Telegram Desktop is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+It is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+Full license: https://github.com/telegramdesktop/tdesktop/blob/master/LICENSE
+Copyright (c) 2014 John Preston, https://tdesktop.com
+*/
+#include "stdafx.h"
+#include "lang.h"
+
+#include "application.h"
+#include "usernamebox.h"
+#include "mainwidget.h"
+#include "window.h"
+
+UsernameInput::UsernameInput(QWidget *parent, const style::flatInput &st, const QString &ph, const QString &val) : FlatInput(parent, st, ph, val) {
+}
+
+void UsernameInput::correctValue(QKeyEvent *e, const QString &was) {
+	QString oldText(text()), newText;
+	int32 oldPos(cursorPosition()), newPos(-1), oldLen(oldText.length());
+	newText.reserve(oldLen);
+
+	for (int32 i = 0; i < oldLen; ++i) {
+		if (i == oldPos) {
+			newPos = newText.length();
+		}
+
+		QChar ch = oldText[i];
+		if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9') || ch == '_' || (ch == '@' && !i)) {
+			if (newText.size() < MaxUsernameLength) {
+				newText.append(ch);
+			}
+		}
+	}
+	if (newPos < 0) {
+		newPos = newText.length();
+	}
+	if (newText != oldText) {
+		setText(newText);
+		setCursorPosition(newPos);
+	}
+}
+
+UsernameBox::UsernameBox() :
+_saveButton(this, lang(lng_settings_save), st::usernameDone),
+_cancelButton(this, lang(lng_cancel), st::usernameCancel),
+_usernameInput(this, st::inpAddContact, qsl("@username"), App::self()->username),
+_saveRequest(0), _checkRequest(0), _about(st::usernameWidth - 2 * st::addContactTitlePos.x()),
+a_opacity(0, 1), _hiding(false) {
+	_about.setRichText(st::usernameFont, lang(lng_username_about));
+	initBox();
+}
+
+void UsernameBox::initBox() {
+	_width = st::usernameWidth;
+	_height = st::addContactTitleHeight + st::addContactPadding.top() + _usernameInput.height() + st::addContactPadding.bottom() + _about.countHeight(st::usernameWidth - 2 * st::addContactTitlePos.x()) + st::usernameSkip + _saveButton.height();
+	_usernameInput.setGeometry(st::addContactPadding.left(), st::addContactTitleHeight + st::addContactPadding.top(), _width - st::addContactPadding.left() - st::addContactPadding.right(), _usernameInput.height());
+
+	int32 buttonTop = _height - _cancelButton.height();
+	_cancelButton.move(0, buttonTop);
+	_saveButton.move(_width - _saveButton.width(), buttonTop);
+
+	connect(&_saveButton, SIGNAL(clicked()), this, SLOT(onSave()));
+	connect(&_cancelButton, SIGNAL(clicked()), this, SLOT(onCancel()));
+	connect(&_usernameInput, SIGNAL(changed()), this, SLOT(onChanged()));
+
+	_checkTimer.setSingleShot(true);
+	connect(&_checkTimer, SIGNAL(timeout()), this, SLOT(onCheck()));
+
+	resize(_width, _height);
+
+	showAll();
+	_cache = myGrab(this, rect());
+	hideAll();
+}
+
+void UsernameBox::hideAll() {
+	_usernameInput.hide();
+	_saveButton.hide();
+	_cancelButton.hide();
+}
+
+void UsernameBox::showAll() {
+	_usernameInput.show();
+	_saveButton.show();
+	_cancelButton.show();
+}
+
+void UsernameBox::keyPressEvent(QKeyEvent *e) {
+	if (e->key() == Qt::Key_Enter || e->key() == Qt::Key_Return) {
+		onSave();
+	} else if (e->key() == Qt::Key_Escape) {
+		onCancel();
+	}
+}
+
+void UsernameBox::parentResized() {
+	QSize s = parentWidget()->size();
+	setGeometry((s.width() - _width) / 2, (s.height() - _height) / 2, _width, _height);
+	update();
+}
+
+void UsernameBox::paintEvent(QPaintEvent *e) {
+	QPainter p(this);
+	if (_cache.isNull()) {
+		if (!_hiding || a_opacity.current() > 0.01) {
+			// fill bg
+			p.fillRect(QRect(QPoint(0, 0), size()), st::boxBG->b);
+
+			// paint shadows
+			p.fillRect(0, st::addContactTitleHeight, _width, st::scrollDef.topsh, st::scrollDef.shColor->b);
+			p.fillRect(0, size().height() - st::usernameCancel.height - st::scrollDef.bottomsh, _width, st::scrollDef.bottomsh, st::scrollDef.shColor->b);
+
+			// paint button sep
+			p.fillRect(st::usernameCancel.width, size().height() - st::usernameCancel.height, st::lineWidth, st::usernameCancel.height, st::btnSelectSep->b);
+
+			// draw box title / text
+			p.setPen(st::black->p);
+			p.setFont(st::addContactTitleFont->f);
+			p.drawText(st::addContactTitlePos.x(), st::addContactTitlePos.y() + st::addContactTitleFont->ascent, lang(lng_username_title));
+
+			if (!_errorText.isEmpty()) {
+				p.setPen(st::setErrColor->p);
+				p.setFont(st::setErrFont->f);
+				int32 w = st::setErrFont->m.width(_errorText);
+				p.drawText((_width - w) / 2, _usernameInput.y() + _usernameInput.height() + ((st::usernameSkip - st::setErrFont->height) / 2) + st::setErrFont->ascent, _errorText);
+			}
+			p.setPen(st::usernameColor->p);
+			_about.draw(p, st::addContactTitlePos.x(), _usernameInput.y() + _usernameInput.height() + st::usernameSkip, width() - 2 * st::addContactTitlePos.x());
+		}
+	} else {
+		p.setOpacity(a_opacity.current());
+		p.drawPixmap(0, 0, _cache);
+	}
+}
+
+void UsernameBox::animStep(float64 dt) {
+	if (dt >= 1) {
+		a_opacity.finish();
+		_cache = QPixmap();
+		if (!_hiding) {
+			showAll();
+			_usernameInput.setFocus();
+		}
+	} else {
+		a_opacity.update(dt, anim::linear);
+	}
+	update();
+}
+
+void UsernameBox::onSave() {
+	if (_saveRequest) return;
+
+	_sentUsername = getName();
+	_saveRequest = MTP::send(MTPaccount_UpdateUsername(MTP_string(_sentUsername)), rpcDone(&UsernameBox::onUpdateDone), rpcFail(&UsernameBox::onUpdateFail));
+}
+
+void UsernameBox::onCheck() {
+	if (_checkRequest) {
+		MTP::cancel(_checkRequest);
+	}
+	QString name = getName();
+	if (name.size() >= MinUsernameLength) {
+		_checkRequest = MTP::send(MTPaccount_CheckUsername(MTP_string(name)), rpcDone(&UsernameBox::onCheckDone), rpcFail(&UsernameBox::onCheckFail));
+	}
+}
+
+void UsernameBox::onChanged() {
+	QString name = getName();
+	if (name.isEmpty()) {
+		if (!_errorText.isEmpty()) {
+			_errorText = QString();
+			update();
+		}
+		_checkTimer.stop();
+	} else if (name.size() < MinUsernameLength) {
+		if (_errorText != lang(lng_username_too_short)) {
+			_errorText = lang(lng_username_too_short);
+			update();
+		}
+		_checkTimer.stop();
+	} else {
+		if (!_errorText.isEmpty()) {
+			_errorText = QString();
+			update();
+		}
+		_checkTimer.start(UsernameCheckTimeout);
+	}
+}
+
+void UsernameBox::onUpdateDone(const MTPUser &user) {
+	App::feedUsers(MTP_vector<MTPUser>(QVector<MTPUser>(1, user)));
+	emit closed();
+}
+
+bool UsernameBox::onUpdateFail(const RPCError &error) {
+	_saveRequest = 0;
+	QString err(error.type()), name = getName();
+	if (err == "USERNAME_NOT_MODIFIED") {
+		App::self()->setName(textOneLine(App::self()->firstName), textOneLine(App::self()->lastName), textOneLine(App::self()->nameOrPhone), textOneLine(name));
+		emit closed();
+		return true;
+	} else if (err == "USERNAME_INVALID") {
+		_usernameInput.setFocus();
+		_usernameInput.notaBene();
+		_errorText = lang(lng_username_invalid);
+		return true;
+	} else if (err == "USERNAME_OCCUPIED") {
+		_usernameInput.setFocus();
+		_usernameInput.notaBene();
+		_errorText = lang(lng_username_occupied);
+		return true;
+	}
+	_usernameInput.setFocus();
+	return true;
+}
+
+void UsernameBox::onCheckDone(const MTPBool &result) {
+	_checkRequest = 0;
+	QString newError = result.v ? QString() : lang(lng_username_occupied);
+	if (_errorText != newError) {
+		_errorText = newError;
+		update();
+	}
+}
+
+bool UsernameBox::onCheckFail(const RPCError &error) {
+	_checkRequest = 0;
+	QString err(error.type());
+	if (err == "USERNAME_INVALID") {
+		_errorText = lang(lng_username_invalid);
+		update();
+		return true;
+	} else if (err == "USERNAME_OCCUPIED") {
+		_errorText = lang(lng_username_occupied);
+		update();
+		return true;
+	}
+	_usernameInput.setFocus();
+	return true;
+}
+
+QString UsernameBox::getName() const {
+	return _usernameInput.text().replace('@', QString()).trimmed();
+}
+
+void UsernameBox::onCancel() {
+	emit closed();
+}
+
+void UsernameBox::startHide() {
+	_hiding = true;
+	if (_cache.isNull()) {
+		_cache = myGrab(this, rect());
+		hideAll();
+	}
+	a_opacity.start(0);
+}
+
+UsernameBox::~UsernameBox() {
+}
diff --git a/Telegram/SourceFiles/boxes/usernamebox.h b/Telegram/SourceFiles/boxes/usernamebox.h
new file mode 100644
index 0000000000..2179d8d61c
--- /dev/null
+++ b/Telegram/SourceFiles/boxes/usernamebox.h
@@ -0,0 +1,82 @@
+/*
+This file is part of Telegram Desktop,
+an unofficial desktop messaging app, see https://telegram.org
+
+Telegram Desktop is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+It is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+Full license: https://github.com/telegramdesktop/tdesktop/blob/master/LICENSE
+Copyright (c) 2014 John Preston, https://tdesktop.com
+*/
+#pragma once
+
+#include "layerwidget.h"
+
+class UsernameInput : public FlatInput {
+public:
+
+	UsernameInput(QWidget *parent, const style::flatInput &st, const QString &ph = QString(), const QString &val = QString());
+
+protected:
+
+	void correctValue(QKeyEvent *e, const QString &was);
+
+};
+
+class UsernameBox : public LayeredWidget, public RPCSender {
+	Q_OBJECT
+
+public:
+
+	UsernameBox();
+	void parentResized();
+	void animStep(float64 dt);
+	void keyPressEvent(QKeyEvent *e);
+	void paintEvent(QPaintEvent *e);
+	void startHide();
+	~UsernameBox();
+
+public slots:
+
+	void onSave();
+	void onCancel();
+	
+	void onCheck();
+	void onChanged();
+
+private:
+
+	void hideAll();
+	void showAll();
+
+	void onUpdateDone(const MTPUser &result);
+	bool onUpdateFail(const RPCError &error);
+
+	void onCheckDone(const MTPBool &result);
+	bool onCheckFail(const RPCError &error);
+
+	QString getName() const;
+	void initBox();
+
+	int32 _width, _height;
+	FlatButton _saveButton, _cancelButton;
+	UsernameInput _usernameInput;
+
+	QPixmap _cache;
+
+	mtpRequestId _saveRequest, _checkRequest;
+	QString _sentUsername, _errorText;
+
+	Text _about;
+	QTimer _checkTimer;
+
+	anim::fvalue a_opacity;
+	bool _hiding;
+};
diff --git a/Telegram/SourceFiles/config.h b/Telegram/SourceFiles/config.h
index 27c02fe736..0ceb0af539 100644
--- a/Telegram/SourceFiles/config.h
+++ b/Telegram/SourceFiles/config.h
@@ -88,6 +88,11 @@ enum {
 	PreloadHeightsCount = 3, // when 3 screens to scroll left make a preload request
 	EmojiPadPerRow = 7,
 	EmojiPadRowsPerPage = 6,
+
+	SearchPeopleLimit = 5,
+	MinUsernameLength = 5,
+	MaxUsernameLength = 32,
+	UsernameCheckTimeout = 200,
 };
 
 #ifdef Q_OS_WIN
diff --git a/Telegram/SourceFiles/dialogswidget.cpp b/Telegram/SourceFiles/dialogswidget.cpp
index c95880dcb7..0e69cb5f51 100644
--- a/Telegram/SourceFiles/dialogswidget.cpp
+++ b/Telegram/SourceFiles/dialogswidget.cpp
@@ -26,7 +26,7 @@ Copyright (c) 2014 John Preston, https://tdesktop.com
 #include "boxes/newgroupbox.h"
 
 DialogsListWidget::DialogsListWidget(QWidget *parent, MainWidget *main) : QWidget(parent),
-dialogs(false), contactsNoDialogs(true), contacts(true), sel(0), contactSel(false), selByMouse(false), filteredSel(-1), searchedCount(0), searchedSel(-1), _lastSearchId(0), _state(DefaultState) {
+dialogs(false), contactsNoDialogs(true), contacts(true), sel(0), contactSel(false), selByMouse(false), filteredSel(-1), searchedCount(0), searchedSel(-1), peopleSel(-1), _lastSearchId(0), _state(DefaultState) {
 	connect(main, SIGNAL(dialogToTop(const History::DialogLinks &)), this, SLOT(onDialogToTop(const History::DialogLinks &)));
 	connect(main, SIGNAL(peerNameChanged(PeerData *, const PeerData::Names &, const PeerData::NameFirstChars &)), this, SLOT(onPeerNameChanged(PeerData *, const PeerData::Names &, const PeerData::NameFirstChars &)));
 	connect(main, SIGNAL(peerPhotoChanged(PeerData *)), this, SLOT(onPeerPhotoChanged(PeerData *)));
@@ -76,6 +76,33 @@ void DialogsListWidget::paintEvent(QPaintEvent *e) {
 			}
 		}
 
+		if (!peopleResults.isEmpty()) {
+			p.fillRect(0, 0, width(), st::searchedBarHeight, st::searchedBarBG->b);
+			p.setFont(st::searchedBarFont->f);
+			p.setPen(st::searchedBarColor->p);
+			p.drawText(QRect(0, 0, width(), st::searchedBarHeight), lang(lng_search_global_results), style::al_center);
+			p.translate(0, st::searchedBarHeight);
+		
+			int32 skip = filterResults.size() * st::dlgHeight + st::searchedBarHeight;
+			int32 from = (r.top() - skip) / int32(st::dlgHeight);
+			if (from < 0) {
+				from = 0;
+			} else if (from > peopleResults.size()) {
+				from = peopleResults.size();
+			}
+			p.translate(0, from * st::dlgHeight);
+			if (from < peopleResults.size()) {
+				int32 to = ((r.bottom() - skip) / int32(st::dlgHeight)) + 1, w = width();
+				if (to > peopleResults.size()) to = peopleResults.size();
+				for (; from < to; ++from) {
+					bool active = (peopleResults[from] == App::main()->activePeer() && !App::main()->activeMsgId());
+					bool selected = (from == peopleSel);
+					peopleResultPaint(peopleResults[from], p, w, active, selected);
+					p.translate(0, st::dlgHeight);
+				}
+			}
+		}
+
 		if (_state == SearchedState || !searchResults.isEmpty()) {
 			QString text = searchResults.isEmpty() ? lang(lng_search_no_results) : lang(searchedCount > 1 ? lng_search_n_results : lng_search_one_result).replace(qsl("{count}"), QString::number(searchedCount));
 			p.fillRect(0, 0, width(), st::searchedBarHeight, st::searchedBarBG->b);
@@ -85,13 +112,17 @@ void DialogsListWidget::paintEvent(QPaintEvent *e) {
 			p.translate(0, st::searchedBarHeight);
 
 			int32 skip = filterResults.size() * st::dlgHeight + st::searchedBarHeight;
+			if (!peopleResults.isEmpty()) skip += peopleResults.size() * st::dlgHeight + st::searchedBarHeight;
 			int32 from = (r.top() - skip) / int32(st::dlgHeight);
-			if (from < 0) from = 0;
+			if (from < 0) {
+				from = 0;
+			} else if (from > searchResults.size()) {
+				from = searchResults.size();
+			}
+			p.translate(0, from * st::dlgHeight);
 			if (from < searchResults.size()) {
 				int32 to = ((r.bottom() - skip) / int32(st::dlgHeight)) + 1, w = width();
 				if (to > searchResults.size()) to = searchResults.size();
-
-				p.translate(0, from * st::dlgHeight);
 				for (; from < to; ++from) {
 					bool active = (searchResults[from]->_item->id == App::main()->activeMsgId());
 					bool selected = (from == searchedSel);
@@ -103,6 +134,34 @@ void DialogsListWidget::paintEvent(QPaintEvent *e) {
 	}
 }
 
+void DialogsListWidget::peopleResultPaint(UserData *user, QPainter &p, int32 w, bool act, bool sel) const {
+	QRect fullRect(0, 0, w, st::dlgHeight);
+	p.fillRect(fullRect, (act ? st::dlgActiveBG : (sel ? st::dlgHoverBG : st::dlgBG))->b);
+
+	History *history = App::history(user->id);
+
+	p.drawPixmap(st::dlgPaddingHor, st::dlgPaddingVer, history->peer->photo->pix(st::dlgPhotoSize));
+
+	int32 nameleft = st::dlgPaddingHor + st::dlgPhotoSize + st::dlgPhotoPadding;
+	int32 namewidth = w - nameleft - st::dlgPaddingHor;
+	QRect rectForName(nameleft, st::dlgPaddingVer + st::dlgNameTop, namewidth, st::msgNameFont->height);
+
+	// draw chat icon
+	if (history->peer->chat) {
+		p.drawPixmap(QPoint(rectForName.left() + st::dlgChatImgLeft, rectForName.top() + st::dlgChatImgTop), App::sprite(), (act ? st::dlgActiveChatImg : st::dlgChatImg));
+		rectForName.setLeft(rectForName.left() + st::dlgChatImgSkip);
+	}
+
+	// draw unread
+	QRect tr(nameleft, st::dlgPaddingVer + st::dlgFont->height + st::dlgSep, namewidth, st::dlgFont->height);
+	p.setPen((act ? st::dlgActiveColor : st::dlgSystemColor)->p);
+	p.setFont(st::dlgHistFont->f);
+	p.drawText(tr.left(), tr.top() + st::dlgHistFont->ascent, st::dlgHistFont->m.elidedText('@' + user->username, Qt::ElideRight, tr.width()));
+
+	p.setPen((act ? st::dlgActiveColor : st::dlgNameColor)->p);
+	history->nameText.drawElided(p, rectForName.left(), rectForName.top(), rectForName.width());
+}
+
 void DialogsListWidget::activate() {
 	if (_state == DefaultState && !sel) {
 		selectSkip(1);
@@ -147,9 +206,21 @@ void DialogsListWidget::onUpdateSelected(bool force) {
 				parentWidget()->update();
 			}
 		}
+		mouseY -= filterResults.size() * st::dlgHeight + st::searchedBarHeight;
+		if (!peopleResults.isEmpty()) {
+			int32 newPeopleSel = (mouseY >= 0) ? (mouseY / int32(st::dlgHeight)) : -1;
+			if (newPeopleSel < 0 || newPeopleSel >= peopleResults.size()) {
+				newPeopleSel = -1;
+			}
+			if (newPeopleSel != peopleSel) {
+				peopleSel = newPeopleSel;
+				setCursor((peopleSel >= 0) ? style::cur_pointer : style::cur_default);
+				parentWidget()->update();
+			}
+			mouseY -= peopleResults.size() * st::dlgHeight + st::searchedBarHeight;
+		}
 		if (_state == SearchedState && !searchResults.isEmpty()) {
-			mouseY -= filterResults.size() * st::dlgHeight + st::searchedBarHeight;
-			int32 newSearchedSel = (mouseY >= 0) ? mouseY / int32(st::dlgHeight) : -1;
+			int32 newSearchedSel = (mouseY >= 0) ? (mouseY / int32(st::dlgHeight)) : -1;
 			if (newSearchedSel < 0 || newSearchedSel >= searchResults.size()) {
 				newSearchedSel = -1;
 			}
@@ -276,8 +347,18 @@ void DialogsListWidget::dlgUpdated(History *history) {
 			}
 			++cnt;
 		}
-		if (!searchResults.isEmpty()) {
+		if (!peopleResults.isEmpty()) {
 			int32 cnt = 0, add = filterResults.size() * st::dlgHeight + st::searchedBarHeight;
+			for (PeopleResults::const_iterator i = peopleResults.cbegin(), e = peopleResults.cend(); i != e; ++i) {
+				if ((*i) == history->peer) {
+					update(0, add + cnt * st::dlgHeight, width(), st::dlgHeight);
+					break;
+				}
+				++cnt;
+			}
+		}
+		if (!searchResults.isEmpty()) {
+			int32 cnt = 0, add = (filterResults.size() + peopleResults.size()) * st::dlgHeight + (peopleResults.isEmpty() ? 0 : st::searchedBarHeight) + st::searchedBarHeight;
 			for (SearchResults::const_iterator i = searchResults.cbegin(), e = searchResults.cend(); i != e; ++i) {
 				if ((*i)->_item->history() == history) {
 					update(0, add + cnt * st::dlgHeight, width(), st::dlgHeight);
@@ -352,6 +433,7 @@ void DialogsListWidget::onFilterUpdate(QString newFilter, bool force) {
 			if (filter.isEmpty()) {
 				_state = DefaultState;
 				filterResults.clear();
+				peopleResults.clear();
 				searchResults.clear();
 				_lastSearchId = 0;
 			} else {
@@ -441,7 +523,8 @@ DialogsListWidget::~DialogsListWidget() {
 	clearSearchResults();
 }
 
-void DialogsListWidget::clearSearchResults() {	
+void DialogsListWidget::clearSearchResults(bool clearPeople) {	
+	if (clearPeople) peopleResults.clear();
 	if (!searchResults.isEmpty()) {
 		for (SearchResults::const_iterator i = searchResults.cbegin(), e = searchResults.cend(); i != e; ++i) {
 			delete *i;
@@ -490,7 +573,7 @@ void DialogsListWidget::dialogsReceived(const QVector<MTPDialog> &added) {
 
 void DialogsListWidget::searchReceived(const QVector<MTPMessage> &messages, bool fromStart, int32 fullCount) {
 	if (fromStart) {
-		clearSearchResults();
+		clearSearchResults(false);
 	}
 	for (QVector<MTPMessage>::const_iterator i = messages.cbegin(), e = messages.cend(); i != e; ++i) {
 		HistoryItem *item = App::histories().addToBack(*i, -1);
@@ -504,6 +587,19 @@ void DialogsListWidget::searchReceived(const QVector<MTPMessage> &messages, bool
 	refresh();
 }
 
+void DialogsListWidget::peopleReceived(const QVector<MTPContactFound> &people) {
+	peopleResults.clear();
+	peopleResults.reserve(people.size());
+	for (QVector<MTPContactFound>::const_iterator i = people.cbegin(), e = people.cend(); i != e; ++i) {
+		int32 uid = i->c_contactFound().vuser_id.v;
+		History *h = App::historyLoaded(uid);
+		if (h && !h->isEmpty()) continue; // skip dialogs
+
+		peopleResults.push_back(App::user(uid));
+	}
+	refresh();
+}
+
 void DialogsListWidget::contactsReceived(const QVector<MTPContact> &contacts) {
 	for (QVector<MTPContact>::const_iterator i = contacts.cbegin(), e = contacts.cend(); i != e; ++i) {
 		addNewContact(i->c_contact().vuser_id.v);
@@ -543,9 +639,9 @@ void DialogsListWidget::refresh(bool toTop) {
 	if (_state == DefaultState) {
 		h = (dialogs.list.count + contactsNoDialogs.list.count) * st::dlgHeight;
 	} else if (_state == FilteredState) {
-		h = (filterResults.count() + searchResults.count()) * st::dlgHeight + (searchResults.isEmpty() ? 0 : st::searchedBarHeight);
+		h = (filterResults.count() + peopleResults.count() + searchResults.count()) * st::dlgHeight + (peopleResults.isEmpty() ? 0 : st::searchedBarHeight) + (searchResults.isEmpty() ? 0 : st::searchedBarHeight);
 	} else if (_state == SearchedState) {
-		h = (filterResults.count() + searchResults.count()) * st::dlgHeight + st::searchedBarHeight;
+		h = (filterResults.count() + peopleResults.count() + searchResults.count()) * st::dlgHeight + (peopleResults.isEmpty() ? 0 : st::searchedBarHeight) + st::searchedBarHeight;
 	}
 	resize(width(), h);
 	if (toTop) {
@@ -562,8 +658,7 @@ void DialogsListWidget::setMouseSel(bool msel, bool toTop) {
 			sel = (dialogs.list.count ? dialogs.list.begin : (contactsNoDialogs.list.count ? contactsNoDialogs.list.begin : 0));
 			contactSel = !dialogs.list.count && contactsNoDialogs.list.count;
 		} else if (_state == FilteredState || _state == SearchedState) { // don't select first elem in search
-			filteredSel = -1;
-			searchedSel = -1;
+			filteredSel = peopleSel = searchedSel = -1;
 		}
 	}
 }
@@ -572,7 +667,7 @@ void DialogsListWidget::setState(State newState) {
 	_state = newState;
 	if (_state == DefaultState) {
 		clearSearchResults();
-		searchedSel = filteredSel = -1;
+		searchedSel = peopleSel = filteredSel = -1;
 	} else if (_state == DefaultState || _state == SearchedState) {
 		filterResults.clear();
 		filteredSel = -1;
@@ -589,6 +684,7 @@ void DialogsListWidget::clearFilter() {
 	if (_state == FilteredState || _state == SearchedState) {
 		_state = DefaultState;
 		filterResults.clear();
+		peopleResults.clear();
 		searchResults.clear();
 		_lastSearchId = 0;
 		filter = QString();
@@ -606,7 +702,6 @@ void DialogsListWidget::addDialog(const MTPDdialog &dialog) {
 }
 
 void DialogsListWidget::selectSkip(int32 direction) {
-	int32 skipMore = 0;
 	if (_state == DefaultState) {
 		if (!sel) {
 			if (dialogs.list.count && direction > 0) {
@@ -634,55 +729,40 @@ void DialogsListWidget::selectSkip(int32 direction) {
 		int32 fromY = (sel->pos + (contactSel ? dialogs.list.count : 0)) * st::dlgHeight;
 		emit mustScrollTo(fromY, fromY + st::dlgHeight);
 	} else if (_state == FilteredState || _state == SearchedState) {
-		if (filterResults.isEmpty() && searchResults.isEmpty()) return;
-		if (filteredSel < 0 || filteredSel >= filterResults.size()) {
-			if (searchedSel < 0 || searchedSel >= searchResults.size()) {
-				if (filterResults.isEmpty()) {
-					searchedSel = 0;
-				} else {
-					filteredSel = 0;
-				}
-			} else if (direction < 0 && !searchedSel && !filterResults.isEmpty()) {
-				searchedSel = -1;
-				filteredSel = filterResults.size() + direction;
-				if (filteredSel < 0) filteredSel = 0;
+		if (filterResults.isEmpty() && peopleResults.isEmpty() && searchResults.isEmpty()) return;
+		if ((filteredSel < 0 || filteredSel >= filterResults.size()) &&
+			(peopleSel < 0 || peopleSel >= peopleResults.size()) &&
+			(searchedSel < 0 || searchedSel >= searchResults.size())) {
+			if (filterResults.isEmpty() && peopleResults.isEmpty()) {
+				searchedSel = 0;
+			} else if (filterResults.isEmpty()) {
+				peopleSel = 0;
 			} else {
-				if (direction < -1 && searchedSel + direction < 0) {
-					skipMore = direction + searchedSel;
-					if (skipMore == direction) {
-						skipMore = 0;
-					} else {
-						direction -= skipMore;
-					}
-				}
-				searchedSel = snap(searchedSel + direction, 0, searchResults.size() - 1);
+				filteredSel = 0;
 			}
-		} else if (direction > 0 && filteredSel == filterResults.size() - 1 && !searchResults.isEmpty()) {
-			filteredSel = -1;
-			searchedSel = direction - 1;
-			if (searchedSel > searchResults.size() - 1) searchedSel = searchResults.size() - 1;
 		} else {
-			if (direction > 1 && filteredSel + direction > filterResults.size() - 1) {
-				skipMore = direction - (filterResults.size() - 1 - filteredSel);
-				if (skipMore == direction) {
-					skipMore = 0;
-				} else {
-					direction -= skipMore;
-				}
+			int32 cur = (filteredSel >= 0 && filteredSel < filterResults.size()) ? filteredSel : ((peopleSel >= 0 && peopleSel < peopleResults.size()) ? (peopleSel + filterResults.size()) : (searchedSel + peopleResults.size() + filterResults.size()));
+			cur = snap(cur + direction, 0, filterResults.size() + peopleResults.size() + searchResults.size() - 1);
+			if (cur < filterResults.size()) {
+				filteredSel = cur;
+				peopleSel = searchedSel = -1;
+			} else if (cur < filterResults.size() + peopleResults.size()) {
+				peopleSel = cur - filterResults.size();
+				filteredSel = searchedSel = -1;
+			} else {
+				filteredSel = peopleSel = -1;
+				searchedSel = cur - filterResults.size() - peopleResults.size();
 			}
-			filteredSel = snap(filteredSel + direction, 0, filterResults.size() - 1);
 		}
 		if (filteredSel >= 0 && filteredSel < filterResults.size()) {
 			emit mustScrollTo(filteredSel * st::dlgHeight, (filteredSel + 1) * st::dlgHeight);
+		} else if (peopleSel >= 0 && peopleSel < peopleResults.size()) {
+			emit mustScrollTo((peopleSel + filterResults.size()) * st::dlgHeight + (peopleSel ? st::searchedBarHeight : 0), (peopleSel + filterResults.size() + 1) * st::dlgHeight);
 		} else {
-			emit mustScrollTo((searchedSel + filterResults.size()) * st::dlgHeight + (searchedSel ? st::searchedBarHeight : 0), (searchedSel + filterResults.size() + 1) * st::dlgHeight + st::searchedBarHeight);
+			emit mustScrollTo((searchedSel + peopleResults.size() + filterResults.size()) * st::dlgHeight + (peopleResults.size() ? st::searchedBarHeight : 0) + (searchedSel ? st::searchedBarHeight : 0), (searchedSel + peopleResults.size() + filterResults.size() + 1) * st::dlgHeight + (peopleResults.size() ? st::searchedBarHeight : 0) + st::searchedBarHeight);
 		}
 	}
-	if (skipMore) {
-		return selectSkip(skipMore);
-	} else {
-		parentWidget()->update();
-	}
+	parentWidget()->update();
 }
 
 void DialogsListWidget::scrollToPeer(const PeerId &peer, MsgId msgId) {
@@ -798,8 +878,18 @@ void DialogsListWidget::loadPeerPhotos(int32 yFrom) {
 
 		from = (yFrom > st::searchedBarHeight ? ((yFrom - st::searchedBarHeight) / int32(st::dlgHeight)) : 0) - filterResults.size();
 		if (from < 0) from = 0;
-		if (from < searchResults.size()) {
+		if (from < peopleResults.size()) {
 			int32 to = (yTo > st::searchedBarHeight ? ((yTo - st::searchedBarHeight) / int32(st::dlgHeight)) : 0) - filterResults.size() + 1, w = width();
+			if (to > peopleResults.size()) to = peopleResults.size();
+
+			for (; from < to; ++from) {
+				peopleResults[from]->photo->load();
+			}
+		}
+		from = (yFrom > ((peopleResults.isEmpty() ? 0 : st::searchedBarHeight) + st::searchedBarHeight) ? ((yFrom - (peopleResults.isEmpty() ? 0 : st::searchedBarHeight) - st::searchedBarHeight) / int32(st::dlgHeight)) : 0) - filterResults.size() - peopleResults.size();
+		if (from < 0) from = 0;
+		if (from < searchResults.size()) {
+			int32 to = (yTo >(peopleResults.isEmpty() ? 0 : st::searchedBarHeight) + st::searchedBarHeight ? ((yTo - (peopleResults.isEmpty() ? 0 : st::searchedBarHeight) - st::searchedBarHeight) / int32(st::dlgHeight)) : 0) - filterResults.size() - peopleResults.size() + 1, w = width();
 			if (to > searchResults.size()) to = searchResults.size();
 
 			for (; from < to; ++from) {
@@ -817,15 +907,21 @@ bool DialogsListWidget::choosePeer() {
 	} else if (_state == FilteredState || _state == SearchedState) {
 		if (filteredSel >= 0 && filteredSel < filterResults.size()) {
 			history = filterResults[filteredSel]->history;
+		} else if (peopleSel >= 0 && peopleSel < peopleResults.size()) {
+			history = App::history(peopleResults[peopleSel]->id);
 		} else if (searchedSel >= 0 && searchedSel < searchResults.size()) {
 			history = searchResults[searchedSel]->_item->history();
 			msgId = searchResults[searchedSel]->_item->id;
 		}
 	}
 	if (history) {
-		emit peerChosen(history->peer->id, msgId);
+		bool chosen = (!App::main()->selectingPeer() && (_state == FilteredState || _state == SearchedState) && filteredSel >= 0 && filteredSel < filterResults.size());
+		App::main()->showPeer(history->peer->id, msgId);
+		if (chosen) {
+			emit searchResultChosen();
+		}
 		sel = 0;
-		filteredSel = -1;
+		filteredSel = peopleSel = searchedSel = -1;
 		parentWidget()->update();
 		return true;
 	}
@@ -835,10 +931,10 @@ bool DialogsListWidget::choosePeer() {
 void DialogsListWidget::destroyData() {
 	sel = 0;
 	contactSel = false;
-	filteredSel = 0;
+	filteredSel = -1;
 	filterResults.clear();
 	filter.clear();
-	searchedSel = 0;
+	searchedSel = peopleSel = -1;
 	clearSearchResults();
 	contacts.clear();
 	contactsNoDialogs.clear();
@@ -883,6 +979,33 @@ void DialogsListWidget::peerBefore(const PeerData *inPeer, MsgId inMsg, PeerData
 					return;
 				}
 			}
+			if (searchResults.at(0)->_item->history()->peer == inPeer && searchResults.at(0)->_item->id == inMsg) {
+				outMsg = 0;
+				if (peopleResults.isEmpty()) {
+					if (filterResults.isEmpty()) {
+						outPeer = 0;
+					} else {
+						outPeer = filterResults.back()->history->peer;
+					}
+				} else {
+					outPeer = peopleResults.back();
+				}
+				return;
+			}
+		}
+		if (!peopleResults.isEmpty() && peopleResults.at(0) == inPeer) {
+			outPeer = filterResults.isEmpty() ? 0 : filterResults.back()->history->peer;
+			outMsg = 0;
+			return;
+		}
+		if (!peopleResults.isEmpty()) {
+			for (PeopleResults::const_iterator b = peopleResults.cbegin(), i = b + 1, e = peopleResults.cend(); i != e; ++i) {
+				if ((*i) == inPeer) {
+					outPeer = (*(i - 1));
+					outMsg = 0;
+					return;
+				}
+			}
 		}
 		if (filterResults.isEmpty() || filterResults.at(0)->history->peer == inPeer) {
 			outPeer = 0;
@@ -892,8 +1015,7 @@ void DialogsListWidget::peerBefore(const PeerData *inPeer, MsgId inMsg, PeerData
 
 		for (FilteredDialogs::const_iterator b = filterResults.cbegin(), i = b + 1, e = filterResults.cend(); i != e; ++i) {
 			if ((*i)->history->peer == inPeer) {
-				FilteredDialogs::const_iterator j = i - 1;
-				outPeer = (*j)->history->peer;
+				outPeer = (*(i - 1))->history->peer;
 				outMsg = 0;
 				return;
 			}
@@ -943,11 +1065,32 @@ void DialogsListWidget::peerAfter(const PeerData *inPeer, MsgId inMsg, PeerData
 				}
 			}
 		}
+		for (PeopleResults::const_iterator i = peopleResults.cbegin(), e = peopleResults.cend(); i != e; ++i) {
+			if ((*i) == inPeer) {
+				++i;
+				if (i == e && !searchResults.isEmpty()) {
+					outPeer = searchResults.front()->_item->history()->peer;
+					outMsg = searchResults.front()->_item->id;
+				} else {
+					outPeer = (i == e) ? 0 : (*i);
+					outMsg = 0;
+				}
+				return;
+			}
+		}
 		for (FilteredDialogs::const_iterator i = filterResults.cbegin(), e = filterResults.cend(); i != e; ++i) {
 			if ((*i)->history->peer == inPeer) {
 				++i;
-				outPeer = (i == e) ? 0 : (*i)->history->peer;
-				outMsg = 0;
+				if (i == e && !peopleResults.isEmpty()) {
+					outPeer = peopleResults.front();
+					outMsg = 0;
+				} else if (i == e && !searchResults.isEmpty()) {
+					outPeer = searchResults.front()->_item->history()->peer;
+					outMsg = searchResults.front()->_item->id;
+				} else {
+					outPeer = (i == e) ? 0 : (*i)->history->peer;
+					outMsg = 0;
+				}
 				return;
 			}
 		}
@@ -964,6 +1107,14 @@ DialogsIndexed &DialogsListWidget::dialogsList() {
 	return dialogs;
 }
 
+DialogsListWidget::FilteredDialogs &DialogsListWidget::filteredList() {
+	return filterResults;
+}
+
+DialogsListWidget::PeopleResults &DialogsListWidget::peopleList() {
+	return peopleResults;
+}
+
 DialogsListWidget::SearchResults &DialogsListWidget::searchList() {
 	return searchResults;
 }
@@ -985,13 +1136,14 @@ DialogsWidget::DialogsWidget(MainWidget *parent) : QWidget(parent)
 , scroll(this, st::dlgScroll)
 , list(&scroll, parent)
 , _searchFull(false)
+, _peopleFull(false)
 {
 	scroll.setWidget(&list);
 	scroll.setFocusPolicy(Qt::NoFocus);
 	connect(&list, SIGNAL(mustScrollTo(int, int)), &scroll, SLOT(scrollToY(int, int)));
 	connect(&list, SIGNAL(dialogToTopFrom(int)), this, SLOT(onDialogToTopFrom(int)));
-	connect(&list, SIGNAL(peerChosen(const PeerId &, MsgId)), this, SIGNAL(peerChosen(const PeerId &, MsgId)));
 	connect(&list, SIGNAL(searchMessages()), this, SLOT(onNeedSearchMessages()));
+	connect(&list, SIGNAL(searchResultChosen()), this, SLOT(onCancel()));
 	connect(&scroll, SIGNAL(geometryChanged()), &list, SLOT(onParentGeometryChanged()));
 	connect(&scroll, SIGNAL(scrolled()), &list, SLOT(onUpdateSelected()));
 	connect(&scroll, SIGNAL(scrolled()), this, SLOT(onListScroll()));
@@ -1082,10 +1234,6 @@ void DialogsWidget::onCancel() {
 	emit cancelled();
 }
 
-void DialogsWidget::clearFiltered() {
-	onCancel();
-}
-
 void DialogsWidget::itemRemoved(HistoryItem *item) {
 	list.itemRemoved(item);
 }
@@ -1164,6 +1312,9 @@ bool DialogsWidget::onSearchMessages(bool searchCache) {
 		if (_searchRequest) {
 			_searchRequest = 0;
 		}
+		if (_peopleRequest) {
+			_peopleRequest = 0;
+		}
 		return true;
 	}
 	if (searchCache) {
@@ -1181,6 +1332,22 @@ bool DialogsWidget::onSearchMessages(bool searchCache) {
 		_searchRequest = MTP::send(MTPmessages_Search(MTP_inputPeerEmpty(), MTP_string(_searchQuery), MTP_inputMessagesFilterEmpty(), MTP_int(0), MTP_int(0), MTP_int(0), MTP_int(0), MTP_int(SearchPerPage)), rpcDone(&DialogsWidget::searchReceived, true), rpcFail(&DialogsWidget::searchFailed));
 		_searchQueries.insert(_searchRequest, _searchQuery);
 	}
+	if (q.size() >= MinUsernameLength) {
+		if (searchCache) {
+			PeopleCache::const_iterator i = _peopleCache.constFind(q);
+			if (i != _peopleCache.cend()) {
+				_peopleQuery = q;
+				_peopleRequest = 0;
+				peopleReceived(i.value(), 0);
+				return true;
+			}
+		} else if (_peopleQuery != q) {
+			_peopleQuery = q;
+			_peopleFull = false;
+			_peopleRequest = MTP::send(MTPcontacts_Search(MTP_string(_peopleQuery), MTP_int(SearchPeopleLimit)), rpcDone(&DialogsWidget::peopleReceived), rpcFail(&DialogsWidget::peopleFailed));
+			_peopleQueries.insert(_peopleRequest, _peopleQuery);
+		}
+	}
 	return false;
 }
 
@@ -1267,6 +1434,28 @@ void DialogsWidget::searchReceived(bool fromStart, const MTPmessages_Messages &r
 	}
 }
 
+void DialogsWidget::peopleReceived(const MTPcontacts_Found &result, mtpRequestId req) {
+	if (list.state() == DialogsListWidget::FilteredState || list.state() == DialogsListWidget::SearchedState) {
+		PeopleQueries::iterator i = _peopleQueries.find(req);
+		if (i != _peopleQueries.cend()) {
+			_peopleCache[i.value()] = result;
+			_peopleQueries.erase(i);
+		}
+	}
+
+	if (_peopleRequest == req) {
+		switch (result.type()) {
+		case mtpc_contacts_found: {
+			App::feedUsers(result.c_contacts_found().vusers);
+			list.peopleReceived(result.c_contacts_found().vresults.c_vector().v);
+		} break;
+		}
+
+		_peopleRequest = 0;
+		onListScroll();
+	}
+}
+
 bool DialogsWidget::searchFailed(const RPCError &error, mtpRequestId req) {
 	if (_searchRequest == req) {
 		_searchRequest = 0;
@@ -1275,6 +1464,14 @@ bool DialogsWidget::searchFailed(const RPCError &error, mtpRequestId req) {
 	return true;
 }
 
+bool DialogsWidget::peopleFailed(const RPCError &error, mtpRequestId req) {
+	if (_peopleRequest == req) {
+		_peopleRequest = 0;
+		_peopleFull = true;
+	}
+	return true;
+}
+
 bool DialogsWidget::addNewContact(int32 uid, bool show) {
 	_filter.setText(QString());
 	onFilterUpdate();
@@ -1288,8 +1485,7 @@ bool DialogsWidget::addNewContact(int32 uid, bool show) {
 void DialogsWidget::onListScroll() {
 	list.loadPeerPhotos(scroll.scrollTop());
 	if (list.state() == DialogsListWidget::SearchedState) {
-		DialogsListWidget::SearchResults &res(list.searchList());
-		if (scroll.scrollTop() > res.size() * st::dlgHeight - PreloadHeightsCount * scroll.height()) {
+		if (scroll.scrollTop() > (list.searchList().size() + list.filteredList().size() + list.peopleList().size()) * st::dlgHeight - PreloadHeightsCount * scroll.height()) {
 			onSearchMore(list.lastSearchId());
 		}
 	} else if (scroll.scrollTop() > list.dialogsList().list.count * st::dlgHeight - PreloadHeightsCount * scroll.height()) {
@@ -1312,6 +1508,11 @@ void DialogsWidget::onFilterUpdate() {
 		_cancelSearch.show();
 		_newGroup.hide();
 	}
+	if (filterText.size() < MinUsernameLength) {
+		_peopleCache.clear();
+		_peopleQueries.clear();
+		_peopleQuery = QString();
+	}
 }
 
 void DialogsWidget::resizeEvent(QResizeEvent *e) {
diff --git a/Telegram/SourceFiles/dialogswidget.h b/Telegram/SourceFiles/dialogswidget.h
index 59d7e3b866..587e8c77fc 100644
--- a/Telegram/SourceFiles/dialogswidget.h
+++ b/Telegram/SourceFiles/dialogswidget.h
@@ -28,6 +28,7 @@ public:
 
 	void dialogsReceived(const QVector<MTPDialog> &dialogs);
 	void searchReceived(const QVector<MTPMessage> &messages, bool fromStart, int32 fullCount);
+	void peopleReceived(const QVector<MTPContactFound> &people);
 	void showMore(int32 pixels);
 
 	void activate();
@@ -41,6 +42,8 @@ public:
 	void enterEvent(QEvent *e);
 	void leaveEvent(QEvent *e);
 
+	void peopleResultPaint(UserData *user, QPainter &p, int32 w, bool act, bool sel) const;
+
 	void selectSkip(int32 direction);
 	void selectSkipPage(int32 pixels, int32 direction);
 
@@ -62,10 +65,14 @@ public:
 	void peerAfter(const PeerData *inPeer, MsgId inMsg, PeerData *&outPeer, MsgId &outMsg) const;
 	void scrollToPeer(const PeerId &peer, MsgId msgId);
 
+	typedef QVector<DialogRow*> FilteredDialogs;
+	typedef QVector<UserData*> PeopleResults;
 	typedef QVector<FakeDialogRow*> SearchResults;
 
 	DialogsIndexed &contactsList();
 	DialogsIndexed &dialogsList();
+	FilteredDialogs &filteredList();
+	PeopleResults &peopleList();
 	SearchResults &searchList();
 	MsgId lastSearchId() const;
 
@@ -96,15 +103,15 @@ public slots:
 
 signals:
 
-	void peerChosen(const PeerId &, MsgId);
 	void mustScrollTo(int scrollToTop, int scrollToBottom);
 	void dialogToTopFrom(int movedFrom);
 	void searchMessages();
+	void searchResultChosen();
 
 private:
 
 	void addDialog(const MTPDdialog &dialog);
-	void clearSearchResults();
+	void clearSearchResults(bool clearPeople = true);
 
 	DialogsIndexed dialogs;
 	DialogsIndexed contactsNoDialogs;
@@ -114,13 +121,15 @@ private:
 	bool selByMouse;
 
 	QString filter;
-	typedef QVector<DialogRow*> FilteredDialogs;
 	FilteredDialogs filterResults;
 	int32 filteredSel;
 
 	SearchResults searchResults;
 	int32 searchedCount, searchedSel;
 
+	PeopleResults peopleResults;
+	int32 peopleSel;
+
 	MsgId _lastSearchId;
 
 	State _state;
@@ -140,6 +149,7 @@ public:
 	void dialogsReceived(const MTPmessages_Dialogs &dialogs);
 	void contactsReceived(const MTPcontacts_Contacts &contacts);
 	void searchReceived(bool fromStart, const MTPmessages_Messages &result, mtpRequestId req);
+	void peopleReceived(const MTPcontacts_Found &result, mtpRequestId req);
 	bool addNewContact(int32 uid, bool show = true);
 	
 	void resizeEvent(QResizeEvent *e);
@@ -174,14 +184,12 @@ public:
 	
 	void searchMessages(const QString &query);
 	void onSearchMore(MsgId minMsgId);
-	void clearFiltered();
 
 	void itemRemoved(HistoryItem *item);
 	void itemReplaced(HistoryItem *oldItem, HistoryItem *newItem);
 
 signals:
 
-	void peerChosen(const PeerId &, MsgId);
 	void cancelled();
 
 public slots:
@@ -206,6 +214,7 @@ private:
 	bool dialogsFailed(const RPCError &e);
 	bool contactsFailed();
 	bool searchFailed(const RPCError &error, mtpRequestId req);
+	bool peopleFailed(const RPCError &error, mtpRequestId req);
 
 	int32 dlgOffset, dlgCount;
 	mtpRequestId dlgPreloading;
@@ -217,9 +226,9 @@ private:
 	DialogsListWidget list;
 
 	QTimer _searchTimer;
-	QString _searchQuery;
-	bool _searchFull;
-	mtpRequestId _searchRequest;
+	QString _searchQuery, _peopleQuery;
+	bool _searchFull, _peopleFull;
+	mtpRequestId _searchRequest, _peopleRequest;
 
 	typedef QMap<QString, MTPmessages_Messages> SearchCache;
 	SearchCache _searchCache;
@@ -227,4 +236,10 @@ private:
 	typedef QMap<mtpRequestId, QString> SearchQueries;
 	SearchQueries _searchQueries;
 
+	typedef QMap<QString, MTPcontacts_Found> PeopleCache;
+	PeopleCache _peopleCache;
+
+	typedef QMap<mtpRequestId, QString> PeopleQueries;
+	PeopleQueries _peopleQueries;
+
 };
diff --git a/Telegram/SourceFiles/gui/flatinput.h b/Telegram/SourceFiles/gui/flatinput.h
index ea7012ef29..09b31215f6 100644
--- a/Telegram/SourceFiles/gui/flatinput.h
+++ b/Telegram/SourceFiles/gui/flatinput.h
@@ -27,7 +27,6 @@ class FlatInput : public QLineEdit, public Animated {
 public:
 
 	FlatInput(QWidget *parent, const style::flatInput &st, const QString &ph = QString(), const QString &val = QString());
-	QString val() const;
 
 	bool event(QEvent *e);
 	void touchEvent(QTouchEvent *e);
diff --git a/Telegram/SourceFiles/history.cpp b/Telegram/SourceFiles/history.cpp
index ffb8510355..64c5e496fb 100644
--- a/Telegram/SourceFiles/history.cpp
+++ b/Telegram/SourceFiles/history.cpp
@@ -306,7 +306,9 @@ void PeerData::updateName(const QString &newName, const QString &newNameOrPhone)
 	NameFirstChars oldChars = chars;
 	fillNames();
 	App::history(id)->updateNameText();
-	emit App::main()->peerNameChanged(this, oldNames, oldChars);
+	if (App::main()) {
+		emit App::main()->peerNameChanged(this, oldNames, oldChars);
+	}
 	nameUpdated();
 }
 
@@ -326,9 +328,38 @@ void UserData::setPhoto(const MTPUserProfilePhoto &p) {
 	emit App::main()->peerPhotoChanged(this);
 }
 
-void UserData::setName(const QString &first, const QString &last, const QString &phoneName) {
+void PeerData::fillNames() {
+	names.clear();
+	chars.clear();
+	QString toIndex = textAccentFold(name);
+	if (nameOrPhone != name) {
+		toIndex += ' ' + textAccentFold(nameOrPhone);
+	}
+	if (!chat) {
+		toIndex += ' ' + textAccentFold(asUser()->username);
+	}
+	if (cRussianLetters().match(toIndex).hasMatch()) {
+		toIndex += ' ' + translitRusEng(toIndex);
+	}
+	toIndex += ' ' + rusKeyboardLayoutSwitch(toIndex);
+
+	QStringList namesList = toIndex.toLower().split(cWordSplit(), QString::SkipEmptyParts);
+	for (QStringList::const_iterator i = namesList.cbegin(), e = namesList.cend(); i != e; ++i) {
+		names.insert(*i);
+		chars.insert(i->at(0));
+	}
+}
+
+
+void UserData::setName(const QString &first, const QString &last, const QString &phoneName, const QString &usern) {
 	bool updName = !first.isEmpty() || !last.isEmpty();
 
+	if (username != usern) {
+		username = usern;
+		if (App::main()) {
+			App::main()->peerUsernameChanged(this);
+		}
+	}
 	if (updName && first.trimmed().isEmpty()) {
 		firstName = last;
 		lastName = QString();
@@ -338,7 +369,7 @@ void UserData::setName(const QString &first, const QString &last, const QString
 			firstName = first;
 			lastName = last;
 		}
-		updateName(firstName + qsl(" ") + lastName, phoneName);
+		updateName(firstName + ' ' + lastName, phoneName);
 	}
 }
 
@@ -1290,16 +1321,20 @@ HistoryItem *History::doAddToBack(HistoryBlock *to, bool newBlock, HistoryItem *
 	return adding;
 }
 
+void History::unregTyping(UserData *from) {
+	TypingUsers::iterator i = typing.find(from);
+	if (i != typing.end()) {
+		uint64 ms = getms();
+		i.value() = ms;
+		updateTyping(ms, 0, true);
+		App::main()->topBar()->update();
+	}
+}
+
 void History::newItemAdded(HistoryItem *item) {
 	App::checkImageCacheSize();
 	if (item->from()) {
-		TypingUsers::iterator i = typing.find(item->from());
-		if (i != typing.end()) {
-			uint64 ms = getms();
-			i.value() = ms;
-			updateTyping(ms, 0, true);
-			App::main()->topBar()->update();
-		}
+		unregTyping(item->from());
 	}
 	if (item->out()) {
 //		inboxRead(false);
@@ -3012,7 +3047,7 @@ void HistoryContact::updateFrom(const MTPMessageMedia &media) {
 }
 
 HistoryMessage::HistoryMessage(History *history, HistoryBlock *block, const MTPDmessage &msg) :
-	HistoryItem(history, block, msg.vid.v, msg.vout.v, msg.vunread.v, ::date(msg.vdate), msg.vfrom_id.v)
+	HistoryItem(history, block, msg.vid.v, (msg.vflags.v & 0x02), (msg.vflags.v & 0x01), ::date(msg.vdate), msg.vfrom_id.v)
 , _text(st::msgMinWidth)
 , _textWidth(0)
 , _textHeight(0)
@@ -3418,7 +3453,7 @@ HistoryMessage::~HistoryMessage() {
 	delete _media;
 }
 
-HistoryForwarded::HistoryForwarded(History *history, HistoryBlock *block, const MTPDmessageForwarded &msg) : HistoryMessage(history, block, msg.vid.v, msg.vout.v, msg.vunread.v, ::date(msg.vdate), msg.vfrom_id.v, textClean(qs(msg.vmessage)), msg.vmedia)
+HistoryForwarded::HistoryForwarded(History *history, HistoryBlock *block, const MTPDmessageForwarded &msg) : HistoryMessage(history, block, msg.vid.v, (msg.vflags.v & 0x02), (msg.vflags.v & 0x01), ::date(msg.vdate), msg.vfrom_id.v, textClean(qs(msg.vmessage)), msg.vmedia)
 , fwdDate(::date(msg.vfwd_date))
 , fwdFrom(App::user(msg.vfwd_from_id.v))
 , fwdFromName(4096)
@@ -3657,7 +3692,7 @@ QString HistoryServiceMsg::messageByAction(const MTPmessageAction &action, TextL
 }
 
 HistoryServiceMsg::HistoryServiceMsg(History *history, HistoryBlock *block, const MTPDmessageService &msg) :
-	HistoryItem(history, block, msg.vid.v, msg.vout.v, msg.vunread.v, ::date(msg.vdate), msg.vfrom_id.v)
+	HistoryItem(history, block, msg.vid.v, (msg.vflags.v & 0x02), (msg.vflags.v & 0x01), ::date(msg.vdate), msg.vfrom_id.v)
 , _text(st::msgMinWidth)
 , _media(0)
 {
diff --git a/Telegram/SourceFiles/history.h b/Telegram/SourceFiles/history.h
index 4485e38b51..05cff10eff 100644
--- a/Telegram/SourceFiles/history.h
+++ b/Telegram/SourceFiles/history.h
@@ -84,28 +84,7 @@ struct PeerData {
 
 	void updateName(const QString &newName, const QString &newNameOrPhone);
 
-	void fillNames() {
-		names.clear();
-		chars.clear();
-		QString toIndex = textAccentFold(name);
-		if (nameOrPhone != name) {
-			toIndex += qsl(" ") + textAccentFold(nameOrPhone);
-		}
-		if (cRussianLetters().match(toIndex).hasMatch()) {
-			toIndex += qsl(" ") + translitRusEng(toIndex);
-		}
-		toIndex += qsl(" ") + rusKeyboardLayoutSwitch(toIndex);
-
-		if (name.midRef(0, 8) == "Telegram") {
-			int a = 0;
-		}
-
-		QStringList namesList = toIndex.toLower().split(cWordSplit(), QString::SkipEmptyParts);
-		for (QStringList::const_iterator i = namesList.cbegin(), e = namesList.cend(); i != e; ++i) {
-			names.insert(*i);
-			chars.insert(i->at(0));
-		}
-	}
+	void fillNames();
 
 	virtual void nameUpdated() {
 	}
@@ -152,12 +131,13 @@ struct UserData : public PeerData {
 	UserData(const PeerId &id) : PeerData(id), lnk(new PeerLink(this)), onlineTill(0), contact(-1), photosCount(-1) {
 	}
 	void setPhoto(const MTPUserProfilePhoto &photo);
-	void setName(const QString &first, const QString &last, const QString &phoneName);
+	void setName(const QString &first, const QString &last, const QString &phoneName, const QString &username);
 	void setPhone(const QString &newPhone);
 	void nameUpdated();
 
 	QString firstName;
 	QString lastName;
+	QString username;
 	QString phone;
 	Text nameText;
 	PhotoId photoId;
@@ -675,6 +655,7 @@ struct History : public QList<HistoryBlock*> {
 	HistoryItem *doAddToBack(HistoryBlock *to, bool newBlock, HistoryItem *adding, bool newMsg);
 
 	void newItemAdded(HistoryItem *item);
+	void unregTyping(UserData *from);
 
 	void inboxRead(bool byThisInstance = false);
 	void outboxRead();
diff --git a/Telegram/SourceFiles/historywidget.cpp b/Telegram/SourceFiles/historywidget.cpp
index 64d30d34ca..4190e3327b 100644
--- a/Telegram/SourceFiles/historywidget.cpp
+++ b/Telegram/SourceFiles/historywidget.cpp
@@ -1600,7 +1600,7 @@ void HistoryWidget::updateTyping(bool typing) {
 	if (noTypingUpdate || !hist || (typing && (hist->myTyping + 5000 > ms)) || (!typing && (hist->myTyping + 5000 <= ms))) return;
 
 	hist->myTyping = typing ? ms : 0;
-	if (typing) MTP::send(MTPmessages_SetTyping(histPeer->input, MTP_bool(typing)));
+	if (typing) MTP::send(MTPmessages_SetTyping(histPeer->input, typing ? MTP_sendMessageTypingAction() : MTP_sendMessageCancelAction()));
 }
 
 void HistoryWidget::activate() {
@@ -1657,9 +1657,6 @@ void HistoryWidget::showPeer(const PeerId &peer, MsgId msgId, bool force, bool l
 		App::main()->offerPeer(peer);
 		return;
 	}
-	if (peer && !msgId) {
-		App::main()->dialogsClear();
-	}
 	if (hist) {
 		if (histPeer->id == peer) {
 			if (msgId != hist->activeMsgId) {
@@ -2204,7 +2201,8 @@ void HistoryWidget::onSend(bool ctrlShiftEnter) {
 		hist->loadAround(0);
 
 		MTPstring msgText(MTP_string(text));
-		hist->addToBack(MTP_message(MTP_int(newId), MTP_int(MTP::authedId()), App::peerToMTP(histPeer->id), MTP_bool(true), MTP_bool(true), MTP_int(unixtime()), msgText, MTP_messageMediaEmpty()));
+		int32 flags = 0x01 | 0x02; // unread, out
+		hist->addToBack(MTP_message(MTP_int(flags), MTP_int(newId), MTP_int(MTP::authedId()), App::peerToMTP(histPeer->id), MTP_int(unixtime()), msgText, MTP_messageMediaEmpty()));
 		App::main()->historyToDown(hist);
 		App::main()->dialogsToUp();
 		peerMessagesUpdated();
@@ -2250,7 +2248,8 @@ mtpRequestId HistoryWidget::onForward(const PeerId &peer, SelectedItemSet toForw
 
 			MTPstring msgText(MTP_string(msg->selectedText(FullItemSel)));
 
-			hist->addToBack(MTP_message(MTP_int(newId), MTP_int(MTP::authedId()), App::peerToMTP(histPeer->id), MTP_bool(true), MTP_bool(true), MTP_int(unixtime()), msgText, MTP_messageMediaEmpty()));
+			int32 flags = 0x01 | 0x02; // unread, out
+			hist->addToBack(MTP_message(MTP_int(flags), MTP_int(newId), MTP_int(MTP::authedId()), App::peerToMTP(histPeer->id), MTP_int(unixtime()), msgText, MTP_messageMediaEmpty()));
 			MTP::send(MTPmessages_SendMessage(histPeer->input, msgText, MTP_long(randomId)), App::main()->rpcDone(&MainWidget::sentDataReceived, randomId));
 		}
 		if (newId) {
@@ -2294,7 +2293,8 @@ void HistoryWidget::shareContact(const PeerId &peer, const QString &phone, const
 
 	h->loadAround(0);
 
-	h->addToBack(MTP_message(MTP_int(newId), MTP_int(MTP::authedId()), App::peerToMTP(peer), MTP_bool(true), MTP_bool(true), MTP_int(unixtime()), MTP_string(""), MTP_messageMediaContact(MTP_string(phone), MTP_string(fname), MTP_string(lname), MTP_int(userId))));
+	int32 flags = 0x01 | 0x02; // unread, out
+	h->addToBack(MTP_message(MTP_int(flags), MTP_int(newId), MTP_int(MTP::authedId()), App::peerToMTP(peer), MTP_int(unixtime()), MTP_string(""), MTP_messageMediaContact(MTP_string(phone), MTP_string(fname), MTP_string(lname), MTP_int(userId))));
 	
 	MTP::send(MTPmessages_SendMedia(App::peer(peer)->input, MTP_inputMediaContact(MTP_string(phone), MTP_string(fname), MTP_string(lname)), MTP_long(randomId)), App::main()->rpcDone(&MainWidget::sentFullDataReceived, randomId));
 
@@ -2822,10 +2822,12 @@ void HistoryWidget::confirmSendImage(const ReadyLocalMedia &img) {
 	History *h = App::history(img.peer);
 	if (img.type == ToPreparePhoto) {
 		h->loadAround(0);
-		h->addToBack(MTP_message(MTP_int(newId), MTP_int(MTP::authedId()), App::peerToMTP(img.peer), MTP_bool(true), MTP_bool(true), MTP_int(unixtime()), MTP_string(""), MTP_messageMediaPhoto(img.photo)));
+		int32 flags = 0x01 | 0x02; // unread, out
+		h->addToBack(MTP_message(MTP_int(flags), MTP_int(newId), MTP_int(MTP::authedId()), App::peerToMTP(img.peer), MTP_int(unixtime()), MTP_string(""), MTP_messageMediaPhoto(img.photo)));
 	} else if (img.type == ToPrepareDocument) {
 		h->loadAround(0);
-		h->addToBack(MTP_message(MTP_int(newId), MTP_int(MTP::authedId()), App::peerToMTP(img.peer), MTP_bool(true), MTP_bool(true), MTP_int(unixtime()), MTP_string(""), MTP_messageMediaDocument(img.document)));
+		int32 flags = 0x01 | 0x02; // unread, out
+		h->addToBack(MTP_message(MTP_int(flags), MTP_int(newId), MTP_int(MTP::authedId()), App::peerToMTP(img.peer), MTP_int(unixtime()), MTP_string(""), MTP_messageMediaDocument(img.document)));
 	}
 
 	if (hist && histPeer && img.peer == histPeer->id) {
diff --git a/Telegram/SourceFiles/intro/introphone.cpp b/Telegram/SourceFiles/intro/introphone.cpp
index f7905d43fb..e1abdb0879 100644
--- a/Telegram/SourceFiles/intro/introphone.cpp
+++ b/Telegram/SourceFiles/intro/introphone.cpp
@@ -237,9 +237,15 @@ void IntroPhone::phoneSubmitDone(const MTPauth_SentCode &result) {
 	stopCheck();
 	enableAll(false);
 	
-	const MTPDauth_sentCode &d(result.c_auth_sentCode());
-	intro()->setPhone(sentPhone, d.vphone_code_hash.c_string().v.c_str(), d.vphone_registered.v);
-	intro()->setCallTimeout(result.c_auth_sentCode().vsend_call_timeout.v);
+	if (result.type() == mtpc_auth_sentCode) {
+		const MTPDauth_sentCode &d(result.c_auth_sentCode());
+		intro()->setPhone(sentPhone, d.vphone_code_hash.c_string().v.c_str(), d.vphone_registered.v);
+		intro()->setCallTimeout(d.vsend_call_timeout.v);
+	} else if (result.type() == mtpc_auth_sentAppCode) {
+		const MTPDauth_sentAppCode &d(result.c_auth_sentAppCode());
+		intro()->setPhone(sentPhone, d.vphone_code_hash.c_string().v.c_str(), d.vphone_registered.v);
+		intro()->setCallTimeout(d.vsend_call_timeout.v);
+	}
 	intro()->onIntroNext();
 }
 
diff --git a/Telegram/SourceFiles/mainwidget.cpp b/Telegram/SourceFiles/mainwidget.cpp
index 5bab3a1dfa..0f4b8dc47f 100644
--- a/Telegram/SourceFiles/mainwidget.cpp
+++ b/Telegram/SourceFiles/mainwidget.cpp
@@ -279,7 +279,6 @@ dialogs(this), history(this), profile(0), overview(0), _topBar(this), hider(0),
 	setGeometry(QRect(0, st::titleHeight, App::wnd()->width(), App::wnd()->height() - st::titleHeight));
 
 	connect(window, SIGNAL(resized(const QSize &)), this, SLOT(onParentResize(const QSize &)));
-	connect(&dialogs, SIGNAL(peerChosen(const PeerId &, MsgId)), this, SLOT(showPeer(const PeerId &, MsgId)));
 	connect(&dialogs, SIGNAL(cancelled()), this, SLOT(dialogsCancelled()));
 	connect(&history, SIGNAL(cancelled()), &dialogs, SLOT(activate()));
 	connect(this, SIGNAL(peerPhotoChanged(PeerData *)), this, SIGNAL(dialogsUpdated()));
@@ -559,7 +558,8 @@ void MainWidget::sendMessage(History *hist, const QString &text) {
 		hist->loadAround(0);
 
 		MTPstring msgText(MTP_string(msg));
-		hist->addToBack(MTP_message(MTP_int(newId), MTP_int(MTP::authedId()), App::peerToMTP(hist->peer->id), MTP_bool(true), MTP_bool(true), MTP_int(unixtime()), msgText, MTP_messageMediaEmpty()));
+		int32 flags = 0x01 | 0x02; // unread, out
+		hist->addToBack(MTP_message(MTP_int(flags), MTP_int(newId), MTP_int(MTP::authedId()), App::peerToMTP(hist->peer->id), MTP_int(unixtime()), msgText, MTP_messageMediaEmpty()));
 		historyToDown(hist);
 		if (history.peer() == hist->peer) {
             history.peerMessagesUpdated();
@@ -575,7 +575,7 @@ void MainWidget::readServerHistory(History *hist, bool force) {
     ReadRequests::const_iterator i = _readRequests.constFind(hist->peer);
     if (i == _readRequests.cend()) {
         hist->inboxRead(true);
-        _readRequests.insert(hist->peer, MTP::send(MTPmessages_ReadHistory(hist->peer->input, MTP_int(0), MTP_int(0)), rpcDone(&MainWidget::partWasRead, hist->peer)));
+        _readRequests.insert(hist->peer, MTP::send(MTPmessages_ReadHistory(hist->peer->input, MTP_int(0), MTP_int(0), MTP_bool(true)), rpcDone(&MainWidget::partWasRead, hist->peer)));
     }
 }
 
@@ -755,6 +755,15 @@ void MainWidget::loadMediaBack(PeerData *peer, MediaOverviewType type, bool many
 	_overviewLoad[type].insert(hist->peer, MTP::send(MTPmessages_Search(hist->peer->input, MTPstring(), filter, MTP_int(0), MTP_int(0), MTP_int(0), MTP_int(minId), MTP_int(limit)), rpcDone(&MainWidget::photosLoaded, hist)));
 }
 
+void MainWidget::peerUsernameChanged(PeerData *peer) {
+	if (profile && profile->peer() == peer) {
+		profile->update();
+	}
+	if (App::settings() && peer == App::self()) {
+		App::settings()->usernameChanged();
+	}
+}
+
 void MainWidget::photosLoaded(History *h, const MTPmessages_Messages &msgs, mtpRequestId req) {
 	OverviewsPreload::iterator it;
 	MediaOverviewType type = OverviewCount;
@@ -820,7 +829,7 @@ void MainWidget::partWasRead(PeerData *peer, const MTPmessages_AffectedHistory &
 	if (!MTP::authedId() || offset <= 0) {
         _readRequests.remove(peer);
     } else {
-        _readRequests[peer] = MTP::send(MTPmessages_ReadHistory(peer->input, MTP_int(0), MTP_int(offset)), rpcDone(&MainWidget::partWasRead, peer));
+        _readRequests[peer] = MTP::send(MTPmessages_ReadHistory(peer->input, MTP_int(0), MTP_int(offset), MTP_bool(true)), rpcDone(&MainWidget::partWasRead, peer));
     }
 }
 
@@ -1414,10 +1423,6 @@ void MainWidget::dialogsToUp() {
 	dialogs.dialogsToUp();
 }
 
-void MainWidget::dialogsClear() {
-	dialogs.clearFiltered();
-}
-
 void MainWidget::newUnreadMsg(History *hist, MsgId msgId) {
 	history.newUnreadMsg(hist, msgId);
 }
@@ -1950,7 +1955,8 @@ void MainWidget::updateReceived(const mtpPrime *from, const mtpPrime *end) {
 				}
 
 				if (!App::userLoaded(d.vfrom_id.v)) return getDifference();
-				HistoryItem *item = App::histories().addToBack(MTP_message(d.vid, d.vfrom_id, MTP_peerUser(MTP_int(MTP::authedId())), MTP_bool(false), MTP_bool(true), d.vdate, d.vmessage, MTP_messageMediaEmpty()));
+				int32 flags = 0x01; // unread
+				HistoryItem *item = App::histories().addToBack(MTP_message(MTP_int(flags), d.vid, d.vfrom_id, MTP_peerUser(MTP_int(MTP::authedId())), d.vdate, d.vmessage, MTP_messageMediaEmpty()));
 				if (item) {
 					history.peerMessagesUpdated(item->history()->peer->id);
 				}
@@ -1965,7 +1971,8 @@ void MainWidget::updateReceived(const mtpPrime *from, const mtpPrime *end) {
 				}
 
 				if (!App::chatLoaded(d.vchat_id.v) || !App::userLoaded(d.vfrom_id.v)) return getDifference();
-				HistoryItem *item = App::histories().addToBack(MTP_message(d.vid, d.vfrom_id, MTP_peerChat(d.vchat_id), MTP_bool(false), MTP_bool(true), d.vdate, d.vmessage, MTP_messageMediaEmpty()));
+				int32 flags = 0x01; // unread
+				HistoryItem *item = App::histories().addToBack(MTP_message(MTP_int(flags), d.vid, d.vfrom_id, MTP_peerChat(d.vchat_id), d.vdate, d.vmessage, MTP_messageMediaEmpty()));
 				if (item) {
 					history.peerMessagesUpdated(item->history()->peer->id);
 				}
@@ -2056,7 +2063,11 @@ void MainWidget::feedUpdate(const MTPUpdate &update) {
 		History *history = App::historyLoaded(App::peerFromUser(d.vuser_id));
 		UserData *user = App::userLoaded(d.vuser_id.v);
 		if (history && user) {
-			dialogs.regTyping(history, user);
+			if (d.vaction.type() == mtpc_sendMessageTypingAction) {
+				dialogs.regTyping(history, user);
+			} else if (d.vaction.type() == mtpc_sendMessageCancelAction) {
+				history->unregTyping(user);
+			}
 		}
 	} break;
 
@@ -2105,7 +2116,7 @@ void MainWidget::feedUpdate(const MTPUpdate &update) {
 		const MTPDupdateUserName &d(update.c_updateUserName());
 		UserData *user = App::userLoaded(d.vuser_id.v);
 		if (user && user->contact <= 0) {
-			user->setName(textOneLine(qs(d.vfirst_name)), textOneLine(qs(d.vlast_name)), user->nameOrPhone);
+			user->setName(textOneLine(qs(d.vfirst_name)), textOneLine(qs(d.vlast_name)), user->nameOrPhone, textOneLine(qs(d.vusername)));
 			if (App::main()) App::main()->peerUpdated(user);
 		}
 	} break;
@@ -2200,5 +2211,10 @@ void MainWidget::feedUpdate(const MTPUpdate &update) {
 		const MTPDupdateDcOptions &d(update.c_updateDcOptions());
 		MTP::updateDcOptions(d.vdc_options.c_vector().v);
 	} break;
+
+	case mtpc_updateServiceNotification: {
+		const MTPDupdateServiceNotification &d(update.c_updateServiceNotification());
+		//
+	} break;
 	}
 }
diff --git a/Telegram/SourceFiles/mainwidget.h b/Telegram/SourceFiles/mainwidget.h
index 182534ad5b..ae80fb00c3 100644
--- a/Telegram/SourceFiles/mainwidget.h
+++ b/Telegram/SourceFiles/mainwidget.h
@@ -196,7 +196,6 @@ public:
 	void msgUpdated(PeerId peer, const HistoryItem *msg);
 	void historyToDown(History *hist);
 	void dialogsToUp();
-	void dialogsClear(); // after showing peer history
 	void newUnreadMsg(History *history, MsgId msgId);
 	void updUpdated(int32 pts, int32 date, int32 qts, int32 seq);
 	void historyWasRead();
@@ -282,6 +281,7 @@ public:
 	void itemResized(HistoryItem *row);
 
 	void loadMediaBack(PeerData *peer, MediaOverviewType type, bool many = false);
+	void peerUsernameChanged(PeerData *peer);
 
 	~MainWidget();
 
diff --git a/Telegram/SourceFiles/mtproto/mtpCoreTypes.h b/Telegram/SourceFiles/mtproto/mtpCoreTypes.h
index 7fb8c8b361..9b86ae5153 100644
--- a/Telegram/SourceFiles/mtproto/mtpCoreTypes.h
+++ b/Telegram/SourceFiles/mtproto/mtpCoreTypes.h
@@ -329,6 +329,9 @@ enum {
 	mtpc_invokeWithLayer13 = 0x427c8ea2,
 	mtpc_invokeWithLayer14 = 0x2b9b08fa,
 	mtpc_invokeWithLayer15 = 0xb4418b64,
+	mtpc_invokeWithLayer16 = 0xcf5f0987,
+	mtpc_invokeWithLayer17 = 0x50858a19,
+	mtpc_invokeWithLayer18 = 0x1c900537,
 
 	// manually parsed
 	mtpc_rpc_result = 0xf35c6d01,
@@ -354,6 +357,9 @@ static const mtpTypeId mtpLayers[] = {
 	mtpc_invokeWithLayer13,
 	mtpc_invokeWithLayer14,
 	mtpc_invokeWithLayer15,
+	mtpc_invokeWithLayer16,
+	mtpc_invokeWithLayer17,
+	mtpc_invokeWithLayer18,
 }, mtpLayerMax = sizeof(mtpLayers) / sizeof(mtpLayers[0]);
 
 template <typename bareT>
diff --git a/Telegram/SourceFiles/mtproto/mtpScheme.cpp b/Telegram/SourceFiles/mtproto/mtpScheme.cpp
index 3dc1416a73..a0eaad1bcf 100644
--- a/Telegram/SourceFiles/mtproto/mtpScheme.cpp
+++ b/Telegram/SourceFiles/mtproto/mtpScheme.cpp
@@ -40,138 +40,38 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP
 		}
 
 		switch (mtpTypeId(cons)) {
-		case mtpc_userProfilePhotoEmpty:
-			to.add("{ userProfilePhotoEmpty");
-			to.add(" ");
-			to.add("}");
-		break;
-
-		case mtpc_userProfilePhoto:
-			to.add("{ userProfilePhoto");
+		case mtpc_inputPeerNotifySettings:
+			to.add("{ inputPeerNotifySettings");
 			to.add("\n").add(add);
-			to.add("  photo_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  photo_small: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  photo_big: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  mute_until: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  sound: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  show_previews: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  events_mask: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
-		case mtpc_rpc_error:
-			to.add("{ rpc_error");
+		case mtpc_contacts_importedContacts:
+			to.add("{ contacts_importedContacts");
 			to.add("\n").add(add);
-			to.add("  error_code: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  error_message: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  imported: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  retry_contacts: "); mtpTextSerializeType(to, from, end, 0, level + 1, mtpc_long); to.add(",\n").add(add);
+			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
-		case mtpc_dh_gen_ok:
-			to.add("{ dh_gen_ok");
+		case mtpc_future_salt:
+			to.add("{ future_salt");
 			to.add("\n").add(add);
-			to.add("  nonce: "); mtpTextSerializeType(to, from, end, mtpc_int128, level + 1); to.add(",\n").add(add);
-			to.add("  server_nonce: "); mtpTextSerializeType(to, from, end, mtpc_int128, level + 1); to.add(",\n").add(add);
-			to.add("  new_nonce_hash1: "); mtpTextSerializeType(to, from, end, mtpc_int128, level + 1); to.add(",\n").add(add);
+			to.add("  valid_since: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  valid_until: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  salt: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
-		case mtpc_dh_gen_retry:
-			to.add("{ dh_gen_retry");
+		case mtpc_help_inviteText:
+			to.add("{ help_inviteText");
 			to.add("\n").add(add);
-			to.add("  nonce: "); mtpTextSerializeType(to, from, end, mtpc_int128, level + 1); to.add(",\n").add(add);
-			to.add("  server_nonce: "); mtpTextSerializeType(to, from, end, mtpc_int128, level + 1); to.add(",\n").add(add);
-			to.add("  new_nonce_hash2: "); mtpTextSerializeType(to, from, end, mtpc_int128, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_dh_gen_fail:
-			to.add("{ dh_gen_fail");
-			to.add("\n").add(add);
-			to.add("  nonce: "); mtpTextSerializeType(to, from, end, mtpc_int128, level + 1); to.add(",\n").add(add);
-			to.add("  server_nonce: "); mtpTextSerializeType(to, from, end, mtpc_int128, level + 1); to.add(",\n").add(add);
-			to.add("  new_nonce_hash3: "); mtpTextSerializeType(to, from, end, mtpc_int128, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_inputPeerEmpty:
-			to.add("{ inputPeerEmpty");
-			to.add(" ");
-			to.add("}");
-		break;
-
-		case mtpc_inputPeerSelf:
-			to.add("{ inputPeerSelf");
-			to.add(" ");
-			to.add("}");
-		break;
-
-		case mtpc_inputPeerContact:
-			to.add("{ inputPeerContact");
-			to.add("\n").add(add);
-			to.add("  user_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_inputPeerForeign:
-			to.add("{ inputPeerForeign");
-			to.add("\n").add(add);
-			to.add("  user_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  access_hash: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_inputPeerChat:
-			to.add("{ inputPeerChat");
-			to.add("\n").add(add);
-			to.add("  chat_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_photoEmpty:
-			to.add("{ photoEmpty");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_photo:
-			to.add("{ photo");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  access_hash: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  user_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  caption: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  geo: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  sizes: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_p_q_inner_data:
-			to.add("{ p_q_inner_data");
-			to.add("\n").add(add);
-			to.add("  pq: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  p: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  q: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  nonce: "); mtpTextSerializeType(to, from, end, mtpc_int128, level + 1); to.add(",\n").add(add);
-			to.add("  server_nonce: "); mtpTextSerializeType(to, from, end, mtpc_int128, level + 1); to.add(",\n").add(add);
-			to.add("  new_nonce: "); mtpTextSerializeType(to, from, end, mtpc_int256, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_client_DH_inner_data:
-			to.add("{ client_DH_inner_data");
-			to.add("\n").add(add);
-			to.add("  nonce: "); mtpTextSerializeType(to, from, end, mtpc_int128, level + 1); to.add(",\n").add(add);
-			to.add("  server_nonce: "); mtpTextSerializeType(to, from, end, mtpc_int128, level + 1); to.add(",\n").add(add);
-			to.add("  retry_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  g_b: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_contacts_link:
-			to.add("{ contacts_link");
-			to.add("\n").add(add);
-			to.add("  my_link: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  foreign_link: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  user: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  message: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
@@ -190,295 +90,20 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP
 			to.add("}");
 		break;
 
-		case mtpc_inputFile:
-			to.add("{ inputFile");
+		case mtpc_messages_dhConfigNotModified:
+			to.add("{ messages_dhConfigNotModified");
 			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  parts: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  md5_checksum: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  random: "); mtpTextSerializeType(to, from, end, mtpc_bytes, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
-		case mtpc_inputFileBig:
-			to.add("{ inputFileBig");
+		case mtpc_messages_dhConfig:
+			to.add("{ messages_dhConfig");
 			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  parts: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_messageActionEmpty:
-			to.add("{ messageActionEmpty");
-			to.add(" ");
-			to.add("}");
-		break;
-
-		case mtpc_messageActionChatCreate:
-			to.add("{ messageActionChatCreate");
-			to.add("\n").add(add);
-			to.add("  title: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1, mtpc_int); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_messageActionChatEditTitle:
-			to.add("{ messageActionChatEditTitle");
-			to.add("\n").add(add);
-			to.add("  title: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_messageActionChatEditPhoto:
-			to.add("{ messageActionChatEditPhoto");
-			to.add("\n").add(add);
-			to.add("  photo: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_messageActionChatDeletePhoto:
-			to.add("{ messageActionChatDeletePhoto");
-			to.add(" ");
-			to.add("}");
-		break;
-
-		case mtpc_messageActionChatAddUser:
-			to.add("{ messageActionChatAddUser");
-			to.add("\n").add(add);
-			to.add("  user_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_messageActionChatDeleteUser:
-			to.add("{ messageActionChatDeleteUser");
-			to.add("\n").add(add);
-			to.add("  user_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_messageActionGeoChatCreate:
-			to.add("{ messageActionGeoChatCreate");
-			to.add("\n").add(add);
-			to.add("  title: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  address: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_messageActionGeoChatCheckin:
-			to.add("{ messageActionGeoChatCheckin");
-			to.add(" ");
-			to.add("}");
-		break;
-
-		case mtpc_inputMessagesFilterEmpty:
-			to.add("{ inputMessagesFilterEmpty");
-			to.add(" ");
-			to.add("}");
-		break;
-
-		case mtpc_inputMessagesFilterPhotos:
-			to.add("{ inputMessagesFilterPhotos");
-			to.add(" ");
-			to.add("}");
-		break;
-
-		case mtpc_inputMessagesFilterVideo:
-			to.add("{ inputMessagesFilterVideo");
-			to.add(" ");
-			to.add("}");
-		break;
-
-		case mtpc_inputMessagesFilterPhotoVideo:
-			to.add("{ inputMessagesFilterPhotoVideo");
-			to.add(" ");
-			to.add("}");
-		break;
-
-		case mtpc_inputMessagesFilterDocument:
-			to.add("{ inputMessagesFilterDocument");
-			to.add(" ");
-			to.add("}");
-		break;
-
-		case mtpc_inputMessagesFilterAudio:
-			to.add("{ inputMessagesFilterAudio");
-			to.add(" ");
-			to.add("}");
-		break;
-
-		case mtpc_help_support:
-			to.add("{ help_support");
-			to.add("\n").add(add);
-			to.add("  phone_number: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  user: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_contactFound:
-			to.add("{ contactFound");
-			to.add("\n").add(add);
-			to.add("  user_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_future_salts:
-			to.add("{ future_salts");
-			to.add("\n").add(add);
-			to.add("  req_msg_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  now: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  salts: "); mtpTextSerializeType(to, from, end, mtpc_vector, level + 1, mtpc_future_salt); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_inputPhotoEmpty:
-			to.add("{ inputPhotoEmpty");
-			to.add(" ");
-			to.add("}");
-		break;
-
-		case mtpc_inputPhoto:
-			to.add("{ inputPhoto");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  access_hash: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_chatParticipant:
-			to.add("{ chatParticipant");
-			to.add("\n").add(add);
-			to.add("  user_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  inviter_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_auth_exportedAuthorization:
-			to.add("{ auth_exportedAuthorization");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  bytes: "); mtpTextSerializeType(to, from, end, mtpc_bytes, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_contactStatus:
-			to.add("{ contactStatus");
-			to.add("\n").add(add);
-			to.add("  user_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  expires: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_new_session_created:
-			to.add("{ new_session_created");
-			to.add("\n").add(add);
-			to.add("  first_msg_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  unique_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  server_salt: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_geochats_located:
-			to.add("{ geochats_located");
-			to.add("\n").add(add);
-			to.add("  results: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  messages: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  chats: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_updatesTooLong:
-			to.add("{ updatesTooLong");
-			to.add(" ");
-			to.add("}");
-		break;
-
-		case mtpc_updateShortMessage:
-			to.add("{ updateShortMessage");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  from_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  message: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  pts: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  seq: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_updateShortChatMessage:
-			to.add("{ updateShortChatMessage");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  from_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  chat_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  message: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  pts: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  seq: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_updateShort:
-			to.add("{ updateShort");
-			to.add("\n").add(add);
-			to.add("  update: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_updatesCombined:
-			to.add("{ updatesCombined");
-			to.add("\n").add(add);
-			to.add("  updates: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  chats: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  seq_start: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  seq: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_updates:
-			to.add("{ updates");
-			to.add("\n").add(add);
-			to.add("  updates: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  chats: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  seq: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_future_salt:
-			to.add("{ future_salt");
-			to.add("\n").add(add);
-			to.add("  valid_since: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  valid_until: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  salt: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_server_DH_inner_data:
-			to.add("{ server_DH_inner_data");
-			to.add("\n").add(add);
-			to.add("  nonce: "); mtpTextSerializeType(to, from, end, mtpc_int128, level + 1); to.add(",\n").add(add);
-			to.add("  server_nonce: "); mtpTextSerializeType(to, from, end, mtpc_int128, level + 1); to.add(",\n").add(add);
 			to.add("  g: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  dh_prime: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  g_a: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  server_time: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_resPQ:
-			to.add("{ resPQ");
-			to.add("\n").add(add);
-			to.add("  nonce: "); mtpTextSerializeType(to, from, end, mtpc_int128, level + 1); to.add(",\n").add(add);
-			to.add("  server_nonce: "); mtpTextSerializeType(to, from, end, mtpc_int128, level + 1); to.add(",\n").add(add);
-			to.add("  pq: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  server_public_key_fingerprints: "); mtpTextSerializeType(to, from, end, 0, level + 1, mtpc_long); to.add(",\n").add(add);
+			to.add("  p: "); mtpTextSerializeType(to, from, end, mtpc_bytes, level + 1); to.add(",\n").add(add);
+			to.add("  version: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  random: "); mtpTextSerializeType(to, from, end, mtpc_bytes, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
@@ -491,6 +116,33 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP
 			to.add("}");
 		break;
 
+		case mtpc_inputUserEmpty:
+			to.add("{ inputUserEmpty");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_inputUserSelf:
+			to.add("{ inputUserSelf");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_inputUserContact:
+			to.add("{ inputUserContact");
+			to.add("\n").add(add);
+			to.add("  user_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_inputUserForeign:
+			to.add("{ inputUserForeign");
+			to.add("\n").add(add);
+			to.add("  user_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  access_hash: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
 		case mtpc_inputMediaEmpty:
 			to.add("{ inputMediaEmpty");
 			to.add(" ");
@@ -599,6 +251,115 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP
 			to.add("}");
 		break;
 
+		case mtpc_photos_photos:
+			to.add("{ photos_photos");
+			to.add("\n").add(add);
+			to.add("  photos: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_photos_photosSlice:
+			to.add("{ photos_photosSlice");
+			to.add("\n").add(add);
+			to.add("  count: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  photos: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_inputEncryptedChat:
+			to.add("{ inputEncryptedChat");
+			to.add("\n").add(add);
+			to.add("  chat_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  access_hash: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_photoSizeEmpty:
+			to.add("{ photoSizeEmpty");
+			to.add("\n").add(add);
+			to.add("  type: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_photoSize:
+			to.add("{ photoSize");
+			to.add("\n").add(add);
+			to.add("  type: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  location: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  w: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  h: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  size: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_photoCachedSize:
+			to.add("{ photoCachedSize");
+			to.add("\n").add(add);
+			to.add("  type: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  location: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  w: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  h: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  bytes: "); mtpTextSerializeType(to, from, end, mtpc_bytes, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_importedContact:
+			to.add("{ importedContact");
+			to.add("\n").add(add);
+			to.add("  user_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  client_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_nearestDc:
+			to.add("{ nearestDc");
+			to.add("\n").add(add);
+			to.add("  country: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  this_dc: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  nearest_dc: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_contactStatus:
+			to.add("{ contactStatus");
+			to.add("\n").add(add);
+			to.add("  user_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  expires: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_resPQ:
+			to.add("{ resPQ");
+			to.add("\n").add(add);
+			to.add("  nonce: "); mtpTextSerializeType(to, from, end, mtpc_int128, level + 1); to.add(",\n").add(add);
+			to.add("  server_nonce: "); mtpTextSerializeType(to, from, end, mtpc_int128, level + 1); to.add(",\n").add(add);
+			to.add("  pq: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  server_public_key_fingerprints: "); mtpTextSerializeType(to, from, end, 0, level + 1, mtpc_long); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_userStatusEmpty:
+			to.add("{ userStatusEmpty");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_userStatusOnline:
+			to.add("{ userStatusOnline");
+			to.add("\n").add(add);
+			to.add("  expires: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_userStatusOffline:
+			to.add("{ userStatusOffline");
+			to.add("\n").add(add);
+			to.add("  was_online: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
 		case mtpc_documentEmpty:
 			to.add("{ documentEmpty");
 			to.add("\n").add(add);
@@ -621,44 +382,24 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP
 			to.add("}");
 		break;
 
-		case mtpc_inputEncryptedFileEmpty:
-			to.add("{ inputEncryptedFileEmpty");
-			to.add(" ");
+		case mtpc_contactFound:
+			to.add("{ contactFound");
+			to.add("\n").add(add);
+			to.add("  user_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
-		case mtpc_inputEncryptedFileUploaded:
-			to.add("{ inputEncryptedFileUploaded");
+		case mtpc_destroy_session_ok:
+			to.add("{ destroy_session_ok");
 			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  parts: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  md5_checksum: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  key_fingerprint: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  session_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
-		case mtpc_inputEncryptedFile:
-			to.add("{ inputEncryptedFile");
+		case mtpc_destroy_session_none:
+			to.add("{ destroy_session_none");
 			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  access_hash: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_inputEncryptedFileBigUploaded:
-			to.add("{ inputEncryptedFileBigUploaded");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  parts: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  key_fingerprint: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_contacts_found:
-			to.add("{ contacts_found");
-			to.add("\n").add(add);
-			to.add("  results: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  session_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
@@ -703,334 +444,18 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP
 			to.add("}");
 		break;
 
-		case mtpc_chatFull:
-			to.add("{ chatFull");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  participants: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  chat_photo: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  notify_settings: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_chatParticipantsForbidden:
-			to.add("{ chatParticipantsForbidden");
-			to.add("\n").add(add);
-			to.add("  chat_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_chatParticipants:
-			to.add("{ chatParticipants");
-			to.add("\n").add(add);
-			to.add("  chat_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  admin_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  participants: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  version: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_msgs_ack:
-			to.add("{ msgs_ack");
-			to.add("\n").add(add);
-			to.add("  msg_ids: "); mtpTextSerializeType(to, from, end, 0, level + 1, mtpc_long); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_userFull:
-			to.add("{ userFull");
-			to.add("\n").add(add);
-			to.add("  user: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  link: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  profile_photo: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  notify_settings: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  blocked: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  real_first_name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  real_last_name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_videoEmpty:
-			to.add("{ videoEmpty");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_video:
-			to.add("{ video");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  access_hash: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  user_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  caption: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  duration: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  mime_type: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  size: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  thumb: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  dc_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  w: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  h: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_messageEmpty:
-			to.add("{ messageEmpty");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_message:
-			to.add("{ message");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  from_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  to_id: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  out: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  unread: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  message: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  media: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_messageForwarded:
-			to.add("{ messageForwarded");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  fwd_from_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  fwd_date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  from_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  to_id: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  out: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  unread: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  message: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  media: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_messageService:
-			to.add("{ messageService");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  from_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  to_id: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  out: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  unread: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  action: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_notifyPeer:
-			to.add("{ notifyPeer");
-			to.add("\n").add(add);
-			to.add("  peer: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_notifyUsers:
-			to.add("{ notifyUsers");
+		case mtpc_userProfilePhotoEmpty:
+			to.add("{ userProfilePhotoEmpty");
 			to.add(" ");
 			to.add("}");
 		break;
 
-		case mtpc_notifyChats:
-			to.add("{ notifyChats");
-			to.add(" ");
-			to.add("}");
-		break;
-
-		case mtpc_notifyAll:
-			to.add("{ notifyAll");
-			to.add(" ");
-			to.add("}");
-		break;
-
-		case mtpc_messages_messageEmpty:
-			to.add("{ messages_messageEmpty");
-			to.add(" ");
-			to.add("}");
-		break;
-
-		case mtpc_messages_message:
-			to.add("{ messages_message");
+		case mtpc_userProfilePhoto:
+			to.add("{ userProfilePhoto");
 			to.add("\n").add(add);
-			to.add("  message: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  chats: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_inputPhoneContact:
-			to.add("{ inputPhoneContact");
-			to.add("\n").add(add);
-			to.add("  client_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  phone: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  first_name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  last_name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_rpc_answer_unknown:
-			to.add("{ rpc_answer_unknown");
-			to.add(" ");
-			to.add("}");
-		break;
-
-		case mtpc_rpc_answer_dropped_running:
-			to.add("{ rpc_answer_dropped_running");
-			to.add(" ");
-			to.add("}");
-		break;
-
-		case mtpc_rpc_answer_dropped:
-			to.add("{ rpc_answer_dropped");
-			to.add("\n").add(add);
-			to.add("  msg_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  seq_no: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  bytes: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_inputVideoEmpty:
-			to.add("{ inputVideoEmpty");
-			to.add(" ");
-			to.add("}");
-		break;
-
-		case mtpc_inputVideo:
-			to.add("{ inputVideo");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  access_hash: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_decryptedMessageMediaEmpty:
-			to.add("{ decryptedMessageMediaEmpty");
-			to.add(" ");
-			to.add("}");
-		break;
-
-		case mtpc_decryptedMessageMediaPhoto:
-			to.add("{ decryptedMessageMediaPhoto");
-			to.add("\n").add(add);
-			to.add("  thumb: "); mtpTextSerializeType(to, from, end, mtpc_bytes, level + 1); to.add(",\n").add(add);
-			to.add("  thumb_w: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  thumb_h: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  w: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  h: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  size: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  key: "); mtpTextSerializeType(to, from, end, mtpc_bytes, level + 1); to.add(",\n").add(add);
-			to.add("  iv: "); mtpTextSerializeType(to, from, end, mtpc_bytes, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_decryptedMessageMediaVideo:
-			to.add("{ decryptedMessageMediaVideo");
-			to.add("\n").add(add);
-			to.add("  thumb: "); mtpTextSerializeType(to, from, end, mtpc_bytes, level + 1); to.add(",\n").add(add);
-			to.add("  thumb_w: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  thumb_h: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  duration: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  mime_type: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  w: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  h: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  size: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  key: "); mtpTextSerializeType(to, from, end, mtpc_bytes, level + 1); to.add(",\n").add(add);
-			to.add("  iv: "); mtpTextSerializeType(to, from, end, mtpc_bytes, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_decryptedMessageMediaGeoPoint:
-			to.add("{ decryptedMessageMediaGeoPoint");
-			to.add("\n").add(add);
-			to.add("  lat: "); mtpTextSerializeType(to, from, end, mtpc_double, level + 1); to.add(",\n").add(add);
-			to.add("  long: "); mtpTextSerializeType(to, from, end, mtpc_double, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_decryptedMessageMediaContact:
-			to.add("{ decryptedMessageMediaContact");
-			to.add("\n").add(add);
-			to.add("  phone_number: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  first_name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  last_name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  user_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_decryptedMessageMediaDocument:
-			to.add("{ decryptedMessageMediaDocument");
-			to.add("\n").add(add);
-			to.add("  thumb: "); mtpTextSerializeType(to, from, end, mtpc_bytes, level + 1); to.add(",\n").add(add);
-			to.add("  thumb_w: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  thumb_h: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  file_name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  mime_type: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  size: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  key: "); mtpTextSerializeType(to, from, end, mtpc_bytes, level + 1); to.add(",\n").add(add);
-			to.add("  iv: "); mtpTextSerializeType(to, from, end, mtpc_bytes, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_decryptedMessageMediaAudio:
-			to.add("{ decryptedMessageMediaAudio");
-			to.add("\n").add(add);
-			to.add("  duration: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  mime_type: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  size: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  key: "); mtpTextSerializeType(to, from, end, mtpc_bytes, level + 1); to.add(",\n").add(add);
-			to.add("  iv: "); mtpTextSerializeType(to, from, end, mtpc_bytes, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_geoChatMessageEmpty:
-			to.add("{ geoChatMessageEmpty");
-			to.add("\n").add(add);
-			to.add("  chat_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_geoChatMessage:
-			to.add("{ geoChatMessage");
-			to.add("\n").add(add);
-			to.add("  chat_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  from_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  message: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  media: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_geoChatMessageService:
-			to.add("{ geoChatMessageService");
-			to.add("\n").add(add);
-			to.add("  chat_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  from_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  action: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_geoPointEmpty:
-			to.add("{ geoPointEmpty");
-			to.add(" ");
-			to.add("}");
-		break;
-
-		case mtpc_geoPoint:
-			to.add("{ geoPoint");
-			to.add("\n").add(add);
-			to.add("  long: "); mtpTextSerializeType(to, from, end, mtpc_double, level + 1); to.add(",\n").add(add);
-			to.add("  lat: "); mtpTextSerializeType(to, from, end, mtpc_double, level + 1); to.add(",\n").add(add);
+			to.add("  photo_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  photo_small: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  photo_big: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
@@ -1055,37 +480,175 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP
 			to.add("}");
 		break;
 
-		case mtpc_messages_dhConfigNotModified:
-			to.add("{ messages_dhConfigNotModified");
-			to.add("\n").add(add);
-			to.add("  random: "); mtpTextSerializeType(to, from, end, mtpc_bytes, level + 1); to.add(",\n").add(add);
+		case mtpc_inputPhotoEmpty:
+			to.add("{ inputPhotoEmpty");
+			to.add(" ");
 			to.add("}");
 		break;
 
-		case mtpc_messages_dhConfig:
-			to.add("{ messages_dhConfig");
+		case mtpc_inputPhoto:
+			to.add("{ inputPhoto");
 			to.add("\n").add(add);
-			to.add("  g: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  p: "); mtpTextSerializeType(to, from, end, mtpc_bytes, level + 1); to.add(",\n").add(add);
-			to.add("  version: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  random: "); mtpTextSerializeType(to, from, end, mtpc_bytes, level + 1); to.add(",\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  access_hash: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
-		case mtpc_peerUser:
-			to.add("{ peerUser");
+		case mtpc_contacts_link:
+			to.add("{ contacts_link");
+			to.add("\n").add(add);
+			to.add("  my_link: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  foreign_link: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  user: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_geochats_statedMessage:
+			to.add("{ geochats_statedMessage");
+			to.add("\n").add(add);
+			to.add("  message: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  chats: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  seq: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_dcOption:
+			to.add("{ dcOption");
+			to.add("\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  hostname: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  ip_address: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  port: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_inputAudioEmpty:
+			to.add("{ inputAudioEmpty");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_inputAudio:
+			to.add("{ inputAudio");
+			to.add("\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  access_hash: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_messages_sentEncryptedMessage:
+			to.add("{ messages_sentEncryptedMessage");
+			to.add("\n").add(add);
+			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_messages_sentEncryptedFile:
+			to.add("{ messages_sentEncryptedFile");
+			to.add("\n").add(add);
+			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  file: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_msgs_all_info:
+			to.add("{ msgs_all_info");
+			to.add("\n").add(add);
+			to.add("  msg_ids: "); mtpTextSerializeType(to, from, end, 0, level + 1, mtpc_long); to.add(",\n").add(add);
+			to.add("  info: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_inputEncryptedFileEmpty:
+			to.add("{ inputEncryptedFileEmpty");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_inputEncryptedFileUploaded:
+			to.add("{ inputEncryptedFileUploaded");
+			to.add("\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  parts: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  md5_checksum: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  key_fingerprint: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_inputEncryptedFile:
+			to.add("{ inputEncryptedFile");
+			to.add("\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  access_hash: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_inputEncryptedFileBigUploaded:
+			to.add("{ inputEncryptedFileBigUploaded");
+			to.add("\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  parts: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  key_fingerprint: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_inputPeerEmpty:
+			to.add("{ inputPeerEmpty");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_inputPeerSelf:
+			to.add("{ inputPeerSelf");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_inputPeerContact:
+			to.add("{ inputPeerContact");
 			to.add("\n").add(add);
 			to.add("  user_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
-		case mtpc_peerChat:
-			to.add("{ peerChat");
+		case mtpc_inputPeerForeign:
+			to.add("{ inputPeerForeign");
+			to.add("\n").add(add);
+			to.add("  user_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  access_hash: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_inputPeerChat:
+			to.add("{ inputPeerChat");
 			to.add("\n").add(add);
 			to.add("  chat_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
+		case mtpc_contacts_contacts:
+			to.add("{ contacts_contacts");
+			to.add("\n").add(add);
+			to.add("  contacts: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_contacts_contactsNotModified:
+			to.add("{ contacts_contactsNotModified");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_contact:
+			to.add("{ contact");
+			to.add("\n").add(add);
+			to.add("  user_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  mutual: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
 		case mtpc_server_DH_params_fail:
 			to.add("{ server_DH_params_fail");
 			to.add("\n").add(add);
@@ -1104,124 +667,14 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP
 			to.add("}");
 		break;
 
-		case mtpc_inputAppEvent:
-			to.add("{ inputAppEvent");
+		case mtpc_messages_chat:
+			to.add("{ messages_chat");
 			to.add("\n").add(add);
-			to.add("  time: "); mtpTextSerializeType(to, from, end, mtpc_double, level + 1); to.add(",\n").add(add);
-			to.add("  type: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  peer: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  data: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_photos_photo:
-			to.add("{ photos_photo");
-			to.add("\n").add(add);
-			to.add("  photo: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  chat: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
 			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
-		case mtpc_peerNotifyEventsEmpty:
-			to.add("{ peerNotifyEventsEmpty");
-			to.add(" ");
-			to.add("}");
-		break;
-
-		case mtpc_peerNotifyEventsAll:
-			to.add("{ peerNotifyEventsAll");
-			to.add(" ");
-			to.add("}");
-		break;
-
-		case mtpc_nearestDc:
-			to.add("{ nearestDc");
-			to.add("\n").add(add);
-			to.add("  country: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  this_dc: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  nearest_dc: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_wallPaper:
-			to.add("{ wallPaper");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  title: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  sizes: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  color: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_wallPaperSolid:
-			to.add("{ wallPaperSolid");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  title: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  bg_color: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  color: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_geochats_messages:
-			to.add("{ geochats_messages");
-			to.add("\n").add(add);
-			to.add("  messages: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  chats: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_geochats_messagesSlice:
-			to.add("{ geochats_messagesSlice");
-			to.add("\n").add(add);
-			to.add("  count: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  messages: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  chats: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_contacts_blocked:
-			to.add("{ contacts_blocked");
-			to.add("\n").add(add);
-			to.add("  blocked: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_contacts_blockedSlice:
-			to.add("{ contacts_blockedSlice");
-			to.add("\n").add(add);
-			to.add("  count: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  blocked: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_messages_statedMessage:
-			to.add("{ messages_statedMessage");
-			to.add("\n").add(add);
-			to.add("  message: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  chats: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  pts: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  seq: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_messages_statedMessageLink:
-			to.add("{ messages_statedMessageLink");
-			to.add("\n").add(add);
-			to.add("  message: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  chats: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  links: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  pts: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  seq: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
 		case mtpc_messageMediaEmpty:
 			to.add("{ messageMediaEmpty");
 			to.add(" ");
@@ -1280,67 +733,37 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP
 			to.add("}");
 		break;
 
-		case mtpc_inputGeoChat:
-			to.add("{ inputGeoChat");
+		case mtpc_notifyPeer:
+			to.add("{ notifyPeer");
 			to.add("\n").add(add);
-			to.add("  chat_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  access_hash: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  peer: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
-		case mtpc_help_appUpdate:
-			to.add("{ help_appUpdate");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  critical: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  url: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  text: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_help_noAppUpdate:
-			to.add("{ help_noAppUpdate");
+		case mtpc_notifyUsers:
+			to.add("{ notifyUsers");
 			to.add(" ");
 			to.add("}");
 		break;
 
-		case mtpc_updates_differenceEmpty:
-			to.add("{ updates_differenceEmpty");
-			to.add("\n").add(add);
-			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  seq: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+		case mtpc_notifyChats:
+			to.add("{ notifyChats");
+			to.add(" ");
 			to.add("}");
 		break;
 
-		case mtpc_updates_difference:
-			to.add("{ updates_difference");
-			to.add("\n").add(add);
-			to.add("  new_messages: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  new_encrypted_messages: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  other_updates: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  chats: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  state: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+		case mtpc_notifyAll:
+			to.add("{ notifyAll");
+			to.add(" ");
 			to.add("}");
 		break;
 
-		case mtpc_updates_differenceSlice:
-			to.add("{ updates_differenceSlice");
+		case mtpc_new_session_created:
+			to.add("{ new_session_created");
 			to.add("\n").add(add);
-			to.add("  new_messages: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  new_encrypted_messages: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  other_updates: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  chats: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  intermediate_state: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_msgs_state_info:
-			to.add("{ msgs_state_info");
-			to.add("\n").add(add);
-			to.add("  req_msg_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  info: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  first_msg_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  unique_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  server_salt: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
@@ -1351,232 +774,83 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP
 			to.add("}");
 		break;
 
-		case mtpc_msg_resend_req:
-			to.add("{ msg_resend_req");
+		case mtpc_auth_sentCode:
+			to.add("{ auth_sentCode");
 			to.add("\n").add(add);
-			to.add("  msg_ids: "); mtpTextSerializeType(to, from, end, 0, level + 1, mtpc_long); to.add(",\n").add(add);
+			to.add("  phone_registered: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  phone_code_hash: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  send_call_timeout: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  is_password: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
-		case mtpc_inputDocumentEmpty:
-			to.add("{ inputDocumentEmpty");
+		case mtpc_auth_sentAppCode:
+			to.add("{ auth_sentAppCode");
+			to.add("\n").add(add);
+			to.add("  phone_registered: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  phone_code_hash: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  send_call_timeout: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  is_password: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_sendMessageTypingAction:
+			to.add("{ sendMessageTypingAction");
 			to.add(" ");
 			to.add("}");
 		break;
 
-		case mtpc_inputDocument:
-			to.add("{ inputDocument");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  access_hash: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_userStatusEmpty:
-			to.add("{ userStatusEmpty");
+		case mtpc_sendMessageCancelAction:
+			to.add("{ sendMessageCancelAction");
 			to.add(" ");
 			to.add("}");
 		break;
 
-		case mtpc_userStatusOnline:
-			to.add("{ userStatusOnline");
-			to.add("\n").add(add);
-			to.add("  expires: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_userStatusOffline:
-			to.add("{ userStatusOffline");
-			to.add("\n").add(add);
-			to.add("  was_online: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_photos_photos:
-			to.add("{ photos_photos");
-			to.add("\n").add(add);
-			to.add("  photos: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_photos_photosSlice:
-			to.add("{ photos_photosSlice");
-			to.add("\n").add(add);
-			to.add("  count: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  photos: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_decryptedMessage:
-			to.add("{ decryptedMessage");
-			to.add("\n").add(add);
-			to.add("  random_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  random_bytes: "); mtpTextSerializeType(to, from, end, mtpc_bytes, level + 1); to.add(",\n").add(add);
-			to.add("  message: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  media: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_decryptedMessageService:
-			to.add("{ decryptedMessageService");
-			to.add("\n").add(add);
-			to.add("  random_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  random_bytes: "); mtpTextSerializeType(to, from, end, mtpc_bytes, level + 1); to.add(",\n").add(add);
-			to.add("  action: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_contacts_importedContacts:
-			to.add("{ contacts_importedContacts");
-			to.add("\n").add(add);
-			to.add("  imported: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  retry_contacts: "); mtpTextSerializeType(to, from, end, 0, level + 1, mtpc_long); to.add(",\n").add(add);
-			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_fileLocationUnavailable:
-			to.add("{ fileLocationUnavailable");
-			to.add("\n").add(add);
-			to.add("  volume_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  local_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  secret: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_fileLocation:
-			to.add("{ fileLocation");
-			to.add("\n").add(add);
-			to.add("  dc_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  volume_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  local_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  secret: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_photoSizeEmpty:
-			to.add("{ photoSizeEmpty");
-			to.add("\n").add(add);
-			to.add("  type: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_photoSize:
-			to.add("{ photoSize");
-			to.add("\n").add(add);
-			to.add("  type: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  location: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  w: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  h: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  size: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_photoCachedSize:
-			to.add("{ photoCachedSize");
-			to.add("\n").add(add);
-			to.add("  type: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  location: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  w: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  h: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  bytes: "); mtpTextSerializeType(to, from, end, mtpc_bytes, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_msg_detailed_info:
-			to.add("{ msg_detailed_info");
-			to.add("\n").add(add);
-			to.add("  msg_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  answer_msg_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  bytes: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  status: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_msg_new_detailed_info:
-			to.add("{ msg_new_detailed_info");
-			to.add("\n").add(add);
-			to.add("  answer_msg_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  bytes: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  status: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_inputChatPhotoEmpty:
-			to.add("{ inputChatPhotoEmpty");
+		case mtpc_sendMessageRecordVideoAction:
+			to.add("{ sendMessageRecordVideoAction");
 			to.add(" ");
 			to.add("}");
 		break;
 
-		case mtpc_inputChatUploadedPhoto:
-			to.add("{ inputChatUploadedPhoto");
-			to.add("\n").add(add);
-			to.add("  file: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  crop: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_inputChatPhoto:
-			to.add("{ inputChatPhoto");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  crop: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_messages_sentMessage:
-			to.add("{ messages_sentMessage");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  pts: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  seq: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_messages_sentMessageLink:
-			to.add("{ messages_sentMessageLink");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  pts: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  seq: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  links: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_messages_chatFull:
-			to.add("{ messages_chatFull");
-			to.add("\n").add(add);
-			to.add("  full_chat: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  chats: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_geochats_statedMessage:
-			to.add("{ geochats_statedMessage");
-			to.add("\n").add(add);
-			to.add("  message: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  chats: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  seq: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_chatPhotoEmpty:
-			to.add("{ chatPhotoEmpty");
+		case mtpc_sendMessageUploadVideoAction:
+			to.add("{ sendMessageUploadVideoAction");
 			to.add(" ");
 			to.add("}");
 		break;
 
-		case mtpc_chatPhoto:
-			to.add("{ chatPhoto");
-			to.add("\n").add(add);
-			to.add("  photo_small: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  photo_big: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+		case mtpc_sendMessageRecordAudioAction:
+			to.add("{ sendMessageRecordAudioAction");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_sendMessageUploadAudioAction:
+			to.add("{ sendMessageUploadAudioAction");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_sendMessageUploadPhotoAction:
+			to.add("{ sendMessageUploadPhotoAction");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_sendMessageUploadDocumentAction:
+			to.add("{ sendMessageUploadDocumentAction");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_sendMessageGeoLocationAction:
+			to.add("{ sendMessageGeoLocationAction");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_sendMessageChooseContactAction:
+			to.add("{ sendMessageChooseContactAction");
+			to.add(" ");
 			to.add("}");
 		break;
 
@@ -1601,41 +875,235 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP
 			to.add("}");
 		break;
 
-		case mtpc_destroy_session_ok:
-			to.add("{ destroy_session_ok");
+		case mtpc_server_DH_inner_data:
+			to.add("{ server_DH_inner_data");
 			to.add("\n").add(add);
-			to.add("  session_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  nonce: "); mtpTextSerializeType(to, from, end, mtpc_int128, level + 1); to.add(",\n").add(add);
+			to.add("  server_nonce: "); mtpTextSerializeType(to, from, end, mtpc_int128, level + 1); to.add(",\n").add(add);
+			to.add("  g: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  dh_prime: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  g_a: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  server_time: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
-		case mtpc_destroy_session_none:
-			to.add("{ destroy_session_none");
+		case mtpc_geochats_located:
+			to.add("{ geochats_located");
 			to.add("\n").add(add);
-			to.add("  session_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  results: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  messages: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  chats: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
-		case mtpc_http_wait:
-			to.add("{ http_wait");
-			to.add("\n").add(add);
-			to.add("  max_delay: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  wait_after: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  max_wait: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_messages_sentEncryptedMessage:
-			to.add("{ messages_sentEncryptedMessage");
+		case mtpc_contactBlocked:
+			to.add("{ contactBlocked");
 			to.add("\n").add(add);
+			to.add("  user_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
 			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
-		case mtpc_messages_sentEncryptedFile:
-			to.add("{ messages_sentEncryptedFile");
+		case mtpc_photoEmpty:
+			to.add("{ photoEmpty");
 			to.add("\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_photo:
+			to.add("{ photo");
+			to.add("\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  access_hash: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  user_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
 			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  file: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  caption: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  geo: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  sizes: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_contacts_found:
+			to.add("{ contacts_found");
+			to.add("\n").add(add);
+			to.add("  results: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_geoChatMessageEmpty:
+			to.add("{ geoChatMessageEmpty");
+			to.add("\n").add(add);
+			to.add("  chat_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_geoChatMessage:
+			to.add("{ geoChatMessage");
+			to.add("\n").add(add);
+			to.add("  chat_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  from_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  message: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  media: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_geoChatMessageService:
+			to.add("{ geoChatMessageService");
+			to.add("\n").add(add);
+			to.add("  chat_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  from_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  action: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_inputVideoEmpty:
+			to.add("{ inputVideoEmpty");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_inputVideo:
+			to.add("{ inputVideo");
+			to.add("\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  access_hash: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_peerUser:
+			to.add("{ peerUser");
+			to.add("\n").add(add);
+			to.add("  user_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_peerChat:
+			to.add("{ peerChat");
+			to.add("\n").add(add);
+			to.add("  chat_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_msgs_ack:
+			to.add("{ msgs_ack");
+			to.add("\n").add(add);
+			to.add("  msg_ids: "); mtpTextSerializeType(to, from, end, 0, level + 1, mtpc_long); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_messages_statedMessage:
+			to.add("{ messages_statedMessage");
+			to.add("\n").add(add);
+			to.add("  message: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  chats: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  pts: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  seq: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_messages_statedMessageLink:
+			to.add("{ messages_statedMessageLink");
+			to.add("\n").add(add);
+			to.add("  message: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  chats: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  links: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  pts: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  seq: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_fileLocationUnavailable:
+			to.add("{ fileLocationUnavailable");
+			to.add("\n").add(add);
+			to.add("  volume_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  local_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  secret: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_fileLocation:
+			to.add("{ fileLocation");
+			to.add("\n").add(add);
+			to.add("  dc_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  volume_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  local_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  secret: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_messages_sentMessage:
+			to.add("{ messages_sentMessage");
+			to.add("\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  pts: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  seq: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_messages_sentMessageLink:
+			to.add("{ messages_sentMessageLink");
+			to.add("\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  pts: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  seq: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  links: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_geoPointEmpty:
+			to.add("{ geoPointEmpty");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_geoPoint:
+			to.add("{ geoPoint");
+			to.add("\n").add(add);
+			to.add("  long: "); mtpTextSerializeType(to, from, end, mtpc_double, level + 1); to.add(",\n").add(add);
+			to.add("  lat: "); mtpTextSerializeType(to, from, end, mtpc_double, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_inputDocumentEmpty:
+			to.add("{ inputDocumentEmpty");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_inputDocument:
+			to.add("{ inputDocument");
+			to.add("\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  access_hash: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_chatParticipantsForbidden:
+			to.add("{ chatParticipantsForbidden");
+			to.add("\n").add(add);
+			to.add("  chat_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_chatParticipants:
+			to.add("{ chatParticipants");
+			to.add("\n").add(add);
+			to.add("  chat_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  admin_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  participants: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  version: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
@@ -1658,368 +1126,11 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP
 			to.add("}");
 		break;
 
-		case mtpc_inputEncryptedChat:
-			to.add("{ inputEncryptedChat");
+		case mtpc_auth_authorization:
+			to.add("{ auth_authorization");
 			to.add("\n").add(add);
-			to.add("  chat_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  access_hash: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_messages_chats:
-			to.add("{ messages_chats");
-			to.add("\n").add(add);
-			to.add("  chats: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_encryptedChatEmpty:
-			to.add("{ encryptedChatEmpty");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_encryptedChatWaiting:
-			to.add("{ encryptedChatWaiting");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  access_hash: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  admin_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  participant_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_encryptedChatRequested:
-			to.add("{ encryptedChatRequested");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  access_hash: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  admin_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  participant_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  g_a: "); mtpTextSerializeType(to, from, end, mtpc_bytes, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_encryptedChat:
-			to.add("{ encryptedChat");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  access_hash: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  admin_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  participant_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  g_a_or_b: "); mtpTextSerializeType(to, from, end, mtpc_bytes, level + 1); to.add(",\n").add(add);
-			to.add("  key_fingerprint: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_encryptedChatDiscarded:
-			to.add("{ encryptedChatDiscarded");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_messages_messages:
-			to.add("{ messages_messages");
-			to.add("\n").add(add);
-			to.add("  messages: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  chats: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_messages_messagesSlice:
-			to.add("{ messages_messagesSlice");
-			to.add("\n").add(add);
-			to.add("  count: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  messages: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  chats: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_auth_checkedPhone:
-			to.add("{ auth_checkedPhone");
-			to.add("\n").add(add);
-			to.add("  phone_registered: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  phone_invited: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_contactSuggested:
-			to.add("{ contactSuggested");
-			to.add("\n").add(add);
-			to.add("  user_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  mutual_contacts: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_contacts_foreignLinkUnknown:
-			to.add("{ contacts_foreignLinkUnknown");
-			to.add(" ");
-			to.add("}");
-		break;
-
-		case mtpc_contacts_foreignLinkRequested:
-			to.add("{ contacts_foreignLinkRequested");
-			to.add("\n").add(add);
-			to.add("  has_phone: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_contacts_foreignLinkMutual:
-			to.add("{ contacts_foreignLinkMutual");
-			to.add(" ");
-			to.add("}");
-		break;
-
-		case mtpc_inputAudioEmpty:
-			to.add("{ inputAudioEmpty");
-			to.add(" ");
-			to.add("}");
-		break;
-
-		case mtpc_inputAudio:
-			to.add("{ inputAudio");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  access_hash: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_contacts_contacts:
-			to.add("{ contacts_contacts");
-			to.add("\n").add(add);
-			to.add("  contacts: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_contacts_contactsNotModified:
-			to.add("{ contacts_contactsNotModified");
-			to.add(" ");
-			to.add("}");
-		break;
-
-		case mtpc_chatEmpty:
-			to.add("{ chatEmpty");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_chat:
-			to.add("{ chat");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  title: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  photo: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  participants_count: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  left: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  version: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_chatForbidden:
-			to.add("{ chatForbidden");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  title: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_geoChat:
-			to.add("{ geoChat");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  access_hash: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  title: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  address: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  venue: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  geo: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  photo: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  participants_count: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  checked_in: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  version: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_pong:
-			to.add("{ pong");
-			to.add("\n").add(add);
-			to.add("  msg_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  ping_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_inputPeerNotifyEventsEmpty:
-			to.add("{ inputPeerNotifyEventsEmpty");
-			to.add(" ");
-			to.add("}");
-		break;
-
-		case mtpc_inputPeerNotifyEventsAll:
-			to.add("{ inputPeerNotifyEventsAll");
-			to.add(" ");
-			to.add("}");
-		break;
-
-		case mtpc_inputPeerNotifySettings:
-			to.add("{ inputPeerNotifySettings");
-			to.add("\n").add(add);
-			to.add("  mute_until: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  sound: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  show_previews: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  events_mask: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_messages_affectedHistory:
-			to.add("{ messages_affectedHistory");
-			to.add("\n").add(add);
-			to.add("  pts: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  seq: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  offset: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_inputNotifyPeer:
-			to.add("{ inputNotifyPeer");
-			to.add("\n").add(add);
-			to.add("  peer: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_inputNotifyUsers:
-			to.add("{ inputNotifyUsers");
-			to.add(" ");
-			to.add("}");
-		break;
-
-		case mtpc_inputNotifyChats:
-			to.add("{ inputNotifyChats");
-			to.add(" ");
-			to.add("}");
-		break;
-
-		case mtpc_inputNotifyAll:
-			to.add("{ inputNotifyAll");
-			to.add(" ");
-			to.add("}");
-		break;
-
-		case mtpc_inputNotifyGeoChatPeer:
-			to.add("{ inputNotifyGeoChatPeer");
-			to.add("\n").add(add);
-			to.add("  peer: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_bad_msg_notification:
-			to.add("{ bad_msg_notification");
-			to.add("\n").add(add);
-			to.add("  bad_msg_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  bad_msg_seqno: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  error_code: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_bad_server_salt:
-			to.add("{ bad_server_salt");
-			to.add("\n").add(add);
-			to.add("  bad_msg_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  bad_msg_seqno: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  error_code: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  new_server_salt: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_config:
-			to.add("{ config");
-			to.add("\n").add(add);
-			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  test_mode: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  this_dc: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  dc_options: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  chat_size_max: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  broadcast_size_max: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_inputGeoPointEmpty:
-			to.add("{ inputGeoPointEmpty");
-			to.add(" ");
-			to.add("}");
-		break;
-
-		case mtpc_inputGeoPoint:
-			to.add("{ inputGeoPoint");
-			to.add("\n").add(add);
-			to.add("  lat: "); mtpTextSerializeType(to, from, end, mtpc_double, level + 1); to.add(",\n").add(add);
-			to.add("  long: "); mtpTextSerializeType(to, from, end, mtpc_double, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_inputUserEmpty:
-			to.add("{ inputUserEmpty");
-			to.add(" ");
-			to.add("}");
-		break;
-
-		case mtpc_inputUserSelf:
-			to.add("{ inputUserSelf");
-			to.add(" ");
-			to.add("}");
-		break;
-
-		case mtpc_inputUserContact:
-			to.add("{ inputUserContact");
-			to.add("\n").add(add);
-			to.add("  user_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_inputUserForeign:
-			to.add("{ inputUserForeign");
-			to.add("\n").add(add);
-			to.add("  user_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  access_hash: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_dialog:
-			to.add("{ dialog");
-			to.add("\n").add(add);
-			to.add("  peer: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  top_message: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  unread_count: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  notify_settings: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_importedContact:
-			to.add("{ importedContact");
-			to.add("\n").add(add);
-			to.add("  user_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  client_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_dcOption:
-			to.add("{ dcOption");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  hostname: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  ip_address: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  port: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  expires: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  user: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
@@ -2067,6 +1178,7 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP
 			to.add("{ updateUserTyping");
 			to.add("\n").add(add);
 			to.add("  user_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  action: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
@@ -2075,6 +1187,7 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP
 			to.add("\n").add(add);
 			to.add("  chat_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
 			to.add("  user_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  action: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
@@ -2099,6 +1212,7 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP
 			to.add("  user_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
 			to.add("  first_name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
 			to.add("  last_name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  username: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
@@ -2227,213 +1341,286 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP
 			to.add("}");
 		break;
 
-		case mtpc_decryptedMessageActionSetMessageTTL:
-			to.add("{ decryptedMessageActionSetMessageTTL");
+		case mtpc_updateServiceNotification:
+			to.add("{ updateServiceNotification");
 			to.add("\n").add(add);
-			to.add("  ttl_seconds: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  type: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  message: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  media: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  popup: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
-		case mtpc_decryptedMessageActionReadMessages:
-			to.add("{ decryptedMessageActionReadMessages");
+		case mtpc_p_q_inner_data:
+			to.add("{ p_q_inner_data");
 			to.add("\n").add(add);
-			to.add("  random_ids: "); mtpTextSerializeType(to, from, end, 0, level + 1, mtpc_long); to.add(",\n").add(add);
+			to.add("  pq: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  p: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  q: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  nonce: "); mtpTextSerializeType(to, from, end, mtpc_int128, level + 1); to.add(",\n").add(add);
+			to.add("  server_nonce: "); mtpTextSerializeType(to, from, end, mtpc_int128, level + 1); to.add(",\n").add(add);
+			to.add("  new_nonce: "); mtpTextSerializeType(to, from, end, mtpc_int256, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
-		case mtpc_decryptedMessageActionDeleteMessages:
-			to.add("{ decryptedMessageActionDeleteMessages");
+		case mtpc_http_wait:
+			to.add("{ http_wait");
 			to.add("\n").add(add);
-			to.add("  random_ids: "); mtpTextSerializeType(to, from, end, 0, level + 1, mtpc_long); to.add(",\n").add(add);
+			to.add("  max_delay: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  wait_after: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  max_wait: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
-		case mtpc_decryptedMessageActionScreenshotMessages:
-			to.add("{ decryptedMessageActionScreenshotMessages");
-			to.add("\n").add(add);
-			to.add("  random_ids: "); mtpTextSerializeType(to, from, end, 0, level + 1, mtpc_long); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_decryptedMessageActionFlushHistory:
-			to.add("{ decryptedMessageActionFlushHistory");
-			to.add(" ");
-			to.add("}");
-		break;
-
-		case mtpc_decryptedMessageActionNotifyLayer:
-			to.add("{ decryptedMessageActionNotifyLayer");
-			to.add("\n").add(add);
-			to.add("  layer: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_peerNotifySettingsEmpty:
-			to.add("{ peerNotifySettingsEmpty");
-			to.add(" ");
-			to.add("}");
-		break;
-
-		case mtpc_peerNotifySettings:
-			to.add("{ peerNotifySettings");
-			to.add("\n").add(add);
-			to.add("  mute_until: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  sound: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  show_previews: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  events_mask: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_userEmpty:
-			to.add("{ userEmpty");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_userSelf:
-			to.add("{ userSelf");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  first_name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  last_name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  phone: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  photo: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  status: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  inactive: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_userContact:
-			to.add("{ userContact");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  first_name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  last_name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  access_hash: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  phone: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  photo: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  status: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_userRequest:
-			to.add("{ userRequest");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  first_name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  last_name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  access_hash: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  phone: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  photo: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  status: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_userForeign:
-			to.add("{ userForeign");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  first_name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  last_name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  access_hash: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  photo: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  status: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_userDeleted:
-			to.add("{ userDeleted");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  first_name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  last_name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_contacts_suggested:
-			to.add("{ contacts_suggested");
-			to.add("\n").add(add);
-			to.add("  results: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_auth_authorization:
-			to.add("{ auth_authorization");
-			to.add("\n").add(add);
-			to.add("  expires: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  user: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_messages_chat:
-			to.add("{ messages_chat");
-			to.add("\n").add(add);
-			to.add("  chat: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_auth_sentCode:
-			to.add("{ auth_sentCode");
-			to.add("\n").add(add);
-			to.add("  phone_registered: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  phone_code_hash: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  send_call_timeout: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  is_password: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_audioEmpty:
-			to.add("{ audioEmpty");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_audio:
-			to.add("{ audio");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  access_hash: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  user_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  duration: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  mime_type: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  size: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  dc_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_messages_statedMessages:
-			to.add("{ messages_statedMessages");
+		case mtpc_messages_messages:
+			to.add("{ messages_messages");
 			to.add("\n").add(add);
 			to.add("  messages: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
 			to.add("  chats: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
 			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  pts: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_messages_messagesSlice:
+			to.add("{ messages_messagesSlice");
+			to.add("\n").add(add);
+			to.add("  count: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  messages: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  chats: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_updates_differenceEmpty:
+			to.add("{ updates_differenceEmpty");
+			to.add("\n").add(add);
+			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
 			to.add("  seq: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
-		case mtpc_messages_statedMessagesLinks:
-			to.add("{ messages_statedMessagesLinks");
+		case mtpc_updates_difference:
+			to.add("{ updates_difference");
+			to.add("\n").add(add);
+			to.add("  new_messages: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  new_encrypted_messages: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  other_updates: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  chats: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  state: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_updates_differenceSlice:
+			to.add("{ updates_differenceSlice");
+			to.add("\n").add(add);
+			to.add("  new_messages: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  new_encrypted_messages: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  other_updates: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  chats: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  intermediate_state: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_messages_affectedHistory:
+			to.add("{ messages_affectedHistory");
+			to.add("\n").add(add);
+			to.add("  pts: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  seq: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  offset: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_inputNotifyPeer:
+			to.add("{ inputNotifyPeer");
+			to.add("\n").add(add);
+			to.add("  peer: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_inputNotifyUsers:
+			to.add("{ inputNotifyUsers");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_inputNotifyChats:
+			to.add("{ inputNotifyChats");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_inputNotifyAll:
+			to.add("{ inputNotifyAll");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_inputNotifyGeoChatPeer:
+			to.add("{ inputNotifyGeoChatPeer");
+			to.add("\n").add(add);
+			to.add("  peer: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_chatPhotoEmpty:
+			to.add("{ chatPhotoEmpty");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_chatPhoto:
+			to.add("{ chatPhoto");
+			to.add("\n").add(add);
+			to.add("  photo_small: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  photo_big: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_messageEmpty:
+			to.add("{ messageEmpty");
+			to.add("\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_message:
+			to.add("{ message");
+			to.add("\n").add(add);
+			to.add("  flags: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  from_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  to_id: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  message: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  media: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_messageForwarded:
+			to.add("{ messageForwarded");
+			to.add("\n").add(add);
+			to.add("  flags: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  fwd_from_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  fwd_date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  from_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  to_id: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  message: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  media: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_messageService:
+			to.add("{ messageService");
+			to.add("\n").add(add);
+			to.add("  flags: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  from_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  to_id: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  action: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_client_DH_inner_data:
+			to.add("{ client_DH_inner_data");
+			to.add("\n").add(add);
+			to.add("  nonce: "); mtpTextSerializeType(to, from, end, mtpc_int128, level + 1); to.add(",\n").add(add);
+			to.add("  server_nonce: "); mtpTextSerializeType(to, from, end, mtpc_int128, level + 1); to.add(",\n").add(add);
+			to.add("  retry_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  g_b: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_updatesTooLong:
+			to.add("{ updatesTooLong");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_updateShortMessage:
+			to.add("{ updateShortMessage");
+			to.add("\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  from_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  message: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  pts: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  seq: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_updateShortChatMessage:
+			to.add("{ updateShortChatMessage");
+			to.add("\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  from_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  chat_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  message: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  pts: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  seq: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_updateShort:
+			to.add("{ updateShort");
+			to.add("\n").add(add);
+			to.add("  update: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_updatesCombined:
+			to.add("{ updatesCombined");
+			to.add("\n").add(add);
+			to.add("  updates: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  chats: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  seq_start: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  seq: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_updates:
+			to.add("{ updates");
+			to.add("\n").add(add);
+			to.add("  updates: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  chats: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  seq: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_geochats_messages:
+			to.add("{ geochats_messages");
 			to.add("\n").add(add);
 			to.add("  messages: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
 			to.add("  chats: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
 			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  links: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  pts: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  seq: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
-		case mtpc_contactBlocked:
-			to.add("{ contactBlocked");
+		case mtpc_geochats_messagesSlice:
+			to.add("{ geochats_messagesSlice");
 			to.add("\n").add(add);
-			to.add("  user_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  count: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  messages: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  chats: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_rpc_error:
+			to.add("{ rpc_error");
+			to.add("\n").add(add);
+			to.add("  error_code: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  error_message: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
@@ -2497,34 +1684,27 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP
 			to.add("}");
 		break;
 
-		case mtpc_help_inviteText:
-			to.add("{ help_inviteText");
+		case mtpc_contacts_suggested:
+			to.add("{ contacts_suggested");
 			to.add("\n").add(add);
-			to.add("  message: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  results: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
-		case mtpc_chatLocated:
-			to.add("{ chatLocated");
-			to.add("\n").add(add);
-			to.add("  chat_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  distance: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+		case mtpc_peerNotifySettingsEmpty:
+			to.add("{ peerNotifySettingsEmpty");
+			to.add(" ");
 			to.add("}");
 		break;
 
-		case mtpc_contact:
-			to.add("{ contact");
+		case mtpc_peerNotifySettings:
+			to.add("{ peerNotifySettings");
 			to.add("\n").add(add);
-			to.add("  user_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  mutual: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_decryptedMessageLayer:
-			to.add("{ decryptedMessageLayer");
-			to.add("\n").add(add);
-			to.add("  layer: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  message: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  mute_until: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  sound: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  show_previews: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  events_mask: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
@@ -2539,6 +1719,462 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP
 			to.add("}");
 		break;
 
+		case mtpc_messages_messageEmpty:
+			to.add("{ messages_messageEmpty");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_messages_message:
+			to.add("{ messages_message");
+			to.add("\n").add(add);
+			to.add("  message: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  chats: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_inputFile:
+			to.add("{ inputFile");
+			to.add("\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  parts: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  md5_checksum: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_inputFileBig:
+			to.add("{ inputFileBig");
+			to.add("\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  parts: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_chatParticipant:
+			to.add("{ chatParticipant");
+			to.add("\n").add(add);
+			to.add("  user_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  inviter_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_contactSuggested:
+			to.add("{ contactSuggested");
+			to.add("\n").add(add);
+			to.add("  user_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  mutual_contacts: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_dh_gen_ok:
+			to.add("{ dh_gen_ok");
+			to.add("\n").add(add);
+			to.add("  nonce: "); mtpTextSerializeType(to, from, end, mtpc_int128, level + 1); to.add(",\n").add(add);
+			to.add("  server_nonce: "); mtpTextSerializeType(to, from, end, mtpc_int128, level + 1); to.add(",\n").add(add);
+			to.add("  new_nonce_hash1: "); mtpTextSerializeType(to, from, end, mtpc_int128, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_dh_gen_retry:
+			to.add("{ dh_gen_retry");
+			to.add("\n").add(add);
+			to.add("  nonce: "); mtpTextSerializeType(to, from, end, mtpc_int128, level + 1); to.add(",\n").add(add);
+			to.add("  server_nonce: "); mtpTextSerializeType(to, from, end, mtpc_int128, level + 1); to.add(",\n").add(add);
+			to.add("  new_nonce_hash2: "); mtpTextSerializeType(to, from, end, mtpc_int128, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_dh_gen_fail:
+			to.add("{ dh_gen_fail");
+			to.add("\n").add(add);
+			to.add("  nonce: "); mtpTextSerializeType(to, from, end, mtpc_int128, level + 1); to.add(",\n").add(add);
+			to.add("  server_nonce: "); mtpTextSerializeType(to, from, end, mtpc_int128, level + 1); to.add(",\n").add(add);
+			to.add("  new_nonce_hash3: "); mtpTextSerializeType(to, from, end, mtpc_int128, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_photos_photo:
+			to.add("{ photos_photo");
+			to.add("\n").add(add);
+			to.add("  photo: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_userEmpty:
+			to.add("{ userEmpty");
+			to.add("\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_userSelf:
+			to.add("{ userSelf");
+			to.add("\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  first_name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  last_name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  username: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  phone: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  photo: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  status: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  inactive: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_userContact:
+			to.add("{ userContact");
+			to.add("\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  first_name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  last_name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  username: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  access_hash: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  phone: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  photo: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  status: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_userRequest:
+			to.add("{ userRequest");
+			to.add("\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  first_name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  last_name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  username: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  access_hash: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  phone: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  photo: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  status: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_userForeign:
+			to.add("{ userForeign");
+			to.add("\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  first_name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  last_name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  username: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  access_hash: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  photo: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  status: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_userDeleted:
+			to.add("{ userDeleted");
+			to.add("\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  first_name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  last_name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  username: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_help_appUpdate:
+			to.add("{ help_appUpdate");
+			to.add("\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  critical: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  url: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  text: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_help_noAppUpdate:
+			to.add("{ help_noAppUpdate");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_contacts_foreignLinkUnknown:
+			to.add("{ contacts_foreignLinkUnknown");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_contacts_foreignLinkRequested:
+			to.add("{ contacts_foreignLinkRequested");
+			to.add("\n").add(add);
+			to.add("  has_phone: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_contacts_foreignLinkMutual:
+			to.add("{ contacts_foreignLinkMutual");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_encryptedChatEmpty:
+			to.add("{ encryptedChatEmpty");
+			to.add("\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_encryptedChatWaiting:
+			to.add("{ encryptedChatWaiting");
+			to.add("\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  access_hash: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  admin_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  participant_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_encryptedChatRequested:
+			to.add("{ encryptedChatRequested");
+			to.add("\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  access_hash: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  admin_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  participant_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  g_a: "); mtpTextSerializeType(to, from, end, mtpc_bytes, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_encryptedChat:
+			to.add("{ encryptedChat");
+			to.add("\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  access_hash: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  admin_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  participant_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  g_a_or_b: "); mtpTextSerializeType(to, from, end, mtpc_bytes, level + 1); to.add(",\n").add(add);
+			to.add("  key_fingerprint: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_encryptedChatDiscarded:
+			to.add("{ encryptedChatDiscarded");
+			to.add("\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_dialog:
+			to.add("{ dialog");
+			to.add("\n").add(add);
+			to.add("  peer: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  top_message: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  unread_count: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  notify_settings: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_help_support:
+			to.add("{ help_support");
+			to.add("\n").add(add);
+			to.add("  phone_number: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  user: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_inputMessagesFilterEmpty:
+			to.add("{ inputMessagesFilterEmpty");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_inputMessagesFilterPhotos:
+			to.add("{ inputMessagesFilterPhotos");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_inputMessagesFilterVideo:
+			to.add("{ inputMessagesFilterVideo");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_inputMessagesFilterPhotoVideo:
+			to.add("{ inputMessagesFilterPhotoVideo");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_inputMessagesFilterDocument:
+			to.add("{ inputMessagesFilterDocument");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_inputMessagesFilterAudio:
+			to.add("{ inputMessagesFilterAudio");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_messageActionEmpty:
+			to.add("{ messageActionEmpty");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_messageActionChatCreate:
+			to.add("{ messageActionChatCreate");
+			to.add("\n").add(add);
+			to.add("  title: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1, mtpc_int); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_messageActionChatEditTitle:
+			to.add("{ messageActionChatEditTitle");
+			to.add("\n").add(add);
+			to.add("  title: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_messageActionChatEditPhoto:
+			to.add("{ messageActionChatEditPhoto");
+			to.add("\n").add(add);
+			to.add("  photo: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_messageActionChatDeletePhoto:
+			to.add("{ messageActionChatDeletePhoto");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_messageActionChatAddUser:
+			to.add("{ messageActionChatAddUser");
+			to.add("\n").add(add);
+			to.add("  user_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_messageActionChatDeleteUser:
+			to.add("{ messageActionChatDeleteUser");
+			to.add("\n").add(add);
+			to.add("  user_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_messageActionGeoChatCreate:
+			to.add("{ messageActionGeoChatCreate");
+			to.add("\n").add(add);
+			to.add("  title: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  address: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_messageActionGeoChatCheckin:
+			to.add("{ messageActionGeoChatCheckin");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_auth_exportedAuthorization:
+			to.add("{ auth_exportedAuthorization");
+			to.add("\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  bytes: "); mtpTextSerializeType(to, from, end, mtpc_bytes, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_peerNotifyEventsEmpty:
+			to.add("{ peerNotifyEventsEmpty");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_peerNotifyEventsAll:
+			to.add("{ peerNotifyEventsAll");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_chatFull:
+			to.add("{ chatFull");
+			to.add("\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  participants: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  chat_photo: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  notify_settings: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_videoEmpty:
+			to.add("{ videoEmpty");
+			to.add("\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_video:
+			to.add("{ video");
+			to.add("\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  access_hash: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  user_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  caption: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  duration: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  mime_type: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  size: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  thumb: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  dc_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  w: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  h: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_audioEmpty:
+			to.add("{ audioEmpty");
+			to.add("\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_audio:
+			to.add("{ audio");
+			to.add("\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  access_hash: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  user_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  duration: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  mime_type: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  size: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  dc_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_rpc_answer_unknown:
+			to.add("{ rpc_answer_unknown");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_rpc_answer_dropped_running:
+			to.add("{ rpc_answer_dropped_running");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_rpc_answer_dropped:
+			to.add("{ rpc_answer_dropped");
+			to.add("\n").add(add);
+			to.add("  msg_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  seq_no: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  bytes: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
 		case mtpc_encryptedFileEmpty:
 			to.add("{ encryptedFileEmpty");
 			to.add(" ");
@@ -2556,22 +2192,378 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP
 			to.add("}");
 		break;
 
-		case mtpc_msgs_all_info:
-			to.add("{ msgs_all_info");
+		case mtpc_contacts_blocked:
+			to.add("{ contacts_blocked");
+			to.add("\n").add(add);
+			to.add("  blocked: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_contacts_blockedSlice:
+			to.add("{ contacts_blockedSlice");
+			to.add("\n").add(add);
+			to.add("  count: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  blocked: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_messages_statedMessages:
+			to.add("{ messages_statedMessages");
+			to.add("\n").add(add);
+			to.add("  messages: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  chats: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  pts: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  seq: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_messages_statedMessagesLinks:
+			to.add("{ messages_statedMessagesLinks");
+			to.add("\n").add(add);
+			to.add("  messages: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  chats: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  links: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  pts: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  seq: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_msg_resend_req:
+			to.add("{ msg_resend_req");
 			to.add("\n").add(add);
 			to.add("  msg_ids: "); mtpTextSerializeType(to, from, end, 0, level + 1, mtpc_long); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_pong:
+			to.add("{ pong");
+			to.add("\n").add(add);
+			to.add("  msg_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  ping_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_msg_detailed_info:
+			to.add("{ msg_detailed_info");
+			to.add("\n").add(add);
+			to.add("  msg_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  answer_msg_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  bytes: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  status: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_msg_new_detailed_info:
+			to.add("{ msg_new_detailed_info");
+			to.add("\n").add(add);
+			to.add("  answer_msg_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  bytes: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  status: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_chatEmpty:
+			to.add("{ chatEmpty");
+			to.add("\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_chat:
+			to.add("{ chat");
+			to.add("\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  title: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  photo: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  participants_count: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  left: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  version: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_chatForbidden:
+			to.add("{ chatForbidden");
+			to.add("\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  title: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_geoChat:
+			to.add("{ geoChat");
+			to.add("\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  access_hash: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  title: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  address: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  venue: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  geo: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  photo: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  participants_count: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  checked_in: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  version: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_config:
+			to.add("{ config");
+			to.add("\n").add(add);
+			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  test_mode: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  this_dc: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  dc_options: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  chat_size_max: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  broadcast_size_max: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_wallPaper:
+			to.add("{ wallPaper");
+			to.add("\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  title: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  sizes: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  color: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_wallPaperSolid:
+			to.add("{ wallPaperSolid");
+			to.add("\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  title: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  bg_color: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  color: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_future_salts:
+			to.add("{ future_salts");
+			to.add("\n").add(add);
+			to.add("  req_msg_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  now: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  salts: "); mtpTextSerializeType(to, from, end, mtpc_vector, level + 1, mtpc_future_salt); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_inputGeoChat:
+			to.add("{ inputGeoChat");
+			to.add("\n").add(add);
+			to.add("  chat_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  access_hash: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_msgs_state_info:
+			to.add("{ msgs_state_info");
+			to.add("\n").add(add);
+			to.add("  req_msg_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
 			to.add("  info: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
-		case mtpc_photos_updateProfilePhoto:
-			to.add("{ photos_updateProfilePhoto");
+		case mtpc_inputGeoPointEmpty:
+			to.add("{ inputGeoPointEmpty");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_inputGeoPoint:
+			to.add("{ inputGeoPoint");
+			to.add("\n").add(add);
+			to.add("  lat: "); mtpTextSerializeType(to, from, end, mtpc_double, level + 1); to.add(",\n").add(add);
+			to.add("  long: "); mtpTextSerializeType(to, from, end, mtpc_double, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_inputPhoneContact:
+			to.add("{ inputPhoneContact");
+			to.add("\n").add(add);
+			to.add("  client_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  phone: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  first_name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  last_name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_messages_chats:
+			to.add("{ messages_chats");
+			to.add("\n").add(add);
+			to.add("  chats: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_inputChatPhotoEmpty:
+			to.add("{ inputChatPhotoEmpty");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_inputChatUploadedPhoto:
+			to.add("{ inputChatUploadedPhoto");
+			to.add("\n").add(add);
+			to.add("  file: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  crop: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_inputChatPhoto:
+			to.add("{ inputChatPhoto");
 			to.add("\n").add(add);
 			to.add("  id: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
 			to.add("  crop: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
+		case mtpc_messages_chatFull:
+			to.add("{ messages_chatFull");
+			to.add("\n").add(add);
+			to.add("  full_chat: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  chats: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  users: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_inputPeerNotifyEventsEmpty:
+			to.add("{ inputPeerNotifyEventsEmpty");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_inputPeerNotifyEventsAll:
+			to.add("{ inputPeerNotifyEventsAll");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_inputAppEvent:
+			to.add("{ inputAppEvent");
+			to.add("\n").add(add);
+			to.add("  time: "); mtpTextSerializeType(to, from, end, mtpc_double, level + 1); to.add(",\n").add(add);
+			to.add("  type: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  peer: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  data: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_bad_msg_notification:
+			to.add("{ bad_msg_notification");
+			to.add("\n").add(add);
+			to.add("  bad_msg_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  bad_msg_seqno: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  error_code: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_bad_server_salt:
+			to.add("{ bad_server_salt");
+			to.add("\n").add(add);
+			to.add("  bad_msg_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  bad_msg_seqno: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  error_code: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  new_server_salt: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_auth_checkedPhone:
+			to.add("{ auth_checkedPhone");
+			to.add("\n").add(add);
+			to.add("  phone_registered: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  phone_invited: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_userFull:
+			to.add("{ userFull");
+			to.add("\n").add(add);
+			to.add("  user: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  link: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  profile_photo: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  notify_settings: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  blocked: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  real_first_name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  real_last_name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_chatLocated:
+			to.add("{ chatLocated");
+			to.add("\n").add(add);
+			to.add("  chat_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  distance: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_contacts_importContacts:
+			to.add("{ contacts_importContacts");
+			to.add("\n").add(add);
+			to.add("  contacts: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  replace: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_messages_forwardMessages:
+			to.add("{ messages_forwardMessages");
+			to.add("\n").add(add);
+			to.add("  peer: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, 0, level + 1, mtpc_int); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_messages_sendBroadcast:
+			to.add("{ messages_sendBroadcast");
+			to.add("\n").add(add);
+			to.add("  contacts: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  message: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  media: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_upload_getFile:
+			to.add("{ upload_getFile");
+			to.add("\n").add(add);
+			to.add("  location: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  offset: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  limit: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_auth_signUp:
+			to.add("{ auth_signUp");
+			to.add("\n").add(add);
+			to.add("  phone_number: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  phone_code_hash: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  phone_code: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  first_name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  last_name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_auth_signIn:
+			to.add("{ auth_signIn");
+			to.add("\n").add(add);
+			to.add("  phone_number: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  phone_code_hash: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  phone_code: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_auth_importAuthorization:
+			to.add("{ auth_importAuthorization");
+			to.add("\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  bytes: "); mtpTextSerializeType(to, from, end, mtpc_bytes, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
 		case mtpc_messages_getMessages:
 			to.add("{ messages_getMessages");
 			to.add("\n").add(add);
@@ -2603,6 +2595,90 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP
 			to.add("}");
 		break;
 
+		case mtpc_photos_getUserPhotos:
+			to.add("{ photos_getUserPhotos");
+			to.add("\n").add(add);
+			to.add("  user_id: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  offset: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  max_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  limit: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_updates_getDifference:
+			to.add("{ updates_getDifference");
+			to.add("\n").add(add);
+			to.add("  pts: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  qts: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_messages_readHistory:
+			to.add("{ messages_readHistory");
+			to.add("\n").add(add);
+			to.add("  peer: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  max_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  offset: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  read_contents: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_messages_deleteHistory:
+			to.add("{ messages_deleteHistory");
+			to.add("\n").add(add);
+			to.add("  peer: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  offset: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_help_getNearestDc:
+			to.add("{ help_getNearestDc");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_req_pq:
+			to.add("{ req_pq");
+			to.add("\n").add(add);
+			to.add("  nonce: "); mtpTextSerializeType(to, from, end, mtpc_int128, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_help_getSupport:
+			to.add("{ help_getSupport");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_contacts_getSuggested:
+			to.add("{ contacts_getSuggested");
+			to.add("\n").add(add);
+			to.add("  limit: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_account_getNotifySettings:
+			to.add("{ account_getNotifySettings");
+			to.add("\n").add(add);
+			to.add("  peer: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_updates_getState:
+			to.add("{ updates_getState");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_photos_updateProfilePhoto:
+			to.add("{ photos_updateProfilePhoto");
+			to.add("\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  crop: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
 		case mtpc_set_client_DH_params:
 			to.add("{ set_client_DH_params");
 			to.add("\n").add(add);
@@ -2612,16 +2688,76 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP
 			to.add("}");
 		break;
 
+		case mtpc_invokeAfterMsg:
+			to.add("{ invokeAfterMsg");
+			to.add("\n").add(add);
+			to.add("  msg_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  query: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_invokeAfterMsgs:
+			to.add("{ invokeAfterMsgs");
+			to.add("\n").add(add);
+			to.add("  msg_ids: "); mtpTextSerializeType(to, from, end, 0, level + 1, mtpc_long); to.add(",\n").add(add);
+			to.add("  query: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_initConnection:
+			to.add("{ initConnection");
+			to.add("\n").add(add);
+			to.add("  api_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  device_model: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  system_version: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  app_version: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  lang_code: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  query: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
 		case mtpc_contacts_getStatuses:
 			to.add("{ contacts_getStatuses");
 			to.add(" ");
 			to.add("}");
 		break;
 
-		case mtpc_auth_checkPhone:
-			to.add("{ auth_checkPhone");
+		case mtpc_contacts_deleteContact:
+			to.add("{ contacts_deleteContact");
 			to.add("\n").add(add);
-			to.add("  phone_number: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_photos_uploadProfilePhoto:
+			to.add("{ photos_uploadProfilePhoto");
+			to.add("\n").add(add);
+			to.add("  file: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  caption: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  geo_point: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  crop: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_account_updateProfile:
+			to.add("{ account_updateProfile");
+			to.add("\n").add(add);
+			to.add("  first_name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  last_name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_contacts_importCard:
+			to.add("{ contacts_importCard");
+			to.add("\n").add(add);
+			to.add("  export_card: "); mtpTextSerializeType(to, from, end, 0, level + 1, mtpc_int); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_account_updateUsername:
+			to.add("{ account_updateUsername");
+			to.add("\n").add(add);
+			to.add("  username: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
@@ -2635,42 +2771,13 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP
 			to.add("}");
 		break;
 
-		case mtpc_updates_getDifference:
-			to.add("{ updates_getDifference");
-			to.add("\n").add(add);
-			to.add("  pts: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  qts: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_help_getInviteText:
-			to.add("{ help_getInviteText");
-			to.add("\n").add(add);
-			to.add("  lang_code: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_users_getFullUser:
-			to.add("{ users_getFullUser");
+		case mtpc_users_getUsers:
+			to.add("{ users_getUsers");
 			to.add("\n").add(add);
 			to.add("  id: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
-		case mtpc_updates_getState:
-			to.add("{ updates_getState");
-			to.add(" ");
-			to.add("}");
-		break;
-
-		case mtpc_contacts_getContacts:
-			to.add("{ contacts_getContacts");
-			to.add("\n").add(add);
-			to.add("  hash: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
 		case mtpc_geochats_checkin:
 			to.add("{ geochats_checkin");
 			to.add("\n").add(add);
@@ -2723,6 +2830,142 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP
 			to.add("}");
 		break;
 
+		case mtpc_auth_exportAuthorization:
+			to.add("{ auth_exportAuthorization");
+			to.add("\n").add(add);
+			to.add("  dc_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_messages_requestEncryption:
+			to.add("{ messages_requestEncryption");
+			to.add("\n").add(add);
+			to.add("  user_id: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  random_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  g_a: "); mtpTextSerializeType(to, from, end, mtpc_bytes, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_messages_acceptEncryption:
+			to.add("{ messages_acceptEncryption");
+			to.add("\n").add(add);
+			to.add("  peer: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  g_b: "); mtpTextSerializeType(to, from, end, mtpc_bytes, level + 1); to.add(",\n").add(add);
+			to.add("  key_fingerprint: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_geochats_getRecents:
+			to.add("{ geochats_getRecents");
+			to.add("\n").add(add);
+			to.add("  offset: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  limit: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_geochats_search:
+			to.add("{ geochats_search");
+			to.add("\n").add(add);
+			to.add("  peer: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  q: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  filter: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  min_date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  max_date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  offset: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  max_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  limit: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_geochats_getHistory:
+			to.add("{ geochats_getHistory");
+			to.add("\n").add(add);
+			to.add("  peer: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  offset: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  max_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  limit: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_messages_sendEncrypted:
+			to.add("{ messages_sendEncrypted");
+			to.add("\n").add(add);
+			to.add("  peer: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  random_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  data: "); mtpTextSerializeType(to, from, end, mtpc_bytes, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_messages_sendEncryptedFile:
+			to.add("{ messages_sendEncryptedFile");
+			to.add("\n").add(add);
+			to.add("  peer: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  random_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  data: "); mtpTextSerializeType(to, from, end, mtpc_bytes, level + 1); to.add(",\n").add(add);
+			to.add("  file: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_messages_sendEncryptedService:
+			to.add("{ messages_sendEncryptedService");
+			to.add("\n").add(add);
+			to.add("  peer: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  random_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  data: "); mtpTextSerializeType(to, from, end, mtpc_bytes, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_destroy_session:
+			to.add("{ destroy_session");
+			to.add("\n").add(add);
+			to.add("  session_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_messages_receivedQueue:
+			to.add("{ messages_receivedQueue");
+			to.add("\n").add(add);
+			to.add("  max_qts: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_contacts_getContacts:
+			to.add("{ contacts_getContacts");
+			to.add("\n").add(add);
+			to.add("  hash: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_rpc_drop_answer:
+			to.add("{ rpc_drop_answer");
+			to.add("\n").add(add);
+			to.add("  req_msg_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_contacts_getBlocked:
+			to.add("{ contacts_getBlocked");
+			to.add("\n").add(add);
+			to.add("  offset: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  limit: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_help_getInviteText:
+			to.add("{ help_getInviteText");
+			to.add("\n").add(add);
+			to.add("  lang_code: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_messages_getDhConfig:
+			to.add("{ messages_getDhConfig");
+			to.add("\n").add(add);
+			to.add("  version: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  random_length: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
 		case mtpc_ping:
 			to.add("{ ping");
 			to.add("\n").add(add);
@@ -2738,26 +2981,51 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP
 			to.add("}");
 		break;
 
-		case mtpc_help_getSupport:
-			to.add("{ help_getSupport");
+		case mtpc_auth_sendCode:
+			to.add("{ auth_sendCode");
+			to.add("\n").add(add);
+			to.add("  phone_number: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  sms_type: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  api_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  api_hash: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  lang_code: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_messages_getDialogs:
+			to.add("{ messages_getDialogs");
+			to.add("\n").add(add);
+			to.add("  offset: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  max_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  limit: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_help_getConfig:
+			to.add("{ help_getConfig");
 			to.add(" ");
 			to.add("}");
 		break;
 
-		case mtpc_messages_readHistory:
-			to.add("{ messages_readHistory");
+		case mtpc_geochats_getLocated:
+			to.add("{ geochats_getLocated");
 			to.add("\n").add(add);
-			to.add("  peer: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  max_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  offset: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  geo_point: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  radius: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  limit: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
-		case mtpc_messages_deleteHistory:
-			to.add("{ messages_deleteHistory");
+		case mtpc_users_getFullUser:
+			to.add("{ users_getFullUser");
 			to.add("\n").add(add);
-			to.add("  peer: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  offset: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_contacts_exportCard:
+			to.add("{ contacts_exportCard");
+			to.add(" ");
 			to.add("}");
 		break;
 
@@ -2782,10 +3050,18 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP
 			to.add("}");
 		break;
 
-		case mtpc_users_getUsers:
-			to.add("{ users_getUsers");
+		case mtpc_messages_readMessageContents:
+			to.add("{ messages_readMessageContents");
 			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, 0, level + 1, mtpc_int); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
+		case mtpc_contacts_search:
+			to.add("{ contacts_search");
+			to.add("\n").add(add);
+			to.add("  q: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  limit: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
@@ -2796,13 +3072,21 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP
 			to.add("}");
 		break;
 
-		case mtpc_photos_getUserPhotos:
-			to.add("{ photos_getUserPhotos");
+		case mtpc_account_getWallPapers:
+			to.add("{ account_getWallPapers");
+			to.add(" ");
+			to.add("}");
+		break;
+
+		case mtpc_req_DH_params:
+			to.add("{ req_DH_params");
 			to.add("\n").add(add);
-			to.add("  user_id: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  offset: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  max_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  limit: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  nonce: "); mtpTextSerializeType(to, from, end, mtpc_int128, level + 1); to.add(",\n").add(add);
+			to.add("  server_nonce: "); mtpTextSerializeType(to, from, end, mtpc_int128, level + 1); to.add(",\n").add(add);
+			to.add("  p: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  q: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  public_key_fingerprint: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  encrypted_data: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
@@ -2845,6 +3129,16 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP
 			to.add("}");
 		break;
 
+		case mtpc_auth_bindTempAuthKey:
+			to.add("{ auth_bindTempAuthKey");
+			to.add("\n").add(add);
+			to.add("  perm_auth_key_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  nonce: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  expires_at: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  encrypted_message: "); mtpTextSerializeType(to, from, end, mtpc_bytes, level + 1); to.add(",\n").add(add);
+			to.add("}");
+		break;
+
 		case mtpc_account_registerDevice:
 			to.add("{ account_registerDevice");
 			to.add("\n").add(add);
@@ -2912,7 +3206,7 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP
 			to.add("{ messages_setTyping");
 			to.add("\n").add(add);
 			to.add("  peer: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  typing: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  action: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
@@ -2973,85 +3267,25 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP
 			to.add("}");
 		break;
 
-		case mtpc_req_pq:
-			to.add("{ req_pq");
+		case mtpc_auth_sendSms:
+			to.add("{ auth_sendSms");
 			to.add("\n").add(add);
-			to.add("  nonce: "); mtpTextSerializeType(to, from, end, mtpc_int128, level + 1); to.add(",\n").add(add);
+			to.add("  phone_number: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  phone_code_hash: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
-		case mtpc_auth_exportAuthorization:
-			to.add("{ auth_exportAuthorization");
+		case mtpc_account_checkUsername:
+			to.add("{ account_checkUsername");
 			to.add("\n").add(add);
-			to.add("  dc_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
+			to.add("  username: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
-		case mtpc_contacts_importContacts:
-			to.add("{ contacts_importContacts");
+		case mtpc_messages_getChats:
+			to.add("{ messages_getChats");
 			to.add("\n").add(add);
-			to.add("  contacts: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  replace: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_rpc_drop_answer:
-			to.add("{ rpc_drop_answer");
-			to.add("\n").add(add);
-			to.add("  req_msg_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_help_getConfig:
-			to.add("{ help_getConfig");
-			to.add(" ");
-			to.add("}");
-		break;
-
-		case mtpc_help_getNearestDc:
-			to.add("{ help_getNearestDc");
-			to.add(" ");
-			to.add("}");
-		break;
-
-		case mtpc_messages_getDialogs:
-			to.add("{ messages_getDialogs");
-			to.add("\n").add(add);
-			to.add("  offset: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  max_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  limit: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_account_getNotifySettings:
-			to.add("{ account_getNotifySettings");
-			to.add("\n").add(add);
-			to.add("  peer: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_geochats_getLocated:
-			to.add("{ geochats_getLocated");
-			to.add("\n").add(add);
-			to.add("  geo_point: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  radius: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  limit: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_messages_getDhConfig:
-			to.add("{ messages_getDhConfig");
-			to.add("\n").add(add);
-			to.add("  version: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  random_length: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_account_updateProfile:
-			to.add("{ account_updateProfile");
-			to.add("\n").add(add);
-			to.add("  first_name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  last_name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  id: "); mtpTextSerializeType(to, from, end, 0, level + 1, mtpc_int); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
@@ -3069,247 +3303,6 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP
 			to.add("}");
 		break;
 
-		case mtpc_req_DH_params:
-			to.add("{ req_DH_params");
-			to.add("\n").add(add);
-			to.add("  nonce: "); mtpTextSerializeType(to, from, end, mtpc_int128, level + 1); to.add(",\n").add(add);
-			to.add("  server_nonce: "); mtpTextSerializeType(to, from, end, mtpc_int128, level + 1); to.add(",\n").add(add);
-			to.add("  p: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  q: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  public_key_fingerprint: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  encrypted_data: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_contacts_getSuggested:
-			to.add("{ contacts_getSuggested");
-			to.add("\n").add(add);
-			to.add("  limit: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_auth_signUp:
-			to.add("{ auth_signUp");
-			to.add("\n").add(add);
-			to.add("  phone_number: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  phone_code_hash: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  phone_code: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  first_name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  last_name: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_auth_signIn:
-			to.add("{ auth_signIn");
-			to.add("\n").add(add);
-			to.add("  phone_number: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  phone_code_hash: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  phone_code: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_auth_importAuthorization:
-			to.add("{ auth_importAuthorization");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  bytes: "); mtpTextSerializeType(to, from, end, mtpc_bytes, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_upload_getFile:
-			to.add("{ upload_getFile");
-			to.add("\n").add(add);
-			to.add("  location: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  offset: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  limit: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_photos_uploadProfilePhoto:
-			to.add("{ photos_uploadProfilePhoto");
-			to.add("\n").add(add);
-			to.add("  file: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  caption: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  geo_point: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  crop: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_auth_sendCode:
-			to.add("{ auth_sendCode");
-			to.add("\n").add(add);
-			to.add("  phone_number: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  sms_type: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  api_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  api_hash: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  lang_code: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_messages_forwardMessages:
-			to.add("{ messages_forwardMessages");
-			to.add("\n").add(add);
-			to.add("  peer: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, 0, level + 1, mtpc_int); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_messages_sendBroadcast:
-			to.add("{ messages_sendBroadcast");
-			to.add("\n").add(add);
-			to.add("  contacts: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  message: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  media: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_messages_receivedQueue:
-			to.add("{ messages_receivedQueue");
-			to.add("\n").add(add);
-			to.add("  max_qts: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_contacts_search:
-			to.add("{ contacts_search");
-			to.add("\n").add(add);
-			to.add("  q: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  limit: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_messages_sendMessage:
-			to.add("{ messages_sendMessage");
-			to.add("\n").add(add);
-			to.add("  peer: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  message: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  random_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_geochats_getRecents:
-			to.add("{ geochats_getRecents");
-			to.add("\n").add(add);
-			to.add("  offset: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  limit: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_geochats_search:
-			to.add("{ geochats_search");
-			to.add("\n").add(add);
-			to.add("  peer: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  q: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  filter: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  min_date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  max_date: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  offset: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  max_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  limit: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_geochats_getHistory:
-			to.add("{ geochats_getHistory");
-			to.add("\n").add(add);
-			to.add("  peer: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  offset: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  max_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  limit: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_destroy_session:
-			to.add("{ destroy_session");
-			to.add("\n").add(add);
-			to.add("  session_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_account_getWallPapers:
-			to.add("{ account_getWallPapers");
-			to.add(" ");
-			to.add("}");
-		break;
-
-		case mtpc_messages_sendEncrypted:
-			to.add("{ messages_sendEncrypted");
-			to.add("\n").add(add);
-			to.add("  peer: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  random_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  data: "); mtpTextSerializeType(to, from, end, mtpc_bytes, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_messages_sendEncryptedFile:
-			to.add("{ messages_sendEncryptedFile");
-			to.add("\n").add(add);
-			to.add("  peer: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  random_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  data: "); mtpTextSerializeType(to, from, end, mtpc_bytes, level + 1); to.add(",\n").add(add);
-			to.add("  file: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_messages_sendEncryptedService:
-			to.add("{ messages_sendEncryptedService");
-			to.add("\n").add(add);
-			to.add("  peer: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  random_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  data: "); mtpTextSerializeType(to, from, end, mtpc_bytes, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_contacts_getBlocked:
-			to.add("{ contacts_getBlocked");
-			to.add("\n").add(add);
-			to.add("  offset: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  limit: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_contacts_deleteContact:
-			to.add("{ contacts_deleteContact");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_invokeAfterMsg:
-			to.add("{ invokeAfterMsg");
-			to.add("\n").add(add);
-			to.add("  msg_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
-			to.add("  query: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_invokeAfterMsgs:
-			to.add("{ invokeAfterMsgs");
-			to.add("\n").add(add);
-			to.add("  msg_ids: "); mtpTextSerializeType(to, from, end, 0, level + 1, mtpc_long); to.add(",\n").add(add);
-			to.add("  query: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_initConnection:
-			to.add("{ initConnection");
-			to.add("\n").add(add);
-			to.add("  api_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  device_model: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  system_version: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  app_version: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  lang_code: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
-			to.add("  query: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
-		case mtpc_messages_getChats:
-			to.add("{ messages_getChats");
-			to.add("\n").add(add);
-			to.add("  id: "); mtpTextSerializeType(to, from, end, 0, level + 1, mtpc_int); to.add(",\n").add(add);
-			to.add("}");
-		break;
-
 		case mtpc_messages_sendMedia:
 			to.add("{ messages_sendMedia");
 			to.add("\n").add(add);
@@ -3369,21 +3362,19 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP
 			to.add("}");
 		break;
 
-		case mtpc_messages_requestEncryption:
-			to.add("{ messages_requestEncryption");
+		case mtpc_messages_sendMessage:
+			to.add("{ messages_sendMessage");
 			to.add("\n").add(add);
-			to.add("  user_id: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  random_id: "); mtpTextSerializeType(to, from, end, mtpc_int, level + 1); to.add(",\n").add(add);
-			to.add("  g_a: "); mtpTextSerializeType(to, from, end, mtpc_bytes, level + 1); to.add(",\n").add(add);
+			to.add("  peer: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
+			to.add("  message: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
+			to.add("  random_id: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
-		case mtpc_messages_acceptEncryption:
-			to.add("{ messages_acceptEncryption");
+		case mtpc_auth_checkPhone:
+			to.add("{ auth_checkPhone");
 			to.add("\n").add(add);
-			to.add("  peer: "); mtpTextSerializeType(to, from, end, 0, level + 1); to.add(",\n").add(add);
-			to.add("  g_b: "); mtpTextSerializeType(to, from, end, mtpc_bytes, level + 1); to.add(",\n").add(add);
-			to.add("  key_fingerprint: "); mtpTextSerializeType(to, from, end, mtpc_long, level + 1); to.add(",\n").add(add);
+			to.add("  phone_number: "); mtpTextSerializeType(to, from, end, mtpc_string, level + 1); to.add(",\n").add(add);
 			to.add("}");
 		break;
 
diff --git a/Telegram/SourceFiles/mtproto/mtpScheme.h b/Telegram/SourceFiles/mtproto/mtpScheme.h
index cb313179c3..888be883a2 100644
--- a/Telegram/SourceFiles/mtproto/mtpScheme.h
+++ b/Telegram/SourceFiles/mtproto/mtpScheme.h
@@ -111,11 +111,11 @@ enum {
 	mtpc_fileLocationUnavailable = 0x7c596b46,
 	mtpc_fileLocation = 0x53d69076,
 	mtpc_userEmpty = 0x200250ba,
-	mtpc_userSelf = 0x720535ec,
-	mtpc_userContact = 0xf2fb8319,
-	mtpc_userRequest = 0x22e8ceb0,
-	mtpc_userForeign = 0x5214c89d,
-	mtpc_userDeleted = 0xb29ad7cc,
+	mtpc_userSelf = 0x7007b451,
+	mtpc_userContact = 0xcab35e18,
+	mtpc_userRequest = 0xd9ccc4ef,
+	mtpc_userForeign = 0x75cf7a8,
+	mtpc_userDeleted = 0xd6016d7a,
 	mtpc_userProfilePhotoEmpty = 0x4f11bae1,
 	mtpc_userProfilePhoto = 0xd559d8c8,
 	mtpc_userStatusEmpty = 0x9d05049,
@@ -131,9 +131,9 @@ enum {
 	mtpc_chatPhotoEmpty = 0x37c1011c,
 	mtpc_chatPhoto = 0x6153276a,
 	mtpc_messageEmpty = 0x83e5de54,
-	mtpc_message = 0x22eb6aba,
-	mtpc_messageForwarded = 0x5f46804,
-	mtpc_messageService = 0x9f8d60bb,
+	mtpc_message = 0x567699b3,
+	mtpc_messageForwarded = 0xa367e716,
+	mtpc_messageService = 0x1d86f70e,
 	mtpc_messageMediaEmpty = 0x3ded6320,
 	mtpc_messageMediaPhoto = 0xc8c45a2a,
 	mtpc_messageMediaVideo = 0xa2d24290,
@@ -177,7 +177,6 @@ enum {
 	mtpc_contact = 0xf911c994,
 	mtpc_importedContact = 0xd0028438,
 	mtpc_contactBlocked = 0x561bc879,
-	mtpc_contactFound = 0xea879f95,
 	mtpc_contactSuggested = 0x3de191a1,
 	mtpc_contactStatus = 0xaa77b873,
 	mtpc_chatLocated = 0x3631cf4c,
@@ -193,7 +192,6 @@ enum {
 	mtpc_contacts_importedContacts = 0xad524315,
 	mtpc_contacts_blocked = 0x1c138d15,
 	mtpc_contacts_blockedSlice = 0x900802a1,
-	mtpc_contacts_found = 0x566000e,
 	mtpc_contacts_suggested = 0x5649dcc5,
 	mtpc_messages_dialogs = 0x15ba6c40,
 	mtpc_messages_dialogsSlice = 0x71e094f3,
@@ -219,11 +217,11 @@ enum {
 	mtpc_updateReadMessages = 0xc6649e31,
 	mtpc_updateDeleteMessages = 0xa92bfe26,
 	mtpc_updateRestoreMessages = 0xd15de04d,
-	mtpc_updateUserTyping = 0x6baa8508,
-	mtpc_updateChatUserTyping = 0x3c46cfe6,
+	mtpc_updateUserTyping = 0x5c486927,
+	mtpc_updateChatUserTyping = 0x9a65ea1f,
 	mtpc_updateChatParticipants = 0x7761198,
 	mtpc_updateUserStatus = 0x1bfbd823,
-	mtpc_updateUserName = 0xda22d9ad,
+	mtpc_updateUserName = 0xa7332b73,
 	mtpc_updateUserPhoto = 0x95313b0c,
 	mtpc_updateContactRegistered = 0x2575bbb9,
 	mtpc_updateContactLink = 0x51a48a9a,
@@ -284,15 +282,6 @@ enum {
 	mtpc_inputEncryptedFileLocation = 0xf5235d55,
 	mtpc_encryptedMessage = 0xed18c118,
 	mtpc_encryptedMessageService = 0x23734b06,
-	mtpc_decryptedMessageLayer = 0x99a438cf,
-	mtpc_decryptedMessage = 0x1f814f1f,
-	mtpc_decryptedMessageService = 0xaa48327d,
-	mtpc_decryptedMessageMediaEmpty = 0x89f5c4a,
-	mtpc_decryptedMessageMediaPhoto = 0x32798a8c,
-	mtpc_decryptedMessageMediaVideo = 0x524a415d,
-	mtpc_decryptedMessageMediaGeoPoint = 0x35480a59,
-	mtpc_decryptedMessageMediaContact = 0x588a0a97,
-	mtpc_decryptedMessageActionSetMessageTTL = 0xa1733aec,
 	mtpc_messages_dhConfigNotModified = 0xc0e24635,
 	mtpc_messages_dhConfig = 0x2c221edd,
 	mtpc_messages_sentEncryptedMessage = 0x560f8935,
@@ -315,24 +304,31 @@ enum {
 	mtpc_inputDocument = 0x18798952,
 	mtpc_inputAudioFileLocation = 0x74dc404d,
 	mtpc_inputDocumentFileLocation = 0x4e45abe9,
-	mtpc_decryptedMessageMediaDocument = 0xb095434b,
-	mtpc_decryptedMessageMediaAudio = 0x57e0a9cb,
 	mtpc_audioEmpty = 0x586988d8,
 	mtpc_audio = 0xc7ac6496,
 	mtpc_documentEmpty = 0x36f8c871,
 	mtpc_document = 0x9efc6326,
 	mtpc_help_support = 0x17c6b5f6,
-	mtpc_decryptedMessageActionReadMessages = 0xc4f40be,
-	mtpc_decryptedMessageActionDeleteMessages = 0x65614304,
-	mtpc_decryptedMessageActionScreenshotMessages = 0x8ac1f475,
-	mtpc_decryptedMessageActionFlushHistory = 0x6719e45c,
-	mtpc_decryptedMessageActionNotifyLayer = 0xf3048883,
 	mtpc_notifyPeer = 0x9fd40bd8,
 	mtpc_notifyUsers = 0xb4c83b4c,
 	mtpc_notifyChats = 0xc007cec3,
 	mtpc_notifyAll = 0x74d07c60,
 	mtpc_updateUserBlocked = 0x80ece81a,
 	mtpc_updateNotifySettings = 0xbec268ef,
+	mtpc_auth_sentAppCode = 0xe325edcf,
+	mtpc_sendMessageTypingAction = 0x16bf744e,
+	mtpc_sendMessageCancelAction = 0xfd5ec8f5,
+	mtpc_sendMessageRecordVideoAction = 0xa187d66f,
+	mtpc_sendMessageUploadVideoAction = 0x92042ff7,
+	mtpc_sendMessageRecordAudioAction = 0xd52f73f7,
+	mtpc_sendMessageUploadAudioAction = 0xe6ac8a6f,
+	mtpc_sendMessageUploadPhotoAction = 0x990a3c1a,
+	mtpc_sendMessageUploadDocumentAction = 0x8faee98e,
+	mtpc_sendMessageGeoLocationAction = 0x176f8ba1,
+	mtpc_sendMessageChooseContactAction = 0x628cbc6f,
+	mtpc_contactFound = 0xea879f95,
+	mtpc_contacts_found = 0x566000e,
+	mtpc_updateServiceNotification = 0x382dd3e4,
 	mtpc_invokeAfterMsg = 0xcb9f372d,
 	mtpc_invokeAfterMsgs = 0x3dc4b4f0,
 	mtpc_auth_checkPhone = 0x6fe51dfb,
@@ -345,6 +341,7 @@ enum {
 	mtpc_auth_sendInvites = 0x771c1d97,
 	mtpc_auth_exportAuthorization = 0xe5bfffcd,
 	mtpc_auth_importAuthorization = 0xe3ef9613,
+	mtpc_auth_bindTempAuthKey = 0xcdd42a05,
 	mtpc_account_registerDevice = 0x446c712c,
 	mtpc_account_unregisterDevice = 0x65c55b40,
 	mtpc_account_updateNotifySettings = 0x84be5b93,
@@ -358,23 +355,24 @@ enum {
 	mtpc_contacts_getStatuses = 0xc4a353ee,
 	mtpc_contacts_getContacts = 0x22c6aa08,
 	mtpc_contacts_importContacts = 0xda30b32d,
-	mtpc_contacts_search = 0x11f812d8,
 	mtpc_contacts_getSuggested = 0xcd773428,
 	mtpc_contacts_deleteContact = 0x8e953744,
 	mtpc_contacts_deleteContacts = 0x59ab389e,
 	mtpc_contacts_block = 0x332b49fc,
 	mtpc_contacts_unblock = 0xe54100bd,
 	mtpc_contacts_getBlocked = 0xf57c350f,
+	mtpc_contacts_exportCard = 0x84e53737,
+	mtpc_contacts_importCard = 0x4fe196fe,
 	mtpc_messages_getMessages = 0x4222fa74,
 	mtpc_messages_getDialogs = 0xeccf1df6,
 	mtpc_messages_getHistory = 0x92a1df2f,
 	mtpc_messages_search = 0x7e9f2ab,
-	mtpc_messages_readHistory = 0xb04f2510,
+	mtpc_messages_readHistory = 0xeed884c6,
 	mtpc_messages_deleteHistory = 0xf4f8fb61,
 	mtpc_messages_deleteMessages = 0x14f2dd0a,
 	mtpc_messages_restoreMessages = 0x395f9d7e,
 	mtpc_messages_receivedMessages = 0x28abcb68,
-	mtpc_messages_setTyping = 0x719839e9,
+	mtpc_messages_setTyping = 0xa3825e50,
 	mtpc_messages_sendMessage = 0x4cde0aab,
 	mtpc_messages_sendMedia = 0xa3c85d76,
 	mtpc_messages_forwardMessages = 0x514cd10f,
@@ -423,7 +421,12 @@ enum {
 	mtpc_messages_receivedQueue = 0x55a5bb66,
 	mtpc_upload_saveBigFilePart = 0xde7b673d,
 	mtpc_initConnection = 0x69796de9,
-	mtpc_help_getSupport = 0x9cdf08cd
+	mtpc_help_getSupport = 0x9cdf08cd,
+	mtpc_auth_sendSms = 0xda9f3e8,
+	mtpc_messages_readMessageContents = 0x354b5bc2,
+	mtpc_account_checkUsername = 0x2714d86c,
+	mtpc_account_updateUsername = 0x3e0bdd7c,
+	mtpc_contacts_search = 0x11f812d8
 };
 
 // Type forward declarations
@@ -643,6 +646,7 @@ class MTPDauth_checkedPhone;
 
 class MTPauth_sentCode;
 class MTPDauth_sentCode;
+class MTPDauth_sentAppCode;
 
 class MTPauth_authorization;
 class MTPDauth_authorization;
@@ -680,9 +684,6 @@ class MTPDimportedContact;
 class MTPcontactBlocked;
 class MTPDcontactBlocked;
 
-class MTPcontactFound;
-class MTPDcontactFound;
-
 class MTPcontactSuggested;
 class MTPDcontactSuggested;
 
@@ -711,9 +712,6 @@ class MTPcontacts_blocked;
 class MTPDcontacts_blocked;
 class MTPDcontacts_blockedSlice;
 
-class MTPcontacts_found;
-class MTPDcontacts_found;
-
 class MTPcontacts_suggested;
 class MTPDcontacts_suggested;
 
@@ -780,6 +778,7 @@ class MTPDupdateChatParticipantDelete;
 class MTPDupdateDcOptions;
 class MTPDupdateUserBlocked;
 class MTPDupdateNotifySettings;
+class MTPDupdateServiceNotification;
 
 class MTPupdates_state;
 class MTPDupdates_state;
@@ -861,28 +860,6 @@ class MTPencryptedMessage;
 class MTPDencryptedMessage;
 class MTPDencryptedMessageService;
 
-class MTPdecryptedMessageLayer;
-class MTPDdecryptedMessageLayer;
-
-class MTPdecryptedMessage;
-class MTPDdecryptedMessage;
-class MTPDdecryptedMessageService;
-
-class MTPdecryptedMessageMedia;
-class MTPDdecryptedMessageMediaPhoto;
-class MTPDdecryptedMessageMediaVideo;
-class MTPDdecryptedMessageMediaGeoPoint;
-class MTPDdecryptedMessageMediaContact;
-class MTPDdecryptedMessageMediaDocument;
-class MTPDdecryptedMessageMediaAudio;
-
-class MTPdecryptedMessageAction;
-class MTPDdecryptedMessageActionSetMessageTTL;
-class MTPDdecryptedMessageActionReadMessages;
-class MTPDdecryptedMessageActionDeleteMessages;
-class MTPDdecryptedMessageActionScreenshotMessages;
-class MTPDdecryptedMessageActionNotifyLayer;
-
 class MTPmessages_dhConfig;
 class MTPDmessages_dhConfigNotModified;
 class MTPDmessages_dhConfig;
@@ -911,6 +888,14 @@ class MTPDhelp_support;
 class MTPnotifyPeer;
 class MTPDnotifyPeer;
 
+class MTPsendMessageAction;
+
+class MTPcontactFound;
+class MTPDcontactFound;
+
+class MTPcontacts_found;
+class MTPDcontacts_found;
+
 
 // Boxed types definitions
 typedef MTPBoxed<MTPresPQ> MTPResPQ;
@@ -979,7 +964,6 @@ typedef MTPBoxed<MTPuserFull> MTPUserFull;
 typedef MTPBoxed<MTPcontact> MTPContact;
 typedef MTPBoxed<MTPimportedContact> MTPImportedContact;
 typedef MTPBoxed<MTPcontactBlocked> MTPContactBlocked;
-typedef MTPBoxed<MTPcontactFound> MTPContactFound;
 typedef MTPBoxed<MTPcontactSuggested> MTPContactSuggested;
 typedef MTPBoxed<MTPcontactStatus> MTPContactStatus;
 typedef MTPBoxed<MTPchatLocated> MTPChatLocated;
@@ -989,7 +973,6 @@ typedef MTPBoxed<MTPcontacts_link> MTPcontacts_Link;
 typedef MTPBoxed<MTPcontacts_contacts> MTPcontacts_Contacts;
 typedef MTPBoxed<MTPcontacts_importedContacts> MTPcontacts_ImportedContacts;
 typedef MTPBoxed<MTPcontacts_blocked> MTPcontacts_Blocked;
-typedef MTPBoxed<MTPcontacts_found> MTPcontacts_Found;
 typedef MTPBoxed<MTPcontacts_suggested> MTPcontacts_Suggested;
 typedef MTPBoxed<MTPmessages_dialogs> MTPmessages_Dialogs;
 typedef MTPBoxed<MTPmessages_messages> MTPmessages_Messages;
@@ -1024,10 +1007,6 @@ typedef MTPBoxed<MTPinputEncryptedChat> MTPInputEncryptedChat;
 typedef MTPBoxed<MTPencryptedFile> MTPEncryptedFile;
 typedef MTPBoxed<MTPinputEncryptedFile> MTPInputEncryptedFile;
 typedef MTPBoxed<MTPencryptedMessage> MTPEncryptedMessage;
-typedef MTPBoxed<MTPdecryptedMessageLayer> MTPDecryptedMessageLayer;
-typedef MTPBoxed<MTPdecryptedMessage> MTPDecryptedMessage;
-typedef MTPBoxed<MTPdecryptedMessageMedia> MTPDecryptedMessageMedia;
-typedef MTPBoxed<MTPdecryptedMessageAction> MTPDecryptedMessageAction;
 typedef MTPBoxed<MTPmessages_dhConfig> MTPmessages_DhConfig;
 typedef MTPBoxed<MTPmessages_sentEncryptedMessage> MTPmessages_SentEncryptedMessage;
 typedef MTPBoxed<MTPinputAudio> MTPInputAudio;
@@ -1036,6 +1015,9 @@ typedef MTPBoxed<MTPaudio> MTPAudio;
 typedef MTPBoxed<MTPdocument> MTPDocument;
 typedef MTPBoxed<MTPhelp_support> MTPhelp_Support;
 typedef MTPBoxed<MTPnotifyPeer> MTPNotifyPeer;
+typedef MTPBoxed<MTPsendMessageAction> MTPSendMessageAction;
+typedef MTPBoxed<MTPcontactFound> MTPContactFound;
+typedef MTPBoxed<MTPcontacts_found> MTPcontacts_Found;
 
 // Type classes definitions
 
@@ -2766,11 +2748,11 @@ private:
 	explicit MTPuser(MTPDuserDeleted *_data);
 
 	friend MTPuser MTP_userEmpty(MTPint _id);
-	friend MTPuser MTP_userSelf(MTPint _id, const MTPstring &_first_name, const MTPstring &_last_name, const MTPstring &_phone, const MTPUserProfilePhoto &_photo, const MTPUserStatus &_status, MTPBool _inactive);
-	friend MTPuser MTP_userContact(MTPint _id, const MTPstring &_first_name, const MTPstring &_last_name, const MTPlong &_access_hash, const MTPstring &_phone, const MTPUserProfilePhoto &_photo, const MTPUserStatus &_status);
-	friend MTPuser MTP_userRequest(MTPint _id, const MTPstring &_first_name, const MTPstring &_last_name, const MTPlong &_access_hash, const MTPstring &_phone, const MTPUserProfilePhoto &_photo, const MTPUserStatus &_status);
-	friend MTPuser MTP_userForeign(MTPint _id, const MTPstring &_first_name, const MTPstring &_last_name, const MTPlong &_access_hash, const MTPUserProfilePhoto &_photo, const MTPUserStatus &_status);
-	friend MTPuser MTP_userDeleted(MTPint _id, const MTPstring &_first_name, const MTPstring &_last_name);
+	friend MTPuser MTP_userSelf(MTPint _id, const MTPstring &_first_name, const MTPstring &_last_name, const MTPstring &_username, const MTPstring &_phone, const MTPUserProfilePhoto &_photo, const MTPUserStatus &_status, MTPBool _inactive);
+	friend MTPuser MTP_userContact(MTPint _id, const MTPstring &_first_name, const MTPstring &_last_name, const MTPstring &_username, const MTPlong &_access_hash, const MTPstring &_phone, const MTPUserProfilePhoto &_photo, const MTPUserStatus &_status);
+	friend MTPuser MTP_userRequest(MTPint _id, const MTPstring &_first_name, const MTPstring &_last_name, const MTPstring &_username, const MTPlong &_access_hash, const MTPstring &_phone, const MTPUserProfilePhoto &_photo, const MTPUserStatus &_status);
+	friend MTPuser MTP_userForeign(MTPint _id, const MTPstring &_first_name, const MTPstring &_last_name, const MTPstring &_username, const MTPlong &_access_hash, const MTPUserProfilePhoto &_photo, const MTPUserStatus &_status);
+	friend MTPuser MTP_userDeleted(MTPint _id, const MTPstring &_first_name, const MTPstring &_last_name, const MTPstring &_username);
 
 	mtpTypeId _type;
 };
@@ -3167,9 +3149,9 @@ private:
 	explicit MTPmessage(MTPDmessageService *_data);
 
 	friend MTPmessage MTP_messageEmpty(MTPint _id);
-	friend MTPmessage MTP_message(MTPint _id, MTPint _from_id, const MTPPeer &_to_id, MTPBool _out, MTPBool _unread, MTPint _date, const MTPstring &_message, const MTPMessageMedia &_media);
-	friend MTPmessage MTP_messageForwarded(MTPint _id, MTPint _fwd_from_id, MTPint _fwd_date, MTPint _from_id, const MTPPeer &_to_id, MTPBool _out, MTPBool _unread, MTPint _date, const MTPstring &_message, const MTPMessageMedia &_media);
-	friend MTPmessage MTP_messageService(MTPint _id, MTPint _from_id, const MTPPeer &_to_id, MTPBool _out, MTPBool _unread, MTPint _date, const MTPMessageAction &_action);
+	friend MTPmessage MTP_message(MTPint _flags, MTPint _id, MTPint _from_id, const MTPPeer &_to_id, MTPint _date, const MTPstring &_message, const MTPMessageMedia &_media);
+	friend MTPmessage MTP_messageForwarded(MTPint _flags, MTPint _id, MTPint _fwd_from_id, MTPint _fwd_date, MTPint _from_id, const MTPPeer &_to_id, MTPint _date, const MTPstring &_message, const MTPMessageMedia &_media);
+	friend MTPmessage MTP_messageService(MTPint _flags, MTPint _id, MTPint _from_id, const MTPPeer &_to_id, MTPint _date, const MTPMessageAction &_action);
 
 	mtpTypeId _type;
 };
@@ -3676,32 +3658,52 @@ typedef MTPBoxed<MTPauth_checkedPhone> MTPauth_CheckedPhone;
 
 class MTPauth_sentCode : private mtpDataOwner {
 public:
-	MTPauth_sentCode();
-	MTPauth_sentCode(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_auth_sentCode) : mtpDataOwner(0) {
+	MTPauth_sentCode() : mtpDataOwner(0), _type(0) {
+	}
+	MTPauth_sentCode(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons) : mtpDataOwner(0), _type(0) {
 		read(from, end, cons);
 	}
 
 	MTPDauth_sentCode &_auth_sentCode() {
 		if (!data) throw mtpErrorUninitialized();
+		if (_type != mtpc_auth_sentCode) throw mtpErrorWrongTypeId(_type, mtpc_auth_sentCode);
 		split();
 		return *(MTPDauth_sentCode*)data;
 	}
 	const MTPDauth_sentCode &c_auth_sentCode() const {
 		if (!data) throw mtpErrorUninitialized();
+		if (_type != mtpc_auth_sentCode) throw mtpErrorWrongTypeId(_type, mtpc_auth_sentCode);
 		return *(const MTPDauth_sentCode*)data;
 	}
 
+	MTPDauth_sentAppCode &_auth_sentAppCode() {
+		if (!data) throw mtpErrorUninitialized();
+		if (_type != mtpc_auth_sentAppCode) throw mtpErrorWrongTypeId(_type, mtpc_auth_sentAppCode);
+		split();
+		return *(MTPDauth_sentAppCode*)data;
+	}
+	const MTPDauth_sentAppCode &c_auth_sentAppCode() const {
+		if (!data) throw mtpErrorUninitialized();
+		if (_type != mtpc_auth_sentAppCode) throw mtpErrorWrongTypeId(_type, mtpc_auth_sentAppCode);
+		return *(const MTPDauth_sentAppCode*)data;
+	}
+
 	uint32 size() const;
 	mtpTypeId type() const;
-	void read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_auth_sentCode);
+	void read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons);
 	void write(mtpBuffer &to) const;
 
 	typedef void ResponseType;
 
 private:
+	explicit MTPauth_sentCode(mtpTypeId type);
 	explicit MTPauth_sentCode(MTPDauth_sentCode *_data);
+	explicit MTPauth_sentCode(MTPDauth_sentAppCode *_data);
 
 	friend MTPauth_sentCode MTP_auth_sentCode(MTPBool _phone_registered, const MTPstring &_phone_code_hash, MTPint _send_call_timeout, MTPBool _is_password);
+	friend MTPauth_sentCode MTP_auth_sentAppCode(MTPBool _phone_registered, const MTPstring &_phone_code_hash, MTPint _send_call_timeout, MTPBool _is_password);
+
+	mtpTypeId _type;
 };
 typedef MTPBoxed<MTPauth_sentCode> MTPauth_SentCode;
 
@@ -4115,37 +4117,6 @@ private:
 };
 typedef MTPBoxed<MTPcontactBlocked> MTPContactBlocked;
 
-class MTPcontactFound : private mtpDataOwner {
-public:
-	MTPcontactFound();
-	MTPcontactFound(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_contactFound) : mtpDataOwner(0) {
-		read(from, end, cons);
-	}
-
-	MTPDcontactFound &_contactFound() {
-		if (!data) throw mtpErrorUninitialized();
-		split();
-		return *(MTPDcontactFound*)data;
-	}
-	const MTPDcontactFound &c_contactFound() const {
-		if (!data) throw mtpErrorUninitialized();
-		return *(const MTPDcontactFound*)data;
-	}
-
-	uint32 size() const;
-	mtpTypeId type() const;
-	void read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_contactFound);
-	void write(mtpBuffer &to) const;
-
-	typedef void ResponseType;
-
-private:
-	explicit MTPcontactFound(MTPDcontactFound *_data);
-
-	friend MTPcontactFound MTP_contactFound(MTPint _user_id);
-};
-typedef MTPBoxed<MTPcontactFound> MTPContactFound;
-
 class MTPcontactSuggested : private mtpDataOwner {
 public:
 	MTPcontactSuggested();
@@ -4468,37 +4439,6 @@ private:
 };
 typedef MTPBoxed<MTPcontacts_blocked> MTPcontacts_Blocked;
 
-class MTPcontacts_found : private mtpDataOwner {
-public:
-	MTPcontacts_found();
-	MTPcontacts_found(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_contacts_found) : mtpDataOwner(0) {
-		read(from, end, cons);
-	}
-
-	MTPDcontacts_found &_contacts_found() {
-		if (!data) throw mtpErrorUninitialized();
-		split();
-		return *(MTPDcontacts_found*)data;
-	}
-	const MTPDcontacts_found &c_contacts_found() const {
-		if (!data) throw mtpErrorUninitialized();
-		return *(const MTPDcontacts_found*)data;
-	}
-
-	uint32 size() const;
-	mtpTypeId type() const;
-	void read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_contacts_found);
-	void write(mtpBuffer &to) const;
-
-	typedef void ResponseType;
-
-private:
-	explicit MTPcontacts_found(MTPDcontacts_found *_data);
-
-	friend MTPcontacts_found MTP_contacts_found(const MTPVector<MTPContactFound> &_results, const MTPVector<MTPUser> &_users);
-};
-typedef MTPBoxed<MTPcontacts_found> MTPcontacts_Found;
-
 class MTPcontacts_suggested : private mtpDataOwner {
 public:
 	MTPcontacts_suggested();
@@ -5284,6 +5224,18 @@ public:
 		return *(const MTPDupdateNotifySettings*)data;
 	}
 
+	MTPDupdateServiceNotification &_updateServiceNotification() {
+		if (!data) throw mtpErrorUninitialized();
+		if (_type != mtpc_updateServiceNotification) throw mtpErrorWrongTypeId(_type, mtpc_updateServiceNotification);
+		split();
+		return *(MTPDupdateServiceNotification*)data;
+	}
+	const MTPDupdateServiceNotification &c_updateServiceNotification() const {
+		if (!data) throw mtpErrorUninitialized();
+		if (_type != mtpc_updateServiceNotification) throw mtpErrorWrongTypeId(_type, mtpc_updateServiceNotification);
+		return *(const MTPDupdateServiceNotification*)data;
+	}
+
 	uint32 size() const;
 	mtpTypeId type() const;
 	void read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons);
@@ -5318,17 +5270,18 @@ private:
 	explicit MTPupdate(MTPDupdateDcOptions *_data);
 	explicit MTPupdate(MTPDupdateUserBlocked *_data);
 	explicit MTPupdate(MTPDupdateNotifySettings *_data);
+	explicit MTPupdate(MTPDupdateServiceNotification *_data);
 
 	friend MTPupdate MTP_updateNewMessage(const MTPMessage &_message, MTPint _pts);
 	friend MTPupdate MTP_updateMessageID(MTPint _id, const MTPlong &_random_id);
 	friend MTPupdate MTP_updateReadMessages(const MTPVector<MTPint> &_messages, MTPint _pts);
 	friend MTPupdate MTP_updateDeleteMessages(const MTPVector<MTPint> &_messages, MTPint _pts);
 	friend MTPupdate MTP_updateRestoreMessages(const MTPVector<MTPint> &_messages, MTPint _pts);
-	friend MTPupdate MTP_updateUserTyping(MTPint _user_id);
-	friend MTPupdate MTP_updateChatUserTyping(MTPint _chat_id, MTPint _user_id);
+	friend MTPupdate MTP_updateUserTyping(MTPint _user_id, const MTPSendMessageAction &_action);
+	friend MTPupdate MTP_updateChatUserTyping(MTPint _chat_id, MTPint _user_id, const MTPSendMessageAction &_action);
 	friend MTPupdate MTP_updateChatParticipants(const MTPChatParticipants &_participants);
 	friend MTPupdate MTP_updateUserStatus(MTPint _user_id, const MTPUserStatus &_status);
-	friend MTPupdate MTP_updateUserName(MTPint _user_id, const MTPstring &_first_name, const MTPstring &_last_name);
+	friend MTPupdate MTP_updateUserName(MTPint _user_id, const MTPstring &_first_name, const MTPstring &_last_name, const MTPstring &_username);
 	friend MTPupdate MTP_updateUserPhoto(MTPint _user_id, MTPint _date, const MTPUserProfilePhoto &_photo, MTPBool _previous);
 	friend MTPupdate MTP_updateContactRegistered(MTPint _user_id, MTPint _date);
 	friend MTPupdate MTP_updateContactLink(MTPint _user_id, const MTPcontacts_MyLink &_my_link, const MTPcontacts_ForeignLink &_foreign_link);
@@ -5344,6 +5297,7 @@ private:
 	friend MTPupdate MTP_updateDcOptions(const MTPVector<MTPDcOption> &_dc_options);
 	friend MTPupdate MTP_updateUserBlocked(MTPint _user_id, MTPBool _blocked);
 	friend MTPupdate MTP_updateNotifySettings(const MTPNotifyPeer &_peer, const MTPPeerNotifySettings &_notify_settings);
+	friend MTPupdate MTP_updateServiceNotification(const MTPstring &_type, const MTPstring &_message, const MTPMessageMedia &_media, MTPBool _popup);
 
 	mtpTypeId _type;
 };
@@ -6302,290 +6256,6 @@ private:
 };
 typedef MTPBoxed<MTPencryptedMessage> MTPEncryptedMessage;
 
-class MTPdecryptedMessageLayer : private mtpDataOwner {
-public:
-	MTPdecryptedMessageLayer();
-	MTPdecryptedMessageLayer(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_decryptedMessageLayer) : mtpDataOwner(0) {
-		read(from, end, cons);
-	}
-
-	MTPDdecryptedMessageLayer &_decryptedMessageLayer() {
-		if (!data) throw mtpErrorUninitialized();
-		split();
-		return *(MTPDdecryptedMessageLayer*)data;
-	}
-	const MTPDdecryptedMessageLayer &c_decryptedMessageLayer() const {
-		if (!data) throw mtpErrorUninitialized();
-		return *(const MTPDdecryptedMessageLayer*)data;
-	}
-
-	uint32 size() const;
-	mtpTypeId type() const;
-	void read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_decryptedMessageLayer);
-	void write(mtpBuffer &to) const;
-
-	typedef void ResponseType;
-
-private:
-	explicit MTPdecryptedMessageLayer(MTPDdecryptedMessageLayer *_data);
-
-	friend MTPdecryptedMessageLayer MTP_decryptedMessageLayer(MTPint _layer, const MTPDecryptedMessage &_message);
-};
-typedef MTPBoxed<MTPdecryptedMessageLayer> MTPDecryptedMessageLayer;
-
-class MTPdecryptedMessage : private mtpDataOwner {
-public:
-	MTPdecryptedMessage() : mtpDataOwner(0), _type(0) {
-	}
-	MTPdecryptedMessage(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons) : mtpDataOwner(0), _type(0) {
-		read(from, end, cons);
-	}
-
-	MTPDdecryptedMessage &_decryptedMessage() {
-		if (!data) throw mtpErrorUninitialized();
-		if (_type != mtpc_decryptedMessage) throw mtpErrorWrongTypeId(_type, mtpc_decryptedMessage);
-		split();
-		return *(MTPDdecryptedMessage*)data;
-	}
-	const MTPDdecryptedMessage &c_decryptedMessage() const {
-		if (!data) throw mtpErrorUninitialized();
-		if (_type != mtpc_decryptedMessage) throw mtpErrorWrongTypeId(_type, mtpc_decryptedMessage);
-		return *(const MTPDdecryptedMessage*)data;
-	}
-
-	MTPDdecryptedMessageService &_decryptedMessageService() {
-		if (!data) throw mtpErrorUninitialized();
-		if (_type != mtpc_decryptedMessageService) throw mtpErrorWrongTypeId(_type, mtpc_decryptedMessageService);
-		split();
-		return *(MTPDdecryptedMessageService*)data;
-	}
-	const MTPDdecryptedMessageService &c_decryptedMessageService() const {
-		if (!data) throw mtpErrorUninitialized();
-		if (_type != mtpc_decryptedMessageService) throw mtpErrorWrongTypeId(_type, mtpc_decryptedMessageService);
-		return *(const MTPDdecryptedMessageService*)data;
-	}
-
-	uint32 size() const;
-	mtpTypeId type() const;
-	void read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons);
-	void write(mtpBuffer &to) const;
-
-	typedef void ResponseType;
-
-private:
-	explicit MTPdecryptedMessage(mtpTypeId type);
-	explicit MTPdecryptedMessage(MTPDdecryptedMessage *_data);
-	explicit MTPdecryptedMessage(MTPDdecryptedMessageService *_data);
-
-	friend MTPdecryptedMessage MTP_decryptedMessage(const MTPlong &_random_id, const MTPbytes &_random_bytes, const MTPstring &_message, const MTPDecryptedMessageMedia &_media);
-	friend MTPdecryptedMessage MTP_decryptedMessageService(const MTPlong &_random_id, const MTPbytes &_random_bytes, const MTPDecryptedMessageAction &_action);
-
-	mtpTypeId _type;
-};
-typedef MTPBoxed<MTPdecryptedMessage> MTPDecryptedMessage;
-
-class MTPdecryptedMessageMedia : private mtpDataOwner {
-public:
-	MTPdecryptedMessageMedia() : mtpDataOwner(0), _type(0) {
-	}
-	MTPdecryptedMessageMedia(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons) : mtpDataOwner(0), _type(0) {
-		read(from, end, cons);
-	}
-
-	MTPDdecryptedMessageMediaPhoto &_decryptedMessageMediaPhoto() {
-		if (!data) throw mtpErrorUninitialized();
-		if (_type != mtpc_decryptedMessageMediaPhoto) throw mtpErrorWrongTypeId(_type, mtpc_decryptedMessageMediaPhoto);
-		split();
-		return *(MTPDdecryptedMessageMediaPhoto*)data;
-	}
-	const MTPDdecryptedMessageMediaPhoto &c_decryptedMessageMediaPhoto() const {
-		if (!data) throw mtpErrorUninitialized();
-		if (_type != mtpc_decryptedMessageMediaPhoto) throw mtpErrorWrongTypeId(_type, mtpc_decryptedMessageMediaPhoto);
-		return *(const MTPDdecryptedMessageMediaPhoto*)data;
-	}
-
-	MTPDdecryptedMessageMediaVideo &_decryptedMessageMediaVideo() {
-		if (!data) throw mtpErrorUninitialized();
-		if (_type != mtpc_decryptedMessageMediaVideo) throw mtpErrorWrongTypeId(_type, mtpc_decryptedMessageMediaVideo);
-		split();
-		return *(MTPDdecryptedMessageMediaVideo*)data;
-	}
-	const MTPDdecryptedMessageMediaVideo &c_decryptedMessageMediaVideo() const {
-		if (!data) throw mtpErrorUninitialized();
-		if (_type != mtpc_decryptedMessageMediaVideo) throw mtpErrorWrongTypeId(_type, mtpc_decryptedMessageMediaVideo);
-		return *(const MTPDdecryptedMessageMediaVideo*)data;
-	}
-
-	MTPDdecryptedMessageMediaGeoPoint &_decryptedMessageMediaGeoPoint() {
-		if (!data) throw mtpErrorUninitialized();
-		if (_type != mtpc_decryptedMessageMediaGeoPoint) throw mtpErrorWrongTypeId(_type, mtpc_decryptedMessageMediaGeoPoint);
-		split();
-		return *(MTPDdecryptedMessageMediaGeoPoint*)data;
-	}
-	const MTPDdecryptedMessageMediaGeoPoint &c_decryptedMessageMediaGeoPoint() const {
-		if (!data) throw mtpErrorUninitialized();
-		if (_type != mtpc_decryptedMessageMediaGeoPoint) throw mtpErrorWrongTypeId(_type, mtpc_decryptedMessageMediaGeoPoint);
-		return *(const MTPDdecryptedMessageMediaGeoPoint*)data;
-	}
-
-	MTPDdecryptedMessageMediaContact &_decryptedMessageMediaContact() {
-		if (!data) throw mtpErrorUninitialized();
-		if (_type != mtpc_decryptedMessageMediaContact) throw mtpErrorWrongTypeId(_type, mtpc_decryptedMessageMediaContact);
-		split();
-		return *(MTPDdecryptedMessageMediaContact*)data;
-	}
-	const MTPDdecryptedMessageMediaContact &c_decryptedMessageMediaContact() const {
-		if (!data) throw mtpErrorUninitialized();
-		if (_type != mtpc_decryptedMessageMediaContact) throw mtpErrorWrongTypeId(_type, mtpc_decryptedMessageMediaContact);
-		return *(const MTPDdecryptedMessageMediaContact*)data;
-	}
-
-	MTPDdecryptedMessageMediaDocument &_decryptedMessageMediaDocument() {
-		if (!data) throw mtpErrorUninitialized();
-		if (_type != mtpc_decryptedMessageMediaDocument) throw mtpErrorWrongTypeId(_type, mtpc_decryptedMessageMediaDocument);
-		split();
-		return *(MTPDdecryptedMessageMediaDocument*)data;
-	}
-	const MTPDdecryptedMessageMediaDocument &c_decryptedMessageMediaDocument() const {
-		if (!data) throw mtpErrorUninitialized();
-		if (_type != mtpc_decryptedMessageMediaDocument) throw mtpErrorWrongTypeId(_type, mtpc_decryptedMessageMediaDocument);
-		return *(const MTPDdecryptedMessageMediaDocument*)data;
-	}
-
-	MTPDdecryptedMessageMediaAudio &_decryptedMessageMediaAudio() {
-		if (!data) throw mtpErrorUninitialized();
-		if (_type != mtpc_decryptedMessageMediaAudio) throw mtpErrorWrongTypeId(_type, mtpc_decryptedMessageMediaAudio);
-		split();
-		return *(MTPDdecryptedMessageMediaAudio*)data;
-	}
-	const MTPDdecryptedMessageMediaAudio &c_decryptedMessageMediaAudio() const {
-		if (!data) throw mtpErrorUninitialized();
-		if (_type != mtpc_decryptedMessageMediaAudio) throw mtpErrorWrongTypeId(_type, mtpc_decryptedMessageMediaAudio);
-		return *(const MTPDdecryptedMessageMediaAudio*)data;
-	}
-
-	uint32 size() const;
-	mtpTypeId type() const;
-	void read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons);
-	void write(mtpBuffer &to) const;
-
-	typedef void ResponseType;
-
-private:
-	explicit MTPdecryptedMessageMedia(mtpTypeId type);
-	explicit MTPdecryptedMessageMedia(MTPDdecryptedMessageMediaPhoto *_data);
-	explicit MTPdecryptedMessageMedia(MTPDdecryptedMessageMediaVideo *_data);
-	explicit MTPdecryptedMessageMedia(MTPDdecryptedMessageMediaGeoPoint *_data);
-	explicit MTPdecryptedMessageMedia(MTPDdecryptedMessageMediaContact *_data);
-	explicit MTPdecryptedMessageMedia(MTPDdecryptedMessageMediaDocument *_data);
-	explicit MTPdecryptedMessageMedia(MTPDdecryptedMessageMediaAudio *_data);
-
-	friend MTPdecryptedMessageMedia MTP_decryptedMessageMediaEmpty();
-	friend MTPdecryptedMessageMedia MTP_decryptedMessageMediaPhoto(const MTPbytes &_thumb, MTPint _thumb_w, MTPint _thumb_h, MTPint _w, MTPint _h, MTPint _size, const MTPbytes &_key, const MTPbytes &_iv);
-	friend MTPdecryptedMessageMedia MTP_decryptedMessageMediaVideo(const MTPbytes &_thumb, MTPint _thumb_w, MTPint _thumb_h, MTPint _duration, const MTPstring &_mime_type, MTPint _w, MTPint _h, MTPint _size, const MTPbytes &_key, const MTPbytes &_iv);
-	friend MTPdecryptedMessageMedia MTP_decryptedMessageMediaGeoPoint(const MTPdouble &_lat, const MTPdouble &_long);
-	friend MTPdecryptedMessageMedia MTP_decryptedMessageMediaContact(const MTPstring &_phone_number, const MTPstring &_first_name, const MTPstring &_last_name, MTPint _user_id);
-	friend MTPdecryptedMessageMedia MTP_decryptedMessageMediaDocument(const MTPbytes &_thumb, MTPint _thumb_w, MTPint _thumb_h, const MTPstring &_file_name, const MTPstring &_mime_type, MTPint _size, const MTPbytes &_key, const MTPbytes &_iv);
-	friend MTPdecryptedMessageMedia MTP_decryptedMessageMediaAudio(MTPint _duration, const MTPstring &_mime_type, MTPint _size, const MTPbytes &_key, const MTPbytes &_iv);
-
-	mtpTypeId _type;
-};
-typedef MTPBoxed<MTPdecryptedMessageMedia> MTPDecryptedMessageMedia;
-
-class MTPdecryptedMessageAction : private mtpDataOwner {
-public:
-	MTPdecryptedMessageAction() : mtpDataOwner(0), _type(0) {
-	}
-	MTPdecryptedMessageAction(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons) : mtpDataOwner(0), _type(0) {
-		read(from, end, cons);
-	}
-
-	MTPDdecryptedMessageActionSetMessageTTL &_decryptedMessageActionSetMessageTTL() {
-		if (!data) throw mtpErrorUninitialized();
-		if (_type != mtpc_decryptedMessageActionSetMessageTTL) throw mtpErrorWrongTypeId(_type, mtpc_decryptedMessageActionSetMessageTTL);
-		split();
-		return *(MTPDdecryptedMessageActionSetMessageTTL*)data;
-	}
-	const MTPDdecryptedMessageActionSetMessageTTL &c_decryptedMessageActionSetMessageTTL() const {
-		if (!data) throw mtpErrorUninitialized();
-		if (_type != mtpc_decryptedMessageActionSetMessageTTL) throw mtpErrorWrongTypeId(_type, mtpc_decryptedMessageActionSetMessageTTL);
-		return *(const MTPDdecryptedMessageActionSetMessageTTL*)data;
-	}
-
-	MTPDdecryptedMessageActionReadMessages &_decryptedMessageActionReadMessages() {
-		if (!data) throw mtpErrorUninitialized();
-		if (_type != mtpc_decryptedMessageActionReadMessages) throw mtpErrorWrongTypeId(_type, mtpc_decryptedMessageActionReadMessages);
-		split();
-		return *(MTPDdecryptedMessageActionReadMessages*)data;
-	}
-	const MTPDdecryptedMessageActionReadMessages &c_decryptedMessageActionReadMessages() const {
-		if (!data) throw mtpErrorUninitialized();
-		if (_type != mtpc_decryptedMessageActionReadMessages) throw mtpErrorWrongTypeId(_type, mtpc_decryptedMessageActionReadMessages);
-		return *(const MTPDdecryptedMessageActionReadMessages*)data;
-	}
-
-	MTPDdecryptedMessageActionDeleteMessages &_decryptedMessageActionDeleteMessages() {
-		if (!data) throw mtpErrorUninitialized();
-		if (_type != mtpc_decryptedMessageActionDeleteMessages) throw mtpErrorWrongTypeId(_type, mtpc_decryptedMessageActionDeleteMessages);
-		split();
-		return *(MTPDdecryptedMessageActionDeleteMessages*)data;
-	}
-	const MTPDdecryptedMessageActionDeleteMessages &c_decryptedMessageActionDeleteMessages() const {
-		if (!data) throw mtpErrorUninitialized();
-		if (_type != mtpc_decryptedMessageActionDeleteMessages) throw mtpErrorWrongTypeId(_type, mtpc_decryptedMessageActionDeleteMessages);
-		return *(const MTPDdecryptedMessageActionDeleteMessages*)data;
-	}
-
-	MTPDdecryptedMessageActionScreenshotMessages &_decryptedMessageActionScreenshotMessages() {
-		if (!data) throw mtpErrorUninitialized();
-		if (_type != mtpc_decryptedMessageActionScreenshotMessages) throw mtpErrorWrongTypeId(_type, mtpc_decryptedMessageActionScreenshotMessages);
-		split();
-		return *(MTPDdecryptedMessageActionScreenshotMessages*)data;
-	}
-	const MTPDdecryptedMessageActionScreenshotMessages &c_decryptedMessageActionScreenshotMessages() const {
-		if (!data) throw mtpErrorUninitialized();
-		if (_type != mtpc_decryptedMessageActionScreenshotMessages) throw mtpErrorWrongTypeId(_type, mtpc_decryptedMessageActionScreenshotMessages);
-		return *(const MTPDdecryptedMessageActionScreenshotMessages*)data;
-	}
-
-	MTPDdecryptedMessageActionNotifyLayer &_decryptedMessageActionNotifyLayer() {
-		if (!data) throw mtpErrorUninitialized();
-		if (_type != mtpc_decryptedMessageActionNotifyLayer) throw mtpErrorWrongTypeId(_type, mtpc_decryptedMessageActionNotifyLayer);
-		split();
-		return *(MTPDdecryptedMessageActionNotifyLayer*)data;
-	}
-	const MTPDdecryptedMessageActionNotifyLayer &c_decryptedMessageActionNotifyLayer() const {
-		if (!data) throw mtpErrorUninitialized();
-		if (_type != mtpc_decryptedMessageActionNotifyLayer) throw mtpErrorWrongTypeId(_type, mtpc_decryptedMessageActionNotifyLayer);
-		return *(const MTPDdecryptedMessageActionNotifyLayer*)data;
-	}
-
-	uint32 size() const;
-	mtpTypeId type() const;
-	void read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons);
-	void write(mtpBuffer &to) const;
-
-	typedef void ResponseType;
-
-private:
-	explicit MTPdecryptedMessageAction(mtpTypeId type);
-	explicit MTPdecryptedMessageAction(MTPDdecryptedMessageActionSetMessageTTL *_data);
-	explicit MTPdecryptedMessageAction(MTPDdecryptedMessageActionReadMessages *_data);
-	explicit MTPdecryptedMessageAction(MTPDdecryptedMessageActionDeleteMessages *_data);
-	explicit MTPdecryptedMessageAction(MTPDdecryptedMessageActionScreenshotMessages *_data);
-	explicit MTPdecryptedMessageAction(MTPDdecryptedMessageActionNotifyLayer *_data);
-
-	friend MTPdecryptedMessageAction MTP_decryptedMessageActionSetMessageTTL(MTPint _ttl_seconds);
-	friend MTPdecryptedMessageAction MTP_decryptedMessageActionReadMessages(const MTPVector<MTPlong> &_random_ids);
-	friend MTPdecryptedMessageAction MTP_decryptedMessageActionDeleteMessages(const MTPVector<MTPlong> &_random_ids);
-	friend MTPdecryptedMessageAction MTP_decryptedMessageActionScreenshotMessages(const MTPVector<MTPlong> &_random_ids);
-	friend MTPdecryptedMessageAction MTP_decryptedMessageActionFlushHistory();
-	friend MTPdecryptedMessageAction MTP_decryptedMessageActionNotifyLayer(MTPint _layer);
-
-	mtpTypeId _type;
-};
-typedef MTPBoxed<MTPdecryptedMessageAction> MTPDecryptedMessageAction;
-
 class MTPmessages_dhConfig : private mtpDataOwner {
 public:
 	MTPmessages_dhConfig() : mtpDataOwner(0), _type(0) {
@@ -6937,6 +6607,101 @@ private:
 };
 typedef MTPBoxed<MTPnotifyPeer> MTPNotifyPeer;
 
+class MTPsendMessageAction {
+public:
+	MTPsendMessageAction() : _type(0) {
+	}
+	MTPsendMessageAction(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons) : _type(0) {
+		read(from, end, cons);
+	}
+
+	uint32 size() const;
+	mtpTypeId type() const;
+	void read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons);
+	void write(mtpBuffer &to) const;
+
+	typedef void ResponseType;
+
+private:
+	explicit MTPsendMessageAction(mtpTypeId type);
+
+	friend MTPsendMessageAction MTP_sendMessageTypingAction();
+	friend MTPsendMessageAction MTP_sendMessageCancelAction();
+	friend MTPsendMessageAction MTP_sendMessageRecordVideoAction();
+	friend MTPsendMessageAction MTP_sendMessageUploadVideoAction();
+	friend MTPsendMessageAction MTP_sendMessageRecordAudioAction();
+	friend MTPsendMessageAction MTP_sendMessageUploadAudioAction();
+	friend MTPsendMessageAction MTP_sendMessageUploadPhotoAction();
+	friend MTPsendMessageAction MTP_sendMessageUploadDocumentAction();
+	friend MTPsendMessageAction MTP_sendMessageGeoLocationAction();
+	friend MTPsendMessageAction MTP_sendMessageChooseContactAction();
+
+	mtpTypeId _type;
+};
+typedef MTPBoxed<MTPsendMessageAction> MTPSendMessageAction;
+
+class MTPcontactFound : private mtpDataOwner {
+public:
+	MTPcontactFound();
+	MTPcontactFound(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_contactFound) : mtpDataOwner(0) {
+		read(from, end, cons);
+	}
+
+	MTPDcontactFound &_contactFound() {
+		if (!data) throw mtpErrorUninitialized();
+		split();
+		return *(MTPDcontactFound*)data;
+	}
+	const MTPDcontactFound &c_contactFound() const {
+		if (!data) throw mtpErrorUninitialized();
+		return *(const MTPDcontactFound*)data;
+	}
+
+	uint32 size() const;
+	mtpTypeId type() const;
+	void read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_contactFound);
+	void write(mtpBuffer &to) const;
+
+	typedef void ResponseType;
+
+private:
+	explicit MTPcontactFound(MTPDcontactFound *_data);
+
+	friend MTPcontactFound MTP_contactFound(MTPint _user_id);
+};
+typedef MTPBoxed<MTPcontactFound> MTPContactFound;
+
+class MTPcontacts_found : private mtpDataOwner {
+public:
+	MTPcontacts_found();
+	MTPcontacts_found(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_contacts_found) : mtpDataOwner(0) {
+		read(from, end, cons);
+	}
+
+	MTPDcontacts_found &_contacts_found() {
+		if (!data) throw mtpErrorUninitialized();
+		split();
+		return *(MTPDcontacts_found*)data;
+	}
+	const MTPDcontacts_found &c_contacts_found() const {
+		if (!data) throw mtpErrorUninitialized();
+		return *(const MTPDcontacts_found*)data;
+	}
+
+	uint32 size() const;
+	mtpTypeId type() const;
+	void read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_contacts_found);
+	void write(mtpBuffer &to) const;
+
+	typedef void ResponseType;
+
+private:
+	explicit MTPcontacts_found(MTPDcontacts_found *_data);
+
+	friend MTPcontacts_found MTP_contacts_found(const MTPVector<MTPContactFound> &_results, const MTPVector<MTPUser> &_users);
+};
+typedef MTPBoxed<MTPcontacts_found> MTPcontacts_Found;
+
 // Type constructors with data
 
 class MTPDresPQ : public mtpDataImpl<MTPDresPQ> {
@@ -7682,12 +7447,13 @@ class MTPDuserSelf : public mtpDataImpl<MTPDuserSelf> {
 public:
 	MTPDuserSelf() {
 	}
-	MTPDuserSelf(MTPint _id, const MTPstring &_first_name, const MTPstring &_last_name, const MTPstring &_phone, const MTPUserProfilePhoto &_photo, const MTPUserStatus &_status, MTPBool _inactive) : vid(_id), vfirst_name(_first_name), vlast_name(_last_name), vphone(_phone), vphoto(_photo), vstatus(_status), vinactive(_inactive) {
+	MTPDuserSelf(MTPint _id, const MTPstring &_first_name, const MTPstring &_last_name, const MTPstring &_username, const MTPstring &_phone, const MTPUserProfilePhoto &_photo, const MTPUserStatus &_status, MTPBool _inactive) : vid(_id), vfirst_name(_first_name), vlast_name(_last_name), vusername(_username), vphone(_phone), vphoto(_photo), vstatus(_status), vinactive(_inactive) {
 	}
 
 	MTPint vid;
 	MTPstring vfirst_name;
 	MTPstring vlast_name;
+	MTPstring vusername;
 	MTPstring vphone;
 	MTPUserProfilePhoto vphoto;
 	MTPUserStatus vstatus;
@@ -7698,12 +7464,13 @@ class MTPDuserContact : public mtpDataImpl<MTPDuserContact> {
 public:
 	MTPDuserContact() {
 	}
-	MTPDuserContact(MTPint _id, const MTPstring &_first_name, const MTPstring &_last_name, const MTPlong &_access_hash, const MTPstring &_phone, const MTPUserProfilePhoto &_photo, const MTPUserStatus &_status) : vid(_id), vfirst_name(_first_name), vlast_name(_last_name), vaccess_hash(_access_hash), vphone(_phone), vphoto(_photo), vstatus(_status) {
+	MTPDuserContact(MTPint _id, const MTPstring &_first_name, const MTPstring &_last_name, const MTPstring &_username, const MTPlong &_access_hash, const MTPstring &_phone, const MTPUserProfilePhoto &_photo, const MTPUserStatus &_status) : vid(_id), vfirst_name(_first_name), vlast_name(_last_name), vusername(_username), vaccess_hash(_access_hash), vphone(_phone), vphoto(_photo), vstatus(_status) {
 	}
 
 	MTPint vid;
 	MTPstring vfirst_name;
 	MTPstring vlast_name;
+	MTPstring vusername;
 	MTPlong vaccess_hash;
 	MTPstring vphone;
 	MTPUserProfilePhoto vphoto;
@@ -7714,12 +7481,13 @@ class MTPDuserRequest : public mtpDataImpl<MTPDuserRequest> {
 public:
 	MTPDuserRequest() {
 	}
-	MTPDuserRequest(MTPint _id, const MTPstring &_first_name, const MTPstring &_last_name, const MTPlong &_access_hash, const MTPstring &_phone, const MTPUserProfilePhoto &_photo, const MTPUserStatus &_status) : vid(_id), vfirst_name(_first_name), vlast_name(_last_name), vaccess_hash(_access_hash), vphone(_phone), vphoto(_photo), vstatus(_status) {
+	MTPDuserRequest(MTPint _id, const MTPstring &_first_name, const MTPstring &_last_name, const MTPstring &_username, const MTPlong &_access_hash, const MTPstring &_phone, const MTPUserProfilePhoto &_photo, const MTPUserStatus &_status) : vid(_id), vfirst_name(_first_name), vlast_name(_last_name), vusername(_username), vaccess_hash(_access_hash), vphone(_phone), vphoto(_photo), vstatus(_status) {
 	}
 
 	MTPint vid;
 	MTPstring vfirst_name;
 	MTPstring vlast_name;
+	MTPstring vusername;
 	MTPlong vaccess_hash;
 	MTPstring vphone;
 	MTPUserProfilePhoto vphoto;
@@ -7730,12 +7498,13 @@ class MTPDuserForeign : public mtpDataImpl<MTPDuserForeign> {
 public:
 	MTPDuserForeign() {
 	}
-	MTPDuserForeign(MTPint _id, const MTPstring &_first_name, const MTPstring &_last_name, const MTPlong &_access_hash, const MTPUserProfilePhoto &_photo, const MTPUserStatus &_status) : vid(_id), vfirst_name(_first_name), vlast_name(_last_name), vaccess_hash(_access_hash), vphoto(_photo), vstatus(_status) {
+	MTPDuserForeign(MTPint _id, const MTPstring &_first_name, const MTPstring &_last_name, const MTPstring &_username, const MTPlong &_access_hash, const MTPUserProfilePhoto &_photo, const MTPUserStatus &_status) : vid(_id), vfirst_name(_first_name), vlast_name(_last_name), vusername(_username), vaccess_hash(_access_hash), vphoto(_photo), vstatus(_status) {
 	}
 
 	MTPint vid;
 	MTPstring vfirst_name;
 	MTPstring vlast_name;
+	MTPstring vusername;
 	MTPlong vaccess_hash;
 	MTPUserProfilePhoto vphoto;
 	MTPUserStatus vstatus;
@@ -7745,12 +7514,13 @@ class MTPDuserDeleted : public mtpDataImpl<MTPDuserDeleted> {
 public:
 	MTPDuserDeleted() {
 	}
-	MTPDuserDeleted(MTPint _id, const MTPstring &_first_name, const MTPstring &_last_name) : vid(_id), vfirst_name(_first_name), vlast_name(_last_name) {
+	MTPDuserDeleted(MTPint _id, const MTPstring &_first_name, const MTPstring &_last_name, const MTPstring &_username) : vid(_id), vfirst_name(_first_name), vlast_name(_last_name), vusername(_username) {
 	}
 
 	MTPint vid;
 	MTPstring vfirst_name;
 	MTPstring vlast_name;
+	MTPstring vusername;
 };
 
 class MTPDuserProfilePhoto : public mtpDataImpl<MTPDuserProfilePhoto> {
@@ -7916,14 +7686,13 @@ class MTPDmessage : public mtpDataImpl<MTPDmessage> {
 public:
 	MTPDmessage() {
 	}
-	MTPDmessage(MTPint _id, MTPint _from_id, const MTPPeer &_to_id, MTPBool _out, MTPBool _unread, MTPint _date, const MTPstring &_message, const MTPMessageMedia &_media) : vid(_id), vfrom_id(_from_id), vto_id(_to_id), vout(_out), vunread(_unread), vdate(_date), vmessage(_message), vmedia(_media) {
+	MTPDmessage(MTPint _flags, MTPint _id, MTPint _from_id, const MTPPeer &_to_id, MTPint _date, const MTPstring &_message, const MTPMessageMedia &_media) : vflags(_flags), vid(_id), vfrom_id(_from_id), vto_id(_to_id), vdate(_date), vmessage(_message), vmedia(_media) {
 	}
 
+	MTPint vflags;
 	MTPint vid;
 	MTPint vfrom_id;
 	MTPPeer vto_id;
-	MTPBool vout;
-	MTPBool vunread;
 	MTPint vdate;
 	MTPstring vmessage;
 	MTPMessageMedia vmedia;
@@ -7933,16 +7702,15 @@ class MTPDmessageForwarded : public mtpDataImpl<MTPDmessageForwarded> {
 public:
 	MTPDmessageForwarded() {
 	}
-	MTPDmessageForwarded(MTPint _id, MTPint _fwd_from_id, MTPint _fwd_date, MTPint _from_id, const MTPPeer &_to_id, MTPBool _out, MTPBool _unread, MTPint _date, const MTPstring &_message, const MTPMessageMedia &_media) : vid(_id), vfwd_from_id(_fwd_from_id), vfwd_date(_fwd_date), vfrom_id(_from_id), vto_id(_to_id), vout(_out), vunread(_unread), vdate(_date), vmessage(_message), vmedia(_media) {
+	MTPDmessageForwarded(MTPint _flags, MTPint _id, MTPint _fwd_from_id, MTPint _fwd_date, MTPint _from_id, const MTPPeer &_to_id, MTPint _date, const MTPstring &_message, const MTPMessageMedia &_media) : vflags(_flags), vid(_id), vfwd_from_id(_fwd_from_id), vfwd_date(_fwd_date), vfrom_id(_from_id), vto_id(_to_id), vdate(_date), vmessage(_message), vmedia(_media) {
 	}
 
+	MTPint vflags;
 	MTPint vid;
 	MTPint vfwd_from_id;
 	MTPint vfwd_date;
 	MTPint vfrom_id;
 	MTPPeer vto_id;
-	MTPBool vout;
-	MTPBool vunread;
 	MTPint vdate;
 	MTPstring vmessage;
 	MTPMessageMedia vmedia;
@@ -7952,14 +7720,13 @@ class MTPDmessageService : public mtpDataImpl<MTPDmessageService> {
 public:
 	MTPDmessageService() {
 	}
-	MTPDmessageService(MTPint _id, MTPint _from_id, const MTPPeer &_to_id, MTPBool _out, MTPBool _unread, MTPint _date, const MTPMessageAction &_action) : vid(_id), vfrom_id(_from_id), vto_id(_to_id), vout(_out), vunread(_unread), vdate(_date), vaction(_action) {
+	MTPDmessageService(MTPint _flags, MTPint _id, MTPint _from_id, const MTPPeer &_to_id, MTPint _date, const MTPMessageAction &_action) : vflags(_flags), vid(_id), vfrom_id(_from_id), vto_id(_to_id), vdate(_date), vaction(_action) {
 	}
 
+	MTPint vflags;
 	MTPint vid;
 	MTPint vfrom_id;
 	MTPPeer vto_id;
-	MTPBool vout;
-	MTPBool vunread;
 	MTPint vdate;
 	MTPMessageAction vaction;
 };
@@ -8242,6 +8009,19 @@ public:
 	MTPBool vis_password;
 };
 
+class MTPDauth_sentAppCode : public mtpDataImpl<MTPDauth_sentAppCode> {
+public:
+	MTPDauth_sentAppCode() {
+	}
+	MTPDauth_sentAppCode(MTPBool _phone_registered, const MTPstring &_phone_code_hash, MTPint _send_call_timeout, MTPBool _is_password) : vphone_registered(_phone_registered), vphone_code_hash(_phone_code_hash), vsend_call_timeout(_send_call_timeout), vis_password(_is_password) {
+	}
+
+	MTPBool vphone_registered;
+	MTPstring vphone_code_hash;
+	MTPint vsend_call_timeout;
+	MTPBool vis_password;
+};
+
 class MTPDauth_authorization : public mtpDataImpl<MTPDauth_authorization> {
 public:
 	MTPDauth_authorization() {
@@ -8385,16 +8165,6 @@ public:
 	MTPint vdate;
 };
 
-class MTPDcontactFound : public mtpDataImpl<MTPDcontactFound> {
-public:
-	MTPDcontactFound() {
-	}
-	MTPDcontactFound(MTPint _user_id) : vuser_id(_user_id) {
-	}
-
-	MTPint vuser_id;
-};
-
 class MTPDcontactSuggested : public mtpDataImpl<MTPDcontactSuggested> {
 public:
 	MTPDcontactSuggested() {
@@ -8506,17 +8276,6 @@ public:
 	MTPVector<MTPUser> vusers;
 };
 
-class MTPDcontacts_found : public mtpDataImpl<MTPDcontacts_found> {
-public:
-	MTPDcontacts_found() {
-	}
-	MTPDcontacts_found(const MTPVector<MTPContactFound> &_results, const MTPVector<MTPUser> &_users) : vresults(_results), vusers(_users) {
-	}
-
-	MTPVector<MTPContactFound> vresults;
-	MTPVector<MTPUser> vusers;
-};
-
 class MTPDcontacts_suggested : public mtpDataImpl<MTPDcontacts_suggested> {
 public:
 	MTPDcontacts_suggested() {
@@ -8782,21 +8541,23 @@ class MTPDupdateUserTyping : public mtpDataImpl<MTPDupdateUserTyping> {
 public:
 	MTPDupdateUserTyping() {
 	}
-	MTPDupdateUserTyping(MTPint _user_id) : vuser_id(_user_id) {
+	MTPDupdateUserTyping(MTPint _user_id, const MTPSendMessageAction &_action) : vuser_id(_user_id), vaction(_action) {
 	}
 
 	MTPint vuser_id;
+	MTPSendMessageAction vaction;
 };
 
 class MTPDupdateChatUserTyping : public mtpDataImpl<MTPDupdateChatUserTyping> {
 public:
 	MTPDupdateChatUserTyping() {
 	}
-	MTPDupdateChatUserTyping(MTPint _chat_id, MTPint _user_id) : vchat_id(_chat_id), vuser_id(_user_id) {
+	MTPDupdateChatUserTyping(MTPint _chat_id, MTPint _user_id, const MTPSendMessageAction &_action) : vchat_id(_chat_id), vuser_id(_user_id), vaction(_action) {
 	}
 
 	MTPint vchat_id;
 	MTPint vuser_id;
+	MTPSendMessageAction vaction;
 };
 
 class MTPDupdateChatParticipants : public mtpDataImpl<MTPDupdateChatParticipants> {
@@ -8824,12 +8585,13 @@ class MTPDupdateUserName : public mtpDataImpl<MTPDupdateUserName> {
 public:
 	MTPDupdateUserName() {
 	}
-	MTPDupdateUserName(MTPint _user_id, const MTPstring &_first_name, const MTPstring &_last_name) : vuser_id(_user_id), vfirst_name(_first_name), vlast_name(_last_name) {
+	MTPDupdateUserName(MTPint _user_id, const MTPstring &_first_name, const MTPstring &_last_name, const MTPstring &_username) : vuser_id(_user_id), vfirst_name(_first_name), vlast_name(_last_name), vusername(_username) {
 	}
 
 	MTPint vuser_id;
 	MTPstring vfirst_name;
 	MTPstring vlast_name;
+	MTPstring vusername;
 };
 
 class MTPDupdateUserPhoto : public mtpDataImpl<MTPDupdateUserPhoto> {
@@ -9002,6 +8764,19 @@ public:
 	MTPPeerNotifySettings vnotify_settings;
 };
 
+class MTPDupdateServiceNotification : public mtpDataImpl<MTPDupdateServiceNotification> {
+public:
+	MTPDupdateServiceNotification() {
+	}
+	MTPDupdateServiceNotification(const MTPstring &_type, const MTPstring &_message, const MTPMessageMedia &_media, MTPBool _popup) : vtype(_type), vmessage(_message), vmedia(_media), vpopup(_popup) {
+	}
+
+	MTPstring vtype;
+	MTPstring vmessage;
+	MTPMessageMedia vmedia;
+	MTPBool vpopup;
+};
+
 class MTPDupdates_state : public mtpDataImpl<MTPDupdates_state> {
 public:
 	MTPDupdates_state() {
@@ -9492,183 +9267,6 @@ public:
 	MTPbytes vbytes;
 };
 
-class MTPDdecryptedMessageLayer : public mtpDataImpl<MTPDdecryptedMessageLayer> {
-public:
-	MTPDdecryptedMessageLayer() {
-	}
-	MTPDdecryptedMessageLayer(MTPint _layer, const MTPDecryptedMessage &_message) : vlayer(_layer), vmessage(_message) {
-	}
-
-	MTPint vlayer;
-	MTPDecryptedMessage vmessage;
-};
-
-class MTPDdecryptedMessage : public mtpDataImpl<MTPDdecryptedMessage> {
-public:
-	MTPDdecryptedMessage() {
-	}
-	MTPDdecryptedMessage(const MTPlong &_random_id, const MTPbytes &_random_bytes, const MTPstring &_message, const MTPDecryptedMessageMedia &_media) : vrandom_id(_random_id), vrandom_bytes(_random_bytes), vmessage(_message), vmedia(_media) {
-	}
-
-	MTPlong vrandom_id;
-	MTPbytes vrandom_bytes;
-	MTPstring vmessage;
-	MTPDecryptedMessageMedia vmedia;
-};
-
-class MTPDdecryptedMessageService : public mtpDataImpl<MTPDdecryptedMessageService> {
-public:
-	MTPDdecryptedMessageService() {
-	}
-	MTPDdecryptedMessageService(const MTPlong &_random_id, const MTPbytes &_random_bytes, const MTPDecryptedMessageAction &_action) : vrandom_id(_random_id), vrandom_bytes(_random_bytes), vaction(_action) {
-	}
-
-	MTPlong vrandom_id;
-	MTPbytes vrandom_bytes;
-	MTPDecryptedMessageAction vaction;
-};
-
-class MTPDdecryptedMessageMediaPhoto : public mtpDataImpl<MTPDdecryptedMessageMediaPhoto> {
-public:
-	MTPDdecryptedMessageMediaPhoto() {
-	}
-	MTPDdecryptedMessageMediaPhoto(const MTPbytes &_thumb, MTPint _thumb_w, MTPint _thumb_h, MTPint _w, MTPint _h, MTPint _size, const MTPbytes &_key, const MTPbytes &_iv) : vthumb(_thumb), vthumb_w(_thumb_w), vthumb_h(_thumb_h), vw(_w), vh(_h), vsize(_size), vkey(_key), viv(_iv) {
-	}
-
-	MTPbytes vthumb;
-	MTPint vthumb_w;
-	MTPint vthumb_h;
-	MTPint vw;
-	MTPint vh;
-	MTPint vsize;
-	MTPbytes vkey;
-	MTPbytes viv;
-};
-
-class MTPDdecryptedMessageMediaVideo : public mtpDataImpl<MTPDdecryptedMessageMediaVideo> {
-public:
-	MTPDdecryptedMessageMediaVideo() {
-	}
-	MTPDdecryptedMessageMediaVideo(const MTPbytes &_thumb, MTPint _thumb_w, MTPint _thumb_h, MTPint _duration, const MTPstring &_mime_type, MTPint _w, MTPint _h, MTPint _size, const MTPbytes &_key, const MTPbytes &_iv) : vthumb(_thumb), vthumb_w(_thumb_w), vthumb_h(_thumb_h), vduration(_duration), vmime_type(_mime_type), vw(_w), vh(_h), vsize(_size), vkey(_key), viv(_iv) {
-	}
-
-	MTPbytes vthumb;
-	MTPint vthumb_w;
-	MTPint vthumb_h;
-	MTPint vduration;
-	MTPstring vmime_type;
-	MTPint vw;
-	MTPint vh;
-	MTPint vsize;
-	MTPbytes vkey;
-	MTPbytes viv;
-};
-
-class MTPDdecryptedMessageMediaGeoPoint : public mtpDataImpl<MTPDdecryptedMessageMediaGeoPoint> {
-public:
-	MTPDdecryptedMessageMediaGeoPoint() {
-	}
-	MTPDdecryptedMessageMediaGeoPoint(const MTPdouble &_lat, const MTPdouble &_long) : vlat(_lat), vlong(_long) {
-	}
-
-	MTPdouble vlat;
-	MTPdouble vlong;
-};
-
-class MTPDdecryptedMessageMediaContact : public mtpDataImpl<MTPDdecryptedMessageMediaContact> {
-public:
-	MTPDdecryptedMessageMediaContact() {
-	}
-	MTPDdecryptedMessageMediaContact(const MTPstring &_phone_number, const MTPstring &_first_name, const MTPstring &_last_name, MTPint _user_id) : vphone_number(_phone_number), vfirst_name(_first_name), vlast_name(_last_name), vuser_id(_user_id) {
-	}
-
-	MTPstring vphone_number;
-	MTPstring vfirst_name;
-	MTPstring vlast_name;
-	MTPint vuser_id;
-};
-
-class MTPDdecryptedMessageMediaDocument : public mtpDataImpl<MTPDdecryptedMessageMediaDocument> {
-public:
-	MTPDdecryptedMessageMediaDocument() {
-	}
-	MTPDdecryptedMessageMediaDocument(const MTPbytes &_thumb, MTPint _thumb_w, MTPint _thumb_h, const MTPstring &_file_name, const MTPstring &_mime_type, MTPint _size, const MTPbytes &_key, const MTPbytes &_iv) : vthumb(_thumb), vthumb_w(_thumb_w), vthumb_h(_thumb_h), vfile_name(_file_name), vmime_type(_mime_type), vsize(_size), vkey(_key), viv(_iv) {
-	}
-
-	MTPbytes vthumb;
-	MTPint vthumb_w;
-	MTPint vthumb_h;
-	MTPstring vfile_name;
-	MTPstring vmime_type;
-	MTPint vsize;
-	MTPbytes vkey;
-	MTPbytes viv;
-};
-
-class MTPDdecryptedMessageMediaAudio : public mtpDataImpl<MTPDdecryptedMessageMediaAudio> {
-public:
-	MTPDdecryptedMessageMediaAudio() {
-	}
-	MTPDdecryptedMessageMediaAudio(MTPint _duration, const MTPstring &_mime_type, MTPint _size, const MTPbytes &_key, const MTPbytes &_iv) : vduration(_duration), vmime_type(_mime_type), vsize(_size), vkey(_key), viv(_iv) {
-	}
-
-	MTPint vduration;
-	MTPstring vmime_type;
-	MTPint vsize;
-	MTPbytes vkey;
-	MTPbytes viv;
-};
-
-class MTPDdecryptedMessageActionSetMessageTTL : public mtpDataImpl<MTPDdecryptedMessageActionSetMessageTTL> {
-public:
-	MTPDdecryptedMessageActionSetMessageTTL() {
-	}
-	MTPDdecryptedMessageActionSetMessageTTL(MTPint _ttl_seconds) : vttl_seconds(_ttl_seconds) {
-	}
-
-	MTPint vttl_seconds;
-};
-
-class MTPDdecryptedMessageActionReadMessages : public mtpDataImpl<MTPDdecryptedMessageActionReadMessages> {
-public:
-	MTPDdecryptedMessageActionReadMessages() {
-	}
-	MTPDdecryptedMessageActionReadMessages(const MTPVector<MTPlong> &_random_ids) : vrandom_ids(_random_ids) {
-	}
-
-	MTPVector<MTPlong> vrandom_ids;
-};
-
-class MTPDdecryptedMessageActionDeleteMessages : public mtpDataImpl<MTPDdecryptedMessageActionDeleteMessages> {
-public:
-	MTPDdecryptedMessageActionDeleteMessages() {
-	}
-	MTPDdecryptedMessageActionDeleteMessages(const MTPVector<MTPlong> &_random_ids) : vrandom_ids(_random_ids) {
-	}
-
-	MTPVector<MTPlong> vrandom_ids;
-};
-
-class MTPDdecryptedMessageActionScreenshotMessages : public mtpDataImpl<MTPDdecryptedMessageActionScreenshotMessages> {
-public:
-	MTPDdecryptedMessageActionScreenshotMessages() {
-	}
-	MTPDdecryptedMessageActionScreenshotMessages(const MTPVector<MTPlong> &_random_ids) : vrandom_ids(_random_ids) {
-	}
-
-	MTPVector<MTPlong> vrandom_ids;
-};
-
-class MTPDdecryptedMessageActionNotifyLayer : public mtpDataImpl<MTPDdecryptedMessageActionNotifyLayer> {
-public:
-	MTPDdecryptedMessageActionNotifyLayer() {
-	}
-	MTPDdecryptedMessageActionNotifyLayer(MTPint _layer) : vlayer(_layer) {
-	}
-
-	MTPint vlayer;
-};
-
 class MTPDmessages_dhConfigNotModified : public mtpDataImpl<MTPDmessages_dhConfigNotModified> {
 public:
 	MTPDmessages_dhConfigNotModified() {
@@ -9811,6 +9409,27 @@ public:
 	MTPPeer vpeer;
 };
 
+class MTPDcontactFound : public mtpDataImpl<MTPDcontactFound> {
+public:
+	MTPDcontactFound() {
+	}
+	MTPDcontactFound(MTPint _user_id) : vuser_id(_user_id) {
+	}
+
+	MTPint vuser_id;
+};
+
+class MTPDcontacts_found : public mtpDataImpl<MTPDcontacts_found> {
+public:
+	MTPDcontacts_found() {
+	}
+	MTPDcontacts_found(const MTPVector<MTPContactFound> &_results, const MTPVector<MTPUser> &_users) : vresults(_results), vusers(_users) {
+	}
+
+	MTPVector<MTPContactFound> vresults;
+	MTPVector<MTPUser> vusers;
+};
+
 // RPC methods
 
 class MTPreq_pq { // RPC method 'req_pq'
@@ -10697,6 +10316,54 @@ public:
 	}
 };
 
+class MTPauth_bindTempAuthKey { // RPC method 'auth.bindTempAuthKey'
+public:
+	MTPlong vperm_auth_key_id;
+	MTPlong vnonce;
+	MTPint vexpires_at;
+	MTPbytes vencrypted_message;
+
+	MTPauth_bindTempAuthKey() {
+	}
+	MTPauth_bindTempAuthKey(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_auth_bindTempAuthKey) {
+		read(from, end, cons);
+	}
+	MTPauth_bindTempAuthKey(const MTPlong &_perm_auth_key_id, const MTPlong &_nonce, MTPint _expires_at, const MTPbytes &_encrypted_message) : vperm_auth_key_id(_perm_auth_key_id), vnonce(_nonce), vexpires_at(_expires_at), vencrypted_message(_encrypted_message) {
+	}
+
+	uint32 size() const {
+		return vperm_auth_key_id.size() + vnonce.size() + vexpires_at.size() + vencrypted_message.size();
+	}
+	mtpTypeId type() const {
+		return mtpc_auth_bindTempAuthKey;
+	}
+	void read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_auth_bindTempAuthKey) {
+		vperm_auth_key_id.read(from, end);
+		vnonce.read(from, end);
+		vexpires_at.read(from, end);
+		vencrypted_message.read(from, end);
+	}
+	void write(mtpBuffer &to) const {
+		vperm_auth_key_id.write(to);
+		vnonce.write(to);
+		vexpires_at.write(to);
+		vencrypted_message.write(to);
+	}
+
+	typedef MTPBool ResponseType;
+};
+class MTPauth_BindTempAuthKey : public MTPBoxed<MTPauth_bindTempAuthKey> {
+public:
+	MTPauth_BindTempAuthKey() {
+	}
+	MTPauth_BindTempAuthKey(const MTPauth_bindTempAuthKey &v) : MTPBoxed<MTPauth_bindTempAuthKey>(v) {
+	}
+	MTPauth_BindTempAuthKey(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = 0) : MTPBoxed<MTPauth_bindTempAuthKey>(from, end, cons) {
+	}
+	MTPauth_BindTempAuthKey(const MTPlong &_perm_auth_key_id, const MTPlong &_nonce, MTPint _expires_at, const MTPbytes &_encrypted_message) : MTPBoxed<MTPauth_bindTempAuthKey>(MTPauth_bindTempAuthKey(_perm_auth_key_id, _nonce, _expires_at, _encrypted_message)) {
+	}
+};
+
 class MTPaccount_registerDevice { // RPC method 'account.registerDevice'
 public:
 	MTPint vtoken_type;
@@ -11210,48 +10877,6 @@ public:
 	}
 };
 
-class MTPcontacts_search { // RPC method 'contacts.search'
-public:
-	MTPstring vq;
-	MTPint vlimit;
-
-	MTPcontacts_search() {
-	}
-	MTPcontacts_search(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_contacts_search) {
-		read(from, end, cons);
-	}
-	MTPcontacts_search(const MTPstring &_q, MTPint _limit) : vq(_q), vlimit(_limit) {
-	}
-
-	uint32 size() const {
-		return vq.size() + vlimit.size();
-	}
-	mtpTypeId type() const {
-		return mtpc_contacts_search;
-	}
-	void read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_contacts_search) {
-		vq.read(from, end);
-		vlimit.read(from, end);
-	}
-	void write(mtpBuffer &to) const {
-		vq.write(to);
-		vlimit.write(to);
-	}
-
-	typedef MTPcontacts_Found ResponseType;
-};
-class MTPcontacts_Search : public MTPBoxed<MTPcontacts_search> {
-public:
-	MTPcontacts_Search() {
-	}
-	MTPcontacts_Search(const MTPcontacts_search &v) : MTPBoxed<MTPcontacts_search>(v) {
-	}
-	MTPcontacts_Search(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = 0) : MTPBoxed<MTPcontacts_search>(from, end, cons) {
-	}
-	MTPcontacts_Search(const MTPstring &_q, MTPint _limit) : MTPBoxed<MTPcontacts_search>(MTPcontacts_search(_q, _limit)) {
-	}
-};
-
 class MTPcontacts_getSuggested { // RPC method 'contacts.getSuggested'
 public:
 	MTPint vlimit;
@@ -11489,6 +11114,76 @@ public:
 	}
 };
 
+class MTPcontacts_exportCard { // RPC method 'contacts.exportCard'
+public:
+	MTPcontacts_exportCard() {
+	}
+	MTPcontacts_exportCard(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_contacts_exportCard) {
+		read(from, end, cons);
+	}
+
+	uint32 size() const {
+		return 0;
+	}
+	mtpTypeId type() const {
+		return mtpc_contacts_exportCard;
+	}
+	void read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_contacts_exportCard) {
+	}
+	void write(mtpBuffer &to) const {
+	}
+
+	typedef MTPVector<MTPint> ResponseType;
+};
+class MTPcontacts_ExportCard : public MTPBoxed<MTPcontacts_exportCard> {
+public:
+	MTPcontacts_ExportCard() {
+	}
+	MTPcontacts_ExportCard(const MTPcontacts_exportCard &v) : MTPBoxed<MTPcontacts_exportCard>(v) {
+	}
+	MTPcontacts_ExportCard(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = 0) : MTPBoxed<MTPcontacts_exportCard>(from, end, cons) {
+	}
+};
+
+class MTPcontacts_importCard { // RPC method 'contacts.importCard'
+public:
+	MTPVector<MTPint> vexport_card;
+
+	MTPcontacts_importCard() {
+	}
+	MTPcontacts_importCard(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_contacts_importCard) {
+		read(from, end, cons);
+	}
+	MTPcontacts_importCard(const MTPVector<MTPint> &_export_card) : vexport_card(_export_card) {
+	}
+
+	uint32 size() const {
+		return vexport_card.size();
+	}
+	mtpTypeId type() const {
+		return mtpc_contacts_importCard;
+	}
+	void read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_contacts_importCard) {
+		vexport_card.read(from, end);
+	}
+	void write(mtpBuffer &to) const {
+		vexport_card.write(to);
+	}
+
+	typedef MTPUser ResponseType;
+};
+class MTPcontacts_ImportCard : public MTPBoxed<MTPcontacts_importCard> {
+public:
+	MTPcontacts_ImportCard() {
+	}
+	MTPcontacts_ImportCard(const MTPcontacts_importCard &v) : MTPBoxed<MTPcontacts_importCard>(v) {
+	}
+	MTPcontacts_ImportCard(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = 0) : MTPBoxed<MTPcontacts_importCard>(from, end, cons) {
+	}
+	MTPcontacts_ImportCard(const MTPVector<MTPint> &_export_card) : MTPBoxed<MTPcontacts_importCard>(MTPcontacts_importCard(_export_card)) {
+	}
+};
+
 class MTPmessages_getMessages { // RPC method 'messages.getMessages'
 public:
 	MTPVector<MTPint> vid;
@@ -11686,17 +11381,18 @@ public:
 	MTPInputPeer vpeer;
 	MTPint vmax_id;
 	MTPint voffset;
+	MTPBool vread_contents;
 
 	MTPmessages_readHistory() {
 	}
 	MTPmessages_readHistory(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_messages_readHistory) {
 		read(from, end, cons);
 	}
-	MTPmessages_readHistory(const MTPInputPeer &_peer, MTPint _max_id, MTPint _offset) : vpeer(_peer), vmax_id(_max_id), voffset(_offset) {
+	MTPmessages_readHistory(const MTPInputPeer &_peer, MTPint _max_id, MTPint _offset, MTPBool _read_contents) : vpeer(_peer), vmax_id(_max_id), voffset(_offset), vread_contents(_read_contents) {
 	}
 
 	uint32 size() const {
-		return vpeer.size() + vmax_id.size() + voffset.size();
+		return vpeer.size() + vmax_id.size() + voffset.size() + vread_contents.size();
 	}
 	mtpTypeId type() const {
 		return mtpc_messages_readHistory;
@@ -11705,11 +11401,13 @@ public:
 		vpeer.read(from, end);
 		vmax_id.read(from, end);
 		voffset.read(from, end);
+		vread_contents.read(from, end);
 	}
 	void write(mtpBuffer &to) const {
 		vpeer.write(to);
 		vmax_id.write(to);
 		voffset.write(to);
+		vread_contents.write(to);
 	}
 
 	typedef MTPmessages_AffectedHistory ResponseType;
@@ -11722,7 +11420,7 @@ public:
 	}
 	MTPmessages_ReadHistory(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = 0) : MTPBoxed<MTPmessages_readHistory>(from, end, cons) {
 	}
-	MTPmessages_ReadHistory(const MTPInputPeer &_peer, MTPint _max_id, MTPint _offset) : MTPBoxed<MTPmessages_readHistory>(MTPmessages_readHistory(_peer, _max_id, _offset)) {
+	MTPmessages_ReadHistory(const MTPInputPeer &_peer, MTPint _max_id, MTPint _offset, MTPBool _read_contents) : MTPBoxed<MTPmessages_readHistory>(MTPmessages_readHistory(_peer, _max_id, _offset, _read_contents)) {
 	}
 };
 
@@ -11888,29 +11586,29 @@ public:
 class MTPmessages_setTyping { // RPC method 'messages.setTyping'
 public:
 	MTPInputPeer vpeer;
-	MTPBool vtyping;
+	MTPSendMessageAction vaction;
 
 	MTPmessages_setTyping() {
 	}
 	MTPmessages_setTyping(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_messages_setTyping) {
 		read(from, end, cons);
 	}
-	MTPmessages_setTyping(const MTPInputPeer &_peer, MTPBool _typing) : vpeer(_peer), vtyping(_typing) {
+	MTPmessages_setTyping(const MTPInputPeer &_peer, const MTPSendMessageAction &_action) : vpeer(_peer), vaction(_action) {
 	}
 
 	uint32 size() const {
-		return vpeer.size() + vtyping.size();
+		return vpeer.size() + vaction.size();
 	}
 	mtpTypeId type() const {
 		return mtpc_messages_setTyping;
 	}
 	void read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_messages_setTyping) {
 		vpeer.read(from, end);
-		vtyping.read(from, end);
+		vaction.read(from, end);
 	}
 	void write(mtpBuffer &to) const {
 		vpeer.write(to);
-		vtyping.write(to);
+		vaction.write(to);
 	}
 
 	typedef MTPBool ResponseType;
@@ -11923,7 +11621,7 @@ public:
 	}
 	MTPmessages_SetTyping(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = 0) : MTPBoxed<MTPmessages_setTyping>(from, end, cons) {
 	}
-	MTPmessages_SetTyping(const MTPInputPeer &_peer, MTPBool _typing) : MTPBoxed<MTPmessages_setTyping>(MTPmessages_setTyping(_peer, _typing)) {
+	MTPmessages_SetTyping(const MTPInputPeer &_peer, const MTPSendMessageAction &_action) : MTPBoxed<MTPmessages_setTyping>(MTPmessages_setTyping(_peer, _action)) {
 	}
 };
 
@@ -14037,6 +13735,207 @@ public:
 	}
 };
 
+class MTPauth_sendSms { // RPC method 'auth.sendSms'
+public:
+	MTPstring vphone_number;
+	MTPstring vphone_code_hash;
+
+	MTPauth_sendSms() {
+	}
+	MTPauth_sendSms(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_auth_sendSms) {
+		read(from, end, cons);
+	}
+	MTPauth_sendSms(const MTPstring &_phone_number, const MTPstring &_phone_code_hash) : vphone_number(_phone_number), vphone_code_hash(_phone_code_hash) {
+	}
+
+	uint32 size() const {
+		return vphone_number.size() + vphone_code_hash.size();
+	}
+	mtpTypeId type() const {
+		return mtpc_auth_sendSms;
+	}
+	void read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_auth_sendSms) {
+		vphone_number.read(from, end);
+		vphone_code_hash.read(from, end);
+	}
+	void write(mtpBuffer &to) const {
+		vphone_number.write(to);
+		vphone_code_hash.write(to);
+	}
+
+	typedef MTPBool ResponseType;
+};
+class MTPauth_SendSms : public MTPBoxed<MTPauth_sendSms> {
+public:
+	MTPauth_SendSms() {
+	}
+	MTPauth_SendSms(const MTPauth_sendSms &v) : MTPBoxed<MTPauth_sendSms>(v) {
+	}
+	MTPauth_SendSms(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = 0) : MTPBoxed<MTPauth_sendSms>(from, end, cons) {
+	}
+	MTPauth_SendSms(const MTPstring &_phone_number, const MTPstring &_phone_code_hash) : MTPBoxed<MTPauth_sendSms>(MTPauth_sendSms(_phone_number, _phone_code_hash)) {
+	}
+};
+
+class MTPmessages_readMessageContents { // RPC method 'messages.readMessageContents'
+public:
+	MTPVector<MTPint> vid;
+
+	MTPmessages_readMessageContents() {
+	}
+	MTPmessages_readMessageContents(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_messages_readMessageContents) {
+		read(from, end, cons);
+	}
+	MTPmessages_readMessageContents(const MTPVector<MTPint> &_id) : vid(_id) {
+	}
+
+	uint32 size() const {
+		return vid.size();
+	}
+	mtpTypeId type() const {
+		return mtpc_messages_readMessageContents;
+	}
+	void read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_messages_readMessageContents) {
+		vid.read(from, end);
+	}
+	void write(mtpBuffer &to) const {
+		vid.write(to);
+	}
+
+	typedef MTPVector<MTPint> ResponseType;
+};
+class MTPmessages_ReadMessageContents : public MTPBoxed<MTPmessages_readMessageContents> {
+public:
+	MTPmessages_ReadMessageContents() {
+	}
+	MTPmessages_ReadMessageContents(const MTPmessages_readMessageContents &v) : MTPBoxed<MTPmessages_readMessageContents>(v) {
+	}
+	MTPmessages_ReadMessageContents(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = 0) : MTPBoxed<MTPmessages_readMessageContents>(from, end, cons) {
+	}
+	MTPmessages_ReadMessageContents(const MTPVector<MTPint> &_id) : MTPBoxed<MTPmessages_readMessageContents>(MTPmessages_readMessageContents(_id)) {
+	}
+};
+
+class MTPaccount_checkUsername { // RPC method 'account.checkUsername'
+public:
+	MTPstring vusername;
+
+	MTPaccount_checkUsername() {
+	}
+	MTPaccount_checkUsername(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_account_checkUsername) {
+		read(from, end, cons);
+	}
+	MTPaccount_checkUsername(const MTPstring &_username) : vusername(_username) {
+	}
+
+	uint32 size() const {
+		return vusername.size();
+	}
+	mtpTypeId type() const {
+		return mtpc_account_checkUsername;
+	}
+	void read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_account_checkUsername) {
+		vusername.read(from, end);
+	}
+	void write(mtpBuffer &to) const {
+		vusername.write(to);
+	}
+
+	typedef MTPBool ResponseType;
+};
+class MTPaccount_CheckUsername : public MTPBoxed<MTPaccount_checkUsername> {
+public:
+	MTPaccount_CheckUsername() {
+	}
+	MTPaccount_CheckUsername(const MTPaccount_checkUsername &v) : MTPBoxed<MTPaccount_checkUsername>(v) {
+	}
+	MTPaccount_CheckUsername(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = 0) : MTPBoxed<MTPaccount_checkUsername>(from, end, cons) {
+	}
+	MTPaccount_CheckUsername(const MTPstring &_username) : MTPBoxed<MTPaccount_checkUsername>(MTPaccount_checkUsername(_username)) {
+	}
+};
+
+class MTPaccount_updateUsername { // RPC method 'account.updateUsername'
+public:
+	MTPstring vusername;
+
+	MTPaccount_updateUsername() {
+	}
+	MTPaccount_updateUsername(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_account_updateUsername) {
+		read(from, end, cons);
+	}
+	MTPaccount_updateUsername(const MTPstring &_username) : vusername(_username) {
+	}
+
+	uint32 size() const {
+		return vusername.size();
+	}
+	mtpTypeId type() const {
+		return mtpc_account_updateUsername;
+	}
+	void read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_account_updateUsername) {
+		vusername.read(from, end);
+	}
+	void write(mtpBuffer &to) const {
+		vusername.write(to);
+	}
+
+	typedef MTPUser ResponseType;
+};
+class MTPaccount_UpdateUsername : public MTPBoxed<MTPaccount_updateUsername> {
+public:
+	MTPaccount_UpdateUsername() {
+	}
+	MTPaccount_UpdateUsername(const MTPaccount_updateUsername &v) : MTPBoxed<MTPaccount_updateUsername>(v) {
+	}
+	MTPaccount_UpdateUsername(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = 0) : MTPBoxed<MTPaccount_updateUsername>(from, end, cons) {
+	}
+	MTPaccount_UpdateUsername(const MTPstring &_username) : MTPBoxed<MTPaccount_updateUsername>(MTPaccount_updateUsername(_username)) {
+	}
+};
+
+class MTPcontacts_search { // RPC method 'contacts.search'
+public:
+	MTPstring vq;
+	MTPint vlimit;
+
+	MTPcontacts_search() {
+	}
+	MTPcontacts_search(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_contacts_search) {
+		read(from, end, cons);
+	}
+	MTPcontacts_search(const MTPstring &_q, MTPint _limit) : vq(_q), vlimit(_limit) {
+	}
+
+	uint32 size() const {
+		return vq.size() + vlimit.size();
+	}
+	mtpTypeId type() const {
+		return mtpc_contacts_search;
+	}
+	void read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_contacts_search) {
+		vq.read(from, end);
+		vlimit.read(from, end);
+	}
+	void write(mtpBuffer &to) const {
+		vq.write(to);
+		vlimit.write(to);
+	}
+
+	typedef MTPcontacts_Found ResponseType;
+};
+class MTPcontacts_Search : public MTPBoxed<MTPcontacts_search> {
+public:
+	MTPcontacts_Search() {
+	}
+	MTPcontacts_Search(const MTPcontacts_search &v) : MTPBoxed<MTPcontacts_search>(v) {
+	}
+	MTPcontacts_Search(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = 0) : MTPBoxed<MTPcontacts_search>(from, end, cons) {
+	}
+	MTPcontacts_Search(const MTPstring &_q, MTPint _limit) : MTPBoxed<MTPcontacts_search>(MTPcontacts_search(_q, _limit)) {
+	}
+};
+
 // Inline methods definition
 
 inline MTPresPQ::MTPresPQ() : mtpDataOwner(new MTPDresPQ()) {
@@ -16160,23 +16059,23 @@ inline uint32 MTPuser::size() const {
 		}
 		case mtpc_userSelf: {
 			const MTPDuserSelf &v(c_userSelf());
-			return v.vid.size() + v.vfirst_name.size() + v.vlast_name.size() + v.vphone.size() + v.vphoto.size() + v.vstatus.size() + v.vinactive.size();
+			return v.vid.size() + v.vfirst_name.size() + v.vlast_name.size() + v.vusername.size() + v.vphone.size() + v.vphoto.size() + v.vstatus.size() + v.vinactive.size();
 		}
 		case mtpc_userContact: {
 			const MTPDuserContact &v(c_userContact());
-			return v.vid.size() + v.vfirst_name.size() + v.vlast_name.size() + v.vaccess_hash.size() + v.vphone.size() + v.vphoto.size() + v.vstatus.size();
+			return v.vid.size() + v.vfirst_name.size() + v.vlast_name.size() + v.vusername.size() + v.vaccess_hash.size() + v.vphone.size() + v.vphoto.size() + v.vstatus.size();
 		}
 		case mtpc_userRequest: {
 			const MTPDuserRequest &v(c_userRequest());
-			return v.vid.size() + v.vfirst_name.size() + v.vlast_name.size() + v.vaccess_hash.size() + v.vphone.size() + v.vphoto.size() + v.vstatus.size();
+			return v.vid.size() + v.vfirst_name.size() + v.vlast_name.size() + v.vusername.size() + v.vaccess_hash.size() + v.vphone.size() + v.vphoto.size() + v.vstatus.size();
 		}
 		case mtpc_userForeign: {
 			const MTPDuserForeign &v(c_userForeign());
-			return v.vid.size() + v.vfirst_name.size() + v.vlast_name.size() + v.vaccess_hash.size() + v.vphoto.size() + v.vstatus.size();
+			return v.vid.size() + v.vfirst_name.size() + v.vlast_name.size() + v.vusername.size() + v.vaccess_hash.size() + v.vphoto.size() + v.vstatus.size();
 		}
 		case mtpc_userDeleted: {
 			const MTPDuserDeleted &v(c_userDeleted());
-			return v.vid.size() + v.vfirst_name.size() + v.vlast_name.size();
+			return v.vid.size() + v.vfirst_name.size() + v.vlast_name.size() + v.vusername.size();
 		}
 	}
 	return 0;
@@ -16199,6 +16098,7 @@ inline void MTPuser::read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId
 			v.vid.read(from, end);
 			v.vfirst_name.read(from, end);
 			v.vlast_name.read(from, end);
+			v.vusername.read(from, end);
 			v.vphone.read(from, end);
 			v.vphoto.read(from, end);
 			v.vstatus.read(from, end);
@@ -16210,6 +16110,7 @@ inline void MTPuser::read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId
 			v.vid.read(from, end);
 			v.vfirst_name.read(from, end);
 			v.vlast_name.read(from, end);
+			v.vusername.read(from, end);
 			v.vaccess_hash.read(from, end);
 			v.vphone.read(from, end);
 			v.vphoto.read(from, end);
@@ -16221,6 +16122,7 @@ inline void MTPuser::read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId
 			v.vid.read(from, end);
 			v.vfirst_name.read(from, end);
 			v.vlast_name.read(from, end);
+			v.vusername.read(from, end);
 			v.vaccess_hash.read(from, end);
 			v.vphone.read(from, end);
 			v.vphoto.read(from, end);
@@ -16232,6 +16134,7 @@ inline void MTPuser::read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId
 			v.vid.read(from, end);
 			v.vfirst_name.read(from, end);
 			v.vlast_name.read(from, end);
+			v.vusername.read(from, end);
 			v.vaccess_hash.read(from, end);
 			v.vphoto.read(from, end);
 			v.vstatus.read(from, end);
@@ -16242,6 +16145,7 @@ inline void MTPuser::read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId
 			v.vid.read(from, end);
 			v.vfirst_name.read(from, end);
 			v.vlast_name.read(from, end);
+			v.vusername.read(from, end);
 		} break;
 		default: throw mtpErrorUnexpected(cons, "MTPuser");
 	}
@@ -16257,6 +16161,7 @@ inline void MTPuser::write(mtpBuffer &to) const {
 			v.vid.write(to);
 			v.vfirst_name.write(to);
 			v.vlast_name.write(to);
+			v.vusername.write(to);
 			v.vphone.write(to);
 			v.vphoto.write(to);
 			v.vstatus.write(to);
@@ -16267,6 +16172,7 @@ inline void MTPuser::write(mtpBuffer &to) const {
 			v.vid.write(to);
 			v.vfirst_name.write(to);
 			v.vlast_name.write(to);
+			v.vusername.write(to);
 			v.vaccess_hash.write(to);
 			v.vphone.write(to);
 			v.vphoto.write(to);
@@ -16277,6 +16183,7 @@ inline void MTPuser::write(mtpBuffer &to) const {
 			v.vid.write(to);
 			v.vfirst_name.write(to);
 			v.vlast_name.write(to);
+			v.vusername.write(to);
 			v.vaccess_hash.write(to);
 			v.vphone.write(to);
 			v.vphoto.write(to);
@@ -16287,6 +16194,7 @@ inline void MTPuser::write(mtpBuffer &to) const {
 			v.vid.write(to);
 			v.vfirst_name.write(to);
 			v.vlast_name.write(to);
+			v.vusername.write(to);
 			v.vaccess_hash.write(to);
 			v.vphoto.write(to);
 			v.vstatus.write(to);
@@ -16296,6 +16204,7 @@ inline void MTPuser::write(mtpBuffer &to) const {
 			v.vid.write(to);
 			v.vfirst_name.write(to);
 			v.vlast_name.write(to);
+			v.vusername.write(to);
 		} break;
 	}
 }
@@ -16325,20 +16234,20 @@ inline MTPuser::MTPuser(MTPDuserDeleted *_data) : mtpDataOwner(_data), _type(mtp
 inline MTPuser MTP_userEmpty(MTPint _id) {
 	return MTPuser(new MTPDuserEmpty(_id));
 }
-inline MTPuser MTP_userSelf(MTPint _id, const MTPstring &_first_name, const MTPstring &_last_name, const MTPstring &_phone, const MTPUserProfilePhoto &_photo, const MTPUserStatus &_status, MTPBool _inactive) {
-	return MTPuser(new MTPDuserSelf(_id, _first_name, _last_name, _phone, _photo, _status, _inactive));
+inline MTPuser MTP_userSelf(MTPint _id, const MTPstring &_first_name, const MTPstring &_last_name, const MTPstring &_username, const MTPstring &_phone, const MTPUserProfilePhoto &_photo, const MTPUserStatus &_status, MTPBool _inactive) {
+	return MTPuser(new MTPDuserSelf(_id, _first_name, _last_name, _username, _phone, _photo, _status, _inactive));
 }
-inline MTPuser MTP_userContact(MTPint _id, const MTPstring &_first_name, const MTPstring &_last_name, const MTPlong &_access_hash, const MTPstring &_phone, const MTPUserProfilePhoto &_photo, const MTPUserStatus &_status) {
-	return MTPuser(new MTPDuserContact(_id, _first_name, _last_name, _access_hash, _phone, _photo, _status));
+inline MTPuser MTP_userContact(MTPint _id, const MTPstring &_first_name, const MTPstring &_last_name, const MTPstring &_username, const MTPlong &_access_hash, const MTPstring &_phone, const MTPUserProfilePhoto &_photo, const MTPUserStatus &_status) {
+	return MTPuser(new MTPDuserContact(_id, _first_name, _last_name, _username, _access_hash, _phone, _photo, _status));
 }
-inline MTPuser MTP_userRequest(MTPint _id, const MTPstring &_first_name, const MTPstring &_last_name, const MTPlong &_access_hash, const MTPstring &_phone, const MTPUserProfilePhoto &_photo, const MTPUserStatus &_status) {
-	return MTPuser(new MTPDuserRequest(_id, _first_name, _last_name, _access_hash, _phone, _photo, _status));
+inline MTPuser MTP_userRequest(MTPint _id, const MTPstring &_first_name, const MTPstring &_last_name, const MTPstring &_username, const MTPlong &_access_hash, const MTPstring &_phone, const MTPUserProfilePhoto &_photo, const MTPUserStatus &_status) {
+	return MTPuser(new MTPDuserRequest(_id, _first_name, _last_name, _username, _access_hash, _phone, _photo, _status));
 }
-inline MTPuser MTP_userForeign(MTPint _id, const MTPstring &_first_name, const MTPstring &_last_name, const MTPlong &_access_hash, const MTPUserProfilePhoto &_photo, const MTPUserStatus &_status) {
-	return MTPuser(new MTPDuserForeign(_id, _first_name, _last_name, _access_hash, _photo, _status));
+inline MTPuser MTP_userForeign(MTPint _id, const MTPstring &_first_name, const MTPstring &_last_name, const MTPstring &_username, const MTPlong &_access_hash, const MTPUserProfilePhoto &_photo, const MTPUserStatus &_status) {
+	return MTPuser(new MTPDuserForeign(_id, _first_name, _last_name, _username, _access_hash, _photo, _status));
 }
-inline MTPuser MTP_userDeleted(MTPint _id, const MTPstring &_first_name, const MTPstring &_last_name) {
-	return MTPuser(new MTPDuserDeleted(_id, _first_name, _last_name));
+inline MTPuser MTP_userDeleted(MTPint _id, const MTPstring &_first_name, const MTPstring &_last_name, const MTPstring &_username) {
+	return MTPuser(new MTPDuserDeleted(_id, _first_name, _last_name, _username));
 }
 
 inline uint32 MTPuserProfilePhoto::size() const {
@@ -16791,15 +16700,15 @@ inline uint32 MTPmessage::size() const {
 		}
 		case mtpc_message: {
 			const MTPDmessage &v(c_message());
-			return v.vid.size() + v.vfrom_id.size() + v.vto_id.size() + v.vout.size() + v.vunread.size() + v.vdate.size() + v.vmessage.size() + v.vmedia.size();
+			return v.vflags.size() + v.vid.size() + v.vfrom_id.size() + v.vto_id.size() + v.vdate.size() + v.vmessage.size() + v.vmedia.size();
 		}
 		case mtpc_messageForwarded: {
 			const MTPDmessageForwarded &v(c_messageForwarded());
-			return v.vid.size() + v.vfwd_from_id.size() + v.vfwd_date.size() + v.vfrom_id.size() + v.vto_id.size() + v.vout.size() + v.vunread.size() + v.vdate.size() + v.vmessage.size() + v.vmedia.size();
+			return v.vflags.size() + v.vid.size() + v.vfwd_from_id.size() + v.vfwd_date.size() + v.vfrom_id.size() + v.vto_id.size() + v.vdate.size() + v.vmessage.size() + v.vmedia.size();
 		}
 		case mtpc_messageService: {
 			const MTPDmessageService &v(c_messageService());
-			return v.vid.size() + v.vfrom_id.size() + v.vto_id.size() + v.vout.size() + v.vunread.size() + v.vdate.size() + v.vaction.size();
+			return v.vflags.size() + v.vid.size() + v.vfrom_id.size() + v.vto_id.size() + v.vdate.size() + v.vaction.size();
 		}
 	}
 	return 0;
@@ -16819,11 +16728,10 @@ inline void MTPmessage::read(const mtpPrime *&from, const mtpPrime *end, mtpType
 		case mtpc_message: _type = cons; {
 			if (!data) setData(new MTPDmessage());
 			MTPDmessage &v(_message());
+			v.vflags.read(from, end);
 			v.vid.read(from, end);
 			v.vfrom_id.read(from, end);
 			v.vto_id.read(from, end);
-			v.vout.read(from, end);
-			v.vunread.read(from, end);
 			v.vdate.read(from, end);
 			v.vmessage.read(from, end);
 			v.vmedia.read(from, end);
@@ -16831,13 +16739,12 @@ inline void MTPmessage::read(const mtpPrime *&from, const mtpPrime *end, mtpType
 		case mtpc_messageForwarded: _type = cons; {
 			if (!data) setData(new MTPDmessageForwarded());
 			MTPDmessageForwarded &v(_messageForwarded());
+			v.vflags.read(from, end);
 			v.vid.read(from, end);
 			v.vfwd_from_id.read(from, end);
 			v.vfwd_date.read(from, end);
 			v.vfrom_id.read(from, end);
 			v.vto_id.read(from, end);
-			v.vout.read(from, end);
-			v.vunread.read(from, end);
 			v.vdate.read(from, end);
 			v.vmessage.read(from, end);
 			v.vmedia.read(from, end);
@@ -16845,11 +16752,10 @@ inline void MTPmessage::read(const mtpPrime *&from, const mtpPrime *end, mtpType
 		case mtpc_messageService: _type = cons; {
 			if (!data) setData(new MTPDmessageService());
 			MTPDmessageService &v(_messageService());
+			v.vflags.read(from, end);
 			v.vid.read(from, end);
 			v.vfrom_id.read(from, end);
 			v.vto_id.read(from, end);
-			v.vout.read(from, end);
-			v.vunread.read(from, end);
 			v.vdate.read(from, end);
 			v.vaction.read(from, end);
 		} break;
@@ -16864,35 +16770,32 @@ inline void MTPmessage::write(mtpBuffer &to) const {
 		} break;
 		case mtpc_message: {
 			const MTPDmessage &v(c_message());
+			v.vflags.write(to);
 			v.vid.write(to);
 			v.vfrom_id.write(to);
 			v.vto_id.write(to);
-			v.vout.write(to);
-			v.vunread.write(to);
 			v.vdate.write(to);
 			v.vmessage.write(to);
 			v.vmedia.write(to);
 		} break;
 		case mtpc_messageForwarded: {
 			const MTPDmessageForwarded &v(c_messageForwarded());
+			v.vflags.write(to);
 			v.vid.write(to);
 			v.vfwd_from_id.write(to);
 			v.vfwd_date.write(to);
 			v.vfrom_id.write(to);
 			v.vto_id.write(to);
-			v.vout.write(to);
-			v.vunread.write(to);
 			v.vdate.write(to);
 			v.vmessage.write(to);
 			v.vmedia.write(to);
 		} break;
 		case mtpc_messageService: {
 			const MTPDmessageService &v(c_messageService());
+			v.vflags.write(to);
 			v.vid.write(to);
 			v.vfrom_id.write(to);
 			v.vto_id.write(to);
-			v.vout.write(to);
-			v.vunread.write(to);
 			v.vdate.write(to);
 			v.vaction.write(to);
 		} break;
@@ -16918,14 +16821,14 @@ inline MTPmessage::MTPmessage(MTPDmessageService *_data) : mtpDataOwner(_data),
 inline MTPmessage MTP_messageEmpty(MTPint _id) {
 	return MTPmessage(new MTPDmessageEmpty(_id));
 }
-inline MTPmessage MTP_message(MTPint _id, MTPint _from_id, const MTPPeer &_to_id, MTPBool _out, MTPBool _unread, MTPint _date, const MTPstring &_message, const MTPMessageMedia &_media) {
-	return MTPmessage(new MTPDmessage(_id, _from_id, _to_id, _out, _unread, _date, _message, _media));
+inline MTPmessage MTP_message(MTPint _flags, MTPint _id, MTPint _from_id, const MTPPeer &_to_id, MTPint _date, const MTPstring &_message, const MTPMessageMedia &_media) {
+	return MTPmessage(new MTPDmessage(_flags, _id, _from_id, _to_id, _date, _message, _media));
 }
-inline MTPmessage MTP_messageForwarded(MTPint _id, MTPint _fwd_from_id, MTPint _fwd_date, MTPint _from_id, const MTPPeer &_to_id, MTPBool _out, MTPBool _unread, MTPint _date, const MTPstring &_message, const MTPMessageMedia &_media) {
-	return MTPmessage(new MTPDmessageForwarded(_id, _fwd_from_id, _fwd_date, _from_id, _to_id, _out, _unread, _date, _message, _media));
+inline MTPmessage MTP_messageForwarded(MTPint _flags, MTPint _id, MTPint _fwd_from_id, MTPint _fwd_date, MTPint _from_id, const MTPPeer &_to_id, MTPint _date, const MTPstring &_message, const MTPMessageMedia &_media) {
+	return MTPmessage(new MTPDmessageForwarded(_flags, _id, _fwd_from_id, _fwd_date, _from_id, _to_id, _date, _message, _media));
 }
-inline MTPmessage MTP_messageService(MTPint _id, MTPint _from_id, const MTPPeer &_to_id, MTPBool _out, MTPBool _unread, MTPint _date, const MTPMessageAction &_action) {
-	return MTPmessage(new MTPDmessageService(_id, _from_id, _to_id, _out, _unread, _date, _action));
+inline MTPmessage MTP_messageService(MTPint _flags, MTPint _id, MTPint _from_id, const MTPPeer &_to_id, MTPint _date, const MTPMessageAction &_action) {
+	return MTPmessage(new MTPDmessageService(_flags, _id, _from_id, _to_id, _date, _action));
 }
 
 inline uint32 MTPmessageMedia::size() const {
@@ -17626,38 +17529,80 @@ inline MTPauth_checkedPhone MTP_auth_checkedPhone(MTPBool _phone_registered, MTP
 	return MTPauth_checkedPhone(new MTPDauth_checkedPhone(_phone_registered, _phone_invited));
 }
 
-inline MTPauth_sentCode::MTPauth_sentCode() : mtpDataOwner(new MTPDauth_sentCode()) {
-}
-
 inline uint32 MTPauth_sentCode::size() const {
-	const MTPDauth_sentCode &v(c_auth_sentCode());
-	return v.vphone_registered.size() + v.vphone_code_hash.size() + v.vsend_call_timeout.size() + v.vis_password.size();
+	switch (_type) {
+		case mtpc_auth_sentCode: {
+			const MTPDauth_sentCode &v(c_auth_sentCode());
+			return v.vphone_registered.size() + v.vphone_code_hash.size() + v.vsend_call_timeout.size() + v.vis_password.size();
+		}
+		case mtpc_auth_sentAppCode: {
+			const MTPDauth_sentAppCode &v(c_auth_sentAppCode());
+			return v.vphone_registered.size() + v.vphone_code_hash.size() + v.vsend_call_timeout.size() + v.vis_password.size();
+		}
+	}
+	return 0;
 }
 inline mtpTypeId MTPauth_sentCode::type() const {
-	return mtpc_auth_sentCode;
+	if (!_type) throw mtpErrorUninitialized();
+	return _type;
 }
 inline void MTPauth_sentCode::read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons) {
-	if (cons != mtpc_auth_sentCode) throw mtpErrorUnexpected(cons, "MTPauth_sentCode");
-
-	if (!data) setData(new MTPDauth_sentCode());
-	MTPDauth_sentCode &v(_auth_sentCode());
-	v.vphone_registered.read(from, end);
-	v.vphone_code_hash.read(from, end);
-	v.vsend_call_timeout.read(from, end);
-	v.vis_password.read(from, end);
+	if (cons != _type) setData(0);
+	switch (cons) {
+		case mtpc_auth_sentCode: _type = cons; {
+			if (!data) setData(new MTPDauth_sentCode());
+			MTPDauth_sentCode &v(_auth_sentCode());
+			v.vphone_registered.read(from, end);
+			v.vphone_code_hash.read(from, end);
+			v.vsend_call_timeout.read(from, end);
+			v.vis_password.read(from, end);
+		} break;
+		case mtpc_auth_sentAppCode: _type = cons; {
+			if (!data) setData(new MTPDauth_sentAppCode());
+			MTPDauth_sentAppCode &v(_auth_sentAppCode());
+			v.vphone_registered.read(from, end);
+			v.vphone_code_hash.read(from, end);
+			v.vsend_call_timeout.read(from, end);
+			v.vis_password.read(from, end);
+		} break;
+		default: throw mtpErrorUnexpected(cons, "MTPauth_sentCode");
+	}
 }
 inline void MTPauth_sentCode::write(mtpBuffer &to) const {
-	const MTPDauth_sentCode &v(c_auth_sentCode());
-	v.vphone_registered.write(to);
-	v.vphone_code_hash.write(to);
-	v.vsend_call_timeout.write(to);
-	v.vis_password.write(to);
+	switch (_type) {
+		case mtpc_auth_sentCode: {
+			const MTPDauth_sentCode &v(c_auth_sentCode());
+			v.vphone_registered.write(to);
+			v.vphone_code_hash.write(to);
+			v.vsend_call_timeout.write(to);
+			v.vis_password.write(to);
+		} break;
+		case mtpc_auth_sentAppCode: {
+			const MTPDauth_sentAppCode &v(c_auth_sentAppCode());
+			v.vphone_registered.write(to);
+			v.vphone_code_hash.write(to);
+			v.vsend_call_timeout.write(to);
+			v.vis_password.write(to);
+		} break;
+	}
 }
-inline MTPauth_sentCode::MTPauth_sentCode(MTPDauth_sentCode *_data) : mtpDataOwner(_data) {
+inline MTPauth_sentCode::MTPauth_sentCode(mtpTypeId type) : mtpDataOwner(0), _type(type) {
+	switch (type) {
+		case mtpc_auth_sentCode: setData(new MTPDauth_sentCode()); break;
+		case mtpc_auth_sentAppCode: setData(new MTPDauth_sentAppCode()); break;
+		default: throw mtpErrorBadTypeId(type, "MTPauth_sentCode");
+	}
+}
+inline MTPauth_sentCode::MTPauth_sentCode(MTPDauth_sentCode *_data) : mtpDataOwner(_data), _type(mtpc_auth_sentCode) {
+}
+inline MTPauth_sentCode::MTPauth_sentCode(MTPDauth_sentAppCode *_data) : mtpDataOwner(_data), _type(mtpc_auth_sentAppCode) {
 }
 inline MTPauth_sentCode MTP_auth_sentCode(MTPBool _phone_registered, const MTPstring &_phone_code_hash, MTPint _send_call_timeout, MTPBool _is_password) {
 	return MTPauth_sentCode(new MTPDauth_sentCode(_phone_registered, _phone_code_hash, _send_call_timeout, _is_password));
 }
+inline MTPauth_sentCode MTP_auth_sentAppCode(MTPBool _phone_registered, const MTPstring &_phone_code_hash, MTPint _send_call_timeout, MTPBool _is_password) {
+	return MTPauth_sentCode(new MTPDauth_sentAppCode(_phone_registered, _phone_code_hash, _send_call_timeout, _is_password));
+}
 
 inline MTPauth_authorization::MTPauth_authorization() : mtpDataOwner(new MTPDauth_authorization()) {
 }
@@ -18148,33 +18093,6 @@ inline MTPcontactBlocked MTP_contactBlocked(MTPint _user_id, MTPint _date) {
 	return MTPcontactBlocked(new MTPDcontactBlocked(_user_id, _date));
 }
 
-inline MTPcontactFound::MTPcontactFound() : mtpDataOwner(new MTPDcontactFound()) {
-}
-
-inline uint32 MTPcontactFound::size() const {
-	const MTPDcontactFound &v(c_contactFound());
-	return v.vuser_id.size();
-}
-inline mtpTypeId MTPcontactFound::type() const {
-	return mtpc_contactFound;
-}
-inline void MTPcontactFound::read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons) {
-	if (cons != mtpc_contactFound) throw mtpErrorUnexpected(cons, "MTPcontactFound");
-
-	if (!data) setData(new MTPDcontactFound());
-	MTPDcontactFound &v(_contactFound());
-	v.vuser_id.read(from, end);
-}
-inline void MTPcontactFound::write(mtpBuffer &to) const {
-	const MTPDcontactFound &v(c_contactFound());
-	v.vuser_id.write(to);
-}
-inline MTPcontactFound::MTPcontactFound(MTPDcontactFound *_data) : mtpDataOwner(_data) {
-}
-inline MTPcontactFound MTP_contactFound(MTPint _user_id) {
-	return MTPcontactFound(new MTPDcontactFound(_user_id));
-}
-
 inline MTPcontactSuggested::MTPcontactSuggested() : mtpDataOwner(new MTPDcontactSuggested()) {
 }
 
@@ -18552,35 +18470,6 @@ inline MTPcontacts_blocked MTP_contacts_blockedSlice(MTPint _count, const MTPVec
 	return MTPcontacts_blocked(new MTPDcontacts_blockedSlice(_count, _blocked, _users));
 }
 
-inline MTPcontacts_found::MTPcontacts_found() : mtpDataOwner(new MTPDcontacts_found()) {
-}
-
-inline uint32 MTPcontacts_found::size() const {
-	const MTPDcontacts_found &v(c_contacts_found());
-	return v.vresults.size() + v.vusers.size();
-}
-inline mtpTypeId MTPcontacts_found::type() const {
-	return mtpc_contacts_found;
-}
-inline void MTPcontacts_found::read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons) {
-	if (cons != mtpc_contacts_found) throw mtpErrorUnexpected(cons, "MTPcontacts_found");
-
-	if (!data) setData(new MTPDcontacts_found());
-	MTPDcontacts_found &v(_contacts_found());
-	v.vresults.read(from, end);
-	v.vusers.read(from, end);
-}
-inline void MTPcontacts_found::write(mtpBuffer &to) const {
-	const MTPDcontacts_found &v(c_contacts_found());
-	v.vresults.write(to);
-	v.vusers.write(to);
-}
-inline MTPcontacts_found::MTPcontacts_found(MTPDcontacts_found *_data) : mtpDataOwner(_data) {
-}
-inline MTPcontacts_found MTP_contacts_found(const MTPVector<MTPContactFound> &_results, const MTPVector<MTPUser> &_users) {
-	return MTPcontacts_found(new MTPDcontacts_found(_results, _users));
-}
-
 inline MTPcontacts_suggested::MTPcontacts_suggested() : mtpDataOwner(new MTPDcontacts_suggested()) {
 }
 
@@ -19248,11 +19137,11 @@ inline uint32 MTPupdate::size() const {
 		}
 		case mtpc_updateUserTyping: {
 			const MTPDupdateUserTyping &v(c_updateUserTyping());
-			return v.vuser_id.size();
+			return v.vuser_id.size() + v.vaction.size();
 		}
 		case mtpc_updateChatUserTyping: {
 			const MTPDupdateChatUserTyping &v(c_updateChatUserTyping());
-			return v.vchat_id.size() + v.vuser_id.size();
+			return v.vchat_id.size() + v.vuser_id.size() + v.vaction.size();
 		}
 		case mtpc_updateChatParticipants: {
 			const MTPDupdateChatParticipants &v(c_updateChatParticipants());
@@ -19264,7 +19153,7 @@ inline uint32 MTPupdate::size() const {
 		}
 		case mtpc_updateUserName: {
 			const MTPDupdateUserName &v(c_updateUserName());
-			return v.vuser_id.size() + v.vfirst_name.size() + v.vlast_name.size();
+			return v.vuser_id.size() + v.vfirst_name.size() + v.vlast_name.size() + v.vusername.size();
 		}
 		case mtpc_updateUserPhoto: {
 			const MTPDupdateUserPhoto &v(c_updateUserPhoto());
@@ -19326,6 +19215,10 @@ inline uint32 MTPupdate::size() const {
 			const MTPDupdateNotifySettings &v(c_updateNotifySettings());
 			return v.vpeer.size() + v.vnotify_settings.size();
 		}
+		case mtpc_updateServiceNotification: {
+			const MTPDupdateServiceNotification &v(c_updateServiceNotification());
+			return v.vtype.size() + v.vmessage.size() + v.vmedia.size() + v.vpopup.size();
+		}
 	}
 	return 0;
 }
@@ -19370,12 +19263,14 @@ inline void MTPupdate::read(const mtpPrime *&from, const mtpPrime *end, mtpTypeI
 			if (!data) setData(new MTPDupdateUserTyping());
 			MTPDupdateUserTyping &v(_updateUserTyping());
 			v.vuser_id.read(from, end);
+			v.vaction.read(from, end);
 		} break;
 		case mtpc_updateChatUserTyping: _type = cons; {
 			if (!data) setData(new MTPDupdateChatUserTyping());
 			MTPDupdateChatUserTyping &v(_updateChatUserTyping());
 			v.vchat_id.read(from, end);
 			v.vuser_id.read(from, end);
+			v.vaction.read(from, end);
 		} break;
 		case mtpc_updateChatParticipants: _type = cons; {
 			if (!data) setData(new MTPDupdateChatParticipants());
@@ -19394,6 +19289,7 @@ inline void MTPupdate::read(const mtpPrime *&from, const mtpPrime *end, mtpTypeI
 			v.vuser_id.read(from, end);
 			v.vfirst_name.read(from, end);
 			v.vlast_name.read(from, end);
+			v.vusername.read(from, end);
 		} break;
 		case mtpc_updateUserPhoto: _type = cons; {
 			if (!data) setData(new MTPDupdateUserPhoto());
@@ -19490,6 +19386,14 @@ inline void MTPupdate::read(const mtpPrime *&from, const mtpPrime *end, mtpTypeI
 			v.vpeer.read(from, end);
 			v.vnotify_settings.read(from, end);
 		} break;
+		case mtpc_updateServiceNotification: _type = cons; {
+			if (!data) setData(new MTPDupdateServiceNotification());
+			MTPDupdateServiceNotification &v(_updateServiceNotification());
+			v.vtype.read(from, end);
+			v.vmessage.read(from, end);
+			v.vmedia.read(from, end);
+			v.vpopup.read(from, end);
+		} break;
 		default: throw mtpErrorUnexpected(cons, "MTPupdate");
 	}
 }
@@ -19523,11 +19427,13 @@ inline void MTPupdate::write(mtpBuffer &to) const {
 		case mtpc_updateUserTyping: {
 			const MTPDupdateUserTyping &v(c_updateUserTyping());
 			v.vuser_id.write(to);
+			v.vaction.write(to);
 		} break;
 		case mtpc_updateChatUserTyping: {
 			const MTPDupdateChatUserTyping &v(c_updateChatUserTyping());
 			v.vchat_id.write(to);
 			v.vuser_id.write(to);
+			v.vaction.write(to);
 		} break;
 		case mtpc_updateChatParticipants: {
 			const MTPDupdateChatParticipants &v(c_updateChatParticipants());
@@ -19543,6 +19449,7 @@ inline void MTPupdate::write(mtpBuffer &to) const {
 			v.vuser_id.write(to);
 			v.vfirst_name.write(to);
 			v.vlast_name.write(to);
+			v.vusername.write(to);
 		} break;
 		case mtpc_updateUserPhoto: {
 			const MTPDupdateUserPhoto &v(c_updateUserPhoto());
@@ -19624,6 +19531,13 @@ inline void MTPupdate::write(mtpBuffer &to) const {
 			v.vpeer.write(to);
 			v.vnotify_settings.write(to);
 		} break;
+		case mtpc_updateServiceNotification: {
+			const MTPDupdateServiceNotification &v(c_updateServiceNotification());
+			v.vtype.write(to);
+			v.vmessage.write(to);
+			v.vmedia.write(to);
+			v.vpopup.write(to);
+		} break;
 	}
 }
 inline MTPupdate::MTPupdate(mtpTypeId type) : mtpDataOwner(0), _type(type) {
@@ -19653,6 +19567,7 @@ inline MTPupdate::MTPupdate(mtpTypeId type) : mtpDataOwner(0), _type(type) {
 		case mtpc_updateDcOptions: setData(new MTPDupdateDcOptions()); break;
 		case mtpc_updateUserBlocked: setData(new MTPDupdateUserBlocked()); break;
 		case mtpc_updateNotifySettings: setData(new MTPDupdateNotifySettings()); break;
+		case mtpc_updateServiceNotification: setData(new MTPDupdateServiceNotification()); break;
 		default: throw mtpErrorBadTypeId(type, "MTPupdate");
 	}
 }
@@ -19706,6 +19621,8 @@ inline MTPupdate::MTPupdate(MTPDupdateUserBlocked *_data) : mtpDataOwner(_data),
 }
 inline MTPupdate::MTPupdate(MTPDupdateNotifySettings *_data) : mtpDataOwner(_data), _type(mtpc_updateNotifySettings) {
 }
+inline MTPupdate::MTPupdate(MTPDupdateServiceNotification *_data) : mtpDataOwner(_data), _type(mtpc_updateServiceNotification) {
+}
 inline MTPupdate MTP_updateNewMessage(const MTPMessage &_message, MTPint _pts) {
 	return MTPupdate(new MTPDupdateNewMessage(_message, _pts));
 }
@@ -19721,11 +19638,11 @@ inline MTPupdate MTP_updateDeleteMessages(const MTPVector<MTPint> &_messages, MT
 inline MTPupdate MTP_updateRestoreMessages(const MTPVector<MTPint> &_messages, MTPint _pts) {
 	return MTPupdate(new MTPDupdateRestoreMessages(_messages, _pts));
 }
-inline MTPupdate MTP_updateUserTyping(MTPint _user_id) {
-	return MTPupdate(new MTPDupdateUserTyping(_user_id));
+inline MTPupdate MTP_updateUserTyping(MTPint _user_id, const MTPSendMessageAction &_action) {
+	return MTPupdate(new MTPDupdateUserTyping(_user_id, _action));
 }
-inline MTPupdate MTP_updateChatUserTyping(MTPint _chat_id, MTPint _user_id) {
-	return MTPupdate(new MTPDupdateChatUserTyping(_chat_id, _user_id));
+inline MTPupdate MTP_updateChatUserTyping(MTPint _chat_id, MTPint _user_id, const MTPSendMessageAction &_action) {
+	return MTPupdate(new MTPDupdateChatUserTyping(_chat_id, _user_id, _action));
 }
 inline MTPupdate MTP_updateChatParticipants(const MTPChatParticipants &_participants) {
 	return MTPupdate(new MTPDupdateChatParticipants(_participants));
@@ -19733,8 +19650,8 @@ inline MTPupdate MTP_updateChatParticipants(const MTPChatParticipants &_particip
 inline MTPupdate MTP_updateUserStatus(MTPint _user_id, const MTPUserStatus &_status) {
 	return MTPupdate(new MTPDupdateUserStatus(_user_id, _status));
 }
-inline MTPupdate MTP_updateUserName(MTPint _user_id, const MTPstring &_first_name, const MTPstring &_last_name) {
-	return MTPupdate(new MTPDupdateUserName(_user_id, _first_name, _last_name));
+inline MTPupdate MTP_updateUserName(MTPint _user_id, const MTPstring &_first_name, const MTPstring &_last_name, const MTPstring &_username) {
+	return MTPupdate(new MTPDupdateUserName(_user_id, _first_name, _last_name, _username));
 }
 inline MTPupdate MTP_updateUserPhoto(MTPint _user_id, MTPint _date, const MTPUserProfilePhoto &_photo, MTPBool _previous) {
 	return MTPupdate(new MTPDupdateUserPhoto(_user_id, _date, _photo, _previous));
@@ -19781,6 +19698,9 @@ inline MTPupdate MTP_updateUserBlocked(MTPint _user_id, MTPBool _blocked) {
 inline MTPupdate MTP_updateNotifySettings(const MTPNotifyPeer &_peer, const MTPPeerNotifySettings &_notify_settings) {
 	return MTPupdate(new MTPDupdateNotifySettings(_peer, _notify_settings));
 }
+inline MTPupdate MTP_updateServiceNotification(const MTPstring &_type, const MTPstring &_message, const MTPMessageMedia &_media, MTPBool _popup) {
+	return MTPupdate(new MTPDupdateServiceNotification(_type, _message, _media, _popup));
+}
 
 inline MTPupdates_state::MTPupdates_state() : mtpDataOwner(new MTPDupdates_state()) {
 }
@@ -21082,439 +21002,6 @@ inline MTPencryptedMessage MTP_encryptedMessageService(const MTPlong &_random_id
 	return MTPencryptedMessage(new MTPDencryptedMessageService(_random_id, _chat_id, _date, _bytes));
 }
 
-inline MTPdecryptedMessageLayer::MTPdecryptedMessageLayer() : mtpDataOwner(new MTPDdecryptedMessageLayer()) {
-}
-
-inline uint32 MTPdecryptedMessageLayer::size() const {
-	const MTPDdecryptedMessageLayer &v(c_decryptedMessageLayer());
-	return v.vlayer.size() + v.vmessage.size();
-}
-inline mtpTypeId MTPdecryptedMessageLayer::type() const {
-	return mtpc_decryptedMessageLayer;
-}
-inline void MTPdecryptedMessageLayer::read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons) {
-	if (cons != mtpc_decryptedMessageLayer) throw mtpErrorUnexpected(cons, "MTPdecryptedMessageLayer");
-
-	if (!data) setData(new MTPDdecryptedMessageLayer());
-	MTPDdecryptedMessageLayer &v(_decryptedMessageLayer());
-	v.vlayer.read(from, end);
-	v.vmessage.read(from, end);
-}
-inline void MTPdecryptedMessageLayer::write(mtpBuffer &to) const {
-	const MTPDdecryptedMessageLayer &v(c_decryptedMessageLayer());
-	v.vlayer.write(to);
-	v.vmessage.write(to);
-}
-inline MTPdecryptedMessageLayer::MTPdecryptedMessageLayer(MTPDdecryptedMessageLayer *_data) : mtpDataOwner(_data) {
-}
-inline MTPdecryptedMessageLayer MTP_decryptedMessageLayer(MTPint _layer, const MTPDecryptedMessage &_message) {
-	return MTPdecryptedMessageLayer(new MTPDdecryptedMessageLayer(_layer, _message));
-}
-
-inline uint32 MTPdecryptedMessage::size() const {
-	switch (_type) {
-		case mtpc_decryptedMessage: {
-			const MTPDdecryptedMessage &v(c_decryptedMessage());
-			return v.vrandom_id.size() + v.vrandom_bytes.size() + v.vmessage.size() + v.vmedia.size();
-		}
-		case mtpc_decryptedMessageService: {
-			const MTPDdecryptedMessageService &v(c_decryptedMessageService());
-			return v.vrandom_id.size() + v.vrandom_bytes.size() + v.vaction.size();
-		}
-	}
-	return 0;
-}
-inline mtpTypeId MTPdecryptedMessage::type() const {
-	if (!_type) throw mtpErrorUninitialized();
-	return _type;
-}
-inline void MTPdecryptedMessage::read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons) {
-	if (cons != _type) setData(0);
-	switch (cons) {
-		case mtpc_decryptedMessage: _type = cons; {
-			if (!data) setData(new MTPDdecryptedMessage());
-			MTPDdecryptedMessage &v(_decryptedMessage());
-			v.vrandom_id.read(from, end);
-			v.vrandom_bytes.read(from, end);
-			v.vmessage.read(from, end);
-			v.vmedia.read(from, end);
-		} break;
-		case mtpc_decryptedMessageService: _type = cons; {
-			if (!data) setData(new MTPDdecryptedMessageService());
-			MTPDdecryptedMessageService &v(_decryptedMessageService());
-			v.vrandom_id.read(from, end);
-			v.vrandom_bytes.read(from, end);
-			v.vaction.read(from, end);
-		} break;
-		default: throw mtpErrorUnexpected(cons, "MTPdecryptedMessage");
-	}
-}
-inline void MTPdecryptedMessage::write(mtpBuffer &to) const {
-	switch (_type) {
-		case mtpc_decryptedMessage: {
-			const MTPDdecryptedMessage &v(c_decryptedMessage());
-			v.vrandom_id.write(to);
-			v.vrandom_bytes.write(to);
-			v.vmessage.write(to);
-			v.vmedia.write(to);
-		} break;
-		case mtpc_decryptedMessageService: {
-			const MTPDdecryptedMessageService &v(c_decryptedMessageService());
-			v.vrandom_id.write(to);
-			v.vrandom_bytes.write(to);
-			v.vaction.write(to);
-		} break;
-	}
-}
-inline MTPdecryptedMessage::MTPdecryptedMessage(mtpTypeId type) : mtpDataOwner(0), _type(type) {
-	switch (type) {
-		case mtpc_decryptedMessage: setData(new MTPDdecryptedMessage()); break;
-		case mtpc_decryptedMessageService: setData(new MTPDdecryptedMessageService()); break;
-		default: throw mtpErrorBadTypeId(type, "MTPdecryptedMessage");
-	}
-}
-inline MTPdecryptedMessage::MTPdecryptedMessage(MTPDdecryptedMessage *_data) : mtpDataOwner(_data), _type(mtpc_decryptedMessage) {
-}
-inline MTPdecryptedMessage::MTPdecryptedMessage(MTPDdecryptedMessageService *_data) : mtpDataOwner(_data), _type(mtpc_decryptedMessageService) {
-}
-inline MTPdecryptedMessage MTP_decryptedMessage(const MTPlong &_random_id, const MTPbytes &_random_bytes, const MTPstring &_message, const MTPDecryptedMessageMedia &_media) {
-	return MTPdecryptedMessage(new MTPDdecryptedMessage(_random_id, _random_bytes, _message, _media));
-}
-inline MTPdecryptedMessage MTP_decryptedMessageService(const MTPlong &_random_id, const MTPbytes &_random_bytes, const MTPDecryptedMessageAction &_action) {
-	return MTPdecryptedMessage(new MTPDdecryptedMessageService(_random_id, _random_bytes, _action));
-}
-
-inline uint32 MTPdecryptedMessageMedia::size() const {
-	switch (_type) {
-		case mtpc_decryptedMessageMediaPhoto: {
-			const MTPDdecryptedMessageMediaPhoto &v(c_decryptedMessageMediaPhoto());
-			return v.vthumb.size() + v.vthumb_w.size() + v.vthumb_h.size() + v.vw.size() + v.vh.size() + v.vsize.size() + v.vkey.size() + v.viv.size();
-		}
-		case mtpc_decryptedMessageMediaVideo: {
-			const MTPDdecryptedMessageMediaVideo &v(c_decryptedMessageMediaVideo());
-			return v.vthumb.size() + v.vthumb_w.size() + v.vthumb_h.size() + v.vduration.size() + v.vmime_type.size() + v.vw.size() + v.vh.size() + v.vsize.size() + v.vkey.size() + v.viv.size();
-		}
-		case mtpc_decryptedMessageMediaGeoPoint: {
-			const MTPDdecryptedMessageMediaGeoPoint &v(c_decryptedMessageMediaGeoPoint());
-			return v.vlat.size() + v.vlong.size();
-		}
-		case mtpc_decryptedMessageMediaContact: {
-			const MTPDdecryptedMessageMediaContact &v(c_decryptedMessageMediaContact());
-			return v.vphone_number.size() + v.vfirst_name.size() + v.vlast_name.size() + v.vuser_id.size();
-		}
-		case mtpc_decryptedMessageMediaDocument: {
-			const MTPDdecryptedMessageMediaDocument &v(c_decryptedMessageMediaDocument());
-			return v.vthumb.size() + v.vthumb_w.size() + v.vthumb_h.size() + v.vfile_name.size() + v.vmime_type.size() + v.vsize.size() + v.vkey.size() + v.viv.size();
-		}
-		case mtpc_decryptedMessageMediaAudio: {
-			const MTPDdecryptedMessageMediaAudio &v(c_decryptedMessageMediaAudio());
-			return v.vduration.size() + v.vmime_type.size() + v.vsize.size() + v.vkey.size() + v.viv.size();
-		}
-	}
-	return 0;
-}
-inline mtpTypeId MTPdecryptedMessageMedia::type() const {
-	if (!_type) throw mtpErrorUninitialized();
-	return _type;
-}
-inline void MTPdecryptedMessageMedia::read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons) {
-	if (cons != _type) setData(0);
-	switch (cons) {
-		case mtpc_decryptedMessageMediaEmpty: _type = cons; break;
-		case mtpc_decryptedMessageMediaPhoto: _type = cons; {
-			if (!data) setData(new MTPDdecryptedMessageMediaPhoto());
-			MTPDdecryptedMessageMediaPhoto &v(_decryptedMessageMediaPhoto());
-			v.vthumb.read(from, end);
-			v.vthumb_w.read(from, end);
-			v.vthumb_h.read(from, end);
-			v.vw.read(from, end);
-			v.vh.read(from, end);
-			v.vsize.read(from, end);
-			v.vkey.read(from, end);
-			v.viv.read(from, end);
-		} break;
-		case mtpc_decryptedMessageMediaVideo: _type = cons; {
-			if (!data) setData(new MTPDdecryptedMessageMediaVideo());
-			MTPDdecryptedMessageMediaVideo &v(_decryptedMessageMediaVideo());
-			v.vthumb.read(from, end);
-			v.vthumb_w.read(from, end);
-			v.vthumb_h.read(from, end);
-			v.vduration.read(from, end);
-			v.vmime_type.read(from, end);
-			v.vw.read(from, end);
-			v.vh.read(from, end);
-			v.vsize.read(from, end);
-			v.vkey.read(from, end);
-			v.viv.read(from, end);
-		} break;
-		case mtpc_decryptedMessageMediaGeoPoint: _type = cons; {
-			if (!data) setData(new MTPDdecryptedMessageMediaGeoPoint());
-			MTPDdecryptedMessageMediaGeoPoint &v(_decryptedMessageMediaGeoPoint());
-			v.vlat.read(from, end);
-			v.vlong.read(from, end);
-		} break;
-		case mtpc_decryptedMessageMediaContact: _type = cons; {
-			if (!data) setData(new MTPDdecryptedMessageMediaContact());
-			MTPDdecryptedMessageMediaContact &v(_decryptedMessageMediaContact());
-			v.vphone_number.read(from, end);
-			v.vfirst_name.read(from, end);
-			v.vlast_name.read(from, end);
-			v.vuser_id.read(from, end);
-		} break;
-		case mtpc_decryptedMessageMediaDocument: _type = cons; {
-			if (!data) setData(new MTPDdecryptedMessageMediaDocument());
-			MTPDdecryptedMessageMediaDocument &v(_decryptedMessageMediaDocument());
-			v.vthumb.read(from, end);
-			v.vthumb_w.read(from, end);
-			v.vthumb_h.read(from, end);
-			v.vfile_name.read(from, end);
-			v.vmime_type.read(from, end);
-			v.vsize.read(from, end);
-			v.vkey.read(from, end);
-			v.viv.read(from, end);
-		} break;
-		case mtpc_decryptedMessageMediaAudio: _type = cons; {
-			if (!data) setData(new MTPDdecryptedMessageMediaAudio());
-			MTPDdecryptedMessageMediaAudio &v(_decryptedMessageMediaAudio());
-			v.vduration.read(from, end);
-			v.vmime_type.read(from, end);
-			v.vsize.read(from, end);
-			v.vkey.read(from, end);
-			v.viv.read(from, end);
-		} break;
-		default: throw mtpErrorUnexpected(cons, "MTPdecryptedMessageMedia");
-	}
-}
-inline void MTPdecryptedMessageMedia::write(mtpBuffer &to) const {
-	switch (_type) {
-		case mtpc_decryptedMessageMediaPhoto: {
-			const MTPDdecryptedMessageMediaPhoto &v(c_decryptedMessageMediaPhoto());
-			v.vthumb.write(to);
-			v.vthumb_w.write(to);
-			v.vthumb_h.write(to);
-			v.vw.write(to);
-			v.vh.write(to);
-			v.vsize.write(to);
-			v.vkey.write(to);
-			v.viv.write(to);
-		} break;
-		case mtpc_decryptedMessageMediaVideo: {
-			const MTPDdecryptedMessageMediaVideo &v(c_decryptedMessageMediaVideo());
-			v.vthumb.write(to);
-			v.vthumb_w.write(to);
-			v.vthumb_h.write(to);
-			v.vduration.write(to);
-			v.vmime_type.write(to);
-			v.vw.write(to);
-			v.vh.write(to);
-			v.vsize.write(to);
-			v.vkey.write(to);
-			v.viv.write(to);
-		} break;
-		case mtpc_decryptedMessageMediaGeoPoint: {
-			const MTPDdecryptedMessageMediaGeoPoint &v(c_decryptedMessageMediaGeoPoint());
-			v.vlat.write(to);
-			v.vlong.write(to);
-		} break;
-		case mtpc_decryptedMessageMediaContact: {
-			const MTPDdecryptedMessageMediaContact &v(c_decryptedMessageMediaContact());
-			v.vphone_number.write(to);
-			v.vfirst_name.write(to);
-			v.vlast_name.write(to);
-			v.vuser_id.write(to);
-		} break;
-		case mtpc_decryptedMessageMediaDocument: {
-			const MTPDdecryptedMessageMediaDocument &v(c_decryptedMessageMediaDocument());
-			v.vthumb.write(to);
-			v.vthumb_w.write(to);
-			v.vthumb_h.write(to);
-			v.vfile_name.write(to);
-			v.vmime_type.write(to);
-			v.vsize.write(to);
-			v.vkey.write(to);
-			v.viv.write(to);
-		} break;
-		case mtpc_decryptedMessageMediaAudio: {
-			const MTPDdecryptedMessageMediaAudio &v(c_decryptedMessageMediaAudio());
-			v.vduration.write(to);
-			v.vmime_type.write(to);
-			v.vsize.write(to);
-			v.vkey.write(to);
-			v.viv.write(to);
-		} break;
-	}
-}
-inline MTPdecryptedMessageMedia::MTPdecryptedMessageMedia(mtpTypeId type) : mtpDataOwner(0), _type(type) {
-	switch (type) {
-		case mtpc_decryptedMessageMediaEmpty: break;
-		case mtpc_decryptedMessageMediaPhoto: setData(new MTPDdecryptedMessageMediaPhoto()); break;
-		case mtpc_decryptedMessageMediaVideo: setData(new MTPDdecryptedMessageMediaVideo()); break;
-		case mtpc_decryptedMessageMediaGeoPoint: setData(new MTPDdecryptedMessageMediaGeoPoint()); break;
-		case mtpc_decryptedMessageMediaContact: setData(new MTPDdecryptedMessageMediaContact()); break;
-		case mtpc_decryptedMessageMediaDocument: setData(new MTPDdecryptedMessageMediaDocument()); break;
-		case mtpc_decryptedMessageMediaAudio: setData(new MTPDdecryptedMessageMediaAudio()); break;
-		default: throw mtpErrorBadTypeId(type, "MTPdecryptedMessageMedia");
-	}
-}
-inline MTPdecryptedMessageMedia::MTPdecryptedMessageMedia(MTPDdecryptedMessageMediaPhoto *_data) : mtpDataOwner(_data), _type(mtpc_decryptedMessageMediaPhoto) {
-}
-inline MTPdecryptedMessageMedia::MTPdecryptedMessageMedia(MTPDdecryptedMessageMediaVideo *_data) : mtpDataOwner(_data), _type(mtpc_decryptedMessageMediaVideo) {
-}
-inline MTPdecryptedMessageMedia::MTPdecryptedMessageMedia(MTPDdecryptedMessageMediaGeoPoint *_data) : mtpDataOwner(_data), _type(mtpc_decryptedMessageMediaGeoPoint) {
-}
-inline MTPdecryptedMessageMedia::MTPdecryptedMessageMedia(MTPDdecryptedMessageMediaContact *_data) : mtpDataOwner(_data), _type(mtpc_decryptedMessageMediaContact) {
-}
-inline MTPdecryptedMessageMedia::MTPdecryptedMessageMedia(MTPDdecryptedMessageMediaDocument *_data) : mtpDataOwner(_data), _type(mtpc_decryptedMessageMediaDocument) {
-}
-inline MTPdecryptedMessageMedia::MTPdecryptedMessageMedia(MTPDdecryptedMessageMediaAudio *_data) : mtpDataOwner(_data), _type(mtpc_decryptedMessageMediaAudio) {
-}
-inline MTPdecryptedMessageMedia MTP_decryptedMessageMediaEmpty() {
-	return MTPdecryptedMessageMedia(mtpc_decryptedMessageMediaEmpty);
-}
-inline MTPdecryptedMessageMedia MTP_decryptedMessageMediaPhoto(const MTPbytes &_thumb, MTPint _thumb_w, MTPint _thumb_h, MTPint _w, MTPint _h, MTPint _size, const MTPbytes &_key, const MTPbytes &_iv) {
-	return MTPdecryptedMessageMedia(new MTPDdecryptedMessageMediaPhoto(_thumb, _thumb_w, _thumb_h, _w, _h, _size, _key, _iv));
-}
-inline MTPdecryptedMessageMedia MTP_decryptedMessageMediaVideo(const MTPbytes &_thumb, MTPint _thumb_w, MTPint _thumb_h, MTPint _duration, const MTPstring &_mime_type, MTPint _w, MTPint _h, MTPint _size, const MTPbytes &_key, const MTPbytes &_iv) {
-	return MTPdecryptedMessageMedia(new MTPDdecryptedMessageMediaVideo(_thumb, _thumb_w, _thumb_h, _duration, _mime_type, _w, _h, _size, _key, _iv));
-}
-inline MTPdecryptedMessageMedia MTP_decryptedMessageMediaGeoPoint(const MTPdouble &_lat, const MTPdouble &_long) {
-	return MTPdecryptedMessageMedia(new MTPDdecryptedMessageMediaGeoPoint(_lat, _long));
-}
-inline MTPdecryptedMessageMedia MTP_decryptedMessageMediaContact(const MTPstring &_phone_number, const MTPstring &_first_name, const MTPstring &_last_name, MTPint _user_id) {
-	return MTPdecryptedMessageMedia(new MTPDdecryptedMessageMediaContact(_phone_number, _first_name, _last_name, _user_id));
-}
-inline MTPdecryptedMessageMedia MTP_decryptedMessageMediaDocument(const MTPbytes &_thumb, MTPint _thumb_w, MTPint _thumb_h, const MTPstring &_file_name, const MTPstring &_mime_type, MTPint _size, const MTPbytes &_key, const MTPbytes &_iv) {
-	return MTPdecryptedMessageMedia(new MTPDdecryptedMessageMediaDocument(_thumb, _thumb_w, _thumb_h, _file_name, _mime_type, _size, _key, _iv));
-}
-inline MTPdecryptedMessageMedia MTP_decryptedMessageMediaAudio(MTPint _duration, const MTPstring &_mime_type, MTPint _size, const MTPbytes &_key, const MTPbytes &_iv) {
-	return MTPdecryptedMessageMedia(new MTPDdecryptedMessageMediaAudio(_duration, _mime_type, _size, _key, _iv));
-}
-
-inline uint32 MTPdecryptedMessageAction::size() const {
-	switch (_type) {
-		case mtpc_decryptedMessageActionSetMessageTTL: {
-			const MTPDdecryptedMessageActionSetMessageTTL &v(c_decryptedMessageActionSetMessageTTL());
-			return v.vttl_seconds.size();
-		}
-		case mtpc_decryptedMessageActionReadMessages: {
-			const MTPDdecryptedMessageActionReadMessages &v(c_decryptedMessageActionReadMessages());
-			return v.vrandom_ids.size();
-		}
-		case mtpc_decryptedMessageActionDeleteMessages: {
-			const MTPDdecryptedMessageActionDeleteMessages &v(c_decryptedMessageActionDeleteMessages());
-			return v.vrandom_ids.size();
-		}
-		case mtpc_decryptedMessageActionScreenshotMessages: {
-			const MTPDdecryptedMessageActionScreenshotMessages &v(c_decryptedMessageActionScreenshotMessages());
-			return v.vrandom_ids.size();
-		}
-		case mtpc_decryptedMessageActionNotifyLayer: {
-			const MTPDdecryptedMessageActionNotifyLayer &v(c_decryptedMessageActionNotifyLayer());
-			return v.vlayer.size();
-		}
-	}
-	return 0;
-}
-inline mtpTypeId MTPdecryptedMessageAction::type() const {
-	if (!_type) throw mtpErrorUninitialized();
-	return _type;
-}
-inline void MTPdecryptedMessageAction::read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons) {
-	if (cons != _type) setData(0);
-	switch (cons) {
-		case mtpc_decryptedMessageActionSetMessageTTL: _type = cons; {
-			if (!data) setData(new MTPDdecryptedMessageActionSetMessageTTL());
-			MTPDdecryptedMessageActionSetMessageTTL &v(_decryptedMessageActionSetMessageTTL());
-			v.vttl_seconds.read(from, end);
-		} break;
-		case mtpc_decryptedMessageActionReadMessages: _type = cons; {
-			if (!data) setData(new MTPDdecryptedMessageActionReadMessages());
-			MTPDdecryptedMessageActionReadMessages &v(_decryptedMessageActionReadMessages());
-			v.vrandom_ids.read(from, end);
-		} break;
-		case mtpc_decryptedMessageActionDeleteMessages: _type = cons; {
-			if (!data) setData(new MTPDdecryptedMessageActionDeleteMessages());
-			MTPDdecryptedMessageActionDeleteMessages &v(_decryptedMessageActionDeleteMessages());
-			v.vrandom_ids.read(from, end);
-		} break;
-		case mtpc_decryptedMessageActionScreenshotMessages: _type = cons; {
-			if (!data) setData(new MTPDdecryptedMessageActionScreenshotMessages());
-			MTPDdecryptedMessageActionScreenshotMessages &v(_decryptedMessageActionScreenshotMessages());
-			v.vrandom_ids.read(from, end);
-		} break;
-		case mtpc_decryptedMessageActionFlushHistory: _type = cons; break;
-		case mtpc_decryptedMessageActionNotifyLayer: _type = cons; {
-			if (!data) setData(new MTPDdecryptedMessageActionNotifyLayer());
-			MTPDdecryptedMessageActionNotifyLayer &v(_decryptedMessageActionNotifyLayer());
-			v.vlayer.read(from, end);
-		} break;
-		default: throw mtpErrorUnexpected(cons, "MTPdecryptedMessageAction");
-	}
-}
-inline void MTPdecryptedMessageAction::write(mtpBuffer &to) const {
-	switch (_type) {
-		case mtpc_decryptedMessageActionSetMessageTTL: {
-			const MTPDdecryptedMessageActionSetMessageTTL &v(c_decryptedMessageActionSetMessageTTL());
-			v.vttl_seconds.write(to);
-		} break;
-		case mtpc_decryptedMessageActionReadMessages: {
-			const MTPDdecryptedMessageActionReadMessages &v(c_decryptedMessageActionReadMessages());
-			v.vrandom_ids.write(to);
-		} break;
-		case mtpc_decryptedMessageActionDeleteMessages: {
-			const MTPDdecryptedMessageActionDeleteMessages &v(c_decryptedMessageActionDeleteMessages());
-			v.vrandom_ids.write(to);
-		} break;
-		case mtpc_decryptedMessageActionScreenshotMessages: {
-			const MTPDdecryptedMessageActionScreenshotMessages &v(c_decryptedMessageActionScreenshotMessages());
-			v.vrandom_ids.write(to);
-		} break;
-		case mtpc_decryptedMessageActionNotifyLayer: {
-			const MTPDdecryptedMessageActionNotifyLayer &v(c_decryptedMessageActionNotifyLayer());
-			v.vlayer.write(to);
-		} break;
-	}
-}
-inline MTPdecryptedMessageAction::MTPdecryptedMessageAction(mtpTypeId type) : mtpDataOwner(0), _type(type) {
-	switch (type) {
-		case mtpc_decryptedMessageActionSetMessageTTL: setData(new MTPDdecryptedMessageActionSetMessageTTL()); break;
-		case mtpc_decryptedMessageActionReadMessages: setData(new MTPDdecryptedMessageActionReadMessages()); break;
-		case mtpc_decryptedMessageActionDeleteMessages: setData(new MTPDdecryptedMessageActionDeleteMessages()); break;
-		case mtpc_decryptedMessageActionScreenshotMessages: setData(new MTPDdecryptedMessageActionScreenshotMessages()); break;
-		case mtpc_decryptedMessageActionFlushHistory: break;
-		case mtpc_decryptedMessageActionNotifyLayer: setData(new MTPDdecryptedMessageActionNotifyLayer()); break;
-		default: throw mtpErrorBadTypeId(type, "MTPdecryptedMessageAction");
-	}
-}
-inline MTPdecryptedMessageAction::MTPdecryptedMessageAction(MTPDdecryptedMessageActionSetMessageTTL *_data) : mtpDataOwner(_data), _type(mtpc_decryptedMessageActionSetMessageTTL) {
-}
-inline MTPdecryptedMessageAction::MTPdecryptedMessageAction(MTPDdecryptedMessageActionReadMessages *_data) : mtpDataOwner(_data), _type(mtpc_decryptedMessageActionReadMessages) {
-}
-inline MTPdecryptedMessageAction::MTPdecryptedMessageAction(MTPDdecryptedMessageActionDeleteMessages *_data) : mtpDataOwner(_data), _type(mtpc_decryptedMessageActionDeleteMessages) {
-}
-inline MTPdecryptedMessageAction::MTPdecryptedMessageAction(MTPDdecryptedMessageActionScreenshotMessages *_data) : mtpDataOwner(_data), _type(mtpc_decryptedMessageActionScreenshotMessages) {
-}
-inline MTPdecryptedMessageAction::MTPdecryptedMessageAction(MTPDdecryptedMessageActionNotifyLayer *_data) : mtpDataOwner(_data), _type(mtpc_decryptedMessageActionNotifyLayer) {
-}
-inline MTPdecryptedMessageAction MTP_decryptedMessageActionSetMessageTTL(MTPint _ttl_seconds) {
-	return MTPdecryptedMessageAction(new MTPDdecryptedMessageActionSetMessageTTL(_ttl_seconds));
-}
-inline MTPdecryptedMessageAction MTP_decryptedMessageActionReadMessages(const MTPVector<MTPlong> &_random_ids) {
-	return MTPdecryptedMessageAction(new MTPDdecryptedMessageActionReadMessages(_random_ids));
-}
-inline MTPdecryptedMessageAction MTP_decryptedMessageActionDeleteMessages(const MTPVector<MTPlong> &_random_ids) {
-	return MTPdecryptedMessageAction(new MTPDdecryptedMessageActionDeleteMessages(_random_ids));
-}
-inline MTPdecryptedMessageAction MTP_decryptedMessageActionScreenshotMessages(const MTPVector<MTPlong> &_random_ids) {
-	return MTPdecryptedMessageAction(new MTPDdecryptedMessageActionScreenshotMessages(_random_ids));
-}
-inline MTPdecryptedMessageAction MTP_decryptedMessageActionFlushHistory() {
-	return MTPdecryptedMessageAction(mtpc_decryptedMessageActionFlushHistory);
-}
-inline MTPdecryptedMessageAction MTP_decryptedMessageActionNotifyLayer(MTPint _layer) {
-	return MTPdecryptedMessageAction(new MTPDdecryptedMessageActionNotifyLayer(_layer));
-}
-
 inline uint32 MTPmessages_dhConfig::size() const {
 	switch (_type) {
 		case mtpc_messages_dhConfigNotModified: {
@@ -21995,6 +21482,134 @@ inline MTPnotifyPeer MTP_notifyAll() {
 	return MTPnotifyPeer(mtpc_notifyAll);
 }
 
+inline uint32 MTPsendMessageAction::size() const {
+	return 0;
+}
+inline mtpTypeId MTPsendMessageAction::type() const {
+	if (!_type) throw mtpErrorUninitialized();
+	return _type;
+}
+inline void MTPsendMessageAction::read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons) {
+	switch (cons) {
+		case mtpc_sendMessageTypingAction: _type = cons; break;
+		case mtpc_sendMessageCancelAction: _type = cons; break;
+		case mtpc_sendMessageRecordVideoAction: _type = cons; break;
+		case mtpc_sendMessageUploadVideoAction: _type = cons; break;
+		case mtpc_sendMessageRecordAudioAction: _type = cons; break;
+		case mtpc_sendMessageUploadAudioAction: _type = cons; break;
+		case mtpc_sendMessageUploadPhotoAction: _type = cons; break;
+		case mtpc_sendMessageUploadDocumentAction: _type = cons; break;
+		case mtpc_sendMessageGeoLocationAction: _type = cons; break;
+		case mtpc_sendMessageChooseContactAction: _type = cons; break;
+		default: throw mtpErrorUnexpected(cons, "MTPsendMessageAction");
+	}
+}
+inline void MTPsendMessageAction::write(mtpBuffer &to) const {
+	switch (_type) {
+	}
+}
+inline MTPsendMessageAction::MTPsendMessageAction(mtpTypeId type) : _type(type) {
+	switch (type) {
+		case mtpc_sendMessageTypingAction: break;
+		case mtpc_sendMessageCancelAction: break;
+		case mtpc_sendMessageRecordVideoAction: break;
+		case mtpc_sendMessageUploadVideoAction: break;
+		case mtpc_sendMessageRecordAudioAction: break;
+		case mtpc_sendMessageUploadAudioAction: break;
+		case mtpc_sendMessageUploadPhotoAction: break;
+		case mtpc_sendMessageUploadDocumentAction: break;
+		case mtpc_sendMessageGeoLocationAction: break;
+		case mtpc_sendMessageChooseContactAction: break;
+		default: throw mtpErrorBadTypeId(type, "MTPsendMessageAction");
+	}
+}
+inline MTPsendMessageAction MTP_sendMessageTypingAction() {
+	return MTPsendMessageAction(mtpc_sendMessageTypingAction);
+}
+inline MTPsendMessageAction MTP_sendMessageCancelAction() {
+	return MTPsendMessageAction(mtpc_sendMessageCancelAction);
+}
+inline MTPsendMessageAction MTP_sendMessageRecordVideoAction() {
+	return MTPsendMessageAction(mtpc_sendMessageRecordVideoAction);
+}
+inline MTPsendMessageAction MTP_sendMessageUploadVideoAction() {
+	return MTPsendMessageAction(mtpc_sendMessageUploadVideoAction);
+}
+inline MTPsendMessageAction MTP_sendMessageRecordAudioAction() {
+	return MTPsendMessageAction(mtpc_sendMessageRecordAudioAction);
+}
+inline MTPsendMessageAction MTP_sendMessageUploadAudioAction() {
+	return MTPsendMessageAction(mtpc_sendMessageUploadAudioAction);
+}
+inline MTPsendMessageAction MTP_sendMessageUploadPhotoAction() {
+	return MTPsendMessageAction(mtpc_sendMessageUploadPhotoAction);
+}
+inline MTPsendMessageAction MTP_sendMessageUploadDocumentAction() {
+	return MTPsendMessageAction(mtpc_sendMessageUploadDocumentAction);
+}
+inline MTPsendMessageAction MTP_sendMessageGeoLocationAction() {
+	return MTPsendMessageAction(mtpc_sendMessageGeoLocationAction);
+}
+inline MTPsendMessageAction MTP_sendMessageChooseContactAction() {
+	return MTPsendMessageAction(mtpc_sendMessageChooseContactAction);
+}
+
+inline MTPcontactFound::MTPcontactFound() : mtpDataOwner(new MTPDcontactFound()) {
+}
+
+inline uint32 MTPcontactFound::size() const {
+	const MTPDcontactFound &v(c_contactFound());
+	return v.vuser_id.size();
+}
+inline mtpTypeId MTPcontactFound::type() const {
+	return mtpc_contactFound;
+}
+inline void MTPcontactFound::read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons) {
+	if (cons != mtpc_contactFound) throw mtpErrorUnexpected(cons, "MTPcontactFound");
+
+	if (!data) setData(new MTPDcontactFound());
+	MTPDcontactFound &v(_contactFound());
+	v.vuser_id.read(from, end);
+}
+inline void MTPcontactFound::write(mtpBuffer &to) const {
+	const MTPDcontactFound &v(c_contactFound());
+	v.vuser_id.write(to);
+}
+inline MTPcontactFound::MTPcontactFound(MTPDcontactFound *_data) : mtpDataOwner(_data) {
+}
+inline MTPcontactFound MTP_contactFound(MTPint _user_id) {
+	return MTPcontactFound(new MTPDcontactFound(_user_id));
+}
+
+inline MTPcontacts_found::MTPcontacts_found() : mtpDataOwner(new MTPDcontacts_found()) {
+}
+
+inline uint32 MTPcontacts_found::size() const {
+	const MTPDcontacts_found &v(c_contacts_found());
+	return v.vresults.size() + v.vusers.size();
+}
+inline mtpTypeId MTPcontacts_found::type() const {
+	return mtpc_contacts_found;
+}
+inline void MTPcontacts_found::read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons) {
+	if (cons != mtpc_contacts_found) throw mtpErrorUnexpected(cons, "MTPcontacts_found");
+
+	if (!data) setData(new MTPDcontacts_found());
+	MTPDcontacts_found &v(_contacts_found());
+	v.vresults.read(from, end);
+	v.vusers.read(from, end);
+}
+inline void MTPcontacts_found::write(mtpBuffer &to) const {
+	const MTPDcontacts_found &v(c_contacts_found());
+	v.vresults.write(to);
+	v.vusers.write(to);
+}
+inline MTPcontacts_found::MTPcontacts_found(MTPDcontacts_found *_data) : mtpDataOwner(_data) {
+}
+inline MTPcontacts_found MTP_contacts_found(const MTPVector<MTPContactFound> &_results, const MTPVector<MTPUser> &_users) {
+	return MTPcontacts_found(new MTPDcontacts_found(_results, _users));
+}
+
 // Human-readable text serialization
 #if (defined _DEBUG || defined _WITH_DEBUG)
 
diff --git a/Telegram/SourceFiles/mtproto/scheme.tl b/Telegram/SourceFiles/mtproto/scheme.tl
index 5afcae92d7..f4f9a7db56 100644
--- a/Telegram/SourceFiles/mtproto/scheme.tl
+++ b/Telegram/SourceFiles/mtproto/scheme.tl
@@ -31,6 +31,9 @@
 //invokeWithLayer13#427c8ea2 query:!X = X;
 //invokeWithLayer14#2b9b08fa query:!X = X;
 //invokeWithLayer15#b4418b64 query:!X = X;
+//invokeWithLayer16#cf5f0987 query:!X = X;
+//invokeWithLayer17#50858a19 query:!X = X;
+//invokeWithLayer18#1c900537 query:!X = X;
 
 ///////////////////////////////
 /// Authorization key creation
@@ -123,8 +126,6 @@ register.saveDeveloperInfo#9a5f6e95 name:string email:string phone_number:string
 
 ---types---
 
-
-
 inputPeerEmpty#7f3b18ea = InputPeer;
 inputPeerSelf#7da07ec9 = InputPeer;
 inputPeerContact#1023dbe8 user_id:int = InputPeer;
@@ -188,11 +189,11 @@ fileLocationUnavailable#7c596b46 volume_id:long local_id:int secret:long = FileL
 fileLocation#53d69076 dc_id:int volume_id:long local_id:int secret:long = FileLocation;
 
 userEmpty#200250ba id:int = User;
-userSelf#720535ec id:int first_name:string last_name:string phone:string photo:UserProfilePhoto status:UserStatus inactive:Bool = User;
-userContact#f2fb8319 id:int first_name:string last_name:string access_hash:long phone:string photo:UserProfilePhoto status:UserStatus = User;
-userRequest#22e8ceb0 id:int first_name:string last_name:string access_hash:long phone:string photo:UserProfilePhoto status:UserStatus = User;
-userForeign#5214c89d id:int first_name:string last_name:string access_hash:long photo:UserProfilePhoto status:UserStatus = User;
-userDeleted#b29ad7cc id:int first_name:string last_name:string = User;
+userSelf#7007b451 id:int first_name:string last_name:string username:string phone:string photo:UserProfilePhoto status:UserStatus inactive:Bool = User;
+userContact#cab35e18 id:int first_name:string last_name:string username:string access_hash:long phone:string photo:UserProfilePhoto status:UserStatus = User;
+userRequest#d9ccc4ef id:int first_name:string last_name:string username:string access_hash:long phone:string photo:UserProfilePhoto status:UserStatus = User;
+userForeign#75cf7a8 id:int first_name:string last_name:string username:string access_hash:long photo:UserProfilePhoto status:UserStatus = User;
+userDeleted#d6016d7a id:int first_name:string last_name:string username:string = User;
 
 userProfilePhotoEmpty#4f11bae1 = UserProfilePhoto;
 userProfilePhoto#d559d8c8 photo_id:long photo_small:FileLocation photo_big:FileLocation = UserProfilePhoto;
@@ -216,9 +217,9 @@ chatPhotoEmpty#37c1011c = ChatPhoto;
 chatPhoto#6153276a photo_small:FileLocation photo_big:FileLocation = ChatPhoto;
 
 messageEmpty#83e5de54 id:int = Message;
-message#22eb6aba id:int from_id:int to_id:Peer out:Bool unread:Bool date:int message:string media:MessageMedia = Message;
-messageForwarded#5f46804 id:int fwd_from_id:int fwd_date:int from_id:int to_id:Peer out:Bool unread:Bool date:int message:string media:MessageMedia = Message;
-messageService#9f8d60bb id:int from_id:int to_id:Peer out:Bool unread:Bool date:int action:MessageAction = Message;
+message#567699b3 flags:int id:int from_id:int to_id:Peer date:int message:string media:MessageMedia = Message;
+messageForwarded#a367e716 flags:int id:int fwd_from_id:int fwd_date:int from_id:int to_id:Peer date:int message:string media:MessageMedia = Message;
+messageService#1d86f70e flags:int id:int from_id:int to_id:Peer date:int action:MessageAction = Message;
 
 messageMediaEmpty#3ded6320 = MessageMedia;
 messageMediaPhoto#c8c45a2a photo:Photo = MessageMedia;
@@ -284,8 +285,6 @@ importedContact#d0028438 user_id:int client_id:long = ImportedContact;
 
 contactBlocked#561bc879 user_id:int date:int = ContactBlocked;
 
-contactFound#ea879f95 user_id:int = ContactFound;
-
 contactSuggested#3de191a1 user_id:int mutual_contacts:int = ContactSuggested;
 
 contactStatus#aa77b873 user_id:int expires:int = ContactStatus;
@@ -310,8 +309,6 @@ contacts.importedContacts#ad524315 imported:Vector<ImportedContact> retry_contac
 contacts.blocked#1c138d15 blocked:Vector<ContactBlocked> users:Vector<User> = contacts.Blocked;
 contacts.blockedSlice#900802a1 count:int blocked:Vector<ContactBlocked> users:Vector<User> = contacts.Blocked;
 
-contacts.found#566000e results:Vector<ContactFound> users:Vector<User> = contacts.Found;
-
 contacts.suggested#5649dcc5 results:Vector<ContactSuggested> users:Vector<User> = contacts.Suggested;
 
 messages.dialogs#15ba6c40 dialogs:Vector<Dialog> messages:Vector<Message> chats:Vector<Chat> users:Vector<User> = messages.Dialogs;
@@ -349,11 +346,11 @@ updateMessageID#4e90bfd6 id:int random_id:long = Update;
 updateReadMessages#c6649e31 messages:Vector<int> pts:int = Update;
 updateDeleteMessages#a92bfe26 messages:Vector<int> pts:int = Update;
 updateRestoreMessages#d15de04d messages:Vector<int> pts:int = Update;
-updateUserTyping#6baa8508 user_id:int = Update;
-updateChatUserTyping#3c46cfe6 chat_id:int user_id:int = Update;
+updateUserTyping#5c486927 user_id:int action:SendMessageAction = Update;
+updateChatUserTyping#9a65ea1f chat_id:int user_id:int action:SendMessageAction = Update;
 updateChatParticipants#7761198 participants:ChatParticipants = Update;
 updateUserStatus#1bfbd823 user_id:int status:UserStatus = Update;
-updateUserName#da22d9ad user_id:int first_name:string last_name:string = Update;
+updateUserName#a7332b73 user_id:int first_name:string last_name:string username:string = Update;
 updateUserPhoto#95313b0c user_id:int date:int photo:UserProfilePhoto previous:Bool = Update;
 updateContactRegistered#2575bbb9 user_id:int date:int = Update;
 updateContactLink#51a48a9a user_id:int my_link:contacts.MyLink foreign_link:contacts.ForeignLink = Update;
@@ -446,19 +443,6 @@ inputEncryptedFileLocation#f5235d55 id:long access_hash:long = InputFileLocation
 encryptedMessage#ed18c118 random_id:long chat_id:int date:int bytes:bytes file:EncryptedFile = EncryptedMessage;
 encryptedMessageService#23734b06 random_id:long chat_id:int date:int bytes:bytes = EncryptedMessage;
 
-decryptedMessageLayer#99a438cf layer:int message:DecryptedMessage = DecryptedMessageLayer;
-
-decryptedMessage#1f814f1f random_id:long random_bytes:bytes message:string media:DecryptedMessageMedia = DecryptedMessage;
-decryptedMessageService#aa48327d random_id:long random_bytes:bytes action:DecryptedMessageAction = DecryptedMessage;
-
-decryptedMessageMediaEmpty#89f5c4a = DecryptedMessageMedia;
-decryptedMessageMediaPhoto#32798a8c thumb:bytes thumb_w:int thumb_h:int w:int h:int size:int key:bytes iv:bytes = DecryptedMessageMedia;
-decryptedMessageMediaVideo#524a415d thumb:bytes thumb_w:int thumb_h:int duration:int mime_type:string w:int h:int size:int key:bytes iv:bytes = DecryptedMessageMedia;
-decryptedMessageMediaGeoPoint#35480a59 lat:double long:double = DecryptedMessageMedia;
-decryptedMessageMediaContact#588a0a97 phone_number:string first_name:string last_name:string user_id:int = DecryptedMessageMedia;
-
-decryptedMessageActionSetMessageTTL#a1733aec ttl_seconds:int = DecryptedMessageAction;
-
 messages.dhConfigNotModified#c0e24635 random:bytes = messages.DhConfig;
 messages.dhConfig#2c221edd g:int p:bytes version:int random:bytes = messages.DhConfig;
 
@@ -491,9 +475,6 @@ inputDocument#18798952 id:long access_hash:long = InputDocument;
 inputAudioFileLocation#74dc404d id:long access_hash:long = InputFileLocation;
 inputDocumentFileLocation#4e45abe9 id:long access_hash:long = InputFileLocation;
 
-decryptedMessageMediaDocument#b095434b thumb:bytes thumb_w:int thumb_h:int file_name:string mime_type:string size:int key:bytes iv:bytes = DecryptedMessageMedia;
-decryptedMessageMediaAudio#57e0a9cb duration:int mime_type:string size:int key:bytes iv:bytes = DecryptedMessageMedia;
-
 audioEmpty#586988d8 id:long = Audio;
 audio#c7ac6496 id:long access_hash:long user_id:int date:int duration:int mime_type:string size:int dc_id:int = Audio;
 
@@ -502,12 +483,6 @@ document#9efc6326 id:long access_hash:long user_id:int date:int file_name:string
 
 help.support#17c6b5f6 phone_number:string user:User = help.Support;
 
-decryptedMessageActionReadMessages#c4f40be random_ids:Vector<long> = DecryptedMessageAction;
-decryptedMessageActionDeleteMessages#65614304 random_ids:Vector<long> = DecryptedMessageAction;
-decryptedMessageActionScreenshotMessages#8ac1f475 random_ids:Vector<long> = DecryptedMessageAction;
-decryptedMessageActionFlushHistory#6719e45c = DecryptedMessageAction;
-decryptedMessageActionNotifyLayer#f3048883 layer:int = DecryptedMessageAction;
-
 notifyPeer#9fd40bd8 peer:Peer = NotifyPeer;
 notifyUsers#b4c83b4c = NotifyPeer;
 notifyChats#c007cec3 = NotifyPeer;
@@ -516,6 +491,25 @@ notifyAll#74d07c60 = NotifyPeer;
 updateUserBlocked#80ece81a user_id:int blocked:Bool = Update;
 updateNotifySettings#bec268ef peer:NotifyPeer notify_settings:PeerNotifySettings = Update;
 
+auth.sentAppCode#e325edcf phone_registered:Bool phone_code_hash:string send_call_timeout:int is_password:Bool = auth.SentCode;
+
+sendMessageTypingAction#16bf744e = SendMessageAction;
+sendMessageCancelAction#fd5ec8f5 = SendMessageAction;
+sendMessageRecordVideoAction#a187d66f = SendMessageAction;
+sendMessageUploadVideoAction#92042ff7 = SendMessageAction;
+sendMessageRecordAudioAction#d52f73f7 = SendMessageAction;
+sendMessageUploadAudioAction#e6ac8a6f = SendMessageAction;
+sendMessageUploadPhotoAction#990a3c1a = SendMessageAction;
+sendMessageUploadDocumentAction#8faee98e = SendMessageAction;
+sendMessageGeoLocationAction#176f8ba1 = SendMessageAction;
+sendMessageChooseContactAction#628cbc6f = SendMessageAction;
+
+contactFound#ea879f95 user_id:int = ContactFound;
+
+contacts.found#566000e results:Vector<ContactFound> users:Vector<User> = contacts.Found;
+
+updateServiceNotification#382dd3e4 type:string message:string media:MessageMedia popup:Bool = Update;
+
 ---functions---
 
 invokeAfterMsg#cb9f372d msg_id:long query:!X = X;
@@ -532,6 +526,7 @@ auth.resetAuthorizations#9fab0d1a = Bool;
 auth.sendInvites#771c1d97 phone_numbers:Vector<string> message:string = Bool;
 auth.exportAuthorization#e5bfffcd dc_id:int = auth.ExportedAuthorization;
 auth.importAuthorization#e3ef9613 id:int bytes:bytes = auth.Authorization;
+auth.bindTempAuthKey#cdd42a05 perm_auth_key_id:long nonce:long expires_at:int encrypted_message:bytes = Bool;
 
 account.registerDevice#446c712c token_type:int token:string device_model:string system_version:string app_version:string app_sandbox:Bool lang_code:string = Bool;
 account.unregisterDevice#65c55b40 token_type:int token:string = Bool;
@@ -548,24 +543,25 @@ users.getFullUser#ca30a5b1 id:InputUser = UserFull;
 contacts.getStatuses#c4a353ee = Vector<ContactStatus>;
 contacts.getContacts#22c6aa08 hash:string = contacts.Contacts;
 contacts.importContacts#da30b32d contacts:Vector<InputContact> replace:Bool = contacts.ImportedContacts;
-contacts.search#11f812d8 q:string limit:int = contacts.Found;
 contacts.getSuggested#cd773428 limit:int = contacts.Suggested;
 contacts.deleteContact#8e953744 id:InputUser = contacts.Link;
 contacts.deleteContacts#59ab389e id:Vector<InputUser> = Bool;
 contacts.block#332b49fc id:InputUser = Bool;
 contacts.unblock#e54100bd id:InputUser = Bool;
 contacts.getBlocked#f57c350f offset:int limit:int = contacts.Blocked;
+contacts.exportCard#84e53737 = Vector<int>;
+contacts.importCard#4fe196fe export_card:Vector<int> = User;
 
 messages.getMessages#4222fa74 id:Vector<int> = messages.Messages;
 messages.getDialogs#eccf1df6 offset:int max_id:int limit:int = messages.Dialogs;
 messages.getHistory#92a1df2f peer:InputPeer offset:int max_id:int limit:int = messages.Messages;
 messages.search#7e9f2ab peer:InputPeer q:string filter:MessagesFilter min_date:int max_date:int offset:int max_id:int limit:int = messages.Messages;
-messages.readHistory#b04f2510 peer:InputPeer max_id:int offset:int = messages.AffectedHistory;
+messages.readHistory#eed884c6 peer:InputPeer max_id:int offset:int read_contents:Bool = messages.AffectedHistory;
 messages.deleteHistory#f4f8fb61 peer:InputPeer offset:int = messages.AffectedHistory;
 messages.deleteMessages#14f2dd0a id:Vector<int> = Vector<int>;
 messages.restoreMessages#395f9d7e id:Vector<int> = Vector<int>;
 messages.receivedMessages#28abcb68 max_id:int = Vector<int>;
-messages.setTyping#719839e9 peer:InputPeer typing:Bool = Bool;
+messages.setTyping#a3825e50 peer:InputPeer action:SendMessageAction = Bool;
 messages.sendMessage#4cde0aab peer:InputPeer message:string random_id:long = messages.SentMessage;
 messages.sendMedia#a3c85d76 peer:InputPeer media:InputMedia random_id:long = messages.StatedMessage;
 messages.forwardMessages#514cd10f peer:InputPeer id:Vector<int> = messages.StatedMessages;
@@ -626,3 +622,12 @@ upload.saveBigFilePart#de7b673d file_id:long file_part:int file_total_parts:int
 initConnection#69796de9 api_id:int device_model:string system_version:string app_version:string lang_code:string query:!X = X;
 
 help.getSupport#9cdf08cd = help.Support;
+
+auth.sendSms#da9f3e8 phone_number:string phone_code_hash:string = Bool;
+
+messages.readMessageContents#354b5bc2 id:Vector<int> = Vector<int>;
+
+account.checkUsername#2714d86c username:string = Bool;
+account.updateUsername#3e0bdd7c username:string = User;
+
+contacts.search#11f812d8 q:string limit:int = contacts.Found;
diff --git a/Telegram/SourceFiles/profilewidget.cpp b/Telegram/SourceFiles/profilewidget.cpp
index 0dce59895e..bfbfe8361c 100644
--- a/Telegram/SourceFiles/profilewidget.cpp
+++ b/Telegram/SourceFiles/profilewidget.cpp
@@ -414,21 +414,27 @@ void ProfileInner::paintEvent(QPaintEvent *e) {
 	_nameText.drawElided(p, _left + st::profilePhotoSize + st::profileNameLeft, top + st::profileNameTop, _width - st::profilePhotoSize - st::profileNameLeft);
 
 	p.setFont(st::profileStatusFont->f);
+	int32 addbyname = 0;
+	if (_peerUser && !_peerUser->username.isEmpty()) {
+		addbyname = st::profileStatusTop + st::linkFont->ascent - (st::profileNameTop + st::profileNameFont->ascent);
+		p.setPen(st::black->p);
+		p.drawText(_left + st::profilePhotoSize + st::profileStatusLeft, top + st::profileStatusTop + st::linkFont->ascent, '@' + _peerUser->username);
+	}
 	p.setPen((_peerUser && _peerUser->onlineTill >= l_time ? st::profileOnlineColor : st::profileOfflineColor)->p);
-	p.drawText(_left + st::profilePhotoSize + st::profileStatusLeft, top + st::profileStatusTop + st::linkFont->ascent, _onlineText);
+	p.drawText(_left + st::profilePhotoSize + st::profileStatusLeft, top + addbyname + st::profileStatusTop + st::linkFont->ascent, _onlineText);
 	if (!_cancelPhoto.isHidden()) {
-		p.drawText(_left + st::profilePhotoSize + st::profilePhoneLeft, _cancelPhoto.y() + st::linkFont->ascent, lang(lng_settings_uploading_photo));
+		p.drawText(_left + st::profilePhotoSize + st::profilePhoneLeft, _cancelPhoto.y() + addbyname + st::linkFont->ascent, lang(lng_settings_uploading_photo));
 	}
 
 	if (!_errorText.isEmpty()) {
 		p.setFont(st::setErrFont->f);
 		p.setPen(st::setErrColor->p);
-		p.drawText(_left + st::profilePhotoSize + st::profilePhoneLeft, top + st::profilePhoneTop + st::profilePhoneFont->ascent, _errorText);
+		p.drawText(_left + st::profilePhotoSize + st::profilePhoneLeft, top + addbyname + st::profilePhoneTop + st::profilePhoneFont->ascent, _errorText);
 	}
 	if (!_phoneText.isEmpty()) {
 		p.setPen(st::black->p);
 		p.setFont(st::linkFont->f);
-		p.drawText(_left + st::profilePhotoSize + st::profilePhoneLeft, top + st::profilePhoneTop + st::profilePhoneFont->ascent, _phoneText);
+		p.drawText(_left + st::profilePhotoSize + st::profilePhoneLeft, top + addbyname + st::profilePhoneTop + st::profilePhoneFont->ascent, _phoneText);
 	}
 	top += st::profilePhotoSize;
 	top += st::profileButtonTop;
diff --git a/Telegram/SourceFiles/settingswidget.cpp b/Telegram/SourceFiles/settingswidget.cpp
index 65680bc82b..2320d20e20 100644
--- a/Telegram/SourceFiles/settingswidget.cpp
+++ b/Telegram/SourceFiles/settingswidget.cpp
@@ -28,6 +28,7 @@ Copyright (c) 2014 John Preston, https://tdesktop.com
 #include "boxes/emojibox.h"
 #include "boxes/confirmbox.h"
 #include "boxes/downloadpathbox.h"
+#include "boxes/usernamebox.h"
 #include "gui/filedialog.h"
 
 Slider::Slider(QWidget *parent, const style::slider &st, int32 count, int32 sel) : QWidget(parent),
@@ -96,14 +97,19 @@ bool scaleIs(DBIScale scale) {
 }
 
 SettingsInner::SettingsInner(SettingsWidget *parent) : QWidget(parent),
-	_self(App::self()),
-
 	// profile
-	_nameCache(_self ? _self->name : QString()),
-    _phoneText(_self ? App::formatPhone(_self->phone) : QString()),
+	_nameCache(self() ? self()->name : QString()),
     _uploadPhoto(this, lang(lng_settings_upload), st::btnSetUpload),
     _cancelPhoto(this, lang(lng_cancel)), _nameOver(false), _photoOver(false), a_photo(0),
 
+	// contact info
+	_phoneText(self() ? App::formatPhone(self()->phone) : QString()),
+	_usernameText((self() && !self()->username.isEmpty()) ? ('@' + self()->username) : QString()),
+	_phoneLeft(st::linkFont->m.width(lang(lng_settings_phone_number)) + st::linkFont->spacew),
+	_usernameLeft(st::linkFont->m.width(lang(lng_settings_username)) + st::linkFont->spacew),
+	_chooseUsername(this, lang(lng_settings_choose_username)),
+	_changeUsername(this, lang(lng_settings_change_username)),
+
 	// notifications
 	_desktopNotify(this, lang(lng_settings_desktop_notify), cDesktopNotify()),
 	_senderName(this, lang(lng_settings_show_name), cNotifyView() <= dbinvShowName),
@@ -152,11 +158,11 @@ SettingsInner::SettingsInner(SettingsWidget *parent) : QWidget(parent),
 	_logOut(this, lang(lng_settings_logout), st::btnLogout),
     _resetDone(false)
 {
-	if (_self) {
+	if (self()) {
 		_nameText.setText(st::setNameFont, _nameCache, _textNameOptions);
-		PhotoData *selfPhoto = _self->photoId ? App::photo(_self->photoId) : 0;
-		if (selfPhoto && selfPhoto->date) _photoLink = TextLinkPtr(new PhotoLink(selfPhoto, _self));
-		MTP::send(MTPusers_GetFullUser(_self->inputUser), rpcDone(&SettingsInner::gotFullSelf));
+		PhotoData *selfPhoto = self()->photoId ? App::photo(self()->photoId) : 0;
+		if (selfPhoto && selfPhoto->date) _photoLink = TextLinkPtr(new PhotoLink(selfPhoto, self()));
+		MTP::send(MTPusers_GetFullUser(self()->inputUser), rpcDone(&SettingsInner::gotFullSelf));
 
 		connect(App::main(), SIGNAL(peerPhotoChanged(PeerData *)), this, SLOT(peerUpdated(PeerData *)));
 		connect(App::main(), SIGNAL(peerNameChanged(PeerData *, const PeerData::Names &, const PeerData::NameFirstChars &)), this, SLOT(peerUpdated(PeerData *)));
@@ -169,6 +175,10 @@ SettingsInner::SettingsInner(SettingsWidget *parent) : QWidget(parent),
 	connect(App::app(), SIGNAL(peerPhotoDone(PeerId)), this, SLOT(onPhotoUpdateDone(PeerId)));
 	connect(App::app(), SIGNAL(peerPhotoFail(PeerId)), this, SLOT(onPhotoUpdateFail(PeerId)));
 
+	// contact info
+	connect(&_chooseUsername, SIGNAL(clicked()), this, SLOT(onUsername()));
+	connect(&_changeUsername, SIGNAL(clicked()), this, SLOT(onUsername()));
+
 	// notifications
 	_senderName.setDisabled(!_desktopNotify.checked());
 	_messagePreview.setDisabled(_senderName.disabled() || !_senderName.checked());
@@ -253,21 +263,21 @@ SettingsInner::SettingsInner(SettingsWidget *parent) : QWidget(parent),
 }
 
 void SettingsInner::peerUpdated(PeerData *data) {
-	if (_self && data == _self) {
-		if (_self->photoId) {
-			PhotoData *selfPhoto = App::photo(_self->photoId);
+	if (self() && data == self()) {
+		if (self()->photoId) {
+			PhotoData *selfPhoto = App::photo(self()->photoId);
 			if (selfPhoto->date) {
-				_photoLink = TextLinkPtr(new PhotoLink(selfPhoto, _self));
+				_photoLink = TextLinkPtr(new PhotoLink(selfPhoto, self()));
 			} else {
 				_photoLink = TextLinkPtr();
-				MTP::send(MTPusers_GetFullUser(_self->inputUser), rpcDone(&SettingsInner::gotFullSelf));
+				MTP::send(MTPusers_GetFullUser(self()->inputUser), rpcDone(&SettingsInner::gotFullSelf));
 			}
 		} else {
 			_photoLink = TextLinkPtr();
 		}
 
-		if (_nameCache != _self->name) {
-			_nameCache = _self->name;
+		if (_nameCache != self()->name) {
+			_nameCache = self()->name;
 			_nameText.setText(st::setNameFont, _nameCache, _textNameOptions);
 			update();
 		}
@@ -280,7 +290,7 @@ void SettingsInner::paintEvent(QPaintEvent *e) {
 	p.setClipRect(e->rect());
 
 	int32 top = 0;
-	if (_self) {
+	if (self()) {
 		// profile
 		top += st::setTop;
 
@@ -288,14 +298,11 @@ void SettingsInner::paintEvent(QPaintEvent *e) {
 		if (!_cancelPhoto.isHidden()) {
 			p.setFont(st::linkFont->f);
 			p.setPen(st::black->p);
-			p.drawText(_uploadPhoto.x() + st::setPhoneLeft, _cancelPhoto.y() + st::linkFont->ascent, lang(lng_settings_uploading_photo));
+			p.drawText(_uploadPhoto.x() + st::setStatusLeft, _cancelPhoto.y() + st::linkFont->ascent, lang(lng_settings_uploading_photo));
 		}
-		p.setFont(st::setPhoneFont->f);
-		p.setPen(st::setPhoneColor->p);
-		p.drawText(_uploadPhoto.x() + st::setPhoneLeft, top + st::setPhoneTop + st::setPhoneFont->ascent, _phoneText);
 
 		if (_photoLink) {
-			p.drawPixmap(_left, top, _self->photo->pix(st::setPhotoSize));
+			p.drawPixmap(_left, top, self()->photo->pix(st::setPhotoSize));
 		} else {
 			if (a_photo.current() < 1) {
 				p.drawPixmap(QPoint(_left, top), App::sprite(), st::setPhotoImg);
@@ -306,6 +313,12 @@ void SettingsInner::paintEvent(QPaintEvent *e) {
 				p.setOpacity(1);
 			}
 		}
+
+		p.setFont(st::setStatusFont->f);
+		bool connecting = App::wnd()->connectingVisible();
+		p.setPen((connecting ? st::profileOfflineColor : st::profileOnlineColor)->p);
+		p.drawText(_uploadPhoto.x() + st::setStatusLeft, top + st::setStatusTop + st::setStatusFont->ascent, lang(connecting ? lng_status_connecting : lng_status_online));
+
 		top += st::setPhotoSize;
 
 		if (!_errorText.isEmpty()) {
@@ -314,6 +327,24 @@ void SettingsInner::paintEvent(QPaintEvent *e) {
 			p.drawText(QRect(_uploadPhoto.x(), _uploadPhoto.y() + _uploadPhoto.height() + st::setLittleSkip, _uploadPhoto.width(), st::setErrFont->height), _errorText, style::al_center);
 		}
 
+		// contact info
+		p.setFont(st::setHeaderFont->f);
+		p.setPen(st::setHeaderColor->p);
+		p.drawText(_left + st::setHeaderLeft, top + st::setHeaderTop + st::setHeaderFont->ascent, lang(lng_settings_section_contact_info));
+		top += st::setHeaderSkip;
+
+		p.setFont(st::linkFont->f);
+		p.setPen(st::black->p);
+		p.drawText(_left, top + st::linkFont->ascent, lang(lng_settings_phone_number));
+		p.drawText(_left + _phoneLeft, top + st::linkFont->ascent, _phoneText);
+		top += st::linkFont->height + st::setLittleSkip;
+
+		p.drawText(_left, top + st::linkFont->ascent, lang(lng_settings_username));
+		if (!_usernameText.isEmpty()) {
+			p.drawText(_left + _usernameLeft, top + st::linkFont->ascent, _usernameText);
+		}
+		top += st::linkFont->height;
+
 		// notifications
 		p.setFont(st::setHeaderFont->f);
 		p.setPen(st::setHeaderColor->p);
@@ -389,7 +420,7 @@ void SettingsInner::paintEvent(QPaintEvent *e) {
         p.setFont(st::linkFont->f);
     }
     
-	if (_self) {
+	if (self()) {
 		// chat options
 		p.setFont(st::setHeaderFont->f);
 		p.setPen(st::setHeaderColor->p);
@@ -435,7 +466,7 @@ void SettingsInner::paintEvent(QPaintEvent *e) {
 	p.setPen(st::black->p);
 	p.drawText(_left + st::setHeaderLeft, _connectionType.y() + st::linkFont->ascent, _connectionTypeText);
 
-	if (_self && _resetDone) {
+	if (self() && _resetDone) {
 		p.drawText(_resetSessions.x(), _resetSessions.y() + st::linkFont->ascent, lang(lng_settings_reset_done));
 	}
 }
@@ -445,13 +476,19 @@ void SettingsInner::resizeEvent(QResizeEvent *e) {
 
 	int32 top = 0;
 
-	if (_self) {
+	if (self()) {
 		// profile
 		top += st::setTop;
 		top += st::setPhotoSize;
 		_uploadPhoto.move(_left + st::setWidth - _uploadPhoto.width(), top - _uploadPhoto.height());
 		_cancelPhoto.move(_left + st::setWidth - _cancelPhoto.width(), top - _uploadPhoto.height() + st::btnSetUpload.textTop + st::btnSetUpload.font->ascent - st::linkFont->ascent);
 
+		// contact info
+		top += st::setHeaderSkip;
+		top += st::linkFont->height + st::setLittleSkip;
+		_chooseUsername.move(_left + _usernameLeft, top);
+		_changeUsername.move(_left + st::setWidth - _changeUsername.width(), top); top += st::linkFont->height;
+
 		// notifications
 		top += st::setHeaderSkip;
 		_desktopNotify.move(_left, top); top += _desktopNotify.height() + st::setLittleSkip;
@@ -485,7 +522,7 @@ void SettingsInner::resizeEvent(QResizeEvent *e) {
     }
     
 	// chat options
-	if (_self) {
+	if (self()) {
 		top += st::setHeaderSkip;
 		_viewEmojis.move(_left + st::setWidth - _viewEmojis.width(), top + st::cbDefFlat.textTop);
 		_replaceEmojis.move(_left, top); top += _replaceEmojis.height() + st::setSectionSkip;
@@ -507,7 +544,7 @@ void SettingsInner::resizeEvent(QResizeEvent *e) {
 	// advanced
 	top += st::setHeaderSkip;
 	_connectionType.move(_left + st::setHeaderLeft + _connectionTypeWidth, top); top += _connectionType.height() + st::setLittleSkip;
-	if (_self) {
+	if (self()) {
 		_resetSessions.move(_left, top); top += _resetSessions.height() + st::setSectionSkip;
 		_logOut.move(_left, top);
 	}
@@ -520,7 +557,7 @@ void SettingsInner::keyPressEvent(QKeyEvent *e) {
 }
 
 void SettingsInner::mouseMoveEvent(QMouseEvent *e) {
-	if (!_self) {
+	if (!self()) {
 		setCursor(style::cur_default);
 	} else {
 		bool nameOver = QRect(_uploadPhoto.x() + st::setNameLeft, st::setTop + st::setNameTop, qMin(_uploadPhoto.width() - int(st::setNameLeft), _nameText.maxWidth()), st::setNameFont->height).contains(e->pos());
@@ -543,14 +580,14 @@ void SettingsInner::mouseMoveEvent(QMouseEvent *e) {
 
 void SettingsInner::mousePressEvent(QMouseEvent *e) {
 	mouseMoveEvent(e);
-	if (!_self) {
+	if (!self()) {
 		return;
 	}
 	if (QRect(_uploadPhoto.x() + st::setNameLeft, st::setTop + st::setNameTop, qMin(_uploadPhoto.width() - int(st::setNameLeft), _nameText.maxWidth()), st::setNameFont->height).contains(e->pos())) {
-		App::wnd()->showLayer(new AddContactBox(_self));
+		App::wnd()->showLayer(new AddContactBox(self()));
 	} else if (QRect(_left, st::setTop, st::setPhotoSize, st::setPhotoSize).contains(e->pos())) {
 		if (_photoLink) {
-			App::photo(_self->photoId)->full->load();
+			App::photo(self()->photoId)->full->load();
 			_photoLink->onClick(e->button());
 		} else {
 			onUpdatePhoto();
@@ -600,22 +637,28 @@ void SettingsInner::updateConnectionType() {
 	}
 }
 
-void SettingsInner::gotFullSelf(const MTPUserFull &self) {
-	if (!_self) return;
-	App::feedPhoto(self.c_userFull().vprofile_photo);
-	App::feedUsers(MTP_vector<MTPUser>(QVector<MTPUser>(1, self.c_userFull().vuser)));
-	PhotoData *selfPhoto = _self->photoId ? App::photo(_self->photoId) : 0;
+void SettingsInner::gotFullSelf(const MTPUserFull &selfFull) {
+	if (!self()) return;
+	App::feedPhoto(selfFull.c_userFull().vprofile_photo);
+	App::feedUsers(MTP_vector<MTPUser>(QVector<MTPUser>(1, selfFull.c_userFull().vuser)));
+	PhotoData *selfPhoto = self()->photoId ? App::photo(self()->photoId) : 0;
 	if (selfPhoto && selfPhoto->date) {
-		_photoLink = TextLinkPtr(new PhotoLink(selfPhoto, _self));
+		_photoLink = TextLinkPtr(new PhotoLink(selfPhoto, self()));
 	} else {
 		_photoLink = TextLinkPtr();
 	}
 }
 
+void SettingsInner::usernameChanged() {
+	_usernameText = (self() && !self()->username.isEmpty()) ? ('@' + self()->username) : QString();
+	showAll();
+	update();
+}
+
 void SettingsInner::showAll() {
 	// profile
-	if (_self) {
-		if (App::app()->isPhotoUpdating(_self->id)) {
+	if (self()) {
+		if (App::app()->isPhotoUpdating(self()->id)) {
 			_cancelPhoto.show();
 			_uploadPhoto.hide();
 		} else {
@@ -627,8 +670,22 @@ void SettingsInner::showAll() {
 		_cancelPhoto.hide();
 	}
 
+	// contact info
+	if (self()) {
+		if (self()->username.isEmpty()) {
+			_chooseUsername.show();
+			_changeUsername.hide();
+		} else {
+			_chooseUsername.hide();
+			_changeUsername.show();
+		}
+	} else {
+		_chooseUsername.hide();
+		_changeUsername.hide();
+	}
+
 	// notifications
-	if (_self) {
+	if (self()) {
 		_desktopNotify.show();
 		_senderName.show();
 		_messagePreview.show();
@@ -673,7 +730,7 @@ void SettingsInner::showAll() {
     }
 
 	// chat options
-	if (_self) {
+	if (self()) {
 		_replaceEmojis.show();
 		if (cReplaceEmojis()) {
 			_viewEmojis.show();
@@ -707,7 +764,7 @@ void SettingsInner::showAll() {
 	}
 
 	// advanced
-	if (_self) {
+	if (self()) {
 		if (_resetDone) {
 			_resetSessions.hide();
 		} else {
@@ -727,8 +784,8 @@ void SettingsInner::saveError(const QString &str) {
 }
 
 void SettingsInner::onUpdatePhotoCancel() {
-	if (_self) {
-		App::app()->cancelPhotoUpdate(_self->id);
+	if (self()) {
+		App::app()->cancelPhotoUpdate(self()->id);
 	}
 	showAll();
 	update();
@@ -759,7 +816,7 @@ void SettingsInner::onUpdatePhoto() {
 		saveError(lang(lng_bad_photo));
 		return;
 	}
-	PhotoCropBox *box = new PhotoCropBox(img, _self->id);
+	PhotoCropBox *box = new PhotoCropBox(img, self()->id);
 	connect(box, SIGNAL(closed()), this, SLOT(onPhotoUpdateStart()));
 	App::wnd()->showLayer(box);
 }
@@ -822,6 +879,12 @@ void SettingsInner::onConnectionType() {
 	App::wnd()->showLayer(box);
 }
 
+void SettingsInner::onUsername() {
+	UsernameBox *box = new UsernameBox();
+	connect(box, SIGNAL(closed()), this, SLOT(usernameChanged()));
+	App::wnd()->showLayer(box);
+}
+
 void SettingsInner::onWorkmodeTray() {
 	if ((!_workmodeTray.checked() || cPlatform() != dbipWindows) && !_workmodeWindow.checked()) {
 		_workmodeWindow.setChecked(true);
@@ -1120,14 +1183,14 @@ void SettingsInner::onPhotoUpdateStart() {
 }
 
 void SettingsInner::onPhotoUpdateFail(PeerId peer) {
-	if (!_self || _self->id != peer) return;
+	if (!self() || self()->id != peer) return;
 	saveError(lang(lng_bad_photo));
 	showAll();
 	update();
 }
 
 void SettingsInner::onPhotoUpdateDone(PeerId peer) {
-	if (!_self || _self->id != peer) return;
+	if (!self() || self()->id != peer) return;
 	showAll();
 	update();
 }
@@ -1245,6 +1308,10 @@ void SettingsWidget::rpcInvalidate() {
 	_inner.rpcInvalidate();
 }
 
+void SettingsWidget::usernameChanged() {
+	_inner.usernameChanged();
+}
+
 SettingsWidget::~SettingsWidget() {
 	if (App::wnd()) App::wnd()->noSettings(this);
 }
diff --git a/Telegram/SourceFiles/settingswidget.h b/Telegram/SourceFiles/settingswidget.h
index 4931e1b880..9d16632da5 100644
--- a/Telegram/SourceFiles/settingswidget.h
+++ b/Telegram/SourceFiles/settingswidget.h
@@ -80,6 +80,7 @@ public:
 
 public slots:
 
+	void usernameChanged();
 	void updateConnectionType();
 
 	void peerUpdated(PeerData *data);
@@ -93,6 +94,8 @@ public slots:
 
 	void onConnectionType();
 
+	void onUsername();
+
 	void onWorkmodeTray();
 	void onWorkmodeWindow();
 
@@ -144,13 +147,14 @@ private:
 
 	void setScale(DBIScale newScale);
 
-	UserData *_self;
+	UserData *self() const {
+		return App::self();
+	}
 	int32 _left;
 
 	// profile
 	Text _nameText;
 	QString _nameCache;
-	QString _phoneText;
 	TextLinkPtr _photoLink;
 	FlatButton _uploadPhoto;
 	LinkButton _cancelPhoto;
@@ -159,6 +163,11 @@ private:
 
 	QString _errorText;
 
+	// contact info
+	QString _phoneText, _usernameText;
+	int32 _phoneLeft, _usernameLeft;
+	LinkButton _chooseUsername, _changeUsername;
+
 	// notifications
 	FlatCheckbox _desktopNotify, _senderName, _messagePreview, _soundNotify;
 
@@ -236,6 +245,7 @@ public:
 	void updateConnectionType();
 
 	void rpcInvalidate();
+	void usernameChanged();
 
 	~SettingsWidget();
 
diff --git a/Telegram/SourceFiles/window.cpp b/Telegram/SourceFiles/window.cpp
index dce9b69f09..13c79e36c5 100644
--- a/Telegram/SourceFiles/window.cpp
+++ b/Telegram/SourceFiles/window.cpp
@@ -609,6 +609,11 @@ void Window::showConnecting(const QString &text, const QString &reconnect) {
 		resizeEvent(0);
 		fixOrder();
 	}
+	if (settings) settings->update();
+}
+
+bool Window::connectingVisible() const {
+	return _connecting && !_connecting->isHidden();
 }
 
 void Window::hideConnecting() {
@@ -616,6 +621,7 @@ void Window::hideConnecting() {
 		_connecting->deleteLater();
 		_connecting = 0;
 	}
+	if (settings) settings->update();
 }
 
 void Window::replaceLayer(LayeredWidget *w) {
diff --git a/Telegram/SourceFiles/window.h b/Telegram/SourceFiles/window.h
index defab1ba26..8156c496b1 100644
--- a/Telegram/SourceFiles/window.h
+++ b/Telegram/SourceFiles/window.h
@@ -172,6 +172,7 @@ public:
 
 	void showConnecting(const QString &text, const QString &reconnect = QString());
 	void hideConnecting();
+	bool connectingVisible() const;
 
 	void hideSettings(bool fast = false);
 	void showPhoto(const PhotoLink *lnk, HistoryItem *item = 0);
diff --git a/Telegram/Telegram.vcxproj b/Telegram/Telegram.vcxproj
index b2966189e7..6c800567e7 100644
--- a/Telegram/Telegram.vcxproj
+++ b/Telegram/Telegram.vcxproj
@@ -346,6 +346,10 @@
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">true</ExcludedFromBuild>
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
     </ClCompile>
+    <ClCompile Include="GeneratedFiles\Debug\moc_usernamebox.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">true</ExcludedFromBuild>
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
+    </ClCompile>
     <ClCompile Include="GeneratedFiles\Debug\moc_window.cpp">
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">true</ExcludedFromBuild>
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
@@ -550,6 +554,10 @@
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
     </ClCompile>
+    <ClCompile Include="GeneratedFiles\Deploy\moc_usernamebox.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
+    </ClCompile>
     <ClCompile Include="GeneratedFiles\Deploy\moc_window.cpp">
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
@@ -763,6 +771,10 @@
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">true</ExcludedFromBuild>
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
     </ClCompile>
+    <ClCompile Include="GeneratedFiles\Release\moc_usernamebox.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">true</ExcludedFromBuild>
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
+    </ClCompile>
     <ClCompile Include="GeneratedFiles\Release\moc_window.cpp">
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">true</ExcludedFromBuild>
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
@@ -782,6 +794,7 @@
     <ClCompile Include="SourceFiles\boxes\newgroupbox.cpp" />
     <ClCompile Include="SourceFiles\boxes\photocropbox.cpp" />
     <ClCompile Include="SourceFiles\boxes\photosendbox.cpp" />
+    <ClCompile Include="SourceFiles\boxes\usernamebox.cpp" />
     <ClCompile Include="SourceFiles\dialogswidget.cpp" />
     <ClCompile Include="SourceFiles\dropdown.cpp" />
     <ClCompile Include="SourceFiles\fileuploader.cpp" />
@@ -1058,6 +1071,20 @@
       <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
       <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\moc.exe"  "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp"  -DAL_LIBTYPE_STATIC -DUNICODE -D_WITH_DEBUG -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -DQT_NO_DEBUG -DNDEBUG  "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\OpenSSL-Win32\include" "-I.\..\..\Libraries\libogg-1.3.2\include" "-I.\..\..\Libraries\opus\include" "-I.\..\..\Libraries\opusfile\include" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.3.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.3.1\QtGui" "-fstdafx.h" "-f../../SourceFiles/audio.h"</Command>
     </CustomBuild>
+    <CustomBuild Include="SourceFiles\boxes\usernamebox.h">
+      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
+      <Message Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">Moc%27ing usernamebox.h...</Message>
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
+      <Command Condition="'$(Configuration)|$(Platform)'=='Deploy|Win32'">"$(QTDIR)\bin\moc.exe"  "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fstdafx.h" "-f../../SourceFiles/boxes/usernamebox.h"  -DAL_LIBTYPE_STATIC -DCUSTOM_API_ID -DUNICODE -D_WITH_DEBUG -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -DQT_NO_DEBUG -DNDEBUG "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\OpenSSL-Win32\include" "-I.\..\..\Libraries\libogg-1.3.2\include" "-I.\..\..\Libraries\opus\include" "-I.\..\..\Libraries\opusfile\include" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.3.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.3.1\QtGui"</Command>
+      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
+      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing usernamebox.h...</Message>
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
+      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe"  "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fstdafx.h" "-f../../SourceFiles/boxes/usernamebox.h"  -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\OpenSSL-Win32\include" "-I.\..\..\Libraries\libogg-1.3.2\include" "-I.\..\..\Libraries\opus\include" "-I.\..\..\Libraries\opusfile\include" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.3.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.3.1\QtGui"</Command>
+      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
+      <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing usernamebox.h...</Message>
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
+      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\moc.exe"  "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fstdafx.h" "-f../../SourceFiles/boxes/usernamebox.h"  -DAL_LIBTYPE_STATIC -DUNICODE -D_WITH_DEBUG -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -DQT_NO_DEBUG -DNDEBUG "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\OpenSSL-Win32\include" "-I.\..\..\Libraries\libogg-1.3.2\include" "-I.\..\..\Libraries\opus\include" "-I.\..\..\Libraries\opusfile\include" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.3.1\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.3.1\QtGui"</Command>
+    </CustomBuild>
     <ClInclude Include="SourceFiles\config.h" />
     <CustomBuild Include="SourceFiles\gui\animation.h">
       <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing animation.h...</Message>
diff --git a/Telegram/Telegram.vcxproj.filters b/Telegram/Telegram.vcxproj.filters
index a5609e68f9..c740b80310 100644
--- a/Telegram/Telegram.vcxproj.filters
+++ b/Telegram/Telegram.vcxproj.filters
@@ -722,6 +722,18 @@
     <ClCompile Include="SourceFiles\mtproto\mtpScheme.cpp">
       <Filter>mtproto</Filter>
     </ClCompile>
+    <ClCompile Include="SourceFiles\boxes\usernamebox.cpp">
+      <Filter>boxes</Filter>
+    </ClCompile>
+    <ClCompile Include="GeneratedFiles\Deploy\moc_usernamebox.cpp">
+      <Filter>Generated Files\Deploy</Filter>
+    </ClCompile>
+    <ClCompile Include="GeneratedFiles\Debug\moc_usernamebox.cpp">
+      <Filter>Generated Files\Debug</Filter>
+    </ClCompile>
+    <ClCompile Include="GeneratedFiles\Release\moc_usernamebox.cpp">
+      <Filter>Generated Files\Release</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="SourceFiles\stdafx.h">
@@ -972,6 +984,9 @@
     <CustomBuild Include="SourceFiles\gui\contextmenu.h">
       <Filter>gui</Filter>
     </CustomBuild>
+    <CustomBuild Include="SourceFiles\boxes\usernamebox.h">
+      <Filter>boxes</Filter>
+    </CustomBuild>
   </ItemGroup>
   <ItemGroup>
     <Image Include="SourceFiles\art\iconround256.ico" />