diff --git a/Telegram/SourceFiles/boxes/connection_box.cpp b/Telegram/SourceFiles/boxes/connection_box.cpp
index fae738510f..4f06d4fe31 100644
--- a/Telegram/SourceFiles/boxes/connection_box.cpp
+++ b/Telegram/SourceFiles/boxes/connection_box.cpp
@@ -1069,7 +1069,7 @@ void ProxiesBoxController::ShowApplyConfirmation(
 			if (ranges::find(proxies, proxy) == end(proxies)) {
 				proxies.push_back(proxy);
 			}
-			Messenger::Instance().mtp()->setCurrentProxy(proxy, true);
+			Messenger::Instance().setCurrentProxy(proxy, true);
 			Local::writeSettings();
 			if (const auto strong = box->data()) {
 				strong->closeBox();
@@ -1230,7 +1230,7 @@ void ProxiesBoxController::applyItem(int id) {
 
 	auto j = findByProxy(Global::SelectedProxy());
 
-	Messenger::Instance().mtp()->setCurrentProxy(item->data, true);
+	Messenger::Instance().setCurrentProxy(item->data, true);
 	saveDelayed();
 
 	if (j != end(_list)) {
@@ -1251,7 +1251,7 @@ void ProxiesBoxController::setDeleted(int id, bool deleted) {
 			_lastSelectedProxy = base::take(Global::RefSelectedProxy());
 			if (Global::UseProxy()) {
 				_lastSelectedProxyUsed = true;
-				Messenger::Instance().mtp()->setCurrentProxy(
+				Messenger::Instance().setCurrentProxy(
 					ProxyData(),
 					false);
 				saveDelayed();
@@ -1276,7 +1276,7 @@ void ProxiesBoxController::setDeleted(int id, bool deleted) {
 			Assert(!Global::UseProxy());
 
 			if (base::take(_lastSelectedProxyUsed)) {
-				Messenger::Instance().mtp()->setCurrentProxy(
+				Messenger::Instance().setCurrentProxy(
 					base::take(_lastSelectedProxy),
 					true);
 			} else {
@@ -1381,7 +1381,7 @@ bool ProxiesBoxController::setProxyEnabled(bool enabled) {
 			}
 		}
 	}
-	Messenger::Instance().mtp()->setCurrentProxy(
+	Messenger::Instance().setCurrentProxy(
 		Global::SelectedProxy(),
 		enabled);
 	saveDelayed();
diff --git a/Telegram/SourceFiles/messenger.cpp b/Telegram/SourceFiles/messenger.cpp
index 93942aec3d..4610454175 100644
--- a/Telegram/SourceFiles/messenger.cpp
+++ b/Telegram/SourceFiles/messenger.cpp
@@ -278,13 +278,42 @@ bool Messenger::eventFilter(QObject *object, QEvent *e) {
 	return QObject::eventFilter(object, e);
 }
 
+void Messenger::setCurrentProxy(
+		const ProxyData &proxy,
+		bool enabled) {
+	const auto key = [&](const ProxyData &proxy) {
+		if (proxy.type == ProxyData::Type::Mtproto) {
+			return std::make_pair(proxy.host, proxy.port);
+		}
+		return std::make_pair(QString(), uint32(0));
+	};
+	const auto previousKey = key(Global::UseProxy()
+		? Global::SelectedProxy()
+		: ProxyData());
+	Global::SetSelectedProxy(proxy);
+	Global::SetUseProxy(enabled);
+	Sandbox::refreshGlobalProxy();
+	if (_mtproto) {
+		_mtproto->restart();
+		if (previousKey != key(proxy)) {
+			_mtproto->reInitConnection(_mtproto->mainDcId());
+		}
+	}
+	if (_mtprotoForKeysDestroy) {
+		_mtprotoForKeysDestroy->restart();
+	}
+	Global::RefConnectionTypeChanged().notify();
+}
+
 void Messenger::setMtpMainDcId(MTP::DcId mainDcId) {
 	Expects(!_mtproto);
+
 	_private->mtpConfig.mainDcId = mainDcId;
 }
 
 void Messenger::setMtpKey(MTP::DcId dcId, const MTP::AuthKey::Data &keyData) {
 	Expects(!_mtproto);
+
 	_private->mtpConfig.keys.push_back(std::make_shared<MTP::AuthKey>(MTP::AuthKey::Type::ReadFromFile, dcId, keyData));
 }
 
diff --git a/Telegram/SourceFiles/messenger.h b/Telegram/SourceFiles/messenger.h
index 0a193e23ae..51b749be35 100644
--- a/Telegram/SourceFiles/messenger.h
+++ b/Telegram/SourceFiles/messenger.h
@@ -98,6 +98,7 @@ public:
 	MTP::DcOptions *dcOptions() {
 		return _dcOptions.get();
 	}
+	void setCurrentProxy(const ProxyData &proxy, bool enabled);
 
 	// Set from legacy storage.
 	void setMtpMainDcId(MTP::DcId mainDcId);
diff --git a/Telegram/SourceFiles/mtproto/mtp_instance.cpp b/Telegram/SourceFiles/mtproto/mtp_instance.cpp
index 721221fc91..7055263441 100644
--- a/Telegram/SourceFiles/mtproto/mtp_instance.cpp
+++ b/Telegram/SourceFiles/mtproto/mtp_instance.cpp
@@ -38,7 +38,6 @@ public:
 
 	void start(Config &&config);
 
-	void setCurrentProxy(const ProxyData &proxy, bool enabled);
 	void resolveProxyDomain(const QString &host);
 	void setGoodProxyDomain(const QString &host, const QString &ip);
 	void suggestMainDcId(DcId mainDcId);
@@ -274,28 +273,6 @@ void Instance::Private::start(Config &&config) {
 	requestConfig();
 }
 
-void Instance::Private::setCurrentProxy(
-		const ProxyData &proxy,
-		bool enabled) {
-	const auto key = [&](const ProxyData &proxy) {
-		if (proxy.type == ProxyData::Type::Mtproto) {
-			return std::make_pair(proxy.host, proxy.port);
-		}
-		return std::make_pair(QString(), uint32(0));
-	};
-	const auto previousKey = key(Global::UseProxy()
-		? Global::SelectedProxy()
-		: ProxyData());
-	Global::SetSelectedProxy(proxy);
-	Global::SetUseProxy(enabled);
-	Sandbox::refreshGlobalProxy();
-	restart();
-	if (previousKey != key(proxy)) {
-		reInitConnection(mainDcId());
-	}
-	Global::RefConnectionTypeChanged().notify();
-}
-
 void Instance::Private::resolveProxyDomain(const QString &host) {
 	if (!_domainResolver) {
 		_domainResolver = std::make_unique<DomainResolver>([=](
@@ -1467,10 +1444,6 @@ Instance::Instance(not_null<DcOptions*> options, Mode mode, Config &&config)
 	_private->start(std::move(config));
 }
 
-void Instance::setCurrentProxy(const ProxyData &proxy, bool enabled) {
-	_private->setCurrentProxy(proxy, enabled);
-}
-
 void Instance::resolveProxyDomain(const QString &host) {
 	_private->resolveProxyDomain(host);
 }
diff --git a/Telegram/SourceFiles/mtproto/mtp_instance.h b/Telegram/SourceFiles/mtproto/mtp_instance.h
index 595fecd885..7c53c086ef 100644
--- a/Telegram/SourceFiles/mtproto/mtp_instance.h
+++ b/Telegram/SourceFiles/mtproto/mtp_instance.h
@@ -46,7 +46,6 @@ public:
 	Instance(const Instance &other) = delete;
 	Instance &operator=(const Instance &other) = delete;
 
-	void setCurrentProxy(const ProxyData &proxy, bool enabled);
 	void resolveProxyDomain(const QString &host);
 	void setGoodProxyDomain(const QString &host, const QString &ip);
 	void suggestMainDcId(DcId mainDcId);