diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PermisssionCheck.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PermisssionCheck.scala
index 4c178865146d21d621cfbdb587d20631e048b046..baa7c116c894e0aa69cbb18414c05d389ef63417 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PermisssionCheck.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PermisssionCheck.scala
@@ -24,7 +24,7 @@ object PermisssionCheck {
   }
 
   private def roleToLevel(user: UserState): Int = {
-    if (user.role == Roles.PRESENTER_ROLE) PRESENTER_LEVEL else VIEWER_LEVEL
+    if (user.presenter) PRESENTER_LEVEL else VIEWER_LEVEL
   }
 
   /**
@@ -39,8 +39,16 @@ object PermisssionCheck {
    */
   def isAllowed(permissionLevel: Int, roleLevel: Int, users: Users2x, userId: String): Boolean = {
     Users2x.findWithIntId(users, userId) match {
-      case Some(user) => (permissionToLevel(user) >= permissionLevel && roleToLevel(user) >= roleLevel)
-      case None       => false
+      case Some(user) =>
+        println("permissionToLevel = " + permissionToLevel(user) + " permissionLevel=" + permissionLevel)
+        val permLevelCheck = permissionToLevel(user) >= permissionLevel
+        println("roleToLevel = " + roleToLevel(user) + " roleLevel=" + roleLevel)
+        val roleLevelCheck = roleToLevel(user) >= roleLevel
+        println("PERMLEVELCHECK = " + permissionToLevel(user) + " ROLELEVELCHECK=" + permissionLevel)
+
+        println("PERMLEVELCHECK = " + permLevelCheck + " ROLELEVELCHECK=" + roleLevelCheck)
+        permLevelCheck && roleLevelCheck
+      case None => false
     }
 
   }
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/MuteUserCmdMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/MuteUserCmdMsgHdlr.scala
index 2c6673797b8c578b457ad98c95702d3cbab817e3..3f1709c6ca62b667e907073ce21998500ca8f2ec 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/MuteUserCmdMsgHdlr.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/MuteUserCmdMsgHdlr.scala
@@ -1,23 +1,61 @@
 package org.bigbluebutton.core.apps.users
 
+import org.bigbluebutton.SystemConfiguration
 import org.bigbluebutton.common2.msgs.MuteUserCmdMsg
+import org.bigbluebutton.core.apps.PermisssionCheck
 import org.bigbluebutton.core.models.VoiceUsers
-import org.bigbluebutton.core.running.{ MeetingActor, OutMsgRouter }
+import org.bigbluebutton.core.running.{ LiveMeeting, OutMsgRouter }
 import org.bigbluebutton.core2.message.senders.MsgBuilder
 
-trait MuteUserCmdMsgHdlr {
-  this: MeetingActor =>
+trait MuteUserCmdMsgHdlrDefault {
+  def handleMuteUserCmdMsg(msg: MuteUserCmdMsg): Unit = {
+    println("**************** MuteUserCmdMsgHdlrDefault ")
+  }
+}
+
+trait MuteUserCmdMsgHdlrPermCheck extends MuteUserCmdMsgHdlrDefault with SystemConfiguration {
+  this: UsersApp =>
+
+  val liveMeeting: LiveMeeting
+  val outGW: OutMsgRouter
+
+  override def handleMuteUserCmdMsg(msg: MuteUserCmdMsg): Unit = {
+    println("**************** MuteUserCmdMsgHdlrPermCheck ")
+
+    val isAllowed = PermisssionCheck.isAllowed(
+      PermisssionCheck.MOD_LEVEL,
+      PermisssionCheck.PRESENTER_LEVEL, liveMeeting.users2x, msg.body.mutedBy
+    )
 
+    if (applyPermissionCheck && !isAllowed) {
+      val meetingId = liveMeeting.props.meetingProp.intId
+      val reason = "No permission to mute user in meeting."
+      PermisssionCheck.ejectUserForFailedPermission(meetingId, msg.body.mutedBy, reason, outGW)
+    } else {
+      super.handleMuteUserCmdMsg(msg)
+    }
+  }
+}
+
+trait MuteUserCmdMsgHdlr extends MuteUserCmdMsgHdlrDefault {
+  this: UsersApp =>
+
+  val liveMeeting: LiveMeeting
   val outGW: OutMsgRouter
 
-  def handleMuteUserCmdMsg(msg: MuteUserCmdMsg) {
-    log.info("Received mute user request. meetingId=" + props.meetingProp.intId + " userId="
+  override def handleMuteUserCmdMsg(msg: MuteUserCmdMsg) {
+    println("**************** MuteUserCmdMsgHdlr ")
+
+    val meetingId = liveMeeting.props.meetingProp.intId
+    val voiceConf = liveMeeting.props.voiceProp.voiceConf
+
+    log.info("Received mute user request. meetingId=" + meetingId + " userId="
       + msg.body.userId)
     for {
       u <- VoiceUsers.findWithIntId(liveMeeting.voiceUsers, msg.body.userId)
     } yield {
-      log.info("Send mute user request. meetingId=" + props.meetingProp.intId + " userId=" + u.intId + " user=" + u)
-      val event = MsgBuilder.buildMuteUserInVoiceConfSysMsg(props.meetingProp.intId, props.voiceProp.voiceConf,
+      log.info("Send mute user request. meetingId=" + meetingId + " userId=" + u.intId + " user=" + u)
+      val event = MsgBuilder.buildMuteUserInVoiceConfSysMsg(meetingId, voiceConf,
         u.voiceUserId, !u.muted)
       outGW.send(event)
     }
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UsersApp.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UsersApp.scala
index 8bb0e15f5354ceabc6d1e035300c7938bcdfb430..fe8843c61eb1a96dc5e2ed26dc1f8a4b10aef40f 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UsersApp.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UsersApp.scala
@@ -21,7 +21,9 @@ class UsersApp(
     with SetRecordingStatusCmdMsgHdlr
     with GetRecordingStatusReqMsgHdlr
     with AssignPresenterReqMsgHdlr
-    with EjectUserFromMeetingCmdMsgHdlr {
+    with EjectUserFromMeetingCmdMsgHdlr
+    with MuteUserCmdMsgHdlr
+    with MuteUserCmdMsgHdlrPermCheck {
 
   val log = Logging(context.system, getClass)
 }
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActor.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActor.scala
index e0ef5cb74966038f024d7755121f1bf33a9b883d..7ca1345e8aa50e5d94a2af8ae50825f3dc55b516 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActor.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActor.scala
@@ -70,8 +70,9 @@ class MeetingActor(
     with UserDisconnectedFromGlobalAudioMsgHdlr
     with MuteAllExceptPresentersCmdMsgHdlr
     with MuteMeetingCmdMsgHdlr
+    with MuteMeetingCmdMsgHdlrCheckPerm
     with IsMeetingMutedReqMsgHdlr
-    with MuteUserCmdMsgHdlr
+
     with EjectUserFromVoiceCmdMsgHdlr
     with EndMeetingSysCmdMsgHdlr
     with DestroyMeetingSysCmdMsgHdlr
@@ -264,7 +265,7 @@ class MeetingActor(
       case m: UserMutedInVoiceConfEvtMsg => handleUserMutedInVoiceConfEvtMsg(m)
       case m: UserTalkingInVoiceConfEvtMsg => handleUserTalkingInVoiceConfEvtMsg(m)
       case m: RecordingStartedVoiceConfEvtMsg => handleRecordingStartedVoiceConfEvtMsg(m)
-      case m: MuteUserCmdMsg => handleMuteUserCmdMsg(m)
+      case m: MuteUserCmdMsg => usersApp.handleMuteUserCmdMsg(m)
       case m: MuteAllExceptPresentersCmdMsg => handleMuteAllExceptPresentersCmdMsg(m)
       case m: EjectUserFromVoiceCmdMsg => handleEjectUserFromVoiceCmdMsg(m)
       case m: IsMeetingMutedReqMsg => handleIsMeetingMutedReqMsg(m)
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/MuteMeetingCmdMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/MuteMeetingCmdMsgHdlr.scala
index f7608d844790a1347ba8815f85be5b536fdf3503..493cb562942eb1a8639a5a280d944b0238fc3488 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/MuteMeetingCmdMsgHdlr.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/MuteMeetingCmdMsgHdlr.scala
@@ -24,7 +24,7 @@ trait MuteMeetingCmdMsgHdlrCheckPerm extends MuteMeetingCmdMsgHdlrDefault with S
 
     if (applyPermissionCheck && !isAllowed) {
       val meetingId = liveMeeting.props.meetingProp.intId
-      val reason = "No permission to change lock settings"
+      val reason = "No permission to mute meeting."
       PermisssionCheck.ejectUserForFailedPermission(meetingId, msg.body.mutedBy, reason, outGW)
     } else {
       super.handleMuteMeetingCmdMsg(msg)
@@ -32,7 +32,7 @@ trait MuteMeetingCmdMsgHdlrCheckPerm extends MuteMeetingCmdMsgHdlrDefault with S
   }
 }
 
-trait MuteMeetingCmdMsgHdlr extends MuteMeetingCmdMsgHdlrCheckPerm {
+trait MuteMeetingCmdMsgHdlr extends MuteMeetingCmdMsgHdlrDefault {
   this: MeetingActor =>
 
   val outGW: OutMsgRouter