From 17a39a674fdbd1bbc2dd6dabdb1bc783888100bd Mon Sep 17 00:00:00 2001
From: Richard Alam <ritzalam@gmail.com>
Date: Wed, 10 Jun 2015 15:53:07 +0000
Subject: [PATCH]  - create a common message project

---
 bbb-common-message/.gitignore                 |  57 ++-
 bbb-common-message/build.sbt                  |  77 ++++
 bbb-common-message/project/Build.scala        |   0
 bbb-common-message/project/build.properties   |   1 +
 bbb-common-message/project/plugins.sbt        |   8 +
 .../AssignPresenterRequestMessage.java        |  63 +++
 .../messages/BbbAppsIsAliveMessage.java       |  53 +++
 .../messages/BroadcastLayoutMessage.java      |  80 ++++
 .../BroadcastLayoutRequestMessage.java        |  61 +++
 .../common/messages/ChatKeyUtil.java          |  13 +
 .../messages/ClearWhiteboardReplyMessage.java |  59 +++
 .../ClearWhiteboardRequestMessage.java        |  58 +++
 .../common/messages/Constants.java            | 130 ++++++
 .../common/messages/CreateMeetingMessage.java |  37 ++
 .../messages/DestroyMeetingMessage.java       |  12 +
 .../messages/DisconnectAllUsersMessage.java   |  47 ++
 .../messages/DisconnectUserMessage.java       |  51 +++
 ...ctAllUsersFromVoiceConfRequestMessage.java |  56 +++
 .../EjectUserFromMeetingRequestMessage.java   |  61 +++
 .../EjectUserFromVoiceConfRequestMessage.java |  62 +++
 .../EjectUserFromVoiceRequestMessage.java     |  63 +++
 .../EnableWhiteboardRequestMessage.java       |  58 +++
 .../common/messages/EndMeetingMessage.java    |  12 +
 .../messages/GetAllMeetingsRequest.java       |  12 +
 .../common/messages/GetChatHistory.java       |  57 +++
 .../messages/GetChatHistoryReplyMessage.java  |  65 +++
 .../GetChatHistoryRequestMessage.java         |  56 +++
 .../GetCurrentLayoutReplyMessage.java         |  74 +++
 .../GetCurrentLayoutRequestMessage.java       |  55 +++
 .../messages/GetLockSettingsMessage.java      |  52 +++
 .../messages/GetPresentationInfoMessage.java  |  58 +++
 .../GetPresentationInfoReplyMessage.java      |  72 +++
 .../GetRecordingStatusReplyMessage.java       |  59 +++
 .../GetRecordingStatusRequestMessage.java     |  54 +++
 .../common/messages/GetSlideInfoMessage.java  |  58 +++
 .../GetUsersFromVoiceConfRequestMessage.java  |  56 +++
 .../common/messages/GetUsersReplyMessage.java |  65 +++
 .../messages/GetUsersRequestMessage.java      |  53 +++
 .../GetWhiteboardShapesReplyMessage.java      |  71 +++
 .../common/messages/GoToSlideMessage.java     |  53 +++
 .../common/messages/IPublishedMessage.java    |   5 +
 .../common/messages/ISubscribedMessage.java   |   5 +
 .../messages/InitAudioSettingsMessage.java    |  57 +++
 .../InitPermissionsSettingMessage.java        |  60 +++
 .../messages/IsMeetingMutedReplyMessage.java  |  63 +++
 .../IsMeetingMutedRequestMessage.java         |  57 +++
 .../IsWhiteboardEnabledReplyMessage.java      |  59 +++
 .../IsWhiteboardEnabledRequestMessage.java    |  59 +++
 .../common/messages/KeepAliveMessage.java     |  12 +
 .../common/messages/LockLayoutMessage.java    |  74 +++
 .../messages/LockLayoutRequestMessage.java    |  75 ++++
 .../messages/LockMuteUserRequestMessage.java  |  69 +++
 .../common/messages/LockUserMessage.java      |  63 +++
 .../common/messages/MeetingEndedMessage.java  |  48 ++
 .../messages/MeetingHasEndedMessage.java      |  48 ++
 .../common/messages/MeetingMutedMessage.java  |  53 +++
 .../common/messages/MeetingStateMessage.java  |  66 +++
 .../common/messages/MessageBuilder.java       |  36 ++
 .../messages/MessageFromJsonConverter.java    |  88 ++++
 .../common/messages/MessagingConstants.java   |  66 +++
 .../MuteAllExceptPresenterRequestMessage.java |  63 +++
 .../messages/MuteAllRequestMessage.java       |  63 +++
 .../MuteUserInVoiceConfRequestMessage.java    |  68 +++
 .../messages/MuteUserRequestMessage.java      |  69 +++
 .../messages/MuteVoiceUserRequestMessage.java |  69 +++
 .../NewPermissionsSettingMessage.java         |  68 +++
 .../messages/PresentationRemovedMessage.java  |  56 +++
 .../messages/PresenterAssignedMessage.java    |  64 +++
 .../RecordVoiceConfRequestMessage.java        |  62 +++
 .../RecordingStatusChangedMessage.java        |  59 +++
 .../common/messages/RegisterUserMessage.java  |  73 +++
 .../messages/RemovePresentationMessage.java   |  53 +++
 ...eboardAnnotationHistoryRequestMessage.java |  64 +++
 .../messages/ResizeAndMoveSlideMessage.java   |  68 +++
 .../SendConversionCompletedMessage.java       |  79 ++++
 .../messages/SendConversionUpdateMessage.java |  70 +++
 .../messages/SendCursorUpdateMessage.java     |  58 +++
 .../messages/SendLockSettingsMessage.java     |  91 ++++
 .../messages/SendPageCountErrorMessage.java   |  80 ++++
 .../messages/SendPrivateChatMessage.java      | 115 +++++
 .../messages/SendPublicChatMessage.java       | 115 +++++
 .../messages/SendSlideGeneratedMessage.java   |  80 ++++
 .../SendWhiteboardAnnotationReplyMessage.java |  71 +++
 ...endWhiteboardAnnotationRequestMessage.java |  61 +++
 .../SetRecordingStatusRequestMessage.java     |  59 +++
 .../messages/SetUserStatusRequestMessage.java |  64 +++
 .../messages/SharePresentationMessage.java    |  59 +++
 ...StartRecordingVoiceConfRequestMessage.java |  56 +++
 .../StopRecordingVoiceConfRequestMessage.java |  62 +++
 .../messages/UndoWhiteboardReplyMessage.java  |  68 +++
 .../messages/UndoWhiteboardRequest.java       |  58 +++
 .../messages/UserConnectedToGlobalAudio.java  |  59 +++
 .../UserDisconnectedFromGlobalAudio.java      |  57 +++
 .../common/messages/UserJoinedMessage.java    |  59 +++
 .../messages/UserJoinedVoiceConfMessage.java  |  87 ++++
 .../messages/UserJoinedVoiceMessage.java      |  66 +++
 .../common/messages/UserLeavingMessage.java   |  52 +++
 .../common/messages/UserLeftMessage.java      |  59 +++
 .../messages/UserLeftVoiceConfMessage.java    |  56 +++
 .../common/messages/UserLeftVoiceMessage.java |  66 +++
 .../messages/UserListeningOnlyMessage.java    |  59 +++
 .../UserLockedInVoiceConfMessage.java         |  62 +++
 .../common/messages/UserLockedMessage.java    |  59 +++
 .../messages/UserLoweredHandMessage.java      |  64 +++
 .../messages/UserMutedInVoiceConfMessage.java |  62 +++
 .../messages/UserRaisedHandMessage.java       |  59 +++
 .../UserShareWebcamRequestMessage.java        |  59 +++
 .../messages/UserSharedWebcamMessage.java     |  59 +++
 .../messages/UserStatusChangedMessage.java    |  65 +++
 .../UserTalkingInVoiceConfMessage.java        |  62 +++
 .../UserUnshareWebcamRequestMessage.java      |  59 +++
 .../messages/UserUnsharedWebcamMessage.java   |  59 +++
 .../messages/UserVoiceMutedMessage.java       |  66 +++
 .../messages/UserVoiceTalkingMessage.java     |  66 +++
 .../bigbluebutton/common/messages/Util.java   | 425 ++++++++++++++++++
 .../messages/ValidateAuthTokenMessage.java    |  69 +++
 .../ValidateAuthTokenReplyMessage.java        |  69 +++
 .../ValidateAuthTokenTimeoutMessage.java      |  69 +++
 .../VoiceConfRecordingStartedMessage.java     |  69 +++
 119 files changed, 7416 insertions(+), 3 deletions(-)
 create mode 100755 bbb-common-message/build.sbt
 create mode 100755 bbb-common-message/project/Build.scala
 create mode 100755 bbb-common-message/project/build.properties
 create mode 100755 bbb-common-message/project/plugins.sbt
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/AssignPresenterRequestMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/BbbAppsIsAliveMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/BroadcastLayoutMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/BroadcastLayoutRequestMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ChatKeyUtil.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ClearWhiteboardReplyMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ClearWhiteboardRequestMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/Constants.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/CreateMeetingMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/DestroyMeetingMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/DisconnectAllUsersMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/DisconnectUserMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/EjectAllUsersFromVoiceConfRequestMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/EjectUserFromMeetingRequestMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/EjectUserFromVoiceConfRequestMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/EjectUserFromVoiceRequestMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/EnableWhiteboardRequestMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/EndMeetingMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetAllMeetingsRequest.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetChatHistory.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetChatHistoryReplyMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetChatHistoryRequestMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetCurrentLayoutReplyMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetCurrentLayoutRequestMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetLockSettingsMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetPresentationInfoMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetPresentationInfoReplyMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetRecordingStatusReplyMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetRecordingStatusRequestMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetSlideInfoMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetUsersFromVoiceConfRequestMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetUsersReplyMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetUsersRequestMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetWhiteboardShapesReplyMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GoToSlideMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/IPublishedMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ISubscribedMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/InitAudioSettingsMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/InitPermissionsSettingMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/IsMeetingMutedReplyMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/IsMeetingMutedRequestMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/IsWhiteboardEnabledReplyMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/IsWhiteboardEnabledRequestMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/KeepAliveMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/LockLayoutMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/LockLayoutRequestMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/LockMuteUserRequestMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/LockUserMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MeetingEndedMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MeetingHasEndedMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MeetingMutedMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MeetingStateMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MessageBuilder.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MessageFromJsonConverter.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MessagingConstants.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MuteAllExceptPresenterRequestMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MuteAllRequestMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MuteUserInVoiceConfRequestMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MuteUserRequestMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MuteVoiceUserRequestMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/NewPermissionsSettingMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PresentationRemovedMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PresenterAssignedMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/RecordVoiceConfRequestMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/RecordingStatusChangedMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/RegisterUserMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/RemovePresentationMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/RequestWhiteboardAnnotationHistoryRequestMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ResizeAndMoveSlideMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendConversionCompletedMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendConversionUpdateMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendCursorUpdateMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendLockSettingsMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendPageCountErrorMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendPrivateChatMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendPublicChatMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendSlideGeneratedMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendWhiteboardAnnotationReplyMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendWhiteboardAnnotationRequestMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SetRecordingStatusRequestMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SetUserStatusRequestMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SharePresentationMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/StartRecordingVoiceConfRequestMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/StopRecordingVoiceConfRequestMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UndoWhiteboardReplyMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UndoWhiteboardRequest.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserConnectedToGlobalAudio.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserDisconnectedFromGlobalAudio.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserJoinedMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserJoinedVoiceConfMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserJoinedVoiceMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLeavingMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLeftMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLeftVoiceConfMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLeftVoiceMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserListeningOnlyMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLockedInVoiceConfMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLockedMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLoweredHandMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserMutedInVoiceConfMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserRaisedHandMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserShareWebcamRequestMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserSharedWebcamMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserStatusChangedMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserTalkingInVoiceConfMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserUnshareWebcamRequestMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserUnsharedWebcamMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserVoiceMutedMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserVoiceTalkingMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/Util.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ValidateAuthTokenMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ValidateAuthTokenReplyMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ValidateAuthTokenTimeoutMessage.java
 create mode 100755 bbb-common-message/src/main/java/org/bigbluebutton/common/messages/VoiceConfRecordingStartedMessage.java

diff --git a/bbb-common-message/.gitignore b/bbb-common-message/.gitignore
index dbcfa68725..82f02806ec 100644
--- a/bbb-common-message/.gitignore
+++ b/bbb-common-message/.gitignore
@@ -1,5 +1,56 @@
-.classpath
+.DS_Store
+._.DS_Store*
+.metadata
 .project
+.classpath
 .settings
-bin
-build
+.history
+.worksheet
+gen
+**/*.swp
+**/*~.nib
+**/build/
+**/*.pbxuser
+**/*.perspective
+**/*.perspectivev3
+*.xcworkspace
+*.xcuserdatad
+**/target
+target
+*.iml
+project/*.ipr
+project/*.iml
+project/*.iws
+project/out
+project/*/target
+project/target
+project/*/bin
+project/*/build
+project/*.iml
+project/*/*.iml
+project/.idea
+project/.idea/*
+.idea
+.idea/*
+.idea/**/*
+.DS_Store
+project/.DS_Store
+project/*/.DS_Store
+tm.out
+tmlog*.log
+*.tm*.epoch
+out/
+provisioning/.vagrant
+provisioning/*/.vagrant
+provisioning/*/*.known
+/sbt/akka-patterns-store/
+/daemon/src/build/
+*.lock
+log/
+tmp/
+build/
+akka-patterns-store/
+lib_managed/
+.cache
+bin/
+
diff --git a/bbb-common-message/build.sbt b/bbb-common-message/build.sbt
new file mode 100755
index 0000000000..a69f9aedf9
--- /dev/null
+++ b/bbb-common-message/build.sbt
@@ -0,0 +1,77 @@
+
+
+name := "bbb-common-message"
+
+organization := "org.bigbluebutton"
+
+version := "0.0.1"
+
+// We want to have our jar files in lib_managed dir.
+// This way we'll have the right path when we import
+// into eclipse.
+retrieveManaged := true
+
+testOptions in Test += Tests.Argument(TestFrameworks.Specs2, "html", "console", "junitxml")
+
+testOptions in Test += Tests.Argument(TestFrameworks.ScalaTest, "-h", "target/scalatest-reports")
+
+libraryDependencies ++= {
+  Seq(
+	  "com.google.code.gson"      %  "gson"              % "1.7.1"
+	)}
+
+seq(Revolver.settings: _*)
+
+//-----------
+// Packaging
+//
+// Reference:
+// http://xerial.org/blog/2014/03/24/sbt/
+// http://www.scala-sbt.org/sbt-pgp/usage.html
+// http://www.scala-sbt.org/0.13/docs/Using-Sonatype.html
+// http://central.sonatype.org/pages/requirements.html
+// http://central.sonatype.org/pages/releasing-the-deployment.html
+//-----------
+
+// Build pure Java lib (i.e. without scala)
+// Do not append Scala versions to the generated artifacts
+crossPaths := false
+
+// This forbids including Scala related libraries into the dependency
+autoScalaLibrary := false
+
+
+publishTo := Some(Resolver.file("file",  new File(Path.userHome.absolutePath+"/dev/repo/maven-repo/releases" )) )
+
+publishTo := {
+  val nexus = "https://oss.sonatype.org/"
+  if (isSnapshot.value)
+    Some("snapshots" at nexus + "content/repositories/snapshots")
+  else
+    Some("releases"  at nexus + "service/local/staging/deploy/maven2")
+}
+
+// Enables publishing to maven repo
+publishMavenStyle := true
+
+publishArtifact in Test := false
+
+pomIncludeRepository := { _ => false }
+
+pomExtra := (
+  <scm>
+    <url>git@github.com:bigbluebutton/bigbluebutton.git</url>
+    <connection>scm:git:git@github.com:bigbluebutton/bigbluebutton.git</connection>
+  </scm>
+  <developers>
+    <developer>
+      <id>ritzalam</id>
+      <name>Richard Alam</name>
+      <url>http://www.bigbluebutton.org</url>
+    </developer>
+  </developers>)
+  
+licenses := Seq("LGPL-3.0" -> url("http://opensource.org/licenses/LGPL-3.0"))
+
+homepage := Some(url("http://www.bigbluebutton.org"))
+  
\ No newline at end of file
diff --git a/bbb-common-message/project/Build.scala b/bbb-common-message/project/Build.scala
new file mode 100755
index 0000000000..e69de29bb2
diff --git a/bbb-common-message/project/build.properties b/bbb-common-message/project/build.properties
new file mode 100755
index 0000000000..a6e117b610
--- /dev/null
+++ b/bbb-common-message/project/build.properties
@@ -0,0 +1 @@
+sbt.version=0.13.8
diff --git a/bbb-common-message/project/plugins.sbt b/bbb-common-message/project/plugins.sbt
new file mode 100755
index 0000000000..d33e342247
--- /dev/null
+++ b/bbb-common-message/project/plugins.sbt
@@ -0,0 +1,8 @@
+addSbtPlugin("io.spray" % "sbt-revolver" % "0.7.2")
+
+addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "2.2.0")
+
+addSbtPlugin("com.jsuereth" % "sbt-pgp" % "1.0.0")
+
+
+
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/AssignPresenterRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/AssignPresenterRequestMessage.java
new file mode 100755
index 0000000000..891e36bcbb
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/AssignPresenterRequestMessage.java
@@ -0,0 +1,63 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class AssignPresenterRequestMessage implements IPublishedMessage {
+	public static final String ASSIGN_PRESENTER_REQUEST = "assign_presenter_request_message";
+	public final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	public final String newPresenterId;
+	public final String newPresenterName;
+	public final String assignedBy;
+
+	public AssignPresenterRequestMessage(String meetingID, String newPresenterId, String newPresenterName, String assignedBy) {
+		this.meetingId = meetingID;
+		this.newPresenterId = newPresenterId;
+		this.newPresenterName = newPresenterName;
+		this.assignedBy = assignedBy;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+		payload.put(Constants.NEW_PRESENTER_ID, newPresenterId);
+		payload.put(Constants.NEW_PRESENTER_NAME, newPresenterName);
+		payload.put(Constants.ASSIGNED_BY, assignedBy);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(ASSIGN_PRESENTER_REQUEST, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static AssignPresenterRequestMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (ASSIGN_PRESENTER_REQUEST.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID)
+							&& payload.has(Constants.NEW_PRESENTER_ID)
+							&& payload.has(Constants.NEW_PRESENTER_NAME)
+							&& payload.has(Constants.ASSIGNED_BY)) {
+						String meetingId = payload.get(Constants.MEETING_ID).getAsString();
+						String newPresenterId = payload.get(Constants.NEW_PRESENTER_ID).getAsString();
+						String newPresenterName = payload.get(Constants.NEW_PRESENTER_NAME).getAsString();
+						String assignedBy = payload.get(Constants.ASSIGNED_BY).getAsString();
+
+						return new 	AssignPresenterRequestMessage(meetingId, newPresenterId, newPresenterName, assignedBy);					
+					}
+				}
+			}
+		}
+
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/BbbAppsIsAliveMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/BbbAppsIsAliveMessage.java
new file mode 100755
index 0000000000..aebe68c3f8
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/BbbAppsIsAliveMessage.java
@@ -0,0 +1,53 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class BbbAppsIsAliveMessage implements ISubscribedMessage {
+	public static final String BBB_APPS_IS_ALIVE = "bbb_apps_is_alive_message";
+	public static final String VERSION = "0.0.1";
+
+	public static final String TIMESTAMP = "timestamp";	
+	public static final String STARTED_ON = "started_on";
+	
+	public final Long timestamp;
+	public final Long startedOn;
+
+	public BbbAppsIsAliveMessage(Long startedOn, Long timestamp) {
+		this.startedOn = startedOn;
+		this.timestamp = timestamp;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(TIMESTAMP, timestamp);
+		payload.put(STARTED_ON, timestamp);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(BBB_APPS_IS_ALIVE, VERSION, null);
+		return MessageBuilder.buildJson(header, payload);
+	}
+
+	public static BbbAppsIsAliveMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (BBB_APPS_IS_ALIVE.equals(messageName)) {
+
+					if (payload.has(TIMESTAMP) && payload.has(STARTED_ON)) {
+						Long timestamp = payload.get(TIMESTAMP).getAsLong();
+						Long startedOn = payload.get(STARTED_ON).getAsLong();
+						return new BbbAppsIsAliveMessage(startedOn, timestamp);
+					}
+				}
+			}
+		}
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/BroadcastLayoutMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/BroadcastLayoutMessage.java
new file mode 100755
index 0000000000..1aaf863f5c
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/BroadcastLayoutMessage.java
@@ -0,0 +1,80 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class BroadcastLayoutMessage implements ISubscribedMessage {
+	public static final String BROADCAST_LAYOUT  = "broadcast_layout_message";
+	public static final String VERSION = "0.0.1";
+	
+	public static final String SET_BY_USERID = "set_by_userid";
+	public static final String LAYOUT = "layout";
+	public static final String LOCKED = "locked";
+	public static final String USERS = "users";
+	
+	public final String meetingId;
+	public final String setByUserid;
+	public final String layout;
+	public final Boolean locked;
+	public final ArrayList<String> users;
+	
+	public BroadcastLayoutMessage(String meetingId, String setByUserid, String layout, Boolean locked, ArrayList<String> users) {
+		this.meetingId = meetingId;
+		this.setByUserid = setByUserid;
+		this.layout = layout;
+		this.locked = locked;
+		this.users = users;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId); 
+		payload.put(SET_BY_USERID, setByUserid);
+		payload.put(LAYOUT, layout);
+		payload.put(LOCKED, locked);
+		payload.put(USERS, users);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(BROADCAST_LAYOUT, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static BroadcastLayoutMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (BROADCAST_LAYOUT.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(LOCKED)
+							&& payload.has(SET_BY_USERID)
+							&& payload.has(USERS)
+							&& payload.has(LAYOUT)) {
+						String id = payload.get(Constants.MEETING_ID).getAsString();
+						String setByUserid = payload.get(SET_BY_USERID).getAsString();
+						String layout = payload.get(LAYOUT).getAsString();
+						Boolean locked = payload.get(LOCKED).getAsBoolean();
+						JsonArray usersArr = (JsonArray) payload.get(USERS);
+						
+						Util util = new Util();
+						
+						ArrayList<String> users = util.extractUserids(usersArr);
+						return new BroadcastLayoutMessage(id, setByUserid, layout, locked, users);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/BroadcastLayoutRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/BroadcastLayoutRequestMessage.java
new file mode 100755
index 0000000000..2aaa198cce
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/BroadcastLayoutRequestMessage.java
@@ -0,0 +1,61 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class BroadcastLayoutRequestMessage implements ISubscribedMessage {
+	public static final String BROADCAST_LAYOUT_REQUEST  = "broadcast_layout_request_message";
+	public static final String VERSION = "0.0.1";
+	
+	public final static String LAYOUT = "layout";
+	
+	public final String meetingId;
+	public final String userId;
+	public final String layout;
+	
+	public BroadcastLayoutRequestMessage(String meetingId, String userId, String layout) {
+		this.meetingId = meetingId;
+		this.userId = userId;
+		this.layout = layout;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId); 
+		payload.put(Constants.USER_ID, userId);
+		payload.put(LAYOUT, layout);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(BROADCAST_LAYOUT_REQUEST, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static BroadcastLayoutRequestMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (BROADCAST_LAYOUT_REQUEST.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.USER_ID)
+							&& payload.has(LAYOUT)) {
+						String id = payload.get(Constants.MEETING_ID).getAsString();
+						String userid = payload.get(Constants.USER_ID).getAsString();
+						String layout = payload.get(LAYOUT).getAsString();
+						return new BroadcastLayoutRequestMessage(id, userid, layout);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ChatKeyUtil.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ChatKeyUtil.java
new file mode 100755
index 0000000000..97d1f403f6
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ChatKeyUtil.java
@@ -0,0 +1,13 @@
+package org.bigbluebutton.common.messages;
+
+public class ChatKeyUtil {
+	public static final String CHAT_TYPE = "chatType";
+	public static final String FROM_USERID = "fromUserID";
+	public static final String FROM_USERNAME = "fromUsername";
+	public static final String FROM_COLOR = "fromColor";
+	public static final String FROM_TIME = "fromTime";
+	public static final String FROM_TZ_OFFSET = "fromTimezoneOffset";
+	public static final String TO_USERID = "toUserID";
+	public static final String TO_USERNAME = "toUsername";
+	public static final String MESSAGE = "message";
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ClearWhiteboardReplyMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ClearWhiteboardReplyMessage.java
new file mode 100755
index 0000000000..85fc4053b2
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ClearWhiteboardReplyMessage.java
@@ -0,0 +1,59 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class ClearWhiteboardReplyMessage implements ISubscribedMessage {
+
+	public static final String WHITEBOARD_CLEARED_MESSAGE = "whiteboard_cleared_message";
+	public static final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	public final String whiteboardId;
+	public final String requesterId;
+
+
+	public ClearWhiteboardReplyMessage(String meetingId, String requesterId, String whiteboardId) {
+		this.meetingId = meetingId;
+		this.whiteboardId = whiteboardId;
+		this.requesterId = requesterId;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+		payload.put(Constants.WHITEBOARD_ID, whiteboardId);
+		payload.put(Constants.REQUESTER_ID, requesterId);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(WHITEBOARD_CLEARED_MESSAGE, VERSION, null);
+		return MessageBuilder.buildJson(header, payload);
+	}
+
+	public static ClearWhiteboardReplyMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (WHITEBOARD_CLEARED_MESSAGE.equals(messageName)) {
+
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.WHITEBOARD_ID)
+							&& payload.has(Constants.REQUESTER_ID)) {
+						String meetingId = payload.get(Constants.MEETING_ID).getAsString();
+						String whiteboardId = payload.get(Constants.WHITEBOARD_ID).getAsString();
+						String requesterId = payload.get(Constants.REQUESTER_ID).getAsString();
+
+						return new ClearWhiteboardReplyMessage(meetingId, requesterId, whiteboardId);
+					}
+				}
+			}
+		}
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ClearWhiteboardRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ClearWhiteboardRequestMessage.java
new file mode 100755
index 0000000000..494578c1ec
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ClearWhiteboardRequestMessage.java
@@ -0,0 +1,58 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class ClearWhiteboardRequestMessage implements ISubscribedMessage {
+	public static final String CLEAR_WHITEBOARD_REQUEST = "clear_whiteboard_request";
+	public static final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	public final String whiteboardId;
+	public final String requesterId;
+
+
+	public ClearWhiteboardRequestMessage(String meetingId, String requesterId, String whiteboardId) {
+		this.meetingId = meetingId;
+		this.whiteboardId = whiteboardId;
+		this.requesterId = requesterId;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+		payload.put(Constants.WHITEBOARD_ID, whiteboardId);
+		payload.put(Constants.REQUESTER_ID, requesterId);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(CLEAR_WHITEBOARD_REQUEST, VERSION, null);
+		return MessageBuilder.buildJson(header, payload);
+	}
+
+	public static ClearWhiteboardRequestMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (CLEAR_WHITEBOARD_REQUEST.equals(messageName)) {
+
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.WHITEBOARD_ID)
+							&& payload.has(Constants.REQUESTER_ID)) {
+						String meetingId = payload.get(Constants.MEETING_ID).getAsString();
+						String whiteboardId = payload.get(Constants.WHITEBOARD_ID).getAsString();
+						String requesterId = payload.get(Constants.REQUESTER_ID).getAsString();
+
+						return new ClearWhiteboardRequestMessage(meetingId, requesterId, whiteboardId);
+					}
+				}
+			}
+		}
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/Constants.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/Constants.java
new file mode 100755
index 0000000000..381453eb9d
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/Constants.java
@@ -0,0 +1,130 @@
+package org.bigbluebutton.common.messages;
+
+public class Constants {
+  public static final String NAME                            = "name";
+  public static final String HEADER                          = "header";
+  public static final String PAYLOAD                         = "payload";
+  public static final String MEETING_ID                      = "meeting_id";
+  public static final String EXTERNAL_MEETING_ID             = "external_meeting_id";
+  public static final String TIMESTAMP                       = "timestamp";
+  public static final String USER_ID                         = "userid";
+  public static final String RECORDED                        = "recorded";
+  public static final String MEETING_NAME                    = "meeting_name";
+  public static final String MEETING_MUTED                   = "meetingMuted";
+  public static final String VOICE_CONF                      = "voice_conf";
+  public static final String DURATION                        = "duration";
+  public static final String AUTH_TOKEN                      = "auth_token";
+  public static final String ROLE                            = "role";
+  public static final String EXT_USER_ID                     = "external_user_id";
+  public static final String EXTERN_USERID                  = "extern_userid";
+  public static final String REQUESTER_ID                    = "requester_id";
+  public static final String REPLY_TO                        = "reply_to";
+  public static final String LOWERED_BY                      = "lowered_by";
+  public static final String STREAM                          = "stream";
+  public static final String LOCKED                          = "locked";
+  public static final String SETTINGS                        = "settings";
+  public static final String LOCK                            = "lock";
+  public static final String EXCEPT_USERS                    = "except_users";
+  public static final String STATUS                          = "status";
+  public static final String VALUE                           = "value";
+  public static final String NEW_PRESENTER_ID                = "new_presenter_id";
+  public static final String NEW_PRESENTER_NAME              = "new_presenter_name";
+  public static final String ASSIGNED_BY                     = "assigned_by";
+  public static final String RECORDING                       = "recording";
+  public static final String AUTO_START_RECORDING            = "auto_start_recording";
+  public static final String ALLOW_START_STOP_RECORDING      = "allow_start_stop_recording";
+  public static final String LAYOUT_ID                       = "layout_id";
+  public static final String LISTENONLY                      = "listenOnly";
+  public static final String LISTEN_ONLY                     = "listen_only";
+  public static final String POLL                            = "poll";
+  public static final String POLL_ID                         = "poll_id";
+  public static final String FORCE                           = "force";
+  public static final String RESPONSE                        = "response";
+  public static final String PRESENTATION_ID                 = "presentation_id";
+  public static final String X_OFFSET                        = "x_offset";
+  public static final String Y_OFFSET                        = "y_offset";
+  public static final String WIDTH_RATIO                     = "width_ratio";
+  public static final String HEIGHT_RATIO                    = "height_ratio";
+  public static final String PAGE                            = "page";
+  public static final String SHARE                           = "share";
+  public static final String PRESENTATIONS                   = "presentations";
+  public static final String MESSAGE_KEY                     = "message_key";
+  public static final String CODE                            = "code";
+  public static final String PRESENTATION_NAME               = "presentation_name";
+  public static final String NUM_PAGES                       = "num_pages";
+  public static final String MAX_NUM_PAGES                   = "max_num_pages";
+  public static final String PAGES_COMPLETED                 = "pages_completed";
+  public static final String MUTE                            = "mute";
+  public static final String CALLER_ID_NUM                   = "caller_id_num";
+  public static final String CALLER_ID_NAME                  = "caller_id_name";
+  public static final String CALLERNUM                       = "callernum";
+  public static final String CALLERNAME                      = "callername";
+  public static final String TALKING                         = "talking";
+  public static final String USER                            = "user";
+  public static final String MUTED                           = "muted";
+  public static final String VOICE_USER                      = "voice_user";
+  public static final String VOICEUSER                      = "voiceUser";
+  public static final String RECORDING_FILE                  = "recording_file";
+  public static final String ANNOTATION                      = "annotation";
+  public static final String WHITEBOARD_ID                   = "whiteboard_id";
+  public static final String ENABLE                          = "enable";
+  public static final String PRESENTER                       = "presenter";
+  public static final String USERS                           = "users";
+  public static final String RAISE_HAND                      = "raise_hand";
+  public static final String HAS_STREAM                      = "has_stream";
+  public static final String WEBCAM_STREAM                   = "webcam_stream";
+  public static final String PHONE_USER                      = "phone_user"; 
+  public static final String PERMISSIONS                     = "permissions";
+  public static final String VALID                           = "valid";
+  public static final String CHAT_HISTORY                    = "chat_history";
+  public static final String MESSAGE                         = "message";
+  public static final String SET_BY_USER_ID                  = "set_by_user_id";
+  public static final String POLLS                           = "polls";
+  public static final String REASON                          = "reason";
+  public static final String RESPONDER                       = "responder";
+  public static final String PRESENTATION_INFO               = "presentation_info";
+  public static final String SHAPES                          = "shapes"; 
+  public static final String SHAPE                           = "shape";
+  public static final String SHAPE_ID                        = "shape_id";    
+  public static final String PRESENTATION                    = "presentation";
+  public static final String ID                              = "id";
+  public static final String CURRENT                         = "current";
+  public static final String PAGES                           = "pages";
+  public static final String WEB_USER_ID                     = "web_user_id";
+  public static final String WEB_USERID                      = "web_userid";
+  public static final String JOINED                          = "joined";
+  public static final String X_PERCENT                       = "x_percent";
+  public static final String Y_PERCENT                       = "y_percent";
+  public static final String KEEP_ALIVE_ID                   = "keep_alive_id";
+  public static final String INTERNAL_USER_ID                = "internal_user_id";
+  public static final String MODERATOR_PASS                  = "moderator_pass";
+  public static final String VIEWER_PASS                     = "viewer_pass";
+  public static final String CREATE_TIME                     = "create_time";
+  public static final String CREATE_DATE                     = "create_date";
+  public static final String PRESENTATION_BASE_URL           = "presentation_base_url";
+  public static final String DISABLE_CAMERA                  = "disable_camera";
+  public static final String LOCK_ON_JOIN_CONFIGURABLE       = "lock_on_join_configurable";
+  public static final String DISABLE_MICROPHONE              = "disable_microphone";
+  public static final String DISABLE_PRIVATE_CHAT            = "disable_private_chat";
+  public static final String DISABLE_PUBLIC_CHAT             = "disable_public_chat";
+  public static final String LOCK_ON_JOIN                    = "lock_on_join";
+  public static final String LOCKED_LAYOUT                   = "locked_layout";
+  public static final String CHAT_TYPE                       = "chat_type";
+  public static final String TO_USERNAME                     = "to_username";
+  public static final String FROM_USERNAME                   = "from_username";
+  public static final String FROM_USERID                     = "from_userid";
+  public static final String FROM_TZ_OFFSET                  = "from_tz_offset";
+  public static final String FROM_COLOR                      = "from_color";
+  public static final String TO_USERID                       = "to_userid";
+  public static final String FROM_TIME                       = "from_time";
+  public static final String PERM_DISABLE_CAM                = "disableCam";
+  public static final String PERM_DISABLE_MIC                = "disableMic";
+  public static final String PERM_DISABLE_PRIVCHAT           = "disablePrivChat";
+  public static final String PERM_DISABLE_PUBCHAT            = "disablePubChat";
+  public static final String PERM_LOCKED_LAYOUT              = "lockedLayout";
+  public static final String PERM_LOCK_ON_JOIN               = "lockOnJoin";
+  public static final String PERM_LOCK_ON_JOIN_CONFIG        = "lockOnJoinConfigurable";
+  public static final String ENABLED                         = "enabled";
+}
+
+
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/CreateMeetingMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/CreateMeetingMessage.java
new file mode 100755
index 0000000000..461c0d283f
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/CreateMeetingMessage.java
@@ -0,0 +1,37 @@
+package org.bigbluebutton.common.messages;
+
+public class CreateMeetingMessage implements IPublishedMessage {
+	public static final String CREATE_MEETING_REQUEST_EVENT  = "create_meeting_request";
+	public static final String VERSION = "0.0.1";
+	
+	public final String id;
+	public final String externalId;
+	public final String name;
+	public final Boolean record;
+	public final String voiceBridge;
+	public final Long duration;
+	public final Boolean autoStartRecording;
+	public final Boolean allowStartStopRecording;
+	public final String moderatorPass;
+	public final String viewerPass;
+	public final Long createTime;
+	public final String createDate;
+	
+	public CreateMeetingMessage(String id, String externalId, String name, Boolean record, String voiceBridge, 
+			                        Long duration, Boolean autoStartRecording, 
+			                        Boolean allowStartStopRecording, String moderatorPass,
+			                        String viewerPass, Long createTime, String createDate) {
+		this.id = id;
+		this.externalId = externalId;
+		this.name = name;
+		this.record = record;
+		this.voiceBridge = voiceBridge;
+		this.duration = duration;	
+		this.autoStartRecording = autoStartRecording;
+		this.allowStartStopRecording = allowStartStopRecording;
+		this.moderatorPass = moderatorPass;
+		this.viewerPass = viewerPass;
+		this.createTime = createTime;
+		this.createDate = createDate;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/DestroyMeetingMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/DestroyMeetingMessage.java
new file mode 100755
index 0000000000..4e040e4f4b
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/DestroyMeetingMessage.java
@@ -0,0 +1,12 @@
+package org.bigbluebutton.common.messages;
+
+public class DestroyMeetingMessage implements IPublishedMessage {
+	public static final String DESTROY_MEETING_REQUEST_EVENT  = "destroy_meeting_request_event";
+	public static final String VERSION = "0.0.1";
+	
+	public final String meetingId;
+	
+	public DestroyMeetingMessage(String meetingId) {
+		this.meetingId = meetingId;
+	}	
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/DisconnectAllUsersMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/DisconnectAllUsersMessage.java
new file mode 100755
index 0000000000..b95f3ad719
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/DisconnectAllUsersMessage.java
@@ -0,0 +1,47 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class DisconnectAllUsersMessage implements IPublishedMessage {
+	public static final String DISCONNECT_All_USERS = "disconnect_all_users_message";
+	public final String VERSION = "0.0.1";
+
+	public final String meetingId;
+
+	public DisconnectAllUsersMessage(String meetingID) {
+		this.meetingId = meetingID;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(DISCONNECT_All_USERS, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	public static DisconnectAllUsersMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (DISCONNECT_All_USERS.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID)) {
+						String meetingId = payload.get(Constants.MEETING_ID).getAsString();
+
+						return new 	DisconnectAllUsersMessage(meetingId);					
+					}
+				}
+			}
+		}
+
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/DisconnectUserMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/DisconnectUserMessage.java
new file mode 100755
index 0000000000..4d21a7e51f
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/DisconnectUserMessage.java
@@ -0,0 +1,51 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class DisconnectUserMessage implements IPublishedMessage {
+	public static final String DISCONNECT_USER = "disconnect_user_message";
+	public final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	public final String userId;
+
+	public DisconnectUserMessage(String meetingID, String userId) {
+		this.meetingId = meetingID;
+		this.userId = userId;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(DISCONNECT_USER, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	public static DisconnectUserMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (DISCONNECT_USER.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID)
+							&& payload.has(Constants.USER_ID)) {
+						String meetingId = payload.get(Constants.MEETING_ID).getAsString();
+						String userId = payload.get(Constants.USER_ID).getAsString();
+
+						return new 	DisconnectUserMessage(meetingId, userId);					
+					}
+				}
+			}
+		}
+
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/EjectAllUsersFromVoiceConfRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/EjectAllUsersFromVoiceConfRequestMessage.java
new file mode 100755
index 0000000000..28ba956a06
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/EjectAllUsersFromVoiceConfRequestMessage.java
@@ -0,0 +1,56 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class EjectAllUsersFromVoiceConfRequestMessage {
+	public static final String EJECT_ALL_VOICE_USERS_REQUEST  = "eject_all_users_from_voice_conf_request_message";
+	public static final String VERSION = "0.0.1";
+	
+	public static final String MEETING_ID = "meeting_id";
+	public static final String VOICE_CONF_ID = "voice_conf_id";
+	
+	public final String meetingId;
+	public final String voiceConfId;
+
+	public EjectAllUsersFromVoiceConfRequestMessage(String meetingId, String voiceConfId) {
+		this.meetingId = meetingId;
+		this.voiceConfId = voiceConfId;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(MEETING_ID, meetingId); 
+		payload.put(VOICE_CONF_ID, voiceConfId);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(EJECT_ALL_VOICE_USERS_REQUEST, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static EjectAllUsersFromVoiceConfRequestMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (EJECT_ALL_VOICE_USERS_REQUEST.equals(messageName)) {
+					if (payload.has(MEETING_ID) 
+							&& payload.has(VOICE_CONF_ID)) {
+						String id = payload.get(MEETING_ID).getAsString();
+						String voiceConfId = payload.get(VOICE_CONF_ID).getAsString();
+						return new EjectAllUsersFromVoiceConfRequestMessage(id, voiceConfId);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/EjectUserFromMeetingRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/EjectUserFromMeetingRequestMessage.java
new file mode 100755
index 0000000000..3476aec138
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/EjectUserFromMeetingRequestMessage.java
@@ -0,0 +1,61 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class EjectUserFromMeetingRequestMessage implements ISubscribedMessage {
+	public static final String EJECT_USER_FROM_MEETING_REQUEST  = "eject_user_from_meeting_request_message";
+	public static final String VERSION = "0.0.1";
+	
+	public final String meetingId;
+	public final String userId;
+	public final String ejectedBy;
+	
+	private static final String EJECTED_BY = "ejected_by";
+	
+	public EjectUserFromMeetingRequestMessage(String meetingId, String userId, String ejectedBy) {
+		this.meetingId = meetingId;
+		this.userId = userId;
+		this.ejectedBy = ejectedBy;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId); 
+		payload.put(Constants.USER_ID, userId);
+		payload.put(EJECTED_BY, ejectedBy);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(EJECT_USER_FROM_MEETING_REQUEST, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static EjectUserFromMeetingRequestMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (EJECT_USER_FROM_MEETING_REQUEST.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.USER_ID)
+							&& payload.has(EJECTED_BY)) {
+						String id = payload.get(Constants.MEETING_ID).getAsString();
+						String userid = payload.get(Constants.USER_ID).getAsString();
+						String ejectedBy = payload.get(EJECTED_BY).getAsString();
+						return new EjectUserFromMeetingRequestMessage(id, userid, ejectedBy);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/EjectUserFromVoiceConfRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/EjectUserFromVoiceConfRequestMessage.java
new file mode 100755
index 0000000000..d9fd401687
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/EjectUserFromVoiceConfRequestMessage.java
@@ -0,0 +1,62 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class EjectUserFromVoiceConfRequestMessage {
+	public static final String EJECT_VOICE_USER_REQUEST  = "eject_user_from_voice_conf_request_message";
+	public static final String VERSION = "0.0.1";
+	
+	public static final String MEETING_ID = "meeting_id";
+	public static final String VOICE_CONF_ID = "voice_conf_id";
+	public static final String VOICE_USER_ID = "voice_user_id";
+	
+	public final String meetingId;
+	public final String voiceConfId;
+	public final String voiceUserId;
+
+	public EjectUserFromVoiceConfRequestMessage(String meetingId, String voiceConfId, String voiceUserId) {
+		this.meetingId = meetingId;
+		this.voiceConfId = voiceConfId;
+		this.voiceUserId = voiceUserId;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(MEETING_ID, meetingId); 
+		payload.put(VOICE_CONF_ID, voiceConfId);
+		payload.put(VOICE_USER_ID, voiceUserId);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(EJECT_VOICE_USER_REQUEST, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static EjectUserFromVoiceConfRequestMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (EJECT_VOICE_USER_REQUEST.equals(messageName)) {
+					if (payload.has(MEETING_ID) 
+							&& payload.has(VOICE_CONF_ID)
+							&& payload.has(VOICE_USER_ID)) {
+						String id = payload.get(MEETING_ID).getAsString();
+						String voiceConfId = payload.get(VOICE_CONF_ID).getAsString();
+						String voiceUserId = payload.get(VOICE_USER_ID).getAsString();
+						return new EjectUserFromVoiceConfRequestMessage(id, voiceConfId, voiceUserId);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/EjectUserFromVoiceRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/EjectUserFromVoiceRequestMessage.java
new file mode 100755
index 0000000000..e3715ad2cd
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/EjectUserFromVoiceRequestMessage.java
@@ -0,0 +1,63 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class EjectUserFromVoiceRequestMessage implements ISubscribedMessage {
+	public static final String EJECT_USER_FROM_VOICE_REQUEST  = "eject_user_from_voice_request_message";
+	public static final String VERSION = "0.0.1";
+	
+	public static final String MEETING_ID = "meeting_id";
+	public static final String REQUESTER_ID = "requester_id";
+	public static final String USER_ID = "user_id";
+	
+	public final String meetingId;
+	public final String requesterId;
+	public final String userId;
+
+	public EjectUserFromVoiceRequestMessage(String meetingId, String requesterId, String userId) {
+		this.meetingId = meetingId;
+		this.requesterId = requesterId;
+		this.userId = userId;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(MEETING_ID, meetingId); 
+		payload.put(REQUESTER_ID, requesterId);
+		payload.put(USER_ID, userId);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(EJECT_USER_FROM_VOICE_REQUEST, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static EjectUserFromVoiceRequestMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (EJECT_USER_FROM_VOICE_REQUEST.equals(messageName)) {
+					if (payload.has(MEETING_ID) 
+							&& payload.has(REQUESTER_ID)
+							&& payload.has(USER_ID)) {
+						String id = payload.get(MEETING_ID).getAsString();
+						String requesterId = payload.get(REQUESTER_ID).getAsString();
+						String userId = payload.get(USER_ID).getAsString();
+						return new EjectUserFromVoiceRequestMessage(id, requesterId, userId);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/EnableWhiteboardRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/EnableWhiteboardRequestMessage.java
new file mode 100755
index 0000000000..cbc38364d4
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/EnableWhiteboardRequestMessage.java
@@ -0,0 +1,58 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class EnableWhiteboardRequestMessage implements ISubscribedMessage {
+	public static final String ENABLE_WHITEBOARD_REQUEST = "enable_whiteboard_request";
+	public static final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	public final String requesterId;
+	public final boolean enable;
+
+	public EnableWhiteboardRequestMessage(String meetingId,
+			String requesterId, boolean enable) {
+		this.meetingId = meetingId;
+		this.requesterId = requesterId;
+		this.enable = enable;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+		payload.put(Constants.REQUESTER_ID, requesterId);
+		payload.put(Constants.ENABLE, enable);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(ENABLE_WHITEBOARD_REQUEST, VERSION, null);
+		return MessageBuilder.buildJson(header, payload);
+	}
+
+	public static EnableWhiteboardRequestMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (ENABLE_WHITEBOARD_REQUEST.equals(messageName)) {
+
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.ENABLE)
+							&& payload.has(Constants.REQUESTER_ID)) {
+						String meetingId = payload.get(Constants.MEETING_ID).getAsString();
+						String requesterId = payload.get(Constants.REQUESTER_ID).getAsString();
+						boolean enable = payload.get(Constants.ENABLE).getAsBoolean();
+
+						return new EnableWhiteboardRequestMessage(meetingId, requesterId, enable);
+					}
+				}
+			}
+		}
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/EndMeetingMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/EndMeetingMessage.java
new file mode 100755
index 0000000000..f2aa8d2df9
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/EndMeetingMessage.java
@@ -0,0 +1,12 @@
+package org.bigbluebutton.common.messages;
+
+public class EndMeetingMessage implements IPublishedMessage {
+	public static final String END_MEETING_REQUEST_EVENT  = "end_meeting_request_event";
+	public static final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	
+	public EndMeetingMessage(String meetingId) {
+		this.meetingId = meetingId;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetAllMeetingsRequest.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetAllMeetingsRequest.java
new file mode 100755
index 0000000000..f4d321f357
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetAllMeetingsRequest.java
@@ -0,0 +1,12 @@
+package org.bigbluebutton.common.messages;
+
+public class GetAllMeetingsRequest implements IPublishedMessage {
+	public static final String GET_ALL_MEETINGS_REQUEST_EVENT  = "get_all_meetings_request";
+	public static final String VERSION = "0.0.1";
+
+	public final String meetingId;
+
+	public GetAllMeetingsRequest(String meetingId) {
+		this.meetingId = meetingId;
+	}
+}
\ No newline at end of file
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetChatHistory.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetChatHistory.java
new file mode 100755
index 0000000000..d034eb4c1d
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetChatHistory.java
@@ -0,0 +1,57 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class GetChatHistory implements IPublishedMessage {
+	public static final String GET_CHAT_HISTORY_REQUEST = "get_chat_history_request";
+	public static final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	public final String replyTo;
+	public final String requesterId;
+
+
+	public GetChatHistory(String meetingId, String requesterId, String replyTo) {
+		this.meetingId = meetingId;
+		this.replyTo = replyTo;
+		this.requesterId = requesterId;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+		payload.put(Constants.REPLY_TO, replyTo);
+		payload.put(Constants.REQUESTER_ID, requesterId);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(GET_CHAT_HISTORY_REQUEST, VERSION, null);
+		return MessageBuilder.buildJson(header, payload);
+	}
+
+	public static GetChatHistory fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (GET_CHAT_HISTORY_REQUEST.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.REPLY_TO)
+							&& payload.has(Constants.REQUESTER_ID)) {
+						String meetingId = payload.get(Constants.MEETING_ID).getAsString();
+						String replyTo = payload.get(Constants.REPLY_TO).getAsString();
+						String requesterId = payload.get(Constants.REQUESTER_ID).getAsString();
+						return new GetChatHistory(meetingId, replyTo, requesterId);
+					}
+				} 
+			}
+		}
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetChatHistoryReplyMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetChatHistoryReplyMessage.java
new file mode 100755
index 0000000000..b7a4203cfc
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetChatHistoryReplyMessage.java
@@ -0,0 +1,65 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class GetChatHistoryReplyMessage implements ISubscribedMessage {
+	public static final String GET_CHAT_HISTORY_REPLY = "get_chat_history_reply";
+	public static final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	public final String requesterId;
+	public final ArrayList<Map<String, Object>> chatHistory;
+
+
+	public GetChatHistoryReplyMessage(String meetingId, String requesterId, ArrayList<Map<String, Object>> chatHistory) {
+		this.meetingId = meetingId;
+		this.chatHistory = chatHistory;
+		this.requesterId = requesterId;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+		payload.put(Constants.CHAT_HISTORY, chatHistory);
+		payload.put(Constants.REQUESTER_ID, requesterId);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(GET_CHAT_HISTORY_REPLY, VERSION, null);
+		return MessageBuilder.buildJson(header, payload);
+	}
+
+	public static GetChatHistoryReplyMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (GET_CHAT_HISTORY_REPLY.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.CHAT_HISTORY)
+							&& payload.has(Constants.REQUESTER_ID)) {
+						String meetingId = payload.get(Constants.MEETING_ID).getAsString();
+						String requesterId = payload.get(Constants.REQUESTER_ID).getAsString();
+
+						JsonArray history = (JsonArray) payload.get(Constants.CHAT_HISTORY);
+
+						Util util = new Util();
+
+						ArrayList<Map<String, Object>> chatHistory = util.extractChatHistory(history);
+
+						return new GetChatHistoryReplyMessage(meetingId, requesterId, chatHistory);
+					}
+				} 
+			}
+		}
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetChatHistoryRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetChatHistoryRequestMessage.java
new file mode 100755
index 0000000000..646e9a990d
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetChatHistoryRequestMessage.java
@@ -0,0 +1,56 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+public class GetChatHistoryRequestMessage implements IPublishedMessage {
+	public static final String GET_CHAT_HISTORY_REQUEST = "get_chat_history_request";
+	public static final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	public final String replyTo;
+	public final String requesterId;
+
+
+	public GetChatHistoryRequestMessage(String meetingId, String requesterId, String replyTo) {
+		this.meetingId = meetingId;
+		this.replyTo = replyTo;
+		this.requesterId = requesterId;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+		payload.put(Constants.REPLY_TO, replyTo);
+		payload.put(Constants.REQUESTER_ID, requesterId);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(GET_CHAT_HISTORY_REQUEST, VERSION, null);
+		return MessageBuilder.buildJson(header, payload);
+	}
+
+	public static GetChatHistoryRequestMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (GET_CHAT_HISTORY_REQUEST.equals(messageName)) {
+
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.REPLY_TO)
+							&& payload.has(Constants.REQUESTER_ID)) {
+						String meetingId = payload.get(Constants.MEETING_ID).getAsString();
+						String replyTo = payload.get(Constants.REPLY_TO).getAsString();
+						String requesterId = payload.get(Constants.REQUESTER_ID).getAsString();
+
+						return new GetChatHistoryRequestMessage(meetingId, replyTo, requesterId);
+					}
+				} 
+			}
+		}
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetCurrentLayoutReplyMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetCurrentLayoutReplyMessage.java
new file mode 100755
index 0000000000..d14fe7cc19
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetCurrentLayoutReplyMessage.java
@@ -0,0 +1,74 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class GetCurrentLayoutReplyMessage implements ISubscribedMessage {
+	public static final String GET_CURRENT_LAYOUT_REPLY  = "get_current_layout_reply_message";
+	public static final String VERSION = "0.0.1";
+	
+	public static final String SET_BY_USERID = "set_by_userid";
+	public static final String REQUESTED_BY_USERID = "requested_by_userid";
+	public static final String LAYOUT = "layout";
+	public static final String LOCKED = "locked";
+	
+	public final String meetingId;
+	public final String requestedByUserid;
+	public final String setByUserid;
+	public final String layout;
+	public final Boolean locked;
+	
+	public GetCurrentLayoutReplyMessage(String meetingId, String requestedByUserid, String setByUserid, String layout, Boolean locked) {
+		this.meetingId = meetingId;
+		this.requestedByUserid = requestedByUserid;
+		this.setByUserid = setByUserid;
+		this.layout = layout;
+		this.locked = locked;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId); 
+		payload.put(REQUESTED_BY_USERID, requestedByUserid);
+		payload.put(SET_BY_USERID, setByUserid);
+		payload.put(LAYOUT, layout);
+		payload.put(LOCKED, locked);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(GET_CURRENT_LAYOUT_REPLY, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static GetCurrentLayoutReplyMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (GET_CURRENT_LAYOUT_REPLY.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(REQUESTED_BY_USERID)
+							&& payload.has(SET_BY_USERID)
+							&& payload.has(LOCKED)
+							&& payload.has(LAYOUT)) {
+						String id = payload.get(Constants.MEETING_ID).getAsString();
+						String requestedByUserid = payload.get(REQUESTED_BY_USERID).getAsString();
+						String setByUserid = payload.get(SET_BY_USERID).getAsString();
+						String layout = payload.get(LAYOUT).getAsString();
+						Boolean locked = payload.get(LOCKED).getAsBoolean();
+						return new GetCurrentLayoutReplyMessage(id, requestedByUserid, setByUserid, layout, locked);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetCurrentLayoutRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetCurrentLayoutRequestMessage.java
new file mode 100755
index 0000000000..c63028ea21
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetCurrentLayoutRequestMessage.java
@@ -0,0 +1,55 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class GetCurrentLayoutRequestMessage implements ISubscribedMessage {
+	public static final String GET_CURRENT_LAYOUT_REQUEST  = "get_current_layout_request_message";
+	public static final String VERSION = "0.0.1";
+	
+	public final String meetingId;
+	public final String userId;
+
+	
+	public GetCurrentLayoutRequestMessage(String meetingId, String userId) {
+		this.meetingId = meetingId;
+		this.userId = userId;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId); 
+		payload.put(Constants.USER_ID, userId);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(GET_CURRENT_LAYOUT_REQUEST, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static GetCurrentLayoutRequestMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (GET_CURRENT_LAYOUT_REQUEST.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.USER_ID)) {
+						String id = payload.get(Constants.MEETING_ID).getAsString();
+						String userid = payload.get(Constants.USER_ID).getAsString();
+						return new GetCurrentLayoutRequestMessage(id, userid);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetLockSettingsMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetLockSettingsMessage.java
new file mode 100755
index 0000000000..6b164e75cf
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetLockSettingsMessage.java
@@ -0,0 +1,52 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class GetLockSettingsMessage implements IPublishedMessage {
+	public static final String GET_LOCK_SETTINGS = "get_lock_settings";
+	public static final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	public final String userId;
+
+	public GetLockSettingsMessage(String meetingId, String userId) {
+		this.meetingId = meetingId;
+		this.userId = userId;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+		payload.put(Constants.USER_ID, userId);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(GET_LOCK_SETTINGS, VERSION, null);
+		return MessageBuilder.buildJson(header, payload);
+	}
+
+	public static GetLockSettingsMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (GET_LOCK_SETTINGS.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.USER_ID)) {
+						String meetingId = payload.get(Constants.MEETING_ID).getAsString();
+						String userId = payload.get(Constants.USER_ID).getAsString();
+
+						return new GetLockSettingsMessage(meetingId, userId);
+					}
+				}
+			}
+		}
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetPresentationInfoMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetPresentationInfoMessage.java
new file mode 100755
index 0000000000..e25af38764
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetPresentationInfoMessage.java
@@ -0,0 +1,58 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class GetPresentationInfoMessage implements IPublishedMessage {
+	public static final String GET_PRESENTATION_INFO = "get_presentation_info";
+	public static final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	public final String requesterId;
+	public final String replyTo;
+
+	public GetPresentationInfoMessage(String meetingId, String requesterId, String replyTo) {
+		this.meetingId = meetingId;
+		this.requesterId = requesterId;
+		this.replyTo = replyTo;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+		payload.put(Constants.REQUESTER_ID, requesterId);
+		payload.put(Constants.REPLY_TO, replyTo);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(GET_PRESENTATION_INFO, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);
+	}
+
+	public static GetPresentationInfoMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (GET_PRESENTATION_INFO.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.REQUESTER_ID)
+							&& payload.has(Constants.REPLY_TO)) {
+						String meetingId = payload.get(Constants.MEETING_ID).getAsString();
+						String requesterId = payload.get(Constants.REQUESTER_ID).getAsString();
+						String replyTo = payload.get(Constants.REPLY_TO).getAsString();
+
+						return new GetPresentationInfoMessage(meetingId, requesterId, replyTo);
+					}
+				} 
+			}
+		}
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetPresentationInfoReplyMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetPresentationInfoReplyMessage.java
new file mode 100755
index 0000000000..155d28444f
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetPresentationInfoReplyMessage.java
@@ -0,0 +1,72 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class GetPresentationInfoReplyMessage implements IPublishedMessage {
+	public static final String GET_PRESENTATION_INFO_REPLY = "get_presentation_info_reply";
+	public static final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	public final String requesterId;
+	public final Map<String, Object> presenter;
+	public final ArrayList<Map<String, Object>> presentations;
+			
+	public GetPresentationInfoReplyMessage(String meetingId, String requesterId, 
+			Map<String, Object> presenter, ArrayList<Map<String, Object>> presentations) {
+		this.meetingId = meetingId;
+		this.requesterId = requesterId;
+		this.presenter = presenter;
+		this.presentations = presentations;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+		payload.put(Constants.REQUESTER_ID, requesterId);
+		payload.put(Constants.PRESENTER, presenter);
+		payload.put(Constants.PRESENTATIONS, presentations);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(GET_PRESENTATION_INFO_REPLY, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);
+	}
+
+	public static GetPresentationInfoReplyMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (GET_PRESENTATION_INFO_REPLY.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.REQUESTER_ID)
+							&& payload.has(Constants.PRESENTER)
+							&& payload.has(Constants.PRESENTATIONS)) {
+						String meetingId = payload.get(Constants.MEETING_ID).getAsString();
+						String requesterId = payload.get(Constants.REQUESTER_ID).getAsString();
+						JsonObject presenterJsonObject = payload.get(Constants.PRESENTER).getAsJsonObject();
+						
+						Util util = new Util();
+						Map<String, Object> presenter = util.extractCurrentPresenter(presenterJsonObject);
+						
+						JsonArray presentationsJsonArray = payload.get(Constants.PRESENTATIONS).getAsJsonArray();
+						ArrayList<Map<String, Object>> presentations = util.extractPresentations(presentationsJsonArray);
+						
+						return new GetPresentationInfoReplyMessage(meetingId, requesterId, presenter, presentations);
+					}
+				} 
+			}
+		}
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetRecordingStatusReplyMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetRecordingStatusReplyMessage.java
new file mode 100755
index 0000000000..319143f28d
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetRecordingStatusReplyMessage.java
@@ -0,0 +1,59 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class GetRecordingStatusReplyMessage implements ISubscribedMessage {
+	public static final String Get_RECORDING_STATUS_REPLY  = "get_recording_status_reply";
+	public static final String VERSION = "0.0.1";
+	
+	public final String meetingId;
+	public final String userId;
+	public final Boolean recording;
+
+	public GetRecordingStatusReplyMessage(String meetingId, String userId, Boolean recording) {
+		this.meetingId = meetingId;
+		this.userId = userId;
+		this.recording = recording;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId); 
+		payload.put(Constants.USER_ID, userId);
+		payload.put(Constants.RECORDING, recording);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(Get_RECORDING_STATUS_REPLY, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static GetRecordingStatusReplyMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (Get_RECORDING_STATUS_REPLY.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.USER_ID)
+							&& payload.has(Constants.RECORDING)) {
+						String id = payload.get(Constants.MEETING_ID).getAsString();
+						String userid = payload.get(Constants.USER_ID).getAsString();
+						Boolean recording = payload.get(Constants.RECORDING).getAsBoolean();
+						return new GetRecordingStatusReplyMessage(id, userid, recording);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetRecordingStatusRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetRecordingStatusRequestMessage.java
new file mode 100755
index 0000000000..ead0ae5b00
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetRecordingStatusRequestMessage.java
@@ -0,0 +1,54 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class GetRecordingStatusRequestMessage implements ISubscribedMessage {
+	public static final String GET_RECORDING_STATUS_REQUEST  = "get_recording_status_request_message";
+	public static final String VERSION = "0.0.1";
+	
+	public final String meetingId;
+	public final String userId;
+	
+	public GetRecordingStatusRequestMessage(String meetingId, String userId) {
+		this.meetingId = meetingId;
+		this.userId = userId;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId); 
+		payload.put(Constants.USER_ID, userId);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(GET_RECORDING_STATUS_REQUEST, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static GetRecordingStatusRequestMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (GET_RECORDING_STATUS_REQUEST.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.USER_ID)) {
+						String id = payload.get(Constants.MEETING_ID).getAsString();
+						String userid = payload.get(Constants.USER_ID).getAsString();
+						return new GetRecordingStatusRequestMessage(id, userid);				
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetSlideInfoMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetSlideInfoMessage.java
new file mode 100755
index 0000000000..78015ec8b4
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetSlideInfoMessage.java
@@ -0,0 +1,58 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class GetSlideInfoMessage implements IPublishedMessage {
+	public static final String GET_SLIDE_INFO = "get_slide_info";
+	public static final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	public final String requesterId;
+	public final String replyTo;
+
+	public GetSlideInfoMessage(String meetingId, String requesterId, String replyTo){
+		this.meetingId = meetingId;
+		this.requesterId = requesterId;
+		this.replyTo = replyTo;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+		payload.put(Constants.REQUESTER_ID, requesterId);
+		payload.put(Constants.REPLY_TO, replyTo);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(GET_SLIDE_INFO, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);
+	}
+
+	public static GetSlideInfoMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (GET_SLIDE_INFO.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID)
+							&& payload.has(Constants.REQUESTER_ID)
+							&& payload.has(Constants.REPLY_TO)) {
+						String meetingId = payload.get(Constants.MEETING_ID).getAsString();
+						String requesterId = payload.get(Constants.REQUESTER_ID).getAsString();
+						String replyTo = payload.get(Constants.REPLY_TO).getAsString();
+
+						return new GetSlideInfoMessage(meetingId, requesterId, replyTo);
+					}
+				}
+			}
+		}
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetUsersFromVoiceConfRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetUsersFromVoiceConfRequestMessage.java
new file mode 100755
index 0000000000..8e295656c0
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetUsersFromVoiceConfRequestMessage.java
@@ -0,0 +1,56 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class GetUsersFromVoiceConfRequestMessage {
+	public static final String GET_VOICE_USERS_REQUEST  = "get_users_from_voice_conf_request_message";
+	public static final String VERSION = "0.0.1";
+	
+	public static final String MEETING_ID = "meeting_id";
+	public static final String VOICE_CONF_ID = "voice_conf_id";
+	
+	public final String meetingId;
+	public final String voiceConfId;
+
+	public GetUsersFromVoiceConfRequestMessage(String meetingId, String voiceConfId) {
+		this.meetingId = meetingId;
+		this.voiceConfId = voiceConfId;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(MEETING_ID, meetingId); 
+		payload.put(VOICE_CONF_ID, voiceConfId);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(GET_VOICE_USERS_REQUEST, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static GetUsersFromVoiceConfRequestMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (GET_VOICE_USERS_REQUEST.equals(messageName)) {
+					if (payload.has(MEETING_ID) 
+							&& payload.has(VOICE_CONF_ID)) {
+						String id = payload.get(MEETING_ID).getAsString();
+						String voiceConfId = payload.get(VOICE_CONF_ID).getAsString();
+						return new GetUsersFromVoiceConfRequestMessage(id, voiceConfId);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetUsersReplyMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetUsersReplyMessage.java
new file mode 100755
index 0000000000..4cbb1bc99d
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetUsersReplyMessage.java
@@ -0,0 +1,65 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class GetUsersReplyMessage implements ISubscribedMessage {
+	public static final String GET_USERS_REPLY = "get_users_reply";
+	public final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	public final String requesterId;
+	public final ArrayList<Map<String, Object>> users;
+	
+	public GetUsersReplyMessage(String meetingID, String requesterId, ArrayList<Map<String, Object>> users) {
+		this.meetingId = meetingID;
+		this.requesterId = requesterId;
+		this.users = users;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(GET_USERS_REPLY, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	public static GetUsersReplyMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (GET_USERS_REPLY.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID)
+							&& payload.has(Constants.REQUESTER_ID)
+							&& payload.has(Constants.USERS)) {
+						String meetingID = payload.get(Constants.MEETING_ID).getAsString();
+						String requesterId = payload.get(Constants.REQUESTER_ID).getAsString();
+
+						JsonArray users = (JsonArray) payload.get(Constants.USERS);
+						
+						Util util = new Util();
+						ArrayList<Map<String, Object>> usersList = util.extractUsers(users);
+						
+						if (usersList != null) {
+							return new GetUsersReplyMessage(meetingID, requesterId, usersList);							
+						}						
+					}
+				}
+			}
+		}
+
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetUsersRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetUsersRequestMessage.java
new file mode 100755
index 0000000000..4c377f7d99
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetUsersRequestMessage.java
@@ -0,0 +1,53 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class GetUsersRequestMessage implements IPublishedMessage {
+	public static final String GET_USERS_REQUEST = "get_users_request_message";
+	public static final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	public final String requesterId;
+
+
+	public GetUsersRequestMessage(String meetingId, String requesterId) {
+		this.meetingId = meetingId;
+		this.requesterId = requesterId;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+		payload.put(Constants.REQUESTER_ID, requesterId);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(GET_USERS_REQUEST, VERSION, null);
+		return MessageBuilder.buildJson(header, payload);
+	}
+
+	public static GetUsersRequestMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (GET_USERS_REQUEST.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.REQUESTER_ID)) {
+						String meetingId = payload.get(Constants.MEETING_ID).getAsString();
+						String requesterId = payload.get(Constants.REQUESTER_ID).getAsString();
+
+						return new GetUsersRequestMessage(meetingId, requesterId);
+					}
+				} 
+			}
+		}
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetWhiteboardShapesReplyMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetWhiteboardShapesReplyMessage.java
new file mode 100755
index 0000000000..f7533630df
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GetWhiteboardShapesReplyMessage.java
@@ -0,0 +1,71 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class GetWhiteboardShapesReplyMessage implements ISubscribedMessage {
+	public static final String GET_WHITEBOARD_SHAPES_REPLY = "get_whiteboard_shapes_reply";
+	public static final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	public final String requesterId;
+	public final String whiteboardId;
+	public final ArrayList<Map<String, Object>> shapes;
+
+
+	public GetWhiteboardShapesReplyMessage(String meetingId, String requesterId,
+			String whiteboardId, ArrayList<Map<String, Object>> shapes) {
+		this.meetingId = meetingId;
+		this.whiteboardId = whiteboardId;
+		this.requesterId = requesterId;
+		this.shapes = shapes;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+		payload.put(Constants.SHAPES, shapes);
+		payload.put(Constants.WHITEBOARD_ID, whiteboardId);
+		payload.put(Constants.REQUESTER_ID, requesterId);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(GET_WHITEBOARD_SHAPES_REPLY, VERSION, null);
+		return MessageBuilder.buildJson(header, payload);
+	}
+
+	public static GetWhiteboardShapesReplyMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (GET_WHITEBOARD_SHAPES_REPLY.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.WHITEBOARD_ID)
+							&& payload.has(Constants.SHAPES)
+							&& payload.has(Constants.REQUESTER_ID)) {
+						String meetingId = payload.get(Constants.MEETING_ID).getAsString();
+						String requesterId = payload.get(Constants.REQUESTER_ID).getAsString();
+						String whiteboardId = payload.get(Constants.WHITEBOARD_ID).getAsString();
+
+						JsonArray shapes = (JsonArray) payload.get(Constants.SHAPES);
+
+						Util util = new Util();
+
+						ArrayList<Map<String, Object>> shapesList = util.extractShapes(shapes);
+						return new GetWhiteboardShapesReplyMessage(meetingId, requesterId,
+								whiteboardId, shapesList);
+					}
+				} 
+			}
+		}
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GoToSlideMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GoToSlideMessage.java
new file mode 100755
index 0000000000..4717d91b3f
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/GoToSlideMessage.java
@@ -0,0 +1,53 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class GoToSlideMessage implements IPublishedMessage {
+	public static final String GO_TO_SLIDE = "go_to_slide";
+	public static final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	public final String page;
+
+	public GoToSlideMessage(String meetingId, String page){
+		this.meetingId = meetingId;
+		this.page = page;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+		payload.put(Constants.PAGE, page);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(GO_TO_SLIDE, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);
+	}
+
+	public static GoToSlideMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (GO_TO_SLIDE.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID)
+							&& payload.has(Constants.PAGE)) {
+						String meetingId = payload.get(Constants.MEETING_ID).getAsString();
+						String page = payload.get(Constants.PAGE).getAsString();
+
+						return new GoToSlideMessage(meetingId, page);
+					}
+				}
+			}
+		}
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/IPublishedMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/IPublishedMessage.java
new file mode 100755
index 0000000000..649f395876
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/IPublishedMessage.java
@@ -0,0 +1,5 @@
+package org.bigbluebutton.common.messages;
+
+public interface IPublishedMessage {
+
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ISubscribedMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ISubscribedMessage.java
new file mode 100755
index 0000000000..2a40912aee
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ISubscribedMessage.java
@@ -0,0 +1,5 @@
+package org.bigbluebutton.common.messages;
+
+public interface ISubscribedMessage {
+
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/InitAudioSettingsMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/InitAudioSettingsMessage.java
new file mode 100755
index 0000000000..c298089227
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/InitAudioSettingsMessage.java
@@ -0,0 +1,57 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class InitAudioSettingsMessage implements ISubscribedMessage {
+	public static final String INIT_AUDIO_SETTING = "init_audio_settings_message";
+	public final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	public final String userId;
+	public final Boolean muted;
+	
+	public InitAudioSettingsMessage(String meetingID, String userId, Boolean muted) {
+		this.meetingId = meetingID;
+		this.userId = userId;
+		this.muted = muted;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(INIT_AUDIO_SETTING, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	public static InitAudioSettingsMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (INIT_AUDIO_SETTING.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID)
+							&& payload.has(Constants.USER_ID)
+							&& payload.has(Constants.MUTED)) {
+						String meetingID = payload.get(Constants.MEETING_ID).getAsString();
+						String userId = payload.get(Constants.USER_ID).getAsString();
+						Boolean muted = payload.get(Constants.MUTED).getAsBoolean();
+												
+						return new InitAudioSettingsMessage(meetingID, userId, muted);										
+					}
+				}
+			}
+		}
+
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/InitPermissionsSettingMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/InitPermissionsSettingMessage.java
new file mode 100755
index 0000000000..cc82195456
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/InitPermissionsSettingMessage.java
@@ -0,0 +1,60 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class InitPermissionsSettingMessage implements ISubscribedMessage {
+	public static final String INIT_PERMISSIONS_SETTING = "init_permission_settings_message";
+	public final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	public final Map<String, Boolean> permissions;
+	
+	public InitPermissionsSettingMessage(String meetingID, Map<String, Boolean> permissions) {
+		this.meetingId = meetingID;
+		this.permissions = permissions;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(INIT_PERMISSIONS_SETTING, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	public static InitPermissionsSettingMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (INIT_PERMISSIONS_SETTING.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID)
+							&& payload.has(Constants.USERS)
+							&& payload.has(Constants.PERMISSIONS)) {
+						String meetingID = payload.get(Constants.MEETING_ID).getAsString();
+
+						JsonObject permissions = (JsonObject) payload.get(Constants.PERMISSIONS);
+						
+						Util util = new Util();
+						Map<String, Boolean> permissionsMap = util.extractPermission(permissions);
+												
+						if (permissionsMap != null) {
+							return new InitPermissionsSettingMessage(meetingID, permissionsMap);					
+						}						
+					}
+				}
+			}
+		}
+
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/IsMeetingMutedReplyMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/IsMeetingMutedReplyMessage.java
new file mode 100755
index 0000000000..51188c6dc5
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/IsMeetingMutedReplyMessage.java
@@ -0,0 +1,63 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class IsMeetingMutedReplyMessage implements ISubscribedMessage {
+	public static final String IS_MEETING_MUTED_REPLY  = "is_meeting_muted_reply_message";
+	public static final String VERSION = "0.0.1";
+	
+	public static final String MEETING_ID = "meeting_id";
+	public static final String REQUESTER_ID = "requester_id";
+	public static final String MUTED = "muted";
+	
+	public final String meetingId;
+	public final String requesterId;
+	public final Boolean muted;
+
+	public IsMeetingMutedReplyMessage(String meetingId, String requesterId, Boolean muted) {
+		this.meetingId = meetingId;
+		this.requesterId = requesterId;
+		this.muted = muted;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(MEETING_ID, meetingId); 
+		payload.put(REQUESTER_ID, requesterId);
+		payload.put(MUTED, muted);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(IS_MEETING_MUTED_REPLY, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static IsMeetingMutedReplyMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (IS_MEETING_MUTED_REPLY.equals(messageName)) {
+					if (payload.has(MEETING_ID) 
+							&& payload.has(REQUESTER_ID)
+							&& payload.has(MUTED)) {
+						String id = payload.get(MEETING_ID).getAsString();
+						String requesterId = payload.get(REQUESTER_ID).getAsString();
+						Boolean muted = payload.get(MUTED).getAsBoolean();
+						return new IsMeetingMutedReplyMessage(id, requesterId, muted);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/IsMeetingMutedRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/IsMeetingMutedRequestMessage.java
new file mode 100755
index 0000000000..dcb391b804
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/IsMeetingMutedRequestMessage.java
@@ -0,0 +1,57 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class IsMeetingMutedRequestMessage implements ISubscribedMessage {
+	public static final String IS_MEETING_MUTED_REQUEST  = "is_meeting_muted_request_message";
+	public static final String VERSION = "0.0.1";
+	
+	public static final String MEETING_ID = "meeting_id";
+	public static final String REQUESTER_ID = "requester_id";
+	
+	public final String meetingId;
+	public final String requesterId;
+
+	public IsMeetingMutedRequestMessage(String meetingId, String requesterId) {
+		this.meetingId = meetingId;
+		this.requesterId = requesterId;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(MEETING_ID, meetingId); 
+		payload.put(REQUESTER_ID, requesterId);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(IS_MEETING_MUTED_REQUEST, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static IsMeetingMutedRequestMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (IS_MEETING_MUTED_REQUEST.equals(messageName)) {
+					if (payload.has(MEETING_ID) 
+							&& payload.has(REQUESTER_ID)) {
+						String id = payload.get(MEETING_ID).getAsString();
+						String requesterId = payload.get(REQUESTER_ID).getAsString();
+						return new IsMeetingMutedRequestMessage(id, requesterId);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/IsWhiteboardEnabledReplyMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/IsWhiteboardEnabledReplyMessage.java
new file mode 100755
index 0000000000..c7a273b86c
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/IsWhiteboardEnabledReplyMessage.java
@@ -0,0 +1,59 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class IsWhiteboardEnabledReplyMessage implements ISubscribedMessage {
+
+	public static final String IS_WHITEBOARD_ENABLED_REPLY = "whiteboard_enabled_message";
+	public static final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	public final String requesterId;
+	public final boolean enabled;
+
+
+	public IsWhiteboardEnabledReplyMessage(String meetingId, String requesterId, boolean enabled) {
+		this.meetingId = meetingId;
+		this.requesterId = requesterId;
+		this.enabled = enabled;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+		payload.put(Constants.REQUESTER_ID, requesterId);
+		payload.put(Constants.ENABLED, enabled);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(IS_WHITEBOARD_ENABLED_REPLY, VERSION, null);
+		return MessageBuilder.buildJson(header, payload);
+	}
+
+	public static IsWhiteboardEnabledReplyMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (IS_WHITEBOARD_ENABLED_REPLY.equals(messageName)) {
+
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.REQUESTER_ID)
+							&& payload.has(Constants.ENABLED)) {
+						String meetingId = payload.get(Constants.MEETING_ID).getAsString();
+						String requesterId = payload.get(Constants.REQUESTER_ID).getAsString();
+						boolean enabled = payload.get(Constants.ENABLED).getAsBoolean();
+
+						return new IsWhiteboardEnabledReplyMessage(meetingId, requesterId, enabled);
+					}
+				}
+			}
+		}
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/IsWhiteboardEnabledRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/IsWhiteboardEnabledRequestMessage.java
new file mode 100755
index 0000000000..666172d67a
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/IsWhiteboardEnabledRequestMessage.java
@@ -0,0 +1,59 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class IsWhiteboardEnabledRequestMessage implements ISubscribedMessage {
+	public static final String IS_WHITEBOARD_ENABLED_REQUEST = "is_whiteboard_enabled";
+	public static final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	public final String requesterId;
+	public final String replyTo;
+
+
+	public IsWhiteboardEnabledRequestMessage(String meetingId,
+			String requesterId, String replyTo) {
+		this.meetingId = meetingId;
+		this.requesterId = requesterId;
+		this.replyTo = replyTo;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+		payload.put(Constants.REQUESTER_ID, requesterId);
+		payload.put(Constants.REPLY_TO, replyTo);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(IS_WHITEBOARD_ENABLED_REQUEST, VERSION, null);
+		return MessageBuilder.buildJson(header, payload);
+	}
+
+	public static IsWhiteboardEnabledRequestMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (IS_WHITEBOARD_ENABLED_REQUEST.equals(messageName)) {
+
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.REPLY_TO)
+							&& payload.has(Constants.REQUESTER_ID)) {
+						String meetingId = payload.get(Constants.MEETING_ID).getAsString();
+						String requesterId = payload.get(Constants.REQUESTER_ID).getAsString();
+						String replyTo = payload.get(Constants.REPLY_TO).getAsString();
+
+						return new IsWhiteboardEnabledRequestMessage(meetingId, requesterId, replyTo);
+					}
+				}
+			}
+		}
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/KeepAliveMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/KeepAliveMessage.java
new file mode 100755
index 0000000000..059211e811
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/KeepAliveMessage.java
@@ -0,0 +1,12 @@
+package org.bigbluebutton.common.messages;
+
+public class KeepAliveMessage implements IPublishedMessage {
+	public static final String KEEP_ALIVE_REQUEST                 = "keep_alive_request";
+	public static final String VERSION = "0.0.1";
+	
+	public final String keepAliveId;
+	
+	public KeepAliveMessage(String keepAliveId) {
+		this.keepAliveId = keepAliveId;	
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/LockLayoutMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/LockLayoutMessage.java
new file mode 100755
index 0000000000..1ceb05bf93
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/LockLayoutMessage.java
@@ -0,0 +1,74 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class LockLayoutMessage implements ISubscribedMessage {
+	public static final String LOCK_LAYOUT  = "lock_layout_message";
+	public static final String VERSION = "0.0.1";
+	
+	public static final String SET_BY_USERID = "set_by_userid";
+	public static final String LOCKED = "locked";
+	public static final String USERS = "users";
+	
+	public final String meetingId;
+	public final String setByUserid;
+	public final Boolean locked;
+	public final ArrayList<String> users;
+	
+	public LockLayoutMessage(String meetingId, String setByUserid, Boolean locked, ArrayList<String> users) {
+		this.meetingId = meetingId;
+		this.setByUserid = setByUserid;
+		this.locked = locked;
+		this.users = users;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId); 
+		payload.put(SET_BY_USERID, setByUserid);
+		payload.put(LOCKED, locked);
+		payload.put(USERS, users);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(LOCK_LAYOUT, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static LockLayoutMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (LOCK_LAYOUT.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(LOCKED)
+							&& payload.has(SET_BY_USERID)
+							&& payload.has(USERS)) {
+						String id = payload.get(Constants.MEETING_ID).getAsString();
+						String setByUserid = payload.get(SET_BY_USERID).getAsString();
+						Boolean locked = payload.get(LOCKED).getAsBoolean();
+						JsonArray usersArr = (JsonArray) payload.get(USERS);
+						
+						Util util = new Util();
+						
+						ArrayList<String> users = util.extractUserids(usersArr);
+						return new LockLayoutMessage(id, setByUserid, locked, users);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/LockLayoutRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/LockLayoutRequestMessage.java
new file mode 100755
index 0000000000..ab2dff2fb2
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/LockLayoutRequestMessage.java
@@ -0,0 +1,75 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class LockLayoutRequestMessage implements ISubscribedMessage {
+	public static final String LOCK_LAYOUT_REQUEST  = "lock_layout_request_message";
+	public static final String VERSION = "0.0.1";
+	
+	public final static String LAYOUT = "layout";
+	public final static String LOCK = "lock";
+	public final static String VIEWERS_ONLY = "viewers_only";
+	
+	public final String meetingId;
+	public final String userId;
+	public final Boolean lock;
+	public final Boolean viewersOnly;
+	
+	
+	public final String layout;
+	
+	public LockLayoutRequestMessage(String meetingId, String userId, Boolean lock, Boolean viewersOnly, String layout) {
+		this.meetingId = meetingId;
+		this.userId = userId;
+		this.lock = lock;
+		this.viewersOnly = viewersOnly;
+		this.layout = layout;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId); 
+		payload.put(Constants.USER_ID, userId);
+		payload.put(LOCK, lock);
+		payload.put(VIEWERS_ONLY, viewersOnly);
+		payload.put(LAYOUT, layout);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(LOCK_LAYOUT_REQUEST, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static LockLayoutRequestMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (LOCK_LAYOUT_REQUEST.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.USER_ID)
+							&& payload.has(LOCK)
+							&& payload.has(VIEWERS_ONLY)
+							&& payload.has(LAYOUT)) {
+						String id = payload.get(Constants.MEETING_ID).getAsString();
+						String userid = payload.get(Constants.USER_ID).getAsString();
+						Boolean lock = payload.get(LOCK).getAsBoolean();
+						Boolean viewersOnly = payload.get(VIEWERS_ONLY).getAsBoolean();
+						String layout = payload.get(LAYOUT).getAsString();
+						return new LockLayoutRequestMessage(id, userid, lock, viewersOnly, layout);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/LockMuteUserRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/LockMuteUserRequestMessage.java
new file mode 100755
index 0000000000..7276ead27f
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/LockMuteUserRequestMessage.java
@@ -0,0 +1,69 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class LockMuteUserRequestMessage implements ISubscribedMessage {
+	public static final String LOCK_MUTE_USER_REQUEST  = "lock_mute_user_request_message";
+	public static final String VERSION = "0.0.1";
+	
+	public static final String MEETING_ID = "meeting_id";
+	public static final String REQUESTER_ID = "requester_id";
+	public static final String USER_ID = "user_id";
+	public static final String LOCK = "lock";
+	
+	public final String meetingId;
+	public final String requesterId;
+	public final String userId;
+	public final Boolean lock;
+
+	public LockMuteUserRequestMessage(String meetingId, String requesterId, String userId, Boolean lock) {
+		this.meetingId = meetingId;
+		this.requesterId = requesterId;
+		this.userId = userId;
+		this.lock = lock;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(MEETING_ID, meetingId); 
+		payload.put(REQUESTER_ID, requesterId);
+		payload.put(USER_ID, userId);
+		payload.put(LOCK, lock);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(LOCK_MUTE_USER_REQUEST, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static LockMuteUserRequestMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (LOCK_MUTE_USER_REQUEST.equals(messageName)) {
+					if (payload.has(MEETING_ID) 
+							&& payload.has(REQUESTER_ID)
+							&& payload.has(USER_ID)
+							&& payload.has(LOCK)) {
+						String id = payload.get(MEETING_ID).getAsString();
+						String requesterId = payload.get(REQUESTER_ID).getAsString();
+						String userId = payload.get(USER_ID).getAsString();
+						Boolean lock = payload.get(LOCK).getAsBoolean();
+						return new LockMuteUserRequestMessage(id, requesterId, userId, lock);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/LockUserMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/LockUserMessage.java
new file mode 100755
index 0000000000..02276a2060
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/LockUserMessage.java
@@ -0,0 +1,63 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class LockUserMessage implements IPublishedMessage {
+	public static final String LOCK_USER = "lock_user";
+	public static final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	public final String requesterId;
+	public final boolean lock;
+	public final String internalUserId;
+
+
+	public LockUserMessage(String meetingId, String requesterId, boolean lock, String internalUserId) {
+		this.meetingId = meetingId;
+		this.requesterId = requesterId;
+		this.lock = lock;
+		this.internalUserId = internalUserId;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+		payload.put(Constants.REQUESTER_ID, requesterId);
+		payload.put(Constants.LOCK, lock);
+		payload.put(Constants.INTERNAL_USER_ID, internalUserId);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(LOCK_USER, VERSION, null);
+		return MessageBuilder.buildJson(header, payload);
+	}
+
+	public static LockUserMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (LOCK_USER.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID)
+							&& payload.has(Constants.REQUESTER_ID)
+							&& payload.has(Constants.LOCK)
+							&& payload.has(Constants.INTERNAL_USER_ID)) {
+						String meetingId = payload.get(Constants.MEETING_ID).getAsString();
+						String requesterId = payload.get(Constants.REQUESTER_ID).getAsString();
+						boolean lock = payload.get(Constants.LOCK).getAsBoolean();
+						String internalUserId = payload.get(Constants.INTERNAL_USER_ID).getAsString();
+
+						return new LockUserMessage(meetingId, requesterId, lock, internalUserId);
+					}
+				}
+			}
+		}
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MeetingEndedMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MeetingEndedMessage.java
new file mode 100755
index 0000000000..3fd666211a
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MeetingEndedMessage.java
@@ -0,0 +1,48 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class MeetingEndedMessage implements ISubscribedMessage {
+	public static final String MEETING_ENDED = "meeting_ended_message";
+	public final String VERSION = "0.0.1";
+
+	public final String meetingId;
+
+	public MeetingEndedMessage(String meetingID) {
+		this.meetingId = meetingID;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(MEETING_ENDED, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	public static MeetingEndedMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (MEETING_ENDED.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID)) {
+						String meetingId = payload.get(Constants.MEETING_ID).getAsString();
+
+						return new 	MeetingEndedMessage(meetingId);					
+					}
+				}
+			}
+		}
+
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MeetingHasEndedMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MeetingHasEndedMessage.java
new file mode 100755
index 0000000000..71f2e6418b
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MeetingHasEndedMessage.java
@@ -0,0 +1,48 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class MeetingHasEndedMessage implements ISubscribedMessage {
+	public static final String MEETING_HAS_ENDED = "meeting_has_ended_message";
+	public final String VERSION = "0.0.1";
+
+	public final String meetingId;
+
+	public MeetingHasEndedMessage(String meetingID) {
+		this.meetingId = meetingID;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(MEETING_HAS_ENDED, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	public static MeetingHasEndedMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (MEETING_HAS_ENDED.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID)) {
+						String meetingId = payload.get(Constants.MEETING_ID).getAsString();
+
+						return new 	MeetingHasEndedMessage(meetingId);					
+					}
+				}
+			}
+		}
+
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MeetingMutedMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MeetingMutedMessage.java
new file mode 100755
index 0000000000..7bee2743b7
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MeetingMutedMessage.java
@@ -0,0 +1,53 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class MeetingMutedMessage implements ISubscribedMessage {
+	public static final String MEETING_MUTED = "meeting_muted_message";
+	public final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	public final Boolean muted;
+	
+	public MeetingMutedMessage(String meetingID, Boolean muted) {
+		this.meetingId = meetingID;
+		this.muted = muted;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(MEETING_MUTED, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static MeetingMutedMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (MEETING_MUTED.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID)
+							&& payload.has(Constants.MEETING_MUTED)) {
+						String meetingID = payload.get(Constants.MEETING_ID).getAsString();
+						Boolean muted = payload.get(Constants.MEETING_MUTED).getAsBoolean();
+						
+						return new MeetingMutedMessage(meetingID, muted);													
+					}
+				}
+			}
+		}
+
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MeetingStateMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MeetingStateMessage.java
new file mode 100755
index 0000000000..80e7a273e6
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MeetingStateMessage.java
@@ -0,0 +1,66 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class MeetingStateMessage implements ISubscribedMessage {
+	public static final String MEETING_STATE = "meeting_state_message";
+	public final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	public final String userId;
+	public final Map<String, Boolean> permissions;
+	public final Boolean muted;
+	
+	public MeetingStateMessage(String meetingID, String userId, Map<String, Boolean> permissions, Boolean muted) {
+		this.meetingId = meetingID;
+		this.userId = userId;
+		this.permissions = permissions;
+		this.muted = muted;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(MEETING_STATE, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	public static MeetingStateMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (MEETING_STATE.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID)
+							&& payload.has(Constants.USER_ID)
+							&& payload.has(Constants.PERMISSIONS)
+							&& payload.has(Constants.MEETING_MUTED)) {
+						String meetingID = payload.get(Constants.MEETING_ID).getAsString();
+						String userId = payload.get(Constants.USER_ID).getAsString();
+						Boolean muted = payload.get(Constants.MEETING_MUTED).getAsBoolean();
+						JsonObject premissions = (JsonObject) payload.get(Constants.PERMISSIONS);
+						
+						Util util = new Util();
+						Map<String, Boolean> premissionsMap = util.extractPermission(premissions);
+						
+						if (premissionsMap != null) {
+							return new MeetingStateMessage(meetingID, userId, premissionsMap, muted);							
+						}						
+					}
+				}
+			}
+		}
+
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MessageBuilder.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MessageBuilder.java
new file mode 100755
index 0000000000..b9cf94ac41
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MessageBuilder.java
@@ -0,0 +1,36 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.concurrent.TimeUnit;
+
+import com.google.gson.Gson;
+
+public class MessageBuilder {
+  public final static String VERSION = "version";
+
+  public static long generateTimestamp() {
+    return TimeUnit.NANOSECONDS.toMillis(System.nanoTime());
+  }
+  
+  public static java.util.HashMap<String, Object> buildHeader(String name, String version, String replyTo) {
+  	java.util.HashMap<String, Object> header = new java.util.HashMap<String, Object>();
+    header.put(Constants.NAME, name);
+    header.put(VERSION, version);
+    header.put(Constants.TIMESTAMP, generateTimestamp());
+    if (replyTo != null && replyTo != "")
+      header.put(Constants.REPLY_TO, replyTo);
+    
+    return header;
+  }
+  
+  
+  public static String buildJson(java.util.HashMap<String, Object> header, 
+  		java.util.HashMap<String, Object> payload) {
+    
+  	java.util.HashMap<String, java.util.HashMap<String, Object>> message = new java.util.HashMap<String, java.util.HashMap<String, Object>>();
+    message.put(Constants.HEADER, header);
+    message.put(Constants.PAYLOAD, payload);
+    
+    Gson gson = new Gson();
+    return gson.toJson(message);
+  }
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MessageFromJsonConverter.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MessageFromJsonConverter.java
new file mode 100755
index 0000000000..5b512e925b
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MessageFromJsonConverter.java
@@ -0,0 +1,88 @@
+package org.bigbluebutton.common.messages;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class MessageFromJsonConverter {
+
+	public static IPublishedMessage convert(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				switch (messageName) {
+				  case CreateMeetingMessage.CREATE_MEETING_REQUEST_EVENT:
+					  return processCreateMeeting(payload);
+				  case DestroyMeetingMessage.DESTROY_MEETING_REQUEST_EVENT:
+					  return processDestroyMeeting(payload);
+				  case EndMeetingMessage.END_MEETING_REQUEST_EVENT:
+					  return processEndMeetingMessage(payload);
+				  case KeepAliveMessage.KEEP_ALIVE_REQUEST:
+					  return processKeepAlive(payload);
+				  case RegisterUserMessage.REGISTER_USER:
+					  return RegisterUserMessage.fromJson(message);
+				  case ValidateAuthTokenMessage.VALIDATE_AUTH_TOKEN:
+					  return processValidateAuthTokenMessage(header, payload);
+					  // return ValidateAuthTokenMessage.fromJson(message);
+				  case UserConnectedToGlobalAudio.USER_CONNECTED_TO_GLOBAL_AUDIO:
+					return UserConnectedToGlobalAudio.fromJson(message);
+				  case UserDisconnectedFromGlobalAudio.USER_DISCONNECTED_FROM_GLOBAL_AUDIO:
+					return UserDisconnectedFromGlobalAudio.fromJson(message);
+				  case GetAllMeetingsRequest.GET_ALL_MEETINGS_REQUEST_EVENT:
+					return new GetAllMeetingsRequest("the_string_is_not_used_anywhere");
+				}
+			}
+		}
+		return null;
+	}
+		
+	private static IPublishedMessage processValidateAuthTokenMessage(JsonObject header, JsonObject payload) {
+		String id = payload.get(Constants.MEETING_ID).getAsString();
+		String userid = payload.get(Constants.USER_ID).getAsString();
+		String authToken = payload.get(Constants.AUTH_TOKEN).getAsString();
+		String replyTo = header.get(Constants.REPLY_TO).getAsString();
+		String sessionId = "tobeimplemented";
+		return new ValidateAuthTokenMessage(id, userid, authToken, replyTo,
+		    sessionId);
+	}
+	
+	private static IPublishedMessage processCreateMeeting(JsonObject payload) {
+		String id = payload.get(Constants.MEETING_ID).getAsString();
+		String externalId = payload.get(Constants.EXTERNAL_MEETING_ID).getAsString();
+		String name = payload.get(Constants.NAME).getAsString();
+		Boolean record = payload.get(Constants.RECORDED).getAsBoolean();
+		String voiceBridge = payload.get(Constants.VOICE_CONF).getAsString();
+		Long duration = payload.get(Constants.DURATION).getAsLong();
+		Boolean autoStartRecording = payload.get(Constants.AUTO_START_RECORDING).getAsBoolean();
+		Boolean allowStartStopRecording = payload.get(Constants.ALLOW_START_STOP_RECORDING).getAsBoolean();
+		String moderatorPassword = payload.get(Constants.MODERATOR_PASS).getAsString();
+		String viewerPassword = payload.get(Constants.VIEWER_PASS).getAsString();
+		Long createTime = payload.get(Constants.CREATE_TIME).getAsLong();
+		String createDate = payload.get(Constants.CREATE_DATE).getAsString();
+		
+		return new CreateMeetingMessage(id, externalId, name, record, voiceBridge, 
+				          duration, autoStartRecording, allowStartStopRecording,
+				          moderatorPassword, viewerPassword, createTime, createDate);
+	}
+	
+	private static IPublishedMessage processDestroyMeeting(JsonObject payload) {
+		String id = payload.get(Constants.MEETING_ID).getAsString();		
+		return new DestroyMeetingMessage(id);
+	}
+	
+	private static IPublishedMessage processEndMeetingMessage(JsonObject payload) {
+		String id = payload.get(Constants.MEETING_ID).getAsString();		
+		return new EndMeetingMessage(id);
+	}	
+	
+	private static IPublishedMessage processKeepAlive(JsonObject payload) {
+		String id = payload.get(Constants.KEEP_ALIVE_ID).getAsString();		
+		return new KeepAliveMessage(id);
+	}
+
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MessagingConstants.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MessagingConstants.java
new file mode 100755
index 0000000000..96f8d341c3
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MessagingConstants.java
@@ -0,0 +1,66 @@
+/**
+* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
+* 
+* Copyright (c) 2014 BigBlueButton Inc. and by respective authors (see below).
+*
+* This program is free software; you can redistribute it and/or modify it under the
+* terms of the GNU Lesser General Public License as published by the Free Software
+* Foundation; either version 3.0 of the License, or (at your option) any later
+* version.
+* 
+* BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
+* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public License along
+* with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
+*
+*/
+package org.bigbluebutton.common.messages;
+
+public class MessagingConstants {
+	
+	public static final String FROM_BBB_APPS_CHANNEL = "bigbluebutton:from-bbb-apps";
+	public static final String FROM_BBB_APPS_PATTERN = FROM_BBB_APPS_CHANNEL + ":*";
+	public static final String FROM_SYSTEM_CHANNEL = FROM_BBB_APPS_CHANNEL + ":system";
+	public static final String FROM_MEETING_CHANNEL = FROM_BBB_APPS_CHANNEL + ":meeting";
+	public static final String FROM_PRESENTATION_CHANNEL = FROM_BBB_APPS_CHANNEL + ":presentation";
+	public static final String FROM_POLLING_CHANNEL = FROM_BBB_APPS_CHANNEL + ":polling";
+	public static final String FROM_USERS_CHANNEL = FROM_BBB_APPS_CHANNEL + ":users";
+	public static final String FROM_CHAT_CHANNEL = FROM_BBB_APPS_CHANNEL + ":chat"; 
+	public static final String FROM_WHITEBOARD_CHANNEL = FROM_BBB_APPS_CHANNEL + ":whiteboard";
+
+	public static final String TO_BBB_APPS_CHANNEL = "bigbluebutton:to-bbb-apps";	
+	public static final String TO_BBB_APPS_PATTERN = TO_BBB_APPS_CHANNEL + ":*";
+	public static final String TO_MEETING_CHANNEL = TO_BBB_APPS_CHANNEL + ":meeting";	
+	public static final String TO_SYSTEM_CHANNEL = TO_BBB_APPS_CHANNEL + ":system";
+	public static final String TO_PRESENTATION_CHANNEL = TO_BBB_APPS_CHANNEL + ":presentation";
+	public static final String TO_POLLING_CHANNEL = TO_BBB_APPS_CHANNEL + ":polling";
+	public static final String TO_USERS_CHANNEL = TO_BBB_APPS_CHANNEL + ":users";
+	public static final String TO_CHAT_CHANNEL = TO_BBB_APPS_CHANNEL + ":chat";
+	public static final String TO_VOICE_CHANNEL = TO_BBB_APPS_CHANNEL + ":voice";
+	public static final String TO_WHITEBOARD_CHANNEL = TO_BBB_APPS_CHANNEL + ":whiteboard";
+
+	public static final String TO_VOICE_CONF_CHANNEL = "bigbluebutton:to-voice-conf";	
+	public static final String TO_VOICE_CONF_PATTERN = TO_VOICE_CONF_CHANNEL + ":*";
+	public static final String TO_VOICE_CONF_SYSTEM_CHAN = TO_VOICE_CONF_CHANNEL + ":system";
+	public static final String FROM_VOICE_CONF_CHANNEL = "bigbluebutton:from-voice-conf";	
+	public static final String FROM_VOICE_CONF_PATTERN = FROM_VOICE_CONF_CHANNEL + ":*";
+	public static final String FROM_VOICE_CONF_SYSTEM_CHAN = FROM_VOICE_CONF_CHANNEL + ":system";
+	
+	public static final String DESTROY_MEETING_REQUEST_EVENT = "DestroyMeetingRequestEvent";
+	public static final String CREATE_MEETING_REQUEST_EVENT = "CreateMeetingRequestEvent";	
+	public static final String END_MEETING_REQUEST_EVENT = "EndMeetingRequestEvent";
+	public static final String MEETING_STARTED_EVENT = "meeting_created_message";
+	public static final String MEETING_ENDED_EVENT = "meeting_ended_event";
+	public static final String MEETING_DESTROYED_EVENT = "meeting_destroyed_event";
+	public static final String USER_JOINED_EVENT = "UserJoinedEvent";
+	public static final String USER_LEFT_EVENT = "UserLeftEvent";
+	public static final String USER_LEFT_VOICE_REQUEST = "user_left_voice_request";
+	public static final String USER_STATUS_CHANGE_EVENT = "UserStatusChangeEvent";	
+	public static final String SEND_POLLS_EVENT = "SendPollsEvent";
+	public static final String RECORD_STATUS_EVENT = "RecordStatusEvent";
+	public static final String SEND_PUBLIC_CHAT_MESSAGE_REQUEST = "send_public_chat_message_request";
+	public static final String SEND_PRIVATE_CHAT_MESSAGE_REQUEST = "send_private_chat_message_request";
+	public static final String MUTE_USER_REQUEST = "mute_user_request";
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MuteAllExceptPresenterRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MuteAllExceptPresenterRequestMessage.java
new file mode 100755
index 0000000000..7fed738b33
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MuteAllExceptPresenterRequestMessage.java
@@ -0,0 +1,63 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class MuteAllExceptPresenterRequestMessage implements ISubscribedMessage {
+	public static final String MUTE_ALL_EXCEPT_PRESENTER_REQUEST  = "mute_all_except_presenter_request_message";
+	public static final String VERSION = "0.0.1";
+	
+	public static final String MEETING_ID = "meeting_id";
+	public static final String REQUESTER_ID = "requester_id";
+	public static final String MUTE = "mute";
+	
+	public final String meetingId;
+	public final String requesterId;
+	public final Boolean mute;
+
+	public MuteAllExceptPresenterRequestMessage(String meetingId, String requesterId, Boolean mute) {
+		this.meetingId = meetingId;
+		this.requesterId = requesterId;
+		this.mute = mute;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(MEETING_ID, meetingId); 
+		payload.put(REQUESTER_ID, requesterId);
+		payload.put(MUTE, mute);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(MUTE_ALL_EXCEPT_PRESENTER_REQUEST, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static MuteAllExceptPresenterRequestMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (MUTE_ALL_EXCEPT_PRESENTER_REQUEST.equals(messageName)) {
+					if (payload.has(MEETING_ID) 
+							&& payload.has(REQUESTER_ID)
+							&& payload.has(MUTE)) {
+						String id = payload.get(MEETING_ID).getAsString();
+						String requesterId = payload.get(REQUESTER_ID).getAsString();
+						Boolean mute = payload.get(MUTE).getAsBoolean();
+						return new MuteAllExceptPresenterRequestMessage(id, requesterId, mute);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MuteAllRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MuteAllRequestMessage.java
new file mode 100755
index 0000000000..4e0c4b9b0c
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MuteAllRequestMessage.java
@@ -0,0 +1,63 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class MuteAllRequestMessage implements ISubscribedMessage {
+	public static final String MUTE_ALL_REQUEST  = "mute_all_request_message";
+	public static final String VERSION = "0.0.1";
+	
+	public static final String MEETING_ID = "meeting_id";
+	public static final String REQUESTER_ID = "requester_id";
+	public static final String MUTE = "mute";
+	
+	public final String meetingId;
+	public final String requesterId;
+	public final Boolean mute;
+
+	public MuteAllRequestMessage(String meetingId, String requesterId, Boolean mute) {
+		this.meetingId = meetingId;
+		this.requesterId = requesterId;
+		this.mute = mute;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(MEETING_ID, meetingId); 
+		payload.put(REQUESTER_ID, requesterId);
+		payload.put(MUTE, mute);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(MUTE_ALL_REQUEST, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static MuteAllRequestMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (MUTE_ALL_REQUEST.equals(messageName)) {
+					if (payload.has(MEETING_ID) 
+							&& payload.has(REQUESTER_ID)
+							&& payload.has(MUTE)) {
+						String id = payload.get(MEETING_ID).getAsString();
+						String requesterId = payload.get(REQUESTER_ID).getAsString();
+						Boolean mute = payload.get(MUTE).getAsBoolean();
+						return new MuteAllRequestMessage(id, requesterId, mute);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MuteUserInVoiceConfRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MuteUserInVoiceConfRequestMessage.java
new file mode 100755
index 0000000000..4f45cef8e1
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MuteUserInVoiceConfRequestMessage.java
@@ -0,0 +1,68 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class MuteUserInVoiceConfRequestMessage {
+	public static final String MUTE_VOICE_USER_REQUEST  = "mute_user_in_voice_conf_request_message";
+	public static final String VERSION = "0.0.1";
+	
+	public static final String MEETING_ID = "meeting_id";
+	public static final String VOICE_CONF_ID = "voice_conf_id";
+	public static final String VOICE_USER_ID = "voice_user_id";
+	public static final String MUTE = "mute";
+	
+	public final String meetingId;
+	public final String voiceConfId;
+	public final String voiceUserId;
+	public final Boolean mute;
+
+	public MuteUserInVoiceConfRequestMessage(String meetingId, String voiceConfId, String voiceUserId, Boolean mute) {
+		this.meetingId = meetingId;
+		this.voiceConfId = voiceConfId;
+		this.voiceUserId = voiceUserId;
+		this.mute = mute;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(MEETING_ID, meetingId); 
+		payload.put(VOICE_CONF_ID, voiceConfId);
+		payload.put(VOICE_USER_ID, voiceUserId);
+		payload.put(MUTE, mute);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(MUTE_VOICE_USER_REQUEST, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static MuteUserInVoiceConfRequestMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (MUTE_VOICE_USER_REQUEST.equals(messageName)) {
+					if (payload.has(MEETING_ID) 
+							&& payload.has(VOICE_CONF_ID)
+							&& payload.has(VOICE_USER_ID)
+							&& payload.has(MUTE)) {
+						String id = payload.get(MEETING_ID).getAsString();
+						String voiceConfId = payload.get(VOICE_CONF_ID).getAsString();
+						String voiceUserId = payload.get(VOICE_USER_ID).getAsString();
+						Boolean mute = payload.get(MUTE).getAsBoolean();
+						return new MuteUserInVoiceConfRequestMessage(id, voiceConfId, voiceUserId, mute);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MuteUserRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MuteUserRequestMessage.java
new file mode 100755
index 0000000000..776b3cc0c8
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MuteUserRequestMessage.java
@@ -0,0 +1,69 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class MuteUserRequestMessage implements ISubscribedMessage {
+	public static final String MUTE_USER_REQUEST  = "mute_user_request_message";
+	public static final String VERSION = "0.0.1";
+	
+	public static final String MEETING_ID = "meeting_id";
+	public static final String REQUESTER_ID = "requester_id";
+	public static final String USER_ID = "user_id";
+	public static final String MUTE = "mute";
+	
+	public final String meetingId;
+	public final String requesterId;
+	public final String userId;
+	public final Boolean mute;
+
+	public MuteUserRequestMessage(String meetingId, String requesterId, String userId, Boolean mute) {
+		this.meetingId = meetingId;
+		this.requesterId = requesterId;
+		this.userId = userId;
+		this.mute = mute;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(MEETING_ID, meetingId); 
+		payload.put(REQUESTER_ID, requesterId);
+		payload.put(USER_ID, userId);
+		payload.put(MUTE, mute);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(MUTE_USER_REQUEST, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static MuteUserRequestMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (MUTE_USER_REQUEST.equals(messageName)) {
+					if (payload.has(MEETING_ID) 
+							&& payload.has(REQUESTER_ID)
+							&& payload.has(USER_ID)
+							&& payload.has(MUTE)) {
+						String id = payload.get(MEETING_ID).getAsString();
+						String requesterId = payload.get(REQUESTER_ID).getAsString();
+						String userId = payload.get(USER_ID).getAsString();
+						Boolean mute = payload.get(MUTE).getAsBoolean();
+						return new MuteUserRequestMessage(id, requesterId, userId, mute);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MuteVoiceUserRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MuteVoiceUserRequestMessage.java
new file mode 100755
index 0000000000..16a9574952
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/MuteVoiceUserRequestMessage.java
@@ -0,0 +1,69 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class MuteVoiceUserRequestMessage implements ISubscribedMessage {
+	public static final String MUTE_USER_REQUEST  = "mute_user_request_message";
+	public static final String VERSION = "0.0.1";
+	
+	public static final String MEETING_ID = "meeting_id";
+	public static final String REQUESTER_ID = "requester_id";
+	public static final String USER_ID = "user_id";
+	public static final String MUTE = "mute";
+	
+	public final String meetingId;
+	public final String requesterId;
+	public final String userId;
+	public final Boolean mute;
+
+	public MuteVoiceUserRequestMessage(String meetingId, String requesterId, String userId, Boolean mute) {
+		this.meetingId = meetingId;
+		this.requesterId = requesterId;
+		this.userId = userId;
+		this.mute = mute;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(MEETING_ID, meetingId); 
+		payload.put(REQUESTER_ID, requesterId);
+		payload.put(USER_ID, userId);
+		payload.put(MUTE, mute);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(MUTE_USER_REQUEST, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static MuteVoiceUserRequestMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (MUTE_USER_REQUEST.equals(messageName)) {
+					if (payload.has(MEETING_ID) 
+							&& payload.has(REQUESTER_ID)
+							&& payload.has(USER_ID)
+							&& payload.has(MUTE)) {
+						String id = payload.get(MEETING_ID).getAsString();
+						String requesterId = payload.get(REQUESTER_ID).getAsString();
+						String userId = payload.get(USER_ID).getAsString();
+						Boolean mute = payload.get(MUTE).getAsBoolean();
+						return new MuteVoiceUserRequestMessage(id, requesterId, userId, mute);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/NewPermissionsSettingMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/NewPermissionsSettingMessage.java
new file mode 100755
index 0000000000..d7257a6c22
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/NewPermissionsSettingMessage.java
@@ -0,0 +1,68 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class NewPermissionsSettingMessage implements ISubscribedMessage {
+	public static final String NEW_PERMISSIONS_SETTING = "new_permission_settings";
+	public final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	public final ArrayList<Map<String, Object>> users;
+	public final Map<String, Boolean> permissions;
+	
+	public NewPermissionsSettingMessage(String meetingID, Map<String, Boolean> permissions, ArrayList<Map<String, Object>> users) {
+		this.meetingId = meetingID;
+		this.users = users;
+		this.permissions = permissions;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(NEW_PERMISSIONS_SETTING, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	public static NewPermissionsSettingMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (NEW_PERMISSIONS_SETTING.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID)
+							&& payload.has(Constants.USERS)
+							&& payload.has(Constants.PERMISSIONS)) {
+						String meetingID = payload.get(Constants.MEETING_ID).getAsString();
+
+						JsonObject permissions = (JsonObject) payload.get(Constants.PERMISSIONS);
+						
+						Util util = new Util();
+						Map<String, Boolean> permissionsMap = util.extractPermission(permissions);
+						
+						JsonArray users = (JsonArray) payload.get(Constants.USERS);
+						
+						ArrayList<Map<String, Object>> usersList = util.extractUsers(users);
+						
+						if (usersList != null && permissionsMap != null) {
+							return new NewPermissionsSettingMessage(meetingID, permissionsMap, usersList);					
+						}						
+					}
+				}
+			}
+		}
+
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PresentationRemovedMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PresentationRemovedMessage.java
new file mode 100755
index 0000000000..d2e2821cfa
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PresentationRemovedMessage.java
@@ -0,0 +1,56 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class PresentationRemovedMessage implements ISubscribedMessage {
+	public static final String PRESENTATION_REMOVED = "presentation_removed_message";
+	public final String VERSION = "0.0.1";
+
+	public static final String PRESENTATION_ID = "presentation_id";
+	public static final String MEETING_ID = "meeting_id";
+	
+	public final String meetingId;
+	public final String presentationId;
+	
+	public PresentationRemovedMessage(String meetingId, String presentationId) {
+		this.meetingId = meetingId;
+		this.presentationId = presentationId;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(MEETING_ID, meetingId);
+		payload.put(PRESENTATION_ID, presentationId);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(PRESENTATION_REMOVED, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static PresentationRemovedMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (PRESENTATION_REMOVED.equals(messageName)) {
+					if (payload.has(MEETING_ID)
+						&& payload.has(PRESENTATION_ID)) {
+						String meetingId = payload.get(MEETING_ID).getAsString();
+						String presentationId = payload.get(MEETING_ID).getAsString();
+						return new 	PresentationRemovedMessage(meetingId, presentationId);					
+					}
+				}
+			}
+		}
+
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PresenterAssignedMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PresenterAssignedMessage.java
new file mode 100755
index 0000000000..38a8f2dc72
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/PresenterAssignedMessage.java
@@ -0,0 +1,64 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class PresenterAssignedMessage implements ISubscribedMessage {
+	public static final String PRESENTER_ASSIGNED  = "presenter_assigned_message";
+	public static final String VERSION = "0.0.1";
+	
+	public final String meetingId;
+	public final String newPresenterId;
+	public final String newPresenterName;
+	public final String assignedBy;
+
+	public PresenterAssignedMessage(String meetingId, String newPresenterId, String newPresenterName, 
+			String assignedBy) {
+		this.meetingId = meetingId;
+		this.newPresenterId = newPresenterId;
+		this.newPresenterName = newPresenterName;
+		this.assignedBy = assignedBy;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId); 
+		payload.put(Constants.NEW_PRESENTER_ID, newPresenterId);
+		payload.put(Constants.NEW_PRESENTER_NAME, newPresenterName);
+		payload.put(Constants.ASSIGNED_BY, assignedBy);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(PRESENTER_ASSIGNED, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static PresenterAssignedMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (PRESENTER_ASSIGNED.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.NEW_PRESENTER_ID)
+							&& payload.has(Constants.NEW_PRESENTER_NAME)
+							&& payload.has(Constants.ASSIGNED_BY)) {
+						String id = payload.get(Constants.MEETING_ID).getAsString();
+						String presenterId = payload.get(Constants.NEW_PRESENTER_ID).getAsString();
+						String presenterName = payload.get(Constants.NEW_PRESENTER_NAME).getAsString();
+						String assignedBy = payload.get(Constants.ASSIGNED_BY).getAsString();
+						return new PresenterAssignedMessage(id, presenterId, presenterName, assignedBy);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/RecordVoiceConfRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/RecordVoiceConfRequestMessage.java
new file mode 100755
index 0000000000..4158afea22
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/RecordVoiceConfRequestMessage.java
@@ -0,0 +1,62 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class RecordVoiceConfRequestMessage {
+	public static final String RECORD_VOICE_CONF_REQUEST  = "record_voice_conf_request_message";
+	public static final String VERSION = "0.0.1";
+	
+	public static final String MEETING_ID = "meeting_id";
+	public static final String VOICE_CONF_ID = "voice_conf_id";
+	public static final String RECORD = "record";
+	
+	public final String meetingId;
+	public final String voiceConfId;
+	public final Boolean record;
+
+	public RecordVoiceConfRequestMessage(String meetingId, String voiceConfId, Boolean record) {
+		this.meetingId = meetingId;
+		this.voiceConfId = voiceConfId;
+		this.record = record;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(MEETING_ID, meetingId); 
+		payload.put(VOICE_CONF_ID, voiceConfId);
+		payload.put(RECORD, record);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(RECORD_VOICE_CONF_REQUEST, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static RecordVoiceConfRequestMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (RECORD_VOICE_CONF_REQUEST.equals(messageName)) {
+					if (payload.has(MEETING_ID) 
+							&& payload.has(VOICE_CONF_ID)
+							&& payload.has(RECORD)) {
+						String id = payload.get(MEETING_ID).getAsString();
+						String voiceConfId = payload.get(VOICE_CONF_ID).getAsString();
+						Boolean record = payload.get(RECORD).getAsBoolean();
+						return new RecordVoiceConfRequestMessage(id, voiceConfId, record);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/RecordingStatusChangedMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/RecordingStatusChangedMessage.java
new file mode 100755
index 0000000000..a6f7b4a443
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/RecordingStatusChangedMessage.java
@@ -0,0 +1,59 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class RecordingStatusChangedMessage implements ISubscribedMessage {
+	public static final String RECORDING_STATUS_CHANGED  = "recording_status_changed_message";
+	public static final String VERSION = "0.0.1";
+	
+	public final String meetingId;
+	public final String userId;
+	public final Boolean recording;
+
+	public RecordingStatusChangedMessage(String meetingId, String userId, Boolean recording) {
+		this.meetingId = meetingId;
+		this.userId = userId;
+		this.recording = recording;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId); 
+		payload.put(Constants.USER_ID, userId);
+		payload.put(Constants.RECORDING, recording);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(RECORDING_STATUS_CHANGED, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static RecordingStatusChangedMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (RECORDING_STATUS_CHANGED.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.USER_ID)
+							&& payload.has(Constants.RECORDING)) {
+						String id = payload.get(Constants.MEETING_ID).getAsString();
+						String userid = payload.get(Constants.USER_ID).getAsString();
+						Boolean recording = payload.get(Constants.RECORDING).getAsBoolean();
+						return new RecordingStatusChangedMessage(id, userid, recording);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/RegisterUserMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/RegisterUserMessage.java
new file mode 100755
index 0000000000..78738fab6c
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/RegisterUserMessage.java
@@ -0,0 +1,73 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class RegisterUserMessage implements IPublishedMessage {
+	public static final String REGISTER_USER = "register_user_request";
+	public final String VERSION = "0.0.1";
+
+	public final String meetingID;
+	public final String internalUserId;
+	public final String fullname;
+	public final String role;
+	public final String externUserID;
+	public final String authToken;
+
+	public RegisterUserMessage(String meetingID, String internalUserId, String fullname, String role, String externUserID, String authToken) {
+		this.meetingID = meetingID;
+		this.internalUserId = internalUserId;
+		this.fullname = fullname;
+		this.role = role;
+		this.externUserID = externUserID;
+		this.authToken = authToken;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+
+		payload.put(Constants.MEETING_ID, meetingID);
+		payload.put(Constants.INTERNAL_USER_ID, internalUserId);
+		payload.put(Constants.NAME, fullname);
+		payload.put(Constants.ROLE, role);
+		payload.put(Constants.EXT_USER_ID, externUserID);
+		payload.put(Constants.AUTH_TOKEN, authToken);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(REGISTER_USER, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	public static RegisterUserMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (REGISTER_USER.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID)
+							&& payload.has(Constants.NAME)
+							&& payload.has(Constants.ROLE)
+							&& payload.has(Constants.EXT_USER_ID)
+							&& payload.has(Constants.AUTH_TOKEN)) {
+
+						String meetingID = payload.get(Constants.MEETING_ID).getAsString();
+						String fullname = payload.get(Constants.NAME).getAsString();
+						String role = payload.get(Constants.ROLE).getAsString();
+						String externUserID = payload.get(Constants.EXT_USER_ID).getAsString();
+						String authToken = payload.get(Constants.AUTH_TOKEN).getAsString();
+
+						//use externalUserId twice - once for external, once for internal
+						return new RegisterUserMessage(meetingID, externUserID, fullname, role, externUserID, authToken);
+					}
+				}
+			}
+		}
+
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/RemovePresentationMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/RemovePresentationMessage.java
new file mode 100755
index 0000000000..4fc04a91c1
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/RemovePresentationMessage.java
@@ -0,0 +1,53 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class RemovePresentationMessage implements IPublishedMessage {
+	public static final String REMOVE_PRESENTATION = "remove_presentation";
+	public static final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	public final String presentationId;
+
+	public RemovePresentationMessage(String meetingId, String presentationId){
+		this.meetingId = meetingId;
+		this.presentationId = presentationId;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+		payload.put(Constants.PRESENTATION_ID, presentationId);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(REMOVE_PRESENTATION, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);
+	}
+
+	public static RemovePresentationMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (REMOVE_PRESENTATION.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID)
+							&& payload.has(Constants.PRESENTATION_ID)) {
+						String meetingId = payload.get(Constants.MEETING_ID).getAsString();
+						String presentationId = payload.get(Constants.PRESENTATION_ID).getAsString();
+
+						return new RemovePresentationMessage(meetingId, presentationId);
+					}
+				}
+			}
+		}
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/RequestWhiteboardAnnotationHistoryRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/RequestWhiteboardAnnotationHistoryRequestMessage.java
new file mode 100755
index 0000000000..df83b2c723
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/RequestWhiteboardAnnotationHistoryRequestMessage.java
@@ -0,0 +1,64 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class RequestWhiteboardAnnotationHistoryRequestMessage implements ISubscribedMessage {
+	public static final String REQUEST_WHITEBOARD_ANNOTATION_HISTORY_REQUEST = "request_whiteboard_annotation_history_request";
+	public static final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	public final String whiteboardId;
+	public final String requesterId;
+	public final String replyTo;
+
+
+	public RequestWhiteboardAnnotationHistoryRequestMessage(String meetingId,
+			String requesterId, String whiteboardId, String replyTo) {
+		this.meetingId = meetingId;
+		this.whiteboardId = whiteboardId;
+		this.requesterId = requesterId;
+		this.replyTo = replyTo;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+		payload.put(Constants.WHITEBOARD_ID, whiteboardId);
+		payload.put(Constants.REQUESTER_ID, requesterId);
+		payload.put(Constants.REPLY_TO, replyTo);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(REQUEST_WHITEBOARD_ANNOTATION_HISTORY_REQUEST, VERSION, null);
+		return MessageBuilder.buildJson(header, payload);
+	}
+
+	public static RequestWhiteboardAnnotationHistoryRequestMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (REQUEST_WHITEBOARD_ANNOTATION_HISTORY_REQUEST.equals(messageName)) {
+
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.WHITEBOARD_ID)
+							&& payload.has(Constants.REPLY_TO)
+							&& payload.has(Constants.REQUESTER_ID)) {
+						String meetingId = payload.get(Constants.MEETING_ID).getAsString();
+						String whiteboardId = payload.get(Constants.WHITEBOARD_ID).getAsString();
+						String requesterId = payload.get(Constants.REQUESTER_ID).getAsString();
+						String replyTo = payload.get(Constants.REPLY_TO).getAsString();
+
+						return new RequestWhiteboardAnnotationHistoryRequestMessage(meetingId, requesterId, whiteboardId, replyTo);
+					}
+				}
+			}
+		}
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ResizeAndMoveSlideMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ResizeAndMoveSlideMessage.java
new file mode 100755
index 0000000000..c82cdb50cc
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ResizeAndMoveSlideMessage.java
@@ -0,0 +1,68 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class ResizeAndMoveSlideMessage implements IPublishedMessage {
+	public static final String RESIZE_AND_MOVE_SLIDE = "resize_and_move_slide";
+	public static final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	public final double xOffset;
+	public final double yOffset;
+	public final double widthRatio;
+	public final double heightRatio;
+
+	public ResizeAndMoveSlideMessage(String meetingId, double xOffset, double yOffset,
+			double widthRatio, double heightRatio) {
+		this.meetingId = meetingId;
+		this.xOffset = xOffset;
+		this.yOffset = yOffset;
+		this.heightRatio = heightRatio;
+		this.widthRatio = widthRatio;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+		payload.put(Constants.X_OFFSET, xOffset);
+		payload.put(Constants.Y_OFFSET, yOffset);
+		payload.put(Constants.HEIGHT_RATIO, heightRatio);
+		payload.put(Constants.WIDTH_RATIO, widthRatio);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(RESIZE_AND_MOVE_SLIDE, VERSION, null);
+		return MessageBuilder.buildJson(header, payload);
+	}
+
+	public static ResizeAndMoveSlideMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (RESIZE_AND_MOVE_SLIDE.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.X_OFFSET)
+							&& payload.has(Constants.Y_OFFSET)
+							&& payload.has(Constants.HEIGHT_RATIO)
+							&& payload.has(Constants.WIDTH_RATIO)) {
+						String meetingId = payload.get(Constants.MEETING_ID).getAsString();
+						double xOffset = payload.get(Constants.X_OFFSET).getAsDouble();
+						double yOffset = payload.get(Constants.Y_OFFSET).getAsDouble();
+						double heightRatio = payload.get(Constants.HEIGHT_RATIO).getAsDouble();
+						double widthRatio = payload.get(Constants.WIDTH_RATIO).getAsDouble();
+
+						return new ResizeAndMoveSlideMessage(meetingId, xOffset, yOffset, widthRatio, heightRatio);
+					}
+				} 
+			}
+		}
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendConversionCompletedMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendConversionCompletedMessage.java
new file mode 100755
index 0000000000..6f7cdad54c
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendConversionCompletedMessage.java
@@ -0,0 +1,79 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class SendConversionCompletedMessage implements IPublishedMessage {
+	public static final String SEND_CONVERSION_COMPLETED = "send_conversion_completed";
+	public static final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	public final String messageKey;
+	public final String code;
+	public final String presId;
+	public final int numPages;
+	public final String presName;
+	public final String presBaseUrl;
+
+	public SendConversionCompletedMessage(String messageKey, String meetingId,	String code,
+			String presId, int numPages, String presName,	String presBaseUrl) {
+		this.meetingId = meetingId;
+		this.messageKey = messageKey;
+		this.code = code;
+		this.presId = presId;
+		this.numPages = numPages;
+		this.presName = presName;
+		this.presBaseUrl = presBaseUrl;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+		payload.put(Constants.MESSAGE_KEY, messageKey);
+		payload.put(Constants.CODE, code);
+		payload.put(Constants.PRESENTATION_ID, presId);
+		payload.put(Constants.NUM_PAGES, numPages);
+		payload.put(Constants.PRESENTATION_NAME, presName);
+		payload.put(Constants.PRESENTATION_BASE_URL, presBaseUrl);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(SEND_CONVERSION_COMPLETED, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);
+	}
+
+	public static SendConversionCompletedMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (SEND_CONVERSION_COMPLETED.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.MESSAGE_KEY)
+							&& payload.has(Constants.CODE)
+							&& payload.has(Constants.PRESENTATION_ID)
+							&& payload.has(Constants.NUM_PAGES)
+							&& payload.has(Constants.PRESENTATION_NAME)
+							&& payload.has(Constants.PRESENTATION_BASE_URL)) {
+						String meetingId = payload.get(Constants.MEETING_ID).getAsString();
+						String messageKey = payload.get(Constants.MESSAGE_KEY).getAsString();
+						String code = payload.get(Constants.CODE).getAsString();
+						String presId = payload.get(Constants.PRESENTATION_ID).getAsString();
+						int numPages = payload.get(Constants.NUM_PAGES).getAsInt();
+						String presName = payload.get(Constants.PRESENTATION_NAME).getAsString();
+						String presBaseUrl = payload.get(Constants.PRESENTATION_BASE_URL).getAsString();
+
+						return new SendConversionCompletedMessage(messageKey, meetingId, code, presId, numPages, presName, presBaseUrl);
+					}
+				} 
+			}
+		}
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendConversionUpdateMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendConversionUpdateMessage.java
new file mode 100755
index 0000000000..58b6d987c8
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendConversionUpdateMessage.java
@@ -0,0 +1,70 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class SendConversionUpdateMessage implements IPublishedMessage {
+	public static final String SEND_CONVERSION_UPDATE = "send_conversion_update";
+	public static final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	public final String messageKey;
+	public final String code;
+	public final String presId;
+	public final String presName;
+
+
+	public SendConversionUpdateMessage(String messageKey, String meetingId,
+			String code, String presId, String presName) {
+		this.meetingId = meetingId;
+		this.messageKey = messageKey;
+		this.code = code;
+		this.presId = presId;
+		this.presName = presName;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+		payload.put(Constants.MESSAGE_KEY, messageKey);
+		payload.put(Constants.CODE, code);
+		payload.put(Constants.PRESENTATION_ID, presId);
+		payload.put(Constants.PRESENTATION_NAME, presName);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(SEND_CONVERSION_UPDATE, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);
+	}
+
+	public static SendConversionUpdateMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (SEND_CONVERSION_UPDATE.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.MESSAGE_KEY)
+							&& payload.has(Constants.CODE)
+							&& payload.has(Constants.PRESENTATION_NAME)
+							&& payload.has(Constants.PRESENTATION_ID)) {
+						String meetingId = payload.get(Constants.MEETING_ID).getAsString();
+						String code = payload.get(Constants.CODE).getAsString();
+						String messageKey = payload.get(Constants.MESSAGE_KEY).getAsString();
+						String presId = payload.get(Constants.PRESENTATION_ID).getAsString();
+						String presName = payload.get(Constants.PRESENTATION_NAME).getAsString();
+
+						return new SendConversionUpdateMessage(messageKey, meetingId, code, presId, presName);
+					}
+				} 
+			}
+		}
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendCursorUpdateMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendCursorUpdateMessage.java
new file mode 100755
index 0000000000..c81e8e3ec3
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendCursorUpdateMessage.java
@@ -0,0 +1,58 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class SendCursorUpdateMessage implements IPublishedMessage {
+	public static final String SEND_CURSOR_UPDATE = "send_cursor_update";
+	public static final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	public final double xPercent;
+	public final double yPercent;
+
+	public SendCursorUpdateMessage(String meetingId, double xPercent, double yPercent){
+		this.meetingId = meetingId;
+		this.xPercent = xPercent;
+		this.yPercent = yPercent;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+		payload.put(Constants.X_PERCENT, xPercent);
+		payload.put(Constants.Y_PERCENT, yPercent);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(SEND_CURSOR_UPDATE, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);
+	}
+
+	public static SendCursorUpdateMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (SEND_CURSOR_UPDATE.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID)
+							&& payload.has(Constants.X_PERCENT)
+							&& payload.has(Constants.Y_PERCENT)) {
+						String meetingId = payload.get(Constants.MEETING_ID).getAsString();
+						double xPercent = payload.get(Constants.X_PERCENT).getAsDouble();
+						double yPercent = payload.get(Constants.Y_PERCENT).getAsDouble();
+
+						return new SendCursorUpdateMessage(meetingId, xPercent, yPercent);
+					}
+				}
+			}
+		}
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendLockSettingsMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendLockSettingsMessage.java
new file mode 100755
index 0000000000..a986d31220
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendLockSettingsMessage.java
@@ -0,0 +1,91 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class SendLockSettingsMessage implements IPublishedMessage {
+	public static final String SEND_LOCK_SETTINGS = "send_lock_settings";
+	public static final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	public final String userId;
+	public final Map<String, Boolean> newSettings;
+
+
+	public SendLockSettingsMessage(String meetingId, String userId, Map<String, Boolean> newSettings) {
+		this.meetingId = meetingId;
+		this.userId = userId;
+		this.newSettings = newSettings;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+
+		Map<String, Boolean> settingsMap = new HashMap<String, Boolean>();
+
+		settingsMap.put(Constants.DISABLE_CAMERA, newSettings.get("disableCam"));
+		settingsMap.put(Constants.DISABLE_MICROPHONE, newSettings.get("disableMic"));
+		settingsMap.put(Constants.DISABLE_PRIVATE_CHAT, newSettings.get("disablePrivateChat"));
+		settingsMap.put(Constants.DISABLE_PUBLIC_CHAT, newSettings.get("disablePublicChat"));
+		settingsMap.put(Constants.LOCKED_LAYOUT, newSettings.get("lockedLayout"));
+		settingsMap.put(Constants.LOCK_ON_JOIN, newSettings.get("lockOnJoin"));
+		settingsMap.put(Constants.LOCK_ON_JOIN_CONFIGURABLE, newSettings.get("lockOnJoinConfigurable"));
+
+		payload.put(Constants.MEETING_ID, meetingId);
+		payload.put(Constants.USER_ID, userId);
+		payload.put(Constants.SETTINGS, settingsMap);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(SEND_LOCK_SETTINGS, VERSION, null);
+		return MessageBuilder.buildJson(header, payload);
+	}
+
+	public static SendLockSettingsMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (SEND_LOCK_SETTINGS.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID)
+							&& payload.has(Constants.USER_ID)
+							&& payload.has(Constants.SETTINGS)) {
+
+						JsonObject settingsObj = (JsonObject) payload.get(Constants.SETTINGS).getAsJsonObject();
+						if (settingsObj.has(Constants.DISABLE_CAMERA)
+								&& settingsObj.has(Constants.DISABLE_CAMERA)
+								&& settingsObj.has(Constants.DISABLE_MICROPHONE)
+								&& settingsObj.has(Constants.DISABLE_PRIVATE_CHAT)
+								&& settingsObj.has(Constants.DISABLE_PUBLIC_CHAT)
+								&& settingsObj.has(Constants.LOCKED_LAYOUT)
+								&& settingsObj.has(Constants.LOCK_ON_JOIN)
+								&& settingsObj.has(Constants.LOCK_ON_JOIN_CONFIGURABLE)) {
+
+							Map<String, Boolean> settingsMap = new HashMap<String, Boolean>();
+
+							settingsMap.put("disableCam", settingsObj.get(Constants.DISABLE_CAMERA).getAsBoolean());
+							settingsMap.put("disableMic", settingsObj.get(Constants.DISABLE_MICROPHONE).getAsBoolean());
+							settingsMap.put("disablePrivateChat", settingsObj.get(Constants.DISABLE_PRIVATE_CHAT).getAsBoolean());
+							settingsMap.put("disablePublicChat", settingsObj.get(Constants.DISABLE_PUBLIC_CHAT).getAsBoolean());
+							settingsMap.put("lockedLayout", settingsObj.get(Constants.LOCKED_LAYOUT).getAsBoolean());
+							settingsMap.put("lockOnJoin", settingsObj.get(Constants.LOCK_ON_JOIN).getAsBoolean());
+							settingsMap.put("lockOnJoinConfigurable", settingsObj.get(Constants.LOCK_ON_JOIN_CONFIGURABLE).getAsBoolean());
+
+							String meetingId = payload.get(Constants.MEETING_ID).getAsString();
+							String userId = payload.get(Constants.USER_ID).getAsString();
+
+							return new SendLockSettingsMessage(meetingId, userId, settingsMap);
+						}
+					}
+				}
+			}
+		}
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendPageCountErrorMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendPageCountErrorMessage.java
new file mode 100755
index 0000000000..3adc9fa711
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendPageCountErrorMessage.java
@@ -0,0 +1,80 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class SendPageCountErrorMessage implements IPublishedMessage {
+	public static final String SEND_PAGE_COUNT_ERROR = "send_page_count_error";
+	public static final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	public final String messageKey;
+	public final String code;
+	public final String presId;
+	public final int numberOfPages;
+	public final int maxNumberPages;
+	public final String presName;
+
+	public SendPageCountErrorMessage(String messageKey, String meetingId,
+			String code, String presId, int numberOfPages, int maxNumberPages,
+			String presName) {
+		this.meetingId = meetingId;
+		this.messageKey = messageKey;
+		this.code = code;
+		this.presId = presId;
+		this.numberOfPages = numberOfPages;
+		this.maxNumberPages = maxNumberPages;
+		this.presName = presName;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+		payload.put(Constants.MESSAGE_KEY, messageKey);
+		payload.put(Constants.CODE, code);
+		payload.put(Constants.PRESENTATION_ID, presId);
+		payload.put(Constants.NUM_PAGES, numberOfPages);
+		payload.put(Constants.MAX_NUM_PAGES, maxNumberPages);
+		payload.put(Constants.PRESENTATION_NAME, presName);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(SEND_PAGE_COUNT_ERROR, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);
+	}
+
+	public static SendPageCountErrorMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (SEND_PAGE_COUNT_ERROR.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.MESSAGE_KEY)
+							&& payload.has(Constants.CODE)
+							&& payload.has(Constants.PRESENTATION_ID)
+							&& payload.has(Constants.MAX_NUM_PAGES)
+							&& payload.has(Constants.NUM_PAGES)
+							&& payload.has(Constants.PRESENTATION_NAME)) {
+						String meetingId = payload.get(Constants.MEETING_ID).getAsString();
+						String messageKey = payload.get(Constants.MESSAGE_KEY).getAsString();
+						String code = payload.get(Constants.CODE).getAsString();
+						String presId = payload.get(Constants.PRESENTATION_ID).getAsString();
+						int numberOfPages = payload.get(Constants.NUM_PAGES).getAsInt();
+						int maxNumberPages = payload.get(Constants.MAX_NUM_PAGES).getAsInt();
+						String presName = payload.get(Constants.PRESENTATION_NAME).getAsString();
+
+						return new SendPageCountErrorMessage(messageKey, meetingId, code, presId, numberOfPages, maxNumberPages, presName);
+					}
+				}
+			}
+		}
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendPrivateChatMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendPrivateChatMessage.java
new file mode 100755
index 0000000000..35dcadcf76
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendPrivateChatMessage.java
@@ -0,0 +1,115 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+import java.util.Map;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class SendPrivateChatMessage implements IPublishedMessage {
+	public static final String SEND_PRIVATE_CHAT_MESSAGE = "send_private_chat_message";
+	public static final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	public final String requesterId;
+	public final Map<String, String> messageInfo;
+
+	public SendPrivateChatMessage(String meetingId, String requesterId,
+			Map<String, String> message) {
+		this.meetingId = meetingId;
+		this.requesterId = requesterId;
+		this.messageInfo = message;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+
+		Map<String, String> message = new HashMap<String, String>();
+
+		message.put(ChatKeyUtil.CHAT_TYPE, messageInfo.get(ChatKeyUtil.CHAT_TYPE));
+		message.put(ChatKeyUtil.MESSAGE, messageInfo.get(ChatKeyUtil.MESSAGE));
+		message.put(ChatKeyUtil.TO_USERNAME, messageInfo.get(ChatKeyUtil.TO_USERNAME));
+		message.put(ChatKeyUtil.FROM_TZ_OFFSET, messageInfo.get(ChatKeyUtil.FROM_TZ_OFFSET));
+		message.put(ChatKeyUtil.FROM_COLOR, messageInfo.get(ChatKeyUtil.FROM_COLOR));
+		message.put(ChatKeyUtil.TO_USERID, messageInfo.get(ChatKeyUtil.TO_USERID));
+		message.put(ChatKeyUtil.FROM_USERID, messageInfo.get(ChatKeyUtil.FROM_USERID));
+		message.put(ChatKeyUtil.FROM_TIME, messageInfo.get(ChatKeyUtil.FROM_TIME));
+		message.put(ChatKeyUtil.FROM_USERNAME, messageInfo.get(ChatKeyUtil.FROM_USERNAME));
+
+		payload.put(Constants.MESSAGE, message);
+		payload.put(Constants.MEETING_ID, meetingId);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(SEND_PRIVATE_CHAT_MESSAGE, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);
+	}
+
+	public static SendPrivateChatMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (SEND_PRIVATE_CHAT_MESSAGE.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.MESSAGE)) {
+						String meetingId = payload.get(Constants.MEETING_ID).getAsString();
+
+						JsonObject msgObj = (JsonObject) payload.get(Constants.MESSAGE).getAsJsonObject();
+						Map<String, String> messageInfo = new HashMap<String, String>();
+
+						if (msgObj.has(ChatKeyUtil.CHAT_TYPE) 
+								&& msgObj.has(ChatKeyUtil.MESSAGE)
+								&& msgObj.has(ChatKeyUtil.TO_USERNAME)
+								&& msgObj.has(ChatKeyUtil.FROM_TZ_OFFSET)
+								&& msgObj.has(ChatKeyUtil.FROM_COLOR)
+								&& msgObj.has(ChatKeyUtil.TO_USERID)
+								&& msgObj.has(ChatKeyUtil.FROM_USERID)
+								&& msgObj.has(ChatKeyUtil.FROM_TIME)
+								&& msgObj.has(ChatKeyUtil.FROM_USERNAME)){
+							messageInfo.put(ChatKeyUtil.CHAT_TYPE, msgObj.get(ChatKeyUtil.CHAT_TYPE).getAsString());
+							messageInfo.put(ChatKeyUtil.MESSAGE, msgObj.get(ChatKeyUtil.MESSAGE).getAsString());
+							messageInfo.put(ChatKeyUtil.TO_USERNAME, msgObj.get(ChatKeyUtil.TO_USERNAME).getAsString());
+							messageInfo.put(ChatKeyUtil.FROM_TZ_OFFSET, msgObj.get(ChatKeyUtil.FROM_TZ_OFFSET).getAsString());
+							messageInfo.put(ChatKeyUtil.FROM_COLOR, msgObj.get(ChatKeyUtil.FROM_COLOR).getAsString());
+							messageInfo.put(ChatKeyUtil.TO_USERID, msgObj.get(ChatKeyUtil.TO_USERID).getAsString());
+							messageInfo.put(ChatKeyUtil.FROM_USERID, msgObj.get(ChatKeyUtil.FROM_USERID).getAsString());
+							messageInfo.put(ChatKeyUtil.FROM_TIME, msgObj.get(ChatKeyUtil.FROM_TIME).getAsString());
+							messageInfo.put(ChatKeyUtil.FROM_USERNAME, msgObj.get(ChatKeyUtil.FROM_USERNAME).getAsString());
+
+							String requesterId = messageInfo.get(ChatKeyUtil.FROM_USERID);
+
+							return new SendPrivateChatMessage(meetingId, requesterId, messageInfo);
+						} else if (msgObj.has(Constants.CHAT_TYPE) 
+								&& msgObj.has(Constants.MESSAGE)
+								&& msgObj.has(Constants.TO_USERNAME)
+								&& msgObj.has(Constants.FROM_TZ_OFFSET)
+								&& msgObj.has(Constants.FROM_COLOR)
+								&& msgObj.has(Constants.TO_USERID)
+								&& msgObj.has(Constants.FROM_USERID)
+								&& msgObj.has(Constants.FROM_TIME)
+								&& msgObj.has(Constants.FROM_USERNAME)){
+							messageInfo.put(ChatKeyUtil.CHAT_TYPE, msgObj.get(Constants.CHAT_TYPE).getAsString());
+							messageInfo.put(ChatKeyUtil.MESSAGE, msgObj.get(Constants.MESSAGE).getAsString());
+							messageInfo.put(ChatKeyUtil.TO_USERNAME, msgObj.get(Constants.TO_USERNAME).getAsString());
+							messageInfo.put(ChatKeyUtil.FROM_TZ_OFFSET, msgObj.get(Constants.FROM_TZ_OFFSET).getAsString());
+							messageInfo.put(ChatKeyUtil.FROM_COLOR, msgObj.get(Constants.FROM_COLOR).getAsString());
+							messageInfo.put(ChatKeyUtil.TO_USERID, msgObj.get(Constants.TO_USERID).getAsString());
+							messageInfo.put(ChatKeyUtil.FROM_USERID, msgObj.get(Constants.FROM_USERID).getAsString());
+							messageInfo.put(ChatKeyUtil.FROM_TIME, msgObj.get(Constants.FROM_TIME).getAsString());
+							messageInfo.put(ChatKeyUtil.FROM_USERNAME, msgObj.get(Constants.FROM_USERNAME).getAsString());
+
+							String requesterId = messageInfo.get(ChatKeyUtil.FROM_USERID);
+
+							return new SendPrivateChatMessage(meetingId, requesterId, messageInfo);
+						}
+					}
+				} 
+			}
+		}
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendPublicChatMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendPublicChatMessage.java
new file mode 100755
index 0000000000..b937264317
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendPublicChatMessage.java
@@ -0,0 +1,115 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+import java.util.Map;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class SendPublicChatMessage implements IPublishedMessage {
+	public static final String SEND_PUBLIC_CHAT_MESSAGE = "send_public_chat_message";
+	public static final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	public final String requesterId;
+	public final Map<String, String> messageInfo;
+
+	public SendPublicChatMessage(String meetingId, String requesterId,
+			Map<String, String> message) {
+		this.meetingId = meetingId;
+		this.requesterId = requesterId;
+		this.messageInfo = message;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+
+		Map<String, String> message = new HashMap<String, String>();
+
+		message.put(ChatKeyUtil.CHAT_TYPE, messageInfo.get(ChatKeyUtil.CHAT_TYPE));
+		message.put(ChatKeyUtil.MESSAGE, messageInfo.get(ChatKeyUtil.MESSAGE));
+		message.put(ChatKeyUtil.TO_USERNAME, messageInfo.get(ChatKeyUtil.TO_USERNAME));
+		message.put(ChatKeyUtil.FROM_TZ_OFFSET, messageInfo.get(ChatKeyUtil.FROM_TZ_OFFSET));
+		message.put(ChatKeyUtil.FROM_COLOR, messageInfo.get(ChatKeyUtil.FROM_COLOR));
+		message.put(ChatKeyUtil.TO_USERID, messageInfo.get(ChatKeyUtil.TO_USERID));
+		message.put(ChatKeyUtil.FROM_USERID, messageInfo.get(ChatKeyUtil.FROM_USERID));
+		message.put(ChatKeyUtil.FROM_TIME, messageInfo.get(ChatKeyUtil.FROM_TIME));
+		message.put(ChatKeyUtil.FROM_USERNAME, messageInfo.get(ChatKeyUtil.FROM_USERNAME));
+
+		payload.put(Constants.MESSAGE, message);
+		payload.put(Constants.MEETING_ID, meetingId);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(SEND_PUBLIC_CHAT_MESSAGE, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);
+	}
+
+	public static SendPublicChatMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (SEND_PUBLIC_CHAT_MESSAGE.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.MESSAGE)) {
+						String meetingId = payload.get(Constants.MEETING_ID).getAsString();
+
+						JsonObject msgObj = (JsonObject) payload.get(Constants.MESSAGE).getAsJsonObject();
+						Map<String, String> messageInfo = new HashMap<String, String>();
+
+						if (msgObj.has(ChatKeyUtil.CHAT_TYPE) 
+								&& msgObj.has(ChatKeyUtil.MESSAGE)
+								&& msgObj.has(ChatKeyUtil.TO_USERNAME)
+								&& msgObj.has(ChatKeyUtil.FROM_TZ_OFFSET)
+								&& msgObj.has(ChatKeyUtil.FROM_COLOR)
+								&& msgObj.has(ChatKeyUtil.TO_USERID)
+								&& msgObj.has(ChatKeyUtil.FROM_USERID)
+								&& msgObj.has(ChatKeyUtil.FROM_TIME)
+								&& msgObj.has(ChatKeyUtil.FROM_USERNAME)){
+							messageInfo.put(ChatKeyUtil.CHAT_TYPE, msgObj.get(ChatKeyUtil.CHAT_TYPE).getAsString());
+							messageInfo.put(ChatKeyUtil.MESSAGE, msgObj.get(ChatKeyUtil.MESSAGE).getAsString());
+							messageInfo.put(ChatKeyUtil.TO_USERNAME, msgObj.get(ChatKeyUtil.TO_USERNAME).getAsString());
+							messageInfo.put(ChatKeyUtil.FROM_TZ_OFFSET, msgObj.get(ChatKeyUtil.FROM_TZ_OFFSET).getAsString());
+							messageInfo.put(ChatKeyUtil.FROM_COLOR, msgObj.get(ChatKeyUtil.FROM_COLOR).getAsString());
+							messageInfo.put(ChatKeyUtil.TO_USERID, msgObj.get(ChatKeyUtil.TO_USERID).getAsString());
+							messageInfo.put(ChatKeyUtil.FROM_USERID, msgObj.get(ChatKeyUtil.FROM_USERID).getAsString());
+							messageInfo.put(ChatKeyUtil.FROM_TIME, msgObj.get(ChatKeyUtil.FROM_TIME).getAsString());
+							messageInfo.put(ChatKeyUtil.FROM_USERNAME, msgObj.get(ChatKeyUtil.FROM_USERNAME).getAsString());
+
+							String requesterId = messageInfo.get(ChatKeyUtil.FROM_USERID);
+
+							return new SendPublicChatMessage(meetingId, requesterId, messageInfo);
+						} else if (msgObj.has(Constants.CHAT_TYPE) 
+								&& msgObj.has(Constants.MESSAGE)
+								&& msgObj.has(Constants.TO_USERNAME)
+								&& msgObj.has(Constants.FROM_TZ_OFFSET)
+								&& msgObj.has(Constants.FROM_COLOR)
+								&& msgObj.has(Constants.TO_USERID)
+								&& msgObj.has(Constants.FROM_USERID)
+								&& msgObj.has(Constants.FROM_TIME)
+								&& msgObj.has(Constants.FROM_USERNAME)){
+							messageInfo.put(ChatKeyUtil.CHAT_TYPE, msgObj.get(Constants.CHAT_TYPE).getAsString());
+							messageInfo.put(ChatKeyUtil.MESSAGE, msgObj.get(Constants.MESSAGE).getAsString());
+							messageInfo.put(ChatKeyUtil.TO_USERNAME, msgObj.get(Constants.TO_USERNAME).getAsString());
+							messageInfo.put(ChatKeyUtil.FROM_TZ_OFFSET, msgObj.get(Constants.FROM_TZ_OFFSET).getAsString());
+							messageInfo.put(ChatKeyUtil.FROM_COLOR, msgObj.get(Constants.FROM_COLOR).getAsString());
+							messageInfo.put(ChatKeyUtil.TO_USERID, msgObj.get(Constants.TO_USERID).getAsString());
+							messageInfo.put(ChatKeyUtil.FROM_USERID, msgObj.get(Constants.FROM_USERID).getAsString());
+							messageInfo.put(ChatKeyUtil.FROM_TIME, msgObj.get(Constants.FROM_TIME).getAsString());
+							messageInfo.put(ChatKeyUtil.FROM_USERNAME, msgObj.get(Constants.FROM_USERNAME).getAsString());
+
+							String requesterId = messageInfo.get(ChatKeyUtil.FROM_USERID);
+
+							return new SendPublicChatMessage(meetingId, requesterId, messageInfo);
+						}
+					}
+				} 
+			}
+		}
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendSlideGeneratedMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendSlideGeneratedMessage.java
new file mode 100755
index 0000000000..bc325b130f
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendSlideGeneratedMessage.java
@@ -0,0 +1,80 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class SendSlideGeneratedMessage implements IPublishedMessage {
+	public static final String SEND_SLIDE_GENERATED = "send_slide_generated";
+	public static final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	public final String messageKey;
+	public final String code;
+	public final String presId;
+	public final int numberOfPages;
+	public final int pagesCompleted;
+	public final String presName;
+
+	public SendSlideGeneratedMessage(String messageKey, String meetingId,
+			String code, String presId, int numberOfPages, int pagesCompleted,
+			String presName) {
+		this.meetingId = meetingId;
+		this.messageKey = messageKey;
+		this.code = code;
+		this.presId = presId;
+		this.numberOfPages = numberOfPages;
+		this.pagesCompleted = pagesCompleted;
+		this.presName = presName;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+		payload.put(Constants.MESSAGE_KEY, messageKey);
+		payload.put(Constants.CODE, code);
+		payload.put(Constants.PRESENTATION_ID, presId);
+		payload.put(Constants.NUM_PAGES, numberOfPages);
+		payload.put(Constants.PAGES_COMPLETED, pagesCompleted);
+		payload.put(Constants.PRESENTATION_NAME, presName);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(SEND_SLIDE_GENERATED, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);
+	}
+
+	public static SendSlideGeneratedMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (SEND_SLIDE_GENERATED.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.MESSAGE_KEY)
+							&& payload.has(Constants.CODE)
+							&& payload.has(Constants.PRESENTATION_ID)
+							&& payload.has(Constants.PAGES_COMPLETED)
+							&& payload.has(Constants.NUM_PAGES)
+							&& payload.has(Constants.PRESENTATION_NAME)) {
+						String meetingId = payload.get(Constants.MEETING_ID).getAsString();
+						String messageKey = payload.get(Constants.MESSAGE_KEY).getAsString();
+						String code = payload.get(Constants.CODE).getAsString();
+						String presId = payload.get(Constants.PRESENTATION_ID).getAsString();
+						int numberOfPages = payload.get(Constants.NUM_PAGES).getAsInt();
+						int pagesCompleted = payload.get(Constants.PAGES_COMPLETED).getAsInt();
+						String presName = payload.get(Constants.PRESENTATION_NAME).getAsString();
+
+						return new SendSlideGeneratedMessage(messageKey, meetingId, code, presId, numberOfPages, pagesCompleted, presName);
+					}
+				}
+			}
+		}
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendWhiteboardAnnotationReplyMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendWhiteboardAnnotationReplyMessage.java
new file mode 100755
index 0000000000..34cc4800ed
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendWhiteboardAnnotationReplyMessage.java
@@ -0,0 +1,71 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class SendWhiteboardAnnotationReplyMessage implements ISubscribedMessage {
+	public static final String SEND_WHITEBOARD_ANNOTATION_REPLY = "send_whiteboard_shape_message";
+	public static final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	public final String requesterId;
+	public final String whiteboardId;
+	public final Map<String, Object> shape;
+
+
+	public SendWhiteboardAnnotationReplyMessage(String meetingId, String requesterId,
+			String whiteboardId, Map<String, Object> shape) {
+		this.meetingId = meetingId;
+		this.whiteboardId = whiteboardId;
+		this.requesterId = requesterId;
+		this.shape = shape;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+		payload.put(Constants.SHAPE, shape);
+		payload.put(Constants.WHITEBOARD_ID, whiteboardId);
+		payload.put(Constants.REQUESTER_ID, requesterId);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(SEND_WHITEBOARD_ANNOTATION_REPLY, VERSION, null);
+		return MessageBuilder.buildJson(header, payload);
+	}
+
+	public static SendWhiteboardAnnotationReplyMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (SEND_WHITEBOARD_ANNOTATION_REPLY.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.WHITEBOARD_ID)
+							&& payload.has(Constants.SHAPE)
+							&& payload.has(Constants.REQUESTER_ID)) {
+						String meetingId = payload.get(Constants.MEETING_ID).getAsString();
+						String requesterId = payload.get(Constants.REQUESTER_ID).getAsString();
+						String whiteboardId = payload.get(Constants.WHITEBOARD_ID).getAsString();
+
+						JsonObject shape = (JsonObject) payload.get(Constants.SHAPE);
+
+						Util util = new Util();
+						Map<String, Object> annotation = util.extractOuterAnnotation(shape);
+
+						return new SendWhiteboardAnnotationReplyMessage(meetingId, requesterId,
+								whiteboardId, annotation);
+					}
+				} 
+			}
+		}
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendWhiteboardAnnotationRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendWhiteboardAnnotationRequestMessage.java
new file mode 100755
index 0000000000..8a4723e540
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SendWhiteboardAnnotationRequestMessage.java
@@ -0,0 +1,61 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+import java.util.Map;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class SendWhiteboardAnnotationRequestMessage implements ISubscribedMessage {
+	public static final String SEND_WHITEBOARD_ANNOTATION_REQUEST = "send_whiteboard_annotation_request";
+	public static final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	public final String requesterId;
+	public final Map<String, Object> annotation;
+
+
+	public SendWhiteboardAnnotationRequestMessage(String meetingId,
+			String requesterId, Map<String, Object> annotation) {
+		this.meetingId = meetingId;
+		this.requesterId = requesterId;
+		this.annotation = annotation;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+		payload.put(Constants.REQUESTER_ID, requesterId);
+		payload.put(Constants.ANNOTATION, annotation);
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(SEND_WHITEBOARD_ANNOTATION_REQUEST, VERSION, null);
+		return MessageBuilder.buildJson(header, payload);
+	}
+
+	public static SendWhiteboardAnnotationRequestMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (SEND_WHITEBOARD_ANNOTATION_REQUEST.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.ANNOTATION)
+							&& payload.has(Constants.REQUESTER_ID)) {
+						String meetingId = payload.get(Constants.MEETING_ID).getAsString();
+						String requesterId = payload.get(Constants.REQUESTER_ID).getAsString();
+
+						JsonObject annotationElement = (JsonObject) payload.get(Constants.ANNOTATION);
+
+						Util util = new Util();
+						Map<String, Object> annotation = util.extractAnnotation(annotationElement);
+
+						return new SendWhiteboardAnnotationRequestMessage(meetingId, requesterId, annotation);
+					}
+				}
+			}
+		}
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SetRecordingStatusRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SetRecordingStatusRequestMessage.java
new file mode 100755
index 0000000000..5fdd73ad6f
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SetRecordingStatusRequestMessage.java
@@ -0,0 +1,59 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class SetRecordingStatusRequestMessage implements ISubscribedMessage {
+	public static final String SET_RECORDING_STATUS_REQUEST  = "set_recording_status_request_message";
+	public static final String VERSION = "0.0.1";
+	
+	public final String meetingId;
+	public final String userId;
+	public final Boolean recording;
+	
+	public SetRecordingStatusRequestMessage(String meetingId, String userId, Boolean recording) {
+		this.meetingId = meetingId;
+		this.userId = userId;
+		this.recording = recording;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId); 
+		payload.put(Constants.USER_ID, userId);
+		payload.put(Constants.RECORDING, recording);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(SET_RECORDING_STATUS_REQUEST, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static SetRecordingStatusRequestMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (SET_RECORDING_STATUS_REQUEST.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.USER_ID)
+							&& payload.has(Constants.RECORDING)) {
+						String id = payload.get(Constants.MEETING_ID).getAsString();
+						String userid = payload.get(Constants.USER_ID).getAsString();
+						Boolean recording = payload.get(Constants.RECORDING).getAsBoolean();
+						return new SetRecordingStatusRequestMessage(id, userid, recording);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SetUserStatusRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SetUserStatusRequestMessage.java
new file mode 100755
index 0000000000..e338a1b41a
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SetUserStatusRequestMessage.java
@@ -0,0 +1,64 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class SetUserStatusRequestMessage implements ISubscribedMessage {
+	public static final String SET_USER_STATUS_REQUEST  = "set_user_status_request_message";
+	public static final String VERSION = "0.0.1";
+	
+	public final String meetingId;
+	public final String userId;
+	public final String status;
+	public final String value;
+
+	public SetUserStatusRequestMessage(String meetingId, String userId, String status, String value) {
+		this.meetingId = meetingId;
+		this.userId = userId;
+		this.status = status;
+		this.value = value;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId); 
+		payload.put(Constants.USER_ID, userId);
+		payload.put(Constants.STATUS, status);
+		payload.put(Constants.VALUE, value);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(SET_USER_STATUS_REQUEST, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static SetUserStatusRequestMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (SET_USER_STATUS_REQUEST.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.USER_ID)
+							&& payload.has(Constants.STATUS)
+							&& payload.has(Constants.VALUE)) {
+						String id = payload.get(Constants.MEETING_ID).getAsString();
+						String userid = payload.get(Constants.USER_ID).getAsString();
+						String status = payload.get(Constants.STATUS).getAsString();
+						String value = payload.get(Constants.VALUE).getAsString();
+						return new SetUserStatusRequestMessage(id, userid, status, value);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SharePresentationMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SharePresentationMessage.java
new file mode 100755
index 0000000000..cf4c114d9f
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/SharePresentationMessage.java
@@ -0,0 +1,59 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class SharePresentationMessage implements IPublishedMessage {
+	public static final String SHARE_PRESENTATION = "share_presentation";
+	public static final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	public final String presentationId;
+	public final boolean share;
+
+	public SharePresentationMessage(String meetingId, String presentationId,
+			boolean share){
+		this.meetingId = meetingId;
+		this.presentationId = presentationId;
+		this.share = share;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+		payload.put(Constants.PRESENTATION_ID, presentationId);
+		payload.put(Constants.SHARE, share);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(SHARE_PRESENTATION, VERSION, null);
+		
+		return MessageBuilder.buildJson(header, payload);
+	}
+
+	public static SharePresentationMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (SHARE_PRESENTATION.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID)
+							&& payload.has(Constants.PRESENTATION_ID)
+							&& payload.has(Constants.SHARE)) {
+						String meetingId = payload.get(Constants.MEETING_ID).getAsString();
+						String presentationId = payload.get(Constants.PRESENTATION_ID).getAsString();
+						boolean share = payload.get(Constants.SHARE).getAsBoolean();
+
+						return new SharePresentationMessage(meetingId, presentationId, share);
+					}
+				}
+			}
+		}
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/StartRecordingVoiceConfRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/StartRecordingVoiceConfRequestMessage.java
new file mode 100755
index 0000000000..40c519e29c
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/StartRecordingVoiceConfRequestMessage.java
@@ -0,0 +1,56 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class StartRecordingVoiceConfRequestMessage {
+	public static final String START_RECORD_VOICE_CONF_REQUEST  = "start_recording_voice_conf_request_message";
+	public static final String VERSION = "0.0.1";
+	
+	public static final String MEETING_ID = "meeting_id";
+	public static final String VOICE_CONF_ID = "voice_conf_id";
+	
+	public final String meetingId;
+	public final String voiceConfId;
+
+	public StartRecordingVoiceConfRequestMessage(String meetingId, String voiceConfId) {
+		this.meetingId = meetingId;
+		this.voiceConfId = voiceConfId;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(MEETING_ID, meetingId); 
+		payload.put(VOICE_CONF_ID, voiceConfId);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(START_RECORD_VOICE_CONF_REQUEST, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static StartRecordingVoiceConfRequestMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (START_RECORD_VOICE_CONF_REQUEST.equals(messageName)) {
+					if (payload.has(MEETING_ID) 
+							&& payload.has(VOICE_CONF_ID)) {
+						String id = payload.get(MEETING_ID).getAsString();
+						String voiceConfId = payload.get(VOICE_CONF_ID).getAsString();
+						return new StartRecordingVoiceConfRequestMessage(id, voiceConfId);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/StopRecordingVoiceConfRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/StopRecordingVoiceConfRequestMessage.java
new file mode 100755
index 0000000000..fb84f12ef6
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/StopRecordingVoiceConfRequestMessage.java
@@ -0,0 +1,62 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class StopRecordingVoiceConfRequestMessage {
+	public static final String RECORD_VOICE_CONF_REQUEST  = "stop_recording_voice_conf_request_message";
+	public static final String VERSION = "0.0.1";
+	
+	public static final String MEETING_ID = "meeting_id";
+	public static final String VOICE_CONF_ID = "voice_conf_id";
+	public static final String RECORD_STREAM = "record_stream";
+	
+	public final String meetingId;
+	public final String voiceConfId;
+	public final String recordStream;
+
+	public StopRecordingVoiceConfRequestMessage(String meetingId, String voiceConfId, String recordStream) {
+		this.meetingId = meetingId;
+		this.voiceConfId = voiceConfId;
+		this.recordStream = recordStream;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(MEETING_ID, meetingId); 
+		payload.put(VOICE_CONF_ID, voiceConfId);
+		payload.put(RECORD_STREAM, recordStream);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(RECORD_VOICE_CONF_REQUEST, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static StopRecordingVoiceConfRequestMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (RECORD_VOICE_CONF_REQUEST.equals(messageName)) {
+					if (payload.has(MEETING_ID) 
+							&& payload.has(VOICE_CONF_ID)
+							&& payload.has(RECORD_STREAM)) {
+						String id = payload.get(MEETING_ID).getAsString();
+						String voiceConfId = payload.get(VOICE_CONF_ID).getAsString();
+						String recordStream = payload.get(RECORD_STREAM).getAsString();
+						return new StopRecordingVoiceConfRequestMessage(id, voiceConfId, recordStream);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UndoWhiteboardReplyMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UndoWhiteboardReplyMessage.java
new file mode 100755
index 0000000000..ae9b01df01
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UndoWhiteboardReplyMessage.java
@@ -0,0 +1,68 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class UndoWhiteboardReplyMessage implements ISubscribedMessage {
+
+	// the name of this event should be undo_whiteboard_reply (as it corresponds
+	// to undo_whiteboard_request which entered bbb-apps)
+	// However, on the clients we use undo_whiteboard_request for both request and reply
+	// 
+	// The only difference is shapeId here. Plus this message is on channel FROM_WHITEBOARD_CHANNEL
+	public static final String UNDO_WHITEBOARD_REPLY = "undo_whiteboard_request";//see note above
+	public static final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	public final String whiteboardId;
+	public final String requesterId;
+	public final String shapeId;
+
+
+	public UndoWhiteboardReplyMessage(String meetingId, String requesterId, String whiteboardId, String shapeId) {
+		this.meetingId = meetingId;
+		this.whiteboardId = whiteboardId;
+		this.requesterId = requesterId;
+		this.shapeId = shapeId;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+		payload.put(Constants.WHITEBOARD_ID, whiteboardId);
+		payload.put(Constants.REQUESTER_ID, requesterId);
+		payload.put(Constants.SHAPE_ID, shapeId);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(UNDO_WHITEBOARD_REPLY, VERSION, null);
+		return MessageBuilder.buildJson(header, payload);
+	}
+
+	public static UndoWhiteboardReplyMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (UNDO_WHITEBOARD_REPLY.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.WHITEBOARD_ID)
+							&& payload.has(Constants.SHAPE_ID)
+							&& payload.has(Constants.REQUESTER_ID)) {
+						String meetingId = payload.get(Constants.MEETING_ID).getAsString();
+						String whiteboardId = payload.get(Constants.WHITEBOARD_ID).getAsString();
+						String shapeId = payload.get(Constants.SHAPE_ID).getAsString();
+						String requesterId = payload.get(Constants.REQUESTER_ID).getAsString();
+
+						return new UndoWhiteboardReplyMessage(meetingId, requesterId, whiteboardId, shapeId);
+					}
+				}
+			}
+		}
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UndoWhiteboardRequest.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UndoWhiteboardRequest.java
new file mode 100755
index 0000000000..b6c3709a3b
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UndoWhiteboardRequest.java
@@ -0,0 +1,58 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class UndoWhiteboardRequest implements ISubscribedMessage {
+	public static final String UNDO_WHITEBOARD_REQUEST = "undo_whiteboard_request";
+	public static final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	public final String whiteboardId;
+	public final String requesterId;
+
+
+	public UndoWhiteboardRequest(String meetingId, String requesterId, String whiteboardId) {
+		this.meetingId = meetingId;
+		this.whiteboardId = whiteboardId;
+		this.requesterId = requesterId;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+		payload.put(Constants.WHITEBOARD_ID, whiteboardId);
+		payload.put(Constants.REQUESTER_ID, requesterId);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(UNDO_WHITEBOARD_REQUEST, VERSION, null);
+		return MessageBuilder.buildJson(header, payload);
+	}
+
+	public static UndoWhiteboardRequest fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (UNDO_WHITEBOARD_REQUEST.equals(messageName)) {
+
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.WHITEBOARD_ID)
+							&& payload.has(Constants.REQUESTER_ID)) {
+						String meetingId = payload.get(Constants.MEETING_ID).getAsString();
+						String whiteboardId = payload.get(Constants.WHITEBOARD_ID).getAsString();
+						String requesterId = payload.get(Constants.REQUESTER_ID).getAsString();
+
+						return new UndoWhiteboardRequest(meetingId, requesterId, whiteboardId);
+					}
+				}
+			}
+		}
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserConnectedToGlobalAudio.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserConnectedToGlobalAudio.java
new file mode 100755
index 0000000000..a58cec926e
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserConnectedToGlobalAudio.java
@@ -0,0 +1,59 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class UserConnectedToGlobalAudio implements IPublishedMessage {
+	public static final String USER_CONNECTED_TO_GLOBAL_AUDIO = "user_connected_to_global_audio";
+	public static final String VERSION = "0.0.1";
+
+	public final String voiceConf;
+	public final String name;
+	public final String userid;
+
+
+  
+	public UserConnectedToGlobalAudio(String voiceConf, String userid, String name) {
+		this.voiceConf = voiceConf;
+		this.userid = userid;
+		this.name = name;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.VOICE_CONF, voiceConf);
+        payload.put(Constants.USER_ID, userid);
+        payload.put(Constants.NAME, name);		
+				
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_CONNECTED_TO_GLOBAL_AUDIO, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static UserConnectedToGlobalAudio fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (USER_CONNECTED_TO_GLOBAL_AUDIO.equals(messageName)) {
+					if (payload.has(Constants.VOICE_CONF) 
+							&& payload.has(Constants.USER_ID)
+							&& payload.has(Constants.NAME)) {
+						String voiceConf = payload.get(Constants.VOICE_CONF).getAsString();
+						String userid = payload.get(Constants.USER_ID).getAsString();
+						String name = payload.get(Constants.NAME).getAsString();
+						return new UserConnectedToGlobalAudio(voiceConf, userid, name);						
+					}
+				} 
+			}
+		}
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserDisconnectedFromGlobalAudio.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserDisconnectedFromGlobalAudio.java
new file mode 100755
index 0000000000..95218e2787
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserDisconnectedFromGlobalAudio.java
@@ -0,0 +1,57 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class UserDisconnectedFromGlobalAudio implements IPublishedMessage {
+	public static final String USER_DISCONNECTED_FROM_GLOBAL_AUDIO = "user_disconnected_from_global_audio";
+	public static final String VERSION = "0.0.1";
+
+	public final String voiceConf;
+	public final String name;
+	public final String userid;
+	
+	public UserDisconnectedFromGlobalAudio(String voiceConf, String userid, String name) {
+		this.voiceConf = voiceConf;
+		this.userid = userid;
+		this.name = name;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.VOICE_CONF, voiceConf);
+        payload.put(Constants.USER_ID, userid);
+        payload.put(Constants.NAME, name);		
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_DISCONNECTED_FROM_GLOBAL_AUDIO, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static UserDisconnectedFromGlobalAudio fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (USER_DISCONNECTED_FROM_GLOBAL_AUDIO.equals(messageName)) {
+					if (payload.has(Constants.VOICE_CONF) 
+							&& payload.has(Constants.USER_ID)
+							&& payload.has(Constants.NAME)) {
+						String voiceConf = payload.get(Constants.VOICE_CONF).getAsString();
+						String userid = payload.get(Constants.USER_ID).getAsString();
+						String name = payload.get(Constants.NAME).getAsString();
+						return new UserDisconnectedFromGlobalAudio(voiceConf, userid, name);						
+					} 
+				}
+			}
+		}
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserJoinedMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserJoinedMessage.java
new file mode 100755
index 0000000000..0cd267bc9e
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserJoinedMessage.java
@@ -0,0 +1,59 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class UserJoinedMessage implements ISubscribedMessage {
+	public static final String USER_JOINED = "user_joined_message";
+	public final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	public final Map<String, Object> user;
+
+	public UserJoinedMessage(String meetingID, Map<String, Object> user) {
+		this.meetingId = meetingID;
+		this.user = user;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_JOINED, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	public static UserJoinedMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (USER_JOINED.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID)
+							&& payload.has(Constants.USER)) {
+						String meetingID = payload.get(Constants.MEETING_ID).getAsString();
+						
+						JsonObject user = (JsonObject) payload.get(Constants.USER);
+						
+						Util util = new Util();
+						Map<String, Object> userMap = util.extractUser(user);
+						
+						if (userMap != null) {
+							return new UserJoinedMessage(meetingID, userMap);							
+						}						
+					}
+				}
+			}
+		}
+
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserJoinedVoiceConfMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserJoinedVoiceConfMessage.java
new file mode 100755
index 0000000000..cf8319dab0
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserJoinedVoiceConfMessage.java
@@ -0,0 +1,87 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class UserJoinedVoiceConfMessage {
+	public static final String USER_JOINED_VOICE_CONF  = "user_joined_voice_conf_message";
+	public static final String VERSION = "0.0.1";
+	
+	public static final String VOICE_CONF_ID = "voice_conf_id";
+	public static final String VOICE_USER_ID = "voice_user_id";
+	public static final String USER_ID = "user_id";
+	public static final String CALLER_ID_NAME = "caller_id_name";
+	public static final String CALLER_ID_NUM = "caller_id_num";
+	public static final String MUTED = "muted";
+	public static final String TALKING = "talking";
+	
+	public final String voiceConfId;
+	public final String voiceUserId;
+	public final String userId;
+	public final String callerIdName;
+	public final String callerIdNum;
+	public final Boolean muted;
+	public final Boolean talking;
+	
+	public UserJoinedVoiceConfMessage(String voiceConfId, String voiceUserId, String userId,
+			String callerIdName, String callerIdNum, Boolean muted, Boolean talking) {
+		this.voiceConfId = voiceConfId;
+		this.voiceUserId = voiceUserId;
+		this.userId = userId;
+		this.callerIdName = callerIdName;
+		this.callerIdNum = callerIdNum;
+		this.muted = muted;
+		this.talking = talking;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(VOICE_CONF_ID, voiceConfId);
+		payload.put(VOICE_USER_ID, voiceUserId); 
+		payload.put(USER_ID, userId); 
+		payload.put(CALLER_ID_NAME, callerIdName);
+		payload.put(CALLER_ID_NUM, callerIdNum);
+		payload.put(MUTED, muted);
+		payload.put(TALKING, talking);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_JOINED_VOICE_CONF, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static UserJoinedVoiceConfMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (USER_JOINED_VOICE_CONF.equals(messageName)) {
+					if (payload.has(VOICE_CONF_ID) 
+							&& payload.has(VOICE_USER_ID)
+							&& payload.has(USER_ID)
+							&& payload.has(CALLER_ID_NAME)
+							&& payload.has(CALLER_ID_NUM)
+							&& payload.has(MUTED)
+							&& payload.has(TALKING)) {
+						String voiceConfId = payload.get(VOICE_CONF_ID).getAsString();
+						String voiceUserId = payload.get(VOICE_USER_ID).getAsString();
+						String userId = payload.get(USER_ID).getAsString();
+						String callerIdName = payload.get(CALLER_ID_NAME).getAsString();
+						String callerIdNum = payload.get(CALLER_ID_NUM).getAsString();
+						Boolean muted = payload.get(MUTED).getAsBoolean();
+						Boolean talking = payload.get(TALKING).getAsBoolean();
+						return new UserJoinedVoiceConfMessage(voiceConfId, voiceUserId, userId, callerIdName, callerIdNum, muted, talking);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserJoinedVoiceMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserJoinedVoiceMessage.java
new file mode 100755
index 0000000000..9231fb66c4
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserJoinedVoiceMessage.java
@@ -0,0 +1,66 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class UserJoinedVoiceMessage implements ISubscribedMessage {
+	public static final String USER_JOINED_VOICE  = "user_joined_voice_message";
+	public static final String VERSION = "0.0.1";
+	
+	public final String meetingId;
+	public final Map<String, Object> user;
+	public final String voiceConf;
+	
+	public UserJoinedVoiceMessage(String meetingId, Map<String, Object> user, String voiceConf) {
+		this.meetingId = meetingId;
+		this.user = user;
+		this.voiceConf = voiceConf;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId); 
+		payload.put(Constants.USER, user);
+		payload.put(Constants.VOICE_CONF, voiceConf);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_JOINED_VOICE, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static UserJoinedVoiceMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (USER_JOINED_VOICE.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.USER)) {
+						String id = payload.get(Constants.MEETING_ID).getAsString();
+						String voiceConf = payload.get(Constants.VOICE_CONF).getAsString();
+						
+						JsonObject user = (JsonObject) payload.get(Constants.USER);
+						
+						Util util = new Util();
+						Map<String, Object> userMap = util.extractUser(user);
+						
+						if (userMap != null) {
+							return new UserJoinedVoiceMessage(id, userMap, voiceConf);						
+						}				
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLeavingMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLeavingMessage.java
new file mode 100755
index 0000000000..8945520836
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLeavingMessage.java
@@ -0,0 +1,52 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class UserLeavingMessage implements ISubscribedMessage {
+	public static final String USER_LEAVING = "user_leaving_request";
+	public final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	public final String userId;
+
+	public UserLeavingMessage(String meetingID, String internalUserId) {
+		this.meetingId = meetingID;
+		this.userId = internalUserId;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+		payload.put(Constants.USER_ID, userId);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_LEAVING, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	public static UserLeavingMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (USER_LEAVING.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID)
+							&& payload.has(Constants.USER_ID)) {
+						String meetingID = payload.get(Constants.MEETING_ID).getAsString();
+						String userid = payload.get(Constants.USER_ID).getAsString();
+						return new UserLeavingMessage(meetingID, userid);
+					}
+				}
+			}
+		}
+
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLeftMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLeftMessage.java
new file mode 100755
index 0000000000..037d4681fd
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLeftMessage.java
@@ -0,0 +1,59 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class UserLeftMessage implements ISubscribedMessage {
+	public static final String USER_LEFT = "user_left_message";
+	public final String VERSION = "0.0.1";
+
+	public final String meetingId;
+	public final Map<String, Object> user;
+
+	public UserLeftMessage(String meetingID, Map<String, Object> user) {
+		this.meetingId = meetingID;
+		this.user = user;
+	}
+
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_LEFT, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	public static UserLeftMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (USER_LEFT.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID)
+							&& payload.has(Constants.USER)) {
+						String meetingID = payload.get(Constants.MEETING_ID).getAsString();
+						
+						JsonObject user = (JsonObject) payload.get(Constants.USER);
+						
+						Util util = new Util();
+						Map<String, Object> userMap = util.extractUser(user);
+						
+						if (userMap != null) {
+							return new UserLeftMessage(meetingID, userMap);							
+						}						
+					}
+				}
+			}
+		}
+
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLeftVoiceConfMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLeftVoiceConfMessage.java
new file mode 100755
index 0000000000..fe94818eb4
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLeftVoiceConfMessage.java
@@ -0,0 +1,56 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class UserLeftVoiceConfMessage {
+	public static final String USER_LEFT_VOICE_CONF  = "user_left_voice_conf_message";
+	public static final String VERSION = "0.0.1";
+	
+	public static final String VOICE_CONF_ID = "voice_conf_id";
+	public static final String VOICE_USER_ID = "voice_user_id";
+	
+	public final String voiceConfId;
+	public final String voiceUserId;
+	
+	public UserLeftVoiceConfMessage(String voiceConfId, String voiceUserId) {
+		this.voiceConfId = voiceConfId;
+		this.voiceUserId = voiceUserId;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(VOICE_CONF_ID, voiceConfId);
+		payload.put(VOICE_USER_ID, voiceUserId); 
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_LEFT_VOICE_CONF, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static UserLeftVoiceConfMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (USER_LEFT_VOICE_CONF.equals(messageName)) {
+					if (payload.has(VOICE_CONF_ID) 
+							&& payload.has(VOICE_USER_ID)) {
+						String voiceConfId = payload.get(VOICE_CONF_ID).getAsString();
+						String voiceUserId = payload.get(VOICE_USER_ID).getAsString();						
+						return new UserLeftVoiceConfMessage(voiceConfId, voiceUserId);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLeftVoiceMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLeftVoiceMessage.java
new file mode 100755
index 0000000000..8e647a6bbf
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLeftVoiceMessage.java
@@ -0,0 +1,66 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class UserLeftVoiceMessage implements ISubscribedMessage {
+	public static final String USER_LEFT_VOICE  = "user_left_voice_message";
+	public static final String VERSION = "0.0.1";
+	
+	public final String meetingId;
+	public final Map<String, Object> user;
+	public final String voiceConf;
+	
+	public UserLeftVoiceMessage(String meetingId, Map<String, Object> user, String voiceConf) {
+		this.meetingId = meetingId;
+		this.user = user;
+		this.voiceConf = voiceConf;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId); 
+		payload.put(Constants.USER, user);
+		payload.put(Constants.VOICE_CONF, voiceConf);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_LEFT_VOICE, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static UserLeftVoiceMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (USER_LEFT_VOICE.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.USER)) {
+						String id = payload.get(Constants.MEETING_ID).getAsString();
+						String voiceConf = payload.get(Constants.VOICE_CONF).getAsString();
+						
+						JsonObject user = (JsonObject) payload.get(Constants.USER);
+						
+						Util util = new Util();
+						Map<String, Object> userMap = util.extractUser(user);
+						
+						if (userMap != null) {
+							return new UserLeftVoiceMessage(id, userMap, voiceConf);						
+						}				
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserListeningOnlyMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserListeningOnlyMessage.java
new file mode 100755
index 0000000000..5f352b2645
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserListeningOnlyMessage.java
@@ -0,0 +1,59 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class UserListeningOnlyMessage implements ISubscribedMessage {
+	public static final String USER_LISTENING_ONLY  = "user_listening_only";
+	public static final String VERSION = "0.0.1";
+	
+	public final String meetingId;
+	public final String userId;
+	public final Boolean listenOnly;
+
+	public UserListeningOnlyMessage(String meetingId, String userId, Boolean listenOnly) {
+		this.meetingId = meetingId;
+		this.userId = userId;
+		this.listenOnly = listenOnly;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId); 
+		payload.put(Constants.USER_ID, userId);
+		payload.put(Constants.LISTEN_ONLY, listenOnly);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_LISTENING_ONLY, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static UserListeningOnlyMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (USER_LISTENING_ONLY.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.USER_ID)
+							&& payload.has(Constants.LISTEN_ONLY)) {
+						String id = payload.get(Constants.MEETING_ID).getAsString();
+						String userid = payload.get(Constants.USER_ID).getAsString();
+						Boolean listenOnly = payload.get(Constants.LISTEN_ONLY).getAsBoolean();
+						return new UserListeningOnlyMessage(id, userid, listenOnly);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLockedInVoiceConfMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLockedInVoiceConfMessage.java
new file mode 100755
index 0000000000..d9fb7b85e1
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLockedInVoiceConfMessage.java
@@ -0,0 +1,62 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class UserLockedInVoiceConfMessage {
+	public static final String USER_LOCKED_IN_VOICE_CONF  = "user_locked_in_voice_conf_message";
+	public static final String VERSION = "0.0.1";
+	
+	public static final String VOICE_CONF_ID = "voice_conf_id";
+	public static final String VOICE_USER_ID = "voice_user_id";
+	public static final String LOCKED = "locked";
+	
+	public final String voiceConfId;
+	public final String voiceUserId;
+	public final Boolean locked;
+	
+	public UserLockedInVoiceConfMessage(String voiceConfId, String voiceUserId, Boolean locked) {
+		this.voiceConfId = voiceConfId;
+		this.voiceUserId = voiceUserId;
+		this.locked = locked;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(VOICE_CONF_ID, voiceConfId);
+		payload.put(VOICE_USER_ID, voiceUserId); 
+		payload.put(LOCKED, locked); 
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_LOCKED_IN_VOICE_CONF, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static UserLockedInVoiceConfMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (USER_LOCKED_IN_VOICE_CONF.equals(messageName)) {
+					if (payload.has(VOICE_CONF_ID) 
+							&& payload.has(VOICE_USER_ID)
+							&& payload.has(LOCKED)) {
+						String voiceConfId = payload.get(VOICE_CONF_ID).getAsString();
+						String voiceUserId = payload.get(VOICE_USER_ID).getAsString();	
+						Boolean locked = payload.get(LOCKED).getAsBoolean();
+						return new UserLockedInVoiceConfMessage(voiceConfId, voiceUserId, locked);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLockedMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLockedMessage.java
new file mode 100755
index 0000000000..c9c6aa8f3b
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLockedMessage.java
@@ -0,0 +1,59 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class UserLockedMessage implements ISubscribedMessage {
+	public static final String USER_LOCKED  = "user_locked_message";
+	public static final String VERSION = "0.0.1";
+	
+	public final String meetingId;
+	public final String userId;
+	public final Boolean locked;
+
+	public UserLockedMessage(String meetingId, String userId, Boolean locked) {
+		this.meetingId = meetingId;
+		this.userId = userId;
+		this.locked = locked;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId); 
+		payload.put(Constants.USER_ID, userId);
+		payload.put(Constants.LOCKED, locked);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_LOCKED, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static UserLockedMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (USER_LOCKED.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.USER_ID)
+							&& payload.has(Constants.LOCKED)) {
+						String id = payload.get(Constants.MEETING_ID).getAsString();
+						String userid = payload.get(Constants.USER_ID).getAsString();
+						Boolean locked = payload.get(Constants.LOCKED).getAsBoolean();
+						return new UserLockedMessage(id, userid, locked);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLoweredHandMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLoweredHandMessage.java
new file mode 100755
index 0000000000..fbc44a432f
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserLoweredHandMessage.java
@@ -0,0 +1,64 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class UserLoweredHandMessage implements ISubscribedMessage {
+	public static final String USER_LOWERED_HAND  = "user_lowered_hand_message";
+	public static final String VERSION = "0.0.1";
+	
+	public final String meetingId;
+	public final String userId;
+	public final Boolean raisedHand;
+	public final String loweredBy;
+	
+	public UserLoweredHandMessage(String meetingId, String userId, Boolean raisedHand, String loweredBy) {
+		this.meetingId = meetingId;
+		this.userId = userId;
+		this.raisedHand = raisedHand;
+		this.loweredBy = loweredBy;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId); 
+		payload.put(Constants.USER_ID, userId);
+		payload.put(Constants.RAISE_HAND, raisedHand);
+		payload.put(Constants.LOWERED_BY, loweredBy);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_LOWERED_HAND, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static UserLoweredHandMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (USER_LOWERED_HAND.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.USER_ID)
+							&& payload.has(Constants.RAISE_HAND)
+							&& payload.has(Constants.LOWERED_BY)) {
+						String id = payload.get(Constants.MEETING_ID).getAsString();
+						String userid = payload.get(Constants.USER_ID).getAsString();
+						Boolean raisedHand = payload.get(Constants.RAISE_HAND).getAsBoolean();
+						String loweredBy = payload.get(Constants.LOWERED_BY).getAsString();
+						return new UserLoweredHandMessage(id, userid, raisedHand, loweredBy);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserMutedInVoiceConfMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserMutedInVoiceConfMessage.java
new file mode 100755
index 0000000000..cb87b8c98b
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserMutedInVoiceConfMessage.java
@@ -0,0 +1,62 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class UserMutedInVoiceConfMessage {
+	public static final String USER_MUTED_IN_VOICE_CONF  = "user_muted_in_voice_conf_message";
+	public static final String VERSION = "0.0.1";
+	
+	public static final String VOICE_CONF_ID = "voice_conf_id";
+	public static final String VOICE_USER_ID = "voice_user_id";
+	public static final String MUTED = "muted";
+	
+	public final String voiceConfId;
+	public final String voiceUserId;
+	public final Boolean muted;
+	
+	public UserMutedInVoiceConfMessage(String voiceConfId, String voiceUserId, Boolean muted) {
+		this.voiceConfId = voiceConfId;
+		this.voiceUserId = voiceUserId;
+		this.muted = muted;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(VOICE_CONF_ID, voiceConfId);
+		payload.put(VOICE_USER_ID, voiceUserId); 
+		payload.put(MUTED, muted); 
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_MUTED_IN_VOICE_CONF, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static UserMutedInVoiceConfMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (USER_MUTED_IN_VOICE_CONF.equals(messageName)) {
+					if (payload.has(VOICE_CONF_ID) 
+							&& payload.has(VOICE_USER_ID)
+							&& payload.has(MUTED)) {
+						String voiceConfId = payload.get(VOICE_CONF_ID).getAsString();
+						String voiceUserId = payload.get(VOICE_USER_ID).getAsString();	
+						Boolean muted = payload.get(MUTED).getAsBoolean();
+						return new UserMutedInVoiceConfMessage(voiceConfId, voiceUserId, muted);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserRaisedHandMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserRaisedHandMessage.java
new file mode 100755
index 0000000000..5c2e5501af
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserRaisedHandMessage.java
@@ -0,0 +1,59 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class UserRaisedHandMessage implements ISubscribedMessage {
+	public static final String USER_RAISED_HAND  = "user_raised_hand_message";
+	public static final String VERSION = "0.0.1";
+	
+	public final String meetingId;
+	public final String userId;
+	public final Boolean raisedHand;
+
+	public UserRaisedHandMessage(String meetingId, String userId, Boolean raisedHand) {
+		this.meetingId = meetingId;
+		this.userId = userId;
+		this.raisedHand = raisedHand;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId); 
+		payload.put(Constants.USER_ID, userId);
+		payload.put(Constants.RAISE_HAND, raisedHand);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_RAISED_HAND, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static UserRaisedHandMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (USER_RAISED_HAND.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.USER_ID)
+							&& payload.has(Constants.RAISE_HAND)) {
+						String id = payload.get(Constants.MEETING_ID).getAsString();
+						String userid = payload.get(Constants.USER_ID).getAsString();
+						Boolean raisedHand = payload.get(Constants.RAISE_HAND).getAsBoolean();
+						return new UserRaisedHandMessage(id, userid, raisedHand);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserShareWebcamRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserShareWebcamRequestMessage.java
new file mode 100755
index 0000000000..225580e1aa
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserShareWebcamRequestMessage.java
@@ -0,0 +1,59 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class UserShareWebcamRequestMessage implements ISubscribedMessage {
+	public static final String USER_SHARE_WEBCAM_REQUEST  = "user_share_webcam_request_message";
+	public static final String VERSION = "0.0.1";
+	
+	public final String meetingId;
+	public final String userId;
+	public final String stream;
+	
+	public UserShareWebcamRequestMessage(String meetingId, String userId, String stream) {
+		this.meetingId = meetingId;
+		this.userId = userId;
+		this.stream = stream;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId); 
+		payload.put(Constants.USER_ID, userId);
+		payload.put(Constants.STREAM, stream);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_SHARE_WEBCAM_REQUEST, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static UserShareWebcamRequestMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (USER_SHARE_WEBCAM_REQUEST.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.USER_ID)
+							&& payload.has(Constants.STREAM)) {
+						String id = payload.get(Constants.MEETING_ID).getAsString();
+						String userid = payload.get(Constants.USER_ID).getAsString();
+						String stream = payload.get(Constants.STREAM).getAsString();
+						return new UserShareWebcamRequestMessage(id, userid, stream);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserSharedWebcamMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserSharedWebcamMessage.java
new file mode 100755
index 0000000000..5789b3942d
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserSharedWebcamMessage.java
@@ -0,0 +1,59 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class UserSharedWebcamMessage implements ISubscribedMessage {
+	public static final String USER_SHARED_WEBCAM  = "user_shared_webcam_message";
+	public static final String VERSION = "0.0.1";
+	
+	public final String meetingId;
+	public final String userId;
+	public final String stream;
+	
+	public UserSharedWebcamMessage(String meetingId, String userId, String stream) {
+		this.meetingId = meetingId;
+		this.userId = userId;
+		this.stream = stream;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId); 
+		payload.put(Constants.USER_ID, userId);
+		payload.put(Constants.STREAM, stream);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_SHARED_WEBCAM, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static UserSharedWebcamMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (USER_SHARED_WEBCAM.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.USER_ID)
+							&& payload.has(Constants.STREAM)) {
+						String id = payload.get(Constants.MEETING_ID).getAsString();
+						String userid = payload.get(Constants.USER_ID).getAsString();
+						String stream = payload.get(Constants.STREAM).getAsString();
+						return new UserSharedWebcamMessage(id, userid, stream);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserStatusChangedMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserStatusChangedMessage.java
new file mode 100755
index 0000000000..f643e72eb4
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserStatusChangedMessage.java
@@ -0,0 +1,65 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class UserStatusChangedMessage implements ISubscribedMessage {
+	public static final String USER_STATUS_CHANGED  = "user_status_changed_message";
+	public static final String VERSION = "0.0.1";
+	
+	public final String meetingId;
+	public final String userId;
+	public final String status;
+	public final String value;
+
+	public UserStatusChangedMessage(String meetingId, String userId, String status, 
+			String value) {
+		this.meetingId = meetingId;
+		this.userId = userId;
+		this.status = status;
+		this.value = value;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId); 
+		payload.put(Constants.USER_ID, userId);
+		payload.put(Constants.STATUS, status);
+		payload.put(Constants.VALUE, value);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_STATUS_CHANGED, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static UserStatusChangedMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (USER_STATUS_CHANGED.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.USER_ID)
+							&& payload.has(Constants.STATUS)
+							&& payload.has(Constants.VALUE)) {
+						String id = payload.get(Constants.MEETING_ID).getAsString();
+						String userid = payload.get(Constants.USER_ID).getAsString();
+						String status = payload.get(Constants.STATUS).getAsString();
+						String value = payload.get(Constants.VALUE).getAsString();
+						return new UserStatusChangedMessage(id, userid, status, value);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserTalkingInVoiceConfMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserTalkingInVoiceConfMessage.java
new file mode 100755
index 0000000000..461337e16d
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserTalkingInVoiceConfMessage.java
@@ -0,0 +1,62 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class UserTalkingInVoiceConfMessage {
+	public static final String USER_TALKING_IN_VOICE_CONF  = "user_talking_in_voice_conf_message";
+	public static final String VERSION = "0.0.1";
+	
+	public static final String VOICE_CONF_ID = "voice_conf_id";
+	public static final String VOICE_USER_ID = "voice_user_id";
+	public static final String TALKING = "talking";
+	
+	public final String voiceConfId;
+	public final String voiceUserId;
+	public final Boolean talking;
+	
+	public UserTalkingInVoiceConfMessage(String voiceConfId, String voiceUserId, Boolean talking) {
+		this.voiceConfId = voiceConfId;
+		this.voiceUserId = voiceUserId;
+		this.talking = talking;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(VOICE_CONF_ID, voiceConfId);
+		payload.put(VOICE_USER_ID, voiceUserId); 
+		payload.put(TALKING, talking); 
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_TALKING_IN_VOICE_CONF, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static UserTalkingInVoiceConfMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (USER_TALKING_IN_VOICE_CONF.equals(messageName)) {
+					if (payload.has(VOICE_CONF_ID) 
+							&& payload.has(VOICE_USER_ID)
+							&& payload.has(TALKING)) {
+						String voiceConfId = payload.get(VOICE_CONF_ID).getAsString();
+						String voiceUserId = payload.get(VOICE_USER_ID).getAsString();	
+						Boolean talking = payload.get(TALKING).getAsBoolean();
+						return new UserTalkingInVoiceConfMessage(voiceConfId, voiceUserId, talking);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserUnshareWebcamRequestMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserUnshareWebcamRequestMessage.java
new file mode 100755
index 0000000000..051b91db02
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserUnshareWebcamRequestMessage.java
@@ -0,0 +1,59 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class UserUnshareWebcamRequestMessage implements ISubscribedMessage {
+	public static final String USER_UNSHARE_WEBCAM_REQUEST  = "user_unshare_webcam_request_message";
+	public static final String VERSION = "0.0.1";
+	
+	public final String meetingId;
+	public final String userId;
+	public final String stream;
+	
+	public UserUnshareWebcamRequestMessage(String meetingId, String userId, String stream) {
+		this.meetingId = meetingId;
+		this.userId = userId;
+		this.stream = stream;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId); 
+		payload.put(Constants.USER_ID, userId);
+		payload.put(Constants.STREAM, stream);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_UNSHARE_WEBCAM_REQUEST, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static UserUnshareWebcamRequestMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (USER_UNSHARE_WEBCAM_REQUEST.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.USER_ID)
+							&& payload.has(Constants.STREAM)) {
+						String id = payload.get(Constants.MEETING_ID).getAsString();
+						String userid = payload.get(Constants.USER_ID).getAsString();
+						String stream = payload.get(Constants.STREAM).getAsString();
+						return new UserUnshareWebcamRequestMessage(id, userid, stream);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserUnsharedWebcamMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserUnsharedWebcamMessage.java
new file mode 100755
index 0000000000..8ae89d0348
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserUnsharedWebcamMessage.java
@@ -0,0 +1,59 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class UserUnsharedWebcamMessage implements ISubscribedMessage {
+	public static final String USER_UNSHARED_WEBCAM  = "user_unshared_webcam_message";
+	public static final String VERSION = "0.0.1";
+	
+	public final String meetingId;
+	public final String userId;
+	public final String stream;
+	
+	public UserUnsharedWebcamMessage(String meetingId, String userId, String stream) {
+		this.meetingId = meetingId;
+		this.userId = userId;
+		this.stream = stream;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId); 
+		payload.put(Constants.USER_ID, userId);
+		payload.put(Constants.STREAM, stream);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_UNSHARED_WEBCAM, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static UserUnsharedWebcamMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (USER_UNSHARED_WEBCAM.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.USER_ID)
+							&& payload.has(Constants.STREAM)) {
+						String id = payload.get(Constants.MEETING_ID).getAsString();
+						String userid = payload.get(Constants.USER_ID).getAsString();
+						String stream = payload.get(Constants.STREAM).getAsString();
+						return new UserUnsharedWebcamMessage(id, userid, stream);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserVoiceMutedMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserVoiceMutedMessage.java
new file mode 100755
index 0000000000..a994267071
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserVoiceMutedMessage.java
@@ -0,0 +1,66 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class UserVoiceMutedMessage implements ISubscribedMessage {
+	public static final String USER_VOICE_MUTED  = "user_voice_muted_message";
+	public static final String VERSION = "0.0.1";
+	
+	public final String meetingId;
+	public final Map<String, Object> user;
+	public final String voiceConf;
+	
+	public UserVoiceMutedMessage(String meetingId, Map<String, Object> user, String voiceConf) {
+		this.meetingId = meetingId;
+		this.user = user;
+		this.voiceConf = voiceConf;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId); 
+		payload.put(Constants.USER, user);
+		payload.put(Constants.VOICE_CONF, voiceConf);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_VOICE_MUTED, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static UserVoiceMutedMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (USER_VOICE_MUTED.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.USER)) {
+						String id = payload.get(Constants.MEETING_ID).getAsString();
+						String voiceConf = payload.get(Constants.VOICE_CONF).getAsString();
+						
+						JsonObject user = (JsonObject) payload.get(Constants.USER);
+						
+						Util util = new Util();
+						Map<String, Object> userMap = util.extractUser(user);
+						
+						if (userMap != null) {
+							return new UserVoiceMutedMessage(id, userMap, voiceConf);						
+						}				
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserVoiceTalkingMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserVoiceTalkingMessage.java
new file mode 100755
index 0000000000..2445d97e71
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserVoiceTalkingMessage.java
@@ -0,0 +1,66 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class UserVoiceTalkingMessage implements ISubscribedMessage {
+	public static final String USER_VOICE_TALKING  = "user_voice_talking_message";
+	public static final String VERSION = "0.0.1";
+	
+	public final String meetingId;
+	public final Map<String, Object> user;
+	public final String voiceConf;
+	
+	public UserVoiceTalkingMessage(String meetingId, Map<String, Object> user, String voiceConf) {
+		this.meetingId = meetingId;
+		this.user = user;
+		this.voiceConf = voiceConf;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId); 
+		payload.put(Constants.USER, user);
+		payload.put(Constants.VOICE_CONF, voiceConf);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_VOICE_TALKING, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static UserVoiceTalkingMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (USER_VOICE_TALKING.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.USER)) {
+						String id = payload.get(Constants.MEETING_ID).getAsString();
+						String voiceConf = payload.get(Constants.VOICE_CONF).getAsString();
+						
+						JsonObject user = (JsonObject) payload.get(Constants.USER);
+						
+						Util util = new Util();
+						Map<String, Object> userMap = util.extractUser(user);
+						
+						if (userMap != null) {
+							return new UserVoiceTalkingMessage(id, userMap, voiceConf);						
+						}				
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/Util.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/Util.java
new file mode 100755
index 0000000000..33bcdc4059
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/Util.java
@@ -0,0 +1,425 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+
+public class Util {
+	public Map<String, Boolean> extractPermission(JsonObject vu) {
+		if (vu.has(Constants.PERM_DISABLE_CAM) && vu.has(Constants.PERM_DISABLE_MIC)
+				&& vu.has(Constants.PERM_DISABLE_PRIVCHAT) && vu.has(Constants.PERM_DISABLE_PUBCHAT)
+				&& vu.has(Constants.PERM_LOCKED_LAYOUT) && vu.has(Constants.PERM_LOCK_ON_JOIN)
+				&& vu.has(Constants.PERM_LOCK_ON_JOIN_CONFIG)){
+				
+			Map<String, Boolean> vuMap = new HashMap<String, Boolean>();
+			Boolean disableCam = vu.get(Constants.PERM_DISABLE_CAM).getAsBoolean();
+			Boolean disableMic = vu.get(Constants.PERM_DISABLE_MIC).getAsBoolean();
+			Boolean disablePrivChat = vu.get(Constants.PERM_DISABLE_PRIVCHAT).getAsBoolean();
+			Boolean disablePubChat = vu.get(Constants.PERM_DISABLE_PUBCHAT).getAsBoolean();
+			Boolean lockedLayout = vu.get(Constants.PERM_LOCKED_LAYOUT).getAsBoolean();
+			Boolean lockOnJoin = vu.get(Constants.PERM_LOCK_ON_JOIN).getAsBoolean();
+			Boolean lockOnJoinConfig = vu.get(Constants.PERM_LOCK_ON_JOIN_CONFIG).getAsBoolean();
+			
+			vuMap.put(Constants.PERM_DISABLE_CAM, disableCam);
+			vuMap.put(Constants.PERM_DISABLE_MIC, disableMic);
+			vuMap.put(Constants.PERM_DISABLE_PRIVCHAT, disablePrivChat);
+			vuMap.put(Constants.PERM_DISABLE_PUBCHAT, disablePubChat);
+			vuMap.put(Constants.PERM_LOCKED_LAYOUT, lockedLayout);
+			vuMap.put(Constants.PERM_LOCK_ON_JOIN, lockOnJoin);
+			vuMap.put(Constants.PERM_LOCK_ON_JOIN_CONFIG, lockOnJoinConfig);
+			
+			return vuMap;
+		}
+		return null;
+	}
+	
+	public Map<String, Object> extractVoiceUser(JsonObject vu) {
+		if (vu.has(Constants.TALKING) && vu.has(Constants.LOCKED)
+				&& vu.has(Constants.MUTED) && vu.has(Constants.JOINED)
+				&& vu.has(Constants.CALLERNAME) && vu.has(Constants.CALLERNUM)
+				&& vu.has(Constants.WEB_USERID) && vu.has(Constants.USER_ID)){
+				
+			Map<String, Object> vuMap = new HashMap<String, Object>();
+			Boolean talking = vu.get(Constants.TALKING).getAsBoolean();
+			Boolean voiceLocked = vu.get(Constants.LOCKED).getAsBoolean();
+			Boolean muted = vu.get(Constants.MUTED).getAsBoolean();
+			Boolean joined = vu.get(Constants.JOINED).getAsBoolean();
+			String callername = vu.get(Constants.CALLERNAME).getAsString();
+			String callernum = vu.get(Constants.CALLERNUM).getAsString();
+			String webUserId = vu.get(Constants.WEB_USERID).getAsString();
+			String voiceUserId = vu.get(Constants.USER_ID).getAsString();
+
+			vuMap.put("talking", talking);
+			vuMap.put("locked", voiceLocked);
+			vuMap.put("muted", muted);
+			vuMap.put("joined", joined);
+			vuMap.put("callerName", callername);
+			vuMap.put("callerNum", callernum);
+			vuMap.put("webUserId", webUserId);
+			vuMap.put("userId", voiceUserId);
+			
+			return vuMap;
+		}
+		return null;
+	}
+	
+	public Map<String, Object> extractUser(JsonObject user) {
+		if (user.has(Constants.USER_ID) && user.has(Constants.NAME)
+				&& user.has(Constants.HAS_STREAM) && user.has(Constants.LISTENONLY)
+				&& user.has(Constants.RAISE_HAND) && user.has(Constants.PHONE_USER)
+				&& user.has(Constants.PRESENTER) && user.has(Constants.LOCKED)
+				&& user.has(Constants.EXTERN_USERID) && user.has(Constants.ROLE)
+				&& user.has(Constants.VOICEUSER)){
+				
+			Map<String, Object> userMap = new HashMap<String, Object>();					
+
+			String userid = user.get(Constants.USER_ID).getAsString();
+			String username = user.get(Constants.NAME).getAsString();
+			Boolean hasStream = user.get(Constants.HAS_STREAM).getAsBoolean();
+			Boolean listenOnly = user.get(Constants.LISTENONLY).getAsBoolean();
+			Boolean raiseHand = user.get(Constants.RAISE_HAND).getAsBoolean();
+			Boolean phoneUser = user.get(Constants.PHONE_USER).getAsBoolean();
+			Boolean presenter = user.get(Constants.PRESENTER).getAsBoolean();
+			Boolean locked = user.get(Constants.LOCKED).getAsBoolean();
+			String extUserId = user.get(Constants.EXTERN_USERID).getAsString();
+			String role = user.get(Constants.ROLE).getAsString();
+						  
+			userMap.put("userId", userid);
+			userMap.put("name", username);
+			userMap.put("listenOnly", listenOnly);
+			userMap.put("hasStream", hasStream);
+			userMap.put("raiseHand", raiseHand);
+			userMap.put("externUserID", extUserId);
+			userMap.put("phoneUser", phoneUser);
+			userMap.put("locked", locked);
+			userMap.put("role", role);
+			userMap.put("presenter", presenter);
+			
+			JsonObject vu = (JsonObject) user.get(Constants.VOICEUSER);
+			
+			Map<String, Object> vuMap = extractVoiceUser(vu);
+			if (vuMap != null) {
+				userMap.put("voiceUser", vuMap);
+				return userMap;
+			}
+		}
+		
+		return null;
+			
+	}
+
+	public ArrayList<Map<String, Object>> extractChatHistory(JsonArray history) {
+		ArrayList<Map<String, Object>> collection = new ArrayList<Map<String, Object>>();
+		Iterator<JsonElement> historyIter = history.iterator();
+		while (historyIter.hasNext()){
+			JsonElement chat = historyIter.next();
+			Map<String, Object> chatMap = extractChat((JsonObject)chat);
+			if (chatMap != null) {
+				collection.add(chatMap);
+			}
+		}
+		return collection;
+	}
+
+	private Map<String, Object> extractChat(JsonObject chat) {
+
+		if (chat.has(Constants.FROM_COLOR)
+				&& chat.has(Constants.MESSAGE)
+				&& chat.has(Constants.TO_USERNAME)
+				&& chat.has(Constants.FROM_TZ_OFFSET)
+				&& chat.has(Constants.FROM_COLOR)
+				&& chat.has(Constants.TO_USERID)
+				&& chat.has(Constants.FROM_USERID)
+				&& chat.has(Constants.FROM_TIME)
+				&& chat.has(Constants.FROM_USERNAME)){
+
+			Map<String, Object> chatMap = new HashMap<String, Object>();
+
+			chatMap.put(ChatKeyUtil.CHAT_TYPE, chat.get(Constants.CHAT_TYPE).getAsString());
+			chatMap.put(ChatKeyUtil.MESSAGE, chat.get(Constants.MESSAGE).getAsString());
+			chatMap.put(ChatKeyUtil.TO_USERNAME, chat.get(Constants.TO_USERNAME).getAsString());
+			chatMap.put(ChatKeyUtil.FROM_TZ_OFFSET, chat.get(Constants.FROM_TZ_OFFSET).getAsString());
+			chatMap.put(ChatKeyUtil.FROM_COLOR, chat.get(Constants.FROM_COLOR).getAsString());
+			chatMap.put(ChatKeyUtil.TO_USERID, chat.get(Constants.TO_USERID).getAsString());
+			chatMap.put(ChatKeyUtil.FROM_USERID, chat.get(Constants.FROM_USERID).getAsString());
+			chatMap.put(ChatKeyUtil.FROM_TIME, chat.get(Constants.FROM_TIME).getAsString());
+			chatMap.put(ChatKeyUtil.FROM_USERNAME, chat.get(Constants.FROM_USERNAME).getAsString());
+
+			return chatMap;
+		}
+		return null;
+	}
+
+	public ArrayList<Map<String, Object>> extractUsers(JsonArray users) {
+		ArrayList<Map<String, Object>> collection = new ArrayList<Map<String, Object>>();
+	
+	    Iterator<JsonElement> usersIter = users.iterator();
+	    while (usersIter.hasNext()){
+			JsonElement user = usersIter.next();
+			Map<String, Object> userMap = extractUser((JsonObject)user);
+			if (userMap != null) {
+				collection.add(userMap);
+			}
+	    }
+		
+		return collection;
+			
+	}
+	
+	public ArrayList<String> extractUserids(JsonArray users) {
+		ArrayList<String> collection = new ArrayList<String>();
+	
+	    Iterator<JsonElement> usersIter = users.iterator();
+	    while (usersIter.hasNext()){
+			JsonElement user = usersIter.next();
+			collection.add(user.getAsString());
+	    }
+		
+		return collection;
+			
+	}	
+
+	public Map<String, Object> extractAnnotation(JsonObject annotationElement) {
+		//NON-TEXT SHAPE
+		if (annotationElement.has(Constants.ID)
+				&& annotationElement.has("transparency")
+				&& annotationElement.has("color")
+				&& annotationElement.has("status")
+				&& annotationElement.has("whiteboardId")
+				&& annotationElement.has("type")
+				&& annotationElement.has("thickness")
+				&& annotationElement.has("points")){
+
+			Map<String, Object> finalAnnotation = new HashMap<String, Object>();
+
+			boolean transparency = annotationElement.get("transparency").getAsBoolean();
+			String id = annotationElement.get(Constants.ID).getAsString();
+			int color = annotationElement.get("color").getAsInt();
+			String status = annotationElement.get(Constants.STATUS).getAsString();
+			String whiteboardId = annotationElement.get("whiteboardId").getAsString();
+			int thickness = annotationElement.get("thickness").getAsInt();
+			String type = annotationElement.get("type").getAsString();
+
+			JsonArray pointsJsonArray = annotationElement.get("points").getAsJsonArray();
+
+			ArrayList<Float> pointsArray = new ArrayList<Float>();
+			Iterator<JsonElement> pointIter = pointsJsonArray.iterator();
+			while (pointIter.hasNext()){
+				JsonElement p = pointIter.next();
+				Float pf = p.getAsFloat();
+				if (pf != null) {
+					pointsArray.add(pf);
+				}
+			}
+
+			finalAnnotation.put("transparency", transparency);
+			finalAnnotation.put(Constants.ID, id);
+			finalAnnotation.put("color", color);
+			finalAnnotation.put("status", status);
+			finalAnnotation.put("whiteboardId", whiteboardId);
+			finalAnnotation.put("thickness", thickness);
+			finalAnnotation.put("points", pointsArray);
+			finalAnnotation.put("type", type);
+
+			return finalAnnotation;
+		}
+
+		// TEXT SHAPE
+		else if (annotationElement.has(Constants.ID)
+				&& annotationElement.has("text")
+				&& annotationElement.has("fontColor")
+				&& annotationElement.has("status")
+				&& annotationElement.has("textBoxWidth")
+				&& annotationElement.has("fontSize")
+				&& annotationElement.has("type")
+				&& annotationElement.has("calcedFontSize")
+				&& annotationElement.has("textBoxHeight")
+				&& annotationElement.has("calcedFontSize")
+				&& annotationElement.has("whiteboardId")
+				&& annotationElement.has("dataPoints")
+				&& annotationElement.has("x")
+				&& annotationElement.has("y")){
+
+			Map<String, Object> finalAnnotation = new HashMap<String, Object>();
+
+			String text = annotationElement.get("text").getAsString();
+			int fontColor = annotationElement.get("fontColor").getAsInt();
+			String status = annotationElement.get(Constants.STATUS).getAsString();
+			Float textBoxWidth = annotationElement.get("textBoxWidth").getAsFloat();
+			int fontSize = annotationElement.get("fontSize").getAsInt();
+			String type = annotationElement.get("type").getAsString();
+			Float calcedFontSize = annotationElement.get("calcedFontSize").getAsFloat();
+			Float textBoxHeight = annotationElement.get("textBoxHeight").getAsFloat();
+			String id = annotationElement.get(Constants.ID).getAsString();
+			String whiteboardId = annotationElement.get("whiteboardId").getAsString();
+			Float x = annotationElement.get("x").getAsFloat();
+			Float y = annotationElement.get("y").getAsFloat();
+			String dataPoints = annotationElement.get("dataPoints").getAsString();
+
+			finalAnnotation.put("text", text);
+			finalAnnotation.put("fontColor", fontColor);
+			finalAnnotation.put(Constants.STATUS, status);
+			finalAnnotation.put("textBoxWidth", textBoxWidth);
+			finalAnnotation.put("fontSize", fontSize);
+			finalAnnotation.put("type", type);
+			finalAnnotation.put("calcedFontSize", calcedFontSize);
+			finalAnnotation.put("textBoxHeight", textBoxHeight);
+			finalAnnotation.put(Constants.ID, id);
+			finalAnnotation.put("whiteboardId", whiteboardId);
+			finalAnnotation.put("x", x);
+			finalAnnotation.put("y", y);
+			finalAnnotation.put("dataPoints", dataPoints);
+
+			return finalAnnotation;
+		}
+		return null;
+	}
+	
+	public Map<String, Object> extractCurrentPresenter(JsonObject vu) {
+		if (vu.has(Constants.USER_ID) && vu.has(Constants.NAME)
+				&& vu.has(Constants.ASSIGNED_BY)){
+				
+			Map<String, Object> vuMap = new HashMap<String, Object>();
+			String presenterUserId = vu.get(Constants.USER_ID).getAsString();
+			String presenterName = vu.get(Constants.NAME).getAsString();
+			String assignedBy = vu.get(Constants.ASSIGNED_BY).getAsString();
+
+			vuMap.put("userId", presenterUserId);
+			vuMap.put("name", presenterName);
+			vuMap.put("assignedBy", assignedBy);
+			
+			return vuMap;
+		}
+		return null;
+	}
+	
+	
+	public ArrayList<Map<String, Object>> extractPresentationPages(JsonArray pagesArray) {
+		ArrayList<Map<String, Object>> pages = new ArrayList<Map<String, Object>>();
+		
+	    Iterator<JsonElement> pagesIter = pagesArray.iterator();
+	    while (pagesIter.hasNext()){
+			JsonObject pageObj = (JsonObject)pagesIter.next();
+			if (pageObj.has("id") && pageObj.has("num") 
+					&& pageObj.has("thumb_uri") && pageObj.has("swf_uri")
+					&& pageObj.has("txt_uri") && pageObj.has("png_uri")
+					&& pageObj.has("current") && pageObj.has("x_offset")
+					&& pageObj.has("y_offset") && pageObj.has("width_ratio")
+					&& pageObj.has("height_ratio")) {
+				
+				Map<String, Object> page = new HashMap<String, Object>();
+				
+				String pageId = pageObj.get("id").getAsString();
+				Integer pageNum = pageObj.get("num").getAsInt();
+				String pageThumbUri = pageObj.get("thumb_uri").getAsString();
+				String pageSwfUri = pageObj.get("swf_uri").getAsString();
+				String pageTxtUri = pageObj.get("txt_uri").getAsString();
+				String pagePngUri = pageObj.get("png_uri").getAsString();
+				
+				Boolean currentPage = pageObj.get("current").getAsBoolean();
+				Double xOffset = pageObj.get("x_offset").getAsDouble();
+				Double yOffset = pageObj.get("y_offset").getAsDouble();
+				Double widthRatio = pageObj.get("width_ratio").getAsDouble();
+				Double heightRatio = pageObj.get("height_ratio").getAsDouble();
+				
+				page.put("id", pageId);
+				page.put("num", pageNum);
+				page.put("thumbUri", pageThumbUri);
+				page.put("swfUri", pageSwfUri);
+				page.put("txtUri", pageTxtUri);
+				page.put("pngUri", pagePngUri);
+				page.put("current", currentPage);
+				page.put("xOffset", xOffset);
+				page.put("yOffset", yOffset);
+				page.put("widthRatio", widthRatio);
+				page.put("heightRatio", heightRatio);
+		
+				pages.add(page);
+		    }
+	    }	
+	    
+		return pages;
+	}
+	
+	public ArrayList<Map<String, Object>> extractPresentations(JsonArray presArray) {
+		ArrayList<Map<String, Object>> presentations = new ArrayList<Map<String, Object>>();
+		
+	    Iterator<JsonElement> presentationsIter = presArray.iterator();
+	    while (presentationsIter.hasNext()){
+			JsonObject presObj = (JsonObject)presentationsIter.next();
+			if (presObj.has(Constants.ID) && presObj.has(Constants.NAME) 
+					&& presObj.has(Constants.CURRENT) && presObj.has(Constants.PAGES)) {
+				Map<String, Object> pres = new HashMap<String, Object>();
+				
+				String presId = presObj.get(Constants.ID).getAsString();
+				String presName = presObj.get(Constants.NAME).getAsString();
+				Boolean currentPres = presObj.get(Constants.CURRENT).getAsBoolean();
+				
+				pres.put("id", presId);
+				pres.put("name", presName);
+				pres.put("current", currentPres);
+				
+				JsonArray pagesJsonArray = presObj.get(Constants.PAGES).getAsJsonArray();
+				
+				ArrayList<Map<String, Object>> pages = extractPresentationPages(pagesJsonArray);
+				// store the pages in the presentation 
+				pres.put(Constants.PAGES, pages);
+			    
+				// add this presentation into our presentations list
+			    presentations.add(pres);
+		    }
+	    }
+	    return presentations;
+	}
+
+	public ArrayList<Map<String, Object>> extractShapes(JsonArray shapes) {
+		ArrayList<Map<String, Object>> collection = new ArrayList<Map<String, Object>>();
+
+		Iterator<JsonElement> shapesIter = shapes.iterator();
+		while (shapesIter.hasNext()){
+			JsonElement shape = shapesIter.next();
+
+			Map<String, Object> shapeMap = extractOuterAnnotation((JsonObject)shape);
+
+			if (shapeMap != null) {
+				collection.add(shapeMap);
+			}
+		}
+		return collection;
+	}
+
+	public Map<String, Object> extractOuterAnnotation(JsonObject annotationElement) {
+
+		if (annotationElement.has(Constants.ID)
+				&& annotationElement.has("shape")
+				&& annotationElement.has("status")
+				&& annotationElement.has("shape_type")){
+
+			Map<String, Object> finalAnnotation = new HashMap<String, Object>();
+
+			String id = annotationElement.get(Constants.ID).getAsString();
+			String status = annotationElement.get("status").getAsString();
+			String type = annotationElement.get("shape_type").getAsString();
+
+			finalAnnotation.put(Constants.ID, id);
+			finalAnnotation.put("type", type);
+			finalAnnotation.put("status", status);
+			finalAnnotation.put("status", status);
+
+			JsonElement shape = annotationElement.get("shape");
+			Map<String, Object> shapesMap = extractAnnotation((JsonObject)shape);
+
+			if (shapesMap != null) {
+				finalAnnotation.put("shapes", shapesMap);
+			}
+
+			return finalAnnotation;
+		}
+
+		return null;
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ValidateAuthTokenMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ValidateAuthTokenMessage.java
new file mode 100755
index 0000000000..5ea99f4d37
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ValidateAuthTokenMessage.java
@@ -0,0 +1,69 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class ValidateAuthTokenMessage implements IPublishedMessage {
+	public static final String VALIDATE_AUTH_TOKEN  = "validate_auth_token";
+	public static final String VERSION = "0.0.1";
+	
+	public final String meetingId;
+	public final String userId;
+	public final String token;
+	public final String replyTo;
+	public final String sessionId;
+	
+	public ValidateAuthTokenMessage(String meetingId, String userId, String token, String replyTo, String sessionId) {
+		this.meetingId = meetingId;
+		this.userId = userId;
+		this.token = token;
+		this.replyTo = replyTo;
+		this.sessionId = sessionId;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.MEETING_ID, meetingId);
+        payload.put(Constants.USER_ID, userId);
+        payload.put(Constants.AUTH_TOKEN, token);		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(VALIDATE_AUTH_TOKEN, VERSION, replyTo);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static ValidateAuthTokenMessage fromJson(String message) {
+
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (VALIDATE_AUTH_TOKEN.equals(messageName)) {
+
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.USER_ID)
+							&& payload.has(Constants.AUTH_TOKEN)
+							&& header.has(Constants.REPLY_TO)) {
+
+						String id = payload.get(Constants.MEETING_ID).getAsString();
+						String userid = payload.get(Constants.USER_ID).getAsString();
+						String authToken = payload.get(Constants.AUTH_TOKEN).getAsString();
+						String replyTo = header.get(Constants.REPLY_TO).getAsString();
+						String sessionId = "tobeimplemented";
+						return new ValidateAuthTokenMessage(id, userid, authToken, replyTo,
+						    sessionId);					
+					}
+				} 
+			}
+		}
+
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ValidateAuthTokenReplyMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ValidateAuthTokenReplyMessage.java
new file mode 100755
index 0000000000..01b16000e9
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ValidateAuthTokenReplyMessage.java
@@ -0,0 +1,69 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class ValidateAuthTokenReplyMessage implements ISubscribedMessage {
+	public static final String VALIDATE_AUTH_TOKEN_REPLY  = "validate_auth_token_reply";
+	public static final String VERSION = "0.0.1";
+	
+	public final String meetingId;
+	public final String userId;
+	public final String token;
+	public final String replyTo;
+	public final Boolean valid;
+	
+	public ValidateAuthTokenReplyMessage(String meetingId, String userId, String token, 
+			Boolean valid, String replyTo) {
+		this.meetingId = meetingId;
+		this.userId = userId;
+		this.token = token;
+		this.replyTo = replyTo;
+		this.valid = valid;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.REPLY_TO, replyTo);
+		payload.put(Constants.VALID, valid);
+		payload.put(Constants.USER_ID, userId);
+		payload.put(Constants.AUTH_TOKEN, token);
+		payload.put(Constants.MEETING_ID, meetingId); 
+			
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(VALIDATE_AUTH_TOKEN_REPLY, VERSION, replyTo);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static ValidateAuthTokenReplyMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (VALIDATE_AUTH_TOKEN_REPLY.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.USER_ID)
+							&& payload.has(Constants.AUTH_TOKEN)
+							&& payload.has(Constants.VALID)
+							&& payload.has(Constants.REPLY_TO)) {
+						String id = payload.get(Constants.MEETING_ID).getAsString();
+						String userid = payload.get(Constants.USER_ID).getAsString();
+						String authToken = payload.get(Constants.AUTH_TOKEN).getAsString();
+						String replyTo = payload.get(Constants.REPLY_TO).getAsString();
+						Boolean valid = payload.get(Constants.VALID).getAsBoolean();
+						return new ValidateAuthTokenReplyMessage(id, userid, authToken, valid, replyTo);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ValidateAuthTokenTimeoutMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ValidateAuthTokenTimeoutMessage.java
new file mode 100755
index 0000000000..f8fdd31f54
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/ValidateAuthTokenTimeoutMessage.java
@@ -0,0 +1,69 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class ValidateAuthTokenTimeoutMessage implements ISubscribedMessage {
+	public static final String VALIDATE_AUTH_TOKEN_TIMEOUT  = "validate_auth_token_timeout";
+	public static final String VERSION = "0.0.1";
+	
+	public final String meetingId;
+	public final String userId;
+	public final String token;
+	public final String replyTo;
+	public final Boolean valid;
+	
+	public ValidateAuthTokenTimeoutMessage(String meetingId, String userId, String token, 
+			Boolean valid, String replyTo) {
+		this.meetingId = meetingId;
+		this.userId = userId;
+		this.token = token;
+		this.replyTo = replyTo;
+		this.valid = valid;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(Constants.REPLY_TO, replyTo);
+		payload.put(Constants.VALID, valid);
+		payload.put(Constants.USER_ID, userId);
+		payload.put(Constants.AUTH_TOKEN, token);
+		payload.put(Constants.MEETING_ID, meetingId); 
+			
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(VALIDATE_AUTH_TOKEN_TIMEOUT, VERSION, replyTo);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static ValidateAuthTokenTimeoutMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (VALIDATE_AUTH_TOKEN_TIMEOUT.equals(messageName)) {
+					if (payload.has(Constants.MEETING_ID) 
+							&& payload.has(Constants.USER_ID)
+							&& payload.has(Constants.AUTH_TOKEN)
+							&& payload.has(Constants.VALID)
+							&& payload.has(Constants.REPLY_TO)) {
+						String id = payload.get(Constants.MEETING_ID).getAsString();
+						String userid = payload.get(Constants.USER_ID).getAsString();
+						String authToken = payload.get(Constants.AUTH_TOKEN).getAsString();
+						String replyTo = payload.get(Constants.REPLY_TO).getAsString();
+						Boolean valid = payload.get(Constants.VALID).getAsBoolean();
+						return new ValidateAuthTokenTimeoutMessage(id, userid, authToken, valid, replyTo);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/VoiceConfRecordingStartedMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/VoiceConfRecordingStartedMessage.java
new file mode 100755
index 0000000000..6bd2dd455c
--- /dev/null
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/VoiceConfRecordingStartedMessage.java
@@ -0,0 +1,69 @@
+package org.bigbluebutton.common.messages;
+
+import java.util.HashMap;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class VoiceConfRecordingStartedMessage {
+	public static final String VOICE_CONF_RECORDING_STARTED  = "voice_conf_recording_started_message";
+	public static final String VERSION = "0.0.1";
+	
+	public static final String VOICE_CONF_ID = "voice_conf_id";
+	public static final String RECORD_STREAM = "record_stream";
+	public static final String RECORDING = "recording";
+	public static final String TIMESTAMP = "timestamp";
+	
+	public final String voiceConfId;
+	public final String recordStream;
+	public final Boolean recording;
+	public final String timestamp;
+	
+	public VoiceConfRecordingStartedMessage(String voiceConfId, 
+			String recordStream, Boolean recording, String timestamp) {
+		this.voiceConfId = voiceConfId;
+		this.recordStream = recordStream;
+		this.recording = recording;
+		this.timestamp = timestamp;
+	}
+	
+	public String toJson() {
+		HashMap<String, Object> payload = new HashMap<String, Object>();
+		payload.put(VOICE_CONF_ID, voiceConfId);
+		payload.put(RECORD_STREAM, recordStream);
+		payload.put(RECORDING, recording);
+		payload.put(TIMESTAMP, timestamp);
+		
+		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(VOICE_CONF_RECORDING_STARTED, VERSION, null);
+
+		return MessageBuilder.buildJson(header, payload);				
+	}
+	
+	public static VoiceConfRecordingStartedMessage fromJson(String message) {
+		JsonParser parser = new JsonParser();
+		JsonObject obj = (JsonObject) parser.parse(message);
+		
+		if (obj.has("header") && obj.has("payload")) {
+			JsonObject header = (JsonObject) obj.get("header");
+			JsonObject payload = (JsonObject) obj.get("payload");
+			
+			if (header.has("name")) {
+				String messageName = header.get("name").getAsString();
+				if (VOICE_CONF_RECORDING_STARTED.equals(messageName)) {
+					if (payload.has(VOICE_CONF_ID)
+							&& payload.has(RECORD_STREAM)
+							&& payload.has(RECORDING)
+							&& payload.has(TIMESTAMP)) {
+						String voiceConfId = payload.get(VOICE_CONF_ID).getAsString();
+						String recordStream = payload.get(RECORD_STREAM).getAsString();
+						Boolean recording = payload.get(RECORDING).getAsBoolean();
+						String timestamp = payload.get(TIMESTAMP).getAsString();
+						return new VoiceConfRecordingStartedMessage(voiceConfId, recordStream, recording, timestamp);					
+					}
+				} 
+			}
+		}
+		return null;
+
+	}
+}
-- 
GitLab