diff --git a/indra/llcommon/llclickaction.h b/indra/llcommon/llclickaction.h
index 29c4df8df24de5153cf7905c875bd9dd7297b449..d4ffbf8634541f9351d31cddb3621b2fe1522f5d 100644
--- a/indra/llcommon/llclickaction.h
+++ b/indra/llcommon/llclickaction.h
@@ -33,16 +33,15 @@
 
 #ifndef LL_LLCLICKACTION_H
 #define LL_LLCLICKACTION_H
-
+// DO NOT CHANGE THE SEQUENCE OF THIS LIST!!
 const U8 CLICK_ACTION_NONE = 0;
 const U8 CLICK_ACTION_TOUCH = 0;
 const U8 CLICK_ACTION_SIT = 1;
 const U8 CLICK_ACTION_BUY = 2;
 const U8 CLICK_ACTION_PAY = 3;
 const U8 CLICK_ACTION_OPEN = 4;
-const U8 CLICK_ACTION_ZOOM = 5;
-const U8 CLICK_ACTION_PLAY = 6;
-const U8 CLICK_ACTION_OPEN_MEDIA = 7;
-
-
+const U8 CLICK_ACTION_PLAY = 5;
+const U8 CLICK_ACTION_OPEN_MEDIA = 6;
+const U8 CLICK_ACTION_ZOOM = 7;
+// DO NOT CHANGE THE SEQUENCE OF THIS LIST!!
 #endif
diff --git a/indra/lscript/lscript_compile/indra.l b/indra/lscript/lscript_compile/indra.l
index e650c71beab4a0afcae4da57dc079f3c425b7326..8fe9f5ed29c1f9752addde37f2b8f3fd5c2c4d42 100644
--- a/indra/lscript/lscript_compile/indra.l
+++ b/indra/lscript/lscript_compile/indra.l
@@ -611,9 +611,9 @@ extern "C" { int yyerror(const char *fmt, ...); }
 "CLICK_ACTION_BUY"        { count(); yylval.ival = CLICK_ACTION_BUY; return(INTEGER_CONSTANT); }
 "CLICK_ACTION_PAY"        { count(); yylval.ival = CLICK_ACTION_PAY; return(INTEGER_CONSTANT); }
 "CLICK_ACTION_OPEN"       { count(); yylval.ival = CLICK_ACTION_OPEN; return(INTEGER_CONSTANT); }
-"CLICK_ACTION_ZOOM"       { count(); yylval.ival = CLICK_ACTION_ZOOM; return(INTEGER_CONSTANT); }
 "CLICK_ACTION_PLAY"       { count(); yylval.ival = CLICK_ACTION_PLAY; return(INTEGER_CONSTANT); }
 "CLICK_ACTION_OPEN_MEDIA" { count(); yylval.ival = CLICK_ACTION_OPEN_MEDIA; return(INTEGER_CONSTANT); }
+"CLICK_ACTION_ZOOM"       { count(); yylval.ival = CLICK_ACTION_ZOOM; return(INTEGER_CONSTANT); }
 
 "TEXTURE_BLANK"           { yylval.sval = new char[UUID_STR_LENGTH]; strcpy(yylval.sval, "5748decc-f629-461c-9a36-a35a221fe21f"); return(STRING_CONSTANT); }
 "TEXTURE_DEFAULT"         { yylval.sval = new char[UUID_STR_LENGTH]; strcpy(yylval.sval, "89556747-24cb-43ed-920b-47caed15465f"); return(STRING_CONSTANT); }
diff --git a/indra/newview/app_settings/keywords.ini b/indra/newview/app_settings/keywords.ini
index 71ea12bacde845b186df531859a7a3be2969bc3e..14025c8061ce00d9f349904ceb9d9411abc1f4b3 100644
--- a/indra/newview/app_settings/keywords.ini
+++ b/indra/newview/app_settings/keywords.ini
@@ -508,9 +508,9 @@ CLICK_ACTION_SIT        Used with llSetClickAction to set sit as the default act
 CLICK_ACTION_BUY        Used with llSetClickAction to set buy as the default action when object is clicked
 CLICK_ACTION_PAY        Used with llSetClickAction to set pay as the default action when object is clicked
 CLICK_ACTION_OPEN       Used with llSetClickAction to set open as the default action when object is clicked
-CLICK_ACTION_ZOOM       Used with llSetClickAction to set zoom in as the default action when object is clicked
 CLICK_ACTION_PLAY       Used with llSetClickAction to set play as the default action when object is clicked
 CLICK_ACTION_OPEN_MEDIA Used with llSetClickAction to set open-media as the default action when object is clicked
+CLICK_ACTION_ZOOM       Used with llSetClickAction to set zoom in as the default action when object is clicked
 
 TOUCH_INVALID_TEXCOORD  Value returned by llDetectedTouchUV() and llDetectedTouchST() when the touch position is not valid.
 TOUCH_INVALID_VECTOR    Value returned by llDetectedTouchPos(), llDetectedTouchNormal(), and llDetectedTouchBinormal() when the touch position is not valid.
diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp
index 0dc010e2e746009e2ecc6baeb5b38952eb5898d0..d8e0d91d885dc05f20d1d8723202ac10c549ddad 100644
--- a/indra/newview/llpanelpermissions.cpp
+++ b/indra/newview/llpanelpermissions.cpp
@@ -66,6 +66,65 @@
 #include "roles_constants.h"
 #include "llgroupactions.h"
 
+
+U8 string_value_to_click_action(std::string p_value);
+std::string click_action_to_string_value( U8 action);
+
+U8 string_value_to_click_action(std::string p_value)
+{
+	if(p_value == "Touch")
+	{
+		return CLICK_ACTION_TOUCH;
+	}
+	if(p_value == "Sit")
+	{
+		return CLICK_ACTION_SIT;
+	}
+	if(p_value == "Buy")
+	{
+		return CLICK_ACTION_BUY;
+	}
+	if(p_value == "Pay")
+	{
+		return CLICK_ACTION_PAY;
+	}
+	if(p_value == "Open")
+	{
+		return CLICK_ACTION_OPEN;
+	}
+	if(p_value == "Zoom")
+	{
+		return CLICK_ACTION_ZOOM;
+	}
+	return CLICK_ACTION_TOUCH;
+}
+
+std::string click_action_to_string_value( U8 action)
+{
+	switch (action) 
+	{
+		case CLICK_ACTION_TOUCH:
+		default:	
+			return "Touch";
+			break;
+		case CLICK_ACTION_SIT:
+			return "Sit";
+			break;
+		case CLICK_ACTION_BUY:
+			return "Buy";
+			break;
+		case CLICK_ACTION_PAY:
+			return "Pay";
+			break;
+		case CLICK_ACTION_OPEN:
+			return "Open";
+			break;
+		case CLICK_ACTION_ZOOM:
+			return "Zoom";
+			break;
+	}
+}
+
 ///----------------------------------------------------------------------------
 /// Class llpanelpermissions
 ///----------------------------------------------------------------------------
@@ -774,7 +833,8 @@ void LLPanelPermissions::refresh()
 		LLComboBox*	ComboClickAction = getChild<LLComboBox>("clickaction");
 		if(ComboClickAction)
 		{
-			ComboClickAction->setCurrentByIndex((S32)click_action);
+			std::string combo_value = click_action_to_string_value(click_action);
+			ComboClickAction->setValue(LLSD(combo_value));
 		}
 	}
 	childSetEnabled("label click action",is_perm_modify && all_volume);
@@ -1015,8 +1075,9 @@ void LLPanelPermissions::onCommitClickAction(LLUICtrl* ctrl, void*)
 {
 	LLComboBox* box = (LLComboBox*)ctrl;
 	if (!box) return;
-
-	U8 click_action = (U8)box->getCurrentIndex();
+	std::string value = box->getValue().asString();
+	U8 click_action = string_value_to_click_action(value);
+	
 	if (click_action == CLICK_ACTION_BUY)
 	{
 		LLSaleInfo sale_info;
@@ -1028,8 +1089,8 @@ void LLPanelPermissions::onCommitClickAction(LLUICtrl* ctrl, void*)
 			// Set click action back to its old value
 			U8 click_action = 0;
 			LLSelectMgr::getInstance()->selectionGetClickAction(&click_action);
-			box->setCurrentByIndex((S32)click_action);
-
+			std::string item_value = click_action_to_string_value(click_action);
+			box->setValue(LLSD(item_value));
 			return;
 		}
 	}
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index d0350507ed26f146af5f39b1e944c56b0d32f824..5ed8dc5fb9a2bacbcfb0c7f46781865f3cc567cc 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -253,12 +253,7 @@ BOOL LLToolPie::pickLeftMouseDownCallback()
 					selectionPropertiesReceived();
 				}
 			}
-			return TRUE;
-		case CLICK_ACTION_ZOOM:
-				gAgent.setFocusOnAvatar(FALSE, FALSE);	
-				gAgent.setFocusGlobal(mPick);
-				gAgent.setCameraZoomFraction(0.9);
-				return TRUE;		
+			return TRUE;	
 		case CLICK_ACTION_PLAY:
 			handle_click_action_play();
 			return TRUE;
@@ -266,6 +261,29 @@ BOOL LLToolPie::pickLeftMouseDownCallback()
 			// mClickActionObject = object;
 			handle_click_action_open_media(object);
 			return TRUE;
+		case CLICK_ACTION_ZOOM:
+			{	
+				const F32 PADDING_FACTOR = 2.f;
+				LLViewerObject* object = gObjectList.findObject(mPick.mObjectID);
+				
+				if (object)
+				{
+					gAgent.setFocusOnAvatar(FALSE, ANIMATE);
+					
+					LLBBox bbox = object->getBoundingBoxAgent() ;
+					F32 angle_of_view = llmax(0.1f, LLViewerCamera::getInstance()->getAspect() > 1.f ? LLViewerCamera::getInstance()->getView() * LLViewerCamera::getInstance()->getAspect() : LLViewerCamera::getInstance()->getView());
+					F32 distance = bbox.getExtentLocal().magVec() * PADDING_FACTOR / atan(angle_of_view);
+				
+					LLVector3 obj_to_cam = LLViewerCamera::getInstance()->getOrigin() - bbox.getCenterAgent();
+					obj_to_cam.normVec();
+					
+					LLVector3d object_center_global = gAgent.getPosGlobalFromAgent(bbox.getCenterAgent());
+					gAgent.setCameraPosAndFocusGlobal(object_center_global + LLVector3d(obj_to_cam * distance), 
+													  object_center_global, 
+													  mPick.mObjectID );
+				}
+			}
+			return TRUE;			
 		default:
 			// nothing
 			break;
diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index 87d31b8f9b11d1ff2c78b80e423bacf02237a454..8b6f0f03fe243d8cf20ab3b67b41144eb2fe72c8 100644
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -968,19 +968,19 @@
                 <combo_box.item
                  label="Touch  (default)"
                  name="Touch/grab(default)"
-                 value="Touch/grab (default)" />
+                 value="Touch" />
                 <combo_box.item
                  label="Sit on object"
                  name="Sitonobject"
-                 value="Sit on object" />
+                 value="Sit" />
                 <combo_box.item
                  label="Buy object"
                  name="Buyobject"
-                 value="Buy object" />
+                 value="Buy" />
                 <combo_box.item
                  label="Pay object"
                  name="Payobject"
-                 value="Pay object" />
+                 value="Pay" />
                 <combo_box.item
                  label="Open"
                  name="Open"