diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index b0894f562c9f059ad35b98f212f717dd26741160..d341e98a38adebcc3bca3c062476ffdebe8910d9 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -10254,6 +10254,17 @@
       <key>Value</key>
       <integer>1</integer>
     </map>
+    <key>RenderResolutionMultiplier</key>
+    <map>
+      <key>Comment</key>
+      <string>Multiplier for rendering 3D scene at reduced resolution.</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>F32</string>
+      <key>Value</key>
+      <real>1.0</real>
+    </map>
     <key>RenderShaderLightingMaxLevel</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp
index e83bda40e0937b381145ef0b3d45868b89d4daa9..03a59712f7964b9f1e916896fbd3b94ef05fd278 100644
--- a/indra/newview/llviewercontrol.cpp
+++ b/indra/newview/llviewercontrol.cpp
@@ -635,6 +635,9 @@ void settings_setup_listeners()
 	gSavedSettings.getControl("RenderDebugGL")->getSignal()->connect(boost::bind(&handleRenderDebugGLChanged, _2));
 	gSavedSettings.getControl("RenderDebugPipeline")->getSignal()->connect(boost::bind(&handleRenderDebugPipelineChanged, _2));
 	gSavedSettings.getControl("RenderResolutionDivisor")->getSignal()->connect(boost::bind(&handleRenderResolutionDivisorChanged, _2));
+// [SL:KB] - Patch: Settings-RenderResolutionMultiplier | Checked: Catznip-5.4
+	gSavedSettings.getControl("RenderResolutionMultiplier")->getSignal()->connect(boost::bind(&handleRenderResolutionDivisorChanged, _2));
+// [/SL:KB]
 	gSavedSettings.getControl("RenderDeferred")->getSignal()->connect(boost::bind(&handleRenderDeferredChanged, _2));
 	gSavedSettings.getControl("RenderShadowDetail")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
 	gSavedSettings.getControl("RenderDeferredSSAO")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 0d3bea3269c3f6a4f06a7023f121d77adf8c30fb..4db9bde5727193bec0e66d45de31188ca239733f 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -141,6 +141,9 @@ bool LLPipeline::RenderDeferred;
 F32 LLPipeline::RenderDeferredSunWash;
 U32 LLPipeline::RenderFSAASamples;
 U32 LLPipeline::RenderResolutionDivisor;
+// [SL:KB] - Patch: Settings-RenderResolutionMultiplier | Checked: Catznip-5.4
+F32 LLPipeline::RenderResolutionMultiplier;
+// [/SL:KB]
 bool LLPipeline::RenderUIBuffer;
 S32 LLPipeline::RenderShadowDetail;
 bool LLPipeline::RenderDeferredSSAO;
@@ -586,6 +589,9 @@ void LLPipeline::init()
 	connectRefreshCachedSettingsSafe("RenderDeferredSunWash");
 	connectRefreshCachedSettingsSafe("RenderFSAASamples");
 	connectRefreshCachedSettingsSafe("RenderResolutionDivisor");
+// [SL:KB] - Patch: Settings-RenderResolutionMultiplier | Checked: Catznip-5.4
+	connectRefreshCachedSettingsSafe("RenderResolutionMultiplier");
+// [/SL:KB]
 	connectRefreshCachedSettingsSafe("RenderUIBuffer");
 	connectRefreshCachedSettingsSafe("RenderShadowDetail");
 	connectRefreshCachedSettingsSafe("RenderDeferredSSAO");
@@ -792,17 +798,20 @@ void LLPipeline::resizeScreenTexture()
 		GLuint resX = gViewerWindow->getWorldViewWidthRaw();
 		GLuint resY = gViewerWindow->getWorldViewHeightRaw();
 	
-// [RLVa:KB] - Checked: 2014-02-23 (RLVa-1.4.10)
-		U32 resMod = RenderResolutionDivisor, resAdjustedX = resX, resAdjustedY = resY;
-		if ( (resMod > 1) && (resMod < resX) && (resMod < resY) )
+// [SL:KB] - Patch: Settings-RenderResolutionMultiplier | Checked: Catznip-5.4
+		if ( (RenderResolutionDivisor > 1) && (RenderResolutionDivisor < resX) && (RenderResolutionDivisor < resY) )
 		{
-			resAdjustedX /= resMod;
-			resAdjustedY /= resMod;
+			resX /= RenderResolutionDivisor;
+			resY /= RenderResolutionDivisor;
 		}
+		else if (RenderResolutionMultiplier != 1.f)
+		{
+			resX *= RenderResolutionMultiplier;
+			resY *= RenderResolutionMultiplier;
+		}
+// [/SL:KB]
 
-		if ( (resAdjustedX != mScreen.getWidth()) || (resAdjustedY != mScreen.getHeight()) )
-// [/RLVa:KB]
-//		if ((resX != mScreen.getWidth()) || (resY != mScreen.getHeight()))
+		if ((resX != mScreen.getWidth()) || (resY != mScreen.getHeight()))
 		{
 			releaseScreenBuffers();
 		if (!allocateScreenBuffer(resX,resY))
@@ -938,6 +947,13 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
 		resX /= res_mod;
 		resY /= res_mod;
 	}
+// [SL:KB] - Patch: Settings-RenderResolutionMultiplier | Checked: Catznip-5.4
+	else if (RenderResolutionMultiplier != 1.f)
+	{
+		resX *= RenderResolutionMultiplier;
+		resY *= RenderResolutionMultiplier;
+	}
+// [/SL:KB]
 
 	if (RenderUIBuffer)
 	{
@@ -1116,6 +1132,9 @@ void LLPipeline::refreshCachedSettings()
 	RenderDeferredSunWash = gSavedSettings.getF32("RenderDeferredSunWash");
 	RenderFSAASamples = gSavedSettings.getU32("RenderFSAASamples");
 	RenderResolutionDivisor = gSavedSettings.getU32("RenderResolutionDivisor");
+// [SL:KB] - Patch: Settings-RenderResolutionMultiplier | Checked: Catznip-5.4
+	RenderResolutionMultiplier = gSavedSettings.getF32("RenderResolutionMultiplier");
+// [/SL:KB]
 	RenderUIBuffer = gSavedSettings.getBOOL("RenderUIBuffer");
 	RenderShadowDetail = gSavedSettings.getS32("RenderShadowDetail");
 	RenderDeferredSSAO = gSavedSettings.getBOOL("RenderDeferredSSAO");
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index 42d23ca02d224a86184db031f4a0c313105822d8..fa500148b2378e6fd66f86384a92183349439c3e 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -871,6 +871,9 @@ public:
 	static F32 RenderDeferredSunWash;
 	static U32 RenderFSAASamples;
 	static U32 RenderResolutionDivisor;
+// [SL:KB] - Patch: Settings-RenderResolutionMultiplier | Checked: Catznip-5.4
+	static F32 RenderResolutionMultiplier;
+// [/SL:KB]
 	static bool RenderUIBuffer;
 	static S32 RenderShadowDetail;
 	static bool RenderDeferredSSAO;