diff --git a/bigbluebutton-html5/imports/api/annotations/server/methods/clearWhiteboard.js b/bigbluebutton-html5/imports/api/annotations/server/methods/clearWhiteboard.js
index 25de55fe320e2f982333b3d0fe876a1a0681cb76..5c146c7c8e7a0584916a0bdd33892ea0cacff3ca 100644
--- a/bigbluebutton-html5/imports/api/annotations/server/methods/clearWhiteboard.js
+++ b/bigbluebutton-html5/imports/api/annotations/server/methods/clearWhiteboard.js
@@ -1,28 +1,17 @@
-import { getMultiUserStatus } from '/imports/api/common/server/helpers';
 import RedisPubSub from '/imports/startup/server/redis';
 import { Meteor } from 'meteor/meteor';
 import { check } from 'meteor/check';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-import isPodPresenter from '/imports/api/presentation-pods/server/utils/isPodPresenter';
-
-export default function clearWhiteboard(credentials, whiteboardId) {
+export default function clearWhiteboard(whiteboardId) {
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
   const EVENT_NAME = 'ClearWhiteboardPubMsg';
 
-  const { meetingId, requesterUserId, requesterToken } = credentials;
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(requesterToken, String);
   check(whiteboardId, String);
 
-  const allowed = isPodPresenter(meetingId, whiteboardId, requesterUserId)
-    || getMultiUserStatus(meetingId, whiteboardId);
-  if (!allowed) {
-    throw new Meteor.Error('not-allowed', `User ${requesterUserId} is not allowed to clear the whiteboard`);
-  }
-
   const payload = {
     whiteboardId,
   };
diff --git a/bigbluebutton-html5/imports/api/annotations/server/methods/sendAnnotation.js b/bigbluebutton-html5/imports/api/annotations/server/methods/sendAnnotation.js
index 9700c6415f4b876ba8afcd5fae72f8d8d0e0213d..daa01d8f2410f4f8d5d6d2d94f3f122d86e99257 100755
--- a/bigbluebutton-html5/imports/api/annotations/server/methods/sendAnnotation.js
+++ b/bigbluebutton-html5/imports/api/annotations/server/methods/sendAnnotation.js
@@ -1,105 +1,8 @@
-import { getMultiUserStatus } from '/imports/api/common/server/helpers';
-import RedisPubSub from '/imports/startup/server/redis';
-import { Meteor } from 'meteor/meteor';
-import { check } from 'meteor/check';
-import Annotations from '/imports/api/annotations';
+import sendAnnotationHelper from './sendAnnotationHelper';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-import isPodPresenter from '/imports/api/presentation-pods/server/utils/isPodPresenter';
+export default function sendAnnotation(annotation) {
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
-function isLastMessage(meetingId, annotation, userId) {
-  const DRAW_END = Meteor.settings.public.whiteboard.annotations.status.end;
-
-  if (annotation.status === DRAW_END) {
-    const selector = {
-      meetingId,
-      id: annotation.id,
-      userId,
-    };
-
-    const _annotation = Annotations.findOne(selector);
-    return _annotation !== null;
-  }
-
-  return false;
-}
-
-export default function sendAnnotation(credentials, annotation) {
-  const REDIS_CONFIG = Meteor.settings.private.redis;
-  const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
-  const EVENT_NAME = 'SendWhiteboardAnnotationPubMsg';
-
-  const { meetingId, requesterUserId, requesterToken } = credentials;
-  const whiteboardId = annotation.wbId;
-
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(requesterToken, String);
-  check(annotation, Object);
-  check(whiteboardId, String);
-
-  // We allow messages to pass through in 3 cases:
-  // 1. When it's a standard message in presenter mode (Acl check)
-  // 2. When it's a standard message in multi-user mode (getMultUserStatus check)
-  // 3. When it's the last message, happens when the user is currently drawing
-  // and then slide/presentation changes, the user lost presenter rights,
-  // or multi-user whiteboard gets turned off
-  // So we allow the last "DRAW_END" message to pass through, to finish the shape.
-  const allowed = isPodPresenter(meetingId, whiteboardId, requesterUserId)
-    || getMultiUserStatus(meetingId, whiteboardId)
-    || isLastMessage(meetingId, annotation, requesterUserId);
-
-  if (!allowed) {
-    throw new Meteor.Error('not-allowed', `User ${requesterUserId} is not allowed to send an annotation`);
-  }
-
-  if (annotation.annotationType === 'text') {
-    check(annotation, {
-      id: String,
-      status: String,
-      annotationType: String,
-      annotationInfo: {
-        x: Number,
-        y: Number,
-        fontColor: Number,
-        calcedFontSize: Number,
-        textBoxWidth: Number,
-        text: String,
-        textBoxHeight: Number,
-        id: String,
-        whiteboardId: String,
-        status: String,
-        fontSize: Number,
-        dataPoints: String,
-        type: String,
-      },
-      wbId: String,
-      userId: String,
-      position: Number,
-    });
-  } else {
-    check(annotation, {
-      id: String,
-      status: String,
-      annotationType: String,
-      annotationInfo: {
-        color: Number,
-        thickness: Number,
-        points: Array,
-        id: String,
-        whiteboardId: String,
-        status: String,
-        type: String,
-        dimensions: Match.Maybe([Number]),
-      },
-      wbId: String,
-      userId: String,
-      position: Number,
-    });
-  }
-
-  const payload = {
-    annotation,
-  };
-
-  return RedisPubSub.publishUserMessage(CHANNEL, EVENT_NAME, meetingId, requesterUserId, payload);
+  sendAnnotationHelper(annotation, meetingId, requesterUserId);
 }
diff --git a/bigbluebutton-html5/imports/api/annotations/server/methods/sendAnnotationHelper.js b/bigbluebutton-html5/imports/api/annotations/server/methods/sendAnnotationHelper.js
new file mode 100755
index 0000000000000000000000000000000000000000..88ef045cfa74a8b0542ab8392b009fb574405a55
--- /dev/null
+++ b/bigbluebutton-html5/imports/api/annotations/server/methods/sendAnnotationHelper.js
@@ -0,0 +1,65 @@
+import RedisPubSub from '/imports/startup/server/redis';
+import { Meteor } from 'meteor/meteor';
+import { check } from 'meteor/check';
+
+export default function sendAnnotationHelper(annotation, meetingId, requesterUserId) {
+  const REDIS_CONFIG = Meteor.settings.private.redis;
+  const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
+  const EVENT_NAME = 'SendWhiteboardAnnotationPubMsg';
+
+  const whiteboardId = annotation.wbId;
+
+  check(annotation, Object);
+  check(whiteboardId, String);
+
+  if (annotation.annotationType === 'text') {
+    check(annotation, {
+      id: String,
+      status: String,
+      annotationType: String,
+      annotationInfo: {
+        x: Number,
+        y: Number,
+        fontColor: Number,
+        calcedFontSize: Number,
+        textBoxWidth: Number,
+        text: String,
+        textBoxHeight: Number,
+        id: String,
+        whiteboardId: String,
+        status: String,
+        fontSize: Number,
+        dataPoints: String,
+        type: String,
+      },
+      wbId: String,
+      userId: String,
+      position: Number,
+    });
+  } else {
+    check(annotation, {
+      id: String,
+      status: String,
+      annotationType: String,
+      annotationInfo: {
+        color: Number,
+        thickness: Number,
+        points: Array,
+        id: String,
+        whiteboardId: String,
+        status: String,
+        type: String,
+        dimensions: Match.Maybe([Number]),
+      },
+      wbId: String,
+      userId: String,
+      position: Number,
+    });
+  }
+
+  const payload = {
+    annotation,
+  };
+
+  return RedisPubSub.publishUserMessage(CHANNEL, EVENT_NAME, meetingId, requesterUserId, payload);
+}
diff --git a/bigbluebutton-html5/imports/api/annotations/server/methods/sendBulkAnnotations.js b/bigbluebutton-html5/imports/api/annotations/server/methods/sendBulkAnnotations.js
index eb17b4cee795ebe741959538b0a25a462428c2db..fd4530e744775d2f3430b70912cb6460d1270bd1 100644
--- a/bigbluebutton-html5/imports/api/annotations/server/methods/sendBulkAnnotations.js
+++ b/bigbluebutton-html5/imports/api/annotations/server/methods/sendBulkAnnotations.js
@@ -1,9 +1,8 @@
-import { check } from 'meteor/check';
-import sendAnnotation from './sendAnnotation';
+import { extractCredentials } from '/imports/api/common/server/helpers';
+import sendAnnotationHelper from './sendAnnotationHelper';
 
-export default function sendBulkAnnotations(credentials, payload) {
-  check(credentials, Object);
-  check(payload, [Object]);
+export default function sendBulkAnnotations(payload) {
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
-  payload.forEach(annotation => sendAnnotation(credentials, annotation));
+  payload.forEach(annotation => sendAnnotationHelper(annotation, meetingId, requesterUserId));
 }
diff --git a/bigbluebutton-html5/imports/api/annotations/server/methods/undoAnnotation.js b/bigbluebutton-html5/imports/api/annotations/server/methods/undoAnnotation.js
index a55397de53a443879b77bb1732237ef8d2867159..bcab1c2b3509fd2b100d57c62d5e06e6cf2a92f6 100644
--- a/bigbluebutton-html5/imports/api/annotations/server/methods/undoAnnotation.js
+++ b/bigbluebutton-html5/imports/api/annotations/server/methods/undoAnnotation.js
@@ -1,29 +1,17 @@
-import { getMultiUserStatus } from '/imports/api/common/server/helpers';
 import RedisPubSub from '/imports/startup/server/redis';
 import { Meteor } from 'meteor/meteor';
 import { check } from 'meteor/check';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-import isPodPresenter from '/imports/api/presentation-pods/server/utils/isPodPresenter';
-
-export default function undoAnnotation(credentials, whiteboardId) {
+export default function undoAnnotation(whiteboardId) {
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
   const EVENT_NAME = 'UndoWhiteboardPubMsg';
 
-  const { meetingId, requesterUserId, requesterToken } = credentials;
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(requesterToken, String);
   check(whiteboardId, String);
 
-  const allowed = isPodPresenter(meetingId, whiteboardId, requesterUserId)
-    || getMultiUserStatus(meetingId, whiteboardId);
-
-  if (!allowed) {
-    throw new Meteor.Error('not-allowed', `User ${requesterUserId} is not allowed to undo the annotation`);
-  }
-
   const payload = {
     whiteboardId,
   };
diff --git a/bigbluebutton-html5/imports/api/annotations/server/publishers.js b/bigbluebutton-html5/imports/api/annotations/server/publishers.js
index da757739ed5040603ecb480a6dc67659b565a18f..d79333f70415f73362dcbd0116e0c86f0439de63 100644
--- a/bigbluebutton-html5/imports/api/annotations/server/publishers.js
+++ b/bigbluebutton-html5/imports/api/annotations/server/publishers.js
@@ -1,16 +1,16 @@
 import Annotations from '/imports/api/annotations';
 import { Meteor } from 'meteor/meteor';
-import { check } from 'meteor/check';
 import Logger from '/imports/startup/server/logger';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-function annotations(credentials) {
-  const { meetingId, requesterUserId, requesterToken } = credentials;
+function annotations() {
+  if (!this.userId) {
+    return Annotations.find({ meetingId: '' });
+  }
 
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(requesterToken, String);
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
-  Logger.debug(`Publishing Annotations for ${meetingId} ${requesterUserId} ${requesterToken}`);
+  Logger.debug(`Publishing Annotations for ${meetingId} ${requesterUserId}`);
 
   return Annotations.find({ meetingId });
 }
diff --git a/bigbluebutton-html5/imports/api/breakouts/server/methods/createBreakout.js b/bigbluebutton-html5/imports/api/breakouts/server/methods/createBreakout.js
index 8fbc22740f6cdfa73aa5e4d4f080a0cf81afd2cb..2b069675ef3fdfc0b0a3e3340998071f89152f45 100644
--- a/bigbluebutton-html5/imports/api/breakouts/server/methods/createBreakout.js
+++ b/bigbluebutton-html5/imports/api/breakouts/server/methods/createBreakout.js
@@ -1,21 +1,13 @@
 import { Meteor } from 'meteor/meteor';
-import { check } from 'meteor/check';
 import RedisPubSub from '/imports/startup/server/redis';
 import Logger from '/imports/startup/server/logger';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-export default function createBreakoutRoom(credentials, rooms, durationInMinutes, record = false) {
+export default function createBreakoutRoom(rooms, durationInMinutes, record = false) {
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
 
-  const {
-    meetingId,
-    requesterUserId,
-    requesterToken,
-  } = credentials;
-
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(requesterToken, String);
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
   const eventName = 'CreateBreakoutRoomsCmdMsg';
   if (rooms.length > 8) return Logger.info(`Attempt to create breakout rooms with invalid number of rooms in meeting id=${meetingId}`);
diff --git a/bigbluebutton-html5/imports/api/breakouts/server/methods/endAllBreakouts.js b/bigbluebutton-html5/imports/api/breakouts/server/methods/endAllBreakouts.js
index 4753fc6685e1ad2fa72f7b52600b4a10e0f8516e..ff309659130c7ced4dcecb05b507bcbb9e24f4a1 100644
--- a/bigbluebutton-html5/imports/api/breakouts/server/methods/endAllBreakouts.js
+++ b/bigbluebutton-html5/imports/api/breakouts/server/methods/endAllBreakouts.js
@@ -1,20 +1,16 @@
 import { Meteor } from 'meteor/meteor';
 import { check } from 'meteor/check';
 import RedisPubSub from '/imports/startup/server/redis';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-export default function endAllBreakouts(credentials) {
+export default function endAllBreakouts() {
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
 
-  const {
-    meetingId,
-    requesterUserId,
-    requesterToken,
-  } = credentials;
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
   check(meetingId, String);
   check(requesterUserId, String);
-  check(requesterToken, String);
 
   const eventName = 'EndAllBreakoutRoomsMsg';
   return RedisPubSub.publishUserMessage(CHANNEL, eventName, meetingId, requesterUserId, null);
diff --git a/bigbluebutton-html5/imports/api/breakouts/server/methods/requestJoinURL.js b/bigbluebutton-html5/imports/api/breakouts/server/methods/requestJoinURL.js
index f2da4d7d3208eeec9217d34d6477e0b569484530..ace15db4b87d59c80e7e9616b6b26cec95d49054 100755
--- a/bigbluebutton-html5/imports/api/breakouts/server/methods/requestJoinURL.js
+++ b/bigbluebutton-html5/imports/api/breakouts/server/methods/requestJoinURL.js
@@ -1,16 +1,13 @@
 import { Meteor } from 'meteor/meteor';
-import { check } from 'meteor/check';
 import RedisPubSub from '/imports/startup/server/redis';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-export default function requestJoinURL(credentials, { breakoutId, userId: userIdToInvite }) {
+export default function requestJoinURL({ breakoutId, userId: userIdToInvite }) {
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
 
-  const { meetingId, requesterUserId, requesterToken } = credentials;
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(requesterToken, String);
   const userId = userIdToInvite || requesterUserId;
   const eventName = 'RequestBreakoutJoinURLReqMsg';
 
diff --git a/bigbluebutton-html5/imports/api/breakouts/server/publishers.js b/bigbluebutton-html5/imports/api/breakouts/server/publishers.js
index dae21d5126e60a03ec0491f0ebe82ca81831bc5b..5f682d423a3e0c41ca7ec0c56e48a0db1d1991ad 100755
--- a/bigbluebutton-html5/imports/api/breakouts/server/publishers.js
+++ b/bigbluebutton-html5/imports/api/breakouts/server/publishers.js
@@ -2,14 +2,16 @@ import { Meteor } from 'meteor/meteor';
 import Breakouts from '/imports/api/breakouts';
 import Users from '/imports/api/users';
 import Logger from '/imports/startup/server/logger';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
 const ROLE_MODERATOR = Meteor.settings.public.user.role_moderator;
 
-function breakouts(credentials, moderator = false) {
-  const {
-    meetingId,
-    requesterUserId,
-  } = credentials;
+function breakouts(moderator = false) {
+  if (!this.userId) {
+    return Breakouts.find({ meetingId: '' });
+  }
+
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
   Logger.debug(`Publishing Breakouts for ${meetingId} ${requesterUserId}`);
 
   if (moderator) {
diff --git a/bigbluebutton-html5/imports/api/captions/server/methods/takeOwnership.js b/bigbluebutton-html5/imports/api/captions/server/methods/takeOwnership.js
index e541239a83a2c2bf7e2acbf7e363594e1150c0f4..51b176a2a61ebeb5c2a9136281535e169653b009 100644
--- a/bigbluebutton-html5/imports/api/captions/server/methods/takeOwnership.js
+++ b/bigbluebutton-html5/imports/api/captions/server/methods/takeOwnership.js
@@ -1,12 +1,11 @@
 import { check } from 'meteor/check';
 import Captions from '/imports/api/captions';
 import updateOwnerId from '/imports/api/captions/server/modifiers/updateOwnerId';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-export default function takeOwnership(credentials, locale) {
-  const { meetingId, requesterUserId } = credentials;
+export default function takeOwnership(locale) {
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
-  check(meetingId, String);
-  check(requesterUserId, String);
   check(locale, String);
 
   const pad = Captions.findOne({ meetingId, padId: { $regex: `_captions_${locale}$` } });
diff --git a/bigbluebutton-html5/imports/api/captions/server/methods/updateOwner.js b/bigbluebutton-html5/imports/api/captions/server/methods/updateOwner.js
index 2262e818af7e563f808510a048a77a9fce2f484f..3608ec308511463fd09d72813e2b33f3cd969175 100644
--- a/bigbluebutton-html5/imports/api/captions/server/methods/updateOwner.js
+++ b/bigbluebutton-html5/imports/api/captions/server/methods/updateOwner.js
@@ -4,7 +4,7 @@ import Logger from '/imports/startup/server/logger';
 import { Meteor } from 'meteor/meteor';
 import { check } from 'meteor/check';
 
-export default function editCaptions(meetingId, userId, padId) {
+export default function editCaptions(meetingId, userId, padId) { // TODO
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
   const EVENT_NAME = 'UpdateCaptionOwnerPubMsg';
diff --git a/bigbluebutton-html5/imports/api/captions/server/publishers.js b/bigbluebutton-html5/imports/api/captions/server/publishers.js
index 245954527e1aa4f6839650ebfc89c8f9341398a8..fc4ce428297ba74496f08a4501f7aa7e0514c142 100644
--- a/bigbluebutton-html5/imports/api/captions/server/publishers.js
+++ b/bigbluebutton-html5/imports/api/captions/server/publishers.js
@@ -1,13 +1,13 @@
 import Captions from '/imports/api/captions';
 import { Meteor } from 'meteor/meteor';
-import { check } from 'meteor/check';
 import Logger from '/imports/startup/server/logger';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-function captions(credentials) {
-  const { meetingId } = credentials;
-
-  check(meetingId, String);
-
+function captions() {
+  if (!this.userId) {
+    return Captions.find({ meetingId: '' });
+  }
+  const { meetingId } = extractCredentials(this.userId);
   Logger.debug(`Publishing Captions for ${meetingId}`);
 
   return Captions.find({ meetingId });
diff --git a/bigbluebutton-html5/imports/api/common/server/helpers.js b/bigbluebutton-html5/imports/api/common/server/helpers.js
index d4208347344d6ad4fba2bd339ea4bd517285500d..99720cbdb8594cda151eee7b2cda1893e847e65f 100755
--- a/bigbluebutton-html5/imports/api/common/server/helpers.js
+++ b/bigbluebutton-html5/imports/api/common/server/helpers.js
@@ -1,4 +1,3 @@
-import WhiteboardMultiUser from '/imports/api/whiteboard-multi-user/';
 import Users from '/imports/api/users';
 
 const MSG_DIRECT_TYPE = 'DIRECT';
@@ -39,17 +38,6 @@ export const processForHTML5ServerOnly = fn => (message, ...args) => {
   return fn(message, ...args);
 };
 
-
-export const getMultiUserStatus = (meetingId, whiteboardId) => {
-  const data = WhiteboardMultiUser.findOne({ meetingId, whiteboardId });
-
-  if (data) {
-    return data.multiUser;
-  }
-
-  return false;
-};
-
 /**
  * Calculate a 32 bit FNV-1a hash
  * Found here: https://gist.github.com/vaiorabbit/5657561
@@ -75,3 +63,11 @@ export const hashFNV32a = (str, asString, seed) => {
   return hval >>> 0;
 };
 /* eslint-enable */
+
+export const extractCredentials = (credentials) => {
+  if (!credentials) return {};
+  const credentialsArray = credentials.split('--');
+  const meetingId = credentialsArray[0];
+  const requesterUserId = credentialsArray[1];
+  return { meetingId, requesterUserId };
+};
diff --git a/bigbluebutton-html5/imports/api/cursor/server/methods/publishCursorUpdate.js b/bigbluebutton-html5/imports/api/cursor/server/methods/publishCursorUpdate.js
index c5690c00dee77492bcf34882f9baad419e55ccc3..0ee0dbc411ddcc3697c39a9ca2682634dce087e0 100755
--- a/bigbluebutton-html5/imports/api/cursor/server/methods/publishCursorUpdate.js
+++ b/bigbluebutton-html5/imports/api/cursor/server/methods/publishCursorUpdate.js
@@ -1,38 +1,10 @@
-import { getMultiUserStatus } from '/imports/api/common/server/helpers';
 import RedisPubSub from '/imports/startup/server/redis';
 import { Meteor } from 'meteor/meteor';
-import { check } from 'meteor/check';
 
-import isPodPresenter from '/imports/api/presentation-pods/server/utils/isPodPresenter';
-
-export default function publishCursorUpdate(credentials, payload) {
+export default function publishCursorUpdate(meetingId, requesterUserId, payload) {
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
   const EVENT_NAME = 'SendCursorPositionPubMsg';
 
-  const { meetingId, requesterUserId, requesterToken } = credentials;
-
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(requesterToken, String);
-  check(payload, {
-    xPercent: Number,
-    yPercent: Number,
-    whiteboardId: String,
-  });
-
-  const {
-    whiteboardId,
-    xPercent,
-    yPercent,
-  } = payload;
-
-  const allowed = isPodPresenter(meetingId, whiteboardId, requesterUserId)
-    || getMultiUserStatus(meetingId, whiteboardId)
-    || (xPercent < 0 && yPercent < 0);
-  if (!allowed) {
-    throw new Meteor.Error('not-allowed', `User ${requesterUserId} is not allowed to move the cursor`);
-  }
-
   return RedisPubSub.publishUserMessage(CHANNEL, EVENT_NAME, meetingId, requesterUserId, payload);
 }
diff --git a/bigbluebutton-html5/imports/api/cursor/server/streamer.js b/bigbluebutton-html5/imports/api/cursor/server/streamer.js
index 4c3218960b71813ef6b108f3fb04f9d5c9a7d95d..d8a869c48ccf1d4ef1f7f510db4a918275f4b709 100644
--- a/bigbluebutton-html5/imports/api/cursor/server/streamer.js
+++ b/bigbluebutton-html5/imports/api/cursor/server/streamer.js
@@ -26,7 +26,7 @@ export function addCursorStreamer(meetingId) {
   });
 
   streamer.on('publish', (message) => {
-    publishCursorUpdate(message.credentials, message.payload);
+    publishCursorUpdate(meetingId, message.userId, message.payload);
   });
 }
 
diff --git a/bigbluebutton-html5/imports/api/external-videos/server/methods/destroyExternalVideo.js b/bigbluebutton-html5/imports/api/external-videos/server/methods/destroyExternalVideo.js
index cd2b1772e37a6e3f2d1ae4bd8e60c9808dfdcf64..0be97c31985c1188cec4c5a9c228ed4eaf9a0352 100644
--- a/bigbluebutton-html5/imports/api/external-videos/server/methods/destroyExternalVideo.js
+++ b/bigbluebutton-html5/imports/api/external-videos/server/methods/destroyExternalVideo.js
@@ -8,4 +8,4 @@ export default function destroyExternalVideo(meetingId) {
     Logger.info(`Destroying External Video streamer object for ${streamName}`);
     delete Meteor.StreamerCentral.instances[streamName];
   }
-};
+}
diff --git a/bigbluebutton-html5/imports/api/external-videos/server/methods/initializeExternalVideo.js b/bigbluebutton-html5/imports/api/external-videos/server/methods/initializeExternalVideo.js
index 459d99bd9be2f19fb9fd6592fe71c869924d9f41..84d08a8c2cffabbe0e670ee22dd39ba195882e0c 100644
--- a/bigbluebutton-html5/imports/api/external-videos/server/methods/initializeExternalVideo.js
+++ b/bigbluebutton-html5/imports/api/external-videos/server/methods/initializeExternalVideo.js
@@ -1,5 +1,5 @@
 import { Meteor } from 'meteor/meteor';
-import { check } from 'meteor/check';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 import Users from '/imports/api/users';
 import Logger from '/imports/startup/server/logger';
 
@@ -19,10 +19,8 @@ const allowFromPresenter = (eventName, message) => {
   return ret;
 };
 
-export default function initializeExternalVideo(credentials) {
-  const { meetingId } = credentials;
-
-  check(meetingId, String);
+export default function initializeExternalVideo() {
+  const { meetingId } = extractCredentials(this.userId);
 
   const streamName = `external-videos-${meetingId}`;
   if (!Meteor.StreamerCentral.instances[streamName]) {
diff --git a/bigbluebutton-html5/imports/api/external-videos/server/methods/startWatchingExternalVideo.js b/bigbluebutton-html5/imports/api/external-videos/server/methods/startWatchingExternalVideo.js
index 407d8a2b0903f037979c9528eca0f70f24ed42a0..e157b7a0b3e0ede194b9d16fa76152a59633bc1b 100644
--- a/bigbluebutton-html5/imports/api/external-videos/server/methods/startWatchingExternalVideo.js
+++ b/bigbluebutton-html5/imports/api/external-videos/server/methods/startWatchingExternalVideo.js
@@ -3,17 +3,16 @@ import { check } from 'meteor/check';
 import Logger from '/imports/startup/server/logger';
 import Meetings from '/imports/api/meetings';
 import RedisPubSub from '/imports/startup/server/redis';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-export default function startWatchingExternalVideo(credentials, options) {
+export default function startWatchingExternalVideo(options) {
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
   const EVENT_NAME = 'StartExternalVideoMsg';
 
-  const { meetingId, requesterUserId } = credentials;
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
   const { externalVideoUrl } = options;
 
-  check(meetingId, String);
-  check(requesterUserId, String);
   check(externalVideoUrl, String);
 
   Meetings.update({ meetingId }, { $set: { externalVideoUrl } });
diff --git a/bigbluebutton-html5/imports/api/external-videos/server/methods/stopWatchingExternalVideo.js b/bigbluebutton-html5/imports/api/external-videos/server/methods/stopWatchingExternalVideo.js
index 67f6eef54a5c6b4a588720d8612aa08037f94826..5165e73e085672b881844a9d5412ddc976067a9e 100644
--- a/bigbluebutton-html5/imports/api/external-videos/server/methods/stopWatchingExternalVideo.js
+++ b/bigbluebutton-html5/imports/api/external-videos/server/methods/stopWatchingExternalVideo.js
@@ -1,19 +1,13 @@
 import { Meteor } from 'meteor/meteor';
-import { check } from 'meteor/check';
 import Logger from '/imports/startup/server/logger';
 import Meetings from '/imports/api/meetings';
 import RedisPubSub from '/imports/startup/server/redis';
 
-export default function stopWatchingExternalVideo(credentials) {
+export default function stopWatchingExternalVideo(meetingId, requesterUserId) {
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
   const EVENT_NAME = 'StopExternalVideoMsg';
 
-  const { meetingId, requesterUserId } = credentials;
-
-  check(meetingId, String);
-  check(requesterUserId, String);
-
   const meeting = Meetings.findOne({ meetingId });
   if (!meeting || meeting.externalVideoUrl === null) return;
 
diff --git a/bigbluebutton-html5/imports/api/group-chat-msg/server/methods/clearPublicChatHistory.js b/bigbluebutton-html5/imports/api/group-chat-msg/server/methods/clearPublicChatHistory.js
index 1044404b39f7508f1d6f3cd5596d56626b983b94..df88282d41d3fe5d86172de81dabf8413eddc708 100644
--- a/bigbluebutton-html5/imports/api/group-chat-msg/server/methods/clearPublicChatHistory.js
+++ b/bigbluebutton-html5/imports/api/group-chat-msg/server/methods/clearPublicChatHistory.js
@@ -1,19 +1,15 @@
 import { Meteor } from 'meteor/meteor';
-import { check } from 'meteor/check';
 import RedisPubSub from '/imports/startup/server/redis';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-export default function clearPublicChatHistory(credentials) {
+export default function clearPublicChatHistory() {
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
   const EVENT_NAME = 'ClearPublicChatHistoryPubMsg';
   const CHAT_CONFIG = Meteor.settings.public.chat;
   const PUBLIC_GROUP_CHAT_ID = CHAT_CONFIG.public_group_id;
 
-  const { meetingId, requesterUserId, requesterToken } = credentials;
-
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(requesterToken, String);
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
   const payload = {
     chatId: PUBLIC_GROUP_CHAT_ID,
diff --git a/bigbluebutton-html5/imports/api/group-chat-msg/server/methods/sendGroupChatMsg.js b/bigbluebutton-html5/imports/api/group-chat-msg/server/methods/sendGroupChatMsg.js
index 5d4aa6882e926786bdbd298a2257c431126e0096..f486cdfe6c56ee17e8867fcd804b49119dceb2f8 100644
--- a/bigbluebutton-html5/imports/api/group-chat-msg/server/methods/sendGroupChatMsg.js
+++ b/bigbluebutton-html5/imports/api/group-chat-msg/server/methods/sendGroupChatMsg.js
@@ -2,6 +2,7 @@ import { Meteor } from 'meteor/meteor';
 import { check } from 'meteor/check';
 import RedisPubSub from '/imports/startup/server/redis';
 import RegexWebUrl from '/imports/utils/regex-weburl';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
 const HTML_SAFE_MAP = {
   '<': '&lt;',
@@ -26,16 +27,13 @@ const parseMessage = (message) => {
   return parsedMessage;
 };
 
-export default function sendGroupChatMsg(credentials, chatId, message) {
+export default function sendGroupChatMsg(chatId, message) {
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
   const EVENT_NAME = 'SendGroupChatMessageMsg';
 
-  const { meetingId, requesterUserId, requesterToken } = credentials;
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(requesterToken, String);
   check(message, Object);
 
   const parsedMessage = parseMessage(message.message);
diff --git a/bigbluebutton-html5/imports/api/group-chat-msg/server/methods/startUserTyping.js b/bigbluebutton-html5/imports/api/group-chat-msg/server/methods/startUserTyping.js
index 4b88e07055e5f1ed5f219ac370dd90260f8e696d..b46288d80e6d27f07a02eff1862cf328ff5c4a93 100644
--- a/bigbluebutton-html5/imports/api/group-chat-msg/server/methods/startUserTyping.js
+++ b/bigbluebutton-html5/imports/api/group-chat-msg/server/methods/startUserTyping.js
@@ -1,17 +1,16 @@
 import { Meteor } from 'meteor/meteor';
 import { check } from 'meteor/check';
 import RedisPubSub from '/imports/startup/server/redis';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-export default function startUserTyping(credentials, chatId) {
+export default function startUserTyping(chatId) {
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
   const EVENT_NAME = 'UserTypingPubMsg';
   const CHAT_CONFIG = Meteor.settings.public.chat;
   const PUBLIC_GROUP_CHAT_ID = CHAT_CONFIG.public_group_id;
-  const { meetingId, requesterUserId } = credentials;
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
-  check(meetingId, String);
-  check(requesterUserId, String);
   check(chatId, String);
 
   const payload = {
diff --git a/bigbluebutton-html5/imports/api/group-chat-msg/server/methods/stopUserTyping.js b/bigbluebutton-html5/imports/api/group-chat-msg/server/methods/stopUserTyping.js
index 582f1d95de3f294e8d7babc4d68990c3098a6786..12cdaefa07a4b6f28cf004a798aeb71fab4619a1 100644
--- a/bigbluebutton-html5/imports/api/group-chat-msg/server/methods/stopUserTyping.js
+++ b/bigbluebutton-html5/imports/api/group-chat-msg/server/methods/stopUserTyping.js
@@ -1,12 +1,9 @@
-import { check } from 'meteor/check';
 import { UsersTyping } from '/imports/api/group-chat-msg';
 import stopTyping from '../modifiers/stopTyping';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-export default function stopUserTyping(credentials) {
-  const { meetingId, requesterUserId } = credentials;
-
-  check(meetingId, String);
-  check(requesterUserId, String);
+export default function stopUserTyping() {
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
   const userTyping = UsersTyping.findOne({
     meetingId,
diff --git a/bigbluebutton-html5/imports/api/group-chat-msg/server/publishers.js b/bigbluebutton-html5/imports/api/group-chat-msg/server/publishers.js
index cc9282cdfe1e5d3da6192560e5bb14ecb7f060e7..3b22d84ddfb66293825f636ead554d03da391bee 100644
--- a/bigbluebutton-html5/imports/api/group-chat-msg/server/publishers.js
+++ b/bigbluebutton-html5/imports/api/group-chat-msg/server/publishers.js
@@ -1,20 +1,19 @@
 import { GroupChatMsg, UsersTyping } from '/imports/api/group-chat-msg';
 import { Meteor } from 'meteor/meteor';
-import { check } from 'meteor/check';
 
 import Logger from '/imports/startup/server/logger';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-function groupChatMsg(credentials, chatsIds) {
-  const { meetingId, requesterUserId, requesterToken } = credentials;
-
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(requesterToken, String);
+function groupChatMsg(chatsIds) {
+  if (!this.userId) {
+    return GroupChatMsg.find({ meetingId: '' });
+  }
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
   const CHAT_CONFIG = Meteor.settings.public.chat;
   const PUBLIC_GROUP_CHAT_ID = CHAT_CONFIG.public_group_id;
 
-  Logger.debug(`Publishing group-chat-msg for ${meetingId} ${requesterUserId} ${requesterToken}`);
+  Logger.debug(`Publishing group-chat-msg for ${meetingId} ${requesterUserId}`);
 
   return GroupChatMsg.find({
     $or: [
@@ -31,12 +30,12 @@ function publish(...args) {
 
 Meteor.publish('group-chat-msg', publish);
 
-function usersTyping(credentials) {
-  const { meetingId, requesterUserId, requesterToken } = credentials;
+function usersTyping() {
+  if (!this.userId) {
+    return UsersTyping.find({ meetingId: '' });
+  }
 
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(requesterToken, String);
+  const { meetingId } = extractCredentials(this.userId);
 
   return UsersTyping.find({ meetingId });
 }
diff --git a/bigbluebutton-html5/imports/api/group-chat/server/methods/createGroupChat.js b/bigbluebutton-html5/imports/api/group-chat/server/methods/createGroupChat.js
index df2bc90d48d3d8fca5c6ab1f7703e414399f12e3..2244289cc84a9300b87a3dd5a548b9da73f51d4a 100644
--- a/bigbluebutton-html5/imports/api/group-chat/server/methods/createGroupChat.js
+++ b/bigbluebutton-html5/imports/api/group-chat/server/methods/createGroupChat.js
@@ -2,18 +2,15 @@ import { Meteor } from 'meteor/meteor';
 import { check } from 'meteor/check';
 import RedisPubSub from '/imports/startup/server/redis';
 import { CHAT_ACCESS_PRIVATE } from '/imports/api/group-chat';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-
-export default function createGroupChat(credentials, receiver) {
+export default function createGroupChat(receiver) {
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
   const EVENT_NAME = 'CreateGroupChatReqMsg';
 
-  const { meetingId, requesterUserId, requesterToken } = credentials;
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(requesterToken, String);
   check(receiver, Object);
 
   const payload = {
diff --git a/bigbluebutton-html5/imports/api/group-chat/server/methods/destroyGroupChat.js b/bigbluebutton-html5/imports/api/group-chat/server/methods/destroyGroupChat.js
index 99a0fa481a15a52243505dbe64fb5935aac11f12..fc221e22298862947b674abf9a7fcad246013022 100644
--- a/bigbluebutton-html5/imports/api/group-chat/server/methods/destroyGroupChat.js
+++ b/bigbluebutton-html5/imports/api/group-chat/server/methods/destroyGroupChat.js
@@ -1,15 +1,11 @@
 import { Meteor } from 'meteor/meteor';
-import { check } from 'meteor/check';
 import RedisPubSub from '/imports/startup/server/redis';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-export default function createGroupChat(credentials) {
+export default function createGroupChat() {
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
-  const { meetingId, requesterUserId, requesterToken } = credentials;
-
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(requesterToken, String);
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
   const eventName = 'DestroyGroupChatReqMsg';
 
diff --git a/bigbluebutton-html5/imports/api/group-chat/server/publishers.js b/bigbluebutton-html5/imports/api/group-chat/server/publishers.js
index d967f1310309a624e3d2388cbcef1024840cc7a3..f03ad0586ae0eb28675eefe2fb663083190b5acb 100644
--- a/bigbluebutton-html5/imports/api/group-chat/server/publishers.js
+++ b/bigbluebutton-html5/imports/api/group-chat/server/publishers.js
@@ -1,20 +1,19 @@
 import GroupChat from '/imports/api/group-chat';
 import { Meteor } from 'meteor/meteor';
-import { check } from 'meteor/check';
 
 import Logger from '/imports/startup/server/logger';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-function groupChat(credentials) {
-  const { meetingId, requesterUserId, requesterToken } = credentials;
-
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(requesterToken, String);
+function groupChat() {
+  if (!this.userId) {
+    return GroupChat.find({ meetingId: '' });
+  }
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
   const CHAT_CONFIG = Meteor.settings.public.chat;
   const PUBLIC_CHAT_TYPE = CHAT_CONFIG.type_public;
 
-  Logger.debug(`Publishing group-chat for ${meetingId} ${requesterUserId} ${requesterToken}`);
+  Logger.debug(`Publishing group-chat for ${meetingId} ${requesterUserId}`);
 
   return GroupChat.find({
     $or: [
diff --git a/bigbluebutton-html5/imports/api/guest-users/server/methods/allowPendingUsers.js b/bigbluebutton-html5/imports/api/guest-users/server/methods/allowPendingUsers.js
index 090ad1662127b0d7f5302bacd8e96081074f33f3..55837d56c238e3365086de887f057e202a31d66d 100644
--- a/bigbluebutton-html5/imports/api/guest-users/server/methods/allowPendingUsers.js
+++ b/bigbluebutton-html5/imports/api/guest-users/server/methods/allowPendingUsers.js
@@ -2,21 +2,15 @@ import { Meteor } from 'meteor/meteor';
 import { check } from 'meteor/check';
 import RedisPubSub from '/imports/startup/server/redis';
 import Logger from '/imports/startup/server/logger';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
 const REDIS_CONFIG = Meteor.settings.private.redis;
 const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
 const EVENT_NAME = 'GuestsWaitingApprovedMsg';
 
-export default function allowPendingUsers(credentials, guests, status) {
-  const {
-    meetingId,
-    requesterUserId,
-    requesterToken,
-  } = credentials;
+export default function allowPendingUsers(guests, status) {
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(requesterToken, String);
   check(guests, Array);
   const mappedGuests = guests.map(guest => ({ status, guest: guest.intId }));
 
@@ -24,7 +18,6 @@ export default function allowPendingUsers(credentials, guests, status) {
     approvedBy: requesterUserId,
     guests: mappedGuests,
   };
-  
 
   Logger.info(`User=${requesterUserId} ${status} guests ${JSON.stringify(mappedGuests)}`);
 
diff --git a/bigbluebutton-html5/imports/api/guest-users/server/methods/changeGuestPolicy.js b/bigbluebutton-html5/imports/api/guest-users/server/methods/changeGuestPolicy.js
index 638993955884b635d7e5bc09971341e0e385949b..d0f7e140e56f5cfbe9230da8364d7bab2faa04db 100644
--- a/bigbluebutton-html5/imports/api/guest-users/server/methods/changeGuestPolicy.js
+++ b/bigbluebutton-html5/imports/api/guest-users/server/methods/changeGuestPolicy.js
@@ -2,21 +2,15 @@ import { Meteor } from 'meteor/meteor';
 import { check } from 'meteor/check';
 import RedisPubSub from '/imports/startup/server/redis';
 import Logger from '/imports/startup/server/logger';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
 const REDIS_CONFIG = Meteor.settings.private.redis;
 const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
 const EVENT_NAME = 'SetGuestPolicyCmdMsg';
 
-export default function changeGuestPolicy(credentials, policyRule) {
-  const {
-    meetingId,
-    requesterUserId,
-    requesterToken,
-  } = credentials;
+export default function changeGuestPolicy(policyRule) {
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(requesterToken, String);
   check(policyRule, String);
 
   const payload = {
diff --git a/bigbluebutton-html5/imports/api/guest-users/server/publishers.js b/bigbluebutton-html5/imports/api/guest-users/server/publishers.js
index de3f8fb14b785b7d390b25c6530774ab58a74589..23e41d51bcf9c48cf08af105b767415447bd1d1f 100644
--- a/bigbluebutton-html5/imports/api/guest-users/server/publishers.js
+++ b/bigbluebutton-html5/imports/api/guest-users/server/publishers.js
@@ -1,16 +1,16 @@
 import GuestUsers from '/imports/api/guest-users/';
 import { Meteor } from 'meteor/meteor';
-import { check } from 'meteor/check';
 import Logger from '/imports/startup/server/logger';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-function guestUsers(credentials) {
-  const { meetingId, requesterUserId, requesterToken } = credentials;
+function guestUsers() {
+  if (!this.userId) {
+    return GuestUsers.find({ meetingId: '' });
+  }
 
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(requesterToken, String);
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
-  Logger.info(`Publishing Slides for ${meetingId} ${requesterUserId} ${requesterToken}`);
+  Logger.info(`Publishing Slides for ${meetingId} ${requesterUserId}`);
 
   return GuestUsers.find({ meetingId });
 }
diff --git a/bigbluebutton-html5/imports/api/local-settings/server/methods/userChangedLocalSettings.js b/bigbluebutton-html5/imports/api/local-settings/server/methods/userChangedLocalSettings.js
index 032263d7bf191678cf135f2b480d37740dfb1409..4cb6a5d5615a4d4b73cd8847c4998fce2e8a15ef 100644
--- a/bigbluebutton-html5/imports/api/local-settings/server/methods/userChangedLocalSettings.js
+++ b/bigbluebutton-html5/imports/api/local-settings/server/methods/userChangedLocalSettings.js
@@ -2,14 +2,13 @@ import _ from 'lodash';
 import { check } from 'meteor/check';
 import LocalSettings from '/imports/api/local-settings';
 import setChangedLocalSettings from '../modifiers/setChangedLocalSettings';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-export default function userChangedLocalSettings(credentials, settings) {
-  const { meetingId, requesterUserId } = credentials;
+export default function userChangedLocalSettings(settings) {
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
   if (!meetingId || !requesterUserId) return;
 
-  check(meetingId, String);
-  check(requesterUserId, String);
   check(settings, Object);
 
   const userLocalSettings = LocalSettings
diff --git a/bigbluebutton-html5/imports/api/local-settings/server/publishers.js b/bigbluebutton-html5/imports/api/local-settings/server/publishers.js
index 74a581589530b6886b21a3e7e44693a538e90be3..b492c801f3011dc3fe4d4a6a6dab3445d24c3a02 100644
--- a/bigbluebutton-html5/imports/api/local-settings/server/publishers.js
+++ b/bigbluebutton-html5/imports/api/local-settings/server/publishers.js
@@ -1,13 +1,13 @@
 import { Meteor } from 'meteor/meteor';
-import { check } from 'meteor/check';
 import LocalSettings from '/imports/api/local-settings';
 import Logger from '/imports/startup/server/logger';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-function localSettings(credentials) {
-  const { meetingId, requesterUserId } = credentials;
-
-  check(meetingId, String);
-  check(requesterUserId, String);
+function localSettings() {
+  if (!this.userId) {
+    return LocalSettings.find({ meetingId: '' });
+  }
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
   Logger.debug(`Publishing local settings for user=${requesterUserId}`);
 
diff --git a/bigbluebutton-html5/imports/api/log-client/server/methods/logClient.js b/bigbluebutton-html5/imports/api/log-client/server/methods/logClient.js
index 837c8042bb3cc4be9f79586e5e46216203de6cea..d709aa1d7069c09e9e151196aa3c09f2fb0ef193 100755
--- a/bigbluebutton-html5/imports/api/log-client/server/methods/logClient.js
+++ b/bigbluebutton-html5/imports/api/log-client/server/methods/logClient.js
@@ -11,7 +11,7 @@ const logClient = function (type, logDescription, logCode = 'was_not_provided',
     userInfo,
   };
 
-  if (User) {
+  if (User) { // TODO--
     if ((userInfo.credentials && User.meetingId === userInfo.credentials.meetingId)
       || ((userInfo.meetingId && User.meetingId === userInfo.meetingId))) {
       logContents.extraInfo.validUser = 'valid';
diff --git a/bigbluebutton-html5/imports/api/meetings/server/methods/endMeeting.js b/bigbluebutton-html5/imports/api/meetings/server/methods/endMeeting.js
index d482dee1f02abcdac9d2f907d30628b6894ca039..2d8811e8fb6b358f68e1b32225d9a3c70acd2560 100644
--- a/bigbluebutton-html5/imports/api/meetings/server/methods/endMeeting.js
+++ b/bigbluebutton-html5/imports/api/meetings/server/methods/endMeeting.js
@@ -1,34 +1,18 @@
 import { Meteor } from 'meteor/meteor';
-import { check } from 'meteor/check';
 import RedisPubSub from '/imports/startup/server/redis';
 import Logger from '/imports/startup/server/logger';
-import Users from '/imports/api/users';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-export default function endMeeting(credentials) {
+export default function endMeeting() {
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
   const EVENT_NAME = 'LogoutAndEndMeetingCmdMsg';
-  const ROLE_MODERATOR = Meteor.settings.public.user.role_moderator;
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
-  const { meetingId, requesterUserId, requesterToken } = credentials;
-
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(requesterToken, String);
-
-  const selector = {
-    meetingId,
+  const payload = {
     userId: requesterUserId,
   };
-  const user = Users.findOne(selector);
-
-  if (!!user && user.role === ROLE_MODERATOR) {
-    const payload = {
-      userId: requesterUserId,
-    };
-
-    Logger.verbose(`Meeting '${meetingId}' is destroyed by '${requesterUserId}'`);
+  Logger.verbose(`Meeting '${meetingId}' is destroyed by '${requesterUserId}'`);
 
-    return RedisPubSub.publishUserMessage(CHANNEL, EVENT_NAME, meetingId, requesterUserId, payload);
-  }
+  return RedisPubSub.publishUserMessage(CHANNEL, EVENT_NAME, meetingId, requesterUserId, payload);
 }
diff --git a/bigbluebutton-html5/imports/api/meetings/server/methods/toggleLockSettings.js b/bigbluebutton-html5/imports/api/meetings/server/methods/toggleLockSettings.js
index 823840320736a9f12500ee0c6e5e7a1f216d45f4..152d6039475279dc27b176159542a641e54bb043 100755
--- a/bigbluebutton-html5/imports/api/meetings/server/methods/toggleLockSettings.js
+++ b/bigbluebutton-html5/imports/api/meetings/server/methods/toggleLockSettings.js
@@ -1,16 +1,14 @@
 import { Meteor } from 'meteor/meteor';
 import { check } from 'meteor/check';
 import RedisPubSub from '/imports/startup/server/redis';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-export default function toggleLockSettings(credentials, lockSettingsProps) {
+export default function toggleLockSettings(lockSettingsProps) {
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
   const EVENT_NAME = 'ChangeLockSettingsInMeetingCmdMsg';
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
-  const { meetingId, requesterUserId } = credentials;
-
-  check(meetingId, String);
-  check(requesterUserId, String);
   check(lockSettingsProps, {
     disableCam: Boolean,
     disableMic: Boolean,
diff --git a/bigbluebutton-html5/imports/api/meetings/server/methods/toggleRecording.js b/bigbluebutton-html5/imports/api/meetings/server/methods/toggleRecording.js
index 4d708c0564453178e0a8b9ae71c6ca7ca7b5cc15..0bf20e5211018b2a2e48b5bcbcedb8f1d2fe9e60 100644
--- a/bigbluebutton-html5/imports/api/meetings/server/methods/toggleRecording.js
+++ b/bigbluebutton-html5/imports/api/meetings/server/methods/toggleRecording.js
@@ -1,20 +1,16 @@
-import { check } from 'meteor/check';
 import Logger from '/imports/startup/server/logger';
 import { Meteor } from 'meteor/meteor';
 import RedisPubSub from '/imports/startup/server/redis';
 import { RecordMeetings } from '/imports/api/meetings';
 import Users from '/imports/api/users';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-export default function toggleRecording(credentials) {
+export default function toggleRecording() {
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
   const ROLE_MODERATOR = Meteor.settings.public.user.role_moderator;
-  const { meetingId, requesterUserId, requesterToken } = credentials;
-
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(requesterToken, String);
 
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
   const EVENT_NAME = 'SetRecordingStatusCmdMsg';
 
   let meetingRecorded;
@@ -30,7 +26,7 @@ export default function toggleRecording(credentials) {
     } = recordObject;
 
     meetingRecorded = recording;
-    allowedToRecord = record && allowStartStopRecording;
+    allowedToRecord = record && allowStartStopRecording; // TODO-- remove some day
   }
 
   const payload = {
diff --git a/bigbluebutton-html5/imports/api/meetings/server/methods/toggleWebcamsOnlyForModerator.js b/bigbluebutton-html5/imports/api/meetings/server/methods/toggleWebcamsOnlyForModerator.js
index 94935c51a76c87decedb9482d1b7b0f9c83f9bc2..93553bb128a0c5c15f49bb8400e0029a8361390e 100755
--- a/bigbluebutton-html5/imports/api/meetings/server/methods/toggleWebcamsOnlyForModerator.js
+++ b/bigbluebutton-html5/imports/api/meetings/server/methods/toggleWebcamsOnlyForModerator.js
@@ -1,16 +1,14 @@
 import { Meteor } from 'meteor/meteor';
 import { check } from 'meteor/check';
 import RedisPubSub from '/imports/startup/server/redis';
+import { extractCredentials } from '../../../common/server/helpers';
 
-export default function toggleWebcamsOnlyForModerator(credentials, webcamsOnlyForModerator) {
+export default function toggleWebcamsOnlyForModerator(webcamsOnlyForModerator) {
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
   const EVENT_NAME = 'UpdateWebcamsOnlyForModeratorCmdMsg';
 
-  const { meetingId, requesterUserId } = credentials;
-
-  check(meetingId, String);
-  check(requesterUserId, String);
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
   check(webcamsOnlyForModerator, Boolean);
 
   const payload = {
diff --git a/bigbluebutton-html5/imports/api/meetings/server/methods/transferUser.js b/bigbluebutton-html5/imports/api/meetings/server/methods/transferUser.js
index 6841e1147138b1d9bd1dabefa61a9965247640a4..628267300ec84c7fcc0909ea617c4ac9f76e22a2 100644
--- a/bigbluebutton-html5/imports/api/meetings/server/methods/transferUser.js
+++ b/bigbluebutton-html5/imports/api/meetings/server/methods/transferUser.js
@@ -1,18 +1,15 @@
 import { Meteor } from 'meteor/meteor';
-import { check } from 'meteor/check';
 import RedisPubSub from '/imports/startup/server/redis';
 import Logger from '/imports/startup/server/logger';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-export default function transferUser(credentials, fromMeetingId, toMeetingId) {
+
+export default function transferUser(fromMeetingId, toMeetingId) {
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
   const EVENT_NAME = 'TransferUserToMeetingRequestMsg';
 
-  const { meetingId, requesterUserId, requesterToken } = credentials;
-
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(requesterToken, String);
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
   const payload = {
     fromMeetingId,
diff --git a/bigbluebutton-html5/imports/api/meetings/server/publishers.js b/bigbluebutton-html5/imports/api/meetings/server/publishers.js
index af0012b942b25575e8efa72c777732ce5c9f7b3a..01a1e5452fe3a12556a799e7da4a6c25794f1eb2 100755
--- a/bigbluebutton-html5/imports/api/meetings/server/publishers.js
+++ b/bigbluebutton-html5/imports/api/meetings/server/publishers.js
@@ -1,19 +1,18 @@
 import { Meteor } from 'meteor/meteor';
-import { check } from 'meteor/check';
 import Meetings, { RecordMeetings, MeetingTimeRemaining } from '/imports/api/meetings';
 import Users from '/imports/api/users';
 import Logger from '/imports/startup/server/logger';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
 const ROLE_MODERATOR = Meteor.settings.public.user.role_moderator;
 
-function meetings(credentials, isModerator = false) {
-  const { meetingId, requesterUserId, requesterToken } = credentials;
-
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(requesterToken, String);
+function meetings(isModerator = false) {
+  if (!this.userId) {
+    return Meetings.find({ meetingId: '' });
+  }
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
-  Logger.debug(`Publishing meeting =${meetingId} ${requesterUserId} ${requesterToken}`);
+  Logger.debug(`Publishing meeting =${meetingId} ${requesterUserId}`);
 
   const selector = {
     $or: [
@@ -47,11 +46,11 @@ function publish(...args) {
 
 Meteor.publish('meetings', publish);
 
-function recordMeetings(credentials) {
-  const { meetingId, requesterUserId, requesterToken } = credentials;
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(requesterToken, String);
+function recordMeetings() {
+  if (!this.userId) {
+    return RecordMeetings.find({ meetingId: '' });
+  }
+  const { meetingId } = extractCredentials(this.userId);
 
   return RecordMeetings.find({ meetingId });
 }
@@ -62,11 +61,11 @@ function recordPublish(...args) {
 
 Meteor.publish('record-meetings', recordPublish);
 
-function meetingTimeRemaining(credentials) {
-  const { meetingId, requesterUserId, requesterToken } = credentials;
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(requesterToken, String);
+function meetingTimeRemaining() {
+  if (!this.userId) {
+    return MeetingTimeRemaining.find({ meetingId: '' });
+  }
+  const { meetingId } = extractCredentials(this.userId);
 
   return MeetingTimeRemaining.find({ meetingId });
 }
diff --git a/bigbluebutton-html5/imports/api/network-information/server/methods/userInstabilityDetected.js b/bigbluebutton-html5/imports/api/network-information/server/methods/userInstabilityDetected.js
index 790058e8e08ebdc9b4ea37c11ac6be2c138cdfd8..0d7955e4e72c5b250ed078d866ac738aaf7a6f0f 100644
--- a/bigbluebutton-html5/imports/api/network-information/server/methods/userInstabilityDetected.js
+++ b/bigbluebutton-html5/imports/api/network-information/server/methods/userInstabilityDetected.js
@@ -1,12 +1,10 @@
 import { check } from 'meteor/check';
 import NetworkInformation from '/imports/api/network-information';
 import Logger from '/imports/startup/server/logger';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-export default function userInstabilityDetected(credentials, sender) {
-  const { meetingId, requesterUserId: receiver } = credentials;
-
-  check(meetingId, String);
-  check(receiver, String);
+export default function userInstabilityDetected(sender) {
+  const { meetingId, requesterUserId: receiver } = extractCredentials(this.userId);
   check(sender, String);
 
   const payload = {
diff --git a/bigbluebutton-html5/imports/api/network-information/server/publisher.js b/bigbluebutton-html5/imports/api/network-information/server/publisher.js
index 0e83b5cb9e987e80eb03f395f64fbf57a6aa4062..cef87a33ea2fc2ddd925884c80dbae699d893674 100644
--- a/bigbluebutton-html5/imports/api/network-information/server/publisher.js
+++ b/bigbluebutton-html5/imports/api/network-information/server/publisher.js
@@ -1,11 +1,12 @@
 import { Meteor } from 'meteor/meteor';
-import { check } from 'meteor/check';
 import NetworkInformation from '/imports/api/network-information';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-function networkInformation(credentials) {
-  const { meetingId } = credentials;
-
-  check(meetingId, String);
+function networkInformation() {
+  if (!this.userId) {
+    return NetworkInformation.find({ meetingId: '' });
+  }
+  const { meetingId } = extractCredentials(this.userId);
 
   return NetworkInformation.find({
     meetingId,
diff --git a/bigbluebutton-html5/imports/api/note/server/publishers.js b/bigbluebutton-html5/imports/api/note/server/publishers.js
index 2728b80f28722f925bdf797ef48d9bb3de7257e2..41092f671fe40b8f976bbee32afc028f2340c5d1 100644
--- a/bigbluebutton-html5/imports/api/note/server/publishers.js
+++ b/bigbluebutton-html5/imports/api/note/server/publishers.js
@@ -1,16 +1,15 @@
 import { Meteor } from 'meteor/meteor';
-import { check } from 'meteor/check';
 import Logger from '/imports/startup/server/logger';
 import Note from '/imports/api/note';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-function note(credentials) {
-  const { meetingId, requesterUserId, requesterToken } = credentials;
+function note() {
+  if (!this.userId) {
+    return Note.find({ meetingId: '' });
+  }
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(requesterToken, String);
-
-  Logger.info(`Publishing note for ${meetingId} ${requesterUserId} ${requesterToken}`);
+  Logger.info(`Publishing note for ${meetingId} ${requesterUserId}`);
 
   return Note.find({ meetingId });
 }
diff --git a/bigbluebutton-html5/imports/api/ping-pong/server/methods/ping.js b/bigbluebutton-html5/imports/api/ping-pong/server/methods/ping.js
index 4b4e3e880cb03ca20478176d00aab6a6d19c9be9..7fcd87b81c8e401d9b155045cdfce8dd5bcf9ceb 100644
--- a/bigbluebutton-html5/imports/api/ping-pong/server/methods/ping.js
+++ b/bigbluebutton-html5/imports/api/ping-pong/server/methods/ping.js
@@ -1,13 +1,9 @@
-import { check } from 'meteor/check';
 import Users from '/imports/api/users';
 import Logger from '/imports/startup/server/logger';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-export default function ping(credentials) {
-  const { meetingId, requesterUserId, requesterToken } = credentials;
-
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(requesterToken, String);
+export default function ping() {
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
   const selector = {
     meetingId,
diff --git a/bigbluebutton-html5/imports/api/ping-pong/server/publishers.js b/bigbluebutton-html5/imports/api/ping-pong/server/publishers.js
index 972393535e504ce3757c38326dd3a2f8544c96b0..bacb6ed8f38033d964e5b61def6e7876c1f23e74 100644
--- a/bigbluebutton-html5/imports/api/ping-pong/server/publishers.js
+++ b/bigbluebutton-html5/imports/api/ping-pong/server/publishers.js
@@ -1,6 +1,7 @@
 import { Meteor } from 'meteor/meteor';
 import Logger from '/imports/startup/server/logger';
 import _ from 'lodash';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
 const COLLECTION_NAME = 'ping-pong';
 const INTERVAL_IN_SETTINGS = (Meteor.settings.public.pingPong.clearUsersInSeconds) * 1000;
@@ -9,8 +10,11 @@ const PONG_INTERVAL_IN_SETTINGS = (Meteor.settings.public.pingPong.pongTimeInSec
 const PONG_INTERVAL = PONG_INTERVAL_IN_SETTINGS >= (INTERVAL_TIME / 2)
   ? (INTERVAL_TIME / 2) : PONG_INTERVAL_IN_SETTINGS;
 
-function pingPong(credentials) {
-  const { meetingId, requesterUserId } = credentials;
+function pingPong() {
+  if (!this.userId) {
+    return; // TODO-- is there a more appropriate set to return?
+  }
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
   const id = _.uniqueId('pong-');
   Logger.info(`Starting ping-pong publish for userId: ${requesterUserId}`);
   const pongSender = (interval) => {
diff --git a/bigbluebutton-html5/imports/api/polls/server/methods/publishPoll.js b/bigbluebutton-html5/imports/api/polls/server/methods/publishPoll.js
index b2f40f9fae17b4b8753b4af1f29f539c1916858a..701bea3b5c46f585c95bd0ac947bb23c903ae5a4 100644
--- a/bigbluebutton-html5/imports/api/polls/server/methods/publishPoll.js
+++ b/bigbluebutton-html5/imports/api/polls/server/methods/publishPoll.js
@@ -1,18 +1,15 @@
 import RedisPubSub from '/imports/startup/server/redis';
-import { check } from 'meteor/check';
 import Polls from '/imports/api/polls';
 import Logger from '/imports/startup/server/logger';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-export default function publishPoll(credentials) {
-  const { meetingId, requesterUserId } = credentials;
+export default function publishPoll() {
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
   const EVENT_NAME = 'ShowPollResultReqMsg';
 
-  check(meetingId, String);
-  check(requesterUserId, String);
-
-  const poll = Polls.findOne({ meetingId });
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
+  const poll = Polls.findOne({ meetingId }); // TODO--send pollid from client
   if (!poll) {
     Logger.error(`Attempted to publish inexisting poll for meetingId: ${meetingId}`);
     return false;
diff --git a/bigbluebutton-html5/imports/api/polls/server/methods/publishVote.js b/bigbluebutton-html5/imports/api/polls/server/methods/publishVote.js
index 63985bd8e62e244be654085b7d0705463b72dbbc..66b6dd938b5870463812b7982bec77cc30332e91 100644
--- a/bigbluebutton-html5/imports/api/polls/server/methods/publishVote.js
+++ b/bigbluebutton-html5/imports/api/polls/server/methods/publishVote.js
@@ -2,14 +2,14 @@ import RedisPubSub from '/imports/startup/server/redis';
 import { check } from 'meteor/check';
 import Polls from '/imports/api/polls';
 import Logger from '/imports/startup/server/logger';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-export default function publishVote(credentials, id, pollAnswerId) { // TODO discuss location
+export default function publishVote(id, pollAnswerId) { // TODO discuss location
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
   const EVENT_NAME = 'RespondToPollReqMsg';
 
-  const { meetingId, requesterUserId } = credentials;
-
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
   /*
    We keep an array of people who were in the meeting at the time the poll
    was started. The poll is published to them only.
@@ -22,8 +22,6 @@ export default function publishVote(credentials, id, pollAnswerId) { // TODO dis
     id,
   });
 
-  check(meetingId, String);
-  check(requesterUserId, String);
   check(pollAnswerId, Number);
   check(currentPoll, Object);
   check(currentPoll.meetingId, String);
diff --git a/bigbluebutton-html5/imports/api/polls/server/methods/startPoll.js b/bigbluebutton-html5/imports/api/polls/server/methods/startPoll.js
index 7f4722837a881088b52a508d751f0ec4fd1a287d..f6a08e3dd9045736783f28c8ef4ada7375048bbc 100644
--- a/bigbluebutton-html5/imports/api/polls/server/methods/startPoll.js
+++ b/bigbluebutton-html5/imports/api/polls/server/methods/startPoll.js
@@ -1,16 +1,15 @@
 import RedisPubSub from '/imports/startup/server/redis';
-import Polls from '/imports/api/polls';
 import { check } from 'meteor/check';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-export default function startPoll(credentials, pollType, pollId, answers) {
-  const { meetingId, requesterUserId } = credentials;
+export default function startPoll(pollType, pollId, answers) {
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
 
   let EVENT_NAME = 'StartPollReqMsg';
 
-  check(meetingId, String);
-  check(requesterUserId, String);
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
+
   check(pollId, String);
   check(pollType, String);
 
diff --git a/bigbluebutton-html5/imports/api/polls/server/methods/stopPoll.js b/bigbluebutton-html5/imports/api/polls/server/methods/stopPoll.js
index 0d20a850b39a268e470e2ca58b245b8bbb47ca1b..af0c50dd007bf60700260495483e8a696c465869 100644
--- a/bigbluebutton-html5/imports/api/polls/server/methods/stopPoll.js
+++ b/bigbluebutton-html5/imports/api/polls/server/methods/stopPoll.js
@@ -1,20 +1,17 @@
 import RedisPubSub from '/imports/startup/server/redis';
-import { check } from 'meteor/check';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-export default function stopPoll(credentials) {
-  const { meetingId, requesterUserId } = credentials;
+export default function stopPoll() {
+  const { meetingId, requesterUserId: requesterId } = extractCredentials(this.userId);
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
   const EVENT_NAME = 'StopPollReqMsg';
 
-  check(meetingId, String);
-  check(requesterUserId, String);
-
   return RedisPubSub.publishUserMessage(
     CHANNEL,
     EVENT_NAME,
     meetingId,
-    requesterUserId,
-    ({ requesterId: requesterUserId }),
+    requesterId,
+    ({ requesterId }),
   );
 }
diff --git a/bigbluebutton-html5/imports/api/polls/server/publishers.js b/bigbluebutton-html5/imports/api/polls/server/publishers.js
index c2e018fe6f176a7e930b8b758fe513e30dd14ce6..70804193fc6eef13403017c75a2d1b373e16cb9b 100644
--- a/bigbluebutton-html5/imports/api/polls/server/publishers.js
+++ b/bigbluebutton-html5/imports/api/polls/server/publishers.js
@@ -1,10 +1,13 @@
 import { Meteor } from 'meteor/meteor';
-import { check } from 'meteor/check';
 import Logger from '/imports/startup/server/logger';
 import Polls from '/imports/api/polls';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-Meteor.publish('current-poll', (meetingId) => {
-  check(meetingId, String);
+function currentPoll() {
+  if (!this.userId) {
+    return Polls.find({ meetingId: '' });
+  }
+  const { meetingId } = extractCredentials(this.userId);
 
   const selector = {
     meetingId,
@@ -13,17 +16,24 @@ Meteor.publish('current-poll', (meetingId) => {
   Logger.debug(`Publishing poll for meeting=${meetingId}`);
 
   return Polls.find(selector);
-});
+}
+
+function publishCurrentPoll(...args) {
+  const boundPolls = currentPoll.bind(this);
+  return boundPolls(...args);
+}
+
+Meteor.publish('current-poll', publishCurrentPoll);
 
 
-function polls(credentials) {
-  const { meetingId, requesterUserId, requesterToken } = credentials;
+function polls() {
+  if (!this.userId) {
+    return Polls.find({ meetingId: '' });
+  }
 
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(requesterToken, String);
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
-  Logger.debug(`Publishing polls =${meetingId} ${requesterUserId} ${requesterToken}`);
+  Logger.debug(`Publishing polls =${meetingId} ${requesterUserId}`);
 
   const selector = {
     meetingId,
diff --git a/bigbluebutton-html5/imports/api/presentation-pods/server/methods/setPresenterInPodReqMsg.js b/bigbluebutton-html5/imports/api/presentation-pods/server/methods/setPresenterInPodReqMsg.js
index 8679aa62cf75357d4aa4ad916a512edcbbecac81..6408dd1311dfa2b4504751e05552c66304ebb691 100644
--- a/bigbluebutton-html5/imports/api/presentation-pods/server/methods/setPresenterInPodReqMsg.js
+++ b/bigbluebutton-html5/imports/api/presentation-pods/server/methods/setPresenterInPodReqMsg.js
@@ -2,7 +2,7 @@ import { Meteor } from 'meteor/meteor';
 import { check } from 'meteor/check';
 import RedisPubSub from '/imports/startup/server/redis';
 
-export default function setPresenterInPodReqMsg(credentials) {
+export default function setPresenterInPodReqMsg(credentials) { // TODO-- switch to meetingId, etc
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
   const EVENT_NAME = 'SetPresenterInPodReqMsg';
diff --git a/bigbluebutton-html5/imports/api/presentation-pods/server/publishers.js b/bigbluebutton-html5/imports/api/presentation-pods/server/publishers.js
index 908c10bccdfbd361c8f929dc4e57de5fff7a0c1f..439b47e22f961d5368536be1d332e2e6d8ff3664 100644
--- a/bigbluebutton-html5/imports/api/presentation-pods/server/publishers.js
+++ b/bigbluebutton-html5/imports/api/presentation-pods/server/publishers.js
@@ -1,16 +1,14 @@
 import { Meteor } from 'meteor/meteor';
-import { check } from 'meteor/check';
 import PresentationPods from '/imports/api/presentation-pods';
 import Logger from '/imports/startup/server/logger';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-function presentationPods(credentials) {
-  const { meetingId, requesterUserId, requesterToken } = credentials;
-
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(requesterToken, String);
-
-  Logger.debug(`Publishing presentation-pods for ${meetingId} ${requesterUserId} ${requesterToken}`);
+function presentationPods() {
+  if (!this.userId) {
+    return PresentationPods.find({ meetingId: '' });
+  }
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
+  Logger.debug(`Publishing presentation-pods for ${meetingId} ${requesterUserId}`);
 
   return PresentationPods.find({ meetingId });
 }
diff --git a/bigbluebutton-html5/imports/api/presentation-pods/server/utils/isPodPresenter.js b/bigbluebutton-html5/imports/api/presentation-pods/server/utils/isPodPresenter.js
deleted file mode 100755
index 48cfdc3e53a2e67a8735c842c94b6db8d6f2fcd8..0000000000000000000000000000000000000000
--- a/bigbluebutton-html5/imports/api/presentation-pods/server/utils/isPodPresenter.js
+++ /dev/null
@@ -1,9 +0,0 @@
-import { Slides } from '/imports/api/slides';
-import PresentationPods from '/imports/api/presentation-pods';
-
-export default function isPodPresenter(meetingId, whiteboardId, userId) {
-  const slide = Slides.findOne({ meetingId, id: whiteboardId });
-  const pod = PresentationPods.findOne({ meetingId, podId: slide.podId });
-
-  return pod.currentPresenterId === userId;
-}
diff --git a/bigbluebutton-html5/imports/api/presentation-upload-token/server/methods/requestPresentationUploadToken.js b/bigbluebutton-html5/imports/api/presentation-upload-token/server/methods/requestPresentationUploadToken.js
index ae0efc36329b6feac8d36179f07e7104c2f38ba3..b01937dea06bd8185c0ec961375ef9dd1f7e965d 100644
--- a/bigbluebutton-html5/imports/api/presentation-upload-token/server/methods/requestPresentationUploadToken.js
+++ b/bigbluebutton-html5/imports/api/presentation-upload-token/server/methods/requestPresentationUploadToken.js
@@ -1,15 +1,13 @@
 import RedisPubSub from '/imports/startup/server/redis';
 import { check } from 'meteor/check';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-export default function requestPresentationUploadToken(credentials, podId, filename) {
+export default function requestPresentationUploadToken(podId, filename) {
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
   const EVENT_NAME = 'PresentationUploadTokenReqMsg';
 
-  const { meetingId, requesterUserId } = credentials;
-
-  check(meetingId, String);
-  check(requesterUserId, String);
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
   check(podId, String);
   check(filename, String);
 
diff --git a/bigbluebutton-html5/imports/api/presentation-upload-token/server/methods/setUsedToken.js b/bigbluebutton-html5/imports/api/presentation-upload-token/server/methods/setUsedToken.js
index a09c9d7c1f658c0198c7042a0d68f6e98450666c..8bb0f725c97c121d0c3a6a1a64df61782196c53a 100644
--- a/bigbluebutton-html5/imports/api/presentation-upload-token/server/methods/setUsedToken.js
+++ b/bigbluebutton-html5/imports/api/presentation-upload-token/server/methods/setUsedToken.js
@@ -1,12 +1,9 @@
 import PresentationUploadToken from '/imports/api/presentation-upload-token';
 import Logger from '/imports/startup/server/logger';
-import { check } from 'meteor/check';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-export default function setUsedToken(credentials, authzToken) {
-  const { meetingId, requesterUserId, requesterToken } = credentials;
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(requesterToken, String);
+export default function setUsedToken(authzToken) {
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
   const payload = {
     $set: {
diff --git a/bigbluebutton-html5/imports/api/presentation-upload-token/server/publishers.js b/bigbluebutton-html5/imports/api/presentation-upload-token/server/publishers.js
index 50edcb12cf1143629cefde6f3889079356727879..ffd1d5f49626db48b753ee6e4a0cf093c83cd845 100644
--- a/bigbluebutton-html5/imports/api/presentation-upload-token/server/publishers.js
+++ b/bigbluebutton-html5/imports/api/presentation-upload-token/server/publishers.js
@@ -2,13 +2,13 @@ import { Meteor } from 'meteor/meteor';
 import { check } from 'meteor/check';
 import PresentationUploadToken from '/imports/api/presentation-upload-token';
 import Logger from '/imports/startup/server/logger';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-Meteor.publish('presentation-upload-token', (credentials, podId, filename) => {
-  const { meetingId, requesterUserId, requesterToken } = credentials;
-
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(requesterToken, String);
+function presentationUploadToken(podId, filename) {
+  if (!this.userId) {
+    return PresentationUploadToken.find({ meetingId: '' });
+  }
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
   check(podId, String);
   check(filename, String);
 
@@ -19,7 +19,14 @@ Meteor.publish('presentation-upload-token', (credentials, podId, filename) => {
     filename,
   };
 
-  Logger.debug(`Publishing PresentationUploadToken for ${meetingId} ${requesterUserId} ${requesterToken}`);
+  Logger.debug(`Publishing PresentationUploadToken for ${meetingId} ${requesterUserId}`);
 
   return PresentationUploadToken.find(selector);
-});
+}
+
+function publish(...args) {
+  const boundPresentationUploadToken = presentationUploadToken.bind(this);
+  return boundPresentationUploadToken(...args);
+}
+
+Meteor.publish('presentation-upload-token', publish);
diff --git a/bigbluebutton-html5/imports/api/presentations/server/methods/removePresentation.js b/bigbluebutton-html5/imports/api/presentations/server/methods/removePresentation.js
index 259fa4d5c6b78fdaa85120d303a6025989f11599..a4169aa0f3b064e0ca074c567830a62db862edf6 100644
--- a/bigbluebutton-html5/imports/api/presentations/server/methods/removePresentation.js
+++ b/bigbluebutton-html5/imports/api/presentations/server/methods/removePresentation.js
@@ -1,30 +1,17 @@
 import RedisPubSub from '/imports/startup/server/redis';
 import { check } from 'meteor/check';
-import Presentations from '/imports/api/presentations';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-export default function removePresentation(credentials, presentationId, podId) {
-  const PRESENTATION_CONFIG = Meteor.settings.public.presentation;
+export default function removePresentation(presentationId, podId) {
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
   const EVENT_NAME = 'RemovePresentationPubMsg';
 
-  const { meetingId, requesterUserId } = credentials;
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
-  check(meetingId, String);
-  check(requesterUserId, String);
   check(presentationId, String);
   check(podId, String);
 
-  const presentationToDelete = Presentations.findOne({
-    meetingId,
-    id: presentationId,
-    podId,
-  });
-
-  if (presentationToDelete.name === PRESENTATION_CONFIG.defaultPresentationFile) {
-    throw new Meteor.Error('not-allowed', 'You are not allowed to remove the default slide');
-  }
-
   const payload = {
     presentationId,
     podId,
diff --git a/bigbluebutton-html5/imports/api/presentations/server/methods/setPresentation.js b/bigbluebutton-html5/imports/api/presentations/server/methods/setPresentation.js
index 164370e313c4760d713d246a1395049f8b548456..ebe15cbe0daeac955a6c3ad6805c968dacea8af2 100644
--- a/bigbluebutton-html5/imports/api/presentations/server/methods/setPresentation.js
+++ b/bigbluebutton-html5/imports/api/presentations/server/methods/setPresentation.js
@@ -1,39 +1,20 @@
 import RedisPubSub from '/imports/startup/server/redis';
 import { check } from 'meteor/check';
-import Presentations from '/imports/api/presentations';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-export default function setPresentation(credentials, presentationId, podId) {
+export default function setPresentation(presentationId, podId) {
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
   const EVENT_NAME = 'SetCurrentPresentationPubMsg';
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
-  const { meetingId, requesterUserId } = credentials;
-
-  check(meetingId, String);
-  check(requesterUserId, String);
   check(presentationId, String);
   check(podId, String);
 
-  const currentPresentation = Presentations.findOne({
-    meetingId,
-    id: presentationId,
+  const payload = {
+    presentationId,
     podId,
-  });
-
-  if (currentPresentation) {
-    if (currentPresentation.current) {
-      return Promise.resolve();
-    }
-
-    const payload = {
-      presentationId,
-      podId,
-    };
-
-    return RedisPubSub.publishUserMessage(CHANNEL, EVENT_NAME, meetingId, requesterUserId, payload);
-  }
+  };
 
-  // did not find presentation with such id. abandon
-  // return Promise.resolve(); // will close the uploading modal
-  throw new Meteor.Error('presentation-not-found', `Did not find a presentation with id ${presentationId} in method setPresentation`);
+  return RedisPubSub.publishUserMessage(CHANNEL, EVENT_NAME, meetingId, requesterUserId, payload);
 }
diff --git a/bigbluebutton-html5/imports/api/presentations/server/methods/setPresentationDownloadable.js b/bigbluebutton-html5/imports/api/presentations/server/methods/setPresentationDownloadable.js
index edcbcd6c9e7b9d70774ec377f5b889c9d921f2c6..5d51af14f071e5f8023333c76181551d899f8f10 100644
--- a/bigbluebutton-html5/imports/api/presentations/server/methods/setPresentationDownloadable.js
+++ b/bigbluebutton-html5/imports/api/presentations/server/methods/setPresentationDownloadable.js
@@ -1,14 +1,14 @@
 import RedisPubSub from '/imports/startup/server/redis';
 import { check } from 'meteor/check';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-export default function setPresentationDownloadable(credentials, presentationId, downloadable) {
+export default function setPresentationDownloadable(presentationId, downloadable) {
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
   const EVENT_NAME = 'SetPresentationDownloadablePubMsg';
 
-  const { meetingId, requesterUserId } = credentials;
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
-  check(meetingId, String);
   check(downloadable, Boolean);
   check(presentationId, String);
 
diff --git a/bigbluebutton-html5/imports/api/presentations/server/publishers.js b/bigbluebutton-html5/imports/api/presentations/server/publishers.js
index 3839c58c984456ad63073a85089baa1c355085e4..3fb5e0e5bd9d0164c5961f007fa921743311cf48 100644
--- a/bigbluebutton-html5/imports/api/presentations/server/publishers.js
+++ b/bigbluebutton-html5/imports/api/presentations/server/publishers.js
@@ -1,16 +1,15 @@
 import { Meteor } from 'meteor/meteor';
-import { check } from 'meteor/check';
 import Presentations from '/imports/api/presentations';
 import Logger from '/imports/startup/server/logger';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-function presentations(credentials) {
-  const { meetingId, requesterUserId, requesterToken } = credentials;
+function presentations() {
+  if (!this.userId) {
+    return Presentations.find({ meetingId: '' });
+  }
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(requesterToken, String);
-
-  Logger.debug(`Publishing Presentations for ${meetingId} ${requesterUserId} ${requesterToken}`);
+  Logger.debug(`Publishing Presentations for ${meetingId} ${requesterUserId}`);
 
   return Presentations.find({ meetingId });
 }
diff --git a/bigbluebutton-html5/imports/api/screenshare/server/publishers.js b/bigbluebutton-html5/imports/api/screenshare/server/publishers.js
index 5ffc1b185a6cd29c088b41e2915beed0c721a327..8042a790c641170e16bb35025c747e160ff2d794 100644
--- a/bigbluebutton-html5/imports/api/screenshare/server/publishers.js
+++ b/bigbluebutton-html5/imports/api/screenshare/server/publishers.js
@@ -1,13 +1,13 @@
 import Screenshare from '/imports/api/screenshare';
 import { Meteor } from 'meteor/meteor';
-import { check } from 'meteor/check';
 import Logger from '/imports/startup/server/logger';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-function screenshare(credentials) {
-  const { meetingId, requesterUserId } = credentials;
-
-  check(meetingId, String);
-  check(requesterUserId, String);
+function screenshare() {
+  if (!this.userId) {
+    return Screenshare.find({ meetingId: '' });
+  }
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
   Logger.debug(`Publishing Screenshare for ${meetingId} ${requesterUserId}`);
 
diff --git a/bigbluebutton-html5/imports/api/slides/server/methods/switchSlide.js b/bigbluebutton-html5/imports/api/slides/server/methods/switchSlide.js
index b9e32fb6857a4074f7a0c345d17ac48339e72c04..2251095ced32366f724e021d6ebe674c7b97bbe5 100755
--- a/bigbluebutton-html5/imports/api/slides/server/methods/switchSlide.js
+++ b/bigbluebutton-html5/imports/api/slides/server/methods/switchSlide.js
@@ -3,18 +3,14 @@ import { Slides } from '/imports/api/slides';
 import { Meteor } from 'meteor/meteor';
 import { check } from 'meteor/check';
 import RedisPubSub from '/imports/startup/server/redis';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-export default function switchSlide(credentials, slideNumber, podId) {
+export default function switchSlide(slideNumber, podId) { // TODO-- send presentationId and SlideId
   const REDIS_CONFIG = Meteor.settings.private.redis;
 
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
   const EVENT_NAME = 'SetCurrentPagePubMsg';
-
-  const { meetingId, requesterUserId, requesterToken } = credentials;
-
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(requesterToken, String);
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
   check(slideNumber, Number);
 
   const selector = {
diff --git a/bigbluebutton-html5/imports/api/slides/server/methods/zoomSlide.js b/bigbluebutton-html5/imports/api/slides/server/methods/zoomSlide.js
index b4255e808380b98c7238d6a7a80c930a2e0ba1ab..3d247742f3a22009c5b64ad5130c6a94e04c04cc 100755
--- a/bigbluebutton-html5/imports/api/slides/server/methods/zoomSlide.js
+++ b/bigbluebutton-html5/imports/api/slides/server/methods/zoomSlide.js
@@ -1,20 +1,15 @@
 import Presentations from '/imports/api/presentations';
 import { Slides } from '/imports/api/slides';
 import { Meteor } from 'meteor/meteor';
-import { check } from 'meteor/check';
 import RedisPubSub from '/imports/startup/server/redis';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-export default function zoomSlide(credentials, slideNumber, podId, widthRatio, heightRatio, x, y) {
+export default function zoomSlide(slideNumber, podId, widthRatio, heightRatio, x, y) { // TODO-- send presentationId and SlideId
   const REDIS_CONFIG = Meteor.settings.private.redis;
 
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
   const EVENT_NAME = 'ResizeAndMovePagePubMsg';
-
-  const { meetingId, requesterUserId, requesterToken } = credentials;
-
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(requesterToken, String);
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
   const selector = {
     meetingId,
diff --git a/bigbluebutton-html5/imports/api/slides/server/publishers.js b/bigbluebutton-html5/imports/api/slides/server/publishers.js
index 273c4b60cf9953fad24ab0c54dd30efa9cb41881..99895cfbb02feedc40855e4696e31dc3129f3439 100755
--- a/bigbluebutton-html5/imports/api/slides/server/publishers.js
+++ b/bigbluebutton-html5/imports/api/slides/server/publishers.js
@@ -1,16 +1,14 @@
 import { Slides, SlidePositions } from '/imports/api/slides';
 import { Meteor } from 'meteor/meteor';
-import { check } from 'meteor/check';
 import Logger from '/imports/startup/server/logger';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-function slides(credentials) {
-  const { meetingId, requesterUserId, requesterToken } = credentials;
-
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(requesterToken, String);
-
-  Logger.debug(`Publishing Slides for ${meetingId} ${requesterUserId} ${requesterToken}`);
+function slides() {
+  if (!this.userId) {
+    return Slides.find({ meetingId: '' });
+  }
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
+  Logger.debug(`Publishing Slides for ${meetingId} ${requesterUserId}`);
 
   return Slides.find({ meetingId });
 }
@@ -22,14 +20,13 @@ function publish(...args) {
 
 Meteor.publish('slides', publish);
 
-function slidePositions(credentials) {
-  const { meetingId, requesterUserId, requesterToken } = credentials;
-
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(requesterToken, String);
+function slidePositions() {
+  if (!this.userId) {
+    return SlidePositions.find({ meetingId: '' });
+  }
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
-  Logger.debug(`Publishing SlidePositions for ${meetingId} ${requesterUserId} ${requesterToken}`);
+  Logger.debug(`Publishing SlidePositions for ${meetingId} ${requesterUserId}`);
 
   return SlidePositions.find({ meetingId });
 }
diff --git a/bigbluebutton-html5/imports/api/users-infos/server/methods/removeUserInformation.js b/bigbluebutton-html5/imports/api/users-infos/server/methods/removeUserInformation.js
index 3328b07c5b0a27990e19736b3c85b0124c534f86..5201a8c0a0b58938a0686600241cdbfb4282d735 100644
--- a/bigbluebutton-html5/imports/api/users-infos/server/methods/removeUserInformation.js
+++ b/bigbluebutton-html5/imports/api/users-infos/server/methods/removeUserInformation.js
@@ -1,7 +1,7 @@
 import UserInfos from '/imports/api/users-infos';
 import Logger from '/imports/startup/server/logger';
 
-export default function removeUserInformation(credentials, meetingId, requesterUserId) {
+export default function removeUserInformation(meetingId, requesterUserId) {
   const selector = {
     meetingId,
     requesterUserId,
diff --git a/bigbluebutton-html5/imports/api/users-infos/server/methods/requestUserInformation.js b/bigbluebutton-html5/imports/api/users-infos/server/methods/requestUserInformation.js
index 4d93c99c2615a9f0fb6e48248be1e14880fc2535..ed89eedd8e6b120438149891aeaa8180d717a502 100644
--- a/bigbluebutton-html5/imports/api/users-infos/server/methods/requestUserInformation.js
+++ b/bigbluebutton-html5/imports/api/users-infos/server/methods/requestUserInformation.js
@@ -1,16 +1,14 @@
 import { Meteor } from 'meteor/meteor';
 import { check } from 'meteor/check';
 import RedisPubSub from '/imports/startup/server/redis';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-export default function getUserInformation(credentials, externalUserId) {
+export default function getUserInformation(externalUserId) {
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toThirdParty;
   const EVENT_NAME = 'LookUpUserReqMsg';
 
-  const { meetingId, requesterUserId } = credentials;
-
-  check(meetingId, String);
-  check(requesterUserId, String);
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
   check(externalUserId, String);
 
   const payload = {
diff --git a/bigbluebutton-html5/imports/api/users-infos/server/publishers.js b/bigbluebutton-html5/imports/api/users-infos/server/publishers.js
index 6eed7b35c38ede6bd6a17eaa711a61fd9cd5db17..1205c00e6fcc987a3fac6289a535cb4d6824104b 100644
--- a/bigbluebutton-html5/imports/api/users-infos/server/publishers.js
+++ b/bigbluebutton-html5/imports/api/users-infos/server/publishers.js
@@ -1,13 +1,13 @@
 import { Meteor } from 'meteor/meteor';
-import { check } from 'meteor/check';
 import UserInfos from '/imports/api/users-infos';
 import Logger from '/imports/startup/server/logger';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-function userInfos(credentials) {
-  const { meetingId, requesterUserId } = credentials;
-
-  check(meetingId, String);
-  check(requesterUserId, String);
+function userInfos() {
+  if (!this.userId) {
+    return UserInfos.find({ meetingId: '' });
+  }
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
   Logger.debug(`Publishing user infos requested by user=${requesterUserId}`);
 
diff --git a/bigbluebutton-html5/imports/api/users-settings/server/methods/addUserSettings.js b/bigbluebutton-html5/imports/api/users-settings/server/methods/addUserSettings.js
index 4706d9f9dbe4da8ce25ed65ec3957abddcd84b86..c3b7d36d5a979ed4d8632404eda361e50fae1527 100644
--- a/bigbluebutton-html5/imports/api/users-settings/server/methods/addUserSettings.js
+++ b/bigbluebutton-html5/imports/api/users-settings/server/methods/addUserSettings.js
@@ -73,9 +73,7 @@ function valueParser(val) {
   }
 }
 
-export default function addUserSettings(credentials, meetingId, userId, settings) {
-  check(meetingId, String);
-  check(userId, String);
+export default function addUserSettings(meetingId, userId, settings) {
   check(settings, [Object]);
 
   let parameters = {};
diff --git a/bigbluebutton-html5/imports/api/users-settings/server/publishers.js b/bigbluebutton-html5/imports/api/users-settings/server/publishers.js
index 408b10f1c04065f133b8402f4c7bfc7624bee923..0b772099b42c8eb1007a2387a14a0d1d747f4194 100644
--- a/bigbluebutton-html5/imports/api/users-settings/server/publishers.js
+++ b/bigbluebutton-html5/imports/api/users-settings/server/publishers.js
@@ -1,13 +1,13 @@
 import { Meteor } from 'meteor/meteor';
-import { check } from 'meteor/check';
 import UserSettings from '/imports/api/users-settings';
 import Logger from '/imports/startup/server/logger';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-function userSettings(credentials) {
-  const { meetingId, requesterUserId } = credentials;
-
-  check(meetingId, String);
-  check(requesterUserId, String);
+function userSettings() {
+  if (!this.userId) {
+    return UserSettings.find({ meetingId: '' });
+  }
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
   Logger.debug(`Publishing user settings for user=${requesterUserId}`);
 
diff --git a/bigbluebutton-html5/imports/api/users/server/methods/userJoin.js b/bigbluebutton-html5/imports/api/users/server/handlers/userJoin.js
similarity index 78%
rename from bigbluebutton-html5/imports/api/users/server/methods/userJoin.js
rename to bigbluebutton-html5/imports/api/users/server/handlers/userJoin.js
index dc68d83f55336236207e45b49bd5235b43bc704c..93ecd8bdcf0cf0f14d65a8903b6503dc01e374a6 100644
--- a/bigbluebutton-html5/imports/api/users/server/methods/userJoin.js
+++ b/bigbluebutton-html5/imports/api/users/server/handlers/userJoin.js
@@ -8,10 +8,6 @@ export default function userJoin(meetingId, userId, authToken) {
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
   const EVENT_NAME = 'UserJoinMeetingReqMsg';
 
-  Logger.info(`User='${userId}' is joining meeting='${meetingId}' authToken='${authToken}' pt1`);
-
-  check(meetingId, String);
-  check(userId, String);
   check(authToken, String);
 
   const payload = {
@@ -20,7 +16,7 @@ export default function userJoin(meetingId, userId, authToken) {
     clientType: 'HTML5',
   };
 
-  Logger.info(`User='${userId}' is joining meeting='${meetingId}' authToken='${authToken}' pt2`);
+  Logger.info(`User='${userId}' is joining meeting='${meetingId}' authToken='${authToken}'`);
 
   return RedisPubSub.publishUserMessage(CHANNEL, EVENT_NAME, meetingId, userId, payload);
 }
diff --git a/bigbluebutton-html5/imports/api/users/server/handlers/validateAuthToken.js b/bigbluebutton-html5/imports/api/users/server/handlers/validateAuthToken.js
index e60d924dd0adb6ab4cd159c640533f33b600b130..f8a04154b10d575dc24f1334b0085acaabfaea4b 100644
--- a/bigbluebutton-html5/imports/api/users/server/handlers/validateAuthToken.js
+++ b/bigbluebutton-html5/imports/api/users/server/handlers/validateAuthToken.js
@@ -1,7 +1,7 @@
 import { check } from 'meteor/check';
 import Logger from '/imports/startup/server/logger';
 import Users from '/imports/api/users';
-import userJoin from '../methods/userJoin';
+import userJoin from './userJoin';
 
 const clearOtherSessions = (sessionUserId, current = false) => {
   const serverSessions = Meteor.server.sessions;
diff --git a/bigbluebutton-html5/imports/api/users/server/methods/assignPresenter.js b/bigbluebutton-html5/imports/api/users/server/methods/assignPresenter.js
index add2afe1d06beac5bdc405a88f64344d849f3084..d8b5da899ae0a05f8358217b5c6b072900118ee1 100644
--- a/bigbluebutton-html5/imports/api/users/server/methods/assignPresenter.js
+++ b/bigbluebutton-html5/imports/api/users/server/methods/assignPresenter.js
@@ -3,16 +3,14 @@ import { check } from 'meteor/check';
 import RedisPubSub from '/imports/startup/server/redis';
 import Logger from '/imports/startup/server/logger';
 import Users from '/imports/api/users';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-export default function assignPresenter(credentials, userId) {
+export default function assignPresenter(userId) { // TODO-- send username from client side
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
   const EVENT_NAME = 'AssignPresenterReqMsg';
 
-  const { meetingId, requesterUserId } = credentials;
-
-  check(meetingId, String);
-  check(requesterUserId, String);
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
   check(userId, String);
 
   const User = Users.findOne({
diff --git a/bigbluebutton-html5/imports/api/users/server/methods/changeRole.js b/bigbluebutton-html5/imports/api/users/server/methods/changeRole.js
index beff64791c4a9654e1c0213050b1ad43b41d121c..f45abca3887de2dd6f7ea5d777f73313c46bca23 100644
--- a/bigbluebutton-html5/imports/api/users/server/methods/changeRole.js
+++ b/bigbluebutton-html5/imports/api/users/server/methods/changeRole.js
@@ -2,36 +2,25 @@ import { Meteor } from 'meteor/meteor';
 import { check } from 'meteor/check';
 import RedisPubSub from '/imports/startup/server/redis';
 import Logger from '/imports/startup/server/logger';
-import Users from '/imports/api/users';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-export default function changeRole(credentials, userId, role) {
+export default function changeRole(userId, role) {
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
   const EVENT_NAME = 'ChangeUserRoleCmdMsg';
 
-  const { meetingId, requesterUserId } = credentials;
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
-  check(meetingId, String);
-  check(requesterUserId, String);
   check(userId, String);
   check(role, String);
 
-  const User = Users.findOne({
-    meetingId,
-    userId,
-  });
-
-  if (!User) {
-    throw new Meteor.Error('user-not-found', `You need a valid user to be able to set '${role}'`);
-  }
-
   const payload = {
     userId,
     role,
     changedBy: requesterUserId,
   };
 
-  Logger.verbose(`User '${userId}' setted as '${role} role by '${requesterUserId}' from meeting '${meetingId}'`);
+  Logger.verbose(`User '${userId}' set as '${role} role by '${requesterUserId}' from meeting '${meetingId}'`);
 
   return RedisPubSub.publishUserMessage(CHANNEL, EVENT_NAME, meetingId, requesterUserId, payload);
 }
diff --git a/bigbluebutton-html5/imports/api/users/server/methods/removeUser.js b/bigbluebutton-html5/imports/api/users/server/methods/removeUser.js
index 80d90ec221d9a27e1e9ba862d8c07cf592ea9a47..afe41d6f9f83c3e34a23dd0932a67080b9bb77cc 100644
--- a/bigbluebutton-html5/imports/api/users/server/methods/removeUser.js
+++ b/bigbluebutton-html5/imports/api/users/server/methods/removeUser.js
@@ -1,22 +1,21 @@
 import { Meteor } from 'meteor/meteor';
 import { check } from 'meteor/check';
 import RedisPubSub from '/imports/startup/server/redis';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-export default function removeUser(credentials, userId) {
+export default function removeUser(userId) {
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
   const EVENT_NAME = 'EjectUserFromMeetingCmdMsg';
 
-  const { requesterUserId, meetingId } = credentials;
+  const { meetingId, requesterUserId: ejectedBy } = extractCredentials(this.userId);
 
-  check(meetingId, String);
-  check(requesterUserId, String);
   check(userId, String);
 
   const payload = {
     userId,
-    ejectedBy: requesterUserId,
+    ejectedBy,
   };
 
-  return RedisPubSub.publishUserMessage(CHANNEL, EVENT_NAME, meetingId, requesterUserId, payload);
+  return RedisPubSub.publishUserMessage(CHANNEL, EVENT_NAME, meetingId, ejectedBy, payload);
 }
diff --git a/bigbluebutton-html5/imports/api/users/server/methods/setEmojiStatus.js b/bigbluebutton-html5/imports/api/users/server/methods/setEmojiStatus.js
index c63e65ed058183e52592ab45f7ca6adfc6bc3c3a..5cea8279e734848adde14f98a9edd5ea001e87d7 100644
--- a/bigbluebutton-html5/imports/api/users/server/methods/setEmojiStatus.js
+++ b/bigbluebutton-html5/imports/api/users/server/methods/setEmojiStatus.js
@@ -2,16 +2,15 @@ import { Meteor } from 'meteor/meteor';
 import { check } from 'meteor/check';
 import RedisPubSub from '/imports/startup/server/redis';
 import Logger from '/imports/startup/server/logger';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-export default function setEmojiStatus(credentials, userId, status) {
+export default function setEmojiStatus(userId, status) {
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
   const EVENT_NAME = 'ChangeUserEmojiCmdMsg';
 
-  const { meetingId, requesterUserId } = credentials;
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
-  check(meetingId, String);
-  check(requesterUserId, String);
   check(userId, String);
 
   const payload = {
diff --git a/bigbluebutton-html5/imports/api/users/server/methods/setUserEffectiveConnectionType.js b/bigbluebutton-html5/imports/api/users/server/methods/setUserEffectiveConnectionType.js
index fd6a632d90cfb6425b9d6d661558a94c1f92a79f..6c1242ee4537b9b78d0793a2184c01a8ef340a5f 100644
--- a/bigbluebutton-html5/imports/api/users/server/methods/setUserEffectiveConnectionType.js
+++ b/bigbluebutton-html5/imports/api/users/server/methods/setUserEffectiveConnectionType.js
@@ -2,17 +2,15 @@ import { Meteor } from 'meteor/meteor';
 import { check } from 'meteor/check';
 import RedisPubSub from '/imports/startup/server/redis';
 import Logger from '/imports/startup/server/logger';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 import setEffectiveConnectionType from '../modifiers/setUserEffectiveConnectionType';
 
-export default function setUserEffectiveConnectionType(credentials, effectiveConnectionType) {
+export default function setUserEffectiveConnectionType(effectiveConnectionType) {
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
   const EVENT_NAME = 'ChangeUserEffectiveConnectionMsg';
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
-  const { meetingId, requesterUserId } = credentials;
-
-  check(meetingId, String);
-  check(requesterUserId, String);
   check(effectiveConnectionType, String);
 
   const payload = {
diff --git a/bigbluebutton-html5/imports/api/users/server/methods/toggleUserLock.js b/bigbluebutton-html5/imports/api/users/server/methods/toggleUserLock.js
index 0919194b9261f371210f5981ea3fdca69be95476..f13aa323f7d8502a404c696d62a07291fe21a593 100644
--- a/bigbluebutton-html5/imports/api/users/server/methods/toggleUserLock.js
+++ b/bigbluebutton-html5/imports/api/users/server/methods/toggleUserLock.js
@@ -2,15 +2,15 @@ import { Meteor } from 'meteor/meteor';
 import { check } from 'meteor/check';
 import RedisPubSub from '/imports/startup/server/redis';
 import Logger from '/imports/startup/server/logger';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-export default function toggleUserLock(credentials, userId, lock) {
+export default function toggleUserLock(userId, lock) {
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
   const EVENT_NAME = 'LockUserInMeetingCmdMsg';
 
-  const { meetingId, requesterUserId: lockedBy } = credentials;
+  const { meetingId, requesterUserId: lockedBy } = extractCredentials(this.userId);
 
-  check(meetingId, String);
   check(lockedBy, String);
   check(userId, String);
   check(lock, Boolean);
diff --git a/bigbluebutton-html5/imports/api/users/server/methods/userActivitySign.js b/bigbluebutton-html5/imports/api/users/server/methods/userActivitySign.js
index d4ac0f1b8847f9abaccfeaa3f605470bbcee1229..16642f732bbcdfcc9b147b298f526b926c35493a 100644
--- a/bigbluebutton-html5/imports/api/users/server/methods/userActivitySign.js
+++ b/bigbluebutton-html5/imports/api/users/server/methods/userActivitySign.js
@@ -1,19 +1,14 @@
 import { Meteor } from 'meteor/meteor';
-import { check } from 'meteor/check';
 import Users from '/imports/api/users';
 import RedisPubSub from '/imports/startup/server/redis';
 import Logger from '/imports/startup/server/logger';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-export default function userActivitySign(credentials) {
+export default function userActivitySign() {
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
   const EVENT_NAME = 'UserActivitySignCmdMsg';
-
-  const { meetingId, requesterUserId: userId } = credentials;
-
-  check(meetingId, String);
-  check(userId, String);
-
+  const { meetingId, requesterUserId: userId } = extractCredentials(this.userId);
   const payload = {
     userId,
   };
@@ -28,7 +23,7 @@ export default function userActivitySign(credentials) {
     },
   };
 
-  Users.update(selector, modifier);
+  Users.update(selector, modifier); // TODO-- we should move this to a modifier
 
   Logger.info(`User ${userId} sent a activity sign for meeting ${meetingId}`);
 
diff --git a/bigbluebutton-html5/imports/api/users/server/methods/userLeaving.js b/bigbluebutton-html5/imports/api/users/server/methods/userLeaving.js
index 321689b3fd6200352170816864b6ecf67479ad6e..9c21e9be7912a8f253cbdd1b73fceeacbce6391b 100755
--- a/bigbluebutton-html5/imports/api/users/server/methods/userLeaving.js
+++ b/bigbluebutton-html5/imports/api/users/server/methods/userLeaving.js
@@ -4,15 +4,11 @@ import RedisPubSub from '/imports/startup/server/redis';
 import Logger from '/imports/startup/server/logger';
 import Users from '/imports/api/users';
 
-export default function userLeaving(credentials, userId, connectionId) {
+export default function userLeaving(meetingId, userId, connectionId) {
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
   const EVENT_NAME = 'UserLeaveReqMsg';
 
-  const { meetingId, requesterUserId } = credentials;
-
-  check(meetingId, String);
-  check(requesterUserId, String);
   check(userId, String);
 
   const selector = {
@@ -37,5 +33,5 @@ export default function userLeaving(credentials, userId, connectionId) {
   };
 
   Logger.info(`User '${userId}' is leaving meeting '${meetingId}'`);
-  return RedisPubSub.publishUserMessage(CHANNEL, EVENT_NAME, meetingId, requesterUserId, payload);
+  return RedisPubSub.publishUserMessage(CHANNEL, EVENT_NAME, meetingId, userId, payload);
 }
diff --git a/bigbluebutton-html5/imports/api/users/server/methods/userLeftMeeting.js b/bigbluebutton-html5/imports/api/users/server/methods/userLeftMeeting.js
index 4723ba94e51538edaaa9ada00af9a694d1fcc8a9..eb198b5f88a688a5860bee76858b6b112615888f 100644
--- a/bigbluebutton-html5/imports/api/users/server/methods/userLeftMeeting.js
+++ b/bigbluebutton-html5/imports/api/users/server/methods/userLeftMeeting.js
@@ -1,16 +1,10 @@
-import { Meteor } from 'meteor/meteor';
-import { check } from 'meteor/check';
 import Logger from '/imports/startup/server/logger';
 import Users from '/imports/api/users';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-export default function userLeftMeeting(credentials) {
-  const {
-    meetingId,
-    requesterUserId,
-  } = credentials;
-
-  check(meetingId, String);
-  check(requesterUserId, String);
+export default function userLeftMeeting() { // TODO-- spread the code to method/modifier/handler
+  // so we don't update the db in a method
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
   const selector = {
     meetingId,
diff --git a/bigbluebutton-html5/imports/api/users/server/methods/validateAuthToken.js b/bigbluebutton-html5/imports/api/users/server/methods/validateAuthToken.js
index 136c00db1a8d5917d3b9547cc2a1f4579a8cdedc..e01b6ad348fde23e60eea7cf571b3938c4739286 100644
--- a/bigbluebutton-html5/imports/api/users/server/methods/validateAuthToken.js
+++ b/bigbluebutton-html5/imports/api/users/server/methods/validateAuthToken.js
@@ -1,23 +1,16 @@
 import { Meteor } from 'meteor/meteor';
-import { check } from 'meteor/check';
 import RedisPubSub from '/imports/startup/server/redis';
 import Logger from '/imports/startup/server/logger';
 import Users from '/imports/api/users';
 import createDummyUser from '../modifiers/createDummyUser';
 import setConnectionIdAndAuthToken from '../modifiers/setConnectionIdAndAuthToken';
 
-export default function validateAuthToken(credentials) {
+export default function validateAuthToken(meetingId, requesterUserId, requesterToken) {
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
   const EVENT_NAME = 'ValidateAuthTokenReqMsg';
 
-  const { meetingId, requesterUserId, requesterToken } = credentials;
-
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(requesterToken, String);
-
-  const sessionId = `${meetingId}-${requesterUserId}`;
+  const sessionId = `${meetingId}--${requesterUserId}`;
   this.setUserId(sessionId);
 
   const User = Users.findOne({
diff --git a/bigbluebutton-html5/imports/api/users/server/publishers.js b/bigbluebutton-html5/imports/api/users/server/publishers.js
index 1751a2517718cdb07a2611a39a9a538c67908275..2e342ec03f452511df0991cc7de77ff472c9985c 100644
--- a/bigbluebutton-html5/imports/api/users/server/publishers.js
+++ b/bigbluebutton-html5/imports/api/users/server/publishers.js
@@ -5,16 +5,23 @@ import { check } from 'meteor/check';
 import Logger from '/imports/startup/server/logger';
 
 import userLeaving from './methods/userLeaving';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
 const ROLE_MODERATOR = Meteor.settings.public.user.role_moderator;
 
-Meteor.publish('current-user', function currentUserPub(credentials) {
-  const { meetingId, requesterUserId, requesterToken } = credentials;
+function currentUser() {
+  if (!this.userId) {
+    return Users.find({ meetingId: '' });
+  }
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
+
+  check(meetingId, String);
+  check(requesterUserId, String);
 
   const connectionId = this.connection.id;
   const onCloseConnection = Meteor.bindEnvironment(() => {
     try {
-      userLeaving(credentials, requesterUserId, connectionId);
+      userLeaving(meetingId, requesterUserId, connectionId);
     } catch (e) {
       Logger.error(`Exception while executing userLeaving: ${e}`);
     }
@@ -22,35 +29,33 @@ Meteor.publish('current-user', function currentUserPub(credentials) {
 
   this._session.socket.on('close', _.debounce(onCloseConnection, 100));
 
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(requesterToken, String);
-
   const selector = {
     meetingId,
     userId: requesterUserId,
-    authToken: requesterToken,
   };
 
   const options = {
     fields: {
       user: false,
+      authToken: false, // Not asking for authToken from client side but also not exposing it
     },
   };
 
   return Users.find(selector, options);
-});
+}
 
-function users(credentials, isModerator = false) {
-  const {
-    meetingId,
-    requesterUserId,
-    requesterToken,
-  } = credentials;
+function publishCurrentUser(...args) {
+  const boundUsers = currentUser.bind(this);
+  return boundUsers(...args);
+}
 
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(requesterToken, String);
+Meteor.publish('current-user', publishCurrentUser);
+
+function users(isModerator = false) {
+  if (!this.userId) {
+    return Users.find({ meetingId: '' });
+  }
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
   const selector = {
     $or: [
@@ -76,7 +81,7 @@ function users(credentials, isModerator = false) {
     },
   };
 
-  Logger.debug(`Publishing Users for ${meetingId} ${requesterUserId} ${requesterToken}`);
+  Logger.debug(`Publishing Users for ${meetingId} ${requesterUserId}`);
 
   return Users.find(selector, options);
 }
diff --git a/bigbluebutton-html5/imports/api/video-streams/server/methods/userShareWebcam.js b/bigbluebutton-html5/imports/api/video-streams/server/methods/userShareWebcam.js
index 2d7e51cb06c38e1896ccdbcace3488bc46629938..4b679293712923df7ae3a58630c03962792d2fb6 100644
--- a/bigbluebutton-html5/imports/api/video-streams/server/methods/userShareWebcam.js
+++ b/bigbluebutton-html5/imports/api/video-streams/server/methods/userShareWebcam.js
@@ -2,19 +2,16 @@ import { Meteor } from 'meteor/meteor';
 import { check } from 'meteor/check';
 import Logger from '/imports/startup/server/logger';
 import RedisPubSub from '/imports/startup/server/redis';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-export default function userShareWebcam(credentials, stream) {
+export default function userShareWebcam(stream) {
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
   const EVENT_NAME = 'UserBroadcastCamStartMsg';
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
-  const { meetingId, requesterUserId, requesterToken } = credentials;
+  Logger.info(`user sharing webcam: ${meetingId} ${requesterUserId}`);
 
-  Logger.info(' user sharing webcam: ', credentials);
-
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(requesterToken, String);
   check(stream, String);
 
   // const actionName = 'joinVideo';
diff --git a/bigbluebutton-html5/imports/api/video-streams/server/methods/userUnshareWebcam.js b/bigbluebutton-html5/imports/api/video-streams/server/methods/userUnshareWebcam.js
index 13f6609ee85bc09f9d9d111156cf4446fe5fed11..c04d863efdcdba50f0cebc19518c10673de41d3d 100644
--- a/bigbluebutton-html5/imports/api/video-streams/server/methods/userUnshareWebcam.js
+++ b/bigbluebutton-html5/imports/api/video-streams/server/methods/userUnshareWebcam.js
@@ -2,19 +2,16 @@ import { Meteor } from 'meteor/meteor';
 import { check } from 'meteor/check';
 import Logger from '/imports/startup/server/logger';
 import RedisPubSub from '/imports/startup/server/redis';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-export default function userUnshareWebcam(credentials, stream) {
+export default function userUnshareWebcam(stream) {
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
   const EVENT_NAME = 'UserBroadcastCamStopMsg';
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
-  const { meetingId, requesterUserId, requesterToken } = credentials;
+  Logger.info(`user unsharing webcam: ${meetingId} ${requesterUserId}`);
 
-  Logger.info(' user unsharing webcam: ', credentials);
-
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(requesterToken, String);
   check(stream, String);
 
   // const actionName = 'joinVideo';
diff --git a/bigbluebutton-html5/imports/api/video-streams/server/publisher.js b/bigbluebutton-html5/imports/api/video-streams/server/publisher.js
index b471bbbe396321eae1f52547e467cbfcdf475fe4..046a054ff2406fdbb78b9a8379c5d06050209f2e 100644
--- a/bigbluebutton-html5/imports/api/video-streams/server/publisher.js
+++ b/bigbluebutton-html5/imports/api/video-streams/server/publisher.js
@@ -1,14 +1,13 @@
 import { Meteor } from 'meteor/meteor';
-import { check } from 'meteor/check';
 import Logger from '/imports/startup/server/logger';
 import VideoStreams from '/imports/api/video-streams';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-function videoStreams(credentials) {
-  const { meetingId, requesterUserId, requesterToken } = credentials;
-
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(requesterToken, String);
+function videoStreams() {
+  if (!this.userId) {
+    return VideoStreams.find({ meetingId: '' });
+  }
+  const { meetingId } = extractCredentials(this.userId);
 
   Logger.debug(`video users of meeting id=${meetingId}`);
 
diff --git a/bigbluebutton-html5/imports/api/voice-users/server/methods.js b/bigbluebutton-html5/imports/api/voice-users/server/methods.js
index 975770e43fdadd32ae7ffd64dc5a8c3143162ebe..e78ab55dc740b968d478da1705c4429481a19256 100755
--- a/bigbluebutton-html5/imports/api/voice-users/server/methods.js
+++ b/bigbluebutton-html5/imports/api/voice-users/server/methods.js
@@ -7,7 +7,6 @@ import ejectUserFromVoice from './methods/ejectUserFromVoice';
 
 Meteor.methods({
   listenOnlyToggle,
-  toggleSelfVoice: (credentials) => { muteToggle(credentials, credentials.requesterUserId); },
   toggleVoice: muteToggle,
   muteAllUsers: muteAllToggle,
   muteAllExceptPresenter: muteAllExceptPresenterToggle,
diff --git a/bigbluebutton-html5/imports/api/voice-users/server/methods/ejectUserFromVoice.js b/bigbluebutton-html5/imports/api/voice-users/server/methods/ejectUserFromVoice.js
index bc8fe6f20054cbb59ed1247923aa65583b1e5b89..1039a83d9234fa2e47cad612d963c64e8dc81ab7 100644
--- a/bigbluebutton-html5/imports/api/voice-users/server/methods/ejectUserFromVoice.js
+++ b/bigbluebutton-html5/imports/api/voice-users/server/methods/ejectUserFromVoice.js
@@ -1,16 +1,14 @@
 import { Meteor } from 'meteor/meteor';
 import { check } from 'meteor/check';
 import RedisPubSub from '/imports/startup/server/redis';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-export default function ejectUserFromVoice(credentials, userId) {
+export default function ejectUserFromVoice(userId) {
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
   const EVENT_NAME = 'EjectUserFromVoiceCmdMsg';
 
-  const { requesterUserId, meetingId } = credentials;
-
-  check(meetingId, String);
-  check(requesterUserId, String);
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
   check(userId, String);
 
   const payload = {
diff --git a/bigbluebutton-html5/imports/api/voice-users/server/methods/listenOnlyToggle.js b/bigbluebutton-html5/imports/api/voice-users/server/methods/listenOnlyToggle.js
index 365423ab698101ba45339d8eba7bb5f8a28deb29..c5ce88176a6d24b2ff757793e08033b3bdc31da1 100644
--- a/bigbluebutton-html5/imports/api/voice-users/server/methods/listenOnlyToggle.js
+++ b/bigbluebutton-html5/imports/api/voice-users/server/methods/listenOnlyToggle.js
@@ -4,15 +4,14 @@ import RedisPubSub from '/imports/startup/server/redis';
 import Logger from '/imports/startup/server/logger';
 import Meetings from '/imports/api/meetings';
 import VoiceUsers from '/imports/api/voice-users';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-export default function listenOnlyToggle(credentials, isJoining = true) {
+export default function listenOnlyToggle(isJoining = true) {
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
 
-  const { meetingId, requesterUserId } = credentials;
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
-  check(meetingId, String);
-  check(requesterUserId, String);
   check(isJoining, Boolean);
 
   let EVENT_NAME;
diff --git a/bigbluebutton-html5/imports/api/voice-users/server/methods/muteAllExceptPresenterToggle.js b/bigbluebutton-html5/imports/api/voice-users/server/methods/muteAllExceptPresenterToggle.js
index db73c7df61fd4c4dc6631c2fdd22a0bbcd7cdb78..c82e280d509f6d11b16d1514ce5a91101ed98f7f 100755
--- a/bigbluebutton-html5/imports/api/voice-users/server/methods/muteAllExceptPresenterToggle.js
+++ b/bigbluebutton-html5/imports/api/voice-users/server/methods/muteAllExceptPresenterToggle.js
@@ -1,17 +1,15 @@
 import { Meteor } from 'meteor/meteor';
-import { check } from 'meteor/check';
 import RedisPubSub from '/imports/startup/server/redis';
 import Meetings from '/imports/api/meetings';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-export default function muteAllExceptPresenterToggle(credentials) {
+export default function muteAllExceptPresenterToggle() {
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
   const EVENT_NAME = 'MuteAllExceptPresentersCmdMsg';
 
-  const { meetingId, requesterUserId } = credentials;
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
-  check(meetingId, String);
-  check(requesterUserId, String);
   const meeting = Meetings.findOne({ meetingId });
   const toggleMeetingMuted = !meeting.voiceProp.muteOnStart;
 
diff --git a/bigbluebutton-html5/imports/api/voice-users/server/methods/muteAllToggle.js b/bigbluebutton-html5/imports/api/voice-users/server/methods/muteAllToggle.js
index 2d142dabef3b20539ceb683c762abc28fbe3867d..ecfd3433f91e48e54343f0967d45ada212b007a1 100755
--- a/bigbluebutton-html5/imports/api/voice-users/server/methods/muteAllToggle.js
+++ b/bigbluebutton-html5/imports/api/voice-users/server/methods/muteAllToggle.js
@@ -1,17 +1,15 @@
 import { Meteor } from 'meteor/meteor';
-import { check } from 'meteor/check';
 import RedisPubSub from '/imports/startup/server/redis';
 import Meetings from '/imports/api/meetings';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-export default function muteAllToggle(credentials) {
+export default function muteAllToggle() {
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
   const EVENT_NAME = 'MuteMeetingCmdMsg';
 
-  const { meetingId, requesterUserId } = credentials;
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
-  check(meetingId, String);
-  check(requesterUserId, String);
   const meeting = Meetings.findOne({ meetingId });
   const toggleMeetingMuted = !meeting.voiceProp.muteOnStart;
 
diff --git a/bigbluebutton-html5/imports/api/voice-users/server/methods/muteToggle.js b/bigbluebutton-html5/imports/api/voice-users/server/methods/muteToggle.js
index be28a30199fa02f69b55a5534a9ca607f1a542f8..81d4ab92b91b483c7c20426ef50486ce516438ea 100644
--- a/bigbluebutton-html5/imports/api/voice-users/server/methods/muteToggle.js
+++ b/bigbluebutton-html5/imports/api/voice-users/server/methods/muteToggle.js
@@ -1,18 +1,16 @@
 import { Meteor } from 'meteor/meteor';
-import { check } from 'meteor/check';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 import RedisPubSub from '/imports/startup/server/redis';
 import Users from '/imports/api/users';
 import VoiceUsers from '/imports/api/voice-users';
 
-export default function muteToggle(credentials, userId) {
+export default function muteToggle(uId) {
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
   const EVENT_NAME = 'MuteUserCmdMsg';
 
-  const { meetingId, requesterUserId } = credentials;
-
-  check(meetingId, String);
-  check(requesterUserId, String);
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
+  const userToMute = uId || requesterUserId;
 
   const requester = Users.findOne({
     meetingId,
@@ -20,7 +18,7 @@ export default function muteToggle(credentials, userId) {
   });
 
   const voiceUser = VoiceUsers.findOne({
-    intId: userId,
+    intId: userToMute,
   });
 
   if (!requester || !voiceUser) return;
@@ -29,7 +27,7 @@ export default function muteToggle(credentials, userId) {
   if (listenOnly) return;
 
   const payload = {
-    userId,
+    userId: userToMute,
     mutedBy: requesterUserId,
     mute: !muted,
   };
diff --git a/bigbluebutton-html5/imports/api/voice-users/server/publishers.js b/bigbluebutton-html5/imports/api/voice-users/server/publishers.js
index 22515c0708e3732cc40973aab49a9972ab9d41f8..cca405660072e15fbf437842103ed36b1534b3e0 100644
--- a/bigbluebutton-html5/imports/api/voice-users/server/publishers.js
+++ b/bigbluebutton-html5/imports/api/voice-users/server/publishers.js
@@ -1,13 +1,13 @@
 import VoiceUsers from '/imports/api/voice-users';
 import { Meteor } from 'meteor/meteor';
-import { check } from 'meteor/check';
 import Logger from '/imports/startup/server/logger';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-function voiceUser(credentials) {
-  const { meetingId, requesterUserId } = credentials;
-
-  check(meetingId, String);
-  check(requesterUserId, String);
+function voiceUser() {
+  if (!this.userId) {
+    return VoiceUsers.find({ meetingId: '' });
+  }
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
   Logger.debug(`Publishing Voice User for ${meetingId} ${requesterUserId}`);
 
diff --git a/bigbluebutton-html5/imports/api/whiteboard-multi-user/server/methods/changeWhiteboardAccess.js b/bigbluebutton-html5/imports/api/whiteboard-multi-user/server/methods/changeWhiteboardAccess.js
index 5ceb031e29676cb89eb488a79f7c2b88eaf6b1b4..ffd3b1662695d00fec3c57a6a1d0474b538a06ee 100644
--- a/bigbluebutton-html5/imports/api/whiteboard-multi-user/server/methods/changeWhiteboardAccess.js
+++ b/bigbluebutton-html5/imports/api/whiteboard-multi-user/server/methods/changeWhiteboardAccess.js
@@ -1,17 +1,15 @@
 import RedisPubSub from '/imports/startup/server/redis';
 import { Meteor } from 'meteor/meteor';
 import { check } from 'meteor/check';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-export default function changeWhiteboardAccess(credentials, multiUser, whiteboardId) {
+export default function changeWhiteboardAccess(multiUser, whiteboardId) {
   const REDIS_CONFIG = Meteor.settings.private.redis;
   const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
   const EVENT_NAME = 'ModifyWhiteboardAccessPubMsg';
 
-  const { meetingId, requesterUserId, requesterToken } = credentials;
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(requesterToken, String);
   check(multiUser, Boolean);
   check(whiteboardId, String);
 
diff --git a/bigbluebutton-html5/imports/api/whiteboard-multi-user/server/publishers.js b/bigbluebutton-html5/imports/api/whiteboard-multi-user/server/publishers.js
index 6047ac46d10d6daa6b250b38bff64aaea46ce40c..e8e8a8e4b14828f1c2f29e9ac191689cfac6f5f9 100644
--- a/bigbluebutton-html5/imports/api/whiteboard-multi-user/server/publishers.js
+++ b/bigbluebutton-html5/imports/api/whiteboard-multi-user/server/publishers.js
@@ -1,18 +1,20 @@
 import WhiteboardMultiUser from '/imports/api/whiteboard-multi-user/';
 import { Meteor } from 'meteor/meteor';
-import { check } from 'meteor/check';
 import Logger from '/imports/startup/server/logger';
+import { extractCredentials } from '/imports/api/common/server/helpers';
 
-function whiteboardMultiUser(credentials) {
-  const { meetingId, requesterUserId, requesterToken } = credentials;
+function whiteboardMultiUser() {
+  if (!this.userId) {
+    return WhiteboardMultiUser.find({ meetingId: '' });
+  }
+  const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
-  check(meetingId, String);
-
-  Logger.debug(`Publishing whiteboard-multi-user for ${meetingId} ${requesterUserId} ${requesterToken}`);
+  Logger.debug(`Publishing whiteboard-multi-user for ${meetingId} ${requesterUserId}`);
 
   return WhiteboardMultiUser.find({ meetingId });
 }
 
+
 function publish(...args) {
   const boundMultiUser = whiteboardMultiUser.bind(this);
   return boundMultiUser(...args);
diff --git a/bigbluebutton-html5/imports/startup/server/index.js b/bigbluebutton-html5/imports/startup/server/index.js
index febdeaacff4334cc4fa1aea21e69d7c105a8d11a..119027be1e5d2c443f77b6071bb3b5c9f445b662 100755
--- a/bigbluebutton-html5/imports/startup/server/index.js
+++ b/bigbluebutton-html5/imports/startup/server/index.js
@@ -88,10 +88,9 @@ Meteor.startup(() => {
     Logger.info('Removing inactive users');
     users.forEach((user) => {
       Logger.info(`Detected inactive user, userId:${user.userId}, meetingId:${user.meetingId}`);
-      user.requesterUserId = user.userId;
-      return userLeaving(user, user.userId, user.connectionId);
+      return userLeaving(user.meetingId, user.userId, user.connectionId);
     });
-    return Logger.info('All inactive user have been removed');
+    return Logger.info('All inactive users have been removed');
   }, INTERVAL_TIME);
 
   Logger.warn(`SERVER STARTED.\nENV=${env},\nnodejs version=${process.version}\nCDN=${CDN_URL}\n`, APP_CONFIG);
diff --git a/bigbluebutton-html5/imports/ui/components/audio/audio-controls/container.jsx b/bigbluebutton-html5/imports/ui/components/audio/audio-controls/container.jsx
index caa79c1c0296931289e6f240721afa2ec4c566ee..04161e8635cfaaa187dee9d1e6651fd7f21c69c1 100755
--- a/bigbluebutton-html5/imports/ui/components/audio/audio-controls/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/audio/audio-controls/container.jsx
@@ -14,7 +14,7 @@ const AudioControlsContainer = props => <AudioControls {...props} />;
 const processToggleMuteFromOutside = (e) => {
   switch (e.data) {
     case 'c_mute': {
-      makeCall('toggleSelfVoice');
+      makeCall('toggleVoice');
       break;
     }
     case 'get_audio_joined_status': {
diff --git a/bigbluebutton-html5/imports/ui/components/audio/service.js b/bigbluebutton-html5/imports/ui/components/audio/service.js
index 78cd1f4fd31b6686c51302dcd2e2632e45da117f..0c4d5a6c3c893fac7b2dbc84cd1b738fb0a480be 100755
--- a/bigbluebutton-html5/imports/ui/components/audio/service.js
+++ b/bigbluebutton-html5/imports/ui/components/audio/service.js
@@ -50,13 +50,13 @@ const toggleMuteMicrophone = () => {
       logCode: 'audiomanager_unmute_audio',
       extraInfo: { logType: 'user_action' },
     }, 'microphone unmuted by user');
-    makeCall('toggleSelfVoice');
+    makeCall('toggleVoice');
   } else {
     logger.info({
       logCode: 'audiomanager_mute_audio',
       extraInfo: { logType: 'user_action' },
     }, 'microphone muted by user');
-    makeCall('toggleSelfVoice');
+    makeCall('toggleVoice');
   }
 };
 
diff --git a/bigbluebutton-html5/imports/ui/components/authenticated-handler/component.jsx b/bigbluebutton-html5/imports/ui/components/authenticated-handler/component.jsx
index 209052abd1b6053409f12ead0125bd7c08a8c339..dd9a8e82e6216fd92e3331cb6a2c7e4f32c4bf23 100644
--- a/bigbluebutton-html5/imports/ui/components/authenticated-handler/component.jsx
+++ b/bigbluebutton-html5/imports/ui/components/authenticated-handler/component.jsx
@@ -68,7 +68,9 @@ class AuthenticatedHandler extends Component {
   }
 
   componentDidMount() {
-    if (Session.get('codeError')) return this.changeState(true);
+    if (Session.get('codeError')) {
+      this.setState({ authenticated: true });
+    }
     AuthenticatedHandler.authenticatedRouteHandler((value, error) => {
       if (error) AuthenticatedHandler.setError(error);
       this.setState({ authenticated: true });
diff --git a/bigbluebutton-html5/imports/ui/components/cursor/service.js b/bigbluebutton-html5/imports/ui/components/cursor/service.js
index 3a2efb7992b926fd8933f76d802343bcce4a8bc1..7c7893fb4d49e3850c11523215fcb34425998aea 100755
--- a/bigbluebutton-html5/imports/ui/components/cursor/service.js
+++ b/bigbluebutton-html5/imports/ui/components/cursor/service.js
@@ -26,7 +26,7 @@ export function publishCursorUpdate(payload) {
     const throttledEmit = throttle(cursorStreamListener.emit.bind(cursorStreamListener), 30, { trailing: true });
 
     throttledEmit('publish', {
-      credentials: Auth.credentials,
+      userId: Auth.userID,
       payload,
     });
   }
diff --git a/bigbluebutton-html5/imports/ui/components/error-screen/component.jsx b/bigbluebutton-html5/imports/ui/components/error-screen/component.jsx
index bfcf865a4eceb677c70f2948cabeace51ab48e2b..bf8ddcee4bf63c5febcfb0732e011dd94c97ce73 100644
--- a/bigbluebutton-html5/imports/ui/components/error-screen/component.jsx
+++ b/bigbluebutton-html5/imports/ui/components/error-screen/component.jsx
@@ -10,7 +10,7 @@ import { styles } from './styles';
 const intlMessages = defineMessages({
   500: {
     id: 'app.error.500',
-    defaultMessage: 'Ops, something went wrong',
+    defaultMessage: 'Oops, something went wrong',
   },
   410: {
     id: 'app.error.410',
diff --git a/bigbluebutton-html5/imports/ui/components/poll/container.jsx b/bigbluebutton-html5/imports/ui/components/poll/container.jsx
index 643b6e9d6e9d0661f5f5f9cb5ec95681551b9fbe..769be8e1902cc523d73df9e290cbbe695c4ad10a 100644
--- a/bigbluebutton-html5/imports/ui/components/poll/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/poll/container.jsx
@@ -10,7 +10,7 @@ import Service from './service';
 const PollContainer = ({ ...props }) => <Poll {...props} />;
 
 export default withTracker(() => {
-  Meteor.subscribe('current-poll', Auth.meetingID);
+  Meteor.subscribe('current-poll');
 
   const currentPresentation = Presentations.findOne({
     current: true,
diff --git a/bigbluebutton-html5/imports/ui/components/poll/live-result/component.jsx b/bigbluebutton-html5/imports/ui/components/poll/live-result/component.jsx
index 15e225050763a382638b92860f05e44b7b82a941..e5a933c0d6f2b50f018f02bd06d953ebf884032a 100644
--- a/bigbluebutton-html5/imports/ui/components/poll/live-result/component.jsx
+++ b/bigbluebutton-html5/imports/ui/components/poll/live-result/component.jsx
@@ -237,7 +237,6 @@ LiveResult.propTypes = {
       users: PropTypes.arrayOf(PropTypes.string),
     }),
   ]),
-  publishPoll: PropTypes.func.isRequired,
   stopPoll: PropTypes.func.isRequired,
   handleBackClick: PropTypes.func.isRequired,
 };
diff --git a/bigbluebutton-html5/imports/ui/components/presentation/presentation-uploader/service.js b/bigbluebutton-html5/imports/ui/components/presentation/presentation-uploader/service.js
index a076055ede2b9b8c7e806a36350f44fff7e70617..d8a1b01a5a2cc6432377d485a19e4351d63bd834 100644
--- a/bigbluebutton-html5/imports/ui/components/presentation/presentation-uploader/service.js
+++ b/bigbluebutton-html5/imports/ui/components/presentation/presentation-uploader/service.js
@@ -113,7 +113,7 @@ const requestPresentationUploadToken = (
 
   Tracker.autorun((c) => {
     computation = c;
-    const sub = Meteor.subscribe('presentation-upload-token', Auth.credentials, podId, filename);
+    const sub = Meteor.subscribe('presentation-upload-token', podId, filename);
     if (!sub.ready()) return;
 
     const PresentationToken = PresentationUploadToken.findOne({
diff --git a/bigbluebutton-html5/imports/ui/components/subscriptions/component.jsx b/bigbluebutton-html5/imports/ui/components/subscriptions/component.jsx
index 80f4efc3037caa911f599f7b205102a99cbf1773..72a071988a7eafee8cc923657068584357617cc5 100755
--- a/bigbluebutton-html5/imports/ui/components/subscriptions/component.jsx
+++ b/bigbluebutton-html5/imports/ui/components/subscriptions/component.jsx
@@ -83,7 +83,7 @@ export default withTracker(() => {
 
     const chatIds = chats.map(chat => chat.chatId);
 
-    groupChatMessageHandler = Meteor.subscribe('group-chat-msg', credentials, chatIds, subscriptionErrorHandler);
+    groupChatMessageHandler = Meteor.subscribe('group-chat-msg', chatIds, subscriptionErrorHandler);
     subscriptionsHandlers.push(groupChatMessageHandler);
   }
 
@@ -91,12 +91,12 @@ export default withTracker(() => {
 
   if (User) {
     const userIsModerator = User.role === ROLE_MODERATOR;
-    Meteor.subscribe('users', credentials, userIsModerator, subscriptionErrorHandler);
-    Meteor.subscribe('breakouts', credentials, userIsModerator, subscriptionErrorHandler);
-    Meteor.subscribe('meetings', credentials, userIsModerator, subscriptionErrorHandler);
+    Meteor.subscribe('users', userIsModerator, subscriptionErrorHandler);
+    Meteor.subscribe('breakouts', userIsModerator, subscriptionErrorHandler);
+    Meteor.subscribe('meetings', userIsModerator, subscriptionErrorHandler);
   }
 
-  const annotationsHandler = Meteor.subscribe('annotations', credentials, {
+  const annotationsHandler = Meteor.subscribe('annotations', {
     onReady: () => {
       const activeTextShapeId = AnnotationsTextService.activeTextShapeId();
       AnnotationsLocal.remove({ id: { $ne: `${activeTextShapeId}-fake` } });
diff --git a/bigbluebutton-html5/imports/ui/services/api/index.js b/bigbluebutton-html5/imports/ui/services/api/index.js
index 5f7385fc7f5aec24bbcaf3e85b75e73d1a4cf3d2..59fd844e43a27473a6d3b426f3c56e41c2e74587 100755
--- a/bigbluebutton-html5/imports/ui/services/api/index.js
+++ b/bigbluebutton-html5/imports/ui/services/api/index.js
@@ -13,11 +13,11 @@ import logger from '/imports/startup/client/logger';
 export function makeCall(name, ...args) {
   check(name, String);
 
-  const { credentials } = Auth;
+  // const { credentials } = Auth;
 
   return new Promise((resolve, reject) => {
     if (Meteor.status().connected) {
-      Meteor.call(name, credentials, ...args, (error, result) => {
+      Meteor.call(name, ...args, (error, result) => {
         if (error) {
           reject(error);
         }
@@ -26,7 +26,7 @@ export function makeCall(name, ...args) {
       });
     } else {
       const failureString = `Call to ${name} failed because Meteor is not connected`;
-      // We don't want to send a log message if the call that failed wasa log message.
+      // We don't want to send a log message if the call that failed was a log message.
       // Without this you can get into an endless loop of failed logging.
       if (name !== 'logClient') {
         logger.warn({
diff --git a/bigbluebutton-html5/imports/ui/services/auth/index.js b/bigbluebutton-html5/imports/ui/services/auth/index.js
index 69b0ecad531fd1929ae09ea4a9371df0a7ac10f6..e6e80b1d66f3059a72b37e89e899076d853e9e19 100755
--- a/bigbluebutton-html5/imports/ui/services/auth/index.js
+++ b/bigbluebutton-html5/imports/ui/services/auth/index.js
@@ -180,13 +180,16 @@ class Auth {
       return Promise.resolve();
     }
 
+
     return new Promise((resolve) => {
       resolve(this._logoutURL);
     });
   }
 
   authenticate(force) {
-    if (this.loggedIn && !force) return Promise.resolve();
+    if (this.loggedIn && !force) {
+      return Promise.resolve();
+    }
 
     if (!(this.meetingID && this.userID && this.token)) {
       return Promise.reject({
@@ -205,7 +208,6 @@ class Auth {
 
   validateAuthToken() {
     return new Promise((resolve, reject) => {
-      Meteor.connection.setUserId(`${this.meetingID}-${this.userID}`);
       let computation = null;
 
       const validationTimeout = setTimeout(() => {
@@ -218,7 +220,8 @@ class Auth {
 
       Tracker.autorun((c) => {
         computation = c;
-        Meteor.subscribe('current-user', this.credentials);
+        makeCall('validateAuthToken', this.meetingID, this.userID, this.token);
+        Meteor.subscribe('current-user');
 
         const selector = { meetingId: this.meetingID, userId: this.userID };
         const fields = {
@@ -228,7 +231,8 @@ class Auth {
         // Skip in case the user is not in the collection yet or is a dummy user
         if (!User || !('intId' in User)) {
           logger.info({ logCode: 'auth_service_resend_validateauthtoken' }, 're-send validateAuthToken for delayed authentication');
-          makeCall('validateAuthToken');
+          makeCall('validateAuthToken', this.meetingID, this.userID, this.token);
+
           return;
         }
 
@@ -250,7 +254,6 @@ class Auth {
           setTimeout(() => resolve(true), 100);
         }
       });
-      makeCall('validateAuthToken');
     });
   }