diff --git a/Telegram/SourceFiles/api/api_sending.cpp b/Telegram/SourceFiles/api/api_sending.cpp
index a3003bab4..d0b897a07 100644
--- a/Telegram/SourceFiles/api/api_sending.cpp
+++ b/Telegram/SourceFiles/api/api_sending.cpp
@@ -456,6 +456,7 @@ void SendConfirmedFile(
 		not_null<Main::Session*> session,
 		const std::shared_ptr<FilePrepareResult> &file) {
 	const auto isEditing = (file->type != SendMediaType::Audio)
+		&& (file->type != SendMediaType::Round)
 		&& (file->to.replaceMediaOf != 0);
 	const auto newId = FullMsgId(
 		file->to.peer,
@@ -525,7 +526,8 @@ void SendConfirmedFile(
 		// Shortcut messages have no 'edited' badge.
 		flags |= MessageFlag::HideEdited;
 	}
-	if (file->type == SendMediaType::Audio) {
+	if (file->type == SendMediaType::Audio
+		|| file->type == SendMediaType::Round) {
 		if (!peer->isChannel() || peer->isMegagroup()) {
 			flags |= MessageFlag::MediaIsUnread;
 		}
@@ -551,29 +553,25 @@ void SendConfirmedFile(
 				MTPint());
 		} else if (file->type == SendMediaType::Audio) {
 			const auto ttlSeconds = file->to.options.ttlSeconds;
-			const auto isVoice = [&] {
-				return file->document.match([](const MTPDdocumentEmpty &d) {
-					return false;
-				}, [](const MTPDdocument &d) {
-					return ranges::any_of(d.vattributes().v, [&](
-							const MTPDocumentAttribute &attribute) {
-						using Att = MTPDdocumentAttributeAudio;
-						return attribute.match([](const Att &data) -> bool {
-							return data.vflags().v & Att::Flag::f_voice;
-						}, [](const auto &) {
-							return false;
-						});
-					});
-				});
-			}();
 			using Flag = MTPDmessageMediaDocument::Flag;
 			return MTP_messageMediaDocument(
 				MTP_flags(Flag::f_document
-					| (isVoice ? Flag::f_voice : Flag())
+					| Flag::f_voice
 					| (ttlSeconds ? Flag::f_ttl_seconds : Flag())),
 				file->document,
 				MTPVector<MTPDocument>(), // alt_documents
 				MTP_int(ttlSeconds));
+		} else if (file->type == SendMediaType::Round) {
+			using Flag = MTPDmessageMediaDocument::Flag;
+			const auto ttlSeconds = file->to.options.ttlSeconds;
+			return MTP_messageMediaDocument(
+				MTP_flags(Flag::f_document
+					| Flag::f_round
+					| (ttlSeconds ? Flag::f_ttl_seconds : Flag())
+					| (file->spoiler ? Flag::f_spoiler : Flag())),
+				file->document,
+				MTPVector<MTPDocument>(), // alt_documents
+				MTP_int(ttlSeconds));
 		} else {
 			Unexpected("Type in sendFilesConfirmed.");
 		}
diff --git a/Telegram/SourceFiles/storage/file_upload.cpp b/Telegram/SourceFiles/storage/file_upload.cpp
index 95c4b0a1b..eef376b74 100644
--- a/Telegram/SourceFiles/storage/file_upload.cpp
+++ b/Telegram/SourceFiles/storage/file_upload.cpp
@@ -124,7 +124,8 @@ Uploader::Entry::Entry(
 		: file->thumbId) {
 	if (file->type == SendMediaType::File
 		|| file->type == SendMediaType::ThemeFile
-		|| file->type == SendMediaType::Audio) {
+		|| file->type == SendMediaType::Audio
+		|| file->type == SendMediaType::Round) {
 		setDocSize(file->filesize);
 	}
 }
@@ -294,7 +295,8 @@ void Uploader::upload(
 			file->partssize);
 	} else if (file->type == SendMediaType::File
 		|| file->type == SendMediaType::ThemeFile
-		|| file->type == SendMediaType::Audio) {
+		|| file->type == SendMediaType::Audio
+		|| file->type == SendMediaType::Round) {
 		const auto document = file->thumb.isNull()
 			? session().data().processDocument(file->document)
 			: session().data().processDocument(
@@ -356,7 +358,8 @@ void Uploader::notifyFailed(const Entry &entry) {
 		_photoFailed.fire_copy(entry.itemId);
 	} else if (type == SendMediaType::File
 		|| type == SendMediaType::ThemeFile
-		|| type == SendMediaType::Audio) {
+		|| type == SendMediaType::Audio
+		|| type == SendMediaType::Round) {
 		const auto document = session().data().document(entry.file->id);
 		if (document->uploading()) {
 			document->status = FileUploadFailed;
@@ -385,7 +388,8 @@ QByteArray Uploader::readDocPart(not_null<Entry*> entry) {
 	const auto checked = [&](QByteArray result) {
 		if ((entry->file->type == SendMediaType::File
 			|| entry->file->type == SendMediaType::ThemeFile
-			|| entry->file->type == SendMediaType::Audio)
+			|| entry->file->type == SendMediaType::Audio
+			|| entry->file->type == SendMediaType::Round)
 			&& entry->docSize <= kUseBigFilesFrom) {
 			entry->md5Hash.feed(result.data(), result.size());
 		}
@@ -756,7 +760,8 @@ void Uploader::partLoaded(const MTPBool &result, mtpRequestId requestId) {
 		_photoProgress.fire_copy(itemId);
 	} else if (entry.file->type == SendMediaType::File
 		|| entry.file->type == SendMediaType::ThemeFile
-		|| entry.file->type == SendMediaType::Audio) {
+		|| entry.file->type == SendMediaType::Audio
+		|| entry.file->type == SendMediaType::Round) {
 		const auto document = session().data().document(entry.file->id);
 		if (document->uploading()) {
 			document->uploadingData->offset = std::min(
@@ -856,7 +861,8 @@ void Uploader::finishFront() {
 		});
 	} else if (entry.file->type == SendMediaType::File
 		|| entry.file->type == SendMediaType::ThemeFile
-		|| entry.file->type == SendMediaType::Audio) {
+		|| entry.file->type == SendMediaType::Audio
+		|| entry.file->type == SendMediaType::Round) {
 		QByteArray docMd5(32, Qt::Uninitialized);
 		hashMd5Hex(entry.md5Hash.result(), docMd5.data());
 
diff --git a/Telegram/SourceFiles/storage/localimageloader.cpp b/Telegram/SourceFiles/storage/localimageloader.cpp
index 9daeaecdd..8a9869139 100644
--- a/Telegram/SourceFiles/storage/localimageloader.cpp
+++ b/Telegram/SourceFiles/storage/localimageloader.cpp
@@ -1014,7 +1014,7 @@ void FileLoadTask::process(Args &&args) {
 			MTPVector<MTPVideoSize>(),
 			MTP_int(_dcId),
 			MTP_vector<MTPDocumentAttribute>(attributes));
-		_type = SendMediaType::File;
+		_type = isRound ? SendMediaType::Round : SendMediaType::File;
 	}
 
 	if (_information) {