diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp
index 48a7a32a3b1c7b80111b7649c1884b7f809d01c8..a42b5e48ccc2c47637687677ca2860c9b8d828d7 100644
--- a/indra/newview/llparticipantlist.cpp
+++ b/indra/newview/llparticipantlist.cpp
@@ -341,7 +341,7 @@ void LLParticipantList::LLParticipantListMenu::show(LLView* spawning_view, const
 	if (uuids.size() == 0) return;
 
 	const LLUUID speaker_id = mUUIDs.front();
-	BOOL is_muted = LLMuteList::getInstance()->isMuted(speaker_id, LLMute::flagVoiceChat);
+	BOOL is_muted = isMuted(speaker_id);
 
 	if (is_muted)
 	{
@@ -353,7 +353,6 @@ void LLParticipantList::LLParticipantListMenu::show(LLView* spawning_view, const
 		LLMenuGL::sMenuContainer->childSetVisible("ModerateVoiceUnMuteSelected", false);
 		LLMenuGL::sMenuContainer->childSetVisible("ModerateVoiceUnMuteOthers", false);
 	}
-
 }
 
 void LLParticipantList::LLParticipantListMenu::toggleAllowTextChat(const LLSD& userdata)
@@ -390,14 +389,14 @@ void LLParticipantList::LLParticipantListMenu::toggleAllowTextChat(const LLSD& u
 				{
 					gIMMgr->showSessionEventError(
 						"mute",
-						"not_a_moderator",
+						"not_a_mod_error",
 						mSessionID);
 				}
 				else
 				{
 					gIMMgr->showSessionEventError(
 						"mute",
-						"generic",
+						"generic_request_error",
 						mSessionID);
 				}
 			}
@@ -450,34 +449,102 @@ void LLParticipantList::LLParticipantListMenu::toggleMuteVoice(const LLSD& userd
 	toggleMute(userdata, LLMute::flagVoiceChat);
 }
 
+bool LLParticipantList::LLParticipantListMenu::isMuted(const LLUUID& avatar_id)
+{
+	LLPointer<LLSpeaker> selected_speakerp = mParent.mSpeakerMgr->findSpeaker(avatar_id);
+	if (!selected_speakerp) return true;
+
+	return selected_speakerp->mStatus == LLSpeaker::STATUS_MUTED;
+}
+
 void LLParticipantList::LLParticipantListMenu::moderateVoice(const LLSD& userdata)
 {
+	if (!gAgent.getRegion()) return;
 
+	bool moderate_selected = userdata.asString() == "selected";
+	const LLUUID& selected_avatar_id = mUUIDs.front();
+	bool is_muted = isMuted(selected_avatar_id);
+
+	if (moderate_selected)
+	{
+		moderateVoiceParticipant(selected_avatar_id, is_muted);
+	}
+	else
+	{
+		moderateVoiceOtherParticipants(selected_avatar_id, is_muted);
+	}
 }
-void LLParticipantList::LLParticipantListMenu::moderateVoiceOtherParticipants(const LLSD& userdata)
+
+void LLParticipantList::LLParticipantListMenu::moderateVoiceParticipant(const LLUUID& avatar_id, bool unmute)
+{
+	if (gAgentID == avatar_id) return; // do not process myself
+
+	std::string url = gAgent.getRegion()->getCapability("ChatSessionRequest");
+	LLSD data;
+	data["method"] = "mute update";
+	data["session-id"] = mParent.mSpeakerMgr->getSessionID();
+	data["params"] = LLSD::emptyMap();
+	data["params"]["agent_id"] = avatar_id;
+	data["params"]["mute_info"] = LLSD::emptyMap();
+	data["params"]["mute_info"]["voice"] = !unmute;
+
+	class MuteVoiceResponder : public LLHTTPClient::Responder
+	{
+	public:
+		MuteVoiceResponder(const LLUUID& session_id)
+		{
+			mSessionID = session_id;
+		}
+
+		virtual void error(U32 status, const std::string& reason)
+		{
+			llwarns << status << ": " << reason << llendl;
+
+			if ( gIMMgr )
+			{
+				//403 == you're not a mod
+				//should be disabled if you're not a moderator
+				if ( 403 == status )
+				{
+					gIMMgr->showSessionEventError(
+						"mute",
+						"not_a_mod_error",
+						mSessionID);
+				}
+				else
+				{
+					gIMMgr->showSessionEventError(
+						"mute",
+						"generic_request_error",
+						mSessionID);
+				}
+			}
+		}
+
+	private:
+		LLUUID mSessionID;
+	};
+
+	LLHTTPClient::post(
+		url,
+		data,
+		new MuteVoiceResponder(mParent.mSpeakerMgr->getSessionID()));
+}
+
+void LLParticipantList::LLParticipantListMenu::moderateVoiceOtherParticipants(const LLUUID& excluded_avatar_id, bool unmute)
 {
 	LLSpeakerMgr::speaker_list_t speakers;
 	mParent.mSpeakerMgr->getSpeakerList(&speakers, true);
 
-	const LLUUID& excluded_avatar_id = mUUIDs.front();
-	bool should_mute = userdata.asString() == "mute";
 	for (LLSpeakerMgr::speaker_list_t::iterator iter = speakers.begin();
 		iter != speakers.end(); ++iter)
 	{
 		LLSpeaker* speakerp = (*iter).get();
 		LLUUID speaker_id = speakerp->mID;
-		if (excluded_avatar_id == speaker_id) continue;
 
-		LLMute mute(speaker_id, speakerp->mDisplayName, speakerp->mType == LLSpeaker::SPEAKER_AGENT ? LLMute::AGENT : LLMute::OBJECT);
+		if (excluded_avatar_id == speaker_id) continue;
 
-		if (should_mute)
-		{
-			LLMuteList::getInstance()->add(mute, LLMute::flagVoiceChat);
-		}
-		else
-		{
-			LLMuteList::getInstance()->remove(mute, LLMute::flagVoiceChat);
-		}
+		moderateVoiceParticipant(speaker_id, unmute);
 	}
 
 }
diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h
index 83191a5b8d0b682dd673b821a399bc5728c89574..388d0b4fee989b75eb835162b968df5cb5220b0c 100644
--- a/indra/newview/llparticipantlist.h
+++ b/indra/newview/llparticipantlist.h
@@ -130,8 +130,10 @@ class LLParticipantList
 			void toggleMuteVoice(const LLSD& userdata);
 		
 			// Voice moderation support
+			bool isMuted(const LLUUID& avatar_id);
 			void moderateVoice(const LLSD& userdata);
-			void moderateVoiceOtherParticipants(const LLSD& userdata);
+			void moderateVoiceParticipant(const LLUUID& avatar_id, bool unmute);
+			void moderateVoiceOtherParticipants(const LLUUID& excluded_avatar_id, bool unmute);
 		};
 
 	private:
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index c3650c71c34face96701472c294aed1f070153c0..8ac4ca95b9d15037c9292162bf40f6473e9c3383 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -2900,6 +2900,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
   <string name="message_session_event">
     Unable to send your message to the chat session with [RECIPIENT].
   </string>
+  <string name="mute">
+    Error while moderating.
+  </string>
   <string name="removed_from_group">
     You have been removed from the group.
   </string>