diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/Boot.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/Boot.scala
index 081ded6075820ff8a040e978ca10c7ed3ff2ab32..e851662d1977bd47eff5714a32e27d738d00b367 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/Boot.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/Boot.scala
@@ -18,10 +18,6 @@ import org.bigbluebutton.core.pubsub.senders._
 import org.bigbluebutton.core.service.recorder.RedisDispatcher
 import org.bigbluebutton.core.service.recorder.RecorderApplication
 import org.bigbluebutton.core.recorders.VoiceEventRecorder
-import org.bigbluebutton.core.recorders.ChatEventRedisRecorder
-import org.bigbluebutton.core.recorders.PresentationEventRedisRecorder
-import org.bigbluebutton.core.recorders.UsersEventRedisRecorder
-import org.bigbluebutton.core.recorders.WhiteboardEventRedisRecorder
 
 object Boot extends App with SystemConfiguration {
 
@@ -35,33 +31,7 @@ object Boot extends App with SystemConfiguration {
   recorderApp.start()
 
   val voiceEventRecorder = new VoiceEventRecorder(recorderApp)
-
-  val chatEventRecorder = new ChatEventRedisRecorder(recorderApp)
-  val presentationEventRecorder = new PresentationEventRedisRecorder(recorderApp)
-  val usersEventRecorder = new UsersEventRedisRecorder(recorderApp)
-  val whiteboardEventRecorder = new WhiteboardEventRedisRecorder(recorderApp)
-
-  val chatSender = new ChatEventRedisPublisher(msgSender)
-  val meetingSender = new MeetingEventRedisPublisher(msgSender)
-  val presSender = new PresentationEventRedisPublisher(msgSender)
-  val userSender = new UsersEventRedisPublisher(msgSender)
-  val whiteboardSender = new WhiteboardEventRedisPublisher(msgSender)
-  val pollingSender = new PollingEventRedisPublisher(msgSender)
-
-  val outMessageListeners = new java.util.ArrayList[OutMessageListener2]()
-  outMessageListeners.add(chatSender)
-  outMessageListeners.add(meetingSender)
-  outMessageListeners.add(presSender)
-  outMessageListeners.add(userSender)
-  outMessageListeners.add(whiteboardSender)
-  outMessageListeners.add(chatEventRecorder)
-  outMessageListeners.add(presentationEventRecorder)
-  outMessageListeners.add(usersEventRecorder)
-  outMessageListeners.add(whiteboardEventRecorder)
-  outMessageListeners.add(pollingSender)
-
-  val outGW = new MessageOutGateway(outMessageListeners)
-  val bbbInGW = new BigBlueButtonInGW(system, outGW, voiceEventRecorder)
+  val bbbInGW = new BigBlueButtonInGW(system, recorderApp, msgSender, voiceEventRecorder)
   val redisMsgReceiver = new RedisMessageReceiver(bbbInGW)
 
   val redisSubscriberActor = system.actorOf(AppsRedisSubscriberActor.props(redisMsgReceiver), "redis-subscriber")
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/BigBlueButtonActor.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/BigBlueButtonActor.scala
index b986f390e402ff2327bb0b8010d62cfcc5ad6a30..b83bd75789fe0400a9d57ec3308417f8d8c0b97d 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/BigBlueButtonActor.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/BigBlueButtonActor.scala
@@ -19,17 +19,19 @@ import org.bigbluebutton.core.recorders.events.VoiceUserLockedRecordEvent
 import org.bigbluebutton.core.recorders.events.VoiceUserMutedRecordEvent
 import org.bigbluebutton.core.recorders.events.VoiceStartRecordingRecordEvent
 import org.bigbluebutton.core.recorders.events.VoiceUserTalkingRecordEvent
+import org.bigbluebutton.core.service.recorder.RecorderApplication
 
 object BigBlueButtonActor extends SystemConfiguration {
-  def props(system: ActorSystem, outGW: MessageOutGateway, voiceEventRecorder: VoiceEventRecorder): Props =
-    Props(classOf[BigBlueButtonActor], system, outGW, voiceEventRecorder)
+  def props(system: ActorSystem, recorderApp: RecorderApplication, messageSender: MessageSender, voiceEventRecorder: VoiceEventRecorder): Props =
+    Props(classOf[BigBlueButtonActor], system, recorderApp, messageSender, voiceEventRecorder)
 }
 
-class BigBlueButtonActor(val system: ActorSystem, outGW: MessageOutGateway, voiceEventRecorder: VoiceEventRecorder) extends Actor with ActorLogging {
+class BigBlueButtonActor(val system: ActorSystem, recorderApp: RecorderApplication, messageSender: MessageSender, voiceEventRecorder: VoiceEventRecorder) extends Actor with ActorLogging {
   implicit def executionContext = system.dispatcher
   implicit val timeout = Timeout(5 seconds)
 
   private var meetings = new collection.immutable.HashMap[String, RunningMeeting]
+  private val outGW = new OutMessageGateway("bbbActorOutGW", recorderApp, messageSender)
 
   def receive = {
     case msg: CreateMeeting => handleCreateMeeting(msg)
@@ -187,7 +189,8 @@ class BigBlueButtonActor(val system: ActorSystem, outGW: MessageOutGateway, voic
     meetings.get(msg.meetingID) match {
       case None => {
         log.info("New meeting create request [" + msg.mProps.meetingName + "]")
-        var m = RunningMeeting(msg.mProps, outGW)
+        val moutGW = new OutMessageGateway("meetingOutGW-" + msg.meetingID, recorderApp, messageSender)
+        var m = RunningMeeting(msg.mProps, moutGW)
 
         meetings += m.mProps.meetingID -> m
         outGW.send(new MeetingCreated(m.mProps.meetingID, m.mProps.externalMeetingID, m.mProps.recorded, m.mProps.meetingName,
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/BigBlueButtonInGW.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/BigBlueButtonInGW.scala
index 149a8136e203f1697574d16c45fe4be78bb9d71d..aace43d1e7303c6c476c06c492947a4fd66134aa 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/BigBlueButtonInGW.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/BigBlueButtonInGW.scala
@@ -14,10 +14,11 @@ import akka.util.Timeout
 import scala.concurrent.duration._
 import scala.util.Success
 import scala.util.Failure
+import org.bigbluebutton.core.service.recorder.RecorderApplication
 
-class BigBlueButtonInGW(val system: ActorSystem, outGW: MessageOutGateway, voiceEventRecorder: VoiceEventRecorder) extends IBigBlueButtonInGW {
+class BigBlueButtonInGW(val system: ActorSystem, recorderApp: RecorderApplication, messageSender: MessageSender, voiceEventRecorder: VoiceEventRecorder) extends IBigBlueButtonInGW {
   val log = system.log
-  val bbbActor = system.actorOf(BigBlueButtonActor.props(system, outGW, voiceEventRecorder), "bigbluebutton-actor")
+  val bbbActor = system.actorOf(BigBlueButtonActor.props(system, recorderApp, messageSender, voiceEventRecorder), "bigbluebutton-actor")
 
   // Meeting
   def createMeeting2(meetingID: String, externalMeetingID: String, meetingName: String, record: Boolean,
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/MeetingActor.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/MeetingActor.scala
index 936cc8d7fec75ba002db863505b80103001107ed..537115e72ab5710d409cee31d1fe79f8893f98ec 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/MeetingActor.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/MeetingActor.scala
@@ -13,11 +13,11 @@ import org.bigbluebutton.core.apps.{ ChatModel, LayoutModel, UsersModel, PollMod
 import org.bigbluebutton.core.apps.PresentationModel
 
 object MeetingActor {
-  def props(mProps: MeetingProperties, outGW: MessageOutGateway): Props =
+  def props(mProps: MeetingProperties, outGW: OutMessageGateway): Props =
     Props(classOf[MeetingActor], mProps: MeetingProperties, outGW)
 }
 
-class MeetingActor(val mProps: MeetingProperties, val outGW: MessageOutGateway)
+class MeetingActor(val mProps: MeetingProperties, val outGW: OutMessageGateway)
     extends Actor with UsersApp with PresentationApp
     with LayoutApp with ChatApp with WhiteboardApp with PollApp
     with ActorLogging {
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/MessageSenderActor.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/MessageSenderActor.scala
new file mode 100755
index 0000000000000000000000000000000000000000..1a8d56dad578990e3af2c2d70a27184703907dd7
--- /dev/null
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/MessageSenderActor.scala
@@ -0,0 +1,643 @@
+package org.bigbluebutton.core
+
+import akka.actor.Actor
+import akka.actor.ActorRef
+import akka.actor.ActorLogging
+import akka.actor.Props
+import org.bigbluebutton.core.api._
+import org.bigbluebutton.common.messages.MessagingConstants
+import org.bigbluebutton.core.pubsub.senders.ChatMessageToJsonConverter
+import org.bigbluebutton.common.messages.StartRecordingVoiceConfRequestMessage
+import org.bigbluebutton.common.messages.StopRecordingVoiceConfRequestMessage
+import org.bigbluebutton.core.pubsub.senders.MeetingMessageToJsonConverter
+import org.bigbluebutton.core.pubsub.senders.PesentationMessageToJsonConverter
+import org.bigbluebutton.common.messages.GetPresentationInfoReplyMessage
+import org.bigbluebutton.common.messages.PresentationRemovedMessage
+import org.bigbluebutton.core.apps.Page
+import collection.JavaConverters._
+import scala.collection.JavaConversions._
+import org.bigbluebutton.core.apps.SimplePollResultOutVO
+import org.bigbluebutton.core.apps.SimplePollOutVO
+import org.bigbluebutton.core.pubsub.senders.UsersMessageToJsonConverter
+import org.bigbluebutton.common.messages.GetUsersFromVoiceConfRequestMessage
+import org.bigbluebutton.common.messages.MuteUserInVoiceConfRequestMessage
+import org.bigbluebutton.common.messages.EjectUserFromVoiceConfRequestMessage
+import org.bigbluebutton.common.messages.GetCurrentLayoutReplyMessage
+import org.bigbluebutton.common.messages.BroadcastLayoutMessage
+import org.bigbluebutton.common.messages.LockLayoutMessage
+import org.bigbluebutton.core.pubsub.senders.WhiteboardMessageToJsonConverter
+
+object MessageSenderActor {
+  def props(meetingId: String, msgSender: MessageSender): Props =
+    Props(classOf[MessageSenderActor], meetingId, msgSender)
+}
+
+class MessageSenderActor(val meetingId: String, val service: MessageSender)
+    extends Actor with ActorLogging {
+
+  def receive = {
+    case msg: GetChatHistoryReply => handleGetChatHistoryReply(msg)
+    case msg: SendPublicMessageEvent => handleSendPublicMessageEvent(msg)
+    case msg: SendPrivateMessageEvent => handleSendPrivateMessageEvent(msg)
+    case msg: MeetingCreated => handleMeetingCreated(msg)
+    case msg: VoiceRecordingStarted => handleVoiceRecordingStarted(msg)
+    case msg: VoiceRecordingStopped => handleVoiceRecordingStopped(msg)
+    case msg: RecordingStatusChanged => handleRecordingStatusChanged(msg)
+    case msg: GetRecordingStatusReply => handleGetRecordingStatusReply(msg)
+    case msg: MeetingEnded => handleMeetingEnded(msg)
+    case msg: MeetingHasEnded => handleMeetingHasEnded(msg)
+    case msg: MeetingDestroyed => handleMeetingDestroyed(msg)
+    case msg: KeepAliveMessageReply => handleKeepAliveMessageReply(msg)
+    case msg: StartRecording => handleStartRecording(msg)
+    case msg: StopRecording => handleStopRecording(msg)
+    case msg: GetAllMeetingsReply => handleGetAllMeetingsReply(msg)
+    case msg: StartRecordingVoiceConf => handleStartRecordingVoiceConf(msg)
+    case msg: StopRecordingVoiceConf => handleStopRecordingVoiceConf(msg)
+    case msg: ClearPresentationOutMsg => handleClearPresentationOutMsg(msg)
+    case msg: RemovePresentationOutMsg => handleRemovePresentationOutMsg(msg)
+    case msg: GetPresentationInfoOutMsg => handleGetPresentationInfoOutMsg(msg)
+    case msg: SendCursorUpdateOutMsg => handleSendCursorUpdateOutMsg(msg)
+    case msg: ResizeAndMoveSlideOutMsg => handleResizeAndMoveSlideOutMsg(msg)
+    case msg: GotoSlideOutMsg => handleGotoSlideOutMsg(msg)
+    case msg: SharePresentationOutMsg => handleSharePresentationOutMsg(msg)
+    case msg: GetSlideInfoOutMsg => handleGetSlideInfoOutMsg(msg)
+    case msg: PresentationConversionProgress => handlePresentationConversionProgress(msg)
+    case msg: PresentationConversionError => handlePresentationConversionError(msg)
+    case msg: PresentationPageGenerated => handlePresentationPageGenerated(msg)
+    case msg: PresentationConversionDone => handlePresentationConversionDone(msg)
+    case msg: PollStartedMessage => handlePollStartedMessage(msg)
+    case msg: PollStoppedMessage => handlePollStoppedMessage(msg)
+    case msg: PollShowResultMessage => handlePollShowResultMessage(msg)
+    case msg: PollHideResultMessage => handlePollHideResultMessage(msg)
+    case msg: UserRespondedToPollMessage => handleUserRespondedToPollMessage(msg)
+    case msg: MeetingMuted => handleMeetingMuted(msg)
+    case msg: MeetingState => handleMeetingState(msg)
+    case msg: DisconnectAllUsers => handleDisconnectAllUsers(msg)
+    case msg: DisconnectUser => handleDisconnectUser(msg)
+    case msg: PermissionsSettingInitialized => handlePermissionsSettingInitialized(msg)
+    case msg: NewPermissionsSetting => handleNewPermissionsSetting(msg)
+    case msg: UserLocked => handleUserLocked(msg)
+    case msg: GetPermissionsSettingReply => handleGetPermissionsSettingReply(msg)
+    case msg: UserRegistered => handleUserRegistered(msg)
+    case msg: UserLeft => handleUserLeft(msg)
+    case msg: PresenterAssigned => handlePresenterAssigned(msg)
+    case msg: EndAndKickAll => handleEndAndKickAll(msg)
+    case msg: GetUsersReply => handleGetUsersReply(msg)
+    case msg: ValidateAuthTokenReply => handleValidateAuthTokenReply(msg)
+    case msg: ValidateAuthTokenTimedOut => handleValidateAuthTokenTimedOut(msg)
+    case msg: UserJoined => handleUserJoined(msg)
+    case msg: UserRaisedHand => handleUserRaisedHand(msg)
+    case msg: UserLoweredHand => handleUserLoweredHand(msg)
+    case msg: UserSharedWebcam => handleUserSharedWebcam(msg)
+    case msg: UserUnsharedWebcam => handleUserUnsharedWebcam(msg)
+    case msg: UserStatusChange => handleUserStatusChange(msg)
+    case msg: UserVoiceMuted => handleUserVoiceMuted(msg)
+    case msg: UserVoiceTalking => handleUserVoiceTalking(msg)
+    case msg: MuteVoiceUser => handleMuteVoiceUser(msg)
+    case msg: EjectVoiceUser => handleEjectVoiceUser(msg)
+    case msg: GetUsersInVoiceConference => handleGetUsersFromVoiceConference(msg)
+    case msg: UserJoinedVoice => handleUserJoinedVoice(msg)
+    case msg: UserLeftVoice => handleUserLeftVoice(msg)
+    case msg: IsMeetingMutedReply => handleIsMeetingMutedReply(msg)
+    case msg: UserListeningOnly => handleUserListeningOnly(msg)
+    case msg: GetCurrentLayoutReply => handleGetCurrentLayoutReply(msg)
+    case msg: BroadcastLayoutEvent => handleBroadcastLayoutEvent(msg)
+    case msg: LockLayoutEvent => handleLockLayoutEvent(msg)
+    case msg: GetWhiteboardShapesReply => handleGetWhiteboardShapesReply(msg)
+    case msg: SendWhiteboardAnnotationEvent => handleSendWhiteboardAnnotationEvent(msg)
+    case msg: ClearWhiteboardEvent => handleClearWhiteboardEvent(msg)
+    case msg: UndoWhiteboardEvent => handleUndoWhiteboardEvent(msg)
+    case msg: WhiteboardEnabledEvent => handleWhiteboardEnabledEvent(msg)
+    case msg: IsWhiteboardEnabledReply => handleIsWhiteboardEnabledReply(msg)
+    case _ => // do nothing
+  }
+
+  private def handleGetChatHistoryReply(msg: GetChatHistoryReply) {
+    val json = ChatMessageToJsonConverter.getChatHistoryReplyToJson(msg)
+    service.send(MessagingConstants.FROM_CHAT_CHANNEL, json)
+  }
+
+  private def handleSendPublicMessageEvent(msg: SendPublicMessageEvent) {
+    val json = ChatMessageToJsonConverter.sendPublicMessageEventToJson(msg)
+    service.send(MessagingConstants.FROM_CHAT_CHANNEL, json)
+  }
+
+  private def handleSendPrivateMessageEvent(msg: SendPrivateMessageEvent) {
+    val json = ChatMessageToJsonConverter.sendPrivateMessageEventToJson(msg)
+    service.send(MessagingConstants.FROM_CHAT_CHANNEL, json)
+  }
+
+  private def handleStartRecordingVoiceConf(msg: StartRecordingVoiceConf) {
+    val m = new StartRecordingVoiceConfRequestMessage(msg.meetingID, msg.voiceConfId)
+    service.send(MessagingConstants.TO_VOICE_CONF_SYSTEM_CHAN, m.toJson())
+  }
+
+  private def handleStopRecordingVoiceConf(msg: StopRecordingVoiceConf) {
+    val m = new StopRecordingVoiceConfRequestMessage(msg.meetingID, msg.voiceConfId, msg.recordedStream)
+    service.send(MessagingConstants.TO_VOICE_CONF_SYSTEM_CHAN, m.toJson())
+  }
+
+  private def handleMeetingDestroyed(msg: MeetingDestroyed) {
+    val json = MeetingMessageToJsonConverter.meetingDestroyedToJson(msg)
+    service.send(MessagingConstants.FROM_MEETING_CHANNEL, json)
+  }
+
+  private def handleKeepAliveMessageReply(msg: KeepAliveMessageReply) {
+    val json = MeetingMessageToJsonConverter.keepAliveMessageReplyToJson(msg)
+    service.send(MessagingConstants.FROM_SYSTEM_CHANNEL, json)
+  }
+
+  private def handleMeetingCreated(msg: MeetingCreated) {
+    val json = MeetingMessageToJsonConverter.meetingCreatedToJson(msg)
+    service.send(MessagingConstants.FROM_MEETING_CHANNEL, json)
+  }
+
+  private def handleMeetingEnded(msg: MeetingEnded) {
+    val json = MeetingMessageToJsonConverter.meetingEndedToJson(msg)
+    service.send(MessagingConstants.FROM_MEETING_CHANNEL, json)
+
+    val json2 = UsersMessageToJsonConverter.meetingEnded(msg)
+    service.send(MessagingConstants.FROM_MEETING_CHANNEL, json2)
+  }
+
+  private def handleStartRecording(msg: StartRecording) {
+    val json = MeetingMessageToJsonConverter.startRecordingToJson(msg)
+    service.send(MessagingConstants.FROM_MEETING_CHANNEL, json)
+  }
+
+  private def handleStopRecording(msg: StopRecording) {
+    val json = MeetingMessageToJsonConverter.stopRecordingToJson(msg)
+    service.send(MessagingConstants.FROM_MEETING_CHANNEL, json)
+  }
+
+  private def handleVoiceRecordingStarted(msg: VoiceRecordingStarted) {
+    val json = MeetingMessageToJsonConverter.voiceRecordingStartedToJson(msg)
+    service.send(MessagingConstants.FROM_MEETING_CHANNEL, json)
+  }
+
+  private def handleVoiceRecordingStopped(msg: VoiceRecordingStopped) {
+    val json = MeetingMessageToJsonConverter.voiceRecordingStoppedToJson(msg)
+    service.send(MessagingConstants.FROM_MEETING_CHANNEL, json)
+  }
+
+  private def handleRecordingStatusChanged(msg: RecordingStatusChanged) {
+    val json = MeetingMessageToJsonConverter.recordingStatusChangedToJson(msg)
+    service.send(MessagingConstants.FROM_MEETING_CHANNEL, json)
+
+    val json2 = UsersMessageToJsonConverter.recordingStatusChangedToJson(msg)
+    service.send(MessagingConstants.FROM_USERS_CHANNEL, json2)
+  }
+
+  private def handleGetRecordingStatusReply(msg: GetRecordingStatusReply) {
+    val json = MeetingMessageToJsonConverter.getRecordingStatusReplyToJson(msg)
+    service.send(MessagingConstants.FROM_MEETING_CHANNEL, json)
+
+    val json2 = UsersMessageToJsonConverter.getRecordingStatusReplyToJson(msg)
+    service.send(MessagingConstants.FROM_USERS_CHANNEL, json2)
+  }
+
+  private def handleMeetingHasEnded(msg: MeetingHasEnded) {
+    val json = MeetingMessageToJsonConverter.meetingHasEndedToJson(msg)
+    service.send(MessagingConstants.FROM_MEETING_CHANNEL, json)
+
+    val json2 = UsersMessageToJsonConverter.meetingHasEnded(msg)
+    service.send(MessagingConstants.FROM_MEETING_CHANNEL, json2)
+  }
+
+  private def handleGetAllMeetingsReply(msg: GetAllMeetingsReply) {
+    val json = MeetingMessageToJsonConverter.getAllMeetingsReplyToJson(msg)
+    service.send(MessagingConstants.FROM_MEETING_CHANNEL, json)
+  }
+
+  private def pageToMap(page: Page): java.util.Map[String, Any] = {
+    val res = new scala.collection.mutable.HashMap[String, Any]
+    res += "id" -> page.id
+    res += "num" -> page.num
+    res += "thumb_uri" -> page.thumbUri
+    res += "swf_uri" -> page.swfUri
+    res += "txt_uri" -> page.txtUri
+    res += "png_uri" -> page.pngUri
+    res += "current" -> page.current
+    res += "x_offset" -> page.xOffset
+    res += "y_offset" -> page.yOffset
+    res += "width_ratio" -> page.widthRatio
+    res += "height_ratio" -> page.heightRatio
+
+    mapAsJavaMap(res)
+  }
+
+  private def handleClearPresentationOutMsg(msg: ClearPresentationOutMsg) {
+    val json = PesentationMessageToJsonConverter.clearPresentationOutMsgToJson(msg)
+    service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json)
+  }
+
+  private def handleRemovePresentationOutMsg(msg: RemovePresentationOutMsg) {
+    val m = new PresentationRemovedMessage(msg.meetingID, msg.presentationID)
+    service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, m.toJson())
+  }
+
+  private def handleGetPresentationInfoOutMsg(msg: GetPresentationInfoOutMsg) {
+    // Create a map for our current presenter
+    val presenter = new java.util.HashMap[String, Object]()
+    presenter.put(Constants.USER_ID, msg.info.presenter.userId)
+    presenter.put(Constants.NAME, msg.info.presenter.name)
+    presenter.put(Constants.ASSIGNED_BY, msg.info.presenter.assignedBy)
+
+    // Create an array for our presentations
+    val presentations = new java.util.ArrayList[java.util.Map[String, Object]]
+    msg.info.presentations.foreach { pres =>
+      val presentation = new java.util.HashMap[String, Object]()
+      presentation.put(Constants.ID, pres.id)
+      presentation.put(Constants.NAME, pres.name)
+      presentation.put(Constants.CURRENT, pres.current: java.lang.Boolean)
+
+      // Get the pages for a presentation
+      val pages = new java.util.ArrayList[java.util.Map[String, Any]]()
+      pres.pages.values foreach { p =>
+        pages.add(pageToMap(p))
+      }
+      // store the pages in the presentation 
+      presentation.put(Constants.PAGES, pages)
+
+      // add this presentation into our presentations list
+      presentations.add(presentation);
+    }
+
+    val reply = new GetPresentationInfoReplyMessage(msg.meetingID, msg.requesterID, presenter, presentations)
+
+    val json = PesentationMessageToJsonConverter.getPresentationInfoOutMsgToJson(msg)
+    service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json)
+  }
+
+  private def handleSendCursorUpdateOutMsg(msg: SendCursorUpdateOutMsg) {
+    val json = PesentationMessageToJsonConverter.sendCursorUpdateOutMsgToJson(msg)
+    service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json)
+  }
+
+  private def handleResizeAndMoveSlideOutMsg(msg: ResizeAndMoveSlideOutMsg) {
+    val json = PesentationMessageToJsonConverter.resizeAndMoveSlideOutMsgToJson(msg)
+    service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json)
+  }
+
+  private def handleGotoSlideOutMsg(msg: GotoSlideOutMsg) {
+    val json = PesentationMessageToJsonConverter.gotoSlideOutMsgToJson(msg)
+    service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json)
+  }
+
+  private def handleSharePresentationOutMsg(msg: SharePresentationOutMsg) {
+    val json = PesentationMessageToJsonConverter.sharePresentationOutMsgToJson(msg)
+    service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json)
+  }
+
+  private def handleGetSlideInfoOutMsg(msg: GetSlideInfoOutMsg) {
+    val json = PesentationMessageToJsonConverter.getSlideInfoOutMsgToJson(msg)
+    service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json)
+  }
+
+  private def handleGetPreuploadedPresentationsOutMsg(msg: GetPreuploadedPresentationsOutMsg) {
+    val json = PesentationMessageToJsonConverter.getPreuploadedPresentationsOutMsgToJson(msg)
+    service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json)
+  }
+
+  private def handlePresentationConversionProgress(msg: PresentationConversionProgress) {
+    val json = PesentationMessageToJsonConverter.presentationConversionProgressToJson(msg)
+    service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json)
+  }
+
+  private def handlePresentationConversionError(msg: PresentationConversionError) {
+    val json = PesentationMessageToJsonConverter.presentationConversionErrorToJson(msg)
+    service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json)
+  }
+
+  private def handlePresentationPageGenerated(msg: PresentationPageGenerated) {
+    val json = PesentationMessageToJsonConverter.presentationPageGenerated(msg)
+    service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json)
+  }
+
+  private def handlePresentationConversionDone(msg: PresentationConversionDone) {
+    val json = PesentationMessageToJsonConverter.presentationConversionDoneToJson(msg)
+    service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json)
+  }
+
+  private def handlePresentationChanged(msg: PresentationChanged) {
+    val json = PesentationMessageToJsonConverter.presentationChangedToJson(msg)
+    service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json)
+  }
+
+  private def handleGetPresentationStatusReply(msg: GetPresentationStatusReply) {
+    val json = PesentationMessageToJsonConverter.getPresentationStatusReplyToJson(msg)
+    service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json)
+  }
+
+  private def handlePresentationRemoved(msg: PresentationRemoved) {
+    val json = PesentationMessageToJsonConverter.presentationRemovedToJson(msg)
+    service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json)
+  }
+
+  private def handlePageChanged(msg: PageChanged) {
+    val json = PesentationMessageToJsonConverter.pageChangedToJson(msg)
+    service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json)
+  }
+
+  private def handlePollStartedMessage(msg: PollStartedMessage) {
+    val json = pollStartedMessageToJson(msg)
+    service.send(MessagingConstants.FROM_POLLING_CHANNEL, json)
+  }
+
+  private def handlePollStoppedMessage(msg: PollStoppedMessage) {
+    val json = pollStoppedMessageToJson(msg)
+    service.send(MessagingConstants.FROM_POLLING_CHANNEL, json)
+  }
+
+  private def handlePollShowResultMessage(msg: PollShowResultMessage) {
+    val json = pollShowResultMessageToJson(msg)
+    service.send(MessagingConstants.FROM_POLLING_CHANNEL, json)
+  }
+
+  private def handlePollHideResultMessage(msg: PollHideResultMessage) {
+    val json = pollHideResultMessageToJson(msg)
+    service.send(MessagingConstants.FROM_POLLING_CHANNEL, json)
+  }
+
+  private def handleUserRespondedToPollMessage(msg: UserRespondedToPollMessage) {
+    val json = UserRespondedToPollMessageTpJson(msg)
+    service.send(MessagingConstants.FROM_POLLING_CHANNEL, json)
+  }
+
+  private def pollVOtoMap(msg: SimplePollOutVO): java.util.HashMap[String, Object] = {
+    val pollVO = new java.util.HashMap[String, Object]()
+    pollVO.put("id", msg.id)
+
+    val answers = new java.util.ArrayList[java.util.Map[String, Any]];
+    msg.answers.foreach(ans => {
+      val amap = new java.util.HashMap[String, Any]()
+      amap.put("id", ans.id)
+      amap.put("key", ans.key)
+      answers.add(amap)
+    })
+
+    pollVO.put("answers", answers)
+
+    pollVO
+  }
+
+  private def pollStartedMessageToJson(msg: PollStartedMessage): String = {
+    val pollVO = pollVOtoMap(msg.poll)
+    val psm = new org.bigbluebutton.common.messages.PollStartedMessage(msg.meetingID, msg.requesterId, pollVO)
+    psm.toJson
+  }
+
+  private def pollStoppedMessageToJson(msg: PollStoppedMessage): String = {
+    val psm = new org.bigbluebutton.common.messages.PollStoppedMessage(msg.meetingID, msg.requesterId, msg.pollId)
+    psm.toJson
+  }
+
+  private def pollResultVOtoMap(msg: SimplePollResultOutVO): java.util.HashMap[String, Object] = {
+    val pollVO = new java.util.HashMap[String, Object]()
+    pollVO.put("id", msg.id)
+
+    val answers = new java.util.ArrayList[java.util.Map[String, Any]];
+    msg.answers.foreach(ans => {
+      val amap = new java.util.HashMap[String, Any]()
+      amap.put("id", ans.id)
+      amap.put("key", ans.key)
+      amap.put("num_votes", ans.numVotes)
+      answers.add(amap)
+    })
+
+    pollVO.put("answers", answers)
+
+    pollVO
+  }
+
+  private def pollShowResultMessageToJson(msg: PollShowResultMessage): String = {
+    val pollResultVO = pollResultVOtoMap(msg.poll)
+
+    val psm = new org.bigbluebutton.common.messages.PollShowResultMessage(msg.meetingID, pollResultVO)
+    psm.toJson
+  }
+
+  private def pollHideResultMessageToJson(msg: PollHideResultMessage): String = {
+    val psm = new org.bigbluebutton.common.messages.PollHideResultMessage(msg.meetingID, msg.pollId)
+    psm.toJson
+  }
+
+  private def UserRespondedToPollMessageTpJson(msg: UserRespondedToPollMessage): String = {
+    val pollResultVO = pollResultVOtoMap(msg.poll)
+    val psm = new org.bigbluebutton.common.messages.UserVotedPollMessage(msg.meetingID, msg.presenterId, pollResultVO)
+    psm.toJson
+  }
+
+  private def handleLockLayoutEvent(msg: LockLayoutEvent) {
+    val users = new java.util.ArrayList[String];
+    msg.applyTo.foreach(uvo => {
+      users.add(uvo.userID)
+    })
+
+    val evt = new LockLayoutMessage(msg.meetingID, msg.setById, msg.locked, users)
+    service.send(MessagingConstants.FROM_USERS_CHANNEL, evt.toJson())
+  }
+
+  private def handleBroadcastLayoutEvent(msg: BroadcastLayoutEvent) {
+    val users = new java.util.ArrayList[String];
+    msg.applyTo.foreach(uvo => {
+      users.add(uvo.userID)
+    })
+
+    val evt = new BroadcastLayoutMessage(msg.meetingID, msg.setByUserID, msg.layoutID, msg.locked, users)
+    service.send(MessagingConstants.FROM_USERS_CHANNEL, evt.toJson())
+  }
+
+  private def handleGetCurrentLayoutReply(msg: GetCurrentLayoutReply) {
+    val reply = new GetCurrentLayoutReplyMessage(msg.meetingID, msg.requesterID, msg.setByUserID, msg.layoutID, msg.locked)
+    service.send(MessagingConstants.FROM_USERS_CHANNEL, reply.toJson())
+  }
+
+  private def handleMeetingState(msg: MeetingState) {
+    val json = UsersMessageToJsonConverter.meetingState(msg)
+    service.send(MessagingConstants.FROM_MEETING_CHANNEL, json)
+  }
+
+  private def handleMeetingMuted(msg: MeetingMuted) {
+    val json = UsersMessageToJsonConverter.meetingMuted(msg)
+    service.send(MessagingConstants.FROM_MEETING_CHANNEL, json)
+  }
+
+  private def handleDisconnectAllUsers(msg: DisconnectAllUsers) {
+    val json = UsersMessageToJsonConverter.disconnectAllUsersToJson(msg)
+    service.send(MessagingConstants.FROM_MEETING_CHANNEL, json)
+  }
+
+  private def handleDisconnectUser(msg: DisconnectUser) {
+    val json = UsersMessageToJsonConverter.disconnectUserToJson(msg)
+    service.send(MessagingConstants.FROM_MEETING_CHANNEL, json)
+  }
+
+  private def handlePermissionsSettingInitialized(msg: PermissionsSettingInitialized) {
+    val json = UsersMessageToJsonConverter.permissionsSettingInitializedToJson(msg)
+    service.send(MessagingConstants.FROM_MEETING_CHANNEL, json)
+  }
+
+  private def handleNewPermissionsSetting(msg: NewPermissionsSetting) {
+    val json = UsersMessageToJsonConverter.newPermissionsSettingToJson(msg)
+    service.send(MessagingConstants.FROM_MEETING_CHANNEL, json)
+  }
+
+  private def handleUserLocked(msg: UserLocked) {
+    val json = UsersMessageToJsonConverter.userLockedToJson(msg)
+    service.send(MessagingConstants.FROM_MEETING_CHANNEL, json)
+  }
+
+  private def handleGetPermissionsSettingReply(msg: GetPermissionsSettingReply) {
+    val json = UsersMessageToJsonConverter.getPermissionsSettingReplyToJson(msg)
+    service.send(MessagingConstants.FROM_MEETING_CHANNEL, json)
+  }
+
+  private def handleUserRegistered(msg: UserRegistered) {
+    val json = UsersMessageToJsonConverter.userRegisteredToJson(msg)
+    service.send(MessagingConstants.FROM_MEETING_CHANNEL, json)
+  }
+
+  private def handleUserStatusChange(msg: UserStatusChange) {
+    val json = UsersMessageToJsonConverter.userStatusChangeToJson(msg)
+    service.send(MessagingConstants.FROM_USERS_CHANNEL, json)
+  }
+
+  private def handleUserRaisedHand(msg: UserRaisedHand) {
+    val json = UsersMessageToJsonConverter.userRaisedHandToJson(msg)
+    service.send(MessagingConstants.FROM_USERS_CHANNEL, json)
+  }
+
+  private def handleUserLoweredHand(msg: UserLoweredHand) {
+    val json = UsersMessageToJsonConverter.userLoweredHandToJson(msg)
+    service.send(MessagingConstants.FROM_USERS_CHANNEL, json)
+  }
+
+  private def handleUserSharedWebcam(msg: UserSharedWebcam) {
+    val json = UsersMessageToJsonConverter.userSharedWebcamToJson(msg)
+    service.send(MessagingConstants.FROM_USERS_CHANNEL, json)
+  }
+
+  private def handleUserUnsharedWebcam(msg: UserUnsharedWebcam) {
+    val json = UsersMessageToJsonConverter.userUnsharedWebcamToJson(msg)
+    service.send(MessagingConstants.FROM_USERS_CHANNEL, json)
+  }
+
+  private def handleGetUsersReply(msg: GetUsersReply) {
+    val json = UsersMessageToJsonConverter.getUsersReplyToJson(msg)
+    service.send(MessagingConstants.FROM_USERS_CHANNEL, json)
+  }
+
+  private def handleUserJoinedVoice(msg: UserJoinedVoice) {
+    val json = UsersMessageToJsonConverter.userJoinedVoice(msg)
+    service.send(MessagingConstants.FROM_USERS_CHANNEL, json)
+  }
+
+  private def handleUserVoiceMuted(msg: UserVoiceMuted) {
+    val json = UsersMessageToJsonConverter.userVoiceMuted(msg)
+    service.send(MessagingConstants.FROM_USERS_CHANNEL, json)
+  }
+
+  private def handleUserVoiceTalking(msg: UserVoiceTalking) {
+    val json = UsersMessageToJsonConverter.userVoiceTalking(msg)
+    service.send(MessagingConstants.FROM_USERS_CHANNEL, json)
+  }
+
+  private def handleMuteVoiceUser(msg: MuteVoiceUser) {
+    val m = new MuteUserInVoiceConfRequestMessage(msg.meetingID, msg.voiceConfId, msg.voiceUserId, msg.mute)
+    service.send(MessagingConstants.TO_VOICE_CONF_SYSTEM_CHAN, m.toJson())
+  }
+
+  private def handleGetUsersFromVoiceConference(msg: GetUsersInVoiceConference) {
+    val m = new GetUsersFromVoiceConfRequestMessage(msg.meetingID, msg.voiceConfId)
+    service.send(MessagingConstants.TO_VOICE_CONF_SYSTEM_CHAN, m.toJson())
+  }
+
+  private def handleEjectVoiceUser(msg: EjectVoiceUser) {
+    val m = new EjectUserFromVoiceConfRequestMessage(msg.meetingID, msg.voiceConfId, msg.voiceUserId)
+    service.send(MessagingConstants.TO_VOICE_CONF_SYSTEM_CHAN, m.toJson())
+
+  }
+
+  private def handleUserLeftVoice(msg: UserLeftVoice) {
+    val json = UsersMessageToJsonConverter.userLeftVoiceToJson(msg)
+    service.send(MessagingConstants.FROM_USERS_CHANNEL, json)
+  }
+
+  private def handleIsMeetingMutedReply(msg: IsMeetingMutedReply) {
+    val json = UsersMessageToJsonConverter.isMeetingMutedReplyToJson(msg)
+    service.send(MessagingConstants.FROM_USERS_CHANNEL, json)
+  }
+
+  private def handleValidateAuthTokenReply(msg: ValidateAuthTokenReply) {
+    val json = UsersMessageToJsonConverter.validateAuthTokenReplyToJson(msg)
+    println("************** Publishing [" + json + "] *******************")
+    service.send(MessagingConstants.FROM_USERS_CHANNEL, json)
+  }
+
+  private def handleValidateAuthTokenTimedOut(msg: ValidateAuthTokenTimedOut) {
+    val json = UsersMessageToJsonConverter.validateAuthTokenTimeoutToJson(msg)
+    println("************** Publishing [" + json + "] *******************")
+    service.send(MessagingConstants.FROM_USERS_CHANNEL, json)
+  }
+
+  private def handleUserJoined(msg: UserJoined) {
+    val json = UsersMessageToJsonConverter.userJoinedToJson(msg)
+    service.send(MessagingConstants.FROM_USERS_CHANNEL, json)
+  }
+
+  private def handleRegisteredUser(msg: UserRegistered) {
+    val json = UsersMessageToJsonConverter.userRegisteredToJson(msg)
+    service.send(MessagingConstants.FROM_USERS_CHANNEL, json)
+  }
+
+  private def handleUserLeft(msg: UserLeft) {
+    val json = UsersMessageToJsonConverter.userLeftToJson(msg)
+    service.send(MessagingConstants.FROM_USERS_CHANNEL, json)
+  }
+
+  private def handlePresenterAssigned(msg: PresenterAssigned) {
+    val json = UsersMessageToJsonConverter.presenterAssignedToJson(msg)
+    service.send(MessagingConstants.FROM_USERS_CHANNEL, json)
+  }
+
+  private def handleEndAndKickAll(msg: EndAndKickAll) {
+    val json = UsersMessageToJsonConverter.endAndKickAllToJson(msg)
+    service.send(MessagingConstants.FROM_USERS_CHANNEL, json)
+  }
+
+  private def handleUserListeningOnly(msg: UserListeningOnly) {
+    val json = UsersMessageToJsonConverter.userListeningOnlyToJson(msg)
+    service.send(MessagingConstants.FROM_USERS_CHANNEL, json)
+  }
+
+  private def handleGetWhiteboardShapesReply(msg: GetWhiteboardShapesReply) {
+    val json = WhiteboardMessageToJsonConverter.getWhiteboardShapesReplyToJson(msg)
+    service.send(MessagingConstants.FROM_WHITEBOARD_CHANNEL, json)
+  }
+
+  private def handleSendWhiteboardAnnotationEvent(msg: SendWhiteboardAnnotationEvent) {
+    val json = WhiteboardMessageToJsonConverter.sendWhiteboardAnnotationEventToJson(msg)
+    service.send(MessagingConstants.FROM_WHITEBOARD_CHANNEL, json)
+  }
+
+  private def handleClearWhiteboardEvent(msg: ClearWhiteboardEvent) {
+    val json = WhiteboardMessageToJsonConverter.clearWhiteboardEventToJson(msg)
+    service.send(MessagingConstants.FROM_WHITEBOARD_CHANNEL, json)
+  }
+
+  private def handleUndoWhiteboardEvent(msg: UndoWhiteboardEvent) {
+    val json = WhiteboardMessageToJsonConverter.undoWhiteboardEventToJson(msg)
+    service.send(MessagingConstants.FROM_WHITEBOARD_CHANNEL, json)
+  }
+
+  private def handleWhiteboardEnabledEvent(msg: WhiteboardEnabledEvent) {
+    val json = WhiteboardMessageToJsonConverter.whiteboardEnabledEventToJson(msg)
+    service.send(MessagingConstants.FROM_WHITEBOARD_CHANNEL, json)
+  }
+
+  private def handleIsWhiteboardEnabledReply(msg: IsWhiteboardEnabledReply) {
+    val json = WhiteboardMessageToJsonConverter.isWhiteboardEnabledReplyToJson(msg)
+    service.send(MessagingConstants.FROM_WHITEBOARD_CHANNEL, json)
+  }
+}
\ No newline at end of file
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/OutMessageGateway.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/OutMessageGateway.scala
new file mode 100755
index 0000000000000000000000000000000000000000..9939d1005133ffca72f303235133e9ad52855889
--- /dev/null
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/OutMessageGateway.scala
@@ -0,0 +1,21 @@
+package org.bigbluebutton.core
+
+import akka.actor.ActorRef
+import akka.actor.ActorContext
+import org.bigbluebutton.core.api.MessageOutGateway
+import org.bigbluebutton.core.service.recorder.RecorderApplication
+import org.bigbluebutton.core.api.IOutMessage
+
+object OutMessageGateway {
+  def apply(meetingId: String, recorder: RecorderApplication, sender: MessageSender)(implicit context: ActorContext) =
+    new OutMessageGateway(meetingId, recorder, sender)(context)
+}
+
+class OutMessageGateway(val meetingId: String, val recorder: RecorderApplication, val sender: MessageSender)(implicit val context: ActorContext) {
+
+  private val outGW = context.actorOf(OutMessageGatewayActor.props(meetingId, recorder, sender), meetingId)
+
+  def send(msg: IOutMessage) {
+    outGW forward msg
+  }
+}
\ No newline at end of file
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/OutMessageGatewayActor.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/OutMessageGatewayActor.scala
new file mode 100755
index 0000000000000000000000000000000000000000..693e2d7c3bf4cc70e591bb76f8664c37755e5816
--- /dev/null
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/OutMessageGatewayActor.scala
@@ -0,0 +1,35 @@
+package org.bigbluebutton.core
+
+import akka.actor.Actor
+import akka.actor.ActorRef
+import akka.actor.ActorLogging
+import akka.actor.Props
+import org.bigbluebutton.core.api._
+import java.util.concurrent.TimeUnit
+import org.bigbluebutton.core.util._
+import scala.concurrent.duration._
+import org.bigbluebutton.core.apps.{ PollApp, UsersApp, PresentationApp, LayoutApp, ChatApp, WhiteboardApp }
+import org.bigbluebutton.core.apps.{ ChatModel, LayoutModel, UsersModel, PollModel, WhiteboardModel }
+import org.bigbluebutton.core.apps.PresentationModel
+import org.bigbluebutton.core.service.recorder.RecorderApplication
+
+object OutMessageGatewayActor {
+  def props(meetingId: String, recorder: RecorderApplication, sender: MessageSender): Props =
+    Props(classOf[OutMessageGatewayActor], meetingId, recorder, sender)
+}
+
+class OutMessageGatewayActor(val meetingId: String, val recorder: RecorderApplication, val msgSender: MessageSender)
+    extends Actor with ActorLogging {
+
+  private val recorderActor = context.actorOf(RecorderActor.props(meetingId, recorder), "recorderActor-" + meetingId)
+  private val msgSenderActor = context.actorOf(MessageSenderActor.props(meetingId, msgSender), "senderActor-" + meetingId)
+
+  def receive = {
+    case msg: IOutMessage => {
+      msgSenderActor forward msg
+      recorderActor forward msg
+    }
+    case _ => // do nothing
+  }
+
+}
\ No newline at end of file
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/RecorderActor.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/RecorderActor.scala
new file mode 100755
index 0000000000000000000000000000000000000000..4afaa57e065ffbccf742e61b8bec6f8edab25d7a
--- /dev/null
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/RecorderActor.scala
@@ -0,0 +1,426 @@
+package org.bigbluebutton.core
+
+import akka.actor.Actor
+import akka.actor.ActorRef
+import akka.actor.ActorLogging
+import akka.actor.Props
+import org.bigbluebutton.core.api._
+import org.bigbluebutton.core.api._
+import scala.collection.JavaConversions._
+import org.bigbluebutton.core.service.recorder.RecorderApplication
+import org.bigbluebutton.core.recorders.events.PublicChatRecordEvent
+import org.bigbluebutton.core.recorders.events.ConversionCompletedPresentationRecordEvent
+import org.bigbluebutton.core.recorders.events.GotoSlidePresentationRecordEvent
+import org.bigbluebutton.core.recorders.events.ResizeAndMoveSlidePresentationRecordEvent
+import org.bigbluebutton.core.recorders.events.RemovePresentationPresentationRecordEvent
+import org.bigbluebutton.core.recorders.events.SharePresentationPresentationRecordEvent
+import org.bigbluebutton.core.recorders.events.CursorUpdateRecordEvent
+import org.bigbluebutton.core.recorders.events.AssignPresenterRecordEvent
+import org.bigbluebutton.core.recorders.events.ParticipantStatusChangeRecordEvent
+import org.bigbluebutton.core.recorders.events.ParticipantLeftRecordEvent
+import org.bigbluebutton.core.recorders.events.RecordStatusRecordEvent
+import org.bigbluebutton.core.recorders.events.ParticipantLeftVoiceRecordEvent
+import org.bigbluebutton.core.recorders.events.ParticipantJoinedVoiceRecordEvent
+import org.bigbluebutton.core.recorders.events.ParticipantTalkingVoiceRecordEvent
+import org.bigbluebutton.core.recorders.events.ParticipantMutedVoiceRecordEvent
+import org.bigbluebutton.core.recorders.events.StartRecordingVoiceRecordEvent
+import org.bigbluebutton.core.recorders.events.ParticipantJoinRecordEvent
+import org.bigbluebutton.core.recorders.events.ParticipantEndAndKickAllRecordEvent
+import org.bigbluebutton.core.recorders.events.UndoShapeWhiteboardRecordEvent
+import org.bigbluebutton.core.recorders.events.ClearPageWhiteboardRecordEvent
+import org.bigbluebutton.core.recorders.events.AddShapeWhiteboardRecordEvent
+import org.bigbluebutton.core.service.whiteboard.WhiteboardKeyUtil
+import org.bigbluebutton.core.recorders.events.ModifyTextWhiteboardRecordEvent
+import scala.collection.immutable.StringOps
+
+object RecorderActor {
+  def props(meetingId: String, recorder: RecorderApplication): Props =
+    Props(classOf[RecorderActor], meetingId, recorder)
+}
+
+class RecorderActor(val meetingId: String, val recorder: RecorderApplication)
+    extends Actor with ActorLogging {
+
+  def receive = {
+    case msg: SendPublicMessageEvent => handleSendPublicMessageEvent(msg)
+    case msg: ClearPresentationOutMsg => handleClearPresentationOutMsg(msg)
+    case msg: RemovePresentationOutMsg => handleRemovePresentationOutMsg(msg)
+    case msg: SendCursorUpdateOutMsg => handleSendCursorUpdateOutMsg(msg)
+    case msg: ResizeAndMoveSlideOutMsg => handleResizeAndMoveSlideOutMsg(msg)
+    case msg: GotoSlideOutMsg => handleGotoSlideOutMsg(msg)
+    case msg: SharePresentationOutMsg => handleSharePresentationOutMsg(msg)
+    case msg: EndAndKickAll => handleEndAndKickAll(msg)
+    case msg: PresenterAssigned => handleAssignPresenter(msg)
+    case msg: UserJoined => handleUserJoined(msg)
+    case msg: UserLeft => handleUserLeft(msg)
+    case msg: UserStatusChange => handleUserStatusChange(msg)
+    case msg: UserVoiceMuted => handleUserVoiceMuted(msg)
+    case msg: UserVoiceTalking => handleUserVoiceTalking(msg)
+    case msg: UserJoinedVoice => handleUserJoinedVoice(msg)
+    case msg: UserLeftVoice => handleUserLeftVoice(msg)
+    case msg: RecordingStatusChanged => handleRecordingStatusChanged(msg)
+    case msg: UserRaisedHand => handleUserRaisedHand(msg)
+    case msg: UserLoweredHand => handleUserLoweredHand(msg)
+    case msg: UserSharedWebcam => handleUserSharedWebcam(msg)
+    case msg: UserUnsharedWebcam => handleUserUnsharedWebcam(msg)
+    case msg: VoiceRecordingStarted => handleVoiceRecordingStarted(msg)
+    case msg: VoiceRecordingStopped => handleVoiceRecordingStopped(msg)
+    case msg: SendWhiteboardAnnotationEvent => handleSendWhiteboardAnnotationEvent(msg)
+    case msg: ClearWhiteboardEvent => handleClearWhiteboardEvent(msg)
+    case msg: UndoWhiteboardEvent => handleUndoWhiteboardEvent(msg)
+    case _ => // do nothing
+  }
+
+  private def handleSendPublicMessageEvent(msg: SendPublicMessageEvent) {
+    if (msg.recorded) {
+      val message = mapAsJavaMap(msg.message)
+      val ev = new PublicChatRecordEvent();
+      ev.setTimestamp(TimestampGenerator.generateTimestamp);
+      ev.setMeetingId(msg.meetingID);
+      ev.setSender(message.get("fromUsername"));
+      ev.setMessage(message.get("message"));
+      ev.setColor(message.get("fromColor"));
+      recorder.record(msg.meetingID, ev);
+    }
+  }
+
+  private def handleClearPresentationOutMsg(msg: ClearPresentationOutMsg) {
+
+  }
+
+  private def handlePresentationConversionDone(msg: PresentationConversionDone) {
+    if (msg.recorded) {
+      val event = new ConversionCompletedPresentationRecordEvent();
+      event.setMeetingId(msg.meetingID);
+      event.setTimestamp(TimestampGenerator.generateTimestamp);
+      event.setPresentationName(msg.presentation.id);
+      event.setOriginalFilename(msg.presentation.name);
+      recorder.record(msg.meetingID, event);
+    }
+
+  }
+
+  private def handleGotoSlideOutMsg(msg: GotoSlideOutMsg) {
+    if (msg.recorded) {
+      val event = new GotoSlidePresentationRecordEvent();
+      event.setMeetingId(msg.meetingID);
+      event.setTimestamp(TimestampGenerator.generateTimestamp);
+      event.setSlide(msg.page.num);
+      event.setId(msg.page.id);
+      event.setNum(msg.page.num);
+      event.setThumbUri(msg.page.thumbUri);
+      event.setSwfUri(msg.page.swfUri);
+      event.setTxtUri(msg.page.txtUri);
+      event.setPngUri(msg.page.pngUri);
+      event.setXOffset(msg.page.xOffset);
+      event.setYOffset(msg.page.yOffset);
+      event.setWidthRatio(msg.page.widthRatio);
+      event.setHeightRatio(msg.page.heightRatio);
+      recorder.record(msg.meetingID, event);
+    }
+  }
+
+  private def handleResizeAndMoveSlideOutMsg(msg: ResizeAndMoveSlideOutMsg) {
+    if (msg.recorded) {
+      val event = new ResizeAndMoveSlidePresentationRecordEvent();
+      event.setMeetingId(msg.meetingID);
+      event.setTimestamp(TimestampGenerator.generateTimestamp);
+      event.setId(msg.page.id);
+      event.setNum(msg.page.num);
+      event.setThumbUri(msg.page.thumbUri);
+      event.setSwfUri(msg.page.swfUri);
+      event.setTxtUri(msg.page.txtUri);
+      event.setPngUri(msg.page.pngUri);
+      event.setXOffset(msg.page.xOffset);
+      event.setYOffset(msg.page.yOffset);
+      event.setWidthRatio(msg.page.widthRatio);
+      event.setHeightRatio(msg.page.heightRatio);
+
+      recorder.record(msg.meetingID, event);
+    }
+  }
+
+  private def handleRemovePresentationOutMsg(msg: RemovePresentationOutMsg) {
+    if (msg.recorded) {
+      val event = new RemovePresentationPresentationRecordEvent();
+      event.setMeetingId(msg.meetingID);
+      event.setTimestamp(TimestampGenerator.generateTimestamp);
+      event.setPresentationName(msg.presentationID);
+      recorder.record(msg.meetingID, event);
+    }
+  }
+
+  private def handleSharePresentationOutMsg(msg: SharePresentationOutMsg) {
+    if (msg.recorded) {
+      val event = new SharePresentationPresentationRecordEvent();
+      event.setMeetingId(msg.meetingID);
+      event.setTimestamp(TimestampGenerator.generateTimestamp);
+      event.setPresentationName(msg.presentation.id);
+      event.setOriginalFilename(msg.presentation.name);
+      event.setShare(true);
+      recorder.record(msg.meetingID, event);
+    }
+  }
+
+  private def handleSendCursorUpdateOutMsg(msg: SendCursorUpdateOutMsg) {
+    if (msg.recorded) {
+      val event = new CursorUpdateRecordEvent();
+      event.setMeetingId(msg.meetingID);
+      event.setTimestamp(TimestampGenerator.generateTimestamp);
+      event.setXPercent(msg.xPercent);
+      event.setYPercent(msg.yPercent);
+
+      recorder.record(msg.meetingID, event);
+    }
+  }
+
+  private def handleEndAndKickAll(msg: EndAndKickAll): Unit = {
+    if (msg.recorded) {
+      val ev = new ParticipantEndAndKickAllRecordEvent();
+      ev.setTimestamp(TimestampGenerator.generateTimestamp);
+      ev.setMeetingId(msg.meetingID);
+      recorder.record(msg.meetingID, ev);
+    }
+  }
+
+  private def handleUserJoined(msg: UserJoined): Unit = {
+    if (msg.recorded) {
+      val ev = new ParticipantJoinRecordEvent();
+      ev.setTimestamp(TimestampGenerator.generateTimestamp);
+      ev.setUserId(msg.user.userID);
+      ev.setName(msg.user.name);
+      ev.setMeetingId(msg.meetingID);
+      ev.setRole(msg.user.role.toString());
+
+      recorder.record(msg.meetingID, ev);
+    }
+  }
+
+  def handleVoiceRecordingStarted(msg: VoiceRecordingStarted) {
+    if (msg.recorded) {
+      val evt = new StartRecordingVoiceRecordEvent(true);
+      evt.setMeetingId(msg.meetingID);
+      evt.setTimestamp(TimestampGenerator.generateTimestamp);
+      evt.setBridge(msg.confNum);
+      evt.setRecordingTimestamp(msg.timestamp);
+      evt.setFilename(msg.recordingFile);
+      recorder.record(msg.meetingID, evt);
+    }
+  }
+
+  def handleVoiceRecordingStopped(msg: VoiceRecordingStopped) {
+    if (msg.recorded) {
+      val evt = new StartRecordingVoiceRecordEvent(false);
+      evt.setMeetingId(msg.meetingID);
+      evt.setTimestamp(TimestampGenerator.generateTimestamp);
+      evt.setBridge(msg.confNum);
+      evt.setRecordingTimestamp(msg.timestamp);
+      evt.setFilename(msg.recordingFile);
+      recorder.record(msg.meetingID, evt);
+    }
+  }
+
+  def handleUserVoiceMuted(msg: UserVoiceMuted) {
+    if (msg.recorded) {
+      val ev = new ParticipantMutedVoiceRecordEvent()
+      ev.setMeetingId(msg.meetingID);
+      ev.setTimestamp(TimestampGenerator.generateTimestamp);
+      ev.setBridge(msg.confNum);
+      ev.setParticipant(msg.user.voiceUser.userId);
+      ev.setMuted(msg.user.voiceUser.muted);
+
+      recorder.record(msg.meetingID, ev);
+    }
+  }
+
+  def handleUserVoiceTalking(msg: UserVoiceTalking) {
+    if (msg.recorded) {
+      val evt = new ParticipantTalkingVoiceRecordEvent();
+      evt.setMeetingId(msg.meetingID);
+      evt.setTimestamp(TimestampGenerator.generateTimestamp);
+      evt.setBridge(msg.confNum);
+      evt.setParticipant(msg.user.userID);
+      evt.setTalking(msg.user.voiceUser.talking);
+
+      recorder.record(msg.meetingID, evt);
+    }
+  }
+
+  def handleUserJoinedVoice(msg: UserJoinedVoice) {
+    if (msg.recorded) {
+      val evt = new ParticipantJoinedVoiceRecordEvent();
+      evt.setMeetingId(msg.meetingID);
+      evt.setTimestamp(TimestampGenerator.generateTimestamp);
+      evt.setBridge(msg.confNum);
+      evt.setParticipant(msg.user.voiceUser.userId);
+      evt.setCallerName(msg.user.voiceUser.callerName);
+      evt.setCallerNumber(msg.user.voiceUser.callerNum);
+      evt.setMuted(msg.user.voiceUser.muted);
+      evt.setTalking(msg.user.voiceUser.talking);
+
+      recorder.record(msg.meetingID, evt)
+    }
+  }
+
+  def handleUserLeftVoice(msg: UserLeftVoice) {
+    if (msg.recorded) {
+      val evt = new ParticipantLeftVoiceRecordEvent();
+      evt.setMeetingId(msg.meetingID);
+      evt.setTimestamp(TimestampGenerator.generateTimestamp);
+      evt.setBridge(msg.confNum);
+      evt.setParticipant(msg.user.voiceUser.userId);
+      recorder.record(msg.meetingID, evt);
+    }
+  }
+
+  def handleRecordingStatusChanged(msg: RecordingStatusChanged) {
+    if (msg.recorded) {
+      val evt = new RecordStatusRecordEvent();
+      evt.setMeetingId(msg.meetingID);
+      evt.setTimestamp(TimestampGenerator.generateTimestamp);
+      evt.setUserId(msg.userId);
+      evt.setRecordingStatus(msg.recording.toString);
+
+      recorder.record(msg.meetingID, evt);
+    }
+  }
+
+  private def handleUserLeft(msg: UserLeft): Unit = {
+    if (msg.recorded) {
+      val ev = new ParticipantLeftRecordEvent();
+      ev.setTimestamp(TimestampGenerator.generateTimestamp);
+      ev.setUserId(msg.user.userID);
+      ev.setMeetingId(msg.meetingID);
+
+      recorder.record(msg.meetingID, ev);
+    }
+
+  }
+
+  private def handleUserRaisedHand(msg: UserRaisedHand) {
+    val status = UserStatusChange(msg.meetingID, msg.recorded,
+      msg.userID, "raiseHand", true: java.lang.Boolean)
+    handleUserStatusChange(status)
+  }
+
+  private def handleUserLoweredHand(msg: UserLoweredHand) {
+    val status = UserStatusChange(msg.meetingID, msg.recorded,
+      msg.userID, "raiseHand", false: java.lang.Boolean)
+    handleUserStatusChange(status)
+  }
+
+  private def handleUserSharedWebcam(msg: UserSharedWebcam) {
+    val status = UserStatusChange(msg.meetingID, msg.recorded,
+      msg.userID, "hasStream", "true,stream=" + msg.stream)
+    handleUserStatusChange(status)
+  }
+
+  private def handleUserUnsharedWebcam(msg: UserUnsharedWebcam) {
+    val status = UserStatusChange(msg.meetingID, msg.recorded,
+      msg.userID, "hasStream", "false,stream=" + msg.stream)
+    handleUserStatusChange(status)
+  }
+
+  private def handleUserStatusChange(msg: UserStatusChange): Unit = {
+    if (msg.recorded) {
+      val ev = new ParticipantStatusChangeRecordEvent();
+      ev.setTimestamp(TimestampGenerator.generateTimestamp);
+      ev.setUserId(msg.userID);
+      ev.setMeetingId(msg.meetingID);
+      ev.setStatus(msg.status);
+      ev.setValue(msg.value.toString());
+
+      recorder.record(msg.meetingID, ev);
+    }
+  }
+
+  private def handleAssignPresenter(msg: PresenterAssigned): Unit = {
+    if (msg.recorded) {
+      val event = new AssignPresenterRecordEvent();
+      event.setMeetingId(msg.meetingID);
+      event.setTimestamp(TimestampGenerator.generateTimestamp);
+      event.setUserId(msg.presenter.presenterID);
+      event.setName(msg.presenter.presenterName);
+      event.setAssignedBy(msg.presenter.assignedBy);
+
+      recorder.record(msg.meetingID, event);
+    }
+
+  }
+
+  private def getPresentationId(whiteboardId: String): String = {
+    // Need to split the whiteboard id into presenation id and page num as the old
+    // recording expects them
+    val strId = new StringOps(whiteboardId)
+    val ids = strId.split('/')
+    var presId: String = ""
+    if (ids.length == 2) {
+      presId = ids(0)
+    }
+
+    presId
+  }
+
+  private def getPageNum(whiteboardId: String): String = {
+    val strId = new StringOps(whiteboardId)
+    val ids = strId.split('/')
+    var pageNum = "0"
+    if (ids.length == 2) {
+      pageNum = ids(1)
+    }
+    pageNum
+  }
+
+  private def handleSendWhiteboardAnnotationEvent(msg: SendWhiteboardAnnotationEvent) {
+    if ((msg.shape.shapeType == WhiteboardKeyUtil.TEXT_TYPE) && (msg.shape.status != WhiteboardKeyUtil.TEXT_CREATED_STATUS)) {
+
+      val event = new ModifyTextWhiteboardRecordEvent()
+      event.setMeetingId(msg.meetingID)
+      event.setTimestamp(TimestampGenerator.generateTimestamp)
+      event.setPresentation(getPresentationId(msg.whiteboardId))
+      event.setPageNumber(getPageNum(msg.whiteboardId))
+      event.setWhiteboardId(msg.whiteboardId)
+      event.addAnnotation(mapAsJavaMap(msg.shape.shape))
+      recorder.record(msg.meetingID, event)
+    } else if ((msg.shape.shapeType == WhiteboardKeyUtil.POLL_RESULT_TYPE)) {
+      val event = new AddShapeWhiteboardRecordEvent()
+      event.setMeetingId(msg.meetingID)
+      event.setTimestamp(TimestampGenerator.generateTimestamp)
+      event.setPresentation(getPresentationId(msg.whiteboardId))
+      event.setPageNumber(getPageNum(msg.whiteboardId))
+      event.setWhiteboardId(msg.whiteboardId);
+      event.addAnnotation(mapAsJavaMap(msg.shape.shape))
+      recorder.record(msg.meetingID, event)
+    } else {
+      val event = new AddShapeWhiteboardRecordEvent()
+      event.setMeetingId(msg.meetingID)
+      event.setTimestamp(TimestampGenerator.generateTimestamp)
+      event.setPresentation(getPresentationId(msg.whiteboardId))
+      event.setPageNumber(getPageNum(msg.whiteboardId))
+      event.setWhiteboardId(msg.whiteboardId);
+      event.addAnnotation(mapAsJavaMap(msg.shape.shape))
+      recorder.record(msg.meetingID, event)
+    }
+  }
+
+  private def handleClearWhiteboardEvent(msg: ClearWhiteboardEvent) {
+    val event = new ClearPageWhiteboardRecordEvent()
+    event.setMeetingId(msg.meetingID)
+    event.setTimestamp(TimestampGenerator.generateTimestamp)
+    event.setPresentation(getPresentationId(msg.whiteboardId))
+    event.setPageNumber(getPageNum(msg.whiteboardId))
+    event.setWhiteboardId(msg.whiteboardId)
+    recorder.record(msg.meetingID, event)
+  }
+
+  private def handleUndoWhiteboardEvent(msg: UndoWhiteboardEvent) {
+    val event = new UndoShapeWhiteboardRecordEvent()
+    event.setMeetingId(msg.meetingID)
+    event.setTimestamp(TimestampGenerator.generateTimestamp)
+    event.setPresentation(getPresentationId(msg.whiteboardId))
+    event.setPageNumber(getPageNum(msg.whiteboardId))
+    event.setWhiteboardId(msg.whiteboardId)
+    event.setShapeId(msg.shapeId);
+    recorder.record(msg.meetingID, event)
+  }
+}
\ No newline at end of file
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/RunningMeeting.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/RunningMeeting.scala
index 69073a24f44a2ee512e366a99d2679ef686d5da1..ebcaf8d440a950a59ee519b9b8aa9eec285a6391 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/RunningMeeting.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/RunningMeeting.scala
@@ -5,13 +5,11 @@ import akka.actor.ActorContext
 import org.bigbluebutton.core.api.MessageOutGateway
 
 object RunningMeeting {
-  def apply(mProps: MeetingProperties,
-    outGW: MessageOutGateway)(implicit context: ActorContext) =
+  def apply(mProps: MeetingProperties, outGW: OutMessageGateway)(implicit context: ActorContext) =
     new RunningMeeting(mProps, outGW)(context)
 }
 
-class RunningMeeting(val mProps: MeetingProperties,
-    val outGW: MessageOutGateway)(implicit val context: ActorContext) {
+class RunningMeeting(val mProps: MeetingProperties, val outGW: OutMessageGateway)(implicit val context: ActorContext) {
 
   val actorRef = context.actorOf(MeetingActor.props(mProps, outGW), mProps.meetingID)
 }
\ No newline at end of file
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/ChatApp.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/ChatApp.scala
index e44fcd21b7dd0cef7791535de63fe4d4f3ff125f..235376109f4692e7888b18a1b905483eaf81f151 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/ChatApp.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/ChatApp.scala
@@ -3,11 +3,12 @@ package org.bigbluebutton.core.apps
 import org.bigbluebutton.core.api._
 import scala.collection.mutable.ArrayBuffer
 import org.bigbluebutton.core.MeetingActor
+import org.bigbluebutton.core.OutMessageGateway
 
 trait ChatApp {
   this: MeetingActor =>
 
-  val outGW: MessageOutGateway
+  val outGW: OutMessageGateway
 
   def handleGetChatHistoryRequest(msg: GetChatHistoryRequest) {
     val history = chatModel.getChatHistory()
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/LayoutApp.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/LayoutApp.scala
index 6398bc0e9b24c0057247464434f47dc2ac3fef94..b14d3d7f4567557b0ccc98a22d20973a2632c4d8 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/LayoutApp.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/LayoutApp.scala
@@ -3,11 +3,12 @@ package org.bigbluebutton.core.apps
 import org.bigbluebutton.core.api._
 import org.bigbluebutton.core.MeetingActor
 import scala.collection.mutable.ArrayBuffer
+import org.bigbluebutton.core.OutMessageGateway
 
 trait LayoutApp {
   this: MeetingActor =>
 
-  val outGW: MessageOutGateway
+  val outGW: OutMessageGateway
 
   def handleGetCurrentLayoutRequest(msg: GetCurrentLayoutRequest) {
     outGW.send(new GetCurrentLayoutReply(msg.meetingID, mProps.recorded, msg.requesterID,
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PollApp.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PollApp.scala
index 6843582af7aa8c0f7e650e6b09adbbc1c9463647..a217048dcd2f26fc7a24912b9fa26b3420b0cb2c 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PollApp.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PollApp.scala
@@ -7,11 +7,12 @@ import scala.collection.mutable.ArrayBuffer
 import org.bigbluebutton.core.service.whiteboard.WhiteboardKeyUtil
 import com.google.gson.Gson
 import java.util.ArrayList
+import org.bigbluebutton.core.OutMessageGateway
 
 trait PollApp {
   this: MeetingActor =>
 
-  val outGW: MessageOutGateway
+  val outGW: OutMessageGateway
 
   def handleGetPollRequest(msg: GetPollRequest) {
 
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PresentationApp.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PresentationApp.scala
index baf6f64d62b970d1d19c733446566d2b660cd140..a15ea077d1fec738a27242045fc0f95166dbe333 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PresentationApp.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PresentationApp.scala
@@ -3,11 +3,12 @@ package org.bigbluebutton.core.apps
 import org.bigbluebutton.core.api._
 import org.bigbluebutton.core.MeetingActor
 import com.google.gson.Gson
+import org.bigbluebutton.core.OutMessageGateway
 
 trait PresentationApp {
   this: MeetingActor =>
 
-  val outGW: MessageOutGateway
+  val outGW: OutMessageGateway
 
   private var cursorLocation = new CursorLocation
 
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/UsersApp.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/UsersApp.scala
index cdf6cdb28433e3797734522d002f27e603ce7ff8..f2b7f275b566947868f6fa87a58e2b323fec7b58 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/UsersApp.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/UsersApp.scala
@@ -6,11 +6,12 @@ import java.util.ArrayList
 import org.bigbluebutton.core.MeetingActor
 import scala.collection.mutable.ArrayBuffer
 import scala.collection.immutable.ListSet
+import org.bigbluebutton.core.OutMessageGateway
 
 trait UsersApp {
   this: MeetingActor =>
 
-  val outGW: MessageOutGateway
+  val outGW: OutMessageGateway
 
   def hasUser(userID: String): Boolean = {
     usersModel.hasUser(userID)
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/WhiteboardApp.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/WhiteboardApp.scala
index bf531c41a4fe01b516560723ab1d848785d9c79c..93a8811fc2d9222caa5064469dc89144e6044eb0 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/WhiteboardApp.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/WhiteboardApp.scala
@@ -3,13 +3,14 @@ package org.bigbluebutton.core.apps
 import org.bigbluebutton.core.api._
 import org.bigbluebutton.core.MeetingActor
 import org.bigbluebutton.core.service.whiteboard.WhiteboardKeyUtil
+import org.bigbluebutton.core.OutMessageGateway
 
 case class Whiteboard(id: String, shapes: Seq[AnnotationVO])
 
 trait WhiteboardApp {
   this: MeetingActor =>
 
-  val outGW: MessageOutGateway
+  val outGW: OutMessageGateway
 
   def handleSendWhiteboardAnnotationRequest(msg: SendWhiteboardAnnotationRequest) {
     val status = msg.annotation.status
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/ChatEventRedisPublisher.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/ChatEventRedisPublisher.scala
deleted file mode 100755
index f1ffe8f3113ca3b2f02d1a279f8d43778b20f7cc..0000000000000000000000000000000000000000
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/ChatEventRedisPublisher.scala
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.bigbluebutton.core.pubsub.senders
-
-import org.bigbluebutton.core.api.OutMessageListener2
-import org.bigbluebutton.core.MessageSender
-import org.bigbluebutton.core.api._
-import com.google.gson.Gson
-import scala.collection.mutable.HashMap
-import collection.JavaConverters._
-import scala.collection.JavaConversions._
-import java.util.ArrayList
-import org.bigbluebutton.common.messages.MessagingConstants
-import org.bigbluebutton.core.messaging.Util
-
-class ChatEventRedisPublisher(service: MessageSender) extends OutMessageListener2 {
-  def handleMessage(msg: IOutMessage) {
-    msg match {
-      case msg: GetChatHistoryReply => handleGetChatHistoryReply(msg)
-      case msg: SendPublicMessageEvent => handleSendPublicMessageEvent(msg)
-      case msg: SendPrivateMessageEvent => handleSendPrivateMessageEvent(msg)
-      case _ => // do nothing
-    }
-  }
-
-  private def handleGetChatHistoryReply(msg: GetChatHistoryReply) {
-    val json = ChatMessageToJsonConverter.getChatHistoryReplyToJson(msg)
-    service.send(MessagingConstants.FROM_CHAT_CHANNEL, json)
-  }
-
-  private def handleSendPublicMessageEvent(msg: SendPublicMessageEvent) {
-    val json = ChatMessageToJsonConverter.sendPublicMessageEventToJson(msg)
-    service.send(MessagingConstants.FROM_CHAT_CHANNEL, json)
-  }
-
-  private def handleSendPrivateMessageEvent(msg: SendPrivateMessageEvent) {
-    val json = ChatMessageToJsonConverter.sendPrivateMessageEventToJson(msg)
-    service.send(MessagingConstants.FROM_CHAT_CHANNEL, json)
-  }
-}
\ No newline at end of file
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/MeetingEventRedisPublisher.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/MeetingEventRedisPublisher.scala
deleted file mode 100755
index 2c4ce5c2ee38f7a4e44692ac58cb198588890bfe..0000000000000000000000000000000000000000
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/MeetingEventRedisPublisher.scala
+++ /dev/null
@@ -1,110 +0,0 @@
-package org.bigbluebutton.core.pubsub.senders
-
-import org.bigbluebutton.core.MessageSender
-import org.bigbluebutton.core.api._
-import scala.collection.immutable.HashMap
-import com.google.gson.Gson
-import scala.collection.JavaConverters._
-import org.bigbluebutton.common.messages.MessagingConstants
-import org.bigbluebutton.common.messages.StartRecordingVoiceConfRequestMessage
-import org.bigbluebutton.common.messages.StopRecordingVoiceConfRequestMessage
-
-class MeetingEventRedisPublisher(service: MessageSender) extends OutMessageListener2 {
-
-  private val KEEP_ALIVE_REPLY = "KEEP_ALIVE_REPLY"
-
-  def handleMessage(msg: IOutMessage) {
-    msg match {
-      case msg: MeetingCreated => handleMeetingCreated(msg)
-      case msg: VoiceRecordingStarted => handleVoiceRecordingStarted(msg)
-      case msg: VoiceRecordingStopped => handleVoiceRecordingStopped(msg)
-      case msg: RecordingStatusChanged => handleRecordingStatusChanged(msg)
-      case msg: GetRecordingStatusReply => handleGetRecordingStatusReply(msg)
-      case msg: MeetingEnded => handleMeetingEnded(msg)
-      case msg: MeetingHasEnded => handleMeetingHasEnded(msg)
-      case msg: MeetingDestroyed => handleMeetingDestroyed(msg)
-      case msg: KeepAliveMessageReply => handleKeepAliveMessageReply(msg)
-      case msg: StartRecording => handleStartRecording(msg)
-      case msg: StopRecording => handleStopRecording(msg)
-      case msg: GetAllMeetingsReply => handleGetAllMeetingsReply(msg)
-      case msg: StartRecordingVoiceConf => handleStartRecordingVoiceConf(msg)
-      case msg: StopRecordingVoiceConf => handleStopRecordingVoiceConf(msg)
-      case _ => //println("Unhandled message in MeetingEventRedisPublisher")
-    }
-  }
-
-  private def handleStartRecordingVoiceConf(msg: StartRecordingVoiceConf) {
-    val m = new StartRecordingVoiceConfRequestMessage(msg.meetingID, msg.voiceConfId)
-    System.out.println("*******************\n" + m.toJson())
-    service.send(MessagingConstants.TO_VOICE_CONF_SYSTEM_CHAN, m.toJson())
-  }
-
-  private def handleStopRecordingVoiceConf(msg: StopRecordingVoiceConf) {
-    val m = new StopRecordingVoiceConfRequestMessage(msg.meetingID, msg.voiceConfId, msg.recordedStream)
-    System.out.println("*******************\n" + m.toJson())
-    service.send(MessagingConstants.TO_VOICE_CONF_SYSTEM_CHAN, m.toJson())
-  }
-
-  private def handleMeetingDestroyed(msg: MeetingDestroyed) {
-    val json = MeetingMessageToJsonConverter.meetingDestroyedToJson(msg)
-    //    System.out.println("****\n" + json)
-    service.send(MessagingConstants.FROM_MEETING_CHANNEL, json)
-  }
-
-  private def handleKeepAliveMessageReply(msg: KeepAliveMessageReply) {
-    val json = MeetingMessageToJsonConverter.keepAliveMessageReplyToJson(msg)
-    service.send(MessagingConstants.FROM_SYSTEM_CHANNEL, json)
-  }
-
-  private def handleMeetingCreated(msg: MeetingCreated) {
-    val json = MeetingMessageToJsonConverter.meetingCreatedToJson(msg)
-    //    System.out.println("****\n" + json)
-    service.send(MessagingConstants.FROM_MEETING_CHANNEL, json)
-  }
-
-  private def handleMeetingEnded(msg: MeetingEnded) {
-    val json = MeetingMessageToJsonConverter.meetingEndedToJson(msg)
-    //    System.out.println("****\n" + json)
-    service.send(MessagingConstants.FROM_MEETING_CHANNEL, json)
-  }
-
-  private def handleStartRecording(msg: StartRecording) {
-    val json = MeetingMessageToJsonConverter.startRecordingToJson(msg)
-    service.send(MessagingConstants.FROM_MEETING_CHANNEL, json)
-  }
-
-  private def handleStopRecording(msg: StopRecording) {
-    val json = MeetingMessageToJsonConverter.stopRecordingToJson(msg)
-    service.send(MessagingConstants.FROM_MEETING_CHANNEL, json)
-  }
-
-  private def handleVoiceRecordingStarted(msg: VoiceRecordingStarted) {
-    val json = MeetingMessageToJsonConverter.voiceRecordingStartedToJson(msg)
-    service.send(MessagingConstants.FROM_MEETING_CHANNEL, json)
-  }
-
-  private def handleVoiceRecordingStopped(msg: VoiceRecordingStopped) {
-    val json = MeetingMessageToJsonConverter.voiceRecordingStoppedToJson(msg)
-    service.send(MessagingConstants.FROM_MEETING_CHANNEL, json)
-  }
-
-  private def handleRecordingStatusChanged(msg: RecordingStatusChanged) {
-    val json = MeetingMessageToJsonConverter.recordingStatusChangedToJson(msg)
-    service.send(MessagingConstants.FROM_MEETING_CHANNEL, json)
-  }
-
-  private def handleGetRecordingStatusReply(msg: GetRecordingStatusReply) {
-    val json = MeetingMessageToJsonConverter.getRecordingStatusReplyToJson(msg)
-    service.send(MessagingConstants.FROM_MEETING_CHANNEL, json)
-  }
-
-  private def handleMeetingHasEnded(msg: MeetingHasEnded) {
-    val json = MeetingMessageToJsonConverter.meetingHasEndedToJson(msg)
-    service.send(MessagingConstants.FROM_MEETING_CHANNEL, json)
-  }
-
-  private def handleGetAllMeetingsReply(msg: GetAllMeetingsReply) {
-    val json = MeetingMessageToJsonConverter.getAllMeetingsReplyToJson(msg)
-    service.send(MessagingConstants.FROM_MEETING_CHANNEL, json)
-  }
-}
\ No newline at end of file
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/PollingEventRedisPublisher.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/PollingEventRedisPublisher.scala
deleted file mode 100755
index efa8ff3325cbea3ef4b08342fbb7b1c42198b744..0000000000000000000000000000000000000000
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/PollingEventRedisPublisher.scala
+++ /dev/null
@@ -1,116 +0,0 @@
-package org.bigbluebutton.core.pubsub.senders
-
-import org.bigbluebutton.core.api.OutMessageListener2
-import org.bigbluebutton.core.MessageSender
-import org.bigbluebutton.core.api._
-import com.google.gson.Gson
-import scala.collection.mutable.HashMap
-import collection.JavaConverters._
-import scala.collection.JavaConversions._
-import java.util.ArrayList
-import org.bigbluebutton.common.messages.MessagingConstants
-import org.bigbluebutton.core.messaging.Util
-import org.bigbluebutton.core.apps.SimplePollOutVO
-import org.bigbluebutton.core.apps.SimplePollResultOutVO
-
-class PollingEventRedisPublisher(service: MessageSender) extends OutMessageListener2 {
-  def handleMessage(msg: IOutMessage) {
-    msg match {
-      case msg: PollStartedMessage => handlePollStartedMessage(msg)
-      case msg: PollStoppedMessage => handlePollStoppedMessage(msg)
-      case msg: PollShowResultMessage => handlePollShowResultMessage(msg)
-      case msg: PollHideResultMessage => handlePollHideResultMessage(msg)
-      case msg: UserRespondedToPollMessage => handleUserRespondedToPollMessage(msg)
-      case _ => // do nothing
-    }
-  }
-
-  private def handlePollStartedMessage(msg: PollStartedMessage) {
-    val json = pollStartedMessageToJson(msg)
-    service.send(MessagingConstants.FROM_POLLING_CHANNEL, json)
-  }
-
-  private def handlePollStoppedMessage(msg: PollStoppedMessage) {
-    val json = pollStoppedMessageToJson(msg)
-    service.send(MessagingConstants.FROM_POLLING_CHANNEL, json)
-  }
-
-  private def handlePollShowResultMessage(msg: PollShowResultMessage) {
-    val json = pollShowResultMessageToJson(msg)
-    service.send(MessagingConstants.FROM_POLLING_CHANNEL, json)
-  }
-
-  private def handlePollHideResultMessage(msg: PollHideResultMessage) {
-    val json = pollHideResultMessageToJson(msg)
-    service.send(MessagingConstants.FROM_POLLING_CHANNEL, json)
-  }
-
-  private def handleUserRespondedToPollMessage(msg: UserRespondedToPollMessage) {
-    val json = UserRespondedToPollMessageTpJson(msg)
-    service.send(MessagingConstants.FROM_POLLING_CHANNEL, json)
-  }
-
-  private def pollVOtoMap(msg: SimplePollOutVO): java.util.HashMap[String, Object] = {
-    val pollVO = new java.util.HashMap[String, Object]()
-    pollVO.put("id", msg.id)
-
-    val answers = new java.util.ArrayList[java.util.Map[String, Any]];
-    msg.answers.foreach(ans => {
-      val amap = new java.util.HashMap[String, Any]()
-      amap.put("id", ans.id)
-      amap.put("key", ans.key)
-      answers.add(amap)
-    })
-
-    pollVO.put("answers", answers)
-
-    pollVO
-  }
-
-  private def pollStartedMessageToJson(msg: PollStartedMessage): String = {
-    val pollVO = pollVOtoMap(msg.poll)
-    val psm = new org.bigbluebutton.common.messages.PollStartedMessage(msg.meetingID, msg.requesterId, pollVO)
-    psm.toJson
-  }
-
-  private def pollStoppedMessageToJson(msg: PollStoppedMessage): String = {
-    val psm = new org.bigbluebutton.common.messages.PollStoppedMessage(msg.meetingID, msg.requesterId, msg.pollId)
-    psm.toJson
-  }
-
-  private def pollResultVOtoMap(msg: SimplePollResultOutVO): java.util.HashMap[String, Object] = {
-    val pollVO = new java.util.HashMap[String, Object]()
-    pollVO.put("id", msg.id)
-
-    val answers = new java.util.ArrayList[java.util.Map[String, Any]];
-    msg.answers.foreach(ans => {
-      val amap = new java.util.HashMap[String, Any]()
-      amap.put("id", ans.id)
-      amap.put("key", ans.key)
-      amap.put("num_votes", ans.numVotes)
-      answers.add(amap)
-    })
-
-    pollVO.put("answers", answers)
-
-    pollVO
-  }
-
-  private def pollShowResultMessageToJson(msg: PollShowResultMessage): String = {
-    val pollResultVO = pollResultVOtoMap(msg.poll)
-
-    val psm = new org.bigbluebutton.common.messages.PollShowResultMessage(msg.meetingID, pollResultVO)
-    psm.toJson
-  }
-
-  private def pollHideResultMessageToJson(msg: PollHideResultMessage): String = {
-    val psm = new org.bigbluebutton.common.messages.PollHideResultMessage(msg.meetingID, msg.pollId)
-    psm.toJson
-  }
-
-  private def UserRespondedToPollMessageTpJson(msg: UserRespondedToPollMessage): String = {
-    val pollResultVO = pollResultVOtoMap(msg.poll)
-    val psm = new org.bigbluebutton.common.messages.UserVotedPollMessage(msg.meetingID, msg.presenterId, pollResultVO)
-    psm.toJson
-  }
-}
\ No newline at end of file
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/PresentationEventRedisPublisher.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/PresentationEventRedisPublisher.scala
deleted file mode 100755
index 78752b5a29621f86fb4bcf8714620704d85315b7..0000000000000000000000000000000000000000
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/PresentationEventRedisPublisher.scala
+++ /dev/null
@@ -1,161 +0,0 @@
-package org.bigbluebutton.core.pubsub.senders
-
-import org.bigbluebutton.core.api.OutMessageListener2
-import org.bigbluebutton.core.apps.Page
-import org.bigbluebutton.core.MessageSender
-import org.bigbluebutton.core.api._
-import org.bigbluebutton.common.messages.MessagingConstants
-import org.bigbluebutton.common.messages.PresentationRemovedMessage
-import collection.JavaConverters._
-import scala.collection.JavaConversions._
-import org.bigbluebutton.common.messages.GetPresentationInfoReplyMessage
-
-class PresentationEventRedisPublisher(service: MessageSender) extends OutMessageListener2 {
-  def handleMessage(msg: IOutMessage) {
-    msg match {
-      case msg: ClearPresentationOutMsg => handleClearPresentationOutMsg(msg)
-      case msg: RemovePresentationOutMsg => handleRemovePresentationOutMsg(msg)
-      case msg: GetPresentationInfoOutMsg => handleGetPresentationInfoOutMsg(msg)
-      case msg: SendCursorUpdateOutMsg => handleSendCursorUpdateOutMsg(msg)
-      case msg: ResizeAndMoveSlideOutMsg => handleResizeAndMoveSlideOutMsg(msg)
-      case msg: GotoSlideOutMsg => handleGotoSlideOutMsg(msg)
-      case msg: SharePresentationOutMsg => handleSharePresentationOutMsg(msg)
-      case msg: GetSlideInfoOutMsg => handleGetSlideInfoOutMsg(msg)
-      case msg: PresentationConversionProgress => handlePresentationConversionProgress(msg)
-      case msg: PresentationConversionError => handlePresentationConversionError(msg)
-      case msg: PresentationPageGenerated => handlePresentationPageGenerated(msg)
-      case msg: PresentationConversionDone => handlePresentationConversionDone(msg)
-      case _ => // do nothing
-    }
-  }
-
-  private def pageToMap(page: Page): java.util.Map[String, Any] = {
-    val res = new scala.collection.mutable.HashMap[String, Any]
-    res += "id" -> page.id
-    res += "num" -> page.num
-    res += "thumb_uri" -> page.thumbUri
-    res += "swf_uri" -> page.swfUri
-    res += "txt_uri" -> page.txtUri
-    res += "png_uri" -> page.pngUri
-    res += "current" -> page.current
-    res += "x_offset" -> page.xOffset
-    res += "y_offset" -> page.yOffset
-    res += "width_ratio" -> page.widthRatio
-    res += "height_ratio" -> page.heightRatio
-
-    mapAsJavaMap(res)
-  }
-
-  private def handleClearPresentationOutMsg(msg: ClearPresentationOutMsg) {
-    val json = PesentationMessageToJsonConverter.clearPresentationOutMsgToJson(msg)
-    service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json)
-  }
-
-  private def handleRemovePresentationOutMsg(msg: RemovePresentationOutMsg) {
-    val m = new PresentationRemovedMessage(msg.meetingID, msg.presentationID)
-    service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, m.toJson())
-  }
-
-  private def handleGetPresentationInfoOutMsg(msg: GetPresentationInfoOutMsg) {
-    // Create a map for our current presenter
-    val presenter = new java.util.HashMap[String, Object]()
-    presenter.put(Constants.USER_ID, msg.info.presenter.userId)
-    presenter.put(Constants.NAME, msg.info.presenter.name)
-    presenter.put(Constants.ASSIGNED_BY, msg.info.presenter.assignedBy)
-
-    // Create an array for our presentations
-    val presentations = new java.util.ArrayList[java.util.Map[String, Object]]
-    msg.info.presentations.foreach { pres =>
-      val presentation = new java.util.HashMap[String, Object]()
-      presentation.put(Constants.ID, pres.id)
-      presentation.put(Constants.NAME, pres.name)
-      presentation.put(Constants.CURRENT, pres.current: java.lang.Boolean)
-
-      // Get the pages for a presentation
-      val pages = new java.util.ArrayList[java.util.Map[String, Any]]()
-      pres.pages.values foreach { p =>
-        pages.add(pageToMap(p))
-      }
-      // store the pages in the presentation 
-      presentation.put(Constants.PAGES, pages)
-
-      // add this presentation into our presentations list
-      presentations.add(presentation);
-    }
-
-    val reply = new GetPresentationInfoReplyMessage(msg.meetingID, msg.requesterID, presenter, presentations)
-
-    val json = PesentationMessageToJsonConverter.getPresentationInfoOutMsgToJson(msg)
-    service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json)
-  }
-
-  private def handleSendCursorUpdateOutMsg(msg: SendCursorUpdateOutMsg) {
-    val json = PesentationMessageToJsonConverter.sendCursorUpdateOutMsgToJson(msg)
-    service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json)
-  }
-
-  private def handleResizeAndMoveSlideOutMsg(msg: ResizeAndMoveSlideOutMsg) {
-    val json = PesentationMessageToJsonConverter.resizeAndMoveSlideOutMsgToJson(msg)
-    service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json)
-  }
-
-  private def handleGotoSlideOutMsg(msg: GotoSlideOutMsg) {
-    val json = PesentationMessageToJsonConverter.gotoSlideOutMsgToJson(msg)
-    service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json)
-  }
-
-  private def handleSharePresentationOutMsg(msg: SharePresentationOutMsg) {
-    val json = PesentationMessageToJsonConverter.sharePresentationOutMsgToJson(msg)
-    service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json)
-  }
-
-  private def handleGetSlideInfoOutMsg(msg: GetSlideInfoOutMsg) {
-    val json = PesentationMessageToJsonConverter.getSlideInfoOutMsgToJson(msg)
-    service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json)
-  }
-
-  private def handleGetPreuploadedPresentationsOutMsg(msg: GetPreuploadedPresentationsOutMsg) {
-    val json = PesentationMessageToJsonConverter.getPreuploadedPresentationsOutMsgToJson(msg)
-    service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json)
-  }
-
-  private def handlePresentationConversionProgress(msg: PresentationConversionProgress) {
-    val json = PesentationMessageToJsonConverter.presentationConversionProgressToJson(msg)
-    service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json)
-  }
-
-  private def handlePresentationConversionError(msg: PresentationConversionError) {
-    val json = PesentationMessageToJsonConverter.presentationConversionErrorToJson(msg)
-    service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json)
-  }
-
-  private def handlePresentationPageGenerated(msg: PresentationPageGenerated) {
-    val json = PesentationMessageToJsonConverter.presentationPageGenerated(msg)
-    service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json)
-  }
-
-  private def handlePresentationConversionDone(msg: PresentationConversionDone) {
-    val json = PesentationMessageToJsonConverter.presentationConversionDoneToJson(msg)
-    service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json)
-  }
-
-  private def handlePresentationChanged(msg: PresentationChanged) {
-    val json = PesentationMessageToJsonConverter.presentationChangedToJson(msg)
-    service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json)
-  }
-
-  private def handleGetPresentationStatusReply(msg: GetPresentationStatusReply) {
-    val json = PesentationMessageToJsonConverter.getPresentationStatusReplyToJson(msg)
-    service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json)
-  }
-
-  private def handlePresentationRemoved(msg: PresentationRemoved) {
-    val json = PesentationMessageToJsonConverter.presentationRemovedToJson(msg)
-    service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json)
-  }
-
-  private def handlePageChanged(msg: PageChanged) {
-    val json = PesentationMessageToJsonConverter.pageChangedToJson(msg)
-    service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json)
-  }
-}
\ No newline at end of file
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/WhiteboardEventRedisPublisher.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/WhiteboardEventRedisPublisher.scala
deleted file mode 100755
index b48713f2c46f10c1466809670369ffe24aee655d..0000000000000000000000000000000000000000
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/WhiteboardEventRedisPublisher.scala
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.bigbluebutton.core.pubsub.senders
-
-import org.bigbluebutton.core.api._
-import scala.collection.JavaConversions._
-import scala.collection.immutable.StringOps
-import org.bigbluebutton.core.MessageSender
-import org.bigbluebutton.common.messages.MessagingConstants
-import com.google.gson.Gson;
-import com.google.gson.reflect.TypeToken;
-
-class WhiteboardEventRedisPublisher(service: MessageSender) extends OutMessageListener2 {
-  def handleMessage(msg: IOutMessage) {
-    msg match {
-      case msg: GetWhiteboardShapesReply => handleGetWhiteboardShapesReply(msg)
-      case msg: SendWhiteboardAnnotationEvent => handleSendWhiteboardAnnotationEvent(msg)
-      case msg: ClearWhiteboardEvent => handleClearWhiteboardEvent(msg)
-      case msg: UndoWhiteboardEvent => handleUndoWhiteboardEvent(msg)
-      case msg: WhiteboardEnabledEvent => handleWhiteboardEnabledEvent(msg)
-      case msg: IsWhiteboardEnabledReply => handleIsWhiteboardEnabledReply(msg)
-      case _ => //println("Unhandled message in UsersClientMessageSender")
-    }
-  }
-
-  private def handleGetWhiteboardShapesReply(msg: GetWhiteboardShapesReply) {
-    val json = WhiteboardMessageToJsonConverter.getWhiteboardShapesReplyToJson(msg)
-    service.send(MessagingConstants.FROM_WHITEBOARD_CHANNEL, json)
-  }
-
-  private def handleSendWhiteboardAnnotationEvent(msg: SendWhiteboardAnnotationEvent) {
-    val json = WhiteboardMessageToJsonConverter.sendWhiteboardAnnotationEventToJson(msg)
-    service.send(MessagingConstants.FROM_WHITEBOARD_CHANNEL, json)
-  }
-
-  private def handleClearWhiteboardEvent(msg: ClearWhiteboardEvent) {
-    val json = WhiteboardMessageToJsonConverter.clearWhiteboardEventToJson(msg)
-    service.send(MessagingConstants.FROM_WHITEBOARD_CHANNEL, json)
-  }
-
-  private def handleUndoWhiteboardEvent(msg: UndoWhiteboardEvent) {
-    val json = WhiteboardMessageToJsonConverter.undoWhiteboardEventToJson(msg)
-    service.send(MessagingConstants.FROM_WHITEBOARD_CHANNEL, json)
-  }
-
-  private def handleWhiteboardEnabledEvent(msg: WhiteboardEnabledEvent) {
-    val json = WhiteboardMessageToJsonConverter.whiteboardEnabledEventToJson(msg)
-    service.send(MessagingConstants.FROM_WHITEBOARD_CHANNEL, json)
-  }
-
-  private def handleIsWhiteboardEnabledReply(msg: IsWhiteboardEnabledReply) {
-    val json = WhiteboardMessageToJsonConverter.isWhiteboardEnabledReplyToJson(msg)
-    service.send(MessagingConstants.FROM_WHITEBOARD_CHANNEL, json)
-  }
-
-}
\ No newline at end of file
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/recorders/ChatEventRedisRecorder.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/recorders/ChatEventRedisRecorder.scala
deleted file mode 100755
index b547c006082abcef90c2a72844d255646d2e78d4..0000000000000000000000000000000000000000
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/recorders/ChatEventRedisRecorder.scala
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.bigbluebutton.core.recorders
-
-import org.bigbluebutton.core.api._
-import scala.collection.JavaConversions._
-import org.bigbluebutton.core.service.recorder.RecorderApplication
-import org.bigbluebutton.core.recorders.events.PublicChatRecordEvent
-
-class ChatEventRedisRecorder(recorder: RecorderApplication) extends OutMessageListener2 {
-
-  def handleMessage(msg: IOutMessage) {
-    msg match {
-      case msg: SendPublicMessageEvent => handleSendPublicMessageEvent(msg)
-      case _ => // do nothing
-    }
-  }
-
-  private def handleSendPublicMessageEvent(msg: SendPublicMessageEvent) {
-    if (msg.recorded) {
-      val message = mapAsJavaMap(msg.message)
-      val ev = new PublicChatRecordEvent();
-      ev.setTimestamp(TimestampGenerator.generateTimestamp);
-      ev.setMeetingId(msg.meetingID);
-      ev.setSender(message.get("fromUsername"));
-      ev.setMessage(message.get("message"));
-      ev.setColor(message.get("fromColor"));
-      recorder.record(msg.meetingID, ev);
-    }
-  }
-}
\ No newline at end of file
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/recorders/PresentationEventRedisRecorder.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/recorders/PresentationEventRedisRecorder.scala
deleted file mode 100755
index 8b8cf67f95f7c9f19e41f8c37f3a96bd7fffcefe..0000000000000000000000000000000000000000
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/recorders/PresentationEventRedisRecorder.scala
+++ /dev/null
@@ -1,126 +0,0 @@
-package org.bigbluebutton.core.recorders
-
-import org.bigbluebutton.core.api.OutMessageListener2
-import org.bigbluebutton.core.api.IOutMessage
-import org.bigbluebutton.core.api.GotoSlideOutMsg
-import org.bigbluebutton.core.api.ResizeAndMoveSlideOutMsg
-import org.bigbluebutton.core.api.RemovePresentationOutMsg
-import org.bigbluebutton.core.api.SharePresentationOutMsg
-import org.bigbluebutton.core.api.SendCursorUpdateOutMsg
-import org.bigbluebutton.core.api.ClearPresentationOutMsg
-import org.bigbluebutton.core.api.PresentationConversionDone
-import org.bigbluebutton.core.api.TimestampGenerator
-import org.bigbluebutton.core.service.recorder.RecorderApplication
-import org.bigbluebutton.core.recorders.events.ConversionCompletedPresentationRecordEvent
-import org.bigbluebutton.core.recorders.events.GotoSlidePresentationRecordEvent
-import org.bigbluebutton.core.recorders.events.ResizeAndMoveSlidePresentationRecordEvent
-import org.bigbluebutton.core.recorders.events.RemovePresentationPresentationRecordEvent
-import org.bigbluebutton.core.recorders.events.SharePresentationPresentationRecordEvent
-import org.bigbluebutton.core.recorders.events.CursorUpdateRecordEvent
-
-class PresentationEventRedisRecorder(recorder: RecorderApplication) extends OutMessageListener2 {
-  private val GENERATED_SLIDE_KEY = "GENERATED_SLIDE";
-  private val CONVERSION_COMPLETED_KEY = "CONVERSION_COMPLETED";
-
-  def handleMessage(msg: IOutMessage) {
-    msg match {
-      case msg: ClearPresentationOutMsg => handleClearPresentationOutMsg(msg)
-      case msg: RemovePresentationOutMsg => handleRemovePresentationOutMsg(msg)
-      case msg: SendCursorUpdateOutMsg => handleSendCursorUpdateOutMsg(msg)
-      case msg: ResizeAndMoveSlideOutMsg => handleResizeAndMoveSlideOutMsg(msg)
-      case msg: GotoSlideOutMsg => handleGotoSlideOutMsg(msg)
-      case msg: SharePresentationOutMsg => handleSharePresentationOutMsg(msg)
-      case _ => // do nothing
-    }
-  }
-
-  private def handleClearPresentationOutMsg(msg: ClearPresentationOutMsg) {
-
-  }
-
-  private def handlePresentationConversionDone(msg: PresentationConversionDone) {
-    if (msg.recorded) {
-      val event = new ConversionCompletedPresentationRecordEvent();
-      event.setMeetingId(msg.meetingID);
-      event.setTimestamp(TimestampGenerator.generateTimestamp);
-      event.setPresentationName(msg.presentation.id);
-      event.setOriginalFilename(msg.presentation.name);
-      recorder.record(msg.meetingID, event);
-    }
-
-  }
-
-  private def handleGotoSlideOutMsg(msg: GotoSlideOutMsg) {
-    if (msg.recorded) {
-      val event = new GotoSlidePresentationRecordEvent();
-      event.setMeetingId(msg.meetingID);
-      event.setTimestamp(TimestampGenerator.generateTimestamp);
-      event.setSlide(msg.page.num);
-      event.setId(msg.page.id);
-      event.setNum(msg.page.num);
-      event.setThumbUri(msg.page.thumbUri);
-      event.setSwfUri(msg.page.swfUri);
-      event.setTxtUri(msg.page.txtUri);
-      event.setPngUri(msg.page.pngUri);
-      event.setXOffset(msg.page.xOffset);
-      event.setYOffset(msg.page.yOffset);
-      event.setWidthRatio(msg.page.widthRatio);
-      event.setHeightRatio(msg.page.heightRatio);
-      recorder.record(msg.meetingID, event);
-    }
-  }
-
-  private def handleResizeAndMoveSlideOutMsg(msg: ResizeAndMoveSlideOutMsg) {
-    if (msg.recorded) {
-      val event = new ResizeAndMoveSlidePresentationRecordEvent();
-      event.setMeetingId(msg.meetingID);
-      event.setTimestamp(TimestampGenerator.generateTimestamp);
-      event.setId(msg.page.id);
-      event.setNum(msg.page.num);
-      event.setThumbUri(msg.page.thumbUri);
-      event.setSwfUri(msg.page.swfUri);
-      event.setTxtUri(msg.page.txtUri);
-      event.setPngUri(msg.page.pngUri);
-      event.setXOffset(msg.page.xOffset);
-      event.setYOffset(msg.page.yOffset);
-      event.setWidthRatio(msg.page.widthRatio);
-      event.setHeightRatio(msg.page.heightRatio);
-
-      recorder.record(msg.meetingID, event);
-    }
-  }
-
-  private def handleRemovePresentationOutMsg(msg: RemovePresentationOutMsg) {
-    if (msg.recorded) {
-      val event = new RemovePresentationPresentationRecordEvent();
-      event.setMeetingId(msg.meetingID);
-      event.setTimestamp(TimestampGenerator.generateTimestamp);
-      event.setPresentationName(msg.presentationID);
-      recorder.record(msg.meetingID, event);
-    }
-  }
-
-  private def handleSharePresentationOutMsg(msg: SharePresentationOutMsg) {
-    if (msg.recorded) {
-      val event = new SharePresentationPresentationRecordEvent();
-      event.setMeetingId(msg.meetingID);
-      event.setTimestamp(TimestampGenerator.generateTimestamp);
-      event.setPresentationName(msg.presentation.id);
-      event.setOriginalFilename(msg.presentation.name);
-      event.setShare(true);
-      recorder.record(msg.meetingID, event);
-    }
-  }
-
-  private def handleSendCursorUpdateOutMsg(msg: SendCursorUpdateOutMsg) {
-    if (msg.recorded) {
-      val event = new CursorUpdateRecordEvent();
-      event.setMeetingId(msg.meetingID);
-      event.setTimestamp(TimestampGenerator.generateTimestamp);
-      event.setXPercent(msg.xPercent);
-      event.setYPercent(msg.yPercent);
-
-      recorder.record(msg.meetingID, event);
-    }
-  }
-}
\ No newline at end of file
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/recorders/UsersEventRedisRecorder.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/recorders/UsersEventRedisRecorder.scala
deleted file mode 100755
index 8e90be985a7fb35f2d84710fcc9ec903f57e371c..0000000000000000000000000000000000000000
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/recorders/UsersEventRedisRecorder.scala
+++ /dev/null
@@ -1,214 +0,0 @@
-package org.bigbluebutton.core.recorders
-
-import org.bigbluebutton.core.api._
-import org.bigbluebutton.core.service.recorder.RecorderApplication
-import org.bigbluebutton.core.recorders.events.ParticipantEndAndKickAllRecordEvent
-import org.bigbluebutton.core.recorders.events.ParticipantJoinRecordEvent
-import org.bigbluebutton.core.recorders.events.StartRecordingVoiceRecordEvent
-import org.bigbluebutton.core.recorders.events.ParticipantMutedVoiceRecordEvent
-import org.bigbluebutton.core.recorders.events.ParticipantTalkingVoiceRecordEvent
-import org.bigbluebutton.core.recorders.events.ParticipantJoinedVoiceRecordEvent
-import org.bigbluebutton.core.recorders.events.ParticipantLeftVoiceRecordEvent
-import org.bigbluebutton.core.recorders.events.RecordStatusRecordEvent
-import org.bigbluebutton.core.recorders.events.ParticipantLeftRecordEvent
-import org.bigbluebutton.core.recorders.events.ParticipantStatusChangeRecordEvent
-import org.bigbluebutton.core.recorders.events.AssignPresenterRecordEvent
-
-class UsersEventRedisRecorder(recorder: RecorderApplication) extends OutMessageListener2 {
-
-  def handleMessage(msg: IOutMessage) {
-    msg match {
-      case msg: EndAndKickAll => handleEndAndKickAll(msg)
-      case msg: PresenterAssigned => handleAssignPresenter(msg)
-      case msg: UserJoined => handleUserJoined(msg)
-      case msg: UserLeft => handleUserLeft(msg)
-      case msg: UserStatusChange => handleUserStatusChange(msg)
-      case msg: UserVoiceMuted => handleUserVoiceMuted(msg)
-      case msg: UserVoiceTalking => handleUserVoiceTalking(msg)
-      case msg: UserJoinedVoice => handleUserJoinedVoice(msg)
-      case msg: UserLeftVoice => handleUserLeftVoice(msg)
-      case msg: RecordingStatusChanged => handleRecordingStatusChanged(msg)
-      case msg: UserRaisedHand => handleUserRaisedHand(msg)
-      case msg: UserLoweredHand => handleUserLoweredHand(msg)
-      case msg: UserSharedWebcam => handleUserSharedWebcam(msg)
-      case msg: UserUnsharedWebcam => handleUserUnsharedWebcam(msg)
-      case msg: VoiceRecordingStarted => handleVoiceRecordingStarted(msg)
-      case msg: VoiceRecordingStopped => handleVoiceRecordingStopped(msg)
-      case _ => //println("Unhandled message in UsersClientMessageSender")
-    }
-  }
-
-  private def handleEndAndKickAll(msg: EndAndKickAll): Unit = {
-    if (msg.recorded) {
-      val ev = new ParticipantEndAndKickAllRecordEvent();
-      ev.setTimestamp(TimestampGenerator.generateTimestamp);
-      ev.setMeetingId(msg.meetingID);
-      recorder.record(msg.meetingID, ev);
-    }
-  }
-
-  private def handleUserJoined(msg: UserJoined): Unit = {
-    if (msg.recorded) {
-      val ev = new ParticipantJoinRecordEvent();
-      ev.setTimestamp(TimestampGenerator.generateTimestamp);
-      ev.setUserId(msg.user.userID);
-      ev.setName(msg.user.name);
-      ev.setMeetingId(msg.meetingID);
-      ev.setRole(msg.user.role.toString());
-
-      recorder.record(msg.meetingID, ev);
-    }
-  }
-
-  def handleVoiceRecordingStarted(msg: VoiceRecordingStarted) {
-    if (msg.recorded) {
-      val evt = new StartRecordingVoiceRecordEvent(true);
-      evt.setMeetingId(msg.meetingID);
-      evt.setTimestamp(TimestampGenerator.generateTimestamp);
-      evt.setBridge(msg.confNum);
-      evt.setRecordingTimestamp(msg.timestamp);
-      evt.setFilename(msg.recordingFile);
-      recorder.record(msg.meetingID, evt);
-    }
-  }
-
-  def handleVoiceRecordingStopped(msg: VoiceRecordingStopped) {
-    if (msg.recorded) {
-      val evt = new StartRecordingVoiceRecordEvent(false);
-      evt.setMeetingId(msg.meetingID);
-      evt.setTimestamp(TimestampGenerator.generateTimestamp);
-      evt.setBridge(msg.confNum);
-      evt.setRecordingTimestamp(msg.timestamp);
-      evt.setFilename(msg.recordingFile);
-      recorder.record(msg.meetingID, evt);
-    }
-  }
-
-  def handleUserVoiceMuted(msg: UserVoiceMuted) {
-    if (msg.recorded) {
-      val ev = new ParticipantMutedVoiceRecordEvent()
-      ev.setMeetingId(msg.meetingID);
-      ev.setTimestamp(TimestampGenerator.generateTimestamp);
-      ev.setBridge(msg.confNum);
-      ev.setParticipant(msg.user.voiceUser.userId);
-      ev.setMuted(msg.user.voiceUser.muted);
-
-      recorder.record(msg.meetingID, ev);
-    }
-  }
-
-  def handleUserVoiceTalking(msg: UserVoiceTalking) {
-    if (msg.recorded) {
-      val evt = new ParticipantTalkingVoiceRecordEvent();
-      evt.setMeetingId(msg.meetingID);
-      evt.setTimestamp(TimestampGenerator.generateTimestamp);
-      evt.setBridge(msg.confNum);
-      evt.setParticipant(msg.user.userID);
-      evt.setTalking(msg.user.voiceUser.talking);
-
-      recorder.record(msg.meetingID, evt);
-    }
-  }
-
-  def handleUserJoinedVoice(msg: UserJoinedVoice) {
-    if (msg.recorded) {
-      val evt = new ParticipantJoinedVoiceRecordEvent();
-      evt.setMeetingId(msg.meetingID);
-      evt.setTimestamp(TimestampGenerator.generateTimestamp);
-      evt.setBridge(msg.confNum);
-      evt.setParticipant(msg.user.voiceUser.userId);
-      evt.setCallerName(msg.user.voiceUser.callerName);
-      evt.setCallerNumber(msg.user.voiceUser.callerNum);
-      evt.setMuted(msg.user.voiceUser.muted);
-      evt.setTalking(msg.user.voiceUser.talking);
-
-      recorder.record(msg.meetingID, evt)
-    }
-  }
-
-  def handleUserLeftVoice(msg: UserLeftVoice) {
-    if (msg.recorded) {
-      val evt = new ParticipantLeftVoiceRecordEvent();
-      evt.setMeetingId(msg.meetingID);
-      evt.setTimestamp(TimestampGenerator.generateTimestamp);
-      evt.setBridge(msg.confNum);
-      evt.setParticipant(msg.user.voiceUser.userId);
-      recorder.record(msg.meetingID, evt);
-    }
-  }
-
-  def handleRecordingStatusChanged(msg: RecordingStatusChanged) {
-    if (msg.recorded) {
-      val evt = new RecordStatusRecordEvent();
-      evt.setMeetingId(msg.meetingID);
-      evt.setTimestamp(TimestampGenerator.generateTimestamp);
-      evt.setUserId(msg.userId);
-      evt.setRecordingStatus(msg.recording.toString);
-
-      recorder.record(msg.meetingID, evt);
-    }
-  }
-
-  private def handleUserLeft(msg: UserLeft): Unit = {
-    if (msg.recorded) {
-      val ev = new ParticipantLeftRecordEvent();
-      ev.setTimestamp(TimestampGenerator.generateTimestamp);
-      ev.setUserId(msg.user.userID);
-      ev.setMeetingId(msg.meetingID);
-
-      recorder.record(msg.meetingID, ev);
-    }
-
-  }
-
-  private def handleUserRaisedHand(msg: UserRaisedHand) {
-    val status = UserStatusChange(msg.meetingID, msg.recorded,
-      msg.userID, "raiseHand", true: java.lang.Boolean)
-    handleUserStatusChange(status)
-  }
-
-  private def handleUserLoweredHand(msg: UserLoweredHand) {
-    val status = UserStatusChange(msg.meetingID, msg.recorded,
-      msg.userID, "raiseHand", false: java.lang.Boolean)
-    handleUserStatusChange(status)
-  }
-
-  private def handleUserSharedWebcam(msg: UserSharedWebcam) {
-    val status = UserStatusChange(msg.meetingID, msg.recorded,
-      msg.userID, "hasStream", "true,stream=" + msg.stream)
-    handleUserStatusChange(status)
-  }
-
-  private def handleUserUnsharedWebcam(msg: UserUnsharedWebcam) {
-    val status = UserStatusChange(msg.meetingID, msg.recorded,
-      msg.userID, "hasStream", "false,stream=" + msg.stream)
-    handleUserStatusChange(status)
-  }
-
-  private def handleUserStatusChange(msg: UserStatusChange): Unit = {
-    if (msg.recorded) {
-      val ev = new ParticipantStatusChangeRecordEvent();
-      ev.setTimestamp(TimestampGenerator.generateTimestamp);
-      ev.setUserId(msg.userID);
-      ev.setMeetingId(msg.meetingID);
-      ev.setStatus(msg.status);
-      ev.setValue(msg.value.toString());
-
-      recorder.record(msg.meetingID, ev);
-    }
-  }
-
-  private def handleAssignPresenter(msg: PresenterAssigned): Unit = {
-    if (msg.recorded) {
-      val event = new AssignPresenterRecordEvent();
-      event.setMeetingId(msg.meetingID);
-      event.setTimestamp(TimestampGenerator.generateTimestamp);
-      event.setUserId(msg.presenter.presenterID);
-      event.setName(msg.presenter.presenterName);
-      event.setAssignedBy(msg.presenter.assignedBy);
-
-      recorder.record(msg.meetingID, event);
-    }
-
-  }
-}
\ No newline at end of file
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/recorders/WhiteboardEventRedisRecorder.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/recorders/WhiteboardEventRedisRecorder.scala
deleted file mode 100755
index cf098503de628dbbdd2c4911127868d7b726e420..0000000000000000000000000000000000000000
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/recorders/WhiteboardEventRedisRecorder.scala
+++ /dev/null
@@ -1,100 +0,0 @@
-package org.bigbluebutton.core.recorders
-
-import org.bigbluebutton.core.api._
-import scala.collection.JavaConversions._
-import scala.collection.immutable.StringOps
-import org.bigbluebutton.core.service.recorder.RecorderApplication
-import org.bigbluebutton.core.service.whiteboard.WhiteboardKeyUtil
-import org.bigbluebutton.core.recorders.events.ModifyTextWhiteboardRecordEvent
-import org.bigbluebutton.core.recorders.events.AddShapeWhiteboardRecordEvent
-import org.bigbluebutton.core.recorders.events.ClearPageWhiteboardRecordEvent
-import org.bigbluebutton.core.recorders.events.UndoShapeWhiteboardRecordEvent
-
-class WhiteboardEventRedisRecorder(recorder: RecorderApplication) extends OutMessageListener2 {
-
-  def handleMessage(msg: IOutMessage) {
-    msg match {
-      case msg: SendWhiteboardAnnotationEvent => handleSendWhiteboardAnnotationEvent(msg)
-      case msg: ClearWhiteboardEvent => handleClearWhiteboardEvent(msg)
-      case msg: UndoWhiteboardEvent => handleUndoWhiteboardEvent(msg)
-      case _ => //println("Unhandled message in UsersClientMessageSender")
-    }
-  }
-
-  private def getPresentationId(whiteboardId: String): String = {
-    // Need to split the whiteboard id into presenation id and page num as the old
-    // recording expects them
-    val strId = new StringOps(whiteboardId)
-    val ids = strId.split('/')
-    var presId: String = ""
-    if (ids.length == 2) {
-      presId = ids(0)
-    }
-
-    presId
-  }
-
-  private def getPageNum(whiteboardId: String): String = {
-    val strId = new StringOps(whiteboardId)
-    val ids = strId.split('/')
-    var pageNum = "0"
-    if (ids.length == 2) {
-      pageNum = ids(1)
-    }
-    pageNum
-  }
-
-  private def handleSendWhiteboardAnnotationEvent(msg: SendWhiteboardAnnotationEvent) {
-    if ((msg.shape.shapeType == WhiteboardKeyUtil.TEXT_TYPE) && (msg.shape.status != WhiteboardKeyUtil.TEXT_CREATED_STATUS)) {
-
-      val event = new ModifyTextWhiteboardRecordEvent()
-      event.setMeetingId(msg.meetingID)
-      event.setTimestamp(TimestampGenerator.generateTimestamp)
-      event.setPresentation(getPresentationId(msg.whiteboardId))
-      event.setPageNumber(getPageNum(msg.whiteboardId))
-      event.setWhiteboardId(msg.whiteboardId)
-      event.addAnnotation(mapAsJavaMap(msg.shape.shape))
-      recorder.record(msg.meetingID, event)
-    } else if ((msg.shape.shapeType == WhiteboardKeyUtil.POLL_RESULT_TYPE)) {
-      val event = new AddShapeWhiteboardRecordEvent()
-      event.setMeetingId(msg.meetingID)
-      event.setTimestamp(TimestampGenerator.generateTimestamp)
-      event.setPresentation(getPresentationId(msg.whiteboardId))
-      event.setPageNumber(getPageNum(msg.whiteboardId))
-      event.setWhiteboardId(msg.whiteboardId);
-      event.addAnnotation(mapAsJavaMap(msg.shape.shape))
-      recorder.record(msg.meetingID, event)
-    } else {
-      val event = new AddShapeWhiteboardRecordEvent()
-      event.setMeetingId(msg.meetingID)
-      event.setTimestamp(TimestampGenerator.generateTimestamp)
-      event.setPresentation(getPresentationId(msg.whiteboardId))
-      event.setPageNumber(getPageNum(msg.whiteboardId))
-      event.setWhiteboardId(msg.whiteboardId);
-      event.addAnnotation(mapAsJavaMap(msg.shape.shape))
-      recorder.record(msg.meetingID, event)
-    }
-  }
-
-  private def handleClearWhiteboardEvent(msg: ClearWhiteboardEvent) {
-    val event = new ClearPageWhiteboardRecordEvent()
-    event.setMeetingId(msg.meetingID)
-    event.setTimestamp(TimestampGenerator.generateTimestamp)
-    event.setPresentation(getPresentationId(msg.whiteboardId))
-    event.setPageNumber(getPageNum(msg.whiteboardId))
-    event.setWhiteboardId(msg.whiteboardId)
-    recorder.record(msg.meetingID, event)
-  }
-
-  private def handleUndoWhiteboardEvent(msg: UndoWhiteboardEvent) {
-    val event = new UndoShapeWhiteboardRecordEvent()
-    event.setMeetingId(msg.meetingID)
-    event.setTimestamp(TimestampGenerator.generateTimestamp)
-    event.setPresentation(getPresentationId(msg.whiteboardId))
-    event.setPageNumber(getPageNum(msg.whiteboardId))
-    event.setWhiteboardId(msg.whiteboardId)
-    event.setShapeId(msg.shapeId);
-    recorder.record(msg.meetingID, event)
-  }
-
-}
\ No newline at end of file