diff --git a/indra/newview/llfloaterregionrestarting.cpp b/indra/newview/llfloaterregionrestarting.cpp
index b793d259cd7fc5461b5b3ae9e759fb39bd3bca0c..94c805205ab2f1da54923b4be6c71109484a32e9 100644
--- a/indra/newview/llfloaterregionrestarting.cpp
+++ b/indra/newview/llfloaterregionrestarting.cpp
@@ -100,15 +100,17 @@ void LLFloaterRegionRestarting::draw()
 {
 	LLFloater::draw();
 
-	const F32 SHAKE_INTERVAL = 0.03;
-	const U32 SHAKE_ITERATIONS = 4;
-	const F32 SHAKE_AMOUNT = 1.5;
-
+	const F32 SHAKE_INTERVAL = 0.04;
+	const F32 SHAKE_TOTAL_DURATION = 1.8; // the length of the default alert tone for this
+	const F32 SHAKE_INITIAL_MAGNITUDE = 1.5;
+	F32 time_shaking;
+	
 	if(SHAKE_START == sShakeState)
 	{
 			mShakeTimer.setTimerExpirySec(SHAKE_INTERVAL);
 			sShakeState = SHAKE_LEFT;
-			mIterations = 0;
+			mShakeIterations = 0;
+			mShakeMagnitude = SHAKE_INITIAL_MAGNITUDE;
 	}
 
 	if(SHAKE_DONE != sShakeState && mShakeTimer.hasExpired())
@@ -118,30 +120,34 @@ void LLFloaterRegionRestarting::draw()
 		switch(sShakeState)
 		{
 			case SHAKE_LEFT:
-				gAgentCamera.setPanLeftKey(SHAKE_AMOUNT);
+				gAgentCamera.setPanLeftKey(mShakeMagnitude);
 				sShakeState = SHAKE_UP;
 				break;
 
 			case SHAKE_UP:
-				gAgentCamera.setPanUpKey(SHAKE_AMOUNT);
+				gAgentCamera.setPanUpKey(mShakeMagnitude);
 				sShakeState = SHAKE_RIGHT;
 				break;
 
 			case SHAKE_RIGHT:
-				gAgentCamera.setPanRightKey(SHAKE_AMOUNT);
+				gAgentCamera.setPanRightKey(mShakeMagnitude);
 				sShakeState = SHAKE_DOWN;
 				break;
 
 			case SHAKE_DOWN:
-				gAgentCamera.setPanDownKey(SHAKE_AMOUNT);
-				mIterations = mIterations + 1;
-				if(SHAKE_ITERATIONS == mIterations)
+				gAgentCamera.setPanDownKey(mShakeMagnitude);
+				mShakeIterations++;
+				time_shaking = SHAKE_INTERVAL * (mShakeIterations * 4 /* left, up, right, down */);
+				if(SHAKE_TOTAL_DURATION <= time_shaking)
 				{
 					sShakeState = SHAKE_DONE;
+					mShakeMagnitude = 0.0;
 				}
 				else
 				{
 					sShakeState = SHAKE_LEFT;
+					F32 percent_done_shaking = (SHAKE_TOTAL_DURATION - time_shaking) / SHAKE_TOTAL_DURATION;
+					mShakeMagnitude = SHAKE_INITIAL_MAGNITUDE * (percent_done_shaking * percent_done_shaking); // exponential decay
 				}
 				break;
 
diff --git a/indra/newview/llfloaterregionrestarting.h b/indra/newview/llfloaterregionrestarting.h
index 95fe772a28ff2b3bba9401bbe8a1b72d048771be..46416db2c883d539c722637c0ce9717f34c0ae18 100644
--- a/indra/newview/llfloaterregionrestarting.h
+++ b/indra/newview/llfloaterregionrestarting.h
@@ -49,7 +49,8 @@ class LLFloaterRegionRestarting : public LLFloater,  public LLEventTimer
 	virtual void regionChange();
 
 	std::string mName;
-	U32 mIterations;
+	U32 mShakeIterations;
+	F32 mShakeMagnitude;
 	LLTimer mShakeTimer;
 
 	boost::signals2::connection mRegionChangedConnection;