diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md
index 2a959ce833fa8e5ada82d59f1b2cd378c447422f..1ec39e2558293a3f2f99bc1ca21e291bff5abad3 100755
--- a/DEVELOPMENT.md
+++ b/DEVELOPMENT.md
@@ -133,6 +133,7 @@ On your akka-fsesl terminal, start akka-fsesl
 
 ```
 cd ~/dev/bigbluebutton/akka-bbb-fsesl
+sbt clean
 sbt run
 ```
 
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 127ae4af5899c8932f8eaff0377f307e17c764d6..e7a2cefacfadc6dc566016a0207db65db27fc654 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
@@ -60,7 +60,6 @@ class BigBlueButtonActor(val system: ActorSystem,
     case msg: BbbCommonEnvCoreMsg => handleBbbCommonEnvCoreMsg(msg)
 
     // 1x messages
-    case msg: CreateMeeting => handleCreateMeeting(msg)
     case msg: DestroyMeeting => handleDestroyMeeting(msg)
     case msg: KeepAliveMessage => handleKeepAliveMessage(msg)
     case msg: PubSubPing => handlePubSubPingMessage(msg)
@@ -285,10 +284,6 @@ class BigBlueButtonActor(val system: ActorSystem,
  */
   }
 
-  private def handleCreateMeeting(msg: CreateMeeting): Unit = {
-
-  }
-
   private def handleGetAllMeetingsRequest(msg: GetAllMeetingsRequest) {
     val len = RunningMeetings.numMeetings(meetings)
     var currPosition = len - 1
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/MeetingModel.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/MeetingModel.scala
index 02f8c22e9f2010cdf2e4ed9b5f7f1c73923a780d..413336d709a0bd514176bc72752991464ea8b282 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/MeetingModel.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/MeetingModel.scala
@@ -7,8 +7,6 @@ import java.util.concurrent.TimeUnit
 import org.bigbluebutton.core.api.GuestPolicy.GuestPolicy
 
 case object StopMeetingActor
-case class MeetingProperties(deskshareBridge: String, createDate: String,
-  red5DeskShareIP: String, red5DeskShareApp: String)
 
 case class MeetingExtensionProp(maxExtensions: Int = 2, numExtensions: Int = 0, extendByMinutes: Int = 20,
   sendNotice: Boolean = true, sent15MinNotice: Boolean = false,
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/api/InMessages.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/api/InMessages.scala
index 605e5a6d9d6cc8b40f77eca8a69b616f546a4151..a78de73e226fcb7dc997dfbd2c304f7f8838d9a6 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/api/InMessages.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/api/InMessages.scala
@@ -4,7 +4,6 @@ import org.bigbluebutton.core.api.GuestPolicy._
 import org.bigbluebutton.core.api.SharedNotesOperation._
 import org.bigbluebutton.core.apps.AnnotationVO
 import org.bigbluebutton.core.apps.Presentation
-import org.bigbluebutton.core.MeetingProperties
 import org.bigbluebutton.core.apps.BreakoutUser
 import spray.json.JsObject
 
@@ -34,7 +33,6 @@ case class KeepAliveMessage(aliveID: String) extends InMessage
 case class MonitorNumberOfUsers(meetingID: String) extends InMessage
 case class SendTimeRemainingUpdate(meetingId: String) extends InMessage
 case class ExtendMeetingDuration(meetingId: String, userId: String) extends InMessage
-case class CreateMeeting(meetingID: String, mProps: MeetingProperties) extends InMessage
 case class InitializeMeeting(meetingID: String, recorded: Boolean) extends InMessage
 case class DestroyMeeting(meetingID: String) extends InMessage
 case class StartMeeting(meetingID: String) extends InMessage
@@ -222,4 +220,4 @@ case class GetCurrentDocumentRequest(meetingID: String, requesterID: String) ext
 case class CreateAdditionalNotesRequest(meetingID: String, requesterID: String, noteName: String) extends InMessage
 case class DestroyAdditionalNotesRequest(meetingID: String, requesterID: String, noteID: String) extends InMessage
 case class RequestAdditionalNotesSetRequest(meetingID: String, requesterID: String, additionalNotesSetSize: Int) extends InMessage
-case class SharedNotesSyncNoteRequest(meetingID: String, requesterID: String, noteID: String) extends InMessage
\ No newline at end of file
+case class SharedNotesSyncNoteRequest(meetingID: String, requesterID: String, noteID: String) extends InMessage
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/Users.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/Users.scala
index c07ed2f6b2a37bf057b1fb138c3470832523ca24..cf0ad7c3632526735eda71c58bbc43dd6614f125 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/Users.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/Users.scala
@@ -254,33 +254,12 @@ class Users {
 
 case class UserIdAndName(id: String, name: String)
 
-case class UserVO(
-  id: String,
-  externalId: String,
-  name: String,
-  role: String,
-  guest: Boolean,
-  authed: Boolean,
-  waitingForAcceptance: Boolean,
-  emojiStatus: String,
-  presenter: Boolean,
-  hasStream: Boolean,
-  locked: Boolean,
-  webcamStreams: Set[String],
-  phoneUser: Boolean,
-  voiceUser: VoiceUser,
-  listenOnly: Boolean,
-  avatarURL: String,
+case class UserVO(id: String, externalId: String, name: String, role: String,
+  guest: Boolean, authed: Boolean, waitingForAcceptance: Boolean, emojiStatus: String,
+  presenter: Boolean, hasStream: Boolean, locked: Boolean, webcamStreams: Set[String],
+  phoneUser: Boolean, voiceUser: VoiceUser, listenOnly: Boolean, avatarURL: String,
   joinedWeb: Boolean)
 
-case class VoiceUser(
-  userId: String,
-  webUserId: String,
-  callerName: String,
-  callerNum: String,
-  joined: Boolean,
-  locked: Boolean,
-  muted: Boolean,
-  talking: Boolean,
-  avatarURL: String,
-  listenOnly: Boolean)
+case class VoiceUser(userId: String, webUserId: String, callerName: String,
+  callerNum: String, joined: Boolean, locked: Boolean, muted: Boolean,
+  talking: Boolean, avatarURL: String, listenOnly: Boolean)
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/Webcams.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/Webcams.scala
new file mode 100755
index 0000000000000000000000000000000000000000..4ae5197ee88caa1a62c1c370e16fc104b0236686
--- /dev/null
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/Webcams.scala
@@ -0,0 +1,31 @@
+package org.bigbluebutton.core.models
+
+object Webcams {
+  def findWithStreamId(webcams: Webcams, streamId: String): Option[WebcamStream] = {
+    webcams.toVector.find(w => w.stream.id == streamId)
+  }
+
+  def findWebcamsForUser(webcams: Webcams, userId: String): Vector[WebcamStream] = {
+    webcams.toVector.filter(w => w.userId == userId)
+  }
+
+}
+
+class Webcams {
+  private var webcams: collection.immutable.HashMap[String, WebcamStream] = new collection.immutable.HashMap[String, WebcamStream]
+
+  private def toVector: Vector[WebcamStream] = webcams.values.toVector
+
+  private def save(webcam: WebcamStream): WebcamStream = {
+    webcams += webcam.stream.id -> webcam
+    webcam
+  }
+
+  private def remove(streamId: String): Option[WebcamStream] = {
+    val webcam = webcams.get(streamId)
+    webcam foreach (u => webcams -= streamId)
+    webcam
+  }
+}
+
+case class WebcamStream(userId: String, stream: Stream)
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/ReceivedJsonMsgDeserializer.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/ReceivedJsonMsgDeserializer.scala
new file mode 100755
index 0000000000000000000000000000000000000000..57444588ce675cd84057368987c288150b894b73
--- /dev/null
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/ReceivedJsonMsgDeserializer.scala
@@ -0,0 +1,44 @@
+package org.bigbluebutton.core.pubsub.senders
+
+import com.fasterxml.jackson.databind.JsonNode
+import org.bigbluebutton.SystemConfiguration
+import org.bigbluebutton.common2.messages._
+import org.bigbluebutton.core.bus.{ BbbMsgEvent, BbbMsgRouterEventBus, ReceivedJsonMessage }
+
+import scala.util.{ Failure, Success }
+
+trait ReceivedJsonMsgDeserializer extends SystemConfiguration {
+  this: ReceivedJsonMsgHandlerActor =>
+
+  object JsonDeserializer extends Deserializer
+
+  def deserializeCreateMeetingReqMsg(jsonNode: JsonNode): Option[CreateMeetingReqMsg] = {
+    JsonDeserializer.toBbbCommonMsg[CreateMeetingReqMsg](jsonNode) match {
+      case Success(msg) => Some(msg.asInstanceOf[CreateMeetingReqMsg])
+      case Failure(ex) =>
+        log.error("Failed to CreateMeetingReqMsg message " + ex)
+        None
+    }
+  }
+
+  def routeValidateAuthTokenReqMsg(jsonNode: JsonNode): Option[ValidateAuthTokenReqMsg] = {
+    JsonDeserializer.toBbbCommonMsg[ValidateAuthTokenReqMsg](jsonNode) match {
+      case Success(msg) => Some(msg.asInstanceOf[ValidateAuthTokenReqMsg])
+      case Failure(ex) =>
+        log.error("Failed to ValidateAuthTokenReqMsg message " + ex)
+        None
+    }
+  }
+
+  def routeRegisterUserReqMsg(jsonNode: JsonNode): Option[RegisterUserReqMsg] = {
+    JsonDeserializer.toBbbCommonMsg[RegisterUserReqMsg](jsonNode) match {
+      case Success(msg) =>
+        // Route via meeting manager as there is a race condition if we send directly to meeting
+        // because the meeting actor might not have been created yet.
+        Some(msg.asInstanceOf[RegisterUserReqMsg])
+      case Failure(ex) =>
+        log.error("Failed to RegisterUserReqMsg message " + ex)
+        None
+    }
+  }
+}
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/ReceivedJsonMsgHandlerActor.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/ReceivedJsonMsgHandlerActor.scala
index 1dfca9cc2d5e4190b2668eb2b1c4716dab443a97..e757ca039d06051809f7e85dbc0674bf486f331d 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/ReceivedJsonMsgHandlerActor.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/ReceivedJsonMsgHandlerActor.scala
@@ -2,7 +2,12 @@ package org.bigbluebutton.core.pubsub.senders
 
 import akka.actor.{ Actor, ActorLogging, Props }
 import org.bigbluebutton.SystemConfiguration
+import com.fasterxml.jackson.databind.JsonNode
+import org.bigbluebutton.common2.messages.{ BbbCoreEnvelope, CreateMeetingReqMsg, RegisterUserReqMsg, ValidateAuthTokenReqMsg }
 import org.bigbluebutton.core.bus._
+import org.bigbluebutton.core2.ReceivedMessageRouter
+
+import scala.util.{ Failure, Success }
 
 object ReceivedJsonMsgHandlerActor {
   def props(eventBus: BbbMsgRouterEventBus, incomingJsonMessageBus: IncomingJsonMessageBus): Props =
@@ -12,7 +17,10 @@ object ReceivedJsonMsgHandlerActor {
 class ReceivedJsonMsgHandlerActor(
   val eventBus: BbbMsgRouterEventBus,
   val incomingJsonMessageBus: IncomingJsonMessageBus)
-    extends Actor with ActorLogging with SystemConfiguration with ReceivedJsonMsgHandlerTrait {
+    extends Actor with ActorLogging
+    with SystemConfiguration
+    with ReceivedJsonMsgDeserializer
+    with ReceivedMessageRouter {
 
   def receive = {
     case msg: ReceivedJsonMessage =>
@@ -21,4 +29,42 @@ class ReceivedJsonMsgHandlerActor(
     case _ => // do nothing
   }
 
+  def handleReceivedJsonMessage(msg: ReceivedJsonMessage): Unit = {
+    for {
+      envJsonNode <- JsonDeserializer.toBbbCommonEnvJsNodeMsg(msg.data)
+    } yield route(envJsonNode.envelope, envJsonNode.core)
+  }
+
+  def route(envelope: BbbCoreEnvelope, jsonNode: JsonNode): Unit = {
+    log.debug("*************** Route envelope name " + envelope.name)
+    envelope.name match {
+      case CreateMeetingReqMsg.NAME =>
+        log.debug("**************** Route CreateMeetingReqMsg")
+        for {
+          m <- deserializeCreateMeetingReqMsg(jsonNode)
+        } yield {
+          log.debug("************ Sending CreateMeetingReqMsg")
+          send(envelope, m)
+        }
+      case ValidateAuthTokenReqMsg.NAME =>
+        log.debug("**************** Route ValidateAuthTokenReqMsg")
+        for {
+          m <- routeValidateAuthTokenReqMsg(jsonNode)
+        } yield {
+          log.debug("************ Sending ValidateAuthTokenReqMsg")
+          send(envelope, m)
+        }
+      case RegisterUserReqMsg.NAME =>
+        log.debug("**************** Route RegisterUserReqMsg")
+        for {
+          m <- routeRegisterUserReqMsg(jsonNode)
+        } yield {
+          log.debug("************ Sending RegisterUserReqMsg")
+          send(envelope, m)
+        }
+      case _ =>
+        log.debug("************ Cannot route envelope name " + envelope.name)
+      // do nothing
+    }
+  }
 }
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/ReceivedJsonMsgHandlerTrait.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/ReceivedJsonMsgHandlerTrait.scala
deleted file mode 100755
index 4e8fa53d8eaada5ba4941a53cf1a36d8eee12990..0000000000000000000000000000000000000000
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/ReceivedJsonMsgHandlerTrait.scala
+++ /dev/null
@@ -1,81 +0,0 @@
-package org.bigbluebutton.core.pubsub.senders
-
-import com.fasterxml.jackson.databind.JsonNode
-import org.bigbluebutton.SystemConfiguration
-import org.bigbluebutton.common2.messages._
-import org.bigbluebutton.core.bus.{ BbbMsgEvent, BbbMsgRouterEventBus, ReceivedJsonMessage }
-
-trait ReceivedJsonMsgHandlerTrait extends SystemConfiguration {
-  val eventBus: BbbMsgRouterEventBus
-  object JsonDeserializer extends Deserializer
-
-  def send(msg: BbbMsgEvent): Unit = {
-    println("******************** Routing " + msg.payload.envelope.name)
-    eventBus.publish(msg)
-  }
-
-  def handleReceivedJsonMessage(msg: ReceivedJsonMessage): Unit = {
-    for {
-      envJsonNode <- JsonDeserializer.toJBbbCommonEnvJsNodeMsg(msg.data)
-    } yield route(envJsonNode.envelope, envJsonNode.core)
-  }
-
-  def route(envelope: BbbCoreEnvelope, jsonNode: JsonNode): Unit = {
-    println("*************** Route envelope name " + envelope.name)
-    envelope.name match {
-      case CreateMeetingReqMsg.NAME =>
-        println("**************** Route CreateMeetingReqMsg")
-        for {
-          m <- routeCreateMeetingReqMsg(envelope, jsonNode)
-        } yield {
-          println("************ Sending CreateMeetingReqMsg")
-          send(m)
-        }
-      case ValidateAuthTokenReqMsg.NAME =>
-        println("**************** Route ValidateAuthTokenReqMsg")
-        for {
-          m <- routeValidateAuthTokenReqMsg(envelope, jsonNode)
-        } yield {
-          println("************ Sending ValidateAuthTokenReqMsg")
-          send(m)
-        }
-      case RegisterUserReqMsg.NAME =>
-        println("**************** Route RegisterUserReqMsg")
-        for {
-          m <- routeRegisterUserReqMsg(envelope, jsonNode)
-        } yield {
-          println("************ Sending RegisterUserReqMsg")
-          send(m)
-        }
-      case _ =>
-        println("************ Cannot route envelope name " + envelope.name)
-      // do nothing
-    }
-  }
-
-  def routeCreateMeetingReqMsg(envelope: BbbCoreEnvelope, jsonNode: JsonNode): Option[BbbMsgEvent] = {
-    for {
-      msg <- JsonDeserializer.toCreateMeetingReqMsg(envelope, jsonNode)
-    } yield {
-      BbbMsgEvent(meetingManagerChannel, BbbCommonEnvCoreMsg(envelope, msg))
-    }
-  }
-
-  def routeValidateAuthTokenReqMsg(envelope: BbbCoreEnvelope, jsonNode: JsonNode): Option[BbbMsgEvent] = {
-    for {
-      msg <- JsonDeserializer.toValidateAuthTokenReqMsg(envelope, jsonNode)
-    } yield {
-      BbbMsgEvent(msg.header.meetingId, BbbCommonEnvCoreMsg(envelope, msg))
-    }
-  }
-
-  def routeRegisterUserReqMsg(envelope: BbbCoreEnvelope, jsonNode: JsonNode): Option[BbbMsgEvent] = {
-    for {
-      msg <- JsonDeserializer.toRegisterUserReqMsg(envelope, jsonNode)
-    } yield {
-      // Route via meeting manager as there is a race condition if we send directly to meeting
-      // because the meeting actor might not have been created yet.
-      BbbMsgEvent(meetingManagerChannel, BbbCommonEnvCoreMsg(envelope, msg))
-    }
-  }
-}
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/LiveMeeting.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/LiveMeeting.scala
index b6d23e6927dfb18802e960cfebb8140d7538d6f1..fd42cf707b7d0743dd25d2067d70702b212edbad 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/LiveMeeting.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/LiveMeeting.scala
@@ -6,7 +6,6 @@ import org.bigbluebutton.common2.domain.DefaultProps
 import org.bigbluebutton.core.api._
 import org.bigbluebutton.core.apps._
 import org.bigbluebutton.core.models.{ RegisteredUsers, Users }
-import org.bigbluebutton.core.{ MeetingModel, MeetingProperties }
 import org.bigbluebutton.core2.MeetingStatus2x
 
 class LiveMeeting(val props: DefaultProps,
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActor.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActor.scala
index 7db90eac49040c2dd970c07518a019bd731a200a..f8e704dc89fa656a13f91995801e1efb3ac88dec 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActor.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActor.scala
@@ -206,7 +206,7 @@ class MeetingActor(val props: DefaultProps,
     val routing = collection.immutable.HashMap("sender" -> "bbb-apps-akka",
       "msgType" -> "direct", "meetingId" -> props.meetingProp.intId, "userId" -> msg.body.userId)
     val envelope = BbbCoreEnvelope(ValidateAuthTokenRespMsg.NAME, routing)
-    val header = BbbCoreHeaderWithMeetingId(ValidateAuthTokenRespMsg.NAME, props.meetingProp.intId)
+    val header = BbbClientMsgHeader(ValidateAuthTokenRespMsg.NAME, props.meetingProp.intId, msg.body.userId)
 
     RegisteredUsers.getRegisteredUserWithToken(msg.body.authToken, msg.body.userId, liveMeeting.registeredUsers) match {
       case Some(u) =>
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActorInternal.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActorInternal.scala
index 55f63294c1b8a71e57e1ff5b4735e49a4af01fba..09a757e2732ff89b8871a70d13235e357f30c550 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActorInternal.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActorInternal.scala
@@ -11,7 +11,7 @@ import akka.actor.SupervisorStrategy.Resume
 import scala.concurrent.duration._
 import org.bigbluebutton.SystemConfiguration
 import org.bigbluebutton.common2.domain.DefaultProps
-import org.bigbluebutton.core.{ MeetingProperties, OutMessageGateway }
+import org.bigbluebutton.core.{ OutMessageGateway }
 import org.bigbluebutton.core.api._
 import org.bigbluebutton.core.bus.{ BigBlueButtonEvent, IncomingEventBus }
 
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/RunningMeeting.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/RunningMeeting.scala
index d5fd6de3aad8f091dabdca3d4c356fed32190a7e..4401f94fcddd716ebbf8de401b8764401cca8035 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/RunningMeeting.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/RunningMeeting.scala
@@ -5,7 +5,7 @@ import org.bigbluebutton.common2.domain.{ DefaultProps, Meeting2x }
 import org.bigbluebutton.core.apps._
 import org.bigbluebutton.core.bus._
 import org.bigbluebutton.core.models.{ RegisteredUsers, Users }
-import org.bigbluebutton.core.{ MeetingModel, MeetingProperties, OutMessageGateway }
+import org.bigbluebutton.core.{ OutMessageGateway }
 import org.bigbluebutton.core2.MeetingStatus2x
 
 object RunningMeeting {
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/ReceivedMessageRouter.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/ReceivedMessageRouter.scala
new file mode 100755
index 0000000000000000000000000000000000000000..14a4b1d764966e6ff67b539fe9c39965c95ae5ef
--- /dev/null
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/ReceivedMessageRouter.scala
@@ -0,0 +1,28 @@
+package org.bigbluebutton.core2
+
+import org.bigbluebutton.SystemConfiguration
+import org.bigbluebutton.common2.messages._
+import org.bigbluebutton.core.bus.{ BbbMsgEvent, BbbMsgRouterEventBus }
+
+trait ReceivedMessageRouter extends SystemConfiguration {
+  val eventBus: BbbMsgRouterEventBus
+
+  def publish(msg: BbbMsgEvent): Unit = {
+    eventBus.publish(msg)
+  }
+
+  def send(envelope: BbbCoreEnvelope, msg: CreateMeetingReqMsg): Unit = {
+    val event = BbbMsgEvent(meetingManagerChannel, BbbCommonEnvCoreMsg(envelope, msg))
+    publish(event)
+  }
+
+  def send(envelope: BbbCoreEnvelope, msg: ValidateAuthTokenReqMsg): Unit = {
+    val event = BbbMsgEvent(msg.header.meetingId, BbbCommonEnvCoreMsg(envelope, msg))
+    publish(event)
+  }
+
+  def send(envelope: BbbCoreEnvelope, msg: RegisterUserReqMsg): Unit = {
+    val event = BbbMsgEvent(meetingManagerChannel, BbbCommonEnvCoreMsg(envelope, msg))
+    publish(event)
+  }
+}
diff --git a/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/AppsTestFixtures.scala b/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/AppsTestFixtures.scala
index 23c1f32e096f5787efd419ee8624bbda1e65b828..9762b3f9de3260e8a8cc79faa631d11e5d17e8fa 100755
--- a/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/AppsTestFixtures.scala
+++ b/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/AppsTestFixtures.scala
@@ -1,10 +1,10 @@
 package org.bigbluebutton.core
 
 import org.bigbluebutton.common2.domain._
-
 import org.bigbluebutton.core.api.GuestPolicy
 import org.bigbluebutton.core.apps._
 import org.bigbluebutton.core.models.{ RegisteredUsers, Users }
+import org.bigbluebutton.core2.MeetingStatus2x
 
 trait AppsTestFixtures {
 
@@ -32,23 +32,16 @@ trait AppsTestFixtures {
   val maxUsers = 25
   val guestPolicy = "ALWAYS_ASK"
 
-  val red5DeskShareIP = "127.0.0.1"
-  val red5DeskShareApp = "red5App"
+  val red5DeskShareIPTestFixture = "127.0.0.1"
+  val red5DeskShareAppTestFixtures = "red5App"
   val metadata: collection.immutable.Map[String, String] = Map("foo" -> "bar", "bar" -> "baz", "baz" -> "foo")
+  val screenshareProps = ScreenshareProps("TODO", "TODO", "TODO")
+  val breakoutProps = BreakoutProps(parentMeetingId, sequence, Vector())
 
-  val mProps = new MeetingProperties(meetingId, externalMeetingId, parentMeetingId,
-    meetingName, record,
-    voiceConfId, deskshareConfId,
-    durationInMinutes,
-    autoStartRecording, allowStartStopRecording, webcamsOnlyForModerator,
-    moderatorPassword, viewerPassword,
-    createTime, createDate, red5DeskShareIP, red5DeskShareApp,
-    isBreakout, sequence, metadata, GuestPolicy.ALWAYS_ACCEPT)
-
+  val meetingStatux2x = new MeetingStatus2x
   val chatModel = new ChatModel()
   val layoutModel = new LayoutModel()
   val meetingModel = new MeetingModel()
-  val usersModel = new UsersModel()
   val pollModel = new PollModel()
   val wbModel = new WhiteboardModel()
   val presModel = new PresentationModel()
@@ -58,22 +51,20 @@ trait AppsTestFixtures {
   val users = new Users
   val registeredUsers = new RegisteredUsers
 
-  meetingModel.setGuestPolicy(mProps.guestPolicy)
-
   val meetingProp = MeetingProp(name = meetingName, extId = externalMeetingId, intId = meetingId,
     isBreakout = isBreakout.booleanValue())
-  val durationProps = DurationProps(duration = durationInMinutes, createdTime = createTime)
+  val durationProps = DurationProps(duration = durationInMinutes, createdTime = createTime, createdDate = createDate)
   val password = PasswordProp(moderatorPass = moderatorPassword, viewerPass = viewerPassword)
   val recordProp = RecordProp(record = record, autoStartRecording = autoStartRecording,
     allowStartStopRecording = allowStartStopRecording)
   val welcomeProp = WelcomeProp(welcomeMsgTemplate = welcomeMsgTemplate, welcomeMsg = welcomeMsg,
     modOnlyMessage = modOnlyMessage)
-  val voiceProp = VoiceProp(telVoice = voiceConfId, webVoice = voiceConfId, dialNumber = dialNumber)
+  val voiceProp = VoiceProp(telVoice = voiceConfId, voiceConf = voiceConfId, dialNumber = dialNumber)
   val usersProp = UsersProp(maxUsers = maxUsers, webcamsOnlyForModerator = webcamsOnlyForModerator,
     guestPolicy = guestPolicy)
   val metadataProp = new MetadataProp(metadata)
 
-  val defaultProps = DefaultProps(meetingProp, durationProps, password, recordProp, welcomeProp, voiceProp,
-    usersProp, metadataProp)
+  val defaultProps = DefaultProps(meetingProp, breakoutProps, durationProps, password, recordProp, welcomeProp, voiceProp,
+    usersProp, metadataProp, screenshareProps)
 
 }
diff --git a/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/models/ChatModelTest.scala b/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/models/ChatModelTest.scala
index 9422550c070eddb25957e5dced3a1fab8f16b32b..ba039c600d4a5233cf6f5e1eae391ba06f29b584 100755
--- a/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/models/ChatModelTest.scala
+++ b/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/models/ChatModelTest.scala
@@ -6,8 +6,8 @@ import scala.collection.immutable.List
 
 class ChatModelTest extends UnitSpec with AppsTestFixtures {
 
-  val liveMeeting = new LiveMeeting(mProps,
-    chatModel, layoutModel, meetingModel, usersModel, users, registeredUsers, pollModel,
+  val liveMeeting = new LiveMeeting(defaultProps, meetingStatux2x,
+    chatModel, layoutModel, users, registeredUsers, pollModel,
     wbModel, presModel, breakoutModel, captionModel, notesModel)
 
   "A Stack" should "pop values in last-in-first-out order" in {
diff --git a/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/pubsub/sender/ReceivedJsonMsgHandlerTraitTests.scala b/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/pubsub/sender/ReceivedJsonMsgHandlerTraitTests.scala
index ecd324836970a5e9d7d899ce7d715875b57b6875..253415451d2dcf922823cae0aba641256fb95b12 100755
--- a/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/pubsub/sender/ReceivedJsonMsgHandlerTraitTests.scala
+++ b/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/pubsub/sender/ReceivedJsonMsgHandlerTraitTests.scala
@@ -1,44 +1,40 @@
 package org.bigbluebutton.core.pubsub.sender
 
 import com.fasterxml.jackson.databind.JsonDeserializer
+import org.bigbluebutton.SystemConfiguration
 import org.bigbluebutton.common2.messages.MessageBody.CreateMeetingReqMsgBody
 import org.bigbluebutton.core.{ AppsTestFixtures, UnitSpec }
 import org.bigbluebutton.common2.messages._
 import org.bigbluebutton.common2.util.JsonUtil
-import org.bigbluebutton.core.bus.{ BbbMsgRouterEventBus, ReceivedJsonMessage }
-import org.bigbluebutton.core.pubsub.senders.ReceivedJsonMsgHandlerTrait
+import org.bigbluebutton.core.bus.{ BbbMsgEvent, BbbMsgRouterEventBus, ReceivedJsonMessage }
+import org.bigbluebutton.core.pubsub.senders.ReceivedJsonMsgDeserializer
+import org.bigbluebutton.core2.ReceivedMessageRouter
 import org.mockito.Mockito._
-import org.scalatest.mock.MockitoSugar
+import org.scalatest.mockito.MockitoSugar
 
-class ReceivedJsonMsgHandlerTraitTests extends UnitSpec with AppsTestFixtures with MockitoSugar {
+class ReceivedJsonMsgHandlerTraitTests extends UnitSpec
+    with AppsTestFixtures with MockitoSugar with SystemConfiguration {
 
-  class MessageRouter(val eventBus: BbbMsgRouterEventBus) extends ReceivedJsonMsgHandlerTrait {
+  class MessageRouter(val eventBus: BbbMsgRouterEventBus) extends ReceivedMessageRouter {
 
   }
 
   "It" should "be able to decode envelope and core message" in {
-
     val mockEventBus = mock[BbbMsgRouterEventBus]
-
     val classUnderTest = new MessageRouter(mockEventBus)
-
     val routing = collection.immutable.HashMap("sender" -> "bbb-web")
     val envelope = BbbCoreEnvelope(CreateMeetingReqMsg.NAME, routing)
     val header = BbbCoreBaseHeader(CreateMeetingReqMsg.NAME)
     val body = CreateMeetingReqMsgBody(defaultProps)
     val req = CreateMeetingReqMsg(header, body)
-    val msg = BbbCommonEnvCoreMsg(envelope, req)
-    println(msg)
 
     object JsonDeserializer extends Deserializer
 
-    val receivedJson = ReceivedJsonMessage("test-channel", JsonUtil.toJson(msg))
-    for {
-      envJsonNode <- JsonDeserializer.toJBbbCommonEnvJsNodeMsg(receivedJson.data)
-    } yield classUnderTest.routeCreateMeetingReqMsg(envJsonNode.envelope, envJsonNode.core)
+    classUnderTest.send(envelope, req)
 
     // Then verify the class under test used the mock object as expected
     // The disconnect user shouldn't be called as user has ability to eject another user
-    //verify(mockEventBus, times(1)).publish()
+    val event = BbbMsgEvent(meetingManagerChannel, BbbCommonEnvCoreMsg(envelope, req))
+    verify(mockEventBus, times(1)).publish(event)
   }
 }
diff --git a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/messages/BbbCoreEnvelope.scala b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/messages/BbbCoreEnvelope.scala
index e9f4ee89f2ae4934f6c6621dc7f24014ca99ba3b..b33a9cec2b87b866ce0d4e0aa3a3229c8d7dcb2b 100755
--- a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/messages/BbbCoreEnvelope.scala
+++ b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/messages/BbbCoreEnvelope.scala
@@ -4,6 +4,8 @@ import com.fasterxml.jackson.databind.JsonNode
 import org.bigbluebutton.common2.messages.MessageBody._
 
 
+// seal trait to force all classes that extends this trait
+// to be defined in this file.
 sealed trait BbbCoreMsg
 sealed trait BbbCommonMsg
 sealed trait BbbCoreHeader
@@ -11,33 +13,39 @@ sealed trait BbbCoreHeader
 case class BbbCommonEnvCoreMsg(envelope: BbbCoreEnvelope, core: BbbCoreMsg) extends BbbCommonMsg
 case class BbbCommonEnvJsNodeMsg(envelope: BbbCoreEnvelope, core: JsonNode) extends BbbCommonMsg
 case class BbbCoreEnvelope(name: String, routing: collection.immutable.Map[String, String])
-
 case class BbbCoreBaseHeader(name: String) extends BbbCoreHeader
 case class BbbCoreHeaderWithMeetingId(name: String, meetingId: String) extends BbbCoreHeader
-
+case class BbbClientMsgHeader(name: String, meetingId: String, userId: String) extends BbbCoreHeader
 case class BbbCoreHeaderBody(header: BbbCoreHeader, body: JsonNode)
 
-
 object CreateMeetingReqMsg { val NAME = "CreateMeetingReqMsg" }
 case class CreateMeetingReqMsg(header: BbbCoreBaseHeader,
                                body: CreateMeetingReqMsgBody) extends BbbCoreMsg
-
 object MeetingCreatedEvtMsg { val NAME = "MeetingCreatedEvtMsg"}
 case class MeetingCreatedEvtMsg(header: BbbCoreBaseHeader,
                                 body: MeetingCreatedEvtBody) extends BbbCoreMsg
-
 object RegisterUserReqMsg { val NAME = "RegisterUserReqMsg" }
 case class RegisterUserReqMsg(header: BbbCoreHeaderWithMeetingId,
                               body: RegisterUserReqMsgBody) extends BbbCoreMsg
-
 object ValidateAuthTokenReqMsg { val NAME = "ValidateAuthTokenReqMsg" }
 case class ValidateAuthTokenReqMsg(header: BbbCoreHeaderWithMeetingId,
                                    body: ValidateAuthTokenReqMsgBody) extends BbbCoreMsg
-
 object ValidateAuthTokenRespMsg { val NAME = "ValidateAuthTokenRespMsg" }
-case class ValidateAuthTokenRespMsg(header: BbbCoreHeaderWithMeetingId,
+case class ValidateAuthTokenRespMsg(header: BbbClientMsgHeader,
                                     body: ValidateAuthTokenRespMsgBody) extends BbbCoreMsg
 
+object UserJoinReqMsg { val NAME = "UserJoinReqMsg" }
+case class UserJoinReqMsg(header: BbbClientMsgHeader, body: UserJoinReqMsgBody) extends BbbCoreMsg
+
+object UserLeaveReqMsg { val NAME = "UserLeaveReqMsg" }
+case class UserLeaveReqMsg(header: BbbClientMsgHeader, body: UserLeaveReqMsgBody) extends BbbCoreMsg
+
+object GetUsersReqMsg { val NAME = "GetUsersReqMsg" }
+case class GetUsersReqMsg(header: BbbClientMsgHeader, body: GetUsersReqMsgBody) extends BbbCoreMsg
+
+object UserShareWebcamMsg { val NAME = "UserShareWebcamMsg" }
+case class UserShareWebcamMsg(header: BbbClientMsgHeader, body: UserShareWebcamMsgBody)
+
 case class AkkaAppsCheckAliveReqBody(timestamp: Long)
 case class AkkaAppsCheckAliveReqMsg(header: BbbCoreHeader, body: AkkaAppsCheckAliveReqBody)
 case class AkkaAppsCheckAliveReq(envelope: BbbCoreEnvelope, msg: AkkaAppsCheckAliveReqMsg) extends BbbCoreMsg
diff --git a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/messages/Deserializer.scala b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/messages/Deserializer.scala
index ed42ace58923cfdf5b12b06446269b9a44db4d1e..def47b98bc501bf5b7beea5a3f38085af51be8ab 100755
--- a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/messages/Deserializer.scala
+++ b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/messages/Deserializer.scala
@@ -9,34 +9,36 @@ import scala.util.{Failure, Success, Try}
 
 trait Deserializer {
 
-  def toJBbbCommonEnvJsNodeMsg(json: String): Option[BbbCommonEnvJsNodeMsg] = {
-    def convertFromJson(json: String): Try[BbbCommonEnvJsNodeMsg] = {
+  def toBbbCommonMsg[V](jsonNode: JsonNode)(implicit m: Manifest[V]): Try[V] = {
+    val json = JsonUtil.toJson(jsonNode)
+    for {
+      msg <- fromJson[V](json)
+    } yield msg
+  }
+
+  def toBbbCommonEnvJsNodeMsg(json: String): Try[BbbCommonEnvJsNodeMsg] = {
       for {
-        msg <- Try(fromJson[BbbCommonEnvJsNodeMsg](json))
+        msg <- fromJson[BbbCommonEnvJsNodeMsg](json)
       } yield msg
-    }
-
-    convertFromJson(json) match {
-      case Success(msg) => Some(msg)
-      case Failure(ex) => println(s"************ Problem deserializing json: ${json}")
-        println(s"************* Exception deserializing json: ${ex.getMessage}")
-        None
-
-    }
   }
 
   def toCreateMeetingReqMsg(envelope: BbbCoreEnvelope, jsonNode: JsonNode): Option[CreateMeetingReqMsg] = {
     def convertFromJson(json: String): Try[CreateMeetingReqMsg] = {
       for {
-        msg <- Try(fromJson[CreateMeetingReqMsg](json))
+        msg <- fromJson[CreateMeetingReqMsg](json)
       } yield msg
     }
 
     val json = JsonUtil.toJson(jsonNode)
 
-    convertFromJson(json) match {
+    val result = for {
+      result <- convertFromJson(json)
+    } yield result
+
+
+    result match {
       case Success(msg) => Some(msg)
-      case Failure(ex) => println(s"************ Problem deserializing json: ${json}")
+      case Failure(ex) => println(s"************ Problem deserializing json: ${jsonNode}")
         println(s"*********** Exception deserializing json: ${ex.getMessage}")
         None
     }
@@ -45,15 +47,20 @@ trait Deserializer {
   def toValidateAuthTokenReqMsg(envelope: BbbCoreEnvelope, jsonNode: JsonNode): Option[ValidateAuthTokenReqMsg] = {
     def convertFromJson(json: String): Try[ValidateAuthTokenReqMsg] = {
       for {
-        msg <- Try(fromJson[ValidateAuthTokenReqMsg](json))
+        msg <- fromJson[ValidateAuthTokenReqMsg](json)
       } yield msg
     }
 
     val json = JsonUtil.toJson(jsonNode)
 
-    convertFromJson(json) match {
+    val result = for {
+      result <- convertFromJson(json)
+    } yield result
+
+
+    result match {
       case Success(msg) => Some(msg)
-      case Failure(ex) => println(s"************ Problem deserializing json: ${json}")
+      case Failure(ex) => println(s"************ Problem deserializing json: ${jsonNode}")
         println(s"*********** Exception deserializing json: ${ex.getMessage}")
         None
     }
@@ -62,15 +69,19 @@ trait Deserializer {
   def toMeetingCreatedEvtMsg(envelope: BbbCoreEnvelope, jsonNode: JsonNode): Option[MeetingCreatedEvtMsg] = {
     def convertFromJson(json: String): Try[MeetingCreatedEvtMsg] = {
       for {
-        msg <- Try(fromJson[MeetingCreatedEvtMsg](json))
+        msg <- fromJson[MeetingCreatedEvtMsg](json)
       } yield msg
     }
 
     val json = JsonUtil.toJson(jsonNode)
 
-    convertFromJson(json) match {
+    val result = for {
+      result <- convertFromJson(json)
+    } yield result
+
+    result match {
       case Success(msg) => Some(msg)
-      case Failure(ex) => println(s"************ Problem deserializing json: ${json}")
+      case Failure(ex) => println(s"************ Problem deserializing json: ${jsonNode}")
         println(s"*********** Exception deserializing json: ${ex.getMessage}")
         None
     }
@@ -79,15 +90,19 @@ trait Deserializer {
   def toRegisterUserReqMsg(envelope: BbbCoreEnvelope, jsonNode: JsonNode): Option[RegisterUserReqMsg] = {
     def convertFromJson(json: String): Try[RegisterUserReqMsg] = {
       for {
-        msg <- Try(fromJson[RegisterUserReqMsg](json))
+        msg <- fromJson[RegisterUserReqMsg](json)
       } yield msg
     }
 
     val json = JsonUtil.toJson(jsonNode)
 
-    convertFromJson(json) match {
+    val result = for {
+      result <- convertFromJson(json)
+    } yield result
+
+    result match {
       case Success(msg) => Some(msg)
-      case Failure(ex) => println(s"************ Problem deserializing json: ${json}")
+      case Failure(ex) => println(s"************ Problem deserializing json: ${jsonNode}")
         println(s"*********** Exception deserializing json: ${ex.getMessage}")
         None
     }
diff --git a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/messages/MessageBody.scala b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/messages/MessageBody.scala
index 17f94dc74f91e7471cde4cbc6ea2e7ab71ae413e..63ea6a1444998f2f1cd0d0e0ccd0ad9be910f795 100755
--- a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/messages/MessageBody.scala
+++ b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/messages/MessageBody.scala
@@ -10,4 +10,18 @@ object MessageBody {
                                     extUserId: String, authToken: String, avatarURL: String,
                                     guest: Boolean, authed: Boolean)
   case class ValidateAuthTokenRespMsgBody(userId: String, authToken: String, valid: Boolean)
+  case class UserJoinReqMsgBody(userId: String, authToken: String)
+  case class UserLeaveReqMsgBody(userId: String, sessionId: String)
+  case class GetUsersReqMsgBody(requesterId: String)
+  case class UserEmojiStatusChangeReqMsgBody(userId: String, emoji: String)
+  case class EjectUserFromMeetingReqMsgBody(userId: String, requesterId: String)
+  case class UserShareWebcamMsgBody(userId: String, stream: String)
+  case class UserUnshareWebcamMsgBody(userId: String, stream: String)
+  case class ChangeUserStatusReqMsgBody(userId: String, status: String, value: String)
+  case class ChangeUserRoleReqMsgBody(userId: String, role: String)
+  case class AssignPresenterReqMsgBody(userId: String, requesterId: String)
+  case class SetRecordingReqMsgBody(recording: Boolean, requesterId: String)
+  case class GetRecordingStatusReqMsgBody(requesterId: String)
+  case class AllowUserToShareDesktopReqMsgBody(userId: String)
+
 }
diff --git a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/util/JsonUtil.scala b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/util/JsonUtil.scala
index 52f68a17f33a6d662a6c0abbf8ebe61d81e1a552..dd648a418fb4c8af17bd290d054a6c0da2527bfe 100755
--- a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/util/JsonUtil.scala
+++ b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/util/JsonUtil.scala
@@ -5,6 +5,8 @@ import com.fasterxml.jackson.module.scala.DefaultScalaModule
 import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper
 import com.fasterxml.jackson.annotation.JsonInclude
 
+import scala.util.Try
+
 
 object JsonUtil {
   val mapper = new ObjectMapper() with ScalaObjectMapper
@@ -21,17 +23,18 @@ object JsonUtil {
     mapper.writeValueAsString(value)
   }
 
-  def toMap[V](json: String)(implicit m: Manifest[V]) = fromJson[Map[String, V]](json)
+  def toMap[V](json: String)(implicit m: Manifest[V]): Try[Map[String, V]] = {
+    fromJson[Map[String, V]](json)
+  }
+
+  def fromJson[T](json: String)(implicit m: Manifest[T]): Try[T] = {
+    for {
+      result <- Try(mapper.readValue[T](json))
+    } yield result
 
-  def fromJson[T](json: String)(implicit m: Manifest[T]): T = {
-    mapper.readValue[T](json)
   }
 
-  def toJsonNode(json: String): JsonNode = {
+  def toJsonNode(json: String): Try[JsonNode] = {
     fromJson[JsonNode](json)
   }
-
-
-
-
 }
diff --git a/bbb-common-message/src/test/scala/org/bigbluebutton/common2/TestFixtures.scala b/bbb-common-message/src/test/scala/org/bigbluebutton/common2/TestFixtures.scala
index a519898dc60ad856dcf2c3bb6880213678eb9fb4..d2a42e7dffe3c62f49da15b23c8f54b205409559 100755
--- a/bbb-common-message/src/test/scala/org/bigbluebutton/common2/TestFixtures.scala
+++ b/bbb-common-message/src/test/scala/org/bigbluebutton/common2/TestFixtures.scala
@@ -30,17 +30,19 @@ trait TestFixtures {
 
   val meetingProp = MeetingProp(name = meetingName, extId = externalMeetingId, intId = meetingId,
     isBreakout = isBreakout.booleanValue())
-  val durationProps = DurationProps(duration = durationInMinutes, createdTime = createTime)
+  val breakoutProps = BreakoutProps(parentId = parentMeetingId, sequence = sequence, breakoutRooms = Vector())
+  val durationProps = DurationProps(duration = durationInMinutes, createdTime = createTime, createdDate = createDate)
   val password = PasswordProp(moderatorPass = moderatorPassword, viewerPass = viewerPassword)
   val recordProp = RecordProp(record = record, autoStartRecording = autoStartRecording,
     allowStartStopRecording = allowStartStopRecording)
   val welcomeProp = WelcomeProp(welcomeMsgTemplate = welcomeMsgTemplate, welcomeMsg = welcomeMsg,
     modOnlyMessage = modOnlyMessage)
-  val voiceProp = VoiceProp(telVoice = voiceConfId, webVoice = voiceConfId, dialNumber = dialNumber)
+  val voiceProp = VoiceProp(telVoice = voiceConfId, voiceConf = voiceConfId, dialNumber = dialNumber)
   val usersProp = UsersProp(maxUsers = maxUsers, webcamsOnlyForModerator = webcamsOnlyForModerator,
     guestPolicy = guestPolicy)
   val metadataProp = new MetadataProp(metadata)
-
-  val defaultProps = DefaultProps(meetingProp, durationProps, password, recordProp, welcomeProp, voiceProp,
-    usersProp, metadataProp)
+  val screenshareProps = ScreenshareProps(screenshareConf = "FixMe!", red5ScreenshareIp = "fixMe!",
+    red5ScreenshareApp = "fixMe!")
+  val defaultProps = DefaultProps(meetingProp, breakoutProps, durationProps, password, recordProp, welcomeProp, voiceProp,
+    usersProp, metadataProp, screenshareProps)
 }
diff --git a/bbb-common-message/src/test/scala/org/bigbluebutton/common2/messages/DeserializerTests.scala b/bbb-common-message/src/test/scala/org/bigbluebutton/common2/messages/DeserializerTests.scala
index 17f20e2cf587129abeee506ea81e33ed9b4a14a4..50770dd2979c55c5104d6a7cdb761be260c6034d 100755
--- a/bbb-common-message/src/test/scala/org/bigbluebutton/common2/messages/DeserializerTests.scala
+++ b/bbb-common-message/src/test/scala/org/bigbluebutton/common2/messages/DeserializerTests.scala
@@ -1,9 +1,12 @@
 package org.bigbluebutton.common2.messages
 
 import com.fasterxml.jackson.databind.JsonNode
+import org.bigbluebutton.common2.messages.MessageBody.CreateMeetingReqMsgBody
 import org.bigbluebutton.common2.util.JsonUtil
 import org.bigbluebutton.common2.{TestFixtures, UnitSpec2}
 
+import scala.util.{Failure, Success}
+
 
 class DeserializerTests extends UnitSpec2 with TestFixtures {
 
@@ -19,11 +22,13 @@ class DeserializerTests extends UnitSpec2 with TestFixtures {
     println(msg)
     assert(msg.envelope.name == CreateMeetingReqMsg.NAME)
     assert(msg.core.isInstanceOf[CreateMeetingReqMsg])
-    val map = Deserializer.toJBbbCommonEnvJsNodeMsg(JsonUtil.toJson(msg))
+    val json = JsonUtil.toJson(msg)
+    println(json)
+    val map = Deserializer.toBbbCommonEnvJsNodeMsg(json)
     println(map)
     map match {
-      case Some(envJsNodeMsg) => assert(envJsNodeMsg.core.isInstanceOf[JsonNode])
-      case None => fail("Failed to decode json message")
+      case Success(envJsNodeMsg) => assert(envJsNodeMsg.core.isInstanceOf[JsonNode])
+      case Failure(ex) => fail("Failed to decode json message " + ex)
     }
   }
 
@@ -37,20 +42,43 @@ class DeserializerTests extends UnitSpec2 with TestFixtures {
     println(msg)
     assert(msg.envelope.name == CreateMeetingReqMsg.NAME)
     assert(msg.core.isInstanceOf[CreateMeetingReqMsg])
-    val map = Deserializer.toJBbbCommonEnvJsNodeMsg(JsonUtil.toJson(msg))
+    val map = Deserializer.toBbbCommonEnvJsNodeMsg(JsonUtil.toJson(msg))
     println(map)
 
     map match {
-      case Some(envJsNodeMsg) => assert(envJsNodeMsg.core.isInstanceOf[JsonNode])
+      case Success(envJsNodeMsg) => assert(envJsNodeMsg.core.isInstanceOf[JsonNode])
         val createMeetingReqMsg = Deserializer.toCreateMeetingReqMsg(envJsNodeMsg.envelope, envJsNodeMsg.core)
         createMeetingReqMsg match {
           case Some(cmrq) => assert(cmrq.isInstanceOf[CreateMeetingReqMsg])
           case None => fail("Failed to decode CreateMeetingReqMsg")
         }
-      case None => fail("Failed to decode json message")
+      case Failure(ex) => fail("Failed to decode json message " + ex)
     }
+  }
 
+  "It" should "be able to decode BbbCoreMsg" in {
+    val routing = collection.immutable.HashMap("sender" -> "bbb-web")
+    val envelope = BbbCoreEnvelope(CreateMeetingReqMsg.NAME, routing)
+    val header = BbbCoreBaseHeader(CreateMeetingReqMsg.NAME)
+    val body = CreateMeetingReqMsgBody(defaultProps)
+    val req = CreateMeetingReqMsg(header, body)
+    val msg = BbbCommonEnvCoreMsg(envelope, req)
+    println(msg)
+    assert(msg.envelope.name == CreateMeetingReqMsg.NAME)
+    assert(msg.core.isInstanceOf[CreateMeetingReqMsg])
 
+    val map = Deserializer.toBbbCommonEnvJsNodeMsg(JsonUtil.toJson(msg))
+    println(map)
 
+    map match {
+      case Success(envJsNodeMsg) => assert(envJsNodeMsg.core.isInstanceOf[JsonNode])
+        val createMeetingReqMsg = Deserializer.toBbbCommonMsg[CreateMeetingReqMsg](envJsNodeMsg.envelope, envJsNodeMsg.core)
+        createMeetingReqMsg match {
+          case Success(cmrq) => assert(cmrq.isInstanceOf[CreateMeetingReqMsg])
+          case Failure(ex) => fail("Failed to decode CreateMeetingReqMsg " + ex)
+        }
+      case Failure(ex) => fail("Failed to decode json message " + ex)
+    }
   }
+
 }
diff --git a/bbb-common-message/src/test/scala/org/bigbluebutton/common2/util/JsonUtilTest.scala b/bbb-common-message/src/test/scala/org/bigbluebutton/common2/util/JsonUtilTest.scala
index 91b858a2820dd7a6ad1397671543c36edab4592d..f701a432de2a92dc520fe585b4b17ec5b00d13ae 100755
--- a/bbb-common-message/src/test/scala/org/bigbluebutton/common2/util/JsonUtilTest.scala
+++ b/bbb-common-message/src/test/scala/org/bigbluebutton/common2/util/JsonUtilTest.scala
@@ -5,6 +5,9 @@ import org.bigbluebutton.common2.messages._
 
 import scala.collection.immutable.List
 import com.fasterxml.jackson.databind.JsonNode
+import org.bigbluebutton.common2.messages.MessageBody.ValidateAuthTokenReqMsgBody
+
+import scala.util.{Failure, Success}
 
 
 case class Person(name: String, age: Int)
@@ -22,9 +25,9 @@ class JsonUtilTest extends UnitSpec2 with TestFixtures {
     val map = JsonUtil.toMap[Seq[Int]](json)
     // map: Map[String,Seq[Int]] = Map(a -> List(1, 2), b -> List(3, 4, 5), c -> List())
     println(map)
-    map.get("a") match {
-      case Some(a) => assert(a.length == 2)
-      case None => fail("Failed to decode json message")
+    map match {
+      case Success(a) => assert(a.values.size == 3)
+      case Failure(ex) => fail("Failed to decode json message")
     }
   }
 
@@ -50,8 +53,7 @@ class JsonUtilTest extends UnitSpec2 with TestFixtures {
 
   "JsonUtil" should "unmarshall a ValidateAuthTokenReq" in {
     val header: BbbCoreHeaderWithMeetingId = new BbbCoreHeaderWithMeetingId("foo", "mId")
-    val body: ValidateAuthTokenReqMsgBody = new ValidateAuthTokenReqMsgBody(meetingId = "mId", userId = "uId", token = "myToken",
-      replyTo = "replyHere", sessionId = "mySessionId")
+    val body: ValidateAuthTokenReqMsgBody = new ValidateAuthTokenReqMsgBody(userId = "uId", authToken = "myToken")
     val msg: ValidateAuthTokenReqMsg = new ValidateAuthTokenReqMsg(header, body)
     val json = JsonUtil.toJson(msg)
     println(json)
@@ -80,13 +82,24 @@ class JsonUtilTest extends UnitSpec2 with TestFixtures {
       """.stripMargin
 
     val finalMsg = JsonUtil.fromJson[FooNode](jsonMsg)
-    val finalMsg2 = JsonUtil.fromJson[ValidateAuthTokenReqMsg](JsonUtil.toJson(finalMsg))
+
+    val json = JsonUtil.toJson(finalMsg)
+
+    val finalMsg2 = for {
+      result <- JsonUtil.fromJson[ValidateAuthTokenReqMsg](json)
+    } yield result
+
     println(finalMsg2)
     val map = JsonUtil.toMap[Map[String, Any]](jsonMsg)
-    for {
-      header <- map.get("header")
-      meetingId <- header.get("meetingId")
-    } yield println(meetingId)
+    map match {
+      case Success(m) =>
+        for {
+          header <- m.get("header")
+          meetingId <- header.get("meetingId")
+        } yield println(meetingId)
+      case Failure(ex) => fail("Failed to convert message.")
+    }
+
   }
 }