diff --git a/aegisub/src/ass_file.cpp b/aegisub/src/ass_file.cpp
index 0cefd15e5817badc3819fcc816a74cad565873a8..59605822ff742e33f781ca5ef55dfe0904a6de65 100644
--- a/aegisub/src/ass_file.cpp
+++ b/aegisub/src/ass_file.cpp
@@ -136,6 +136,21 @@ int AssFile::GetScriptInfoAsInt(std::string const& key) const {
 	return atoi(GetScriptInfo(key).c_str());
 }
 
+std::string AssFile::GetUIState(std::string const& key) const {
+	auto value = GetScriptInfo("Aegisub " + key);
+	if (value.empty())
+		value = GetScriptInfo(key);
+	return value;
+}
+
+int AssFile::GetUIStateAsInt(std::string const& key) const {
+	return atoi(GetUIState(key).c_str());
+}
+
+void AssFile::SaveUIState(std::string const& key, std::string const& value) {
+	SetScriptInfo("Aegisub " + key, value);
+}
+
 void AssFile::SetScriptInfo(std::string const& key, std::string const& value) {
 	for (auto info : Line | agi::of_type<AssInfo>()) {
 		if (boost::iequals(key, info->Key())) {
diff --git a/aegisub/src/ass_file.h b/aegisub/src/ass_file.h
index 932daf0d7da3014da1967c1021eaa42e72880066..c00a6695cf49772657716e8e4b956b3103e180bd 100644
--- a/aegisub/src/ass_file.h
+++ b/aegisub/src/ass_file.h
@@ -95,6 +95,9 @@ public:
 	std::string GetScriptInfo(std::string const& key) const;
 	/// Set the value of a [Script Info] key. Adds it if it doesn't exist.
 	void SetScriptInfo(std::string const& key, std::string const& value);
+	std::string GetUIState(std::string const& key) const;
+	int GetUIStateAsInt(std::string const& key) const;
+	void SaveUIState(std::string const& key, std::string const& value);
 
 	/// Type of changes made in a commit
 	enum CommitType {
diff --git a/aegisub/src/base_grid.cpp b/aegisub/src/base_grid.cpp
index 82ef551221bc889f6f918b72b66fa2579d89ef0b..4b4d37ffffb6d0686a4456209ccef77bd1fcd44b 100644
--- a/aegisub/src/base_grid.cpp
+++ b/aegisub/src/base_grid.cpp
@@ -187,7 +187,7 @@ void BaseGrid::OnSubtitlesOpen() {
 	UpdateMaps();
 
 	if (GetRows()) {
-		int row = context->ass->GetScriptInfoAsInt("Active Line");
+		int row = context->ass->GetUIStateAsInt("Active Line");
 		if (row < 0 || row >= GetRows())
 			row = 0;
 
@@ -195,15 +195,15 @@ void BaseGrid::OnSubtitlesOpen() {
 		SelectRow(row);
 	}
 
-	ScrollTo(context->ass->GetScriptInfoAsInt("Scroll Position"));
+	ScrollTo(context->ass->GetUIStateAsInt("Scroll Position"));
 
 	EndBatch();
 	SetColumnWidths();
 }
 
 void BaseGrid::OnSubtitlesSave() {
-	context->ass->SetScriptInfo("Scroll Position", std::to_string(yPos));
-	context->ass->SetScriptInfo("Active Line", std::to_string(GetDialogueIndex(active_line)));
+	context->ass->SaveUIState("Scroll Position", std::to_string(yPos));
+	context->ass->SaveUIState("Active Line", std::to_string(GetDialogueIndex(active_line)));
 }
 
 void BaseGrid::OnShowColMenu(wxCommandEvent &event) {
diff --git a/aegisub/src/frame_main.cpp b/aegisub/src/frame_main.cpp
index 1747288af1cdc4b953138e853039e7c7bd9251df..b79a4201b3881743913b5eabf319545a3b8132a5 100644
--- a/aegisub/src/frame_main.cpp
+++ b/aegisub/src/frame_main.cpp
@@ -616,9 +616,9 @@ void FrameMain::OnSubtitlesOpen() {
 	if (videoChanged) {
 		context->videoController->SetVideo(video);
 		if (context->videoController->IsLoaded()) {
-			context->videoController->JumpToFrame(context->ass->GetScriptInfoAsInt("Video Position"));
+			context->videoController->JumpToFrame(context->ass->GetUIStateAsInt("Video Position"));
 
-			std::string arString = context->ass->GetScriptInfo("Video Aspect Ratio");
+			std::string arString = context->ass->GetUIState("Video Aspect Ratio");
 			if (boost::starts_with(arString, "c")) {
 				double ar = 0.;
 				agi::util::try_parse(arString.substr(1), &ar);
@@ -631,7 +631,7 @@ void FrameMain::OnSubtitlesOpen() {
 			}
 
 			double videoZoom = 0.;
-			if (agi::util::try_parse(context->ass->GetScriptInfo("Video Zoom Percent"), &videoZoom))
+			if (agi::util::try_parse(context->ass->GetUIState("Video Zoom Percent"), &videoZoom))
 				context->videoDisplay->SetZoom(videoZoom);
 		}
 	}
diff --git a/aegisub/src/video_context.cpp b/aegisub/src/video_context.cpp
index 9935a80fe3f4d70b49212c28157f18ba436be1ee..ff3e8896fd71226c412e82926f4c9567f9112cd8 100644
--- a/aegisub/src/video_context.cpp
+++ b/aegisub/src/video_context.cpp
@@ -248,8 +248,8 @@ void VideoContext::OnSubtitlesSave() {
 
 	if (!IsLoaded()) {
 		context->ass->SetScriptInfo("Video File", "");
-		context->ass->SetScriptInfo("Video Aspect Ratio", "");
-		context->ass->SetScriptInfo("Video Position", "");
+		context->ass->SaveUIState("Video Aspect Ratio", "");
+		context->ass->SaveUIState("Video Position", "");
 		return;
 	}
 
@@ -261,8 +261,8 @@ void VideoContext::OnSubtitlesSave() {
 
 	context->ass->SetScriptInfo("Video File", config::path->MakeRelative(video_filename, "?script").generic_string());
 	context->ass->SetScriptInfo("YCbCr Matrix", video_provider->GetColorSpace());
-	context->ass->SetScriptInfo("Video Aspect Ratio", ar);
-	context->ass->SetScriptInfo("Video Position", std::to_string(frame_n));
+	context->ass->SaveUIState("Video Aspect Ratio", ar);
+	context->ass->SaveUIState("Video Position", std::to_string(frame_n));
 }
 
 void VideoContext::JumpToFrame(int n) {
diff --git a/aegisub/src/video_display.cpp b/aegisub/src/video_display.cpp
index 40bbd4e980540c7c04a362fc04abf714a599babd..70e0c174d9606e661ed3091eea0c6a649371e628 100644
--- a/aegisub/src/video_display.cpp
+++ b/aegisub/src/video_display.cpp
@@ -435,5 +435,5 @@ void VideoDisplay::Unload() {
 }
 
 void VideoDisplay::OnSubtitlesSave() {
-	con->ass->SetScriptInfo("Video Zoom Percent", std::to_string(zoomValue));
+	con->ass->SaveUIState("Video Zoom Percent", std::to_string(zoomValue));
 }