diff --git a/Telegram/SourceFiles/core/application.cpp b/Telegram/SourceFiles/core/application.cpp
index bde661b70..734850ab2 100644
--- a/Telegram/SourceFiles/core/application.cpp
+++ b/Telegram/SourceFiles/core/application.cpp
@@ -123,7 +123,14 @@ Application::Application(not_null<Launcher*> launcher)
 
 Application::~Application() {
 	_window.reset();
-	_mediaView.reset();
+	if (_mediaView) {
+		_mediaView->clearData();
+		_mediaView = nullptr;
+	}
+
+	if (activeAccount().sessionExists()) {
+		activeAccount().session().saveSettingsNowIfNeeded();
+	}
 
 	// This can call writeMap() that serializes Main::Session.
 	// In case it gets called after destroySession() we get missing data.
diff --git a/Telegram/SourceFiles/main/main_session.cpp b/Telegram/SourceFiles/main/main_session.cpp
index b88690b84..39fb80754 100644
--- a/Telegram/SourceFiles/main/main_session.cpp
+++ b/Telegram/SourceFiles/main/main_session.cpp
@@ -203,6 +203,13 @@ Support::Templates& Session::supportTemplates() const {
 	return supportHelper().templates();
 }
 
+void Session::saveSettingsNowIfNeeded() {
+	if (_saveSettingsTimer.isActive()) {
+		_saveSettingsTimer.cancel();
+		Local::writeUserSettings();
+	}
+}
+
 } // namespace Main
 
 Main::Session &Auth() {
diff --git a/Telegram/SourceFiles/main/main_session.h b/Telegram/SourceFiles/main/main_session.h
index a215ee815..10ef88afb 100644
--- a/Telegram/SourceFiles/main/main_session.h
+++ b/Telegram/SourceFiles/main/main_session.h
@@ -106,6 +106,7 @@ public:
 		return _settings;
 	}
 	void saveSettingsDelayed(crl::time delay = kDefaultSaveDelay);
+	void saveSettingsNowIfNeeded();
 
 	[[nodiscard]] not_null<MTP::Instance*> mtp();
 	[[nodiscard]] ApiWrap &api() {
diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp
index 5f12d0f79..d9cf894d1 100644
--- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp
+++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp
@@ -439,9 +439,12 @@ bool OverlayWidget::documentBubbleShown() const {
 
 void OverlayWidget::clearStreaming(bool savePosition) {
 	if (_streamed && _doc && savePosition) {
+		using State = Media::Player::State;
 		const auto state = _streamed->instance.player().prepareLegacyState();
 		const auto time = (state.position == kTimeUnknown
-			|| state.length == kTimeUnknown)
+			|| state.length == kTimeUnknown
+			|| state.state == State::PausedAtEnd
+			|| Media::Player::IsStopped(state.state))
 			? TimeId(0)
 			: (state.length >= kMinLengthForSavePosition * state.frequency)
 			? (state.position / state.frequency) * crl::time(1000)