You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2017/11/20 16:37:41 UTC

openmeetings git commit: [OPENMEETINGS-1756] User name is added to RoomMessage and Activities, title is renamed on nick-name change

Repository: openmeetings
Updated Branches:
  refs/heads/4.0.x 8fbe711f3 -> 89e746214


[OPENMEETINGS-1756] User name is added to RoomMessage and Activities, title is renamed on nick-name change


Project: http://git-wip-us.apache.org/repos/asf/openmeetings/repo
Commit: http://git-wip-us.apache.org/repos/asf/openmeetings/commit/89e74621
Tree: http://git-wip-us.apache.org/repos/asf/openmeetings/tree/89e74621
Diff: http://git-wip-us.apache.org/repos/asf/openmeetings/diff/89e74621

Branch: refs/heads/4.0.x
Commit: 89e746214f3c439a18775f9e59066fb060f22a59
Parents: 8fbe711
Author: Maxim Solodovnik <so...@gmail.com>
Authored: Mon Nov 20 23:37:29 2017 +0700
Committer: Maxim Solodovnik <so...@gmail.com>
Committed: Mon Nov 20 23:37:29 2017 +0700

----------------------------------------------------------------------
 .../core/remote/ScopeApplicationAdapter.java    |  16 +--
 .../core/service/RecordingService.java          |   9 +-
 .../openmeetings/core/util/WebSocketHelper.java |   4 +-
 .../core/util/ws/WsMessageRoomMsg.java          |   2 +-
 .../openmeetings/db/entity/basic/Client.java    |  10 ++
 .../openmeetings/db/entity/basic/IClient.java   |   2 +
 .../db/entity/room/StreamClient.java            |   2 +
 .../openmeetings/db/util/ws/RoomMessage.java    | 113 +++++++++++++++++++
 .../db/util/ws/TextRoomMessage.java             |  41 +++++++
 .../openmeetings/util/message/RoomMessage.java  |  90 ---------------
 .../util/message/TextRoomMessage.java           |  33 ------
 .../openmeetings/web/app/Application.java       |   8 +-
 .../apache/openmeetings/web/pages/HashPage.java |   4 +-
 .../apache/openmeetings/web/room/RoomPanel.java |  14 +--
 .../web/room/activities/ActivitiesPanel.java    |  41 +++----
 .../web/room/activities/Activity.java           |  16 ++-
 .../web/room/menu/RoomMenuPanel.java            |   6 +-
 .../web/room/poll/CreatePollDialog.java         |   5 +-
 .../web/room/poll/PollResultsDialog.java        |   8 +-
 .../openmeetings/web/room/poll/VoteDialog.java  |   5 +-
 .../org/apache/openmeetings/web/room/room.js    |   3 +-
 .../web/room/sidebar/RoomSidebar.java           |   9 +-
 .../openmeetings/webservice/RoomWebService.java |   4 +-
 23 files changed, 247 insertions(+), 198 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/openmeetings/blob/89e74621/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ScopeApplicationAdapter.java
----------------------------------------------------------------------
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ScopeApplicationAdapter.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ScopeApplicationAdapter.java
index be01e8c..afc8148 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ScopeApplicationAdapter.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ScopeApplicationAdapter.java
@@ -53,11 +53,11 @@ import org.apache.openmeetings.db.entity.basic.Client;
 import org.apache.openmeetings.db.entity.log.ConferenceLog;
 import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.db.entity.room.StreamClient;
+import org.apache.openmeetings.db.util.ws.RoomMessage;
+import org.apache.openmeetings.db.util.ws.TextRoomMessage;
 import org.apache.openmeetings.util.NullStringer;
 import org.apache.openmeetings.util.OmFileHelper;
 import org.apache.openmeetings.util.Version;
-import org.apache.openmeetings.util.message.RoomMessage;
-import org.apache.openmeetings.util.message.TextRoomMessage;
 import org.apache.wicket.Application;
 import org.apache.wicket.util.string.Strings;
 import org.red5.logging.Red5LoggerFactory;
@@ -339,7 +339,7 @@ public class ScopeApplicationAdapter extends MultiThreadedApplicationAdapter imp
 
 						//Send message to all users
 						sendMessageToCurrentScope("newScreenSharing", client, false);
-						WebSocketHelper.sendRoom(new TextRoomMessage(client.getRoomId(), client.getUserId(), RoomMessage.Type.sharingStarted, client.getUid()));
+						WebSocketHelper.sendRoom(new TextRoomMessage(client.getRoomId(), client, RoomMessage.Type.sharingStarted, client.getUid()));
 					} else {
 						_log.warn("Streaming is already started for the client id={}. Second request is ignored.", client.getId());
 					}
@@ -534,7 +534,7 @@ public class ScopeApplicationAdapter extends MultiThreadedApplicationAdapter imp
 					.put("type", c.getType())
 					.put("streamId", current.getClient().getId())
 					.put("streamName", streamName);
-			WebSocketHelper.sendRoom(new TextRoomMessage(c.getRoomId(), c.getUserId(), RoomMessage.Type.newStream, obj.toString(new NullStringer())));
+			WebSocketHelper.sendRoom(new TextRoomMessage(c.getRoomId(), c, RoomMessage.Type.newStream, obj.toString(new NullStringer())));
 		} catch (Exception err) {
 			_log.error("[streamPublishStart]", err);
 		}
@@ -612,14 +612,14 @@ public class ScopeApplicationAdapter extends MultiThreadedApplicationAdapter imp
 		JSONObject obj = new JSONObject()
 				.put("sid", rcl.getSid())
 				.put("uid", rcl.getUid());
-		WebSocketHelper.sendRoom(new TextRoomMessage(rcl.getRoomId(), rcl.getUserId(), RoomMessage.Type.sharingStoped, obj.toString()));
+		WebSocketHelper.sendRoom(new TextRoomMessage(rcl.getRoomId(), rcl, RoomMessage.Type.sharingStoped, obj.toString()));
 	}
 
 	private static void sendStreamClosed(StreamClient rcl) {
 		JSONObject obj = new JSONObject()
 				.put("uid", rcl.getUid())
 				.put("sid", rcl.getSid());
-		WebSocketHelper.sendRoom(new TextRoomMessage(rcl.getRoomId(), rcl.getUserId(), RoomMessage.Type.closeStream, obj.toString()));
+		WebSocketHelper.sendRoom(new TextRoomMessage(rcl.getRoomId(), rcl, RoomMessage.Type.closeStream, obj.toString()));
 	}
 
 	public long switchMicMuted(String publicSID, boolean mute) {
@@ -925,7 +925,7 @@ public class ScopeApplicationAdapter extends MultiThreadedApplicationAdapter imp
 	public void micActivity(boolean active) {
 		IConnection current = Red5.getConnectionLocal();
 		StreamClient client = sessionManager.get(IClientUtil.getId(current.getClient()));
-		WebSocketHelper.sendRoom(new TextRoomMessage(client.getRoomId(), client.getUserId(), RoomMessage.Type.audioActivity
+		WebSocketHelper.sendRoom(new TextRoomMessage(client.getRoomId(), client, RoomMessage.Type.audioActivity
 				, new JSONObject().put("sid", client.getSid()).put("active", active).toString()));
 	}
 
@@ -991,7 +991,7 @@ public class ScopeApplicationAdapter extends MultiThreadedApplicationAdapter imp
 			sessionManager.update(client);
 			_log.debug("updateSipTransport: {}, {}, {}, {}, {}", new Object[] { client.getUid(), client.getRoomId(),
 					client.getFirstname(), client.getLastname(), client.getAvsettings() });
-			WebSocketHelper.sendRoom(new TextRoomMessage(client.getRoomId(), client.getUserId(), RoomMessage.Type.rightUpdated, client.getUid()));
+			WebSocketHelper.sendRoom(new TextRoomMessage(client.getRoomId(), client, RoomMessage.Type.rightUpdated, client.getUid()));
 			sendMessageWithClient(new String[] { "personal", client.getFirstname(), client.getLastname() });
 		}
 		return count != null && count > 0 ? count - 1 : 0;

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/89e74621/openmeetings-core/src/main/java/org/apache/openmeetings/core/service/RecordingService.java
----------------------------------------------------------------------
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/service/RecordingService.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/service/RecordingService.java
index 0b1b86b..675f403 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/service/RecordingService.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/service/RecordingService.java
@@ -46,9 +46,9 @@ import org.apache.openmeetings.db.entity.record.RecordingMetaData;
 import org.apache.openmeetings.db.entity.record.RecordingMetaData.Status;
 import org.apache.openmeetings.db.entity.room.StreamClient;
 import org.apache.openmeetings.db.entity.user.User;
+import org.apache.openmeetings.db.util.ws.RoomMessage;
+import org.apache.openmeetings.db.util.ws.TextRoomMessage;
 import org.apache.openmeetings.util.CalendarPatterns;
-import org.apache.openmeetings.util.message.RoomMessage;
-import org.apache.openmeetings.util.message.TextRoomMessage;
 import org.red5.logging.Red5LoggerFactory;
 import org.red5.server.api.IConnection;
 import org.red5.server.api.scope.IScope;
@@ -110,6 +110,7 @@ public class RecordingService {
 			User u = userDao.get(ownerId);
 			if (u != null && User.Type.contact == u.getType()) {
 				ownerId = u.getOwnerId();
+				u = userDao.get(ownerId);
 			}
 			recording.setInsertedBy(ownerId);
 			recording.setType(Type.Recording);
@@ -149,7 +150,7 @@ public class RecordingService {
 				}
 			}
 			// Send notification to all users that the recording has been started
-			WebSocketHelper.sendRoom(new TextRoomMessage(roomId, ownerId, RoomMessage.Type.recordingStarted
+			WebSocketHelper.sendRoom(new TextRoomMessage(roomId, u, RoomMessage.Type.recordingStarted
 					, new JSONObject().put("uid", client.getUid()).put("sid", client.getSid()).toString()));
 		} catch (Exception err) {
 			log.error("[startRecording]", err);
@@ -183,7 +184,7 @@ public class RecordingService {
 				recClient.setRecordingStarted(false);
 				sessionManager.update(recClient);
 			}
-			WebSocketHelper.sendRoom(new TextRoomMessage(stopClient.getRoomId(), stopClient.getUserId(), RoomMessage.Type.recordingStoped, stopClient.getSid()));
+			WebSocketHelper.sendRoom(new TextRoomMessage(stopClient.getRoomId(), stopClient, RoomMessage.Type.recordingStoped, stopClient.getSid()));
 			// get all stream and stop recording them
 			for (IConnection conn : scope.getClientConnections()) {
 				if (conn != null && conn instanceof IServiceCapableConnection) {

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/89e74621/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/WebSocketHelper.java
----------------------------------------------------------------------
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/WebSocketHelper.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/WebSocketHelper.java
index 3aad209..100b213 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/WebSocketHelper.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/WebSocketHelper.java
@@ -41,8 +41,8 @@ import org.apache.openmeetings.db.entity.basic.ChatMessage;
 import org.apache.openmeetings.db.entity.basic.Client;
 import org.apache.openmeetings.db.entity.room.Room.Right;
 import org.apache.openmeetings.db.entity.user.User;
-import org.apache.openmeetings.util.message.RoomMessage;
-import org.apache.openmeetings.util.message.TextRoomMessage;
+import org.apache.openmeetings.db.util.ws.RoomMessage;
+import org.apache.openmeetings.db.util.ws.TextRoomMessage;
 import org.apache.openmeetings.util.ws.IClusterWsMessage;
 import org.apache.wicket.Application;
 import org.apache.wicket.protocol.ws.WebSocketSettings;

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/89e74621/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/ws/WsMessageRoomMsg.java
----------------------------------------------------------------------
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/ws/WsMessageRoomMsg.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/ws/WsMessageRoomMsg.java
index 4f8a3d2..7e5f455 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/ws/WsMessageRoomMsg.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/ws/WsMessageRoomMsg.java
@@ -18,7 +18,7 @@
  */
 package org.apache.openmeetings.core.util.ws;
 
-import org.apache.openmeetings.util.message.RoomMessage;
+import org.apache.openmeetings.db.util.ws.RoomMessage;
 import org.apache.openmeetings.util.ws.IClusterWsMessage;
 
 public class WsMessageRoomMsg implements IClusterWsMessage {

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/89e74621/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Client.java
----------------------------------------------------------------------
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Client.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Client.java
index d9cd0f2..8781a7b 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Client.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/Client.java
@@ -133,6 +133,16 @@ public class Client implements IClient {
 	}
 
 	@Override
+	public String getFirstname() {
+		return user.getFirstname();
+	}
+
+	@Override
+	public String getLastname() {
+		return user.getLastname();
+	}
+
+	@Override
 	public String getUid() {
 		return uid;
 	}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/89e74621/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/IClient.java
----------------------------------------------------------------------
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/IClient.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/IClient.java
index f9817a5..328f67c 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/IClient.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/IClient.java
@@ -39,6 +39,8 @@ public interface IClient extends IDataProviderEntity {
 	String getSid();
 	Long getUserId();
 	String getLogin();
+	String getFirstname();
+	String getLastname();
 	String getRemoteAddress();
 	Long getRoomId();
 	int getWidth();

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/89e74621/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/StreamClient.java
----------------------------------------------------------------------
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/StreamClient.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/StreamClient.java
index 0d8b462..4731e69 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/StreamClient.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/StreamClient.java
@@ -209,6 +209,7 @@ public class StreamClient implements IClient {
 		this.userId = userId;
 	}
 
+	@Override
 	public String getFirstname() {
 		return firstname;
 	}
@@ -217,6 +218,7 @@ public class StreamClient implements IClient {
 		this.firstname = firstname;
 	}
 
+	@Override
 	public String getLastname() {
 		return lastname;
 	}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/89e74621/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/ws/RoomMessage.java
----------------------------------------------------------------------
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/ws/RoomMessage.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/ws/RoomMessage.java
new file mode 100644
index 0000000..1e4af48
--- /dev/null
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/ws/RoomMessage.java
@@ -0,0 +1,113 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.db.util.ws;
+
+import static org.apache.openmeetings.db.dao.room.SipDao.SIP_FIRST_NAME;
+import static org.apache.openmeetings.util.OmFileHelper.SIP_USER_ID;
+
+import java.util.Date;
+import java.util.UUID;
+
+import org.apache.openmeetings.db.entity.basic.IClient;
+import org.apache.openmeetings.db.entity.user.User;
+import org.apache.wicket.protocol.ws.api.message.IWebSocketPushMessage;
+
+public class RoomMessage implements IWebSocketPushMessage {
+	private static final long serialVersionUID = 1L;
+	public enum Type {
+		roomEnter
+		, roomExit
+		, roomClosed
+		, pollCreated
+		, pollUpdated
+		, recordingStarted
+		, recordingStoped
+		, sharingStarted
+		, sharingStoped
+		, rightUpdated
+		, activityRemove
+		, requestRightModerator
+		, requestRightPresenter
+		, requestRightWb
+		, requestRightShare
+		, requestRightRemote
+		, requestRightA
+		, requestRightAv
+		, requestRightMute
+		, requestRightExclusive
+		, haveQuestion
+		, kick
+		, newStream
+		, closeStream
+		, audioActivity //user speaks
+		, mute
+		, exclusive
+	}
+	private final Date timestamp;
+	private final String uid;
+	private final Long roomId;
+	private final Long userId;
+	private final String name;
+	private final Type type;
+
+	public RoomMessage(Long roomId, IClient c, Type type) {
+		this(roomId, c.getUserId(), c.getFirstname(), c.getLastname(), type);
+	}
+
+	public RoomMessage(Long roomId, User u, Type type) {
+		this(roomId, u.getId(), u.getFirstname(), u.getLastname(), type);
+	}
+
+	private RoomMessage(Long roomId, Long userId, String firstName, String lastName, Type type) {
+		this.timestamp = new Date();
+		this.roomId = roomId;
+		if (SIP_USER_ID.equals(userId)) {
+			this.name = SIP_FIRST_NAME;
+		} else {
+			name = String.format("%s %s", firstName, lastName);
+		}
+		this.userId = userId;
+		this.type = type;
+		this.uid = UUID.randomUUID().toString();
+	}
+
+	public Date getTimestamp() {
+		return timestamp;
+	}
+
+	public Long getRoomId() {
+		return roomId;
+	}
+
+	public Long getUserId() {
+		return userId;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public Type getType() {
+		return type;
+	}
+
+	public String getUid() {
+		return uid;
+	}
+}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/89e74621/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/ws/TextRoomMessage.java
----------------------------------------------------------------------
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/ws/TextRoomMessage.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/ws/TextRoomMessage.java
new file mode 100644
index 0000000..0750cd8
--- /dev/null
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/ws/TextRoomMessage.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.db.util.ws;
+
+import org.apache.openmeetings.db.entity.basic.IClient;
+import org.apache.openmeetings.db.entity.user.User;
+
+public class TextRoomMessage extends RoomMessage {
+	private static final long serialVersionUID = 1L;
+	private final String text;
+
+	public TextRoomMessage(Long roomId, IClient client, Type type, String text) {
+		super(roomId, client, type);
+		this.text = text;
+	}
+
+	public TextRoomMessage(Long roomId, User u, Type type, String text) {
+		super(roomId, u, type);
+		this.text = text;
+	}
+
+	public String getText() {
+		return text;
+	}
+}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/89e74621/openmeetings-util/src/main/java/org/apache/openmeetings/util/message/RoomMessage.java
----------------------------------------------------------------------
diff --git a/openmeetings-util/src/main/java/org/apache/openmeetings/util/message/RoomMessage.java b/openmeetings-util/src/main/java/org/apache/openmeetings/util/message/RoomMessage.java
deleted file mode 100644
index 47146ae..0000000
--- a/openmeetings-util/src/main/java/org/apache/openmeetings/util/message/RoomMessage.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License") +  you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.openmeetings.util.message;
-
-import java.util.Date;
-import java.util.UUID;
-
-import org.apache.wicket.protocol.ws.api.message.IWebSocketPushMessage;
-
-public class RoomMessage implements IWebSocketPushMessage {
-	private static final long serialVersionUID = 1L;
-	public enum Type {
-		roomEnter
-		, roomExit
-		, roomClosed
-		, pollCreated
-		, pollUpdated
-		, recordingStarted
-		, recordingStoped
-		, sharingStarted
-		, sharingStoped
-		, rightUpdated
-		, activityRemove
-		, requestRightModerator
-		, requestRightPresenter
-		, requestRightWb
-		, requestRightShare
-		, requestRightRemote
-		, requestRightA
-		, requestRightAv
-		, requestRightMute
-		, requestRightExclusive
-		, haveQuestion
-		, kick
-		, newStream
-		, closeStream
-		, audioActivity //user speaks
-		, mute
-		, exclusive
-	}
-	private final Date timestamp;
-	private final String uid;
-	private final Long roomId;
-	private final Long userId;
-	private final Type type;
-
-	public RoomMessage(Long roomId, Long userId, Type type) {
-		this.timestamp = new Date();
-		this.roomId = roomId;
-		this.userId = userId;
-		this.type = type;
-		this.uid = UUID.randomUUID().toString();
-	}
-
-	public Date getTimestamp() {
-		return timestamp;
-	}
-
-	public Long getRoomId() {
-		return roomId;
-	}
-
-	public Long getUserId() {
-		return userId;
-	}
-
-	public Type getType() {
-		return type;
-	}
-
-	public String getUid() {
-		return uid;
-	}
-}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/89e74621/openmeetings-util/src/main/java/org/apache/openmeetings/util/message/TextRoomMessage.java
----------------------------------------------------------------------
diff --git a/openmeetings-util/src/main/java/org/apache/openmeetings/util/message/TextRoomMessage.java b/openmeetings-util/src/main/java/org/apache/openmeetings/util/message/TextRoomMessage.java
deleted file mode 100644
index d468a5b..0000000
--- a/openmeetings-util/src/main/java/org/apache/openmeetings/util/message/TextRoomMessage.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License") +  you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.openmeetings.util.message;
-
-public class TextRoomMessage extends RoomMessage {
-	private static final long serialVersionUID = 1L;
-	private final String text;
-
-	public TextRoomMessage(Long roomId, Long userId, Type type, String text) {
-		super(roomId, userId, type);
-		this.text = text;
-	}
-
-	public String getText() {
-		return text;
-	}
-}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/89e74621/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
index 257e074..9af5134 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
@@ -75,8 +75,8 @@ import org.apache.openmeetings.db.entity.room.StreamClient;
 import org.apache.openmeetings.db.entity.server.Sessiondata;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.entity.user.User.Type;
+import org.apache.openmeetings.db.util.ws.RoomMessage;
 import org.apache.openmeetings.util.OpenmeetingsVariables;
-import org.apache.openmeetings.util.message.RoomMessage;
 import org.apache.openmeetings.util.ws.IClusterWsMessage;
 import org.apache.openmeetings.web.pages.AccessDeniedPage;
 import org.apache.openmeetings.web.pages.ActivatePage;
@@ -395,7 +395,7 @@ public class Application extends AuthenticatedWebApplication implements IApplica
 		Long roomId = c.getRoomId();
 		removeUserFromRoom(c);
 		if (roomId != null) {
-			sendRoom(new RoomMessage(roomId, c.getUserId(), RoomMessage.Type.roomExit));
+			sendRoom(new RoomMessage(roomId, c, RoomMessage.Type.roomExit));
 			getBean(ConferenceLogDao.class).add(
 					ConferenceLog.Type.roomLeave
 					, c.getUserId(), "0", roomId
@@ -442,7 +442,7 @@ public class Application extends AuthenticatedWebApplication implements IApplica
 					client.setMic(0);
 					client.setRoom(getBean(RoomDao.class).get(rcl.getRoomId()));
 					addUserToRoom(client);
-					WebSocketHelper.sendRoom(new RoomMessage(client.getRoom().getId(), client.getUserId(), RoomMessage.Type.roomEnter));
+					WebSocketHelper.sendRoom(new RoomMessage(client.getRoom().getId(), client, RoomMessage.Type.roomEnter));
 				}
 			} else if (client == null && Client.Type.sip == rcl.getType()) {
 				rcl.setLogin(SIP_USER_NAME);
@@ -459,7 +459,7 @@ public class Application extends AuthenticatedWebApplication implements IApplica
 				client.allow(Room.Right.audio, Room.Right.video);
 				client.set(Activity.broadcastA);
 				addUserToRoom(client);
-				WebSocketHelper.sendRoom(new RoomMessage(client.getRoom().getId(), client.getUserId(), RoomMessage.Type.roomEnter));
+				WebSocketHelper.sendRoom(new RoomMessage(client.getRoom().getId(), client, RoomMessage.Type.roomEnter));
 			} else {
 				return null;
 			}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/89e74621/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.java
index 7898d3d..c7c3ef1 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.java
@@ -109,7 +109,9 @@ public class HashPage extends BaseInitedPage implements IUpdatable {
 				FastDateFormat sdf = WebSession.createDateFormat(i.getInvitee());
 				errorMsg = Valid.OneTime == i.getValid()
 						? getString("error.hash.used")
-						: String.format("%s %s - %s", getString("error.hash.period"), sdf.format(i.getValidFrom()), sdf.format(i.getValidTo()));
+						: String.format("%s %s - %s, %s", getString("error.hash.period")
+								, sdf.format(i.getValidFrom()), sdf.format(i.getValidTo())
+								, i.getInvitee().getTimeZoneId());
 			} else {
 				Recording rec = i.getRecording();
 				if (rec != null) {

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/89e74621/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
index 217664d..c489d14 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
@@ -60,10 +60,10 @@ import org.apache.openmeetings.db.entity.server.SOAPLogin;
 import org.apache.openmeetings.db.entity.user.GroupUser;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.util.AuthLevelUtil;
+import org.apache.openmeetings.db.util.ws.RoomMessage;
+import org.apache.openmeetings.db.util.ws.RoomMessage.Type;
+import org.apache.openmeetings.db.util.ws.TextRoomMessage;
 import org.apache.openmeetings.util.NullStringer;
-import org.apache.openmeetings.util.message.RoomMessage;
-import org.apache.openmeetings.util.message.RoomMessage.Type;
-import org.apache.openmeetings.util.message.TextRoomMessage;
 import org.apache.openmeetings.web.app.Application;
 import org.apache.openmeetings.web.app.WebSession;
 import org.apache.openmeetings.web.common.BasePanel;
@@ -148,7 +148,7 @@ public class RoomPanel extends BasePanel {
 					.append(wb.getInitScript())
 					.append("Room.setSize();");
 			target.appendJavaScript(sb);
-			WebSocketHelper.sendRoom(new RoomMessage(r.getId(), getUserId(), RoomMessage.Type.roomEnter));
+			WebSocketHelper.sendRoom(new RoomMessage(r.getId(), _c, RoomMessage.Type.roomEnter));
 			// play video from other participants
 			initVideos(target);
 			getMainPanel().getChat().roomEnter(r, target);
@@ -782,7 +782,7 @@ public class RoomPanel extends BasePanel {
 				break;
 		}
 		if (reqType != null) {
-			WebSocketHelper.sendRoom(new TextRoomMessage(getRoom().getId(), getUserId(), reqType, getClient().getUid()));
+			WebSocketHelper.sendRoom(new TextRoomMessage(getRoom().getId(), getClient(), reqType, getClient().getUid()));
 		}
 	}
 
@@ -807,12 +807,12 @@ public class RoomPanel extends BasePanel {
 	}
 
 	public void kickUser(Client client) {
-		WebSocketHelper.sendRoom(new TextRoomMessage(client.getRoom().getId(), client.getUserId(), Type.kick, client.getUid()));
+		WebSocketHelper.sendRoom(new TextRoomMessage(client.getRoom().getId(), client, Type.kick, client.getUid()));
 	}
 
 	public void broadcast(Client client) {
 		RoomBroadcaster.sendUpdatedClient(client);
-		WebSocketHelper.sendRoom(new TextRoomMessage(getRoom().getId(), getUserId(), RoomMessage.Type.rightUpdated, client.getUid()));
+		WebSocketHelper.sendRoom(new TextRoomMessage(getRoom().getId(), getClient(), RoomMessage.Type.rightUpdated, client.getUid()));
 	}
 
 	public Room getRoom() {

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/89e74621/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/ActivitiesPanel.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/ActivitiesPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/ActivitiesPanel.java
index 90b3fb6..2215028 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/ActivitiesPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/ActivitiesPanel.java
@@ -19,11 +19,8 @@
 package org.apache.openmeetings.web.room.activities;
 
 import static org.apache.openmeetings.core.util.WebSocketHelper.sendRoom;
-import static org.apache.openmeetings.db.dao.room.SipDao.SIP_FIRST_NAME;
-import static org.apache.openmeetings.util.OmFileHelper.SIP_USER_ID;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_CLASS;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.getWebAppRootKey;
-import static org.apache.openmeetings.web.app.Application.getBean;
 import static org.apache.openmeetings.web.app.Application.getOnlineClient;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 import static org.apache.openmeetings.web.pages.BasePage.ALIGN_LEFT;
@@ -37,13 +34,11 @@ import java.util.LinkedHashMap;
 import java.util.Map;
 
 import org.apache.commons.lang3.time.FastDateFormat;
-import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.basic.Client;
 import org.apache.openmeetings.db.entity.room.Room.Right;
 import org.apache.openmeetings.db.entity.room.Room.RoomElement;
-import org.apache.openmeetings.db.entity.user.User;
-import org.apache.openmeetings.util.message.RoomMessage;
-import org.apache.openmeetings.util.message.TextRoomMessage;
+import org.apache.openmeetings.db.util.ws.RoomMessage;
+import org.apache.openmeetings.db.util.ws.TextRoomMessage;
 import org.apache.openmeetings.web.pages.BasePage;
 import org.apache.openmeetings.web.room.RoomPanel;
 import org.apache.wicket.AttributeModifier;
@@ -82,6 +77,10 @@ public class ActivitiesPanel extends Panel {
 	private final AbstractDefaultAjaxBehavior action = new AbstractDefaultAjaxBehavior() {
 		private static final long serialVersionUID = 1L;
 
+		private TextRoomMessage getRemoveMsg(String id) {
+			return new TextRoomMessage(room.getRoom().getId(), room.getClient(), RoomMessage.Type.activityRemove, id);
+		}
+
 		@Override
 		protected void respond(AjaxRequestTarget target) {
 			try {
@@ -99,7 +98,7 @@ public class ActivitiesPanel extends Panel {
 						break;
 					case decline:
 						if (room.getClient().hasRight(Right.moderator)) {
-							sendRoom(new TextRoomMessage(room.getRoom().getId(), getUserId(), RoomMessage.Type.activityRemove, id));
+							sendRoom(getRemoveMsg(id));
 						}
 						break;
 					case accept:
@@ -107,39 +106,39 @@ public class ActivitiesPanel extends Panel {
 						if (room.getClient().hasRight(Right.moderator) && client != null && client.getRoom() != null && roomId == client.getRoom().getId()) {
 							switch (a.getType()) {
 								case reqRightModerator:
-									sendRoom(new TextRoomMessage(room.getRoom().getId(), getUserId(), RoomMessage.Type.activityRemove, id));
+									sendRoom(getRemoveMsg(id));
 									room.allowRight(client, Right.moderator);
 									break;
 								case reqRightAv:
-									sendRoom(new TextRoomMessage(room.getRoom().getId(), getUserId(), RoomMessage.Type.activityRemove, id));
+									sendRoom(getRemoveMsg(id));
 									room.allowRight(client, Right.audio, Right.video);
 									break;
 								case reqRightPresenter:
-									sendRoom(new TextRoomMessage(room.getRoom().getId(), getUserId(), RoomMessage.Type.activityRemove, id));
+									sendRoom(getRemoveMsg(id));
 									room.allowRight(client, Right.presenter);
 									break;
 								case reqRightWb:
-									sendRoom(new TextRoomMessage(room.getRoom().getId(), getUserId(), RoomMessage.Type.activityRemove, id));
+									sendRoom(getRemoveMsg(id));
 									room.allowRight(client, Right.whiteBoard);
 									break;
 								case reqRightShare:
-									sendRoom(new TextRoomMessage(room.getRoom().getId(), getUserId(), RoomMessage.Type.activityRemove, id));
+									sendRoom(getRemoveMsg(id));
 									room.allowRight(client, Right.share);
 									break;
 								case reqRightRemote:
-									sendRoom(new TextRoomMessage(room.getRoom().getId(), getUserId(), RoomMessage.Type.activityRemove, id));
+									sendRoom(getRemoveMsg(id));
 									room.allowRight(client, Right.remoteControl);
 									break;
 								case reqRightA:
-									sendRoom(new TextRoomMessage(room.getRoom().getId(), getUserId(), RoomMessage.Type.activityRemove, id));
+									sendRoom(getRemoveMsg(id));
 									room.allowRight(client, Right.audio);
 									break;
 								case reqRightMute:
-									sendRoom(new TextRoomMessage(room.getRoom().getId(), getUserId(), RoomMessage.Type.activityRemove, id));
+									sendRoom(getRemoveMsg(id));
 									room.allowRight(client, Right.mute);
 									break;
 								case reqRightExclusive:
-									sendRoom(new TextRoomMessage(room.getRoom().getId(), getUserId(), RoomMessage.Type.activityRemove, id));
+									sendRoom(getRemoveMsg(id));
 									room.allowRight(client, Right.exclusive);
 									break;
 								default:
@@ -192,13 +191,7 @@ public class ActivitiesPanel extends Panel {
 					decline.setVisible(false);
 					break;
 			}
-			String name;
-			if (SIP_USER_ID.equals(a.getSender())) {
-				name = SIP_FIRST_NAME;
-			} else {
-				User u = getBean(UserDao.class).get(a.getSender());
-				name = self ? getString("1362") : String.format("%s %s", u.getFirstname(), u.getLastname());
-			}
+			String name = self ? getString("1362") : a.getName();
 			final String fmt = ((BasePage)getPage()).isRtl() ? ACTIVITY_FMT_RTL : ACTIVITY_FMT;
 			switch (a.getType()) {
 				case roomEnter:

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/89e74621/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/Activity.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/Activity.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/Activity.java
index 7dd70c4..0fd8fb7 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/Activity.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/Activity.java
@@ -21,8 +21,8 @@ package org.apache.openmeetings.web.room.activities;
 import java.io.Serializable;
 import java.util.Date;
 
-import org.apache.openmeetings.util.message.RoomMessage;
-import org.apache.openmeetings.util.message.TextRoomMessage;
+import org.apache.openmeetings.db.util.ws.RoomMessage;
+import org.apache.openmeetings.db.util.ws.TextRoomMessage;
 
 public class Activity implements Serializable {
 	private static final long serialVersionUID = 1L;
@@ -43,21 +43,23 @@ public class Activity implements Serializable {
 	private final String id;
 	private final String uid;
 	private final Long sender;
+	private final String name;
 	private final Date created;
 	private final Type type;
 
 	public Activity(RoomMessage m, Type type) {
-		this(m.getUid(), null, m.getUserId(), type);
+		this(m.getUid(), null, m.getUserId(), m.getName(), type);
 	}
 
 	public Activity(TextRoomMessage m, Type type) {
-		this(m.getUid(), m.getText(), m.getUserId(), type);
+		this(m.getUid(), m.getText(), m.getUserId(), m.getName(), type);
 	}
 
-	public Activity(String id, String uid, Long sender, Type type) {
+	public Activity(String id, String uid, Long sender, String name, Type type) {
 		this.id = id;
 		this.uid = uid;
 		this.sender = sender;
+		this.name = name;
 		this.type = type;
 		this.created = new Date();
 	}
@@ -74,6 +76,10 @@ public class Activity implements Serializable {
 		return sender;
 	}
 
+	public String getName() {
+		return name;
+	}
+
 	public Type getType() {
 		return type;
 	}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/89e74621/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
index ca836e9..7c7a4bf 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
@@ -46,8 +46,8 @@ import org.apache.openmeetings.db.entity.room.Room.RoomElement;
 import org.apache.openmeetings.db.entity.room.RoomPoll;
 import org.apache.openmeetings.db.entity.user.Group;
 import org.apache.openmeetings.db.entity.user.User;
-import org.apache.openmeetings.util.message.RoomMessage.Type;
-import org.apache.openmeetings.util.message.TextRoomMessage;
+import org.apache.openmeetings.db.util.ws.RoomMessage.Type;
+import org.apache.openmeetings.db.util.ws.TextRoomMessage;
 import org.apache.openmeetings.web.app.Application;
 import org.apache.openmeetings.web.app.WebSession;
 import org.apache.openmeetings.web.common.ImagePanel;
@@ -95,7 +95,7 @@ public class RoomMenuPanel extends Panel {
 		@Override
 		public void onClick(AjaxRequestTarget target) {
 			Client c = room.getClient();
-			WebSocketHelper.sendRoom(new TextRoomMessage(c.getRoom().getId(), c.getUserId(), Type.haveQuestion, c.getUid()));
+			WebSocketHelper.sendRoom(new TextRoomMessage(c.getRoom().getId(), c, Type.haveQuestion, c.getUid()));
 		}
 	};
 	private final RoomPanel room;

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/89e74621/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/CreatePollDialog.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/CreatePollDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/CreatePollDialog.java
index ccaf8b9..e318d56 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/CreatePollDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/CreatePollDialog.java
@@ -30,8 +30,9 @@ import org.apache.openmeetings.db.dao.room.RoomDao;
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.room.RoomPoll;
 import org.apache.openmeetings.db.entity.user.User;
-import org.apache.openmeetings.util.message.RoomMessage;
+import org.apache.openmeetings.db.util.ws.RoomMessage;
 import org.apache.openmeetings.web.app.Application;
+import org.apache.openmeetings.web.common.MainPanel;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.markup.html.form.ChoiceRenderer;
 import org.apache.wicket.markup.html.form.DropDownChoice;
@@ -96,7 +97,7 @@ public class CreatePollDialog extends AbstractFormDialog<RoomPoll> {
 		PollDao dao = getBean(PollDao.class);
 		dao.close(roomId);
 		dao.update(form.getModelObject());
-		sendRoom(new RoomMessage(roomId, getUserId(), RoomMessage.Type.pollCreated));
+		sendRoom(new RoomMessage(roomId, findParent(MainPanel.class).getClient(), RoomMessage.Type.pollCreated));
 	}
 
 	private class PollForm extends Form<RoomPoll> {

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/89e74621/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/PollResultsDialog.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/PollResultsDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/PollResultsDialog.java
index f1e0637..9d6cbca 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/PollResultsDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/PollResultsDialog.java
@@ -20,7 +20,6 @@ package org.apache.openmeetings.web.room.poll;
 
 import static org.apache.openmeetings.core.util.WebSocketHelper.sendRoom;
 import static org.apache.openmeetings.web.app.Application.getBean;
-import static org.apache.openmeetings.web.app.WebSession.getUserId;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -29,8 +28,9 @@ import java.util.List;
 import org.apache.openmeetings.db.dao.room.PollDao;
 import org.apache.openmeetings.db.entity.room.RoomPoll;
 import org.apache.openmeetings.db.entity.room.RoomPollAnswer;
-import org.apache.openmeetings.util.message.RoomMessage;
+import org.apache.openmeetings.db.util.ws.RoomMessage;
 import org.apache.openmeetings.web.app.Application;
+import org.apache.openmeetings.web.common.MainPanel;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
@@ -101,7 +101,7 @@ public class PollResultsDialog extends AbstractDialog<RoomPoll> {
 					RoomPoll p = getBean(PollDao.class).get(id);
 					selForm.select.setModelObject(p);
 					dispForm.updateModel(p, true, handler);
-					sendRoom(new RoomMessage(roomId, getUserId(), RoomMessage.Type.pollUpdated));
+					sendRoom(new RoomMessage(roomId, findParent(MainPanel.class).getClient(), RoomMessage.Type.pollUpdated));
 				}
 			}
 		});
@@ -114,7 +114,7 @@ public class PollResultsDialog extends AbstractDialog<RoomPoll> {
 					getBean(PollDao.class).delete(dispForm.getModelObject());
 					selForm.updateModel(handler);
 					dispForm.updateModel(selForm.select.getModelObject(), true, handler);
-					sendRoom(new RoomMessage(roomId, getUserId(), RoomMessage.Type.pollUpdated));
+					sendRoom(new RoomMessage(roomId, findParent(MainPanel.class).getClient(), RoomMessage.Type.pollUpdated));
 				}
 			}
 		});

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/89e74621/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/VoteDialog.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/VoteDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/VoteDialog.java
index 3fbe2ee..d6fc278 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/VoteDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/poll/VoteDialog.java
@@ -31,8 +31,9 @@ import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.room.RoomPoll;
 import org.apache.openmeetings.db.entity.room.RoomPollAnswer;
 import org.apache.openmeetings.db.entity.user.User;
-import org.apache.openmeetings.util.message.RoomMessage;
+import org.apache.openmeetings.db.util.ws.RoomMessage;
 import org.apache.openmeetings.web.app.Application;
+import org.apache.openmeetings.web.common.MainPanel;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
 import org.apache.wicket.markup.html.WebMarkupContainer;
@@ -127,7 +128,7 @@ public class VoteDialog extends AbstractFormDialog<RoomPollAnswer> {
 			a.getRoomPoll().getAnswers().add(a);
 			dao.update(a.getRoomPoll());
 		}
-		sendRoom(new RoomMessage(roomId, getUserId(), RoomMessage.Type.pollUpdated));
+		sendRoom(new RoomMessage(roomId, findParent(MainPanel.class).getClient(), RoomMessage.Type.pollUpdated));
 	}
 
 	@Override

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/89e74621/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js
index 0271654..c9db35d 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js
@@ -364,7 +364,8 @@ var Video = (function() {
 			c.pod = _c.pod;
 			v.dialog('option', 'appendTo', '.pod.pod-' + c.pod);
 		}
-		v.dialog('option', 'title', _getName());
+		const name = _getName();
+		v.dialog('option', 'title', name).parent().find('.ui-dialog-titlebar').attr('title', name);
 		if (swf[0].update !== undefined) {
 			c.self ? swf[0].update() : swf[0].update(c);
 		}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/89e74621/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
index a20ea08..e014bd1 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
@@ -21,7 +21,6 @@ package org.apache.openmeetings.web.room.sidebar;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.getWebAppRootKey;
 import static org.apache.openmeetings.web.app.Application.getOnlineClient;
 import static org.apache.openmeetings.web.app.Application.getRoomClients;
-import static org.apache.openmeetings.web.app.WebSession.getUserId;
 import static org.apache.openmeetings.web.room.RoomBroadcaster.sendUpdatedClient;
 import static org.apache.openmeetings.web.util.CallbackFunctionHelper.getNamedFunction;
 import static org.apache.wicket.ajax.attributes.CallbackParameter.explicit;
@@ -35,8 +34,8 @@ import org.apache.openmeetings.db.entity.basic.Client.Pod;
 import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.db.entity.room.Room.Right;
 import org.apache.openmeetings.db.entity.room.Room.RoomElement;
-import org.apache.openmeetings.util.message.RoomMessage;
-import org.apache.openmeetings.util.message.TextRoomMessage;
+import org.apache.openmeetings.db.util.ws.RoomMessage;
+import org.apache.openmeetings.db.util.ws.TextRoomMessage;
 import org.apache.openmeetings.web.app.Application;
 import org.apache.openmeetings.web.app.WebSession;
 import org.apache.openmeetings.web.common.ConfirmableAjaxBorder;
@@ -130,7 +129,7 @@ public class RoomSidebar extends Panel {
 						break;
 					case exclusive:
 						if (room.getClient().hasRight(Right.exclusive)) {
-							WebSocketHelper.sendRoom(new TextRoomMessage(room.getRoom().getId(), getUserId(), RoomMessage.Type.exclusive, uid));
+							WebSocketHelper.sendRoom(new TextRoomMessage(room.getRoom().getId(), cl, RoomMessage.Type.exclusive, uid));
 						}
 						break;
 					case mute:
@@ -144,7 +143,7 @@ public class RoomSidebar extends Panel {
 							// basic checks, will throw in case of missing options
 							obj.getBoolean("mute");
 							obj.put("sid", cl.getSid());
-							WebSocketHelper.sendRoom(new TextRoomMessage(room.getRoom().getId(), getUserId(), RoomMessage.Type.mute, obj.toString()));
+							WebSocketHelper.sendRoom(new TextRoomMessage(room.getRoom().getId(), cl, RoomMessage.Type.mute, obj.toString()));
 						}
 					}
 						break;

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/89e74621/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RoomWebService.java
----------------------------------------------------------------------
diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RoomWebService.java b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RoomWebService.java
index 39180ce..898cfb8 100644
--- a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RoomWebService.java
+++ b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RoomWebService.java
@@ -53,8 +53,8 @@ import org.apache.openmeetings.db.entity.room.Invitation.MessageType;
 import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.db.entity.room.RoomFile;
 import org.apache.openmeetings.db.entity.user.User;
+import org.apache.openmeetings.db.util.ws.RoomMessage;
 import org.apache.openmeetings.service.room.InvitationManager;
-import org.apache.openmeetings.util.message.RoomMessage;
 import org.apache.openmeetings.webservice.error.ServiceException;
 import org.red5.logging.Red5LoggerFactory;
 import org.slf4j.Logger;
@@ -244,7 +244,7 @@ public class RoomWebService extends BaseWebService {
 
 			roomDao.update(room, userId);
 
-			WebSocketHelper.sendRoom(new RoomMessage(room.getId(),  userId,  RoomMessage.Type.roomClosed));
+			WebSocketHelper.sendRoom(new RoomMessage(room.getId(),  getUserDao().get(userId),  RoomMessage.Type.roomClosed));
 
 			return new ServiceResult("Closed", Type.SUCCESS);
 		});