http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-core/src/main/java/org/apache/openmeetings/core/session/store/HashMapStore.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/session/store/HashMapStore.java
 
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/session/store/HashMapStore.java
index 57a0c25..0ab5c10 100644
--- 
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/session/store/HashMapStore.java
+++ 
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/session/store/HashMapStore.java
@@ -28,6 +28,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicLong;
 
 import org.apache.openmeetings.db.entity.room.StreamClient;
 import org.apache.openmeetings.db.entity.server.Server;
@@ -52,34 +53,46 @@ import org.slf4j.Logger;
 public class HashMapStore implements IClientPersistenceStore {
        protected static final Logger log = 
Red5LoggerFactory.getLogger(HashMapStore.class, webAppRootKey);
 
-       private Map<String, StreamClient> clientsByStreamId = new 
ConcurrentHashMap<>();
+       private volatile AtomicLong nextId = new AtomicLong(1);
+       private Map<Long, StreamClient> clientsById = new ConcurrentHashMap<>();
 
        @Override
        public void clear() {
-               clientsByStreamId = new ConcurrentHashMap<>();
+               clientsById = new ConcurrentHashMap<>();
        }
 
        @Override
-       public void put(String streamId, StreamClient rcl) {
-               clientsByStreamId.put(rcl.getStreamid(), rcl);
+       public StreamClient put(StreamClient rcl) {
+               if (rcl.getId() != null) {
+                       log.error("Tried to add Client with not NULL ID {}", 
rcl.getId());
+                       return null;
+               } else {
+                       rcl.setId(nextId.getAndIncrement());
+               }
+               if (clientsById.containsKey(rcl.getId())) {
+                       log.error("Tried to add an existing Client {}", 
rcl.getId());
+                       return null;
+               }
+               clientsById.put(rcl.getId(), rcl);
+               return rcl;
        }
 
        @Override
-       public boolean containsKey(Server server, String streamId) {
-               return clientsByStreamId.containsKey(streamId);
+       public boolean containsKey(Long id) {
+               return id != null && clientsById.containsKey(id);
        }
 
        @Override
-       public StreamClient get(Server server, String streamId) {
-               return clientsByStreamId.get(streamId);
+       public StreamClient get(Long id) {
+               return id == null ? null : clientsById.get(id);
        }
 
        @Override
-       public List<StreamClient> getClientsByPublicSID(Server server, String 
publicSID) {
+       public List<StreamClient> getClientsByUid(Server server, String uid) {
                List<StreamClient> clientList = new ArrayList<>();
-               for (Map.Entry<String, StreamClient> e: 
clientsByStreamId.entrySet()) {
+               for (Map.Entry<Long, StreamClient> e: clientsById.entrySet()) {
                        StreamClient cl = e.getValue();
-                       if (cl.getPublicSID().equals(publicSID)) {
+                       if (cl.getUid().equals(uid)) {
                                clientList.add(cl);
                        }
                }
@@ -87,12 +100,12 @@ public class HashMapStore implements 
IClientPersistenceStore {
        }
 
        @Override
-       public Map<Long,List<StreamClient>> getClientsByPublicSID(String 
publicSID) {
+       public Map<Long,List<StreamClient>> getClientsByUid(String uid) {
                Map<Long,List<StreamClient>> clientMapList = new HashMap<>();
                List<StreamClient> clientList = new ArrayList<>();
-               for (Map.Entry<String, StreamClient> e: 
clientsByStreamId.entrySet()) {
+               for (Map.Entry<Long, StreamClient> e: clientsById.entrySet()) {
                        StreamClient cl = e.getValue();
-                       if (cl.getPublicSID().equals(publicSID)) {
+                       if (cl.getUid().equals(uid)) {
                                clientList.add(cl);
                        }
                }
@@ -102,7 +115,7 @@ public class HashMapStore implements 
IClientPersistenceStore {
 
        @Override
        public Collection<StreamClient> getClients() {
-               return clientsByStreamId.values();
+               return clientsById.values();
        }
 
        @Override
@@ -114,13 +127,13 @@ public class HashMapStore implements 
IClientPersistenceStore {
 
        @Override
        public Collection<StreamClient> getClientsByServer(Server server) {
-               return clientsByStreamId.values();
+               return clientsById.values();
        }
 
        @Override
        public List<StreamClient> getClientsByUserId(Server server, Long 
userId) {
                List<StreamClient> clientList = new ArrayList<>();
-               for (Map.Entry<String, StreamClient> e: 
clientsByStreamId.entrySet()) {
+               for (Map.Entry<Long, StreamClient> e: clientsById.entrySet()) {
                        StreamClient cl = e.getValue();
                        if (cl.getUserId().equals(userId)) {
                                clientList.add(cl);
@@ -132,7 +145,7 @@ public class HashMapStore implements 
IClientPersistenceStore {
        @Override
        public  List<StreamClient> getClientsByRoomId(Long roomId) {
                List<StreamClient> clientList = new ArrayList<>();
-               for (Map.Entry<String, StreamClient> e: 
clientsByStreamId.entrySet()) {
+               for (Map.Entry<Long, StreamClient> e: clientsById.entrySet()) {
                        StreamClient cl = e.getValue();
                        if (cl.getRoomId() != null && 
cl.getRoomId().equals(roomId)) {
                                clientList.add(cl);
@@ -142,27 +155,27 @@ public class HashMapStore implements 
IClientPersistenceStore {
        }
 
        @Override
-       public void remove(Server server, String streamId) {
-               clientsByStreamId.remove(streamId);
+       public void remove(Long id) {
+               clientsById.remove(id);
        }
 
        @Override
        public int size() {
-               return clientsByStreamId.size();
+               return clientsById.size();
        }
 
        @Override
        public int sizeByServer(Server server) {
-               return clientsByStreamId.size();
+               return clientsById.size();
        }
 
        @Override
        public Collection<StreamClient> values() {
-               return clientsByStreamId.values();
+               return clientsById.values();
        }
 
        public int getTotalNumberOfSessions() {
-               return clientsByStreamId.size();
+               return clientsById.size();
        }
 
        /**
@@ -194,7 +207,7 @@ public class HashMapStore implements 
IClientPersistenceStore {
        @Override
        public List<Long> getRoomsIdsByServer(Server server) {
                Set<Long> rooms = new HashSet<>();
-               for (Map.Entry<String, StreamClient> e: 
clientsByStreamId.entrySet()) {
+               for (Map.Entry<Long, StreamClient> e: clientsById.entrySet()) {
                        StreamClient cl = e.getValue();
                        Long roomId = cl.getRoomId();
                        if (roomId != null && roomId.longValue() > 0 && 
!rooms.contains(roomId)) {

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-core/src/main/java/org/apache/openmeetings/core/session/store/IClientPersistenceStore.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/session/store/IClientPersistenceStore.java
 
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/session/store/IClientPersistenceStore.java
index 5ca0634..329c578 100644
--- 
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/session/store/IClientPersistenceStore.java
+++ 
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/session/store/IClientPersistenceStore.java
@@ -30,64 +30,61 @@ public interface IClientPersistenceStore {
        public enum DEBUG_DETAILS {
                SIZE
        }
-       
+
        /**
         * called upon start of the session cache
         */
        void clear();
 
        /**
-        * 
-        * @param streamId
+        *
         * @param rcl
         */
-       void put(String streamId, StreamClient rcl);
-       
+       StreamClient put(StreamClient rcl);
+
        /**
-        * 
-        * @param server
-        * @param streamId
+        *
+        * @param id
         * @return
         */
-       boolean containsKey(Server server, String streamId);
+       boolean containsKey(Long id);
 
        /**
         * by server and publicSID
-        * 
-        * @param server
-        * @param streamId
+        *
+        * @param id
         * @return will return null if the client does not exist in the list
         */
-       StreamClient get(Server server, String streamId);
+       StreamClient get(Long id);
 
        /**
-        * 
+        *
         * @param server
-        * @param publicSID
+        * @param uid
         * @return will return an empty list if nothing available
         */
-       List<StreamClient> getClientsByPublicSID(Server server, String 
publicSID);
+       List<StreamClient> getClientsByUid(Server server, String uid);
 
        /**
         * Searches for the publicSID across all servers
-        * 
-        * @param publicSID
+        *
+        * @param uid
         * @return will return a map with the serverId as key and the 
RoomClients as list in the value
         */
-       Map<Long, List<StreamClient>> getClientsByPublicSID(String publicSID);
+       Map<Long, List<StreamClient>> getClientsByUid(String uid);
 
        Collection<StreamClient> getClients();
-       
+
        /**
         * get all clients by a specific {@link Server}
-        * 
+        *
         * @param server
         * @return will return an empty map if nothing available
         */
        Collection<StreamClient> getClientsByServer(Server server);
 
        /**
-        * 
+        *
         * @param server
         * @param userId
         * @return will return an empty list if nothing available
@@ -95,25 +92,25 @@ public interface IClientPersistenceStore {
        Collection<StreamClient> getClientsByUserId(Server server, Long userId);
 
        /**
-        * 
+        *
         * We ignore the server here, cause ONE room can only be on ONE server 
and often we don't know where.
-        * 
+        *
         * @param roomId
         * @return will return an empty map if nothing available
         */
        List<StreamClient> getClientsByRoomId(Long roomId);
 
-       void remove(Server server, String streamId);
+       void remove(Long id);
 
        int size();
 
        int sizeByServer(Server server);
 
        Collection<StreamClient> values();
-       
+
        /**
         * Get some session statistics
-        * 
+        *
         * @param detailLevel
         * @return
         */
@@ -121,18 +118,18 @@ public interface IClientPersistenceStore {
 
        /**
         * returns a list of roomIds (unique) that are currently active on the 
given server
-        * In case the session is stored in the memory (no-cluster setup) it 
will always 
+        * In case the session is stored in the memory (no-cluster setup) it 
will always
         * return simply all active roomIds
-        * 
+        *
         * @param server
         * @return
         */
        List<Long> getRoomsIdsByServer(Server server);
 
        /**
-        * if database cache + cluster is enabled, the server object will be 
loaded 
+        * if database cache + cluster is enabled, the server object will be 
loaded
         * into the client
-        * 
+        *
         * @return
         */
        Collection<StreamClient> getClientsWithServer();

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/IClientUtil.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/IClientUtil.java
 
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/IClientUtil.java
new file mode 100644
index 0000000..ebc670e
--- /dev/null
+++ 
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/IClientUtil.java
@@ -0,0 +1,55 @@
+/*
+ * 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.core.util;
+
+import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
+
+import org.apache.openmeetings.db.entity.room.StreamClient;
+import org.red5.logging.Red5LoggerFactory;
+import org.red5.server.api.IClient;
+import org.slf4j.Logger;
+
+public class IClientUtil {
+       private static final Logger log = 
Red5LoggerFactory.getLogger(IClientUtil.class, webAppRootKey);
+
+       private enum ConAttrs {
+               omId
+               , sharing
+       }
+
+       public static void init(IClient client, Long id, boolean sharing) {
+               client.setAttribute(ConAttrs.omId.name(), id);
+               client.setAttribute(ConAttrs.sharing.name(), sharing);
+       }
+
+       /**
+        * Id of {@link StreamClient} for this IConnection
+        *
+        * @param conn
+        * @return - Id of {@link StreamClient} for this IConnection, or 
<code>null</code>
+        */
+       public static Long getId(IClient client) {
+               Object o = client.getAttribute(ConAttrs.omId.name());
+               return o instanceof Long ? (Long)o : null;
+       }
+
+       public static boolean isSharing(IClient client) {
+               return 
Boolean.TRUE.equals(client.getAttribute(ConAttrs.sharing.name()));
+       }
+}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/RoomHelper.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/RoomHelper.java
 
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/RoomHelper.java
index e74ce34..734b53a 100644
--- 
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/RoomHelper.java
+++ 
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/RoomHelper.java
@@ -25,17 +25,21 @@ import org.apache.openmeetings.db.entity.room.StreamClient;
 import com.github.openjson.JSONObject;
 
 public class RoomHelper {
+       public static JSONObject videoJson(Client c, boolean self, String sid, 
ISessionManager mgr, Long streamClientId, boolean share) {
+               return videoJson(c, c.getUid(), self, sid, mgr, streamClientId, 
share);
+       }
 
-       public static JSONObject videoJson(Client c, boolean self, String sid, 
ISessionManager mgr, boolean share) {
+       public static JSONObject videoJson(Client c, String uid, boolean self, 
String sid, ISessionManager mgr, Long streamClientId, boolean share) {
                JSONObject json = c.toJson(self).put("sid", sid);
                if (share) {
-                       StreamClient sc = mgr.getClientByPublicSID(c.getUid(), 
null); //TODO check server
+                       StreamClient sc = mgr.get(streamClientId);
 
                        json.put("screenShare", true)
-                               .put("uid", sc.getPublicSID()) // unique 
screen-sharing ID
+                               .put("sid", sid)
+                               .put("uid", sc.getUid())
                                .put("broadcastId", sc.getBroadCastId())
-                               .put("width", sc.getVWidth())
-                               .put("height", sc.getVHeight());
+                               .put("width", sc.getWidth())
+                               .put("height", sc.getHeight());
                }
                return json;
        }

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-db/src/main/java/org/apache/openmeetings/IApplication.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/IApplication.java 
b/openmeetings-db/src/main/java/org/apache/openmeetings/IApplication.java
index 7cd5c29..e0cd5e8 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/IApplication.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/IApplication.java
@@ -24,8 +24,9 @@ import java.util.function.Supplier;
 
 import javax.servlet.ServletContext;
 
-import org.apache.openmeetings.db.entity.room.StreamClient;
+import org.apache.openmeetings.db.entity.basic.Client;
 import org.apache.openmeetings.db.entity.room.Invitation;
+import org.apache.openmeetings.db.entity.room.StreamClient;
 import org.apache.wicket.request.IExceptionMapper;
 import org.apache.wicket.request.IRequestMapper;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
@@ -39,10 +40,11 @@ public interface IApplication {
        String getOmString(long id, long languageId);
        String getOmString(String key, long languageId);
        String getOmString(String key, final Locale loc, String... params);
-       org.apache.openmeetings.db.entity.basic.Client getOmClient(String uid);
+       Client getOmClient(String uid);
+       Client getOmClientBySid(String sid);
        StreamClient updateClient(StreamClient rcl, boolean forceSize);
-       List<org.apache.openmeetings.db.entity.basic.Client> 
getOmRoomClients(Long roomId);
-       List<org.apache.openmeetings.db.entity.basic.Client> getOmClients(Long 
userId);
+       List<Client> getOmRoomClients(Long roomId);
+       List<Client> getOmClients(Long userId);
        String getOmContactsLink();
        String getOmInvitationLink(Invitation i);
        String urlForActivatePage(PageParameters pp);

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/ClientDao.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/ClientDao.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/ClientDao.java
index 99af2cb..8ba572d 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/ClientDao.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/ClientDao.java
@@ -45,7 +45,7 @@ public class ClientDao {
        private static List<Long> EMPTY_LIST = new ArrayList<>(0);
 
        public void cleanAllClients() {
-               em.createNamedQuery("deleteAll").executeUpdate();
+               em.createNamedQuery("deleteClientAll").executeUpdate();
        }
 
        public void cleanClientsByServer(Server server) {
@@ -54,6 +54,13 @@ public class ClientDao {
                        executeUpdate();
        }
 
+       public StreamClient get(Long id) {
+               List<StreamClient> list = em.createNamedQuery("getClientById", 
StreamClient.class)
+                               .setParameter("id", id)
+                               .getResultList();
+               return list == null || list.isEmpty() ? null : list.get(0);
+       }
+
        public StreamClient add(StreamClient entity) {
                em.persist(entity);
                return entity;
@@ -65,15 +72,12 @@ public class ClientDao {
        }
 
        public void delete(StreamClient entity) {
-               Query q = em.createNamedQuery("deletedById");
-               q.setParameter("id", entity.getId());
-               q.executeUpdate();
+               remove(entity.getId());
        }
 
-       public void removeClientByServerAndStreamId(Server server, String 
streamId) {
-               Query q = em.createNamedQuery("deletedByServerAndStreamId");
-               q.setParameter("server", server);
-               q.setParameter("streamid", streamId);
+       public void remove(Long id) {
+               Query q = em.createNamedQuery("deletedClientById");
+               q.setParameter("id", id);
                q.executeUpdate();
        }
 
@@ -87,44 +91,16 @@ public class ClientDao {
                return q.getSingleResult().intValue();
        }
 
-       public long countClientsByServerAndStreamId(Server server, String 
streamId) {
-               TypedQuery<Long> q = 
em.createNamedQuery("countClientsByServerAndStreamId", Long.class);
-               q.setParameter("streamid", streamId);
-               q.setParameter("server", server);
-               return q.getSingleResult();
-       }
-
-       /**
-        * Query.getSingleResult would throw an error if result is null,
-        * see: 
http://stackoverflow.com/questions/2002993/jpa-getsingleresult-or-null
-        *
-        * @param server
-        * @param streamId
-        * @return
-        */
-       public StreamClient getClientByServerAndStreamId(Server server, String 
streamId) {
-               TypedQuery<StreamClient> q = 
em.createNamedQuery("getClientByServerAndStreamId", StreamClient.class);
-               q.setParameter("streamid", streamId);
-               q.setParameter("server", server);
-               List<StreamClient> ll = q.getResultList();
-               if (ll.size() == 1) {
-                       return ll.get(0);
-               } else if (ll.size() == 0) {
-                       return null;
-               }
-               throw new RuntimeException("more then one client was found 
streamId "+ streamId + " server "+server);
-       }
-
-       public List<StreamClient> getClientsByPublicSIDAndServer(Server server, 
String publicSID) {
-               TypedQuery<StreamClient> q = 
em.createNamedQuery("getClientsByPublicSIDAndServer", StreamClient.class);
+       public List<StreamClient> getClientsByUidAndServer(Server server, 
String uid) {
+               TypedQuery<StreamClient> q = 
em.createNamedQuery("getClientsByUidAndServer", StreamClient.class);
                q.setParameter("server", server);
-               q.setParameter("publicSID", publicSID);
+               q.setParameter("uid", uid);
                return q.getResultList();
        }
 
-       public List<StreamClient> getClientsByPublicSID(String publicSID) {
-               TypedQuery<StreamClient> q = 
em.createNamedQuery("getClientsByPublicSID", StreamClient.class);
-               q.setParameter("publicSID", publicSID);
+       public List<StreamClient> getClientsByUid(String uid) {
+               TypedQuery<StreamClient> q = 
em.createNamedQuery("getClientsByUid", StreamClient.class);
+               q.setParameter("uid", uid);
                return q.getResultList();
        }
 

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/ISessionManager.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/ISessionManager.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/ISessionManager.java
index 3ebd6fb..ce9efb1 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/ISessionManager.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/ISessionManager.java
@@ -43,18 +43,6 @@ public interface ISessionManager {
        void sessionStart();
 
        StreamClient add(StreamClient c, Server server);
-       /**
-        * add a new client item
-        *
-        * @param streamId
-        * @param scopeName
-        * @param remotePort
-        * @param remoteAddress
-        * @param swfUrl
-        * @param server
-        * @return
-        */
-       StreamClient addClientListItem(String streamId, String scopeName, int 
remotePort, String remoteAddress, String swfUrl, Server server);
 
        Collection<StreamClient> getClients();
 
@@ -66,22 +54,21 @@ public interface ISessionManager {
        Collection<StreamClient> getClientsWithServer();
 
        /**
-        * Get a client by its streamId
+        * Get a client by its id
         *
-        * @param streamId
-        * @param server
+        * @param id
         * @return
         */
-       StreamClient getClientByStreamId(String streamId, Server server);
+       StreamClient get(Long id);
 
        /**
         * get a client by its publicSID and the server,
         *
-        * @param publicSID
+        * @param uid
         * @param server
         * @return
         */
-       StreamClient getClientByPublicSID(String publicSID, Server server);
+       StreamClient getClientByUid(String uid, Server server);
 
        /**
         * same as {@link #getClientByPublicSID(String, boolean, Server)} but 
it ignores
@@ -91,32 +78,20 @@ public interface ISessionManager {
         * This method requires more time to find the user, so under normal 
circumstances
         * you should use {@link #getClientByPublicSID(String, boolean, 
Server)}!
         *
-        * @param publicSID
+        * @param uid
         * @return
         */
-       ClientSessionInfo getClientByPublicSIDAnyServer(String publicSID);
-
-       /**
-        *
-        * @param userId
-        * @return
-        *
-        * @deprecated There could be multiple users logged in with the same 
userid,
-        *             then this call would return a list not a single user
-        */
-       @Deprecated
-       StreamClient getClientByUserId(Long userId);
+       ClientSessionInfo getClientByUidAnyServer(String uid);
 
        /**
         * Update the session object of the audio/video-connection and 
additionally
         * swap the values to the session object of the user that holds the full
         * session object
         *
-        * @param streamId
-        * @param rcm
+        * @param id
         * @return
         */
-       boolean updateAVClientByStreamId(String streamId, StreamClient rcm, 
Server server);
+       boolean updateAVClient(StreamClient rcm);
 
        /**
         * Update the session object
@@ -125,21 +100,21 @@ public interface ISessionManager {
         * ScopeApplicationAdapter#setRoomValues(Long, Boolean, Boolean, String)
         * .
         *
-        * @param streamId
         * @param rcm
         * @param updateRoomCount
         *            true means the count for the room has to be updated
+        * @param server
         * @return
         */
-       boolean updateClientByStreamId(String streamId, StreamClient rcm, 
boolean updateRoomCount, Server server);
+       boolean update(StreamClient rcm);
 
        /**
         * Remove a client from the session store
         *
-        * @param streamId
+        * @param id
         * @return
         */
-       boolean removeClient(String streamId, Server server);
+       boolean remove(Long id);
 
        /**
         * Get all ClientList Objects of that room and domain This Function is
@@ -154,14 +129,6 @@ public interface ISessionManager {
        Collection<StreamClient> getClientListByRoomAll(Long roomId);
 
        /**
-        * get the current Moderator in this room
-        *
-        * @param roomname
-        * @return
-        */
-       List<StreamClient> getCurrentModeratorByRoom(Long roomId);
-
-       /**
         * Get list of current client sessions
         *
         * @param start

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/IUserManager.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/IUserManager.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/IUserManager.java
index 9a6e641..a9f76e8 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/IUserManager.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/IUserManager.java
@@ -52,10 +52,9 @@ public interface IUserManager {
        Long getLanguage(Locale loc);
        User loginOAuth(Map<String, String> params, long serverId) throws 
IOException, NoSuchAlgorithmException;
 
-       /** TODO FIXME seems to be unused **/
-       boolean kickUserByStreamId(String SID, Long roomId);
+       boolean kickUsersByRoomId(Long roomId);
 
-       boolean kickUserByPublicSID(String SID, String publicSID);
+       boolean kickById(Long id);
 
        List<Userdata> getUserdataDashBoard(Long userId);
 }

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/IUserService.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/IUserService.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/IUserService.java
deleted file mode 100644
index 677a56d..0000000
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/IUserService.java
+++ /dev/null
@@ -1,26 +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.db.dao.user;
-
-//FIXME HACK to bypass cross project compilation
-public interface IUserService {
-       boolean kickUserByStreamId(String sid, String streamid, long serverId);
-
-       boolean kickUserBySessionId(String sid, long userId, String sessionId);
-}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/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 ca93a2a..f9e966f 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
@@ -18,9 +18,11 @@
  */
 package org.apache.openmeetings.db.entity.basic;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Date;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 import java.util.UUID;
 
@@ -55,6 +57,66 @@ public class Client implements IClient {
        public enum Pod {
                none, left, right;
        }
+       public static class Stream {
+               private Long streamClientId = null;
+               private String broadcastId = null;
+               private boolean sharing;
+
+               public Stream(Long streamClientId, String broadcastId, boolean 
sharing) {
+                       this.streamClientId = streamClientId;
+                       this.broadcastId = broadcastId;
+                       this.sharing= sharing;
+               }
+
+               public Long getStreamClientId() {
+                       return streamClientId;
+               }
+
+               public void setStreamClientId(Long streamClientId) {
+                       this.streamClientId = streamClientId;
+               }
+
+               public String getBroadcastId() {
+                       return broadcastId;
+               }
+
+               public void setBroadcastId(String broadcastId) {
+                       this.broadcastId = broadcastId;
+               }
+
+               public boolean isSharing() {
+                       return sharing;
+               }
+
+               public void setSharing(boolean sharing) {
+                       this.sharing = sharing;
+               }
+
+               @Override
+               public int hashCode() {
+                       final int prime = 31;
+                       int result = 1;
+                       result = prime * result + ((broadcastId == null) ? 0 : 
broadcastId.hashCode());
+                       return result;
+               }
+
+               @Override
+               public boolean equals(Object obj) {
+                       if (this == obj)
+                               return true;
+                       if (obj == null)
+                               return false;
+                       if (getClass() != obj.getClass())
+                               return false;
+                       Stream other = (Stream) obj;
+                       if (broadcastId == null) {
+                               if (other.broadcastId != null)
+                                       return false;
+                       } else if (!broadcastId.equals(other.broadcastId))
+                               return false;
+                       return true;
+               }
+       }
        private final String sessionId;
        private int pageId;
        private User user;
@@ -64,13 +126,13 @@ public class Client implements IClient {
        private String remoteAddress;
        private final Set<Right> rights = new HashSet<>();
        private final Set<Activity> activities = new HashSet<>();
+       private final Set<Stream> streams = new HashSet<>();
        private final Date connectedSince;
        private Pod pod;
        private int cam = -1;
        private int mic = -1;
        private int width = 0;
        private int height = 0;
-       private String broadcastId = null;
 
        public Client(String sessionId, int pageId, Long userId, UserDao dao) {
                this.sessionId = sessionId;
@@ -86,8 +148,8 @@ public class Client implements IClient {
                this.pageId = 0;
                this.user = dao.get(rcl.getUserId());
                this.connectedSince = new Date();
-               uid = rcl.getPublicSID();
-               sid = UUID.randomUUID().toString();
+               uid = rcl.getUid();
+               sid = rcl.getOwnerSid();
                this.roomId = rcl.getRoomId();
                this.remoteAddress = rcl.getUserip();
        }
@@ -129,8 +191,10 @@ public class Client implements IClient {
                return sid;
        }
 
-       public void clearRights() {
+       public void clear() {
+               activities.clear();
                rights.clear();
+               streams.clear();
        }
 
        public boolean hasRight(Right right) {
@@ -213,10 +277,26 @@ public class Client implements IClient {
                                activities.remove(Activity.broadcastA);
                                activities.remove(Activity.broadcastV);
                                break;
+                       case share:
+                               for (Stream s : streams) {
+                                       if (s.isSharing()) {
+                                               streams.remove(s);
+                                               break;
+                                       }
+                               }
+                               break;
                        default:
                }
        }
 
+       public void addStream(Long streamClientId, String broadcastId, boolean 
sharing) {
+               streams.add(new Stream(streamClientId, broadcastId, sharing));
+       }
+
+       public List<Stream> getStreams() {
+               return new ArrayList<>(streams);
+       }
+
        public Date getConnectedSince() {
                return connectedSince;
        }
@@ -304,15 +384,6 @@ public class Client implements IClient {
                return this;
        }
 
-       public String getBroadcastId() {
-               return broadcastId;
-       }
-
-       public Client setBroadcastId(String broadcastId) {
-               this.broadcastId = broadcastId;
-               return this;
-       }
-
        @Override
        public int hashCode() {
                final int prime = 31;
@@ -363,7 +434,6 @@ public class Client implements IClient {
                                .put("rights", new JSONArray(rights))
                                .put("activities", new JSONArray(activities))
                                .put("pod", pod)
-                               .put("broadcastId", broadcastId)
                                .put("width", width)
                                .put("height", height)
                                .put("self", self);

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/log/ConferenceLog.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/log/ConferenceLog.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/log/ConferenceLog.java
index 06612c9..1557d61 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/log/ConferenceLog.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/log/ConferenceLog.java
@@ -116,7 +116,7 @@ public class ConferenceLog implements IDataProviderEntity {
                this.userId = userId;
        }
 
-       public String getStreamid() {
+       public String getStreamId() {
                return streamid;
        }
        public void setStreamid(String streamid) {

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/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 aba737a..dbdef46 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
@@ -31,13 +31,15 @@ import javax.persistence.ManyToOne;
 import javax.persistence.NamedQueries;
 import javax.persistence.NamedQuery;
 import javax.persistence.Table;
+import javax.persistence.Transient;
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlRootElement;
 
+import org.apache.openmeetings.db.entity.basic.Client;
 import org.apache.openmeetings.db.entity.basic.IClient;
 import org.apache.openmeetings.db.entity.server.Server;
-import org.apache.openmeetings.util.CalendarPatterns;
+import org.apache.wicket.util.string.StringValue;
 
 /**
  * Can be configured to be stored in memory or in database
@@ -46,22 +48,20 @@ import org.apache.openmeetings.util.CalendarPatterns;
  */
 @Entity
 @NamedQueries({
-       @NamedQuery(name = "deleteAll", query = "DELETE FROM StreamClient"),
-       @NamedQuery(name = "deletedById", query = "DELETE FROM StreamClient c 
WHERE c.id = :id"),
+       @NamedQuery(name = "deleteClientAll", query = "DELETE FROM 
StreamClient"),
+       @NamedQuery(name = "deleteClientById", query = "DELETE FROM 
StreamClient c WHERE c.id = :id"),
+       @NamedQuery(name = "getClientById", query = "SELECT c FROM StreamClient 
c WHERE c.id = :id"),
        @NamedQuery(name = "deleteClientsByServer", query = "DELETE FROM 
StreamClient c WHERE c.server = :server"),
-       @NamedQuery(name = "deletedByServerAndStreamId", query = "DELETE FROM 
StreamClient c WHERE c.server = :server AND c.streamid LIKE :streamid"),
-       @NamedQuery(name = "countClients", query = "SELECT count(c.id) FROM 
StreamClient c"),
-       @NamedQuery(name = "countClientsByServer", query = "SELECT count(c.id) 
FROM StreamClient c WHERE c.server = :server"),
-       @NamedQuery(name = "countClientsByServerAndStreamId", query = "SELECT 
count(c.id) FROM StreamClient c WHERE c.streamid LIKE :streamid AND c.server = 
:server"),
-       @NamedQuery(name = "getClientByServerAndStreamId", query = "SELECT c 
FROM StreamClient c WHERE c.streamid LIKE :streamid AND c.server = :server"),
-       @NamedQuery(name = "getClientsByPublicSIDAndServer", query = "SELECT c 
FROM StreamClient c WHERE c.publicSID LIKE :publicSID AND c.server = :server"),
-       @NamedQuery(name = "getClientsByPublicSID", query = "SELECT c FROM 
StreamClient c WHERE c.publicSID LIKE :publicSID"),
+       @NamedQuery(name = "countClients", query = "SELECT count(c) FROM 
StreamClient c"),
+       @NamedQuery(name = "countClientsByServer", query = "SELECT count(c) 
FROM StreamClient c WHERE c.server = :server"),
+       @NamedQuery(name = "getClientsByUidAndServer", query = "SELECT c FROM 
StreamClient c WHERE c.uid = :uid AND c.server = :server"),
+       @NamedQuery(name = "getClientsByUid", query = "SELECT c FROM 
StreamClient c WHERE c.uid = :uid"),
        @NamedQuery(name = "getClientsByServer", query = "SELECT c FROM 
StreamClient c WHERE c.server = :server"),
        @NamedQuery(name = "getClients", query = "SELECT c FROM StreamClient 
c"),
        @NamedQuery(name = "getClientsWithServer", query = "SELECT c FROM 
StreamClient c LEFT JOIN FETCH c.server"),
        @NamedQuery(name = "getClientsByUserId", query = "SELECT c FROM 
StreamClient c WHERE c.server = :server AND c.userId = :userId"),
-       @NamedQuery(name = "getClientsByRoomId", query = "SELECT c FROM 
StreamClient c WHERE c.roomId = :roomId"),
-       @NamedQuery(name = "getRoomsIdsByServer", query = "SELECT c.roomId FROM 
StreamClient c WHERE c.server = :server GROUP BY c.roomId")
+       @NamedQuery(name = "getClientsByRoomId", query = "SELECT c FROM 
StreamClient c WHERE c.scope = :roomId"),
+       @NamedQuery(name = "getRoomsIdsByServer", query = "SELECT c.roomId FROM 
StreamClient c WHERE c.server = :server GROUP BY c.scope")
 })
 @Table(name = "client")
 @XmlRootElement
@@ -75,88 +75,47 @@ public class StreamClient implements IClient {
        private Long id;
 
        /**
-        * @see StreamClient#getUsername()
-        */
-       @Column(name = "username")
-       private String username = "";
-
-       /**
-        * @see StreamClient#getStreamid()
-        */
-       @Column(name = "streamid")
-       private String streamid = "";
-
-       /**
-        * @see StreamClient#getScope()
+        * Red5 scope, can be roomId or 'hibernate'
         */
        @Column(name = "scope")
        private String scope = "";
 
        /**
-        * @see StreamClient#getVWidth()
-        */
-       @Column(name = "vwidth")
-       private int vWidth = 0;
-
-       /**
-        * @see StreamClient#getVHeight()
+        * The width of the video
         */
-       @Column(name = "vheight")
-       private int vHeight = 0;
+       @Column(name = "width")
+       private int width = 0;
 
        /**
-        * @see StreamClient#getVX()
+        * The height of the video
         */
-       @Column(name = "vx")
-       private int vX = 0;
+       @Column(name = "height")
+       private int height = 0;
 
        /**
-        * @see StreamClient#getVY()
+        * {@link Client#getUid()} of the client this stream is originated from
+        *
         */
-       @Column(name = "vy")
-       private int vY = 0;
+       @Column(name = "uid")
+       private String uid = null;
 
        /**
-        * @see StreamClient#getStreamPublishName()
+        * {@link Client#getSid()} of the client who initiated the connection
         */
-       @Column(name = "stream_publish_name")
-       private String streamPublishName = "";
+       @Column(name = "owner_sid")
+       private String ownerSid = null;
 
        /**
-        * @see StreamClient#getPublicSID()
-        */
-       @Column(name = "public_sid")
-       private String publicSID = "";
-
-       /**
-        * @see StreamClient#getIsMod()
+        * Is this user moderator
         */
        @Column(name = "is_mod", nullable = false)
-       private boolean isMod = false;
-
-       /**
-        * @see StreamClient#getIsSuperModerator()
-        */
-       @Column(name = "is_supermoderator", nullable = false)
-       private boolean isSuperModerator = false;
-
-       /**
-        * @see StreamClient#getCanDraw()
-        */
-       @Column(name = "can_draw", nullable = false)
-       private boolean canDraw = false;
-
-       /**
-        * @see StreamClient#getCanShare()
-        */
-       @Column(name = "can_share", nullable = false)
-       private boolean canShare = false;
+       private boolean mod = false;
 
        /**
-        * @see StreamClient#getCanRemote()
+        * Is this user "super moderator"
         */
-       @Column(name = "can_remote", nullable = false)
-       private boolean canRemote = false;
+       @Column(name = "super_mod", nullable = false)
+       private boolean superMod = false;
 
        /**
         * @see StreamClient#getCanGiveAudio()
@@ -174,30 +133,6 @@ public class StreamClient implements IClient {
        private Date connectedSince;
 
        /**
-        * @see StreamClient#getFormatedDate()
-        */
-       @Column(name = "formated_date")
-       private String formatedDate;
-
-       /**
-        * @see StreamClient#isScreenClient()
-        */
-       @Column(name = "is_screenclient", nullable = false)
-       private boolean screenClient;
-
-       /**
-        * @see StreamClient#getUsercolor()
-        */
-       @Column(name = "usercolor")
-       private String usercolor;
-
-       /**
-        * @see StreamClient#getUserpos()
-        */
-       @Column(name = "userpos")
-       private Integer userpos;
-
-       /**
         * @see StreamClient#getUserip()
         */
        @Column(name = "userip")
@@ -210,12 +145,6 @@ public class StreamClient implements IClient {
        private int userport;
 
        /**
-        * @see StreamClient#getRoomId()
-        */
-       @Column(name = "room_id")
-       private Long roomId;
-
-       /**
         * @see StreamClient#getRoomEnter()
         */
        @Column(name = "room_enter")
@@ -225,66 +154,35 @@ public class StreamClient implements IClient {
         * @see StreamClient#getBroadCastID()
         */
        @Column(name = "broadcast_id")
-       private String broadCastId = "-2";
+       private String broadCastId = null;
+
+       @Column(name = "username")
+       private String username = "";
 
-       /**
-        * @see StreamClient#getUserId()
-        */
        @Column(name = "user_id")
        private Long userId = null;
 
-       /**
-        * @see StreamClient#getFirstname()
-        */
        @Column(name = "firstname")
        private String firstname = "";
 
-       /**
-        * @see StreamClient#getLastname()
-        */
        @Column(name = "lastname")
        private String lastname = "";
 
-       /**
-        * @see StreamClient#getMail()
-        */
        @Column(name = "email")
        private String email;
 
-       /**
-        * @see StreamClient#getLastLogin()
-        */
        @Column(name = "last_login")
        private String lastLogin;
 
-       /**
-        * @see StreamClient#getSecurityCode()
-        */
-       @Column(name = "security_code")
-       private String securityCode;
-
-       /**
-        * @see StreamClient#getPicture_uri()
-        */
        @Column(name = "picture_uri")
        private String picture_uri;
 
-       /**
-        * @see StreamClient#getLanguage()
-        */
        @Column(name = "language")
        private String language = "";
 
-       /**
-        * @see StreamClient#getAvsettings()
-        */
        @Column(name = "avsettings")
        private String avsettings = "";
 
-       /**
-        * @see StreamClient#getSwfurl()
-        */
-       // FIXME: Move to {@link ClientSession}
        @Column(name = "swfurl", length=2048)
        private String swfurl;
 
@@ -295,68 +193,38 @@ public class StreamClient implements IClient {
        private boolean nativeSsl = false;
 
        /**
-        * @see StreamClient#getIsRecording()
-        */
-       @Column(name = "is_recording", nullable = false)
-       private boolean isRecording = false;
-
-       /**
-        * @see StreamClient#getRoomRecordingName()
+        * Is this client connect via mobile application
         */
-       @Column(name = "room_recording_name")
-       private String roomRecordingName;
+       @Column(name = "mobile", nullable = false)
+       private boolean mobile = false;
 
        /**
-        * @see StreamClient#getRecordingId()
+        * Is this client performs screen sharing
         */
-       @Column(name = "recording_id")
-       private Long recordingId;
+       @Column(name = "sharing", nullable = false)
+       private boolean sharing = false;
 
-       /**
-        * @see StreamClient#getRecordingMetaDataId()
-        */
-       @Column(name = "recording_metadata_id")
-       private Long recordingMetaDataId;
+       @Column(name = "recording_started", nullable = false)
+       private boolean recordingStarted = false;
 
-       /**
-        * @see StreamClient#isStartRecording()
-        */
-       @Column(name = "start_recording", nullable = false)
-       private boolean startRecording = false;
+       @Column(name = "sharing_started", nullable = false)
+       private boolean sharingStarted = false;
 
-       /**
-        * @see StreamClient#isStartStreaming()
-        */
-       @Column(name = "start_streaming", nullable = false)
-       private boolean startStreaming = false;
+       @Column(name = "publish_started", nullable = false)
+       private boolean publishStarted = false;
 
-       /**
-        * @see StreamClient#isScreenPublishStarted()
-        */
-       @Column(name = "screen_publish_started", nullable = false)
-       private boolean screenPublishStarted = false;
+       @Column(name = "broadcasting", nullable = false)
+       private boolean broadcasting = false;
 
-       /**
-        * @see StreamClient#isStreamPublishStarted()
-        */
-       @Column(name = "stream_publish_started", nullable = false)
-       private boolean streamPublishStarted = false;
+       @Column(name = "recording_id")
+       private Long recordingId;
 
-       /**
-        * @see StreamClient#getIsBroadcasting()
-        */
-       @Column(name = "is_broadcasting", nullable = false)
-       private boolean isBroadcasting = false;
+       @Column(name = "meta_id")
+       private Long metaId;
 
-       /**
-        * @see StreamClient#getExternalUserId()
-        */
        @Column(name = "external_user_id")
        private String externalUserId;
 
-       /**
-        * @see StreamClient#getExternalUserType()
-        */
        @Column(name = "external_user_type")
        private String externalUserType;
 
@@ -373,12 +241,6 @@ public class StreamClient implements IClient {
        private boolean allowRecording = true;
 
        /**
-        * @see StreamClient#getZombieCheckFlag()
-        */
-       @Column(name = "zombie_check_flag", nullable = false)
-       private boolean zombieCheckFlag = false;
-
-       /**
         * @see StreamClient#getMicMuted()
         */
        @Column(name = "mic_muted", nullable = false)
@@ -390,42 +252,14 @@ public class StreamClient implements IClient {
        @Column(name = "sip_transport", nullable = false)
        private boolean sipTransport = false;
 
-       @Column(name = "mobile", nullable = false)
-       private boolean mobile = false;
-
        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "server_id")
        private Server server;
 
-       public StreamClient() {}
-
-       public StreamClient(String streamid, String publicSID, Long roomId,
-                       Long userId, String firstname, String lastname,
-                       String username, String connectedSince, String scope) {
-               super();
-               this.streamid = streamid;
-               this.publicSID = publicSID;
-               this.roomId = roomId;
-               this.userId = userId;
-               this.firstname = firstname;
-               this.lastname = lastname;
-               this.username = username;
-               this.connectedSince = 
CalendarPatterns.parseDateWithHour(connectedSince);
-               this.scope = scope;
-       }
-
-       public void setUserObject(Long userId, String username, String 
firstname, String lastname) {
-               this.userId = userId;
-               this.username = username;
-               this.firstname = firstname;
-               this.lastname = lastname;
-       }
+       @Transient
+       private Long roomId;
 
-       public void setUserObject(String username, String firstname, String 
lastname) {
-               this.username = username;
-               this.firstname = firstname;
-               this.lastname = lastname;
-       }
+       public StreamClient() {}
 
        @Override
        public Long getId() {
@@ -437,164 +271,105 @@ public class StreamClient implements IClient {
                this.id = id;
        }
 
-       public Date getConnectedSince() {
-               return connectedSince;
-       }
-
-       public void setConnectedSince(Date connectedSince) {
-               this.connectedSince = connectedSince;
-       }
-
-       public boolean getIsMod() {
-               return isMod;
-       }
-
-       public void setIsMod(boolean isMod) {
-               this.isMod = isMod;
-       }
-
-       public String getUsername() {
-               return username;
-       }
-
-       public void setUsername(String username) {
-               this.username = username;
-       }
-
-       public String getStreamid() {
-               return streamid;
-       }
-
-       public void setStreamid(String streamid) {
-               this.streamid = streamid;
-       }
-
        public String getScope() {
                return scope;
        }
 
        public void setScope(String scope) {
                this.scope = scope;
+               StringValue scn = StringValue.valueOf(scope);
+               long roomId = scn.toLong(Long.MIN_VALUE);
+               if (roomId > 0) {
+                       this.roomId = roomId;
+               }
        }
 
-       public String getFormatedDate() {
-               return formatedDate;
-       }
-
-       public void setFormatedDate(String formatedDate) {
-               this.formatedDate = formatedDate;
+       public int getWidth() {
+               return width;
        }
 
-       public String getUsercolor() {
-               return usercolor;
+       public void setWidth(int width) {
+               this.width = width;
        }
 
-       public void setUsercolor(String usercolor) {
-               this.usercolor = usercolor;
+       public int getHeight() {
+               return height;
        }
 
-       public Integer getUserpos() {
-               return userpos;
+       public void setHeight(int height) {
+               this.height = height;
        }
 
-       public void setUserpos(Integer userpos) {
-               this.userpos = userpos;
+       public String getUid() {
+               return uid;
        }
 
-       public String getUserip() {
-               return userip;
+       public void setUid(String uid) {
+               this.uid = uid;
        }
 
-       public void setUserip(String userip) {
-               this.userip = userip;
+       public String getOwnerSid() {
+               return ownerSid;
        }
 
-       public String getSwfurl() {
-               return swfurl;
+       public void setOwnerSid(String ownerSid) {
+               this.ownerSid = ownerSid;
        }
 
-       public void setSwfurl(String swfurl) {
-               this.swfurl = swfurl;
+       public boolean isMod() {
+               return mod;
        }
 
-       public int getUserport() {
-               return userport;
+       public void setMod(boolean mod) {
+               this.mod = mod;
        }
 
-       public void setUserport(int userport) {
-               this.userport = userport;
+       public boolean isSuperMod() {
+               return superMod;
        }
 
-       public String getFirstname() {
-               return firstname;
-       }
-
-       public void setFirstname(String firstname) {
-               this.firstname = firstname;
-       }
-
-       public String getLanguage() {
-               return language;
-       }
-
-       public void setLanguage(String language) {
-               this.language = language;
-       }
-
-       public String getLastLogin() {
-               return lastLogin;
-       }
-
-       public void setLastLogin(String lastLogin) {
-               this.lastLogin = lastLogin;
+       public void setSuperMod(boolean superMod) {
+               this.superMod = superMod;
        }
 
-       public String getLastname() {
-               return lastname;
-       }
-
-       public void setLastname(String lastname) {
-               this.lastname = lastname;
-       }
-
-       public String getEmail() {
-               return email;
+       public boolean isCanGiveAudio() {
+               return canGiveAudio;
        }
 
-       public void setEmail(String email) {
-               this.email = email;
+       public void setCanGiveAudio(boolean canGiveAudio) {
+               this.canGiveAudio = canGiveAudio;
        }
 
-       public String getSecurityCode() {
-               return securityCode;
+       public boolean isCanVideo() {
+               return canVideo;
        }
 
-       public void setSecurityCode(String securityCode) {
-               this.securityCode = securityCode;
+       public void setCanVideo(boolean canVideo) {
+               this.canVideo = canVideo;
        }
 
-       public String getPicture_uri() {
-               return picture_uri;
+       public Date getConnectedSince() {
+               return connectedSince;
        }
 
-       public void setPicture_uri(String picture_uri) {
-               this.picture_uri = picture_uri;
+       public void setConnectedSince(Date connectedSince) {
+               this.connectedSince = connectedSince;
        }
 
-       public Long getUserId() {
-               return userId;
+       public String getUserip() {
+               return userip;
        }
 
-       public void setUserId(Long userId) {
-               this.userId = userId;
+       public void setUserip(String userip) {
+               this.userip = userip;
        }
 
-       public Long getRoomId() {
-               return roomId;
+       public int getUserport() {
+               return userport;
        }
 
-       public void setRoomId(Long roomId) {
-               this.roomId = roomId;
+       public void setUserport(int userport) {
+               this.userport = userport;
        }
 
        public Date getRoomEnter() {
@@ -605,156 +380,156 @@ public class StreamClient implements IClient {
                this.roomEnter = roomEnter;
        }
 
-       public boolean getIsRecording() {
-               return isRecording;
+       public String getBroadCastId() {
+               return broadCastId;
        }
 
-       public void setIsRecording(boolean isRecording) {
-               this.isRecording = isRecording;
+       public void setBroadCastId(String broadCastId) {
+               this.broadCastId = broadCastId;
        }
 
-       public String getRoomRecordingName() {
-               return roomRecordingName;
+       public String getUsername() {
+               return username;
        }
 
-       public void setRoomRecordingName(String roomRecordingName) {
-               this.roomRecordingName = roomRecordingName;
+       public void setUsername(String username) {
+               this.username = username;
        }
 
-       public String getAvsettings() {
-               return avsettings;
+       public Long getUserId() {
+               return userId;
        }
 
-       public void setAvsettings(String avsettings) {
-               this.avsettings = avsettings;
+       public void setUserId(Long userId) {
+               this.userId = userId;
        }
 
-       public String getBroadCastId() {
-               return broadCastId;
+       public String getFirstname() {
+               return firstname;
        }
 
-       public void setBroadCastId(String broadCastId) {
-               this.broadCastId = broadCastId;
+       public void setFirstname(String firstname) {
+               this.firstname = firstname;
        }
 
-       public String getPublicSID() {
-               return publicSID;
+       public String getLastname() {
+               return lastname;
        }
 
-       public void setPublicSID(String publicSID) {
-               this.publicSID = publicSID;
+       public void setLastname(String lastname) {
+               this.lastname = lastname;
        }
 
-       public boolean getZombieCheckFlag() {
-               return zombieCheckFlag;
+       public String getEmail() {
+               return email;
        }
 
-       public void setZombieCheckFlag(boolean zombieCheckFlag) {
-               this.zombieCheckFlag = zombieCheckFlag;
+       public void setEmail(String email) {
+               this.email = email;
        }
 
-       public boolean getMicMuted() {
-               return micMuted;
+       public String getLastLogin() {
+               return lastLogin;
        }
 
-       public void setMicMuted(boolean micMuted) {
-               this.micMuted = micMuted;
+       public void setLastLogin(String lastLogin) {
+               this.lastLogin = lastLogin;
        }
 
-       public boolean getCanDraw() {
-               return canDraw;
+       public String getPicture_uri() {
+               return picture_uri;
        }
 
-       public void setCanDraw(boolean canDraw) {
-               this.canDraw = canDraw;
+       public void setPicture_uri(String picture_uri) {
+               this.picture_uri = picture_uri;
        }
 
-       public boolean getIsBroadcasting() {
-               return isBroadcasting;
+       public String getLanguage() {
+               return language;
        }
 
-       public void setIsBroadcasting(boolean isBroadcasting) {
-               this.isBroadcasting = isBroadcasting;
+       public void setLanguage(String language) {
+               this.language = language;
        }
 
-       public boolean getCanShare() {
-               return canShare;
+       public String getAvsettings() {
+               return avsettings;
        }
 
-       public void setCanShare(boolean canShare) {
-               this.canShare = canShare;
+       public void setAvsettings(String avsettings) {
+               this.avsettings = avsettings;
        }
 
-       public String getExternalUserId() {
-               return externalUserId;
+       public String getSwfurl() {
+               return swfurl;
        }
 
-       public void setExternalUserId(String externalUserId) {
-               this.externalUserId = externalUserId;
+       public void setSwfurl(String swfurl) {
+               this.swfurl = swfurl;
        }
 
-       public String getExternalUserType() {
-               return externalUserType;
+       public String getTcUrl() {
+               return tcUrl;
        }
 
-       public void setExternalUserType(String externalUserType) {
-               this.externalUserType = externalUserType;
+       public void setTcUrl(String tcUrl) {
+               this.tcUrl = tcUrl;
        }
 
-       public boolean getIsSuperModerator() {
-               return isSuperModerator;
+       public boolean isNativeSsl() {
+               return nativeSsl;
        }
 
-       public void setIsSuperModerator(boolean isSuperModerator) {
-               this.isSuperModerator = isSuperModerator;
+       public void setNativeSsl(boolean nativeSsl) {
+               this.nativeSsl = nativeSsl;
        }
 
-       public boolean isScreenClient() {
-               return screenClient;
+       public boolean isMobile() {
+               return mobile;
        }
 
-       public void setScreenClient(boolean screenClient) {
-               this.screenClient = screenClient;
+       public void setMobile(boolean mobile) {
+               this.mobile = mobile;
        }
 
-       public int getVWidth() {
-               return vWidth;
+       public boolean isSharing() {
+               return sharing;
        }
 
-       public void setVWidth(int width) {
-               vWidth = width;
+       public void setSharing(boolean sharing) {
+               this.sharing = sharing;
        }
 
-       public int getVHeight() {
-               return vHeight;
+       public boolean isRecordingStarted() {
+               return recordingStarted;
        }
 
-       public void setVHeight(int height) {
-               vHeight = height;
+       public void setRecordingStarted(boolean recordingStarted) {
+               this.recordingStarted = recordingStarted;
        }
 
-       public int getVX() {
-               return vX;
+       public boolean isSharingStarted() {
+               return sharingStarted;
        }
 
-       public void setVX(int vx) {
-               vX = vx;
+       public void setSharingStarted(boolean sharingStarted) {
+               this.sharingStarted = sharingStarted;
        }
 
-       public int getVY() {
-               return vY;
+       public boolean isPublishStarted() {
+               return publishStarted;
        }
 
-       public void setVY(int vy) {
-               vY = vy;
+       public void setPublishStarted(boolean publishStarted) {
+               this.publishStarted = publishStarted;
        }
 
-       public String getStreamPublishName() {
-               return streamPublishName;
+       public boolean isBroadcasting() {
+               return broadcasting;
        }
 
-       public void setStreamPublishName(String streamPublishName) {
-               this.streamPublishName = streamPublishName;
+       public void setBroadcasting(boolean isBroadcasting) {
+               this.broadcasting = isBroadcasting;
        }
 
        public Long getRecordingId() {
@@ -765,36 +540,28 @@ public class StreamClient implements IClient {
                this.recordingId = recordingId;
        }
 
-       public Long getRecordingMetaDataId() {
-               return recordingMetaDataId;
+       public Long getMetaId() {
+               return metaId;
        }
 
-       public void setRecordingMetaDataId(Long recordingMetaDataId) {
-               this.recordingMetaDataId = recordingMetaDataId;
+       public void setMetaId(Long metaId) {
+               this.metaId = metaId;
        }
 
-       public boolean isScreenPublishStarted() {
-               return screenPublishStarted;
-       }
-
-       public void setScreenPublishStarted(boolean screenPublishStarted) {
-               this.screenPublishStarted = screenPublishStarted;
-       }
-
-       public boolean isStartRecording() {
-               return startRecording;
+       public String getExternalUserId() {
+               return externalUserId;
        }
 
-       public void setStartRecording(boolean startRecording) {
-               this.startRecording = startRecording;
+       public void setExternalUserId(String externalUserId) {
+               this.externalUserId = externalUserId;
        }
 
-       public boolean isStartStreaming() {
-               return startStreaming;
+       public String getExternalUserType() {
+               return externalUserType;
        }
 
-       public void setStartStreaming(boolean startStreaming) {
-               this.startStreaming = startStreaming;
+       public void setExternalUserType(String externalUserType) {
+               this.externalUserType = externalUserType;
        }
 
        public Integer getInterviewPodId() {
@@ -805,30 +572,6 @@ public class StreamClient implements IClient {
                this.interviewPodId = interviewPodId;
        }
 
-       public boolean getCanRemote() {
-               return canRemote;
-       }
-
-       public void setCanRemote(boolean canRemote) {
-               this.canRemote = canRemote;
-       }
-
-       public boolean getCanGiveAudio() {
-               return canGiveAudio;
-       }
-
-       public void setCanGiveAudio(boolean canGiveAudio) {
-               this.canGiveAudio = canGiveAudio;
-       }
-
-       public boolean getCanVideo() {
-               return canVideo;
-       }
-
-       public void setCanVideo(boolean canVideo) {
-               this.canVideo = canVideo;
-       }
-
        public boolean isAllowRecording() {
                return allowRecording;
        }
@@ -837,12 +580,12 @@ public class StreamClient implements IClient {
                this.allowRecording = allowRecording;
        }
 
-       public boolean isStreamPublishStarted() {
-               return streamPublishStarted;
+       public boolean isMicMuted() {
+               return micMuted;
        }
 
-       public void setStreamPublishStarted(boolean streamPublishStarted) {
-               this.streamPublishStarted = streamPublishStarted;
+       public void setMicMuted(boolean micMuted) {
+               this.micMuted = micMuted;
        }
 
        public boolean isSipTransport() {
@@ -861,36 +604,15 @@ public class StreamClient implements IClient {
                this.server = server;
        }
 
-       public boolean isMobile() {
-               return mobile;
-       }
-
-       public void setMobile(boolean mobile) {
-               this.mobile = mobile;
-       }
-
-       public String getTcUrl() {
-               return tcUrl;
-       }
-
-       public void setTcUrl(String tcUrl) {
-               this.tcUrl = tcUrl;
-       }
-
-       public boolean isNativeSsl() {
-               return nativeSsl;
-       }
-
-       public void setNativeSsl(boolean nativeSsl) {
-               this.nativeSsl = nativeSsl;
+       public Long getRoomId() {
+               return roomId;
        }
 
        @Override
        public String toString() {
-               return "Client [streamid=" + streamid + ", publicSID=" + 
publicSID + ", isScreenClient=" + screenClient
-                               + ", isMobile = " + mobile + ", roomId=" + 
roomId + ", broadCastID=" + broadCastId + ", userId="
-                               + userId + ", avsettings=" + avsettings + ", 
isRecording=" + isRecording + ", recordingId="
-                               + recordingId + ", recordingMetaDataId=" + 
recordingMetaDataId + ", screenPublishStarted="
-                               + screenPublishStarted + ", interviewPodId=" + 
interviewPodId + ", server=" + server + "]";
+               return "StreamClient [scope=" + scope + ", uid=" + uid + ", 
ownerSid=" + ownerSid + ", broadCastId="
+                               + broadCastId + ", username=" + username + ", 
userId=" + userId + ", avsettings=" + avsettings + ", sharing=" + sharing
+                               + ", isBroadcasting=" + broadcasting + "]";
        }
+
 }

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-flash/src/main/flex/main.mxml
----------------------------------------------------------------------
diff --git a/openmeetings-flash/src/main/flex/main.mxml 
b/openmeetings-flash/src/main/flex/main.mxml
index 585773d..429bdb2 100644
--- a/openmeetings-flash/src/main/flex/main.mxml
+++ b/openmeetings-flash/src/main/flex/main.mxml
@@ -115,7 +115,9 @@
                                                video.reset();
                                                var cam:Camera = getCam();
                                                video.attachCamera(cam);
-                                               
video.broadcast(UIDUtil.createUID(), cam, getMic());
+                                               var broadcastId:String = 
UIDUtil.createUID();
+                                               debug("BroadcastId = " + 
broadcastId);
+                                               video.broadcast(broadcastId, 
cam, getMic());
                                                
ExternalInterface.call("VideoManager.resetSize", params.uid);
                                        });
                                }

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as
----------------------------------------------------------------------
diff --git 
a/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as 
b/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as
index b2a743e..86f5f12 100644
--- a/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as
+++ b/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as
@@ -169,7 +169,7 @@ public class OmVideo {
        private function _connect(url:String):void {
                nc.connect(url, {
                        uid: params.uid
-                       , sid: params.sid
+                       , ownerSid: params.sid
                        , nativeSsl: 'best' == params.proxyType
                });
        }

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/Core.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/Core.java
 
b/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/Core.java
index 65831ab..738b158 100644
--- 
a/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/Core.java
+++ 
b/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/Core.java
@@ -35,6 +35,7 @@ import java.net.ConnectException;
 import java.net.URI;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.UUID;
 import java.util.concurrent.LinkedBlockingQueue;
 
 import org.apache.openmeetings.screenshare.gui.ScreenSharerFrame;
@@ -82,7 +83,7 @@ public class Core implements IPendingServiceCallback, 
INetStreamEventHandler {
        private String app;
        private int port;
 
-       public String publishName;
+       public String sid;
        private CaptureScreen _capture = null;
        private RTMPClientPublish publishClient = null;
 
@@ -129,7 +130,7 @@ public class Core implements IPendingServiceCallback, 
INetStreamEventHandler {
                        if (args.length > 8) {
                                url = new URI(args[0]);
                                fallback = new URI(args[1]);
-                               publishName = args[2];
+                               sid = args[2];
                                String labelTexts = args[3];
                                defaultQuality = Integer.parseInt(args[4]);
                                defaultFPS = Integer.parseInt(args[5]);
@@ -193,7 +194,7 @@ public class Core implements IPendingServiceCallback, 
INetStreamEventHandler {
                                throw new RuntimeException("Unsupported 
protocol");
                }
                instance.setServiceProvider(this);
-               log.debug(String.format("host: %s, port: %s, app: %s, publish: 
%s", host, port, app, publishName));
+               log.debug(String.format("host: %s, port: %s, app: %s, publish: 
%s", host, port, app, sid));
        }
 
        public static void main(String[] args) {
@@ -228,7 +229,6 @@ public class Core implements IPendingServiceCallback, 
INetStreamEventHandler {
                        int y = (int)(Ampl_factor * (mouseP.getY() - spinnerY) 
* scaleFactor);
 
                        Map<String, Object> cursorPosition = new HashMap<>();
-                       cursorPosition.put("publicSID", publishName);
                        cursorPosition.put("cursor_x", x);
                        cursorPosition.put("cursor_y", y);
 
@@ -259,15 +259,12 @@ public class Core implements IPendingServiceCallback, 
INetStreamEventHandler {
                                
Red5.setConnectionLocal(instance.getConnection());
                        }
                        Map<String, Object> map = new HashMap<>();
-                       map.put("screenX", spinnerX);
-                       map.put("screenY", spinnerY);
 
                        int scaledWidth = (int)(Ampl_factor * resizeX);
                        int scaledHeight = (int)(Ampl_factor * resizeY);
 
                        map.put("screenWidth", scaledWidth);
                        map.put("screenHeight", scaledHeight);
-                       map.put("publishName", publishName);
                        map.put("startRecording", startRecording);
                        map.put("startStreaming", startSharing);
                        map.put("startPublishing", startPublishing);
@@ -304,12 +301,12 @@ public class Core implements IPendingServiceCallback, 
INetStreamEventHandler {
                captureScreenStart();
        }
 
-       private void connect(String parentSid) {
+       private void connect(String sid) {
                setInstance(fallbackUsed ? fallback : url);
                Map<String, Object> map = 
instance.makeDefaultConnectionParams(host, port, app);
                map.put("screenClient", true);
                Map<String, Object> params = new HashMap<>();
-               params.put("uid", parentSid);
+               params.put("ownerSid", sid);
                instance.connect(host, port, map, this, new Object[]{params});
        }
 
@@ -317,7 +314,7 @@ public class Core implements IPendingServiceCallback, 
INetStreamEventHandler {
                frame.setStatus("Exception: " + e);
                if (e instanceof ConnectException) {
                        fallbackUsed = true;
-                       connect(publishName);
+                       connect(sid);
                }
        }
 
@@ -326,7 +323,7 @@ public class Core implements IPendingServiceCallback, 
INetStreamEventHandler {
                        log.debug("captureScreenStart");
 
                        if (!isConnected) {
-                               connect(publishName);
+                               connect(sid);
                        } else {
                                setConnectionAsSharingClient();
                        }
@@ -447,7 +444,9 @@ public class Core implements IPendingServiceCallback, 
INetStreamEventHandler {
                        stopPublishing();
                        isConnected = false;
 
-                       instance.disconnect();
+                       if (instance != null) {
+                               instance.disconnect();
+                       }
                        setReadyToRecord(false);
                        getCapture().setStartPublish(false);
                        getCapture().release();
@@ -510,7 +509,7 @@ public class Core implements IPendingServiceCallback, 
INetStreamEventHandler {
                                Object code = returnMap.get("code");
                                if (CONNECT_FAILED.equals(code) && 
!fallbackUsed) {
                                        fallbackUsed = true;
-                                       connect(publishName);
+                                       connect(sid);
                                        frame.setStatus("Re-connecting using 
fallback");
                                        return;
                                }
@@ -553,8 +552,9 @@ public class Core implements IPendingServiceCallback, 
INetStreamEventHandler {
                                        if (o != null && o instanceof Number) {
                                                
getCapture().setStreamId((Number)o);
                                        }
-                                       log.debug("createPublishStream result 
stream id: {}; name: {}", getCapture().getStreamId(), publishName);
-                                       
instance.publish(getCapture().getStreamId(), publishName, "live", this);
+                                       final String broadcastId = 
UUID.randomUUID().toString();
+                                       log.debug("createPublishStream result 
stream id: {}; name: {}", getCapture().getStreamId(), broadcastId);
+                                       
instance.publish(getCapture().getStreamId(), broadcastId, "live", this);
 
                                        log.debug("setup capture thread 
spinnerWidth = {}; spinnerHeight = {};", spinnerWidth, spinnerHeight);
 

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-screenshare/src/main/jnlp/templates/template.jnlp
----------------------------------------------------------------------
diff --git a/openmeetings-screenshare/src/main/jnlp/templates/template.jnlp 
b/openmeetings-screenshare/src/main/jnlp/templates/template.jnlp
index 2e1c9f8..e6ba15c 100644
--- a/openmeetings-screenshare/src/main/jnlp/templates/template.jnlp
+++ b/openmeetings-screenshare/src/main/jnlp/templates/template.jnlp
@@ -39,7 +39,7 @@
        <application-desc main-class='org.apache.openmeetings.screenshare.Core'>
                <argument>$url</argument>
                <argument>$fallback</argument>
-               <argument>$publicSid</argument>
+               <argument>$sid</argument>
                <argument>$labels</argument>
                <argument>$defaultQuality</argument>
                <argument>$defaultFps</argument>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java
 
b/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java
index 4ede92b..d8e604d 100644
--- 
a/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java
+++ 
b/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java
@@ -60,7 +60,6 @@ import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.entity.user.User.Right;
 import org.apache.openmeetings.db.entity.user.User.Type;
 import org.apache.openmeetings.db.entity.user.Userdata;
-import org.apache.openmeetings.db.util.AuthLevelUtil;
 import org.apache.openmeetings.db.util.TimezoneUtil;
 import org.apache.openmeetings.service.mail.EmailManager;
 import org.apache.openmeetings.util.DaoHelper;
@@ -410,65 +409,56 @@ public class UserManager implements IUserManager {
         * @return
         */
        @Override
-       public boolean kickUserByStreamId(String sid, Long room_id) {
+       public boolean kickUsersByRoomId(Long roomId) {
                try {
-                       Sessiondata sd = sessionDao.check(sid);
-                       // admins only
-                       if 
(AuthLevelUtil.hasAdminLevel(userDao.getRights(sd.getUserId()))) {
-
-                               sessionDao.clearSessionByRoomId(room_id);
-
-                               for (StreamClient rcl : 
sessionManager.getClientListByRoom(room_id)) {
-                                       if (rcl == null) {
-                                               return true;
-                                       }
-                                       String scopeName = "hibernate";
-                                       if (rcl.getRoomId() != null) {
-                                               scopeName = 
rcl.getRoomId().toString();
-                                       }
-                                       IScope currentScope = 
scopeApplicationAdapter.getRoomScope(scopeName);
-                                       
scopeApplicationAdapter.roomLeaveByScope(rcl, currentScope);
-
-                                       Map<Integer, String> messageObj = new 
HashMap<>();
-                                       messageObj.put(0, "kick");
-                                       
scopeApplicationAdapter.sendMessageById(messageObj, rcl.getStreamid(), 
currentScope);
-                               }
-                               return true;
-                       }
-               } catch (Exception err) {
-                       log.error("[kickUserByStreamId]", err);
-               }
-               return false;
-       }
-
-       @Override
-       public boolean kickUserByPublicSID(String sid, String publicSID) {
-               try {
-                       Sessiondata sd = sessionDao.check(sid);
-                       // admins only
-                       if 
(AuthLevelUtil.hasWebServiceLevel(userDao.getRights(sd.getUserId()))) {
-                               StreamClient rcl = 
sessionManager.getClientByPublicSID(publicSID, null);
+                       sessionDao.clearSessionByRoomId(roomId);
 
+                       for (StreamClient rcl : 
sessionManager.getClientListByRoom(roomId)) {
                                if (rcl == null) {
                                        return true;
                                }
-
                                String scopeName = "hibernate";
                                if (rcl.getRoomId() != null) {
                                        scopeName = rcl.getRoomId().toString();
                                }
                                IScope currentScope = 
scopeApplicationAdapter.getRoomScope(scopeName);
+                               scopeApplicationAdapter.roomLeaveByScope(rcl, 
currentScope);
 
                                Map<Integer, String> messageObj = new 
HashMap<>();
                                messageObj.put(0, "kick");
-                               
scopeApplicationAdapter.sendMessageById(messageObj, rcl.getStreamid(), 
currentScope);
+                               
scopeApplicationAdapter.sendMessageById(messageObj, rcl.getId(), currentScope);
+                       }
+                       return true;
+               } catch (Exception err) {
+                       log.error("[kickUsersByRoomId]", err);
+               }
+               return false;
+       }
 
-                               scopeApplicationAdapter.roomLeaveByScope(rcl, 
currentScope);
+       @Override
+       public boolean kickById(Long id) {
+               try {
+                       StreamClient rcl = sessionManager.get(id);
 
+                       if (rcl == null) {
                                return true;
                        }
+
+                       String scopeName = "hibernate";
+                       if (rcl.getRoomId() != null) {
+                               scopeName = rcl.getRoomId().toString();
+                       }
+                       IScope currentScope = 
scopeApplicationAdapter.getRoomScope(scopeName);
+
+                       Map<Integer, String> messageObj = new HashMap<>();
+                       messageObj.put(0, "kick");
+                       scopeApplicationAdapter.sendMessageById(messageObj, 
rcl.getId(), currentScope);
+
+                       scopeApplicationAdapter.roomLeaveByScope(rcl, 
currentScope);
+
+                       return true;
                } catch (Exception err) {
-                       log.error("[kickUserByStreamId]", err);
+                       log.error("[kickById]", err);
                }
                return false;
        }

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java
index 0d8e37d..ad1c752 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java
@@ -19,7 +19,6 @@
 package org.apache.openmeetings.web.admin.connection;
 
 import static org.apache.openmeetings.web.app.Application.getBean;
-import static org.apache.openmeetings.web.app.WebSession.getSid;
 
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
@@ -28,9 +27,10 @@ import java.util.Iterator;
 import java.util.List;
 
 import org.apache.openmeetings.db.dao.server.ISessionManager;
-import org.apache.openmeetings.db.dao.user.IUserService;
+import org.apache.openmeetings.db.entity.basic.Client;
 import org.apache.openmeetings.db.entity.basic.IClient;
 import org.apache.openmeetings.db.entity.room.StreamClient;
+import org.apache.openmeetings.service.user.UserManager;
 import org.apache.openmeetings.web.admin.AdminPanel;
 import org.apache.openmeetings.web.admin.SearchableDataView;
 import org.apache.openmeetings.web.app.Application;
@@ -91,11 +91,10 @@ public class ConnectionsPanel extends AdminPanel {
                                                IClient _c = 
item.getModelObject();
                                                if (_c instanceof StreamClient) 
{
                                                        StreamClient c = 
(StreamClient)_c;
-                                                       
getBean(IUserService.class).kickUserByStreamId(getSid(), c.getStreamid()
-                                                                       , 
c.getServer() == null ? 0 : c.getServer().getId());
+                                                       
getBean(UserManager.class).kickById(c.getId());
                                                } else {
-                                                       
org.apache.openmeetings.db.entity.basic.Client c = 
(org.apache.openmeetings.db.entity.basic.Client)_c;
-                                                       
getBean(IUserService.class).kickUserBySessionId(getSid(), c.getUserId(), 
c.getSessionId());
+                                                       Client c = (Client)_c;
+                                                       
Application.get().invalidateClient(c.getUserId(), c.getSessionId());
                                                }
                                                target.add(container, 
details.setVisible(false));
                                        }
@@ -107,9 +106,9 @@ public class ConnectionsPanel extends AdminPanel {
                                        item.add(new Label("since", 
c.getConnectedSince()));
                                        item.add(new Label("scope"));
                                        item.add(new Label("server", 
c.getServer() == null ? "no cluster" : c.getServer().getAddress())); //FIXME 
localization
-                                       confirm.setEnabled(!c.isScreenClient());
+                                       confirm.setEnabled(!c.isSharing());
                                } else {
-                                       
org.apache.openmeetings.db.entity.basic.Client c = 
(org.apache.openmeetings.db.entity.basic.Client)_c;
+                                       Client c = (Client)_c;
                                        item.add(new Label("streamid", ""));
                                        item.add(new Label("login", 
c.getUser().getLogin()));
                                        item.add(new Label("since", 
c.getConnectedSince()));

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java
index e8ffa21..869b36d 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/rooms/RoomForm.java
@@ -21,7 +21,6 @@ package org.apache.openmeetings.web.admin.rooms;
 import static org.apache.openmeetings.db.util.AuthLevelUtil.hasGroupAdminLevel;
 import static org.apache.openmeetings.web.app.Application.getBean;
 import static org.apache.openmeetings.web.app.WebSession.getRights;
-import static org.apache.openmeetings.web.app.WebSession.getSid;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 
 import java.util.ArrayList;
@@ -32,7 +31,6 @@ import java.util.List;
 import org.apache.openmeetings.db.dao.room.RoomDao;
 import org.apache.openmeetings.db.dao.server.ISessionManager;
 import org.apache.openmeetings.db.dao.user.GroupDao;
-import org.apache.openmeetings.db.dao.user.IUserService;
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.db.entity.room.Room.RoomElement;
@@ -42,6 +40,7 @@ import org.apache.openmeetings.db.entity.room.StreamClient;
 import org.apache.openmeetings.db.entity.user.Address;
 import org.apache.openmeetings.db.entity.user.Group;
 import org.apache.openmeetings.db.entity.user.User;
+import org.apache.openmeetings.service.user.UserManager;
 import org.apache.openmeetings.web.admin.AdminBaseForm;
 import org.apache.openmeetings.web.admin.AdminUserChoiceProvider;
 import org.apache.openmeetings.web.app.Application;
@@ -97,9 +96,7 @@ public class RoomForm extends AdminBaseForm<Room> {
                                        @Override
                                        protected void 
onSubmit(AjaxRequestTarget target) {
                                                StreamClient c = 
item.getModelObject();
-                                               
getBean(IUserService.class).kickUserByStreamId(getSid(), c.getStreamid()
-                                                               , c.getServer() 
== null ? 0 : c.getServer().getId());
-
+                                               
getBean(UserManager.class).kickById(c.getId());
                                                updateClients(target);
                                        }
                                });

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/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 7b68bf9..f6330a9 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
@@ -122,6 +122,7 @@ public class Application extends 
AuthenticatedWebApplication implements IApplica
        private static final Logger log = getLogger(Application.class, 
webAppRootKey);
        private static boolean isInstalled;
        private static ConcurrentHashMap<String, Client> ONLINE_USERS = new 
ConcurrentHashMap<>();
+       private static ConcurrentHashMap<String, String> UID_BY_SID = new 
ConcurrentHashMap<>();
        private static ConcurrentHashMap<String, Client> INVALID_SESSIONS = new 
ConcurrentHashMap<>();
        private static ConcurrentHashMap<Long, Set<String>> ROOMS = new 
ConcurrentHashMap<>();
        //additional maps for faster searching should be created
@@ -257,6 +258,7 @@ public class Application extends 
AuthenticatedWebApplication implements IApplica
        public static void addOnlineUser(Client c) {
                log.debug("Adding online client: {}, room: {}", c.getUid(), 
c.getRoomId());
                ONLINE_USERS.put(c.getUid(), c);
+               UID_BY_SID.put(c.getSid(), c.getUid());
        }
 
        public static void exitRoom(Client c) {
@@ -279,13 +281,14 @@ public class Application extends 
AuthenticatedWebApplication implements IApplica
                }
        }
 
-       public static void exit(Client c) {
+       private static void exit(Client c) {
                if (c != null) {
                        if (c.getRoomId() != null) {
                                exitRoom(c);
                        }
                        log.debug("Removing online client: {}, room: {}", 
c.getUid(), c.getRoomId());
                        ONLINE_USERS.remove(c.getUid());
+                       UID_BY_SID.remove(c.getSid());
                }
        }
 
@@ -302,66 +305,61 @@ public class Application extends 
AuthenticatedWebApplication implements IApplica
                if (rcl == null) {
                        return null;
                }
-               if (!rcl.isScreenClient() && (!rcl.isMobile() || 
(rcl.isMobile() && rcl.getUserId() != null))) {
-                       Client client = getOnlineClient(rcl.getPublicSID());
-                       if (client == null) {
-                               if (!Strings.isEmpty(rcl.getSecurityCode())) {
-                                       client = 
getOnlineClient(rcl.getSecurityCode());
-                               }
-                               if (client == null && rcl.isMobile()) {
-                                       //Mobile client enters the room
-                                       client = new Client(rcl, 
getBean(UserDao.class));
-                                       addOnlineUser(client);
-                                       if (rcl.getRoomId() != null) {
-                                               client.setCam(0);
-                                               client.setMic(0);
-                                               addUserToRoom(client);
-                                               //FIXME TODO unify this
-                                               WebSocketHelper.sendRoom(new 
RoomMessage(client.getRoomId(), client.getUserId(), 
RoomMessage.Type.roomEnter));
-                                       }
-                                       //FIXME TODO rights
-                               } else if (client == null) {
-                                       return null;
-                               } else if (!client.hasRight(Right.audio) && 
!client.hasRight(Right.video)) {
-                                       log.warn("Parent client has no AV 
rights, going reject client");
-                                       return null;
+               Client client = getClientBySid(rcl.getOwnerSid());
+               if (client == null) {
+                       if (rcl.isMobile()) {
+                               //Mobile client enters the room
+                               client = new Client(rcl, 
getBean(UserDao.class));
+                               addOnlineUser(client);
+                               if (rcl.getRoomId() != null) {
+                                       client.setCam(0);
+                                       client.setMic(0);
+                                       addUserToRoom(client);
+                                       //FIXME TODO unify this
+                                       WebSocketHelper.sendRoom(new 
RoomMessage(client.getRoomId(), client.getUserId(), 
RoomMessage.Type.roomEnter));
                                }
+                               //FIXME TODO rights
+                       } else {
+                               return null;
                        }
-                       rcl.setFirstname(client.getUser().getFirstname());
-                       rcl.setLastname(client.getUser().getLastname());
-                       
rcl.setIsSuperModerator(client.hasRight(Right.superModerator));
-                       rcl.setIsMod(client.hasRight(Right.moderator));
-                       rcl.setCanVideo(client.hasRight(Right.video) && 
client.isCamEnabled() && client.hasActivity(Activity.broadcastV));
-                       rcl.setCanDraw(client.hasRight(Right.whiteBoard));
-                       if (client.hasActivity(Activity.broadcastA) && 
client.getMic() < 0) {
-                               client.remove(Activity.broadcastA);
+               }
+               if (rcl.getRoomId() == null || 
!rcl.getRoomId().equals(client.getRoomId())) {
+                       //TODO mobile
+                       return null;
+               }
+               rcl.setFirstname(client.getUser().getFirstname());
+               rcl.setLastname(client.getUser().getLastname());
+               rcl.setSuperMod(client.hasRight(Right.superModerator));
+               rcl.setMod(client.hasRight(Right.moderator));
+               rcl.setCanVideo(client.hasRight(Right.video) && 
client.isCamEnabled() && client.hasActivity(Activity.broadcastV));
+               if (client.hasActivity(Activity.broadcastA) && client.getMic() 
< 0) {
+                       client.remove(Activity.broadcastA);
+               }
+               if (client.hasActivity(Activity.broadcastV) && client.getCam() 
< 0) {
+                       client.remove(Activity.broadcastV);
+               }
+               if (client.hasActivity(Activity.broadcastA) || 
client.hasActivity(Activity.broadcastV)) {
+                       if (forceSize || rcl.getWidth() == 0 || rcl.getHeight() 
== 0) {
+                               rcl.setWidth(client.getWidth());
+                               rcl.setHeight(client.getHeight());
                        }
-                       if (client.hasActivity(Activity.broadcastV) && 
client.getCam() < 0) {
-                               client.remove(Activity.broadcastV);
+                       if (client.getPod() != Pod.none) {
+                               rcl.setInterviewPodId(client.getPod() == 
Pod.left ? 1 : 2);
                        }
-                       if (client.hasActivity(Activity.broadcastA) || 
client.hasActivity(Activity.broadcastV)) {
-                               if (forceSize || rcl.getVWidth() == 0 || 
rcl.getVHeight() == 0) {
-                                       rcl.setVWidth(client.getWidth());
-                                       rcl.setVHeight(client.getHeight());
-                               }
-                               if (client.getPod() != Pod.none) {
-                                       rcl.setInterviewPodId(client.getPod() 
== Pod.left ? 1 : 2);
-                               }
-                               StringBuilder sb = new StringBuilder();
-                               if (client.hasActivity(Activity.broadcastA)) {
-                                       sb.append('a');
-                               }
-                               if (client.hasActivity(Activity.broadcastV)) {
-                                       sb.append('v');
-                               }
-                               if (!rcl.getIsBroadcasting() || hasVideo(rcl) 
!= hasVideo(client)) {
-                                       rcl.setIsBroadcasting(true);
-                               }
-                               rcl.setAvsettings(sb.toString());
-                       } else {
-                               rcl.setAvsettings("n");
-                               rcl.setIsBroadcasting(false);
+                       StringBuilder sb = new StringBuilder();
+                       if (client.hasActivity(Activity.broadcastA)) {
+                               sb.append('a');
+                       }
+                       if (client.hasActivity(Activity.broadcastV)) {
+                               sb.append('v');
+                       }
+                       if (!rcl.isBroadcasting() || hasVideo(rcl) != 
hasVideo(client)) {
+                               rcl.setBroadcasting(true);
                        }
+                       rcl.setAvsettings(sb.toString());
+               } else {
+                       rcl.setAvsettings("n");
+                       rcl.setBroadcasting(false);
                }
                return rcl;
        }
@@ -370,6 +368,19 @@ public class Application extends 
AuthenticatedWebApplication implements IApplica
                return uid == null ? null : ONLINE_USERS.get(uid);
        }
 
+       @Override
+       public Client getOmClientBySid(String sid) {
+               return getClientBySid(sid);
+       }
+
+       public static Client getClientBySid(String sid) {
+               if (sid == null) {
+                       return null;
+               }
+               String uid = UID_BY_SID.get(sid);
+               return uid == null ? null : ONLINE_USERS.get(uid);
+       }
+
        public static boolean isUserOnline(Long userId) {
                boolean isUserOnline = false;
                for (Map.Entry<String, Client> e : ONLINE_USERS.entrySet()) {
@@ -446,8 +457,7 @@ public class Application extends 
AuthenticatedWebApplication implements IApplica
                                c.setRoomId(null);
                        }
                        
getBean(ScopeApplicationAdapter.class).roomLeaveByScope(c.getUid(), roomId);
-                       c.getActivities().clear();
-                       c.clearRights();
+                       c.clear();
                }
                return c;
        }

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/117e8d6b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
index 72939d8..c624e36 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
@@ -24,10 +24,8 @@ import static 
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DASHBOAR
 import static 
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DASHBOARD_SHOW_RSS_KEY;
 import static 
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DEFAULT_LANG_KEY;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
-import static org.apache.openmeetings.web.app.Application.exit;
 import static 
org.apache.openmeetings.web.app.Application.getAuthenticationStrategy;
 import static org.apache.openmeetings.web.app.Application.getBean;
-import static org.apache.openmeetings.web.app.Application.getClientByKeys;
 import static org.apache.openmeetings.web.app.Application.getDashboardContext;
 import static org.apache.openmeetings.web.app.Application.isInvaldSession;
 import static org.apache.openmeetings.web.app.Application.removeInvalidSession;
@@ -100,7 +98,6 @@ public class WebSession extends 
AbstractAuthenticatedWebSession implements IWebS
        private Long userId = null;
        private Set<Right> rights = new HashSet<>(); //TODO renew somehow on 
user edit !!!!
        private long languageId = -1; //TODO renew somehow on user edit !!!!
-       private String SID = null;
        private OmUrlFragment area = null;
        private TimeZone tz;
        private TimeZone browserTz;
@@ -123,11 +120,10 @@ public class WebSession extends 
AbstractAuthenticatedWebSession implements IWebS
 
        @Override
        public void invalidate() {
-               exit(getClientByKeys(userId, getId()));
+               Application.get().invalidateClient(userId, getId());
                super.invalidate();
                userId = null;
                rights = 
Collections.unmodifiableSet(Collections.<Right>emptySet());
-               SID = null;
                ISO8601FORMAT = null;
                sdf = null;
                languageId = -1;
@@ -273,7 +269,6 @@ public class WebSession extends 
AbstractAuthenticatedWebSession implements IWebS
        }
 
        private void setUser(User u, Set<Right> rights) {
-               String _sid = SID;
                Long _recordingId = recordingId;
                Long _roomId = roomId;
                Invitation _i = i;
@@ -281,9 +276,6 @@ public class WebSession extends 
AbstractAuthenticatedWebSession implements IWebS
                ClientInfo _info = clientInfo;
                ExtendedClientProperties _extProps = extProps;
                replaceSession(); // required to prevent session fixation
-               if (_sid != null) {
-                       SID = _sid;
-               }
                if (_recordingId != null) {
                        recordingId = _recordingId;
                }
@@ -379,23 +371,6 @@ public class WebSession extends 
AbstractAuthenticatedWebSession implements IWebS
                return session.languageId;
        }
 
-       public String getValidatedSid() {
-               SessiondataDao sessionDao = getBean(SessiondataDao.class);
-               Sessiondata sd = sessionDao.check(SID);
-               //TODO need to check roomId equality
-               if (sd.getUserId() == null || !sd.getUserId().equals(userId)) {
-                       if (sd.getId() == null) {
-                               sd = sessionDao.create(userId, roomId, 
languageId);
-                       }
-                       SID = sd.getSessionId();
-               }
-               return SID;
-       }
-
-       public static String getSid() {
-               return get().getValidatedSid();
-       }
-
        public static Long getUserId() {
                checkIsInvalid();
                return get().userId;

Reply via email to