diff --git a/NORSPEC-207.patch b/NORSPEC-207.patch
new file mode 100644
index 0000000000000000000000000000000000000000..a1c1447bdab6fdb46bd916532862eedb00bc36e0
--- /dev/null
+++ b/NORSPEC-207.patch
@@ -0,0 +1,164 @@
+diff -r fe4bab01522e indra/llprimitive/llrendermaterialtable.cpp
+--- a/indra/llprimitive/llrendermaterialtable.cpp	Wed May 15 17:57:21 2013 +0000
++++ b/indra/llprimitive/llrendermaterialtable.cpp	Wed May 22 14:23:04 2013 -0700
+@@ -184,6 +184,44 @@
+ 	}
+ }
+ 
++// 'v' is an integer value for 100ths of radians (don't ask...)
++//
++void LLRenderMaterialEntry::LLRenderMaterial::setSpecularMapRotation(S32 v) const
++{
++	// Store the fact that we're using the new rotation rep
++	//
++	m_flags |= kNewSpecularMapRotation;
++
++	// Store 'sign bit' in our m_flags
++	//
++	m_flags &= ~kSpecularMapRotationNegative;
++	m_flags |= (specularMapRotation < 0) ? kSpecularMapRotationNegative : 0;
++
++	specularRotation = abs(specularRotation);
++	specularRotation = llmin(specularRotation, MAX_MATERIAL_MAP_ROTATION);
++
++	m_specularRotation = (U16)(abs(specularMapRotation));
++}
++
++// 'v' is an integer value for 100ths of radians (don't ask...)
++//
++void LLRenderMaterialEntry::LLRenderMaterial::setNormalMapRotation(S32 v) const
++{
++
++	// Store the fact that we're using the new rep for this material
++	//
++	m_flags |= kNewNormalMapRotation;
++
++	// Store 'sign bit' in our m_flags
++	//
++	m_flags &= ~kNormalMapRotationNegative;
++	m_flags |= (normalMapRotation < 0) ? kNormalMapRotationNegative : 0;
++
++	normalRotation = abs(normalRotation);
++	normalRotation = llmin(normalRotation, MAX_MATERIAL_MAP_ROTATION);
++
++	m_normalRotation = (U16)(abs(normalMapRotation));
++}
+ 
+ void LLRenderMaterialEntry::LLRenderMaterial::asLLSD( LLSD& dest ) const
+ {
+@@ -193,20 +231,45 @@
+ 	dest["NormOffsetY"] = (S32)m_normalOffsetY;
+ 	dest["NormRepeatX"] = m_normalRepeatX;
+ 	dest["NormRepeatY"] = m_normalRepeatY;
+-	dest["NormRotation"] = (S32)m_normalRotation;
++
++	S32 value = (S32)m_normalMapRotation;
++
++	// If we don't have the flag for new rotations set,
++	// then we need to convert it now
++	if (!(m_flags & kNewNormalMapRotation))
++	{
++		F32 old_radians = ((F32)m_normalMapRotation / 10000.0f)
++		S32 new_val	    = (S32)(old_radians * 100.0f);
++		setNormalMapRotation(new_Val);
++	}
++
++	dest["NormRotation"] = (m_flags & kNormalMapRotationNegative) ? -(S32)m_normalRotation : (S32)m_normalRotation;
+ 
+ 	dest["SpecOffsetX"] = (S32)m_specularOffsetX;
+ 	dest["SpecOffsetY"] = (S32)m_specularOffsetY;
+ 	dest["SpecRepeatX"] = m_specularRepeatX;
+ 	dest["SpecRepeatY"] = m_specularRepeatY;
+-	dest["SpecRotation"] = (S32)m_specularRotation;
++
++
++	value = (S32)m_specularRotation;
++
++	// If we don't have the flag for new rotations set,
++	// then we need to convert it now
++	if (!(m_flags & kNewSpecularMapRotation))
++	{
++		F32 old_radians = ((F32)m_specularMapRotation / 10000.0f)
++		S32 new_val	    = (S32)(old_radians * 100.0f);
++		setSpecularMapRotation(new_Val);
++	}
++
++	dest["SpecRotation"] = (m_flags & kSpecularMapRotationNegative) ? -(S32)m_specularRotation : (S32)m_specularRotation;
+ 
+ 	dest["SpecMap"] = m_specularMap;
+ 	dest["SpecColor"] = m_specularLightColor.getValue();
+ 	dest["SpecExp"] = (S32)m_specularLightExponent;
+ 	dest["EnvIntensity"] = (S32)m_environmentIntensity;
+ 	dest["AlphaMaskCutoff"] = (S32)m_alphaMaskCutoff;
+-	dest["DiffuseAlphaMode"] = (S32)m_diffuseAlphaMode;
++	dest["DiffuseAlphaMode"] = (S32)(m_diffuseAlphaMode & 0xF);
+ 	
+ }
+ 
+@@ -217,7 +280,10 @@
+ 	m_normalOffsetY = (U16)materialDefinition["NormOffsetY"].asInteger();
+ 	m_normalRepeatX = materialDefinition["NormRepeatX"].asInteger();
+ 	m_normalRepeatY = materialDefinition["NormRepeatY"].asInteger();
+-	m_normalRotation = (U16)materialDefinition["NormRotation"].asInteger();
++
++	S32 normalRotation = materialDefinition["NormRotation"].asInteger();
++
++	setNormalMapRotation(normalRotation);
+ 
+ 	m_specularMap = materialDefinition["SpecMap"].asUUID();
+ 
+@@ -225,7 +291,10 @@
+ 	m_specularOffsetY = (U16)materialDefinition["SpecOffsetY"].asInteger();
+ 	m_specularRepeatX = materialDefinition["SpecRepeatX"].asInteger();
+ 	m_specularRepeatY = materialDefinition["SpecRepeatY"].asInteger();
+-	m_specularRotation = (U16)materialDefinition["SpecRotation"].asInteger();
++
++	S32 specularRotation = materialDefinition["SpecRotation"].asInteger();
++
++	setSpecularMapRotation(specularRotation);
+ 
+ 	m_specularLightColor.setValue( materialDefinition["SpecColor"] );
+ 	m_specularLightExponent = (U8)materialDefinition["SpecExp"].asInteger();
+diff -r fe4bab01522e indra/llprimitive/llrendermaterialtable.h
+--- a/indra/llprimitive/llrendermaterialtable.h	Wed May 15 17:57:21 2013 +0000
++++ b/indra/llprimitive/llrendermaterialtable.h	Wed May 22 14:23:04 2013 -0700
+@@ -89,11 +89,17 @@
+ 
+ 	void computeID();
+ 
++
+ 	struct LLRenderMaterial
+ 	{
+ 		void asLLSD( LLSD& dest ) const;
+ 		void setFromLLSD( const LLSD& materialDefinition );
+ 
++		void setNormalMapRotation(S32 v);
++		void setSpecularMapRotation(S32 v);
++
++		const S32 MAX_MATERIAL_MAP_ROTATION = 62800;
++
+ 		// 36 bytes
+ 		LLUUID m_normalMap;
+ 		LLUUID m_specularMap;
+@@ -119,7 +125,20 @@
+ 		U8 m_specularLightExponent;
+ 		U8 m_environmentIntensity;
+ 		U8 m_alphaMaskCutoff;
+-		U8 m_diffuseAlphaMode;
++		U8 m_diffuseAlphaMode : 4;
++		U8 m_flags            : 4;
++	};
++
++	// Flags stored in LLRenderMaterial::m_flags to differentiate 'old' rotation format
++	// which doesn't handle negative or large rotations correctly from new format.
++	// All ancient materials will have these flags unset as the values for diffuseAlphaMode
++	// from which the bits were stolen never used more than the bottom 2 bits.
++	//
++	enum RenderMaterialFlags {
++	 kNewNormalMapRotation 		= 0x1,
++	 kNewSpecularMapRotation 	= 0x2,
++	 kNormalMapRotationNegative 	= 0x4,
++	 kSpecularMapRotationNegative   = 0x8
+ 	};
+ 
+ 	friend struct eastl::hash<LLRenderMaterial>;
diff --git a/indra/viewer_components/login/lllogin.cpp b/indra/viewer_components/login/lllogin.cpp
index 3357ad812d8c771babc2633681884c4d62e8939a..27c91e2c142bebbc6709bd28fee0d40bf09b8a1a 100755
--- a/indra/viewer_components/login/lllogin.cpp
+++ b/indra/viewer_components/login/lllogin.cpp
@@ -117,14 +117,17 @@ class LLLogin::Impl
 
 void LLLogin::Impl::connect(const std::string& uri, const LLSD& login_params)
 {
-    LL_DEBUGS("LLLogin") << " connect with  uri '" << uri << "', login_params " << login_params << LL_ENDL;
+    // BUG-2707?
+    //LL_DEBUGS("LLLogin") << " connect with  uri '" << uri << "', login_params " << login_params << LL_ENDL;
 	
     // Launch a coroutine with our login_() method. Run the coroutine until
     // its first wait; at that point, return here.
     std::string coroname = 
         LLCoros::instance().launch("LLLogin::Impl::login_",
                                    boost::bind(&Impl::login_, this, _1, uri, login_params));
-    LL_DEBUGS("LLLogin") << " connected with  uri '" << uri << "', login_params " << login_params << LL_ENDL;	
+
+    // BUG-2707?
+    //LL_DEBUGS("LLLogin") << " connected with  uri '" << uri << "', login_params " << login_params << LL_ENDL;	
 }
 
 void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD login_params)
@@ -137,8 +140,11 @@ void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD login_para
 	//{
 	//	printable_params["params"]["passwd"] = "*******";
 	//}
-    LL_DEBUGS("LLLogin") << "Entering coroutine " << LLCoros::instance().getName(self)
-                        << " with uri '" << uri << "', parameters " << printable_params << LL_ENDL;
+	//
+	//
+// BUG-2707?
+//    LL_DEBUGS("LLLogin") << "Entering coroutine " << LLCoros::instance().getName(self)
+//                        << " with uri '" << uri << "', parameters " << printable_params << LL_ENDL;
 
 	// Arriving in SRVRequest state
     LLEventStream replyPump("SRVreply", true);
@@ -150,7 +156,9 @@ void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD login_para
         sendProgressEvent("offline", "srvrequest");
 
         // Request SRV record.
-        LL_DEBUGS("LLLogin") << "Requesting SRV record from " << uri << LL_ENDL;
+	// BUG-2707?
+        //LL_DEBUGS("LLLogin") << "Requesting SRV record from " << uri << LL_ENDL;
+
 
         // *NOTE:Mani - Completely arbitrary default timeout value for SRV request.
 		F32 seconds_to_timeout = 5.0f;
@@ -230,8 +238,9 @@ void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD login_para
                 // Still Downloading -- send progress update.
                 sendProgressEvent("offline", "downloading");
             }
-				 
-			LL_DEBUGS("LLLogin") << "Auth Response: " << mAuthResponse << LL_ENDL;
+	
+	    // BUG-2707?
+            //LL_DEBUGS("LLLogin") << "Auth Response: " << mAuthResponse << LL_ENDL;
             status = mAuthResponse["status"].asString();
 
             // Okay, we've received our final status event for this
@@ -276,7 +285,8 @@ void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD login_para
 		 */
 		if( status == "Started")
 		{
-			LL_DEBUGS("LLLogin") << mAuthResponse << LL_ENDL;
+			// BUG-2707?
+			//LL_DEBUGS("LLLogin") << mAuthResponse << LL_ENDL;
 			continue;
 		}
 
diff --git a/indra/viewer_components/updater/llupdaterservice.cpp b/indra/viewer_components/updater/llupdaterservice.cpp
index 1bd9fa4fc0f30c533b912a243b6ac58f66bb1858..1882e39a888f2f31a5140d7d7bf8d49d5255fd5f 100755
--- a/indra/viewer_components/updater/llupdaterservice.cpp
+++ b/indra/viewer_components/updater/llupdaterservice.cpp
@@ -206,6 +206,8 @@ void LLUpdaterServiceImpl::initialize(const std::string&  url,
 	mPlatformVersion = platform_version;
 	memcpy(mUniqueId, uniqueid, MD5HEX_STR_SIZE);
 	mWillingToTest = willing_to_test;
+
+#if BUG_2707
 	LL_DEBUGS("UpdaterService")
 		<< "\n  url: " << mUrl
 		<< "\n  path: " << mPath
@@ -214,6 +216,7 @@ void LLUpdaterServiceImpl::initialize(const std::string&  url,
 		<< "\n  uniqueid: " << mUniqueId
 		<< "\n  willing: " << ( mWillingToTest ? "testok" : "testno" )
 		<< LL_ENDL;
+#endif
 }
 
 void LLUpdaterServiceImpl::setCheckPeriod(unsigned int seconds)
@@ -431,12 +434,15 @@ void LLUpdaterServiceImpl::response(LLSD const & content)
 		BOOL required = content["required"].asBoolean();
 		LLURI url(content["url"].asString());
 		std::string more_info = content["more_info"].asString();
+
+		#if BUG_2707
 		LL_DEBUGS("UpdaterService")
 			<< "Starting download of "
 			<< ( required ? "required" : "optional" ) << " update"
 			<< " to channel '" << mNewChannel << "' version " << mNewVersion
 			<< " more info '" << more_info << "'"
 			<< LL_ENDL;
+		#endif
 		mUpdateDownloader.download(url, content["hash"].asString(), mNewChannel, mNewVersion, more_info, required);
 	}
 }
@@ -459,6 +465,8 @@ void LLUpdaterServiceImpl::downloadComplete(LLSD const & data)
 	payload["channel"] = mNewChannel;
 	payload["info_url"] = data["info_url"];
 	event["payload"] = payload;
+
+	#if BUG_2707
 	LL_DEBUGS("UpdaterService")
 		<< "Download complete "
 		<< ( data["required"].asBoolean() ? "required" : "optional" )
@@ -466,6 +474,7 @@ void LLUpdaterServiceImpl::downloadComplete(LLSD const & data)
 		<< " version " << mNewVersion
 		<< " info " << data["info_url"].asString()
 		<< LL_ENDL;
+	#endif
 
 	LLEventPumps::instance().obtain("mainlooprepeater").post(event);
 
@@ -542,7 +551,8 @@ bool LLUpdaterServiceImpl::onMainLoop(LLSD const & event)
 		// Check for failed install.
 		if(LLFile::isfile(ll_install_failed_marker_path()))
 		{
-			LL_DEBUGS("UpdaterService") << "found marker " << ll_install_failed_marker_path() << LL_ENDL;;
+			// BUG-2707?
+			//LL_DEBUGS("UpdaterService") << "found marker " << ll_install_failed_marker_path() << LL_ENDL;;
 			int requiredValue = 0; 
 			{
 				llifstream stream(ll_install_failed_marker_path());