diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp
index ab089081e6f147313b6022ab74662dcc20c1472b..6722248c23b018bcef3211f3fddc70fa763b0da7 100644
--- a/indra/llwindow/llwindowwin32.cpp
+++ b/indra/llwindow/llwindowwin32.cpp
@@ -500,6 +500,8 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks,
 	//-----------------------------------------------------------------------
 
 	DEVMODE dev_mode;
+	::ZeroMemory(&dev_mode, sizeof(DEVMODE));
+	dev_mode.dmSize = sizeof(DEVMODE);
 	DWORD current_refresh;
 	if (EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dev_mode))
 	{
@@ -878,6 +880,8 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO
 {
 	GLuint	pixel_format;
 	DEVMODE dev_mode;
+	::ZeroMemory(&dev_mode, sizeof(DEVMODE));
+	dev_mode.dmSize = sizeof(DEVMODE);
 	DWORD	current_refresh;
 	DWORD	dw_ex_style;
 	DWORD	dw_style;
@@ -2711,6 +2715,8 @@ LLWindow::LLWindowResolution* LLWindowWin32::getSupportedResolutions(S32 &num_re
 	{
 		mSupportedResolutions = new LLWindowResolution[MAX_NUM_RESOLUTIONS];
 		DEVMODE dev_mode;
+		::ZeroMemory(&dev_mode, sizeof(DEVMODE));
+		dev_mode.dmSize = sizeof(DEVMODE);
 
 		mNumSupportedResolutions = 0;
 		for (S32 mode_num = 0; mNumSupportedResolutions < MAX_NUM_RESOLUTIONS; mode_num++)
@@ -2786,7 +2792,8 @@ F32 LLWindowWin32::getPixelAspectRatio()
 BOOL LLWindowWin32::setDisplayResolution(S32 width, S32 height, S32 bits, S32 refresh)
 {
 	DEVMODE dev_mode;
-	dev_mode.dmSize = sizeof(dev_mode);
+	::ZeroMemory(&dev_mode, sizeof(DEVMODE));
+	dev_mode.dmSize = sizeof(DEVMODE);
 	BOOL success = FALSE;
 
 	// Don't change anything if we don't have to
diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml
index 85899603ee7d4e94feca1f272ed9a01ad4bfc0bf..ec162e3608fa85cf6f0a4feb92ea3c2dbb056be3 100644
--- a/indra/newview/character/avatar_lad.xml
+++ b/indra/newview/character/avatar_lad.xml
@@ -4339,8 +4339,8 @@
      wearable="shape"
      edit_group="driven"
      value_default="0"
-     value_min="-2"
-     value_max="2">
+     value_min="-3"
+     value_max="3">
       <param_morph />
     </param>
 
@@ -4352,8 +4352,8 @@
      wearable="shape"
      edit_group="driven"
      value_default="0"
-     value_min="-1"
-     value_max="1">
+     value_min="-1.5"
+     value_max="1.5">
       <param_morph />
     </param>
 
@@ -11916,7 +11916,7 @@ render_pass="bump">
      edit_group="physics_breasts_updown"
      value_default=".1"
      value_min="0"
-     value_max="1">
+     value_max="3">
 	 <param_driver />
     </param>
     <param
@@ -11971,7 +11971,7 @@ render_pass="bump">
      edit_group="physics_breasts_inout"
      value_default=".1"
      value_min="0"
-     value_max="1">
+     value_max="3">
 	 <param_driver />
     </param>
     <param
@@ -12058,7 +12058,7 @@ render_pass="bump">
      edit_group="physics_belly_updown"
      value_default=".1"
      value_min="0"
-     value_max="1">
+     value_max="3">
 	 <param_driver />
     </param>
     <param
@@ -12144,7 +12144,7 @@ render_pass="bump">
      edit_group="physics_butt_updown"
      value_default=".1"
      value_min="0"
-     value_max="1">
+     value_max="3">
 	 <param_driver />
     </param>
     <param
@@ -12193,7 +12193,7 @@ render_pass="bump">
      edit_group="physics_butt_leftright"
      value_default=".1"
      value_min="0"
-     value_max="1">
+     value_max="3">
 	 <param_driver />
     </param>
     <param
@@ -12244,7 +12244,7 @@ render_pass="bump">
      edit_group="physics_breasts_leftright"
      value_default=".1"
      value_min="0"
-     value_max="1">
+     value_max="3">
 	 <param_driver />
     </param>
     <param
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 622a5607df055f7cfa7c3b8807a81e6dc51a4540..bdb9f6167a5be741a3bddbb065426725f96a50d4 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -4681,7 +4681,7 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 					if (LLWearableType::getAllowMultiwear(mWearableType))
 					{
 						items.push_back(std::string("Wearable Add"));
-						if (gAgentWearables.getWearableCount(mWearableType) > 0)
+						if (gAgentWearables.getWearableCount(mWearableType) >= LLAgentWearables::MAX_CLOTHING_PER_TYPE)
 						{
 							disabled_items.push_back(std::string("Wearable Add"));
 						}
diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp
index 8bd2d5ad6abc1375021827b71ad59022e71c1e05..cb8fbd66b53088885d0d6b409625776dc2d5d68c 100644
--- a/indra/newview/llpaneleditwearable.cpp
+++ b/indra/newview/llpaneleditwearable.cpp
@@ -1196,6 +1196,12 @@ void LLPanelEditWearable::onTabExpandedCollapsed(const LLSD& param, U8 index)
 
 void LLPanelEditWearable::changeCamera(U8 subpart)
 {
+	// Don't change the camera if this type doesn't have a camera switch.
+	// Useful for wearables like physics that don't have an associated physical body part.
+	if (LLWearableType::getDisableCameraSwitch(mWearablePtr->getType()))
+	{
+		return;
+	}
         const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(mWearablePtr->getType());
         if (!wearable_entry)
         {
diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp
index acf8973f03f76f65a9e2eda6e935f8251fb3534e..1d3c2b72f22cfdda001ece89dd71ae2aeba2cac5 100644
--- a/indra/newview/llphysicsmotion.cpp
+++ b/indra/newview/llphysicsmotion.cpp
@@ -40,6 +40,7 @@
 #include "v3dmath.h"
 
 #include "llphysicsmotion.h"
+#include "llagent.h"
 #include "llcharacter.h"
 #include "llviewercontrol.h"
 #include "llviewervisualparam.h"
@@ -126,7 +127,8 @@ class LLPhysicsMotion
                 return mCharacter->getVisualParamWeight(param_name.c_str());
         }
         void setParamValue(LLViewerVisualParam *param,
-                           const F32 new_value_local);
+                           const F32 new_value_local,
+						   F32 behavior_maxeffect);
 
         F32 toLocal(const LLVector3 &world);
         F32 calculateVelocity_local(const F32 time_delta);
@@ -472,14 +474,11 @@ BOOL LLPhysicsMotion::onUpdate(F32 time)
         const F32 behavior_gain = getParamValue("Gain");
         const F32 behavior_damping = getParamValue("Damping");
         const F32 behavior_drag = getParamValue("Drag");
-        const BOOL physics_test = gSavedSettings.getBOOL("AvatarPhysicsTest");
+        const BOOL physics_test = gSavedSettings.getBOOL("AvatarPhysicsTest") && gAgent.isGodlike();
         
         F32 behavior_maxeffect = getParamValue("MaxEffect");
         if (physics_test)
                 behavior_maxeffect = 1.0f;
-        // Maximum effect is [0,1] range.
-        const F32 min_val = 0.5f-behavior_maxeffect/2.0;
-        const F32 max_val = 0.5f+behavior_maxeffect/2.0;
 
         // mPositon_local should be in normalized 0,1 range already.  Just making sure...
         F32 position_current_local = llclamp(mPosition_local,
@@ -577,15 +576,31 @@ BOOL LLPhysicsMotion::onUpdate(F32 time)
             position_new_local = position_user_local;
 
         // Zero out the velocity if the param is being pushed beyond its limits.
-        if ((position_new_local < min_val && velocity_new_local < 0) || 
-            (position_new_local > max_val && velocity_new_local > 0))
+        if ((position_new_local < 0 && velocity_new_local < 0) || 
+            (position_new_local > 1 && velocity_new_local > 0))
         {
                 velocity_new_local = 0;
         }
+	
+	// Check for NaN values.  A NaN value is detected if the variables doesn't equal itself.  
+	// If NaN, then reset everything.
+	if ((mPosition_local != mPosition_local) ||
+	    (mVelocity_local != mVelocity_local) ||
+	    (position_new_local != position_new_local))
+	{
+		position_new_local = 0;
+		position_current_local = 0;
+		position_user_local = 0;
+		mVelocity_local = 0;
+		mVelocityJoint_local = 0;
+		mAccelerationJoint_local = 0;
+		mPosition_local = 0;
+		mPosition_world = LLVector3(0,0,0);
+	}
 
         const F32 position_new_local_clamped = llclamp(position_new_local,
-                                                       min_val,
-                                                       max_val);
+						       0.0f,
+						       1.0f);
 
         LLDriverParam *driver_param = dynamic_cast<LLDriverParam *>(mParamDriver);
         llassert_always(driver_param);
@@ -606,14 +621,14 @@ BOOL LLPhysicsMotion::onUpdate(F32 time)
                 {
                         LLDrivenEntry &entry = (*iter);
                         LLViewerVisualParam *driven_param = entry.mParam;
-                        setParamValue(driven_param,position_new_local_clamped);
+                        setParamValue(driven_param,position_new_local_clamped, behavior_maxeffect);
                 }
         }
         
         //
         // End calculate new params
         ////////////////////////////////////////////////////////////////////////////////
-        
+
         ////////////////////////////////////////////////////////////////////////////////
         // Conditionally update the visual params
         //
@@ -688,12 +703,19 @@ BOOL LLPhysicsMotion::onUpdate(F32 time)
 
 // Range of new_value_local is assumed to be [0 , 1] normalized.
 void LLPhysicsMotion::setParamValue(LLViewerVisualParam *param,
-                                    F32 new_value_normalized)
+                                    F32 new_value_normalized,
+				    F32 behavior_maxeffect)
 {
         const F32 value_min_local = param->getMinWeight();
         const F32 value_max_local = param->getMaxWeight();
+        const F32 min_val = 0.5f-behavior_maxeffect/2.0;
+        const F32 max_val = 0.5f+behavior_maxeffect/2.0;
 
-        const F32 new_value_local = value_min_local + (value_max_local-value_min_local) * new_value_normalized;
+	// Scale from [0,1] to [min_val,max_val]
+	const F32 new_value_rescaled = min_val + (max_val-min_val) * new_value_normalized;
+	
+	// Scale from [0,1] to [value_min_local,value_max_local]
+        const F32 new_value_local = value_min_local + (value_max_local-value_min_local) * new_value_rescaled;
 
         mCharacter->setVisualParamWeight(param,
                                          new_value_local,
diff --git a/indra/newview/llpolymorph.cpp b/indra/newview/llpolymorph.cpp
index 5a67fd482a7294319ec83a6ae95d32a9e5f5c357..36f8c8d13e49109c90a576294c1b162aba6be307 100644
--- a/indra/newview/llpolymorph.cpp
+++ b/indra/newview/llpolymorph.cpp
@@ -490,6 +490,16 @@ void LLPolyMorphTarget::apply( ESex avatar_sex )
 
 	mLastSex = avatar_sex;
 
+	// Check for NaN condition (NaN is detected if a variable doesn't equal itself.
+	if (mCurWeight != mCurWeight)
+	{
+		mCurWeight = 0.0;
+	}
+	if (mLastWeight != mLastWeight)
+	{
+		mLastWeight = mCurWeight+.001;
+	}
+
 	// perform differential update of morph
 	F32 delta_weight = ( getSex() & avatar_sex ) ? (mCurWeight - mLastWeight) : (getDefaultWeight() - mLastWeight);
 	// store last weight
diff --git a/indra/newview/llwearabletype.cpp b/indra/newview/llwearabletype.cpp
index f933be4d8f0f5e3f6860599a61391eb84b373cf0..9e95604712f168ee8878ab66e3954b37ad009168 100644
--- a/indra/newview/llwearabletype.cpp
+++ b/indra/newview/llwearabletype.cpp
@@ -144,6 +144,7 @@ BOOL LLWearableType::getDisableCameraSwitch(LLWearableType::EType type)
 {
 	const LLWearableDictionary *dict = LLWearableDictionary::getInstance();
 	const WearableEntry *entry = dict->lookup(type);
+	if (!entry) return FALSE;
 	return entry->mDisableCameraSwitch;
 }
 
@@ -152,6 +153,7 @@ BOOL LLWearableType::getAllowMultiwear(LLWearableType::EType type)
 {
 	const LLWearableDictionary *dict = LLWearableDictionary::getInstance();
 	const WearableEntry *entry = dict->lookup(type);
+	if (!entry) return FALSE;
 	return entry->mAllowMultiwear;
 }