diff --git a/Telegram/SourceFiles/apiwrap.cpp b/Telegram/SourceFiles/apiwrap.cpp
index 248dd230f..bc9b46747 100644
--- a/Telegram/SourceFiles/apiwrap.cpp
+++ b/Telegram/SourceFiles/apiwrap.cpp
@@ -686,7 +686,7 @@ QString ApiWrap::exportDirectMessageLink(
 			}
 		}
 		const auto base = linkChannel->hasUsername()
-			? linkChannel->username
+			? linkChannel->username()
 			: "c/" + QString::number(peerToChannel(linkChannel->id).bare);
 		const auto query = base
 			+ '/'
diff --git a/Telegram/SourceFiles/boxes/add_contact_box.cpp b/Telegram/SourceFiles/boxes/add_contact_box.cpp
index f7b5d47ec..f33798de0 100644
--- a/Telegram/SourceFiles/boxes/add_contact_box.cpp
+++ b/Telegram/SourceFiles/boxes/add_contact_box.cpp
@@ -847,7 +847,7 @@ SetupChannelBox::SetupChannelBox(
 	this,
 	st::setupChannelLink,
 	nullptr,
-	channel->username,
+	channel->username(),
 	channel->session().createInternalLink(QString()))
 , _checkTimer([=] { check(); }) {
 }
@@ -1176,7 +1176,7 @@ void SetupChannelBox::check() {
 		)).done([=](const MTPBool &result) {
 			_checkRequestId = 0;
 			_errorText = (mtpIsTrue(result)
-					|| _checkUsername == _channel->username)
+					|| _checkUsername == _channel->username())
 				? QString()
 				: tr::lng_create_channel_link_occupied(tr::now);
 			_goodText = _errorText.isEmpty()
@@ -1238,7 +1238,7 @@ SetupChannelBox::UsernameResult SetupChannelBox::parseError(
 
 void SetupChannelBox::updateFail(UsernameResult result) {
 	if ((result == UsernameResult::Ok)
-		|| (_sentUsername == _channel->username)) {
+		|| (_sentUsername == _channel->username())) {
 		_channel->setName(
 			TextUtilities::SingleLine(_channel->name()),
 			TextUtilities::SingleLine(_sentUsername));
@@ -1272,7 +1272,7 @@ void SetupChannelBox::checkFail(UsernameResult result) {
 		_errorText = tr::lng_create_channel_link_invalid(tr::now);
 		update();
 	} else if ((result == UsernameResult::Occupied)
-			&& _checkUsername != _channel->username) {
+			&& _checkUsername != _channel->username()) {
 		_errorText = tr::lng_create_channel_link_occupied(tr::now);
 		update();
 	} else {
diff --git a/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp b/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp
index 60ee64f10..1f96380ef 100644
--- a/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp
+++ b/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp
@@ -715,7 +715,7 @@ void Controller::fillPrivacyTypeButton() {
 			? Privacy::HasUsername
 			: Privacy::NoUsername),
 		.username = (_peer->isChannel()
-			? _peer->asChannel()->username
+			? _peer->asChannel()->username()
 			: QString()),
 		.noForwards = !_peer->allowsForwarding(),
 		.joinToWrite = (_peer->isMegagroup()
@@ -1420,7 +1420,7 @@ void Controller::cancelSave() {
 
 void Controller::saveUsername() {
 	const auto channel = _peer->asChannel();
-	const auto username = (channel ? channel->username : QString());
+	const auto username = (channel ? channel->username() : QString());
 	if (!_savingData.username || *_savingData.username == username) {
 		return continueSave();
 	} else if (!channel) {
@@ -1517,7 +1517,7 @@ void Controller::saveTitle() {
 		if (type == qstr("CHAT_NOT_MODIFIED")
 			|| type == qstr("CHAT_TITLE_NOT_MODIFIED")) {
 			if (const auto channel = _peer->asChannel()) {
-				channel->setName(*_savingData.title, channel->username);
+				channel->setName(*_savingData.title, channel->username());
 			} else if (const auto chat = _peer->asChat()) {
 				chat->setName(*_savingData.title);
 			}
diff --git a/Telegram/SourceFiles/boxes/peers/edit_peer_type_box.cpp b/Telegram/SourceFiles/boxes/peers/edit_peer_type_box.cpp
index 4ba265e0a..11357d8f0 100644
--- a/Telegram/SourceFiles/boxes/peers/edit_peer_type_box.cpp
+++ b/Telegram/SourceFiles/boxes/peers/edit_peer_type_box.cpp
@@ -173,7 +173,7 @@ Controller::Controller(
 , _isGroup(_peer->isChat() || _peer->isMegagroup())
 , _goodUsername(_dataSavedValue
 	? !_dataSavedValue->username.isEmpty()
-	: (_peer->isChannel() && !_peer->asChannel()->username.isEmpty()))
+	: (_peer->isChannel() && !_peer->asChannel()->username().isEmpty()))
 , _wrap(container)
 , _checkUsernameTimer([=] { checkUsernameAvailability(); }) {
 	_peer->updateFull();
@@ -408,7 +408,7 @@ object_ptr<Ui::RpWidget> Controller::createUsernameEdit() {
 	const auto channel = _peer->asChannel();
 	const auto username = (!_dataSavedValue || !channel)
 		? QString()
-		: channel->username;
+		: channel->username();
 
 	auto result = object_ptr<Ui::SlideWrap<Ui::VerticalLayout>>(
 		_wrap,
@@ -535,7 +535,7 @@ void Controller::checkUsernameAvailability() {
 		_api.request(_checkUsernameRequestId).cancel();
 	}
 	const auto channel = _peer->migrateToOrMe()->asChannel();
-	const auto username = channel ? channel->username : QString();
+	const auto username = channel ? channel->username() : QString();
 	_checkUsernameRequestId = _api.request(MTPchannels_CheckUsername(
 		channel ? channel->inputChannel : MTP_inputChannelEmpty(),
 		MTP_string(checking)
diff --git a/Telegram/SourceFiles/calls/group/calls_group_settings.cpp b/Telegram/SourceFiles/calls/group/calls_group_settings.cpp
index dd4745a35..252b4be63 100644
--- a/Telegram/SourceFiles/calls/group/calls_group_settings.cpp
+++ b/Telegram/SourceFiles/calls/group/calls_group_settings.cpp
@@ -608,7 +608,8 @@ void SettingsBox(
 		const auto lookupLink = [=] {
 			if (const auto group = peer->asMegagroup()) {
 				return group->hasUsername()
-					? group->session().createInternalLinkFull(group->username)
+					? group->session().createInternalLinkFull(
+						group->username())
 					: group->inviteLink();
 			} else if (const auto chat = peer->asChat()) {
 				return chat->inviteLink();
diff --git a/Telegram/SourceFiles/data/data_channel.cpp b/Telegram/SourceFiles/data/data_channel.cpp
index f3e4914a5..488145599 100644
--- a/Telegram/SourceFiles/data/data_channel.cpp
+++ b/Telegram/SourceFiles/data/data_channel.cpp
@@ -101,6 +101,16 @@ void ChannelData::setName(
 	updateNameDelayed(newName.isEmpty() ? name() : newName, {}, newUsername);
 }
 
+void ChannelData::setUsername(const QString &username) {
+	if (_username != username) {
+		_username = username;
+	}
+}
+
+QString ChannelData::username() const {
+	return _username;
+}
+
 void ChannelData::setAccessHash(uint64 accessHash) {
 	access = accessHash;
 	input = MTP_inputPeerChannel(
diff --git a/Telegram/SourceFiles/data/data_channel.h b/Telegram/SourceFiles/data/data_channel.h
index ce7b0fdc2..590903508 100644
--- a/Telegram/SourceFiles/data/data_channel.h
+++ b/Telegram/SourceFiles/data/data_channel.h
@@ -146,6 +146,7 @@ public:
 	ChannelData(not_null<Data::Session*> owner, PeerId id);
 
 	void setName(const QString &name, const QString &username);
+	void setUsername(const QString &username);
 	void setPhoto(const MTPChatPhoto &photo);
 	void setAccessHash(uint64 accessHash);
 
@@ -159,6 +160,8 @@ public:
 		return _flags.value();
 	}
 
+	[[nodiscard]] QString username() const;
+
 	[[nodiscard]] int membersCount() const {
 		return std::max(_membersCount, 1);
 	}
@@ -435,8 +438,6 @@ public:
 
 	MTPinputChannel inputChannel = MTP_inputChannelEmpty();
 
-	QString username;
-
 	int32 date = 0;
 	std::unique_ptr<MegagroupInfo> mgInfo;
 
@@ -459,6 +460,8 @@ private:
 
 	PtsWaiter _ptsWaiter;
 
+	QString _username;
+
 	int _membersCount = -1;
 	int _adminsCount = 1;
 	int _restrictedCount = 0;
diff --git a/Telegram/SourceFiles/data/data_peer.cpp b/Telegram/SourceFiles/data/data_peer.cpp
index ea8139e62..ae3794ad4 100644
--- a/Telegram/SourceFiles/data/data_peer.cpp
+++ b/Telegram/SourceFiles/data/data_peer.cpp
@@ -202,7 +202,7 @@ void PeerData::updateNameDelayed(
 				return;
 			}
 		} else if (isChannel()) {
-			if (asChannel()->username == newUsername) {
+			if (asChannel()->username() == newUsername) {
 				return;
 			}
 		} else if (isChat()) {
@@ -226,8 +226,8 @@ void PeerData::updateNameDelayed(
 		}
 		asUser()->setNameOrPhone(newNameOrPhone);
 	} else if (isChannel()) {
-		if (asChannel()->username != newUsername) {
-			asChannel()->username = newUsername;
+		if (asChannel()->username() != newUsername) {
+			asChannel()->setUsername(newUsername);
 			if (newUsername.isEmpty()) {
 				asChannel()->removeFlags(ChannelDataFlag::Username);
 			} else {
@@ -648,7 +648,7 @@ void PeerData::fillNames() {
 			}
 		}
 	} else if (const auto channel = asChannel()) {
-		appendToIndex(channel->username);
+		appendToIndex(channel->username());
 	}
 	auto toIndex = toIndexList.join(' ');
 	toIndex += ' ' + rusKeyboardLayoutSwitch(toIndex);
@@ -822,7 +822,7 @@ QString PeerData::userName() const {
 	if (const auto user = asUser()) {
 		return user->username;
 	} else if (const auto channel = asChannel()) {
-		return channel->username;
+		return channel->username();
 	}
 	return QString();
 }