diff --git a/indra/newview/llsnapshotlivepreview.cpp b/indra/newview/llsnapshotlivepreview.cpp
index b192cef1d9e7c27f74e6fe7e548d89ba152b4b11..6f015e07481f9c00fb25e66c911ab229e9ed0e71 100644
--- a/indra/newview/llsnapshotlivepreview.cpp
+++ b/indra/newview/llsnapshotlivepreview.cpp
@@ -276,7 +276,8 @@ void LLSnapshotLivePreview::drawPreviewRect(S32 offset_x, S32 offset_y)
 //called when the frame is frozen.
 void LLSnapshotLivePreview::draw()
 {
-	if (getCurrentImage() &&
+	LLViewerTexture* currentImage = getCurrentImage();
+	if (currentImage &&
 		mPreviewImageEncoded.notNull() &&
 		getSnapshotUpToDate())
 	{
@@ -289,10 +290,10 @@ void LLSnapshotLivePreview::draw()
 
 		LLColor4 image_color(1.f, 1.f, 1.f, 1.f);
 		gGL.color4fv(image_color.mV);
-		gGL.getTexUnit(0)->bind(getCurrentImage());
+		gGL.getTexUnit(0)->bind(currentImage);
 		// calculate UV scale
-		F32 uv_width = isImageScaled() ? 1.f : llmin((F32)getWidth() / (F32)getCurrentImage()->getWidth(), 1.f);
-		F32 uv_height = isImageScaled() ? 1.f : llmin((F32)getHeight() / (F32)getCurrentImage()->getHeight(), 1.f);
+		F32 uv_width = isImageScaled() ? 1.f : llmin((F32)getWidth() / (F32)currentImage->getWidth(), 1.f);
+		F32 uv_height = isImageScaled() ? 1.f : llmin((F32)getHeight() / (F32)currentImage->getHeight(), 1.f);
 		gGL.pushMatrix();
 		{	
 			gGL.translatef((F32)rect.mLeft, (F32)rect.mBottom + TOP_PANEL_HEIGHT, 0.f);
@@ -645,18 +646,19 @@ LLViewerTexture* LLSnapshotLivePreview::getBigThumbnailImage()
 //static 
 BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )
 {
+	BOOL success = FALSE;
 	LLSnapshotLivePreview* previewp = (LLSnapshotLivePreview*)snapshot_preview;
 	if (previewp->getWidth() == 0 || previewp->getHeight() == 0)
 	{
 		LL_WARNS("Snapshot") << "Incorrect dimensions: " << previewp->getWidth() << "x" << previewp->getHeight() << LL_ENDL;
-		return FALSE;
+		return success;
 	}
 
 	if (previewp->mSnapshotDelayTimer.getStarted()) // Wait for a snapshot delay timer
 	{
 		if (!previewp->mSnapshotDelayTimer.hasExpired())
 		{
-			return FALSE;
+			return success;
 		}
 		previewp->mSnapshotDelayTimer.stop();
 	}
@@ -664,7 +666,7 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )
 	if (LLToolCamera::getInstance()->hasMouseCapture()) // Hide full-screen preview while camming, either don't take snapshots while ALT-zoom active
 	{
 		previewp->setVisible(FALSE);
-		return FALSE;
+		return success;
 	}
 
 	// If we're in freeze-frame and/or auto update mode and camera has moved, update snapshot.
@@ -689,9 +691,12 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )
 
 	if (previewp->getSnapshotUpToDate() && previewp->getThumbnailUpToDate())
 	{
-		return FALSE;
+		return success;
 	}
 
+	auto last_image = previewp->mFormattedImage;
+	auto last_preview = previewp->mPreviewImage;
+	auto last_preview_encoded = previewp->mPreviewImageEncoded;
 	// time to produce a snapshot
 	if(!previewp->getSnapshotUpToDate())
     {
@@ -710,7 +715,7 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )
         previewp->setImageScaled(FALSE);
 
         // grab the raw image
-        if (gViewerWindow->rawSnapshot(
+		success = gViewerWindow->rawSnapshot(
                 previewp->mPreviewImage,
                 previewp->getWidth(),
                 previewp->getHeight(),
@@ -720,7 +725,8 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )
                 gSavedSettings.getBOOL("RenderHUDInSnapshot"),
                 FALSE,
                 previewp->mSnapshotBufferType,
-                previewp->getMaxImageSize()))
+                previewp->getMaxImageSize());
+        if (success)
         {
             // Invalidate/delete any existing encoded image
             previewp->mPreviewImageEncoded = NULL;
@@ -740,26 +746,39 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )
         
             // We need to update the thumbnail though
             previewp->setThumbnailImageSize();
-            previewp->generateThumbnailImage(TRUE) ;
+
+       		previewp->generateThumbnailImage(TRUE) ;
+			previewp->getWindow()->decBusyCount();
+        	previewp->setVisible(gSavedSettings.getBOOL("UseFreezeFrame") && previewp->mAllowFullScreenPreview); // only show fullscreen preview when in freeze frame mode
+	        previewp->mSnapshotActive = FALSE;
+        	LL_DEBUGS("Snapshot") << "done creating snapshot" << LL_ENDL;
         }
-        previewp->getWindow()->decBusyCount();
-        previewp->setVisible(gSavedSettings.getBOOL("UseFreezeFrame") && previewp->mAllowFullScreenPreview); // only show fullscreen preview when in freeze frame mode
-        previewp->mSnapshotActive = FALSE;
-        LL_DEBUGS("Snapshot") << "done creating snapshot" << LL_ENDL;
+		else
+		{
+			LL_WARNS() << "Failed creating snapshot" << LL_ENDL;
+			previewp->mSnapshotDelayTimer.stop();
+
+        	// previewp->setVisible(gSavedSettings.getBOOL("UseFreezeFrame") && previewp->mAllowFullScreenPreview); // only show fullscreen preview when in freeze frame mode
+			// Restore the old data
+            previewp->mSnapshotActive = FALSE;
+			previewp->mThumbnailUpdateLock = FALSE;
+			previewp->mSnapshotUpToDate = TRUE;
+			previewp->mThumbnailUpToDate = TRUE;
+            previewp->mFormattedImage = last_image;
+			previewp->mPreviewImageEncoded = last_preview;
+			previewp->mPreviewImageEncoded = last_preview_encoded;
+			previewp->generateThumbnailImage(FALSE);
+            previewp->getWindow()->decBusyCount();
+			gPipeline.doResetVertexBuffers(true);
+		}
     }
-    
-    if (!previewp->getThumbnailUpToDate())
-	{
-		previewp->generateThumbnailImage() ;
-	}
-    
     // Tell the floater container that the snapshot is updated now
     if (previewp->mViewContainer)
     {
         previewp->mViewContainer->notify(LLSD().with("snapshot-updated", true));
     }
 
-	return TRUE;
+	return success;
 }
 
 void LLSnapshotLivePreview::prepareFreezeFrame()
diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h
index e92e7d34198f0a7d52167cf1b8956f5469a9245d..5a39cb49115e4829997f17cb1342045453e7a4bf 100644
--- a/indra/newview/llviewerwindow.h
+++ b/indra/newview/llviewerwindow.h
@@ -136,7 +136,7 @@ class LLPickInfo
 
 };
 
-static const U32 MAX_SNAPSHOT_IMAGE_SIZE = 7680; // max snapshot image size 7680 * 7680 UHDTV2
+static const U32 MAX_SNAPSHOT_IMAGE_SIZE = 10240; // max snapshot image size
 
 class LLViewerWindow final : public LLWindowCallbacks
 {
diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_local.xml b/indra/newview/skins/default/xui/en/panel_snapshot_local.xml
index bb464d60d98176fa3afd17733a7f8b8b47607925..0dfb9f97631dc26701e0c9cf1f6aae8c209b08f5 100644
--- a/indra/newview/skins/default/xui/en/panel_snapshot_local.xml
+++ b/indra/newview/skins/default/xui/en/panel_snapshot_local.xml
@@ -62,18 +62,70 @@
          label="800x600"
          name="800x600"
          value="[i800,i600]" />
+		 <combo_box.item
+         label="720p"
+         name="1280x720"
+         value="[i1280,i720]" />
         <combo_box.item
          label="1024x768"
          name="1024x768"
          value="[i1024,i768]" />
+        <combo_box.item
+         label="SL Texture (1024x1024)"
+         name="1024x1024"
+         value="[i1024,i1024]" />
         <combo_box.item
          label="1280x1024"
          name="1280x1024"
          value="[i1280,i1024]" />
+        <combo_box.item
+         label="1080p (16:9)"
+         name="1920x1080"
+         value="[i1920,i1080]" />
         <combo_box.item
          label="1600x1200"
          name="1600x1200"
          value="[i1600,i1200]" />
+        <combo_box.item
+         label="1080p FHD (21:9)"
+         name="2560x1080"
+         value="[i2560,i1080]" />
+        <combo_box.item
+         label="1440p QHD (16:9)"
+         name="2560x1440"
+         value="[i2560,i1440]" />
+        <combo_box.item
+         label="1440p WQHD &quot;Ultra-Wide&quot; (21:9)"
+         name="3440x1440"
+         value="[i3440,i1440]" />
+        <combo_box.item
+         label="1440p DQHD (32:9)"
+         name="5120x1440"
+         value="[i5120,i1440]" />
+        <combo_box.item
+         label="4K (16:9)"
+         name="3840x2160"
+         value="[i3840,i2160]" />
+        <combo_box.item
+         label="4K (1.90:1)"
+         name="4096x2160"
+         value="[i4096,i2160]" />
+        <combo_box.item
+         label="4K UWD (21:9)"
+         name="5120x2160"
+         value="[i5120,i2160]" />
+        <combo_box.item
+         label="4K (4:3)"
+         name="4096x3072"
+         value="[i4096,i3072]" />
+        <combo_box.item
+         label="8K (16:9)"
+         name="7680x4320"
+         value="[i7680,i4320]" />
+        <combo_box.item
+         label="8K (21:9)"
+         name="10240x4320"
+         value="[i10240,i4320]" />
         <combo_box.item
          label="Custom"
          name="Custom"
@@ -89,7 +141,6 @@
      label_width="90"
      layout="topleft"
      left="10"
-     max_val="6016"
      min_val="32"
      name="local_snapshot_width"
      top_pad="7"
@@ -104,7 +155,6 @@
      label_width="0"
      layout="topleft"
      left_pad="0"
-     max_val="6016"
      min_val="32"
      name="local_snapshot_height"
      top_delta="0"
@@ -200,4 +250,4 @@
          name="saveas_item"
          value="save as" />
     </flyout_button>
-</panel>
\ No newline at end of file
+</panel>