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 52492d976133458e820f8cb406718a4593fa9eeb..d29f40d11364f278279ed9965516b4b5fbc26d3d 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
@@ -32,17 +32,31 @@ trait MuteUserCmdMsgHdlr extends RightsManagementTrait {
 
       val permissions = MeetingStatus2x.getPermissions(liveMeeting.status)
       for {
-        requester <- Users2x.findWithIntId(liveMeeting.users2x, msg.header.userId)
-        u <- VoiceUsers.findWithIntId(liveMeeting.voiceUsers, msg.body.userId)
+        requester <- Users2x.findWithIntId(
+          liveMeeting.users2x,
+          msg.header.userId
+        )
+        u <- VoiceUsers.findWithIntId(
+          liveMeeting.voiceUsers,
+          msg.body.userId
+        )
       } yield {
-        if (requester.role != Roles.MODERATOR_ROLE && permissions.disableMic && requester.locked && u.muted &&
+
+        if (requester.role != Roles.MODERATOR_ROLE
+          && permissions.disableMic
+          && requester.locked
+          && u.muted &&
           msg.body.userId == msg.header.userId) {
           // unmuting self while not moderator and mic disabled. Do not allow.
         } else {
           if (u.muted != msg.body.mute) {
             log.info("Send mute user request. meetingId=" + meetingId + " userId=" + u.intId + " user=" + u)
-            val event = MsgBuilder.buildMuteUserInVoiceConfSysMsg(meetingId, voiceConf,
-              u.voiceUserId, msg.body.mute)
+            val event = MsgBuilder.buildMuteUserInVoiceConfSysMsg(
+              meetingId,
+              voiceConf,
+              u.voiceUserId,
+              msg.body.mute
+            )
             outGW.send(event)
           }
         }
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/voice/UserMutedInVoiceConfEvtMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/voice/UserMutedInVoiceConfEvtMsgHdlr.scala
index 107e326459b8244f43dd4789bd5dfc19f41bd700..fb92365d636d66dfb794379592b30b4cb690b398 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/voice/UserMutedInVoiceConfEvtMsgHdlr.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/voice/UserMutedInVoiceConfEvtMsgHdlr.scala
@@ -1,40 +1,26 @@
 package org.bigbluebutton.core.apps.voice
 
 import org.bigbluebutton.common2.msgs._
-import org.bigbluebutton.core.models.{ VoiceUserState, VoiceUsers }
-import org.bigbluebutton.core.running.{ BaseMeetingActor, LiveMeeting, OutMsgRouter }
+import org.bigbluebutton.core.models.{ VoiceUsers }
+import org.bigbluebutton.core.running.{ LiveMeeting, MeetingActor, OutMsgRouter }
 
 trait UserMutedInVoiceConfEvtMsgHdlr {
-  this: BaseMeetingActor =>
+  this: MeetingActor =>
 
   val liveMeeting: LiveMeeting
   val outGW: OutMsgRouter
 
   def handleUserMutedInVoiceConfEvtMsg(msg: UserMutedInVoiceConfEvtMsg): Unit = {
 
-    def broadcastEvent(vu: VoiceUserState): Unit = {
-      val routing = Routing.addMsgToClientRouting(
-        MessageTypes.BROADCAST_TO_MEETING,
-        liveMeeting.props.meetingProp.intId,
-        vu.intId
-      )
-      val envelope = BbbCoreEnvelope(UserMutedVoiceEvtMsg.NAME, routing)
-      val header = BbbClientMsgHeader(
-        UserMutedVoiceEvtMsg.NAME,
-        liveMeeting.props.meetingProp.intId, vu.intId
-      )
-
-      val body = UserMutedVoiceEvtMsgBody(voiceConf = msg.header.voiceConf, intId = vu.intId, voiceUserId = vu.intId, vu.muted)
-
-      val event = UserMutedVoiceEvtMsg(header, body)
-      val msgEvent = BbbCommonEnvCoreMsg(envelope, event)
-      outGW.send(msgEvent)
-    }
-
     for {
-      mutedUser <- VoiceUsers.userMuted(liveMeeting.voiceUsers, msg.body.voiceUserId, msg.body.muted)
+      vu <- VoiceUsers.findWithVoiceUserId(liveMeeting.voiceUsers, msg.body.voiceUserId)
     } yield {
-      broadcastEvent(mutedUser)
+      VoiceApp.handleUserMutedInVoiceConfEvtMsg(
+        liveMeeting,
+        outGW,
+        msg.body.voiceUserId,
+        msg.body.muted
+      )
     }
   }
 }
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/voice/UserStatusVoiceConfEvtMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/voice/UserStatusVoiceConfEvtMsgHdlr.scala
index ccd3ca137f862f8c81c592a91cae4805cb607e8d..7633749dd726ff6d15a1b74f92d4a0a36cca8bb8 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/voice/UserStatusVoiceConfEvtMsgHdlr.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/voice/UserStatusVoiceConfEvtMsgHdlr.scala
@@ -17,6 +17,5 @@ trait UserStatusVoiceConfEvtMsgHdlr {
       eventBus,
       msg.body.confUsers
     )
-    
   }
 }
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/voice/UserTalkingInVoiceConfEvtMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/voice/UserTalkingInVoiceConfEvtMsgHdlr.scala
index f40499382ad447f605dc5587916b819a74f0b529..47070f47a8680678770892da01b86bab8a879c76 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/voice/UserTalkingInVoiceConfEvtMsgHdlr.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/voice/UserTalkingInVoiceConfEvtMsgHdlr.scala
@@ -32,9 +32,9 @@ trait UserTalkingInVoiceConfEvtMsgHdlr {
     }
 
     for {
-      mutedUser <- VoiceUsers.userTalking(liveMeeting.voiceUsers, msg.body.voiceUserId, msg.body.talking)
+      talkingUser <- VoiceUsers.userTalking(liveMeeting.voiceUsers, msg.body.voiceUserId, msg.body.talking)
     } yield {
-      broadcastEvent(mutedUser)
+      broadcastEvent(talkingUser)
     }
   }
 }
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/voice/VoiceApp.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/voice/VoiceApp.scala
index b5b1dc9e360f698a14ecabddaf987434dc814397..d39bdbd46a0a80838917051b5fc00b0fa2b6e379 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/voice/VoiceApp.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/voice/VoiceApp.scala
@@ -95,45 +95,38 @@ object VoiceApp {
       eventBus:    InternalEventBus,
       users:       Vector[ConfVoiceUser]
   ): Unit = {
-    users foreach { u =>
+    users foreach { cvu =>
       VoiceUsers.findWithVoiceUserId(
         liveMeeting.voiceUsers,
-        u.voiceUserId
+        cvu.voiceUserId
       ) match {
           case Some(vu) =>
-            if (vu.muted != u.muted) {
+            if (vu.muted != cvu.muted) {
               handleUserMutedInVoiceConfEvtMsg(
                 liveMeeting,
                 outGW,
-                u.voiceUserId,
-                u.muted
+                cvu.voiceUserId,
+                cvu.muted
               )
+            } else {
+              // Update the user status to indicate they are still in the voice conference.
+              VoiceUsers.setLastStatusUpdate(liveMeeting.voiceUsers, vu)
             }
-
-            // Update the user status to indicate they are stll in the voice conference.
-            VoiceUsers.setLastStatusUpdate(liveMeeting.voiceUsers, vu)
           case None =>
             handleUserJoinedVoiceConfEvtMsg(
               liveMeeting,
               outGW,
               eventBus,
               liveMeeting.props.voiceProp.voiceConf,
-              u.intId,
-              u.voiceUserId,
-              u.callingWith,
-              u.callerIdName,
-              u.callerIdNum,
-              u.muted,
-              u.talking,
-              u.calledInto
+              cvu.intId,
+              cvu.voiceUserId,
+              cvu.callingWith,
+              cvu.callerIdName,
+              cvu.callerIdNum,
+              cvu.muted,
+              cvu.talking,
+              cvu.calledInto
             )
-
-            // Update this new users status time.
-            for {
-              vu <- VoiceUsers.findWithVoiceUserId(liveMeeting.voiceUsers, u.voiceUserId)
-            } yield {
-              VoiceUsers.setLastStatusUpdate(liveMeeting.voiceUsers, vu)
-            }
         }
     }
 
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/VoiceUsers.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/VoiceUsers.scala
index 2055586d05b06d88c4901032e383853724172b56..ba0783a9df0e9a61b083089c6444e17b3f3f30af 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/VoiceUsers.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/VoiceUsers.scala
@@ -39,39 +39,19 @@ object VoiceUsers {
     } yield {
       val vu = u.modify(_.muted).setTo(muted)
         .modify(_.talking).setTo(false)
+        .modify(_.lastStatusUpdateOn).setTo(System.currentTimeMillis())
       users.save(vu)
       vu
     }
   }
 
-  def userTalking(users: VoiceUsers, voiceUserId: String, talkng: Boolean): Option[VoiceUserState] = {
+  def userTalking(users: VoiceUsers, voiceUserId: String, talking: Boolean): Option[VoiceUserState] = {
     for {
       u <- findWithVoiceUserId(users, voiceUserId)
     } yield {
       val vu = u.modify(_.muted).setTo(false)
-        .modify(_.talking).setTo(talkng)
-      users.save(vu)
-      vu
-    }
-  }
-
-  def joinedVoiceListenOnly(users: VoiceUsers, userId: String): Option[VoiceUserState] = {
-    for {
-      u <- findWIthIntId(users, userId)
-    } yield {
-      val vu = u.modify(_.muted).setTo(true)
-        .modify(_.talking).setTo(false)
-      users.save(vu)
-      vu
-    }
-  }
-
-  def leftVoiceListenOnly(users: VoiceUsers, userId: String): Option[VoiceUserState] = {
-    for {
-      u <- findWIthIntId(users, userId)
-    } yield {
-      val vu = u.modify(_.muted).setTo(false)
-        .modify(_.talking).setTo(false)
+        .modify(_.talking).setTo(talking)
+        .modify(_.lastStatusUpdateOn).setTo(System.currentTimeMillis())
       users.save(vu)
       vu
     }
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/AnalyticsActor.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/AnalyticsActor.scala
index c82f5ac3a46ec1210d85a0f30c36cb392aa9935a..1723a91c887ed74d74cf4fbd7b3b328f1a488019 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/AnalyticsActor.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/AnalyticsActor.scala
@@ -30,65 +30,69 @@ class AnalyticsActor extends Actor with ActorLogging {
   def handleBbbCommonEnvCoreMsg(msg: BbbCommonEnvCoreMsg): Unit = {
 
     msg.core match {
-      case m: GetAllMeetingsReqMsg => logMessage(msg)
-
-      case m: RegisterUserReqMsg => logMessage(msg)
-      case m: RegisteredUserJoinTimeoutMsg => logMessage(msg)
-      case m: UserRegisteredRespMsg => logMessage(msg)
-      case m: DisconnectAllClientsSysMsg => logMessage(msg)
-      case m: DisconnectClientSysMsg => logMessage(msg)
-      case m: MeetingEndingEvtMsg => logMessage(msg)
-      case m: MeetingCreatedEvtMsg => logMessage(msg)
-      case m: LogoutAndEndMeetingCmdMsg => logMessage(msg)
-      case m: ValidateAuthTokenRespMsg => logMessage(msg)
-      case m: UserJoinedMeetingEvtMsg => logMessage(msg)
-      case m: RecordingStatusChangedEvtMsg => logMessage(msg)
-      case m: WebcamsOnlyForModeratorChangedEvtMsg => logMessage(msg)
-      case m: UserLeftMeetingEvtMsg => logMessage(msg)
-      case m: PresenterUnassignedEvtMsg => logMessage(msg)
-      case m: PresenterAssignedEvtMsg => logMessage(msg)
-      case m: MeetingIsActiveEvtMsg => logMessage(msg)
-      case m: UserEjectedFromMeetingEvtMsg => logMessage(msg)
-      case m: EjectUserFromVoiceConfSysMsg => logMessage(msg)
-      case m: CreateBreakoutRoomSysCmdMsg => logMessage(msg)
-      case m: RequestBreakoutJoinURLReqMsg => logMessage(msg)
-      case m: EndAllBreakoutRoomsMsg => logMessage(msg)
-      case m: TransferUserToMeetingRequestMsg => logMessage(msg)
-      case m: UserLeftVoiceConfToClientEvtMsg => logMessage(msg)
-      case m: UserLeftVoiceConfEvtMsg => logMessage(msg)
-      case m: RecordingStartedVoiceConfEvtMsg => logMessage(msg)
-      case m: MuteUserCmdMsg => logMessage(msg)
-      case m: MuteUserInVoiceConfSysMsg => logMessage(msg)
-      case m: MuteAllExceptPresentersCmdMsg => logMessage(msg)
-      case m: EjectUserFromVoiceCmdMsg => logMessage(msg)
-      case m: MuteMeetingCmdMsg => logMessage(msg)
-      case m: UserConnectedToGlobalAudioMsg => logMessage(msg)
-      case m: UserJoinedVoiceConfToClientEvtMsg => logMessage(msg)
-      case m: UserDisconnectedFromGlobalAudioMsg => logMessage(msg)
-      case m: AssignPresenterReqMsg => logMessage(msg)
-      case m: ScreenshareStartedVoiceConfEvtMsg => logMessage(msg)
-      case m: ScreenshareStoppedVoiceConfEvtMsg => logMessage(msg)
+      case m: GetAllMeetingsReqMsg                           => logMessage(msg)
+
+      case m: RegisterUserReqMsg                             => logMessage(msg)
+      case m: RegisteredUserJoinTimeoutMsg                   => logMessage(msg)
+      case m: UserRegisteredRespMsg                          => logMessage(msg)
+      case m: DisconnectAllClientsSysMsg                     => logMessage(msg)
+      case m: DisconnectClientSysMsg                         => logMessage(msg)
+      case m: MeetingEndingEvtMsg                            => logMessage(msg)
+      case m: MeetingCreatedEvtMsg                           => logMessage(msg)
+      case m: LogoutAndEndMeetingCmdMsg                      => logMessage(msg)
+      case m: ValidateAuthTokenRespMsg                       => logMessage(msg)
+      case m: UserJoinedMeetingEvtMsg                        => logMessage(msg)
+      case m: RecordingStatusChangedEvtMsg                   => logMessage(msg)
+      case m: WebcamsOnlyForModeratorChangedEvtMsg           => logMessage(msg)
+      case m: UserLeftMeetingEvtMsg                          => logMessage(msg)
+      case m: PresenterUnassignedEvtMsg                      => logMessage(msg)
+      case m: PresenterAssignedEvtMsg                        => logMessage(msg)
+      case m: MeetingIsActiveEvtMsg                          => logMessage(msg)
+      case m: UserEjectedFromMeetingEvtMsg                   => logMessage(msg)
+      case m: EjectUserFromVoiceConfSysMsg                   => logMessage(msg)
+      case m: CreateBreakoutRoomSysCmdMsg                    => logMessage(msg)
+      case m: RequestBreakoutJoinURLReqMsg                   => logMessage(msg)
+      case m: EndAllBreakoutRoomsMsg                         => logMessage(msg)
+      case m: TransferUserToMeetingRequestMsg                => logMessage(msg)
+      case m: UserLeftVoiceConfToClientEvtMsg                => logMessage(msg)
+      case m: UserLeftVoiceConfEvtMsg                        => logMessage(msg)
+      case m: RecordingStartedVoiceConfEvtMsg                => logMessage(msg)
+      case m: MuteUserCmdMsg                                 => logMessage(msg)
+      case m: MuteUserInVoiceConfSysMsg                      => logMessage(msg)
+      case m: MuteAllExceptPresentersCmdMsg                  => logMessage(msg)
+      case m: EjectUserFromVoiceCmdMsg                       => logMessage(msg)
+      case m: MuteMeetingCmdMsg                              => logMessage(msg)
+      case m: UserConnectedToGlobalAudioMsg                  => logMessage(msg)
+      case m: UserJoinedVoiceConfToClientEvtMsg              => logMessage(msg)
+      case m: UserDisconnectedFromGlobalAudioMsg             => logMessage(msg)
+      case m: AssignPresenterReqMsg                          => logMessage(msg)
+      case m: ScreenshareStartedVoiceConfEvtMsg              => logMessage(msg)
+      case m: ScreenshareStoppedVoiceConfEvtMsg              => logMessage(msg)
       case m: ScreenshareRtmpBroadcastStartedVoiceConfEvtMsg => logMessage(msg)
       case m: ScreenshareRtmpBroadcastStoppedVoiceConfEvtMsg => logMessage(msg)
-      case m: ScreenshareStartRtmpBroadcastVoiceConfMsg => logMessage(msg)
-      case m: ScreenshareStopRtmpBroadcastVoiceConfMsg => logMessage(msg)
-      case m: ScreenshareRtmpBroadcastStartedEvtMsg => logMessage(msg)
-      case m: ScreenshareRtmpBroadcastStoppedEvtMsg => logMessage(msg)
-      case m: MeetingInactivityWarningEvtMsg => logMessage(msg)
-      case m: StartRecordingVoiceConfSysMsg => logMessage(msg)
-      case m: StopRecordingVoiceConfSysMsg => logMessage(msg)
+      case m: ScreenshareStartRtmpBroadcastVoiceConfMsg      => logMessage(msg)
+      case m: ScreenshareStopRtmpBroadcastVoiceConfMsg       => logMessage(msg)
+      case m: ScreenshareRtmpBroadcastStartedEvtMsg          => logMessage(msg)
+      case m: ScreenshareRtmpBroadcastStoppedEvtMsg          => logMessage(msg)
+      case m: MeetingInactivityWarningEvtMsg                 => logMessage(msg)
+      case m: StartRecordingVoiceConfSysMsg                  => logMessage(msg)
+      case m: StopRecordingVoiceConfSysMsg                   => logMessage(msg)
       //case m: UpdateRecordingTimerEvtMsg => logMessage(msg)
-      case m: RecordAndClearPreviousMarkersCmdMsg => logMessage(msg)
-      case m: TransferUserToVoiceConfSysMsg => logMessage(msg)
-      case m: UserBroadcastCamStartMsg => logMessage(msg)
-      case m: UserBroadcastCamStopMsg => logMessage(msg)
-      case m: UserBroadcastCamStoppedEvtMsg => logMessage(msg)
-      case m: UserBroadcastCamStartedEvtMsg => logMessage(msg)
-      case m: EjectUserFromMeetingSysMsg => logMessage(msg)
-      case m: UserActivitySignCmdMsg => logMessage(msg)
-      case m: UserInactivityInspectMsg => logMessage(msg)
-
-      case m: ChangeUserRoleCmdMsg => logMessage(msg)
+      case m: RecordAndClearPreviousMarkersCmdMsg            => logMessage(msg)
+      case m: TransferUserToVoiceConfSysMsg                  => logMessage(msg)
+      case m: UserBroadcastCamStartMsg                       => logMessage(msg)
+      case m: UserBroadcastCamStopMsg                        => logMessage(msg)
+      case m: UserBroadcastCamStoppedEvtMsg                  => logMessage(msg)
+      case m: UserBroadcastCamStartedEvtMsg                  => logMessage(msg)
+      case m: EjectUserFromMeetingSysMsg                     => logMessage(msg)
+      case m: UserActivitySignCmdMsg                         => logMessage(msg)
+      case m: UserInactivityInspectMsg                       => logMessage(msg)
+
+      case m: ChangeUserRoleCmdMsg                           => logMessage(msg)
+
+      // Voice
+      case m: UserMutedVoiceEvtMsg =>
+        logMessage(msg)
 
       // Breakout
       case m: BreakoutRoomEndedEvtMsg => logMessage(msg)