diff --git a/doc/contributions.txt b/doc/contributions.txt
index 7e8ab46b1a43b53b9fa8fb78c2a51e91e97ae5e8..27be8613055e348c793f53139f23bb5e23089fe2 100755
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -885,6 +885,8 @@ Mm Alder
 	VWR-4794
 	VWR-13578
 Mo Hax
+Moon Metty
+	STORM-2078
 Mourna Biziou
 Mr Greggan
 	VWR-445
@@ -1358,6 +1360,7 @@ Whirly Fizzle
 	VWR-29543
 	MAINT-873
 	STORM-1930
+	STORM-2078
 Whoops Babii
 	VWR-631
 	VWR-1640
diff --git a/indra/newview/llmaniprotate.cpp b/indra/newview/llmaniprotate.cpp
index 7861573908bc7c8c0e1f2f53ac50e5e48b2d55b7..50863ac9700fdb036b51953cb33def98fb03b84e 100755
--- a/indra/newview/llmaniprotate.cpp
+++ b/indra/newview/llmaniprotate.cpp
@@ -1241,9 +1241,9 @@ LLQuaternion LLManipRotate::dragUnconstrained( S32 x, S32 y )
 
 	LLVector3 axis = mMouseDown % mMouseCur;
 	axis.normVec();
-	F32 angle = acos(mMouseDown * mMouseCur);
+	F32 angle = atan2(sqrtf(axis * axis), mMouseDown * mMouseCur);
 	LLQuaternion sphere_rot( angle, axis );
-
+	
 	if (is_approx_zero(1.f - mMouseDown * mMouseCur))
 	{
 		return LLQuaternion::DEFAULT;
@@ -1638,9 +1638,9 @@ LLQuaternion LLManipRotate::dragConstrained( S32 x, S32 y )
 			mInSnapRegime = FALSE;
 		}
 
-		angle = acos(mMouseCur * mMouseDown);
-
-		F32 dir = (mMouseDown % mMouseCur) * constraint_axis;  // cross product
+		LLVector3 cross_product = mMouseDown % mMouseCur;
+		angle = atan2(sqrtf(cross_product * cross_product), mMouseCur * mMouseDown);
+		F32 dir = cross_product * constraint_axis;  // cross product
 		if( dir < 0.f )
 		{
 			angle *= -1.f;