diff --git a/indra/llcommon/lldate.cpp b/indra/llcommon/lldate.cpp
index de7f2ead74e9774ba86d4a64fe924b9844e0fab7..a7ef28b431fdcef779fe9ac4ad54aa0d27c0b3f7 100644
--- a/indra/llcommon/lldate.cpp
+++ b/indra/llcommon/lldate.cpp
@@ -248,8 +248,27 @@ bool LLDate::fromStream(std::istream& s)
 		s >> fractional;
 		seconds_since_epoch += fractional;
 	}
-	c = s.get(); // skip the Z
-	if (c != 'Z') { return false; }
+
+	c = s.peek(); // check for offset
+	if (c == '+' || c == '-')
+	{
+		S32 offset_sign = (c == '+') ? 1 : -1;
+		S32 offset_hours = 0;
+		S32 offset_minutes = 0;
+		S32 offset_in_seconds = 0;
+
+		s >> offset_hours;
+
+		c = s.get(); // skip the colon a get the minutes if there are any
+		if (c == ':')
+		{		
+			s >> offset_minutes;
+		}
+		
+		offset_in_seconds =  (offset_hours * 60 + offset_sign * offset_minutes) * 60;
+		seconds_since_epoch -= offset_in_seconds;
+	}
+	else if (c != 'Z') { return false; } // skip the Z
 
 	mSecondsSinceEpoch = seconds_since_epoch;
 	return true;
diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp
index 00981d3c25c1e02a7642b14d0c71ba3b345da04d..129dd55e489c61db6426d4ef39c752932cf00125 100644
--- a/indra/newview/llfloatersnapshot.cpp
+++ b/indra/newview/llfloatersnapshot.cpp
@@ -164,8 +164,6 @@ class LLSnapshotLivePreview : public LLView
 	void setSnapshotBufferType(LLViewerWindow::ESnapshotType type) { mSnapshotBufferType = type; }
 	void updateSnapshot(BOOL new_snapshot, BOOL new_thumbnail = FALSE, F32 delay = 0.f);
 	LLFloaterPostcard* savePostcard();
-	void confirmSavingTexture(bool set_as_profile_pic = false);
-	bool onSavingTextureConfirmed(const LLSD& notification, const LLSD& response, bool set_as_profile_pic);
 	void saveTexture(bool set_as_profile_pic = false);
 	BOOL saveLocal();
 	void saveWeb(std::string url);
@@ -981,27 +979,6 @@ void profile_pic_upload_callback(const LLUUID& uuid)
 	floater->setAsProfilePic(uuid);
 }
 
-void LLSnapshotLivePreview::confirmSavingTexture(bool set_as_profile_pic)
-{
-	LLSD args;
-	args["AMOUNT"] = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
-	LLNotificationsUtil::add("UploadConfirmation", args, LLSD(),
-			boost::bind(&LLSnapshotLivePreview::onSavingTextureConfirmed, this, _1, _2, set_as_profile_pic));
-}
-
-bool LLSnapshotLivePreview::onSavingTextureConfirmed(const LLSD& notification, const LLSD& response, bool set_as_profile_pic)
-{
-	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
-
-	if (option == 0)
-	{
-		saveTexture(set_as_profile_pic);
-	}
-
-	return false;
-}
-
-
 void LLSnapshotLivePreview::saveTexture(bool set_as_profile_pic)
 {
 	// gen a new uuid for this asset
@@ -1180,6 +1157,9 @@ class LLFloaterSnapshot::Impl
 	static void onCommitSnapshotFormat(LLUICtrl* ctrl, void* data);
 	static void onCommitCustomResolution(LLUICtrl *ctrl, void* data);
 	static void onCommitSnapshot(LLFloaterSnapshot* view, LLSnapshotLivePreview::ESnapshotType type);
+	static void confirmSavingTexture(LLFloaterSnapshot* view, bool set_as_profile_pic = false);
+	static void onSavingTextureConfirmed(const LLSD& notification, const LLSD& response, LLFloaterSnapshot* view, bool set_as_profile_pic);
+	static void checkCloseOnKeep(LLFloaterSnapshot* view);
 	static void onCommitProfilePic(LLFloaterSnapshot* view);
 	static void showAdvanced(LLFloaterSnapshot* view, const BOOL visible);
 	static void resetSnapshotSizeOnUI(LLFloaterSnapshot *view, S32 width, S32 height) ;
@@ -1719,13 +1699,7 @@ class LLAvatarDataRequest : public LLAvatarPropertiesObserver
 
 void LLFloaterSnapshot::Impl::onCommitProfilePic(LLFloaterSnapshot* view)
 {
-	//first save to harddrive
-	LLSnapshotLivePreview* previewp = getPreviewView(view);
-	
-	if(previewp)
-	{
-		previewp->confirmSavingTexture(true);
-	}
+	confirmSavingTexture(view, true);
 }
 
 void LLFloaterSnapshot::Impl::onCommitSnapshot(LLFloaterSnapshot* view, LLSnapshotLivePreview::ESnapshotType type)
@@ -1739,14 +1713,17 @@ void LLFloaterSnapshot::Impl::onCommitSnapshot(LLFloaterSnapshot* view, LLSnapsh
 		if (type == LLSnapshotLivePreview::SNAPSHOT_WEB)
 		{
 			previewp->saveWeb(view->getString("share_to_web_url"));
+			checkCloseOnKeep(view);
 		}
 		else if (type == LLSnapshotLivePreview::SNAPSHOT_LOCAL)
 		{
 			previewp->saveLocal();
+			checkCloseOnKeep(view);
 		}
 		else if (type == LLSnapshotLivePreview::SNAPSHOT_TEXTURE)
 		{
-			previewp->confirmSavingTexture();
+			// uploads and then calls checkCloseOnKeep() on confirmation from user
+			confirmSavingTexture(view);
 		}
 		else if (type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD)
 		{
@@ -1759,16 +1736,40 @@ void LLFloaterSnapshot::Impl::onCommitSnapshot(LLFloaterSnapshot* view, LLSnapsh
 				gSnapshotFloaterView->addChild(floater);
 				view->addDependentFloater(floater, FALSE);
 			}
+			checkCloseOnKeep(view);
 		}
+	}
+}
 
-		if (gSavedSettings.getBOOL("CloseSnapshotOnKeep"))
-		{
-			view->closeFloater();
-		}
-		else
-		{
-			checkAutoSnapshot(previewp);
-		}
+void LLFloaterSnapshot::Impl::confirmSavingTexture(LLFloaterSnapshot* view, bool set_as_profile_pic)
+{
+	LLSD args;
+	args["AMOUNT"] = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
+	LLNotificationsUtil::add("UploadConfirmation", args, LLSD(),
+							 boost::bind(&onSavingTextureConfirmed, _1, _2, view, set_as_profile_pic));
+}
+
+void LLFloaterSnapshot::Impl::onSavingTextureConfirmed(const LLSD& notification, const LLSD& response, LLFloaterSnapshot* view, bool set_as_profile_pic)
+{
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+
+	if (option == 0)
+	{
+		LLSnapshotLivePreview* previewp = getPreviewView(view);
+		previewp->saveTexture(set_as_profile_pic);
+		checkCloseOnKeep(view);
+	}
+}
+
+void LLFloaterSnapshot::Impl::checkCloseOnKeep(LLFloaterSnapshot* view)
+{
+	if (gSavedSettings.getBOOL("CloseSnapshotOnKeep"))
+	{
+		view->closeFloater();
+	}
+	else
+	{
+		checkAutoSnapshot(getPreviewView(view));
 	}
 }