diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 049232b5eccee072fd23bdd208c9dacea7b8653e..6ddda34ba299b97b4b1821c7099aca2009a9bde6 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -11944,7 +11944,7 @@
       <key>Persist</key>
       <integer>1</integer>
       <key>Type</key>
-      <string>Boolean</string>
+      <string>U32</string>
       <key>Value</key>
       <integer>1</integer>
     </map>
diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp
index 35ffd12143f19e1d418696e9de8251c9a28531d4..b3918eb03678b0c4be32586004788c61de556451 100644
--- a/indra/newview/llavatarlist.cpp
+++ b/indra/newview/llavatarlist.cpp
@@ -59,6 +59,15 @@ static const F32 LIT_UPDATE_PERIOD = 2;
 // Used to limit time spent for avatar list update per frame.
 static const unsigned ADD_LIMIT = 50;
 
+// [SL:KB] - Patch: UI-PeopleFriendPermissions | Checked: 2013-06-03 (Catznip-3.4)
+void LLAvatarList::ShowPermissionTypeNames::declareValues()
+{
+	declare("never", SP_NEVER);
+	declare("hover", SP_HOVER);
+	declare("nondefault", SP_NONDEFAULT);
+}
+// [/SL:KB]
+
 bool LLAvatarList::contains(const LLUUID& id)
 {
 	const uuid_vec_t& ids = getIDs();
@@ -94,10 +103,11 @@ void LLAvatarList::setSpeakingIndicatorsVisible(bool visible)
 	}
 }
 
-void LLAvatarList::showPermissions(bool visible)
+// [SL:KB] - Patch: UI-PeopleFriendPermissions | Checked: 2013-06-03 (Catznip-3.4)
+void LLAvatarList::showPermissions(EShowPermissionType spType)
 {
 	// Save the value for new items to use.
-	mShowPermissions = visible;
+	mShowPermissions = spType;
 
 	// Enable or disable showing permissions icons for all existing items.
 	std::vector<LLPanel*> items;
@@ -126,7 +136,7 @@ LLAvatarList::Params::Params()
 , show_info_btn("show_info_btn", true)
 , show_profile_btn("show_profile_btn", true)
 , show_speaking_indicator("show_speaking_indicator", true)
-, show_permissions_granted("show_permissions_granted", false)
+, show_permissions_granted("show_permissions_granted", SP_NEVER)
 {
 }
 
diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h
index 0e25a256f0addf95ccfe2cba81f541521ed75b2a..3ff837d9f10d57bbc38bb299af5904bc251209b3 100644
--- a/indra/newview/llavatarlist.h
+++ b/indra/newview/llavatarlist.h
@@ -47,6 +47,11 @@ class LLAvatarList final : public LLFlatListViewEx
 {
 	LOG_CLASS(LLAvatarList);
 public:
+	struct ShowPermissionTypeNames : public LLInitParam::TypeValuesHelper<EShowPermissionType, ShowPermissionTypeNames>
+	{
+		static void declareValues();
+	};
+
 	struct Params : public LLInitParam::Block<Params, LLFlatListViewEx::Params>
 	{
 		Optional<bool>	ignore_online_status, // show all items as online
@@ -54,8 +59,8 @@ class LLAvatarList final : public LLFlatListViewEx
 						show_distance,	// *HACK: my sinuses hurt and i want pizza.
 						show_info_btn,
 						show_profile_btn,
-						show_speaking_indicator,
-						show_permissions_granted;
+						show_speaking_indicator;
+		Optional<EShowPermissionType, ShowPermissionTypeNames> show_permissions_granted;
 		Params();
 	};
 
@@ -79,7 +84,10 @@ class LLAvatarList final : public LLFlatListViewEx
 
 	void toggleIcons();
 	void setSpeakingIndicatorsVisible(bool visible);
-	void showPermissions(bool visible);
+// [SL:KB] - Patch: UI-PeopleFriendPermissions | Checked: 2013-06-03 (Catznip-3.4)
+	void showPermissions(EShowPermissionType spType);
+// [/SL:KB]
+//	void showPermissions(bool visible);
 	void sortByName();
 	void setShowIcons(std::string param_name);
 	bool getIconsVisible() const { return mShowIcons; }
@@ -137,7 +145,10 @@ class LLAvatarList final : public LLFlatListViewEx
 	bool mShowInfoBtn;
 	bool mShowProfileBtn;
 	bool mShowSpeakingIndicator;
-	bool mShowPermissions;
+// [SL:KB] - Patch: UI-PeopleFriendPermissions | Checked: 2013-06-03 (Catznip-3.4)
+	EShowPermissionType mShowPermissions;
+// [/SL:KB]
+//	bool mShowPermissions;
 	bool mShowCompleteName;
 // [RLVa:KB] - RLVa-1.2.0
 	bool mRlvCheckShowNames;
diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp
index 14a36eb975cb962208b91cefca7bed9db1f7e8e6..ea000d959e70f94b890e01ac498b504e9090a05d 100644
--- a/indra/newview/llavatarlistitem.cpp
+++ b/indra/newview/llavatarlistitem.cpp
@@ -39,7 +39,9 @@
 #include "llagent.h"
 #include "llavatarnamecache.h"
 #include "llavatariconctrl.h"
+#include "llnotificationsutil.h"
 #include "lloutputmonitorctrl.h"
+#include "llslurl.h"
 #include "lltooldraganddrop.h"
 // [RLVa:KB] - Checked: RLVa-2.0.1
 #include "rlvactions.h"
@@ -73,7 +75,8 @@ LLAvatarListItem::LLAvatarListItem(bool not_from_ui_factory/* = true*/)
 // [RLVa:KB] - Checked: RLVa-1.2.0
 	mRlvCheckShowNames(false),
 // [/RLVa:KB]
-	mShowPermissions(false),
+	mShowPermissions(SP_NEVER),
+//	mShowPermissions(false),
 	mShowCompleteName(false),
 	mHovered(false),
 	mAvatarNameCacheConnection(),
@@ -107,17 +110,20 @@ BOOL  LLAvatarListItem::postBuild()
 	mDistance = getChild<LLTextBox>("distance");
 	mLastInteractionTime = getChild<LLTextBox>("last_interaction");
 
-	mIconPermissionOnline = getChild<LLIconCtrl>("permission_online_icon");
-	mIconPermissionMap = getChild<LLIconCtrl>("permission_map_icon");
-	mIconPermissionEditMine = getChild<LLIconCtrl>("permission_edit_mine_icon");
+	mIconPermissionOnline = getChild<LLButton>("permission_online_icon");
+	mIconPermissionMap = getChild<LLButton>("permission_map_icon");
+	mIconPermissionEditMine = getChild<LLButton>("permission_edit_mine_icon");
+
+	mIconPermissionOnline->setClickedCallback(boost::bind(&LLAvatarListItem::onPermissionBtnToggle, this, (S32)LLRelationship::GRANT_ONLINE_STATUS));
+	mIconPermissionMap->setClickedCallback(boost::bind(&LLAvatarListItem::onPermissionBtnToggle, this, (S32)LLRelationship::GRANT_MAP_LOCATION));
+	mIconPermissionEditMine->setClickedCallback(boost::bind(&LLAvatarListItem::onPermissionBtnToggle, this, (S32)LLRelationship::GRANT_MODIFY_OBJECTS));
+
 	mIconPermissionEditTheirs = getChild<LLIconCtrl>("permission_edit_theirs_icon");
 	mIconPermissionMapTheirs = getChild<LLIconCtrl>("permission_map_theirs_icon");
-	mIconPermissionOnlineTheirs = getChild<LLIconCtrl>("permission_online_theirs_icon");
 	mIconPermissionOnline->setVisible(false);
 	mIconPermissionMap->setVisible(false);
 	mIconPermissionEditMine->setVisible(false);
 	mIconPermissionEditTheirs->setVisible(false);
-	mIconPermissionOnlineTheirs->setVisible(false);
 	mIconPermissionMapTheirs->setVisible(false);
 
 	mIconHovered = getChild<LLIconCtrl>("hovered_icon");
@@ -145,6 +151,11 @@ BOOL  LLAvatarListItem::postBuild()
 		sStaticInitialized = true;
 	}
 
+	mIconPermissionOnline->setEnabled(SP_NEVER != mShowPermissions);
+	mIconPermissionMap->setEnabled(SP_NEVER != mShowPermissions);
+	mIconPermissionEditMine->setEnabled(SP_NEVER != mShowPermissions);
+	mIconPermissionEditTheirs->setEnabled(SP_NEVER != mShowPermissions);
+	mIconPermissionMapTheirs->setEnabled(SP_NEVER != mShowPermissions);
 	return TRUE;
 }
 
@@ -195,7 +206,10 @@ void LLAvatarListItem::onMouseEnter(S32 x, S32 y, MASK mask)
 	mHovered = true;
 	LLPanel::onMouseEnter(x, y, mask);
 
-	showPermissions(mShowPermissions);
+//	showPermissions(mShowPermissions);
+// [SL:KB] - Patch: UI-PeopleFriendPermissions | Checked: 2010-10-26 (Catznip-2.3)
+	refreshPermissions();
+// [/SL:KB]
 	updateChildren();
 }
 
@@ -208,7 +222,10 @@ void LLAvatarListItem::onMouseLeave(S32 x, S32 y, MASK mask)
 	mHovered = false;
 	LLPanel::onMouseLeave(x, y, mask);
 
-	showPermissions(false);
+//	showPermissions(false);
+// [SL:KB] - Patch: UI-PeopleFriendPermissions | Checked: 2010-10-26 (Catznip-2.3)
+	refreshPermissions();
+// [/SL:KB]
 	updateChildren();
 }
 
@@ -220,7 +237,10 @@ void LLAvatarListItem::changed(U32 mask)
 
 	if (mask & LLFriendObserver::POWERS)
 	{
-		showPermissions(mShowPermissions && mHovered);
+//		showPermissions(mShowPermissions && mHovered);
+// [SL:KB] - Patch: UI-PeopleFriendPermissions | Checked: 2010-10-26 (Catznip-2.3)
+		refreshPermissions();
+// [/SL:KB]
 		updateChildren();
 	}
 }
@@ -310,6 +330,25 @@ void LLAvatarListItem::setAvatarId(const LLUUID& id, const LLUUID& session_id, b
 	}
 }
 
+// [SL:KB] - Patch: UI-PeopleFriendPermissions | Checked: 2010-10-24 (Catznip-2.3)
+void LLAvatarListItem::setShowPermissions(EShowPermissionType spType)
+{
+	mShowPermissions = spType;
+
+// [SL:KB] - Patch: UI-SidepanelPeople | Checked: 2011-05-13 (Catznip-2.6)
+	// Reenable the controls for updateChildren()
+	mIconPermissionOnline->setEnabled(SP_NEVER != mShowPermissions);
+	mIconPermissionMap->setEnabled(SP_NEVER != mShowPermissions);
+	mIconPermissionEditMine->setEnabled(SP_NEVER != mShowPermissions);
+	mIconPermissionEditTheirs->setEnabled(SP_NEVER != mShowPermissions);
+	mIconPermissionMapTheirs->setEnabled(SP_NEVER != mShowPermissions);
+// [/SL:KB]
+	
+	refreshPermissions();
+	updateChildren();
+}
+// [/SL:KB]
+
 void LLAvatarListItem::showDistance(bool show)
 {
 	mDistance->setVisible(show);
@@ -379,6 +418,81 @@ void LLAvatarListItem::onProfileBtnClick()
 	LLAvatarActions::showProfile(mAvatarId);
 }
 
+// [SL:KB] - Patch: UI-PeopleFriendPermissions | Checked: 2010-11-04 (Catznip-2.3)
+void LLAvatarListItem::onPermissionBtnToggle(S32 toggleRight)
+{
+	LLRelationship* pRelationship = const_cast<LLRelationship*>(LLAvatarTracker::instance().getBuddyInfo(mAvatarId));
+	if (!pRelationship)
+		return;
+
+	if (LLRelationship::GRANT_MODIFY_OBJECTS != toggleRight)
+	{
+		S32 rights = pRelationship->getRightsGrantedTo();
+		if ( (rights & toggleRight) == toggleRight)
+		{
+			rights &= ~toggleRight;
+			// Revoke the permission locally until we hear back from the region
+			pRelationship->revokeRights(toggleRight, LLRelationship::GRANT_NONE);
+		}
+		else
+		{
+			rights |= toggleRight;
+			// Grant the permission locally until we hear back from the region
+			pRelationship->grantRights(toggleRight, LLRelationship::GRANT_NONE);
+		}
+
+		LLAvatarPropertiesProcessor::getInstance()->sendFriendRights(mAvatarId, rights);
+		refreshPermissions();
+		updateChildren();
+	}
+	else
+	{
+		LLSD args;
+		args["NAME"] = LLSLURL("agent", mAvatarId, "fullname").getSLURLString();
+
+		if (!pRelationship->isRightGrantedTo(LLRelationship::GRANT_MODIFY_OBJECTS))
+		{
+			LLNotificationsUtil::add("GrantModifyRights", args, LLSD(), 
+				boost::bind(&LLAvatarListItem::onModifyRightsConfirmationCallback, this, _1, _2, true));
+		}
+		else
+		{
+			LLNotificationsUtil::add("RevokeModifyRights", args, LLSD(),
+				boost::bind(&LLAvatarListItem::onModifyRightsConfirmationCallback, this, _1, _2, false));
+		}
+	}
+}
+
+void LLAvatarListItem::onModifyRightsConfirmationCallback(const LLSD& notification, const LLSD& response, bool fGrant)
+{
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+	if (option == 0)
+	{
+		LLRelationship* pRelationship = const_cast<LLRelationship*>(LLAvatarTracker::instance().getBuddyInfo(mAvatarId));
+		if (!pRelationship)
+			return;
+
+		S32 rights = pRelationship->getRightsGrantedTo();
+		if (!fGrant)
+		{
+			rights &= ~LLRelationship::GRANT_MODIFY_OBJECTS;
+			// Revoke the permission locally until we hear back from the region
+			pRelationship->revokeRights(LLRelationship::GRANT_MODIFY_OBJECTS, LLRelationship::GRANT_NONE);
+		}
+		else
+		{
+			rights |= LLRelationship::GRANT_MODIFY_OBJECTS;
+			// Grant the permission locally until we hear back from the region
+			pRelationship->grantRights(LLRelationship::GRANT_MODIFY_OBJECTS, LLRelationship::GRANT_NONE);
+		}
+
+		LLAvatarPropertiesProcessor::getInstance()->sendFriendRights(mAvatarId, rights);
+		refreshPermissions();
+		updateChildren();
+	}
+}
+// [/SL:KB]
+
 BOOL LLAvatarListItem::handleDoubleClick(S32 x, S32 y, MASK mask)
 {
 //	if(mInfoBtn->getRect().pointInRect(x, y))
@@ -573,12 +687,11 @@ void LLAvatarListItem::initChildrenWidths(LLAvatarListItem* avatar_item)
 	S32 permission_edit_theirs_width = avatar_item->mIconPermissionEditMine->getRect().mLeft - avatar_item->mIconPermissionEditTheirs->getRect().mLeft;
 
 	S32 permission_map_theirs_width = avatar_item->mIconPermissionEditTheirs->getRect().mLeft - avatar_item->mIconPermissionMapTheirs->getRect().mLeft;
-	S32 permission_online_theirs_width = avatar_item->mIconPermissionMapTheirs->getRect().mLeft - avatar_item->mIconPermissionOnlineTheirs->getRect().mLeft;
 
 	// last interaction time textbox width + padding
-	S32 last_interaction_time_width = avatar_item->mIconPermissionOnlineTheirs->getRect().mLeft - avatar_item->mLastInteractionTime->getRect().mLeft;
+	S32 last_interaction_time_width = avatar_item->mIconPermissionMapTheirs->getRect().mLeft - avatar_item->mLastInteractionTime->getRect().mLeft;
 	
-	S32 distance_width = avatar_item->mIconPermissionOnlineTheirs->getRect().mLeft - avatar_item->mDistance->getRect().mLeft;
+	S32 distance_width = avatar_item->mIconPermissionMapTheirs->getRect().mLeft - avatar_item->mDistance->getRect().mLeft;
 
 	// avatar icon width + padding
 	S32 icon_width = avatar_item->mAvatarName->getRect().mLeft - avatar_item->mAvatarIcon->getRect().mLeft;
@@ -590,7 +703,6 @@ void LLAvatarListItem::initChildrenWidths(LLAvatarListItem* avatar_item)
 	sChildrenWidths[--index] = 0; // for avatar name we don't need its width, it will be calculated as "left available space"
 	sChildrenWidths[--index] = distance_width;
 	sChildrenWidths[--index] = last_interaction_time_width;
-	sChildrenWidths[--index] = permission_online_theirs_width;
 	sChildrenWidths[--index] = permission_map_theirs_width;
 	sChildrenWidths[--index] = permission_edit_theirs_width;
 	sChildrenWidths[--index] = permission_edit_mine_width;
@@ -678,16 +790,36 @@ void LLAvatarListItem::updateChildren()
 	LL_DEBUGS("AvatarItemReshape") << "name rect after: " << name_view_rect << LL_ENDL;
 }
 
-bool LLAvatarListItem::showPermissions(bool visible)
+//bool LLAvatarListItem::showPermissions(bool visible)
+// [SL:KB] - Patch: UI-PeopleFriendPermissions | Checked: 2010-10-26 (Catznip-2.3)
+bool LLAvatarListItem::refreshPermissions()
+// [/SL:KB]
 {
+	static const std::string strUngrantedOverlay = "Permission_Ungranted";
+
 	const LLRelationship* relation = LLAvatarTracker::instance().getBuddyInfo(getAvatarId());
-	if(relation && visible)
+//	if(relation && visible)
+// [SL:KB] - Patch: UI-PeopleFriendPermissions | Checked: 2010-10-26 (Catznip-2.3)
+	if( (relation) && (((SP_HOVER == mShowPermissions) && (mHovered)) || (SP_NONDEFAULT == mShowPermissions)) )
+// [/SL:KB]
 	{
-		mIconPermissionOnline->setVisible(relation->isRightGrantedTo(LLRelationship::GRANT_ONLINE_STATUS));
-		mIconPermissionMap->setVisible(relation->isRightGrantedTo(LLRelationship::GRANT_MAP_LOCATION));
-		mIconPermissionEditMine->setVisible(relation->isRightGrantedTo(LLRelationship::GRANT_MODIFY_OBJECTS));
+// [SL:KB] - Patch: UI-PeopleFriendPermissions | Checked: 2010-10-26 (Catznip-2.3)
+		bool fGrantedOnline = relation->isRightGrantedTo(LLRelationship::GRANT_ONLINE_STATUS);
+		mIconPermissionOnline->setVisible( (!fGrantedOnline) || (mHovered) );
+		mIconPermissionOnline->setImageOverlay( (fGrantedOnline) ? "" : strUngrantedOverlay);
+
+		bool fGrantedMap = relation->isRightGrantedTo(LLRelationship::GRANT_MAP_LOCATION);
+		mIconPermissionMap->setVisible( (fGrantedMap) || (mHovered) );
+		mIconPermissionMap->setImageOverlay( (fGrantedMap) ? "" : strUngrantedOverlay);
+
+		bool fGrantedEditMine = relation->isRightGrantedTo(LLRelationship::GRANT_MODIFY_OBJECTS);
+		mIconPermissionEditMine->setVisible( (fGrantedEditMine) || (mHovered) );
+		mIconPermissionEditMine->setImageOverlay( (fGrantedEditMine) ? "" : strUngrantedOverlay);
+// [/SL:KB]
+//		mIconPermissionOnline->setVisible(relation->isRightGrantedTo(LLRelationship::GRANT_ONLINE_STATUS));
+//		mIconPermissionMap->setVisible(relation->isRightGrantedTo(LLRelationship::GRANT_MAP_LOCATION));
+//		mIconPermissionEditMine->setVisible(relation->isRightGrantedTo(LLRelationship::GRANT_MODIFY_OBJECTS));
 		mIconPermissionEditTheirs->setVisible(relation->isRightGrantedFrom(LLRelationship::GRANT_MODIFY_OBJECTS));
-		mIconPermissionOnlineTheirs->setVisible(relation->isRightGrantedFrom(LLRelationship::GRANT_ONLINE_STATUS));
 		mIconPermissionMapTheirs->setVisible(relation->isRightGrantedFrom(LLRelationship::GRANT_MAP_LOCATION));
 	}
 	else
@@ -696,7 +828,6 @@ bool LLAvatarListItem::showPermissions(bool visible)
 		mIconPermissionMap->setVisible(false);
 		mIconPermissionEditMine->setVisible(false);
 		mIconPermissionEditTheirs->setVisible(false);
-		mIconPermissionOnlineTheirs->setVisible(false);
 		mIconPermissionMapTheirs->setVisible(false);
 	}
 
@@ -739,9 +870,6 @@ LLView* LLAvatarListItem::getItemChildView(EAvatarListItemChildIndex child_view_
 	case ALIC_PERMISSION_MAP_THEIRS:
 		child_view = mIconPermissionMapTheirs;
 		break;
-	case ALIC_PERMISSION_ONLINE_THEIRS:
-		child_view = mIconPermissionOnlineTheirs;
-		break;
 	case ALIC_INFO_BUTTON:
 		child_view = mInfoBtn;
 		break;
diff --git a/indra/newview/llavatarlistitem.h b/indra/newview/llavatarlistitem.h
index d801fcfb290a66b066cd9fbed3aaf732dcc61a9c..57cabe8d34bfda43c1e2fdd5778bca6326dd7aa0 100644
--- a/indra/newview/llavatarlistitem.h
+++ b/indra/newview/llavatarlistitem.h
@@ -40,6 +40,13 @@ class LLAvatarIconCtrl;
 class LLOutputMonitorCtrl;
 class LLAvatarName;
 class LLIconCtrl;
+typedef enum
+{
+	SP_NEVER = 0,			// Never show permission icons
+	SP_HOVER = 1,			// Only show permission icons on hover
+	SP_NONDEFAULT = 2,		// Show permissions different from default
+	SP_COUNT
+} EShowPermissionType;
 
 class LLAvatarListItem : public LLPanel, public LLFriendObserver
 {
@@ -104,7 +111,10 @@ class LLAvatarListItem : public LLPanel, public LLFriendObserver
 	void setShowProfileBtn(bool show);
 	void setShowInfoBtn(bool show);
 	void showSpeakingIndicator(bool show);
-	void setShowPermissions(bool show) { mShowPermissions = show; };
+// [SL:KB] - Patch: UI-PeopleFriendPermissions | Checked: 2013-06-03 (Catznip-3.4)
+	void setShowPermissions(EShowPermissionType spType);
+// [/SL:KB]
+//	void setShowPermissions(bool show) { mShowPermissions = show; };
 	void showDistance(bool show);
 	void showLastInteractionTime(bool show);
 	void setAvatarIconVisible(bool visible);
@@ -119,6 +129,10 @@ class LLAvatarListItem : public LLPanel, public LLFriendObserver
 
 	void onInfoBtnClick();
 	void onProfileBtnClick();
+// [SL:KB] - Patch: UI-PeopleFriendPermissions | Checked: 2010-11-04 (Catznip-2.3)
+	void onPermissionBtnToggle(S32 toggleRight);
+	void onModifyRightsConfirmationCallback(const LLSD& notification, const LLSD& response, bool fGrant);
+// [/SL:KB]
 
 	/*virtual*/ BOOL handleDoubleClick(S32 x, S32 y, MASK mask) final override;
 
@@ -131,18 +145,15 @@ class LLAvatarListItem : public LLPanel, public LLFriendObserver
 	LLAvatarIconCtrl* mAvatarIcon = nullptr;
 
 	/// Indicator for permission to see me online.
-	LLIconCtrl* mIconPermissionOnline = nullptr;
+	LLButton* mIconPermissionOnline = nullptr;
 	/// Indicator for permission to see my position on the map.
-	LLIconCtrl* mIconPermissionMap = nullptr;
+	LLButton* mIconPermissionMap = nullptr;
 	/// Indicator for permission to edit my objects.
-	LLIconCtrl* mIconPermissionEditMine = nullptr;
+	LLButton* mIconPermissionEditMine = nullptr;
 	/// Indicator for permission to edit their objects.
 	LLIconCtrl* mIconPermissionEditTheirs = nullptr;
-	
 	/// Indicator for permission to show their position on the map.
 	LLIconCtrl* mIconPermissionMapTheirs = nullptr;
-	/// Indicator for permission to see their online status.
-	LLIconCtrl* mIconPermissionOnlineTheirs = nullptr;
 
 	LLIconCtrl* mIconHovered = nullptr;
 
@@ -203,7 +214,10 @@ class LLAvatarListItem : public LLPanel, public LLFriendObserver
 	 *
 	 * Need to call updateChildren() afterwards to sort out their layout.
 	 */
-	bool showPermissions(bool visible);
+//	bool showPermissions(bool visible);
+// [SL:KB] - Patch: UI-PeopleFriendPermissions | Checked: 2010-10-26 (Catznip-2.3)
+	bool refreshPermissions();
+// [/SL:KB]
 
 	/**
 	 * Gets child view specified by index.
@@ -233,7 +247,10 @@ class LLAvatarListItem : public LLPanel, public LLFriendObserver
 // [/RLVa:KB]
 
 	/// indicates whether to show icons representing permissions granted
-	bool mShowPermissions;
+// [SL:KB] - Patch: UI-PeopleFriendPermissions | Checked: 2013-06-03 (Catznip-3.4)
+	EShowPermissionType mShowPermissions;
+// [/SL:KB]
+//	bool mShowPermissions;
 
 	/// true when the mouse pointer is hovering over this item
 	bool mHovered;
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 20d3281946ae0ef7368487951fed855fb24a1759..c27d3e52604da8d8e08aad7d1d63c2ea668d0397 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -633,15 +633,19 @@ BOOL LLPanelPeople::postBuild()
 	friends_tab->setVisibleCallback(boost::bind(&Updater::setActive, mFriendListUpdater, _2));
     friends_tab->setVisibleCallback(boost::bind(&LLPanelPeople::removePicker, this));
 
+	EShowPermissionType spType = (EShowPermissionType)gSavedSettings.getU32("FriendsListShowPermissions");
+	if (spType >= SP_COUNT)
+		spType = SP_NEVER;
+
 	mOnlineFriendList = friends_tab->getChild<LLAvatarList>("avatars_online");
 	mAllFriendList = friends_tab->getChild<LLAvatarList>("avatars_all");
 	mOnlineFriendList->setNoItemsCommentText(getString("no_friends_online"));
 	mOnlineFriendList->setShowIcons("FriendsListShowIcons");
-	mOnlineFriendList->showPermissions(gSavedSettings.getBOOL("FriendsListShowPermissions"));
+	mOnlineFriendList->showPermissions(spType);
 	mOnlineFriendList->setShowCompleteName(!gSavedSettings.getBOOL("FriendsListHideUsernames"));
 	mAllFriendList->setNoItemsCommentText(getString("no_friends"));
 	mAllFriendList->setShowIcons("FriendsListShowIcons");
-	mAllFriendList->showPermissions(gSavedSettings.getBOOL("FriendsListShowPermissions"));
+	mAllFriendList->showPermissions(spType);
 	mAllFriendList->setShowCompleteName(!gSavedSettings.getBOOL("FriendsListHideUsernames"));
 
 	LLPanel* nearby_tab = getChild<LLPanel>(NEARBY_TAB_NAME);
@@ -1344,14 +1348,21 @@ void LLPanelPeople::onFriendsViewSortMenuItemClicked(const LLSD& userdata)
 		mAllFriendList->toggleIcons();
 		mOnlineFriendList->toggleIcons();
 	}
-	else if (chosen_item == "view_permissions")
+	else if ( ("view_permissions_never" == chosen_item) || 
+	          ("view_permissions_hover" == chosen_item) ||
+	          ("view_permissions_nondefault" == chosen_item) )
 	{
-		bool show_permissions = !gSavedSettings.getBOOL("FriendsListShowPermissions");
-		gSavedSettings.setBOOL("FriendsListShowPermissions", show_permissions);
-
-		mAllFriendList->showPermissions(show_permissions);
-		mOnlineFriendList->showPermissions(show_permissions);
+		EShowPermissionType spType = SP_NEVER;
+		if ("view_permissions_hover" == chosen_item)
+			spType = SP_HOVER;
+		else if ("view_permissions_nondefault" == chosen_item)
+			spType = SP_NONDEFAULT;
+		gSavedSettings.setU32("FriendsListShowPermissions", (U32)spType);
+		
+		mAllFriendList->showPermissions(spType);
+		mOnlineFriendList->showPermissions(spType);
 	}
+
 	else if (chosen_item == "view_usernames")
 	{
 		bool hide_usernames = !gSavedSettings.getBOOL("FriendsListHideUsernames");
@@ -1453,6 +1464,14 @@ bool LLPanelPeople::onFriendsViewSortMenuItemCheck(const LLSD& userdata)
 	if (item == "sort_status")
 		return sort_order == E_SORT_BY_STATUS;
 
+	EShowPermissionType spType = (EShowPermissionType)gSavedSettings.getU32("FriendsListShowPermissions");
+	if ("view_permissions_never" == item)
+		return SP_NEVER == spType;
+	if ("view_permissions_hover" == item)
+		return SP_HOVER == spType;
+	if ("view_permissions_nondefault" == item)
+		return SP_NONDEFAULT == spType;
+
 	return false;
 }
 
diff --git a/indra/newview/skins/default/textures/icons/Permission_Ungranted.png b/indra/newview/skins/default/textures/icons/Permission_Ungranted.png
new file mode 100644
index 0000000000000000000000000000000000000000..d206af4433b0cb9e551e20e39bcff2837d310f81
Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Permission_Ungranted.png differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index d90e234469a405695cf0f83eb7459361afb19d7a..cf9d25b10bd1f6678d5bf087b11e3c6151ca5286 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -519,6 +519,7 @@ with the same filename but different name
   <texture name="Permission_Visible_Them_Map" file_name="icons/see_them_on_map.png" preload="false" />
   <texture name="Permission_Edit_Objects_Mine" file_name="icons/edit_mine.png" preload="false" />
   <texture name="Permission_Edit_Objects_Theirs" file_name="icons/edit_theirs.png" preload="false" />
+  <texture name="Permission_Ungranted" file_name="icons/Permission_Ungranted.png" preload="false" />
 
   <texture name="Play_Off" file_name="icons/Play_Off.png" preload="false" />
   <texture name="Play_Over" file_name="icons/Play_Over.png" preload="false" />
diff --git a/indra/newview/skins/default/xui/en/menu_people_friends_view.xml b/indra/newview/skins/default/xui/en/menu_people_friends_view.xml
index b5a4b87acd1bda66124856aaaf4f2d70fa8a3a6a..d8b9e96942ba9887185cbdd4745dac784b770555 100644
--- a/indra/newview/skins/default/xui/en/menu_people_friends_view.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_friends_view.xml
@@ -24,6 +24,40 @@
        parameter="sort_status" />
   </menu_item_check>
   <menu_item_separator layout="topleft" />
+  <context_menu
+   label="Show permissions"
+   name="People Show Permissions" >
+    <menu_item_check
+     name="view_permissions"
+     label="Never">
+      <menu_item_check.on_click
+       function="People.Friends.ViewSort.Action"
+       parameter="view_permissions_never" />
+      <menu_item_check.on_check
+       function="People.Friends.ViewSort.CheckItem"
+       parameter="view_permissions_never" />
+    </menu_item_check>
+    <menu_item_check
+     name="view_permissions"
+     label="On hover">
+      <menu_item_check.on_click
+       function="People.Friends.ViewSort.Action"
+       parameter="view_permissions_hover" />
+      <menu_item_check.on_check
+       function="People.Friends.ViewSort.CheckItem"
+       parameter="view_permissions_hover" />
+    </menu_item_check>
+    <menu_item_check
+     name="view_permissions"
+     label="Per user">
+      <menu_item_check.on_click
+       function="People.Friends.ViewSort.Action"
+       parameter="view_permissions_nondefault" />
+      <menu_item_check.on_check
+       function="People.Friends.ViewSort.CheckItem"
+       parameter="view_permissions_nondefault" />
+    </menu_item_check>
+  </context_menu>
   <menu_item_check name="view_icons" label="View People Icons">
     <menu_item_check.on_click
      function="People.Friends.ViewSort.Action"
@@ -32,14 +66,6 @@
      function="CheckControl"
      parameter="FriendsListShowIcons" />
   </menu_item_check>
-  <menu_item_check name="view_permissions" label="View Permissions Granted">
-    <menu_item_check.on_click
-     function="People.Friends.ViewSort.Action"
-     parameter="view_permissions" />
-    <menu_item_check.on_check
-     function="CheckControl"
-     parameter="FriendsListShowPermissions" />
-  </menu_item_check>
   <menu_item_check name="view_usernames" label="Hide usernames">
     <menu_item_check.on_click
      function="People.Friends.ViewSort.Action"
diff --git a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
index 1c2ca9f0b91be9f1853106e500ba429abdc5bda5..1aab704c428fb3170930416b648d5da376197721 100644
--- a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
@@ -88,17 +88,7 @@
      value="0s"
      width="38" />
     <icon
-     height="16"
-     follows="right"
-     image_name="Permission_Visible_Them_Online"
-     layout="topleft"
-     left_pad="3"
-     right="-167"
-     name="permission_online_theirs_icon"
-     tool_tip="You can see this friend&apos;s online status"
-     top="4"
-     width="16" />
-    <icon
+     enabled="false"
      height="16"
      follows="right"
      image_name="Permission_Visible_Them_Map"
@@ -110,6 +100,7 @@
      top="4"
      width="16" />
     <icon
+     enabled="false"
      height="16"
      follows="right"
      image_name="Permission_Edit_Objects_Theirs"
@@ -120,10 +111,11 @@
      tool_tip="You can edit this friend&apos;s objects"
      top="4"
      width="16" />
-    <icon
+    <button
+     enabled="false"
      height="16"
      follows="right"
-     image_name="Permission_Edit_Objects_Mine"
+     image_unselected="Permission_Edit_Objects_Mine"
      layout="topleft"
      left_pad="3"
      right="-110"
@@ -131,10 +123,11 @@
      tool_tip="This friend can edit, delete or take your objects"
      top_delta="0"
      width="16" />
-    <icon
+    <button
+     enabled="false"
      height="16"
      follows="right"
-     image_name="Permission_Visible_Map"
+     image_unselected="Permission_Visible_Map"
      layout="topleft"
      left_pad="3"
      tool_tip="This friend can locate you on the map"
@@ -142,10 +135,11 @@
      name="permission_map_icon"
      top_delta="0"
      width="16" />
-    <icon
+    <button
+     enabled="false"
      height="16"
      follows="right"
-     image_name="Permission_Visible_Online"
+     image_unselected="Permission_Visible_Online"
      layout="topleft"
      left_pad="3"
      right="-72"