diff --git a/bigbluebutton-html5/imports/api/meetings/server/handlers/meetingEnd.js b/bigbluebutton-html5/imports/api/meetings/server/handlers/meetingEnd.js
index c2d7fe7d9b481de03987cffc63280f64106c84e1..2cbf3a0d84c418307b2feeb6d7de03b86f35e061 100644
--- a/bigbluebutton-html5/imports/api/meetings/server/handlers/meetingEnd.js
+++ b/bigbluebutton-html5/imports/api/meetings/server/handlers/meetingEnd.js
@@ -6,7 +6,9 @@ import setConnectionStatus from '/imports/api/users/server/modifiers/setConnecti
 import Users from '/imports/api/users/';
 import Logger from '/imports/startup/server/logger';
 
-export default function handleMeetingEnd({ body }, meetingId) {
+export default function handleMeetingEnd({ body }) {
+  check(body, Object);
+  const { meetingId } = body;
   check(meetingId, String);
 
   const cb = (err, num, meetingType) => {
@@ -15,7 +17,7 @@ export default function handleMeetingEnd({ body }, meetingId) {
       return;
     }
     if (num) {
-      Users.find({ meetingId })
+      Users.find({ meetingId }, { fields: { meetingId: 1, userId: 1 } })
         .fetch().map(user => setConnectionStatus(user.meetingId, user.userId, 'offline'));
       Meteor.setTimeout(() => { meetingHasEnded(meetingId); }, 10000);
     }
diff --git a/bigbluebutton-html5/imports/api/polls/server/modifiers/addPoll.js b/bigbluebutton-html5/imports/api/polls/server/modifiers/addPoll.js
index 5b3e0d6150759abe827e0beac22a90c606a9f7bb..07d7457f552cc4505f9f2e3407699bf000db8fd5 100644
--- a/bigbluebutton-html5/imports/api/polls/server/modifiers/addPoll.js
+++ b/bigbluebutton-html5/imports/api/polls/server/modifiers/addPoll.js
@@ -23,7 +23,7 @@ export default function addPoll(meetingId, requesterId, poll) {
     clientType: { $ne: 'dial-in-user' },
   };
 
-  const userIds = Users.find(userSelector)
+  const userIds = Users.find(userSelector, { fields: { userId: 1 } })
     .fetch()
     .map(user => user.userId);
 
diff --git a/bigbluebutton-html5/imports/api/presentation-pods/server/handlers/syncGetPresentationPods.js b/bigbluebutton-html5/imports/api/presentation-pods/server/handlers/syncGetPresentationPods.js
index 0bf39a062a64ccc209944b4381b1aae12bcc9c84..5bd4ae319fe491eae028350fa72881e48a0f942b 100644
--- a/bigbluebutton-html5/imports/api/presentation-pods/server/handlers/syncGetPresentationPods.js
+++ b/bigbluebutton-html5/imports/api/presentation-pods/server/handlers/syncGetPresentationPods.js
@@ -15,7 +15,7 @@ export default function handleSyncGetPresentationPods({ body }, meetingId) {
   const presentationPodsToRemove = PresentationPods.find({
     meetingId,
     podId: { $nin: presentationPodIds },
-  }).fetch();
+  }, { fields: { podId: 1 } }).fetch();
 
   presentationPodsToRemove.forEach(p => removePresentationPod(meetingId, p.podId));
 
diff --git a/bigbluebutton-html5/imports/api/slides/server/modifiers/clearSlidesPresentation.js b/bigbluebutton-html5/imports/api/slides/server/modifiers/clearSlidesPresentation.js
index ff73cc6e524e170d0b34b7ab751740b6e62b2bb9..1413750d46dd70f0d9c4bd06f61a179c81862e47 100755
--- a/bigbluebutton-html5/imports/api/slides/server/modifiers/clearSlidesPresentation.js
+++ b/bigbluebutton-html5/imports/api/slides/server/modifiers/clearSlidesPresentation.js
@@ -12,7 +12,7 @@ export default function clearSlidesPresentation(meetingId, presentationId) {
     presentationId,
   };
 
-  const whiteboardIds = Slides.find(selector).map(row => row.id);
+  const whiteboardIds = Slides.find(selector, { fields: { id: 1 } }).map(row => row.id);
 
   const cb = (err) => {
     if (err) {
diff --git a/bigbluebutton-html5/imports/api/users/server/handlers/getUsers.js b/bigbluebutton-html5/imports/api/users/server/handlers/getUsers.js
index 24057f7d71888ab9384b8450517faed0169cb4bc..7af56998284c806a3e068cf3fe61bd35a00d429d 100644
--- a/bigbluebutton-html5/imports/api/users/server/handlers/getUsers.js
+++ b/bigbluebutton-html5/imports/api/users/server/handlers/getUsers.js
@@ -14,7 +14,7 @@ export default function handleGetUsers({ body }, meetingId) {
   const usersToRemove = Users.find({
     meetingId,
     userId: { $nin: usersIds },
-  }).fetch();
+  }, { fields: { userId: 1 } }).fetch();
 
   usersToRemove.forEach(user => removeUser(meetingId, user.userId));
 
diff --git a/bigbluebutton-html5/imports/api/voice-users/server/handlers/getVoiceUsers.js b/bigbluebutton-html5/imports/api/voice-users/server/handlers/getVoiceUsers.js
index d66ec2f1deab655b4cd13225c3723c0990f135ed..ab50ae2f5e3258594db27063efd9ad826c2622eb 100644
--- a/bigbluebutton-html5/imports/api/voice-users/server/handlers/getVoiceUsers.js
+++ b/bigbluebutton-html5/imports/api/voice-users/server/handlers/getVoiceUsers.js
@@ -11,17 +11,17 @@ export default function handleGetVoiceUsers({ body }, meetingId) {
   check(meetingId, String);
   check(users, Array);
 
-  const meeting = Meetings.findOne({ meetingId: meetingId });
+  const meeting = Meetings.findOne({ meetingId }, { fields: { 'voiceProp.voiceConf': 1 } });
   const usersIds = users.map(m => m.intId);
 
   const voiceUsersIdsToUpdate = VoiceUsers.find({
     meetingId,
     intId: { $in: usersIds },
-  }).fetch().map(m => m.intId);;
+  }, { fields: { intId: 1 } }).fetch().map(m => m.intId);
 
-  let voiceUsersUpdated = [];
-  users.forEach(user => {
-    if(voiceUsersIdsToUpdate.indexOf(user.intId) >= 0) {
+  const voiceUsersUpdated = [];
+  users.forEach((user) => {
+    if (voiceUsersIdsToUpdate.indexOf(user.intId) >= 0) {
       // user already exist, then update
       voiceUsersUpdated.push(updateVoiceUser(meetingId, {
         intId: user.intId,
@@ -29,7 +29,7 @@ export default function handleGetVoiceUsers({ body }, meetingId) {
         talking: user.talking,
         muted: user.muted,
         voiceConf: meeting.voiceProp.voiceConf,
-        joined: true
+        joined: true,
       }));
     } else {
       // user doesn't exist yet, then add it
@@ -43,7 +43,7 @@ export default function handleGetVoiceUsers({ body }, meetingId) {
         callingWith: user.callingWith,
         listenOnly: user.listenOnly,
         voiceConf: meeting.voiceProp.voiceConf,
-        joined: true
+        joined: true,
       });
     }
   });
@@ -56,7 +56,7 @@ export default function handleGetVoiceUsers({ body }, meetingId) {
   voiceUsersToRemove.forEach(user => removeVoiceUser(meetingId, {
     voiceConf: meeting.voiceProp.voiceConf,
     voiceUserId: user.voiceUserId,
-    intId: user.intId
+    intId: user.intId,
   }));
 
   return voiceUsersUpdated;
diff --git a/bigbluebutton-html5/imports/api/voice-users/server/handlers/voiceUsers.js b/bigbluebutton-html5/imports/api/voice-users/server/handlers/voiceUsers.js
index 4f65ae0f81b404d01d9979c40ddfd0bc6b3e31dd..5c39fc5253b3c34563d2d1b1da6f435cb426e3cd 100644
--- a/bigbluebutton-html5/imports/api/voice-users/server/handlers/voiceUsers.js
+++ b/bigbluebutton-html5/imports/api/voice-users/server/handlers/voiceUsers.js
@@ -1,4 +1,3 @@
-import { check } from 'meteor/check';
 import VoiceUsers from '/imports/api/voice-users/';
 import Meetings from '/imports/api/meetings';
 import addDialInUser from '/imports/api/users/server/modifiers/addDialInUser';
@@ -11,13 +10,13 @@ export default function handleVoiceUsers({ header, body }) {
   const { voiceUsers } = body;
   const { meetingId } = header;
 
-  const meeting = Meetings.findOne({ meetingId });
+  const meeting = Meetings.findOne({ meetingId }, { fields: { 'voiceProp.voiceConf': 1 } });
   const usersIds = voiceUsers.map(m => m.intId);
 
   const voiceUsersIdsToUpdate = VoiceUsers.find({
     meetingId,
     intId: { $in: usersIds },
-  }).fetch().map(m => m.intId);
+  }, { fields: { intId: 1 } }).fetch().map(m => m.intId);
 
   const voiceUsersUpdated = [];
   voiceUsers.forEach((voice) => {
@@ -54,7 +53,7 @@ export default function handleVoiceUsers({ header, body }) {
   const voiceUsersToRemove = VoiceUsers.find({
     meetingId,
     intId: { $nin: usersIds },
-  }).fetch();
+  }, { fields: { voiceUserId: 1, intId: 1 } }).fetch();
   voiceUsersToRemove.forEach(user => removeVoiceUser(meetingId, {
     voiceConf: meeting.voiceProp.voiceConf,
     voiceUserId: user.voiceUserId,
diff --git a/bigbluebutton-html5/imports/ui/components/actions-bar/service.js b/bigbluebutton-html5/imports/ui/components/actions-bar/service.js
index 97c9f9ca71450d564730c37c6d77485cccd1390b..50a6700e1cd6740911041461e0aba515c376d95a 100755
--- a/bigbluebutton-html5/imports/ui/components/actions-bar/service.js
+++ b/bigbluebutton-html5/imports/ui/components/actions-bar/service.js
@@ -24,14 +24,25 @@ const getUsersNotAssigned = filterBreakoutUsers(currentBreakoutUsers);
 const takePresenterRole = () => makeCall('assignPresenter', Auth.userID);
 
 export default {
-  isUserPresenter: () => Users.findOne({ userId: Auth.userID }).presenter,
-  isUserModerator: () => Users.findOne({ userId: Auth.userID }).role === ROLE_MODERATOR,
-  meetingIsBreakout: () => Meetings.findOne({ meetingId: Auth.meetingID }).meetingProp.isBreakout,
-  meetingName: () => Meetings.findOne({ meetingId: Auth.meetingID }).meetingProp.name,
-  users: () => Users.find({ connectionStatus: 'online', meetingId: Auth.meetingID, clientType: { $ne: DIAL_IN_USER } }).fetch(),
-  hasBreakoutRoom: () => Breakouts.find({ parentMeetingId: Auth.meetingID }).fetch().length > 0,
-  isBreakoutEnabled: () => Meetings.findOne({ meetingId: Auth.meetingID }).breakoutProps.enabled,
-  isBreakoutRecordable: () => Meetings.findOne({ meetingId: Auth.meetingID }).breakoutProps.record,
+  isUserPresenter: () => Users.findOne({ userId: Auth.userID },
+    { fields: { presenter: 1 } }).presenter,
+  isUserModerator: () => Users.findOne({ userId: Auth.userID },
+    { fields: { role: 1 } }).role === ROLE_MODERATOR,
+  meetingIsBreakout: () => Meetings.findOne({ meetingId: Auth.meetingID },
+    { fields: { 'meetingProp.isBreakout': 1 } }).meetingProp.isBreakout,
+  meetingName: () => Meetings.findOne({ meetingId: Auth.meetingID },
+    { fields: { 'meetingProp.name': 1 } }).meetingProp.name,
+  users: () => Users.find({
+    connectionStatus: 'online',
+    meetingId: Auth.meetingID,
+    clientType: { $ne: DIAL_IN_USER },
+  }).fetch(),
+  hasBreakoutRoom: () => Breakouts.find({ parentMeetingId: Auth.meetingID },
+    { fields: {} }).count() > 0,
+  isBreakoutEnabled: () => Meetings.findOne({ meetingId: Auth.meetingID },
+    { fields: { 'breakoutProps.enabled': 1 } }).breakoutProps.enabled,
+  isBreakoutRecordable: () => Meetings.findOne({ meetingId: Auth.meetingID },
+    { fields: { 'breakoutProps.record': 1 } }).breakoutProps.record,
   toggleRecording: () => makeCall('toggleRecording'),
   createBreakoutRoom: (numberOfRooms, durationInMinutes, record = false) => makeCall('createBreakoutRoom', numberOfRooms, durationInMinutes, record),
   sendInvitation: (breakoutId, userId) => makeCall('requestJoinURL', { breakoutId, userId }),
diff --git a/bigbluebutton-html5/imports/ui/components/app/container.jsx b/bigbluebutton-html5/imports/ui/components/app/container.jsx
index 9a7e19d364813a8db8e0729c2ef97d1c8368c9b9..bca88596f34658db4306beecd662fb0cb3121627 100755
--- a/bigbluebutton-html5/imports/ui/components/app/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/app/container.jsx
@@ -12,7 +12,6 @@ import getFromUserSettings from '/imports/ui/services/users-settings';
 import deviceInfo from '/imports/utils/deviceInfo';
 import UserInfos from '/imports/api/users-infos';
 import { startBandwidthMonitoring, updateNavigatorConnection } from '/imports/ui/services/network-information/index';
-import mapUser from '../../services/user/mapUser';
 
 import {
   getFontSize,
@@ -70,8 +69,9 @@ const AppContainer = (props) => {
 };
 
 export default injectIntl(withModalMounter(withTracker(({ intl, baseControls }) => {
-  const currentUser = Users.findOne({ userId: Auth.userID });
-  const currentMeeting = Meetings.findOne({ meetingId: Auth.meetingID });
+  const currentUser = Users.findOne({ userId: Auth.userID }, { fields: { approved: 1, emoji: 1 } });
+  const currentMeeting = Meetings.findOne({ meetingId: Auth.meetingID },
+    { fields: { publishedPoll: 1, voiceProp: 1 } });
   const { publishedPoll, voiceProp } = currentMeeting;
 
   if (!currentUser.approved) {
@@ -94,6 +94,14 @@ export default injectIntl(withModalMounter(withTracker(({ intl, baseControls })
     requesterUserId: Auth.userID,
   }).fetch();
 
+  const currentUserEmoji = () => (currentUser ? {
+    status: currentUser.emoji,
+    changedAt: currentUser.emojiTime,
+  } : {
+    status: 'none',
+    changedAt: null,
+  });
+
   return {
     captions: CaptionsService.isCaptionsActive() ? <CaptionsContainer /> : null,
     fontSize: getFontSize(),
@@ -107,7 +115,7 @@ export default injectIntl(withModalMounter(withTracker(({ intl, baseControls })
     isPhone: deviceInfo.type().isPhone,
     isRTL: document.documentElement.getAttribute('dir') === 'rtl',
     meetingMuted: voiceProp.muteOnStart,
-    currentUserEmoji: mapUser(currentUser).emoji,
+    currentUserEmoji,
     hasPublishedPoll: publishedPoll,
     startBandwidthMonitoring,
     handleNetworkConnection: () => updateNavigatorConnection(navigator.connection),
diff --git a/bigbluebutton-html5/imports/ui/components/app/service.js b/bigbluebutton-html5/imports/ui/components/app/service.js
index a8a16945b1b8c72db27fa94eacd644db616ca234..d758bb7b8a517303f76cd7ffc9e916f5d7734016 100644
--- a/bigbluebutton-html5/imports/ui/components/app/service.js
+++ b/bigbluebutton-html5/imports/ui/components/app/service.js
@@ -3,11 +3,6 @@ import Meetings from '/imports/api/meetings';
 import Settings from '/imports/ui/services/settings';
 import Auth from '/imports/ui/services/auth/index';
 
-const getCaptionsStatus = () => {
-  const ccSettings = Settings.cc;
-  return ccSettings ? ccSettings.enabled : false;
-};
-
 const getFontSize = () => {
   const applicationSettings = Settings.application;
   return applicationSettings ? applicationSettings.fontSize : '16px';
@@ -15,13 +10,9 @@ const getFontSize = () => {
 
 const getBreakoutRooms = () => Breakouts.find().fetch();
 
-const getMeeting = () => {
-  const { meetingID } = Auth;
-  return Meetings.findOne({ meetingId: meetingID });
-};
-
 function meetingIsBreakout() {
-  const meeting = getMeeting();
+  const meeting = Meetings.findOne({ meetingId: Auth.meetingID },
+    { fields: { 'meetingProp.isBreakout': 1 } });
   return (meeting && meeting.meetingProp.isBreakout);
 }
 
@@ -37,10 +28,8 @@ const validIOSVersion = () => {
 };
 
 export {
-  getCaptionsStatus,
   getFontSize,
   meetingIsBreakout,
   getBreakoutRooms,
-  getMeeting,
   validIOSVersion,
 };
diff --git a/bigbluebutton-html5/imports/ui/components/audio/audio-controls/component.jsx b/bigbluebutton-html5/imports/ui/components/audio/audio-controls/component.jsx
index 511c3c96544d364c003706d7ca1fce56015271f2..fd171bf1df50ecabce221179c070e47dde5a2054 100755
--- a/bigbluebutton-html5/imports/ui/components/audio/audio-controls/component.jsx
+++ b/bigbluebutton-html5/imports/ui/components/audio/audio-controls/component.jsx
@@ -62,7 +62,7 @@ class AudioControls extends PureComponent {
       listenOnly,
       intl,
       shortcuts,
-      currentUserObj,
+      isVoiceUser,
     } = this.props;
 
     let joinIcon = 'audio_off';
@@ -76,7 +76,7 @@ class AudioControls extends PureComponent {
 
     return (
       <span className={styles.container}>
-        {showMute && currentUserObj.isVoiceUser
+        {showMute && isVoiceUser
           ? (
             <Button
               className={cx(styles.button, !talking || styles.glow, !muted || styles.btn)}
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 75667a77e2dfae949e45a0b4521cca71c037e56e..caa79c1c0296931289e6f240721afa2ec4c566ee 100755
--- a/bigbluebutton-html5/imports/ui/components/audio/audio-controls/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/audio/audio-controls/container.jsx
@@ -42,7 +42,7 @@ const handleLeaveAudio = () => {
 };
 
 const {
-  currentUser,
+  isVoiceUser,
   isConnected,
   isListenOnly,
   isEchoTest,
@@ -62,7 +62,7 @@ export default lockContextContainer(withModalMounter(withTracker(({ mountModal,
   listenOnly: isConnected() && isListenOnly(),
   disable: isConnecting() || isHangingUp() || !Meteor.status().connected,
   talking: isTalking() && !isMuted(),
-  currentUserObj: currentUser(),
+  isVoiceUser: isVoiceUser(),
   handleToggleMuteMicrophone: () => toggleMuteMicrophone(),
   handleJoinAudio: () => (isConnected() ? joinListenOnly() : mountModal(<AudioModalContainer />)),
   handleLeaveAudio,
diff --git a/bigbluebutton-html5/imports/ui/components/audio/service.js b/bigbluebutton-html5/imports/ui/components/audio/service.js
index 3f1601f045538b3d905cfecdfb5f11e55d437dfd..df34ae558e51e0607fc23fd2c5e3576572215464 100755
--- a/bigbluebutton-html5/imports/ui/components/audio/service.js
+++ b/bigbluebutton-html5/imports/ui/components/audio/service.js
@@ -2,7 +2,6 @@ import Users from '/imports/api/users';
 import Auth from '/imports/ui/services/auth';
 import AudioManager from '/imports/ui/services/audio-manager';
 import Meetings from '/imports/api/meetings';
-import mapUser from '/imports/ui/services/user/mapUser';
 import { makeCall } from '/imports/ui/services/api';
 import VoiceUsers from '/imports/api/voice-users';
 import logger from '/imports/startup/client/logger';
@@ -15,9 +14,9 @@ const init = (messages, intl) => {
   const meetingId = Auth.meetingID;
   const userId = Auth.userID;
   const { sessionToken } = Auth;
-  const User = Users.findOne({ userId });
+  const User = Users.findOne({ userId }, { fields: { name: 1 } });
   const username = User.name;
-  const Meeting = Meetings.findOne({ meetingId: User.meetingId });
+  const Meeting = Meetings.findOne({ meetingId: Auth.meetingID }, { fields: { 'voiceProp.voiceConf': 1 } });
   const voiceBridge = Meeting.voiceProp.voiceConf;
 
   // FIX ME
@@ -35,7 +34,11 @@ const init = (messages, intl) => {
   AudioManager.init(userData);
 };
 
-const currentUser = () => mapUser(Users.findOne({ intId: Auth.userID }));
+const isVoiceUser = () => {
+  const voiceUser = VoiceUsers.findOne({ intId: Auth.userID },
+    { fields: { joined: 1 } });
+  return voiceUser ? voiceUser.joined : false;
+};
 
 const toggleMuteMicrophone = () => {
   const userIsMuted = VoiceUsers.findOne({
@@ -80,7 +83,7 @@ export default {
   isEchoTest: () => AudioManager.isEchoTest,
   error: () => AudioManager.error,
   isUserModerator: () => Users.findOne({ userId: Auth.userID }).role === ROLE_MODERATOR,
-  currentUser,
+  isVoiceUser,
   autoplayBlocked: () => AudioManager.autoplayBlocked,
   handleAllowAutoplay: () => AudioManager.handleAllowAutoplay(),
 };
diff --git a/bigbluebutton-html5/imports/ui/components/breakout-room/service.js b/bigbluebutton-html5/imports/ui/components/breakout-room/service.js
index 38642a8ea892e7d01741e9d5c25f451ea148d9e2..c42d5b23ef827f353c0de2d90daa482ab529b38c 100644
--- a/bigbluebutton-html5/imports/ui/components/breakout-room/service.js
+++ b/bigbluebutton-html5/imports/ui/components/breakout-room/service.js
@@ -4,9 +4,10 @@ import { makeCall } from '/imports/ui/services/api';
 import Auth from '/imports/ui/services/auth';
 import { Session } from 'meteor/session';
 import Users from '/imports/api/users';
-import mapUser from '/imports/ui/services/user/mapUser';
 import fp from 'lodash/fp';
 
+const ROLE_MODERATOR = Meteor.settings.public.user.role_moderator;
+
 const findBreakouts = () => {
   const BreakoutRooms = Breakouts.find({
     parentMeetingId: Auth.meetingID,
@@ -50,30 +51,28 @@ const transferToBreakout = (breakoutId) => {
       { 'breakoutProps.parentId': breakoutRoom.parentMeetingId },
       { 'meetingProp.isBreakout': true },
     ],
-  });
+  }, { fields: { meetingId: 1 } });
   transferUserToMeeting(Auth.meetingID, breakoutMeeting.meetingId);
 };
 
 const isPresenter = () => {
-  const User = Users.findOne({ intId: Auth.userID });
-  const mappedUser = mapUser(User);
-  return mappedUser.isPresenter;
+  const User = Users.findOne({ intId: Auth.userID }, { fields: { presenter: 1 } });
+  return User.presenter;
 };
 
 const isModerator = () => {
-  const User = Users.findOne({ intId: Auth.userID });
-  const mappedUser = mapUser(User);
-  return mappedUser.isModerator;
+  const User = Users.findOne({ intId: Auth.userID }, { fields: { role: 1 } });
+  return User.role === ROLE_MODERATOR;
 };
 
 const getUsersByBreakoutId = breakoutId => Users.find({
   meetingId: breakoutId,
   connectionStatus: 'online',
-});
+}, { fields: {} });
 
 const getBreakoutByUserId = userId => Breakouts.find({ 'users.userId': userId }).fetch();
 
-const getBreakoutByUser = user => Breakouts.findOne({ users: user });
+const getBreakoutByUser = user => Breakouts.findOne({ users: user }, { fields: { breakoutId: 1 } });
 
 const getUsersFromBreakouts = breakoutsArray => breakoutsArray
   .map(breakout => breakout.users)
diff --git a/bigbluebutton-html5/imports/ui/components/captions/service.js b/bigbluebutton-html5/imports/ui/components/captions/service.js
index 7fb05259e58f883d714e21ee246186c84acdecf6..fc164cebe076656e59af32651662ecde955f884c 100644
--- a/bigbluebutton-html5/imports/ui/components/captions/service.js
+++ b/bigbluebutton-html5/imports/ui/components/captions/service.js
@@ -2,7 +2,6 @@ import _ from 'lodash';
 import Captions from '/imports/api/captions';
 import Users from '/imports/api/users';
 import Auth from '/imports/ui/services/auth';
-import mapUser from '/imports/ui/services/user/mapUser';
 import { makeCall } from '/imports/ui/services/api';
 import { Meteor } from 'meteor/meteor';
 import { Session } from 'meteor/session';
@@ -10,6 +9,7 @@ import { Session } from 'meteor/session';
 const CAPTIONS_CONFIG = Meteor.settings.public.captions;
 const CAPTIONS = '_captions_';
 const LINE_BREAK = '\n';
+const ROLE_MODERATOR = Meteor.settings.public.user.role_moderator;
 
 const getActiveCaptions = () => {
   const activeCaptions = Session.get('activeCaptions');
@@ -17,13 +17,10 @@ const getActiveCaptions = () => {
   return activeCaptions;
 };
 
-const getCaptions = (locale) => {
-  const captions = Captions.findOne({
-    meetingId: Auth.meetingID,
-    padId: { $regex: `${CAPTIONS}${locale}$` },
-  });
-  return captions;
-};
+const getCaptions = locale => Captions.findOne({
+  meetingId: Auth.meetingID,
+  padId: { $regex: `${CAPTIONS}${locale}$` },
+});
 
 const getCaptionsData = () => {
   const activeCaptions = getActiveCaptions();
@@ -45,22 +42,25 @@ const getCaptionsData = () => {
 const getAvailableLocales = () => {
   const { meetingID } = Auth;
   const locales = [];
-  Captions.find({ meetingId: meetingID }).forEach((caption) => {
-    if (caption.ownerId === '') {
-      locales.push(caption.locale);
-    }
-  });
+  Captions.find({ meetingId: meetingID },
+    { fields: { ownerId: 1, locale: 1 } })
+    .forEach((caption) => {
+      if (caption.ownerId === '') {
+        locales.push(caption.locale);
+      }
+    });
   return locales;
 };
 
 const getOwnedLocales = () => {
   const { meetingID } = Auth;
   const locales = [];
-  Captions.find({ meetingId: meetingID }).forEach((caption) => {
-    if (caption.ownerId !== '') {
-      locales.push(caption.locale);
-    }
-  });
+  Captions.find({ meetingId: meetingID }, { fields: { ownerId: 1, locale: 1 } })
+    .forEach((caption) => {
+      if (caption.ownerId !== '') {
+        locales.push(caption.locale);
+      }
+    });
   return locales;
 };
 
@@ -151,10 +151,8 @@ const formatCaptionsText = (text) => {
   return filteredText.join(LINE_BREAK);
 };
 
-const amIModerator = () => {
-  const currentUser = Users.findOne({ userId: Auth.userID });
-  return mapUser(currentUser).isModerator;
-};
+const amIModerator = () => Users.findOne({ userId: Auth.userID },
+  { fields: { role: 1 } }).role === ROLE_MODERATOR;
 
 const getSpeechRecognitionAPI = () => window.SpeechRecognition || window.webkitSpeechRecognition;
 
diff --git a/bigbluebutton-html5/imports/ui/components/chat/container.jsx b/bigbluebutton-html5/imports/ui/components/chat/container.jsx
index baf97a68b75fc07c36eb4949bace8c158c41404f..6007138bc8a9e1e3d2e4ae2a2987515f7b400913 100755
--- a/bigbluebutton-html5/imports/ui/components/chat/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/chat/container.jsx
@@ -57,7 +57,7 @@ export default injectIntl(withTracker(({ intl }) => {
   let systemMessageIntl = {};
 
   if (chatID === PUBLIC_CHAT_KEY) {
-    const { welcomeProp } = ChatService.getMeeting();
+    const { welcomeProp } = ChatService.getWelcomeProp();
     const currentUser = ChatService.getUser(Auth.userID);
 
     messages = ChatService.getPublicGroupMessages();
diff --git a/bigbluebutton-html5/imports/ui/components/chat/message-form/component.jsx b/bigbluebutton-html5/imports/ui/components/chat/message-form/component.jsx
index 3fdfa915ee0499df4b986bdba1ae910e9b9b6ce5..bc1f47fe8e68fde167c929c34468a57de3fb6462 100755
--- a/bigbluebutton-html5/imports/ui/components/chat/message-form/component.jsx
+++ b/bigbluebutton-html5/imports/ui/components/chat/message-form/component.jsx
@@ -169,7 +169,8 @@ class MessageForm extends PureComponent {
 
   setMessageState() {
     const { chatId, UnsentMessagesCollection } = this.props;
-    const unsentMessageByChat = UnsentMessagesCollection.findOne({ chatId });
+    const unsentMessageByChat = UnsentMessagesCollection.findOne({ chatId },
+      { fields: { message: 1 } });
     this.setState({ message: unsentMessageByChat ? unsentMessageByChat.message : '' });
   }
 
diff --git a/bigbluebutton-html5/imports/ui/components/chat/service.js b/bigbluebutton-html5/imports/ui/components/chat/service.js
index 994db61adbff158e4d8841676f033cb574dbc370..d122056841ab9ba5393e146160a5886134b38a35 100755
--- a/bigbluebutton-html5/imports/ui/components/chat/service.js
+++ b/bigbluebutton-html5/imports/ui/components/chat/service.js
@@ -40,7 +40,8 @@ const getUser = (userId) => {
   return user;
 };
 
-const getMeeting = () => Meetings.findOne({});
+const getWelcomeProp = () => Meetings.findOne({ meetingId: Auth.meetingID },
+  { fields: { welcomeProp: 1 } });
 
 const mapGroupMessage = (message) => {
   const mappedMessage = {
@@ -101,6 +102,7 @@ const reduceAndMapGroupMessages = messages => (messages
 
 const getPublicGroupMessages = () => {
   const publicGroupMessages = GroupChatMsg.find({
+    meetingId: Auth.meetingID,
     chatId: PUBLIC_GROUP_CHAT_ID,
   }, { sort: ['timestamp'] }).fetch();
   return publicGroupMessages;
@@ -111,9 +113,10 @@ const getPrivateGroupMessages = () => {
   const senderId = Auth.userID;
 
   const privateChat = GroupChat.findOne({
+    meetingId: Auth.meetingID,
     users: { $all: [chatID, senderId] },
     access: PRIVATE_CHAT_TYPE,
-  });
+  }, { fields: { chatId: 1 } });
 
   let messages = [];
 
@@ -123,6 +126,7 @@ const getPrivateGroupMessages = () => {
     } = privateChat;
 
     messages = GroupChatMsg.find({
+      meetingId: Auth.meetingID,
       chatId,
     }, { sort: ['timestamp'] }).fetch();
   }
@@ -133,15 +137,17 @@ const getPrivateGroupMessages = () => {
 const isChatLocked = (receiverID) => {
   const isPublic = receiverID === PUBLIC_CHAT_ID;
 
-  const meeting = Meetings.findOne({});
-  const user = Users.findOne({ userId: Auth.userID });
+  const meeting = Meetings.findOne({ meetingId: Auth.meetingID },
+    { fields: { 'lockSettingsProps.disablePublicChat': 1 } });
+  const user = Users.findOne({ meetingId: Auth.meetingID, userId: Auth.userID },
+    { fields: { locked: 1, role: 1 } });
 
   if (meeting.lockSettingsProps !== undefined) {
     if (user.locked && user.role !== ROLE_MODERATOR) {
       if (isPublic) {
         return meeting.lockSettingsProps.disablePublicChat;
       }
-      const receivingUser = Users.findOne({ userId: receiverID });
+      const receivingUser = Users.findOne({ userId: receiverID }, { fields: { role: 1 } });
       const receiverIsMod = receivingUser && receivingUser.role === ROLE_MODERATOR;
       return !receiverIsMod && meeting.lockSettingsProps.disablePrivateChat;
     }
@@ -174,7 +180,8 @@ const sendGroupMessage = (message) => {
   const receiverId = { id: chatID };
 
   if (!isPublicChat) {
-    const privateChat = GroupChat.findOne({ users: { $all: [chatID, sender.userId] } });
+    const privateChat = GroupChat.findOne({ users: { $all: [chatID, sender.userId] } },
+      { fields: { chatId: 1 } });
 
     if (privateChat) {
       const { chatId: privateChatId } = privateChat;
@@ -204,7 +211,8 @@ const sendGroupMessage = (message) => {
 };
 
 const getScrollPosition = (receiverID) => {
-  const scroll = ScrollCollection.findOne({ receiver: receiverID }) || { position: null };
+  const scroll = ScrollCollection.findOne({ receiver: receiverID },
+    { fields: { position: 1 } }) || { position: null };
   return scroll.position;
 };
 
@@ -253,7 +261,7 @@ const htmlDecode = (input) => {
 
 // Export the chat as [Hour:Min] user: message
 const exportChat = (messageList) => {
-  const { welcomeProp } = getMeeting();
+  const { welcomeProp } = getWelcomeProp();
   const { loginTime } = getUser(Auth.userID);
   const { welcomeMsg } = welcomeProp;
 
@@ -280,13 +288,13 @@ const exportChat = (messageList) => {
     if (message.type === SYSTEM_CHAT_TYPE) {
       return `${hourMin} ${message.message}`;
     }
-    const userName = message.sender === PUBLIC_CHAT_USER_ID ? '' : `${getUser(message.sender).name} :`;
+    const userName = message.sender === PUBLIC_CHAT_USER_ID
+      ? ''
+      : `${getUser(message.sender).name} :`;
     return `${hourMin} ${userName} ${htmlDecode(message.message)}`;
   }).join('\n');
 };
 
-const getUnreadMessagesFromChatId = chatId => UnreadMessages.getUnreadMessages(chatId);
-
 const getAllMessages = (chatID) => {
   const filter = {
     sender: { $ne: Auth.userID },
@@ -294,7 +302,8 @@ const getAllMessages = (chatID) => {
   if (chatID === PUBLIC_GROUP_CHAT_ID) {
     filter.chatId = { $eq: chatID };
   } else {
-    const privateChat = GroupChat.findOne({ users: { $all: [chatID, Auth.userID] } });
+    const privateChat = GroupChat.findOne({ users: { $all: [chatID, Auth.userID] } },
+      { fields: { chatId: 1 } });
 
     filter.chatId = { $ne: PUBLIC_GROUP_CHAT_ID };
 
@@ -306,9 +315,6 @@ const getAllMessages = (chatID) => {
   return messages;
 };
 
-const getlastMessage = lastMessages => lastMessages.sort((a,
-  b) => a.timestamp - b.timestamp).pop();
-
 const maxTimestampReducer = (max, el) => ((el.timestamp > max) ? el.timestamp : max);
 
 const maxNumberReducer = (max, el) => ((el > max) ? el : max);
@@ -323,7 +329,7 @@ export default {
   getPublicGroupMessages,
   getPrivateGroupMessages,
   getUser,
-  getMeeting,
+  getWelcomeProp,
   getScrollPosition,
   hasUnreadMessages,
   lastReadMessageTime,
@@ -335,11 +341,7 @@ export default {
   removeFromClosedChatsSession,
   exportChat,
   clearPublicChatHistory,
-  getlastMessage,
-  getUnreadMessagesFromChatId,
-  getAllMessages,
   maxTimestampReducer,
-  maxNumberReducer,
   getLastMessageTimestampFromChatList,
   UnsentMessagesCollection,
 };
diff --git a/bigbluebutton-html5/imports/ui/components/nav-bar/container.jsx b/bigbluebutton-html5/imports/ui/components/nav-bar/container.jsx
index 6619b97b634e96674601863bdf723051a3b115dd..c9563feb79a0356c4ba0cee798d1ba960b6c6497 100755
--- a/bigbluebutton-html5/imports/ui/components/nav-bar/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/nav-bar/container.jsx
@@ -26,7 +26,7 @@ export default withTracker(() => {
   const meetingId = Auth.meetingID;
   const meetingObject = Meetings.findOne({
     meetingId,
-  });
+  }, { fields: { 'meetingProp.name': 1 } });
 
   if (meetingObject != null) {
     meetingTitle = meetingObject.meetingProp.name;
@@ -43,7 +43,7 @@ export default withTracker(() => {
 
   const currentUserId = Auth.userID;
   const { connectRecordingObserver, processOutsideToggleRecording } = Service;
-  const currentUser = Users.findOne({ userId: Auth.userID });
+  const currentUser = Users.findOne({ userId: Auth.userID }, { fields: { role: 1 } });
   const openPanel = Session.get('openPanel');
   const isExpanded = openPanel !== '';
   const amIModerator = currentUser.role === ROLE_MODERATOR;
diff --git a/bigbluebutton-html5/imports/ui/components/note/service.js b/bigbluebutton-html5/imports/ui/components/note/service.js
index fd958e66efa252abe4a32b25b39bb8035f2d7b05..e4a95c80ac45917ce1a2b1b3b63b01ce8f87bdff 100644
--- a/bigbluebutton-html5/imports/ui/components/note/service.js
+++ b/bigbluebutton-html5/imports/ui/components/note/service.js
@@ -3,18 +3,17 @@ import Meetings from '/imports/api/meetings';
 import Note from '/imports/api/note';
 import Auth from '/imports/ui/services/auth';
 import Settings from '/imports/ui/services/settings';
-import mapUser from '/imports/ui/services/user/mapUser';
 import { Session } from 'meteor/session';
 
 const NOTE_CONFIG = Meteor.settings.public.note;
 
 const getNoteId = () => {
-  const note = Note.findOne({ meetingId: Auth.meetingID });
+  const note = Note.findOne({ meetingId: Auth.meetingID }, { fields: { noteId: 1 } });
   return note ? note.noteId : '';
 };
 
 const getReadOnlyNoteId = () => {
-  const note = Note.findOne({ meetingId: Auth.meetingID });
+  const note = Note.findOne({ meetingId: Auth.meetingID }, { fields: { readOnlyNoteId: 1 } });
   return note ? note.readOnlyNoteId : '';
 };
 
@@ -23,14 +22,9 @@ const getLang = () => {
   return locale ? locale.toLowerCase() : '';
 };
 
-const getCurrentUser = () => {
-  const User = Users.findOne({ userId: Auth.userID });
-  return User;
-};
-
 const getNoteParams = () => {
   const { config } = NOTE_CONFIG;
-  const User = getCurrentUser();
+  const User = Users.findOne({ userId: Auth.userID }, { fields: { name: 1, color: 1 } });
   config.userName = User.name;
   config.userColor = User.color;
   config.lang = getLang();
@@ -38,17 +32,18 @@ const getNoteParams = () => {
   const params = [];
   for (const key in config) {
     if (config.hasOwnProperty(key)) {
-      params.push(key + '=' + encodeURIComponent(config[key]));
+      params.push(`${key}=${encodeURIComponent(config[key])}`);
     }
   }
   return params.join('&');
 };
 
 const isLocked = () => {
-  const meeting = Meetings.findOne({ meetingId: Auth.meetingID });
-  const user = getCurrentUser();
+  const meeting = Meetings.findOne({ meetingId: Auth.meetingID }, { fields: { 'lockSettingsProps.disableNote': 1 } });
+  const user = Users.findOne({ userId: Auth.userID }, { fields: { locked: 1, role: 1 } });
 
-  if (meeting.lockSettingsProps && mapUser(user).isLocked) {
+  const ROLE_MODERATOR = Meteor.settings.public.user.role_moderator;
+  if (meeting.lockSettingsProps && user.locked && user.role !== ROLE_MODERATOR) {
     return meeting.lockSettingsProps.disableNote;
   }
   return false;
@@ -56,19 +51,19 @@ const isLocked = () => {
 
 const getReadOnlyURL = () => {
   const readOnlyNoteId = getReadOnlyNoteId();
-  const url = Auth.authenticateURL(NOTE_CONFIG.url + '/p/' + readOnlyNoteId);
+  const url = Auth.authenticateURL(`${NOTE_CONFIG.url}/p/${readOnlyNoteId}`);
   return url;
 };
 
 const getNoteURL = () => {
   const noteId = getNoteId();
   const params = getNoteParams();
-  const url = Auth.authenticateURL(NOTE_CONFIG.url + '/p/' + noteId + '?' + params);
+  const url = Auth.authenticateURL(`${NOTE_CONFIG.url}/p/${noteId}?${params}`);
   return url;
 };
 
 const getRevs = () => {
-  const note = Note.findOne({ meetingId: Auth.meetingID });
+  const note = Note.findOne({ meetingId: Auth.meetingID }, { fields: { revs: 1 } });
   return note ? note.revs : 0;
 };
 
@@ -77,9 +72,7 @@ const isEnabled = () => {
   return NOTE_CONFIG.enabled && note;
 };
 
-const isPanelOpened = () => {
-  return Session.get('openPanel') === 'note';
-};
+const isPanelOpened = () => Session.get('openPanel') === 'note';
 
 export default {
   getNoteURL,
diff --git a/bigbluebutton-html5/imports/ui/components/poll/container.jsx b/bigbluebutton-html5/imports/ui/components/poll/container.jsx
index 4af32960dda9efa58b3b08d39cc6fbd06afe5ddf..ecfecb2b82905ce6216b29d05b8b7376871970f6 100644
--- a/bigbluebutton-html5/imports/ui/components/poll/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/poll/container.jsx
@@ -14,7 +14,7 @@ export default withTracker(() => {
 
   const currentPresentation = Presentations.findOne({
     current: true,
-  }) || {};
+  }, { fields: { podId: 1 } }) || {};
 
   const currentSlide = PresentationAreaService.getCurrentSlide(currentPresentation.podId);
 
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 a6bd269f2a669ae91e8e49a343767b2f6504e586..a076055ede2b9b8c7e806a36350f44fff7e70617 100644
--- a/bigbluebutton-html5/imports/ui/components/presentation/presentation-uploader/service.js
+++ b/bigbluebutton-html5/imports/ui/components/presentation/presentation-uploader/service.js
@@ -190,7 +190,7 @@ const uploadAndConvertPresentations = (
 const setPresentation = (presentationId, podId) => makeCall('setPresentation', presentationId, podId);
 
 const removePresentation = (presentationId, podId) => {
-  const hasPoll = Poll.find({}).fetch().length;
+  const hasPoll = Poll.find({}, { fields: {} }).count();
   if (hasPoll) makeCall('stopPoll');
   makeCall('removePresentation', presentationId, podId);
 };
diff --git a/bigbluebutton-html5/imports/ui/components/subscriptions/component.jsx b/bigbluebutton-html5/imports/ui/components/subscriptions/component.jsx
index 2a4f4fd9d164ab35e8237d86d9e59ccf2c5ae6ca..5364b30874ca75b51248eee42623950b0881f2fe 100755
--- a/bigbluebutton-html5/imports/ui/components/subscriptions/component.jsx
+++ b/bigbluebutton-html5/imports/ui/components/subscriptions/component.jsx
@@ -7,10 +7,10 @@ import Users from '/imports/api/users';
 import Annotations from '/imports/api/annotations';
 import AnnotationsTextService from '/imports/ui/components/whiteboard/annotations/text/service';
 import AnnotationsLocal from '/imports/ui/components/whiteboard/service';
-import mapUser from '/imports/ui/services/user/mapUser';
 
 
 const CHAT_CONFIG = Meteor.settings.public.chat;
+const ROLE_MODERATOR = Meteor.settings.public.user.role_moderator;
 const CHAT_ENABLED = CHAT_CONFIG.enabled;
 const PUBLIC_GROUP_CHAT_ID = CHAT_CONFIG.public_group_id;
 const PUBLIC_CHAT_TYPE = CHAT_CONFIG.type_public;
@@ -90,10 +90,10 @@ export default withTracker(() => {
   const User = Users.findOne({ intId: requesterUserId });
 
   if (User) {
-    const mappedUser = mapUser(User);
-    Meteor.subscribe('users', credentials, mappedUser.isModerator, subscriptionErrorHandler);
-    Meteor.subscribe('breakouts', credentials, mappedUser.isModerator, subscriptionErrorHandler);
-    Meteor.subscribe('meetings', credentials, mappedUser.isModerator, subscriptionErrorHandler);
+    const userIsModerator = User.role === ROLE_MODERATOR;
+    Meteor.subscribe('users', credentials, userIsModerator, subscriptionErrorHandler);
+    Meteor.subscribe('breakouts', credentials, userIsModerator, subscriptionErrorHandler);
+    Meteor.subscribe('meetings', credentials, userIsModerator, subscriptionErrorHandler);
   }
 
   const annotationsHandler = Meteor.subscribe('annotations', credentials, {
diff --git a/bigbluebutton-html5/imports/ui/components/user-list/service.js b/bigbluebutton-html5/imports/ui/components/user-list/service.js
index 97432a4c616b3ac77179c02c1023c1797945d059..bc0b3a7420dab3ffd939c11c632a6ca7586ffa9a 100755
--- a/bigbluebutton-html5/imports/ui/components/user-list/service.js
+++ b/bigbluebutton-html5/imports/ui/components/user-list/service.js
@@ -6,7 +6,6 @@ import Meetings from '/imports/api/meetings';
 import Auth from '/imports/ui/services/auth';
 import UnreadMessages from '/imports/ui/services/unread-messages';
 import Storage from '/imports/ui/services/storage/session';
-import mapUser from '/imports/ui/services/user/mapUser';
 import { EMOJI_STATUSES } from '/imports/utils/statuses';
 import { makeCall } from '/imports/ui/services/api';
 import _ from 'lodash';
@@ -189,9 +188,9 @@ const getUsers = () => {
     }, userFindSorting)
     .fetch();
 
-  const currentUser = Users.findOne({ userId: Auth.userID });
+  const currentUser = Users.findOne({ userId: Auth.userID }, { fields: { role: 1, locked: 1 } });
   if (currentUser && currentUser.role === ROLE_VIEWER && currentUser.locked) {
-    const meeting = Meetings.findOne({ meetingId: Auth.meetingID });
+    const meeting = Meetings.findOne({ meetingId: Auth.meetingID }, { fields: { 'lockSettingsProps.hideUserList': 1 } });
     if (meeting && meeting.lockSettingsProps && meeting.lockSettingsProps.hideUserList) {
       const moderatorOrCurrentUser = u => u.role === ROLE_MODERATOR || u.userId === Auth.userID;
       users = users.filter(moderatorOrCurrentUser);
@@ -201,11 +200,12 @@ const getUsers = () => {
   return users.sort(sortUsers);
 };
 
-const hasBreakoutRoom = () => Breakouts.find({ parentMeetingId: Auth.meetingID }).count() > 0;
+const hasBreakoutRoom = () => Breakouts.find({ parentMeetingId: Auth.meetingID },
+  { fields: {} }).count() > 0;
 
 const getActiveChats = (chatID) => {
   const privateChat = GroupChat
-    .find({ users: { $all: [Auth.userID] } })
+    .find({ users: { $all: [Auth.userID] } }, { fields: { chatId: 1 } })
     .fetch()
     .map(chat => chat.chatId);
 
@@ -229,11 +229,10 @@ const getActiveChats = (chatID) => {
   activeChats = _.uniq(_.compact(activeChats));
 
   activeChats = Users
-    .find({ userId: { $in: activeChats } })
-    .map(mapUser)
+    .find({ userId: { $in: activeChats } }, { fields: { userId: 1 } })
     .map((op) => {
       const activeChat = op;
-      activeChat.unreadCounter = UnreadMessages.count(op.id);
+      activeChat.unreadCounter = UnreadMessages.count(op.userId);
       return activeChat;
     });
 
@@ -357,13 +356,6 @@ const getAvailableActions = (currentUser, user, isBreakoutRoom) => {
   };
 };
 
-const getCurrentUser = () => {
-  const currentUserId = Auth.userID;
-  const currentUser = Users.findOne({ userId: currentUserId });
-
-  return (currentUser) ? mapUser(currentUser) : null;
-};
-
 const normalizeEmojiName = emoji => (
   emoji in EMOJI_STATUSES ? EMOJI_STATUSES[emoji] : emoji
 );
@@ -488,7 +480,6 @@ export default {
   changeRole,
   getUsers,
   getActiveChats,
-  getCurrentUser,
   getAvailableActions,
   normalizeEmojiName,
   isMeetingLocked,
diff --git a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-dropdown/component.jsx b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-dropdown/component.jsx
index c236cdc09b71e3520569a85c11897979fcbf1bb8..4429cfd528534b0267fac9bfcff2ba54c1db12fb 100755
--- a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-dropdown/component.jsx
+++ b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-dropdown/component.jsx
@@ -153,7 +153,6 @@ class UserDropdown extends PureComponent {
   }
 
   componentDidUpdate() {
-    const { dropdownVisible } = this.props;
     this.checkDropdownDirection();
   }
 
diff --git a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-name/component.jsx b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-name/component.jsx
index d3c7e26181ae2c17ea2df0ebd3b6561a17c94ec7..386abd3815391398579c24cf17779566d110e92a 100644
--- a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-name/component.jsx
+++ b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-list-item/user-name/component.jsx
@@ -71,13 +71,15 @@ const UserName = (props) => {
   }
 
   if (isMeetingLocked(meetingId) && user.isLocked) {
-    userNameSub.push(<span>
-      <Icon iconName="lock" />
-      {intl.formatMessage(messages.locked)}
-    </span>);
+    userNameSub.push(
+      <span>
+        <Icon iconName="lock" />
+        {intl.formatMessage(messages.locked)}
+      </span>,
+    );
   }
 
-  if (user.isGuest) {
+  if (user.isGuest) { // FIXME- isGuest is not defined
     userNameSub.push(intl.formatMessage(messages.guest));
   }
 
@@ -89,13 +91,17 @@ const UserName = (props) => {
       aria-expanded={isActionsOpen}
     >
       <span className={styles.userNameMain}>
-        {user.name} <i>{(user.isCurrent) ? `(${intl.formatMessage(messages.you)})` : ''}</i>
+        {user.name}
+        {' '}
+        <i>{(user.isCurrent) ? `(${intl.formatMessage(messages.you)})` : ''}</i>
       </span>
       {
-        userNameSub.length ?
-          <span className={styles.userNameSub}>
-            {userNameSub.reduce((prev, curr) => [prev, ' | ', curr])}
-          </span>
+        userNameSub.length
+          ? (
+            <span className={styles.userNameSub}>
+              {userNameSub.reduce((prev, curr) => [prev, ' | ', curr])}
+            </span>
+          )
           : null
       }
     </div>
diff --git a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-options/container.jsx b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-options/container.jsx
index 6dc465100e43f3eb07a56036fd27150eb2b9547a..bc1f2999c3bd21108d91322e3a1c30d91484f9ab 100755
--- a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-options/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-participants/user-options/container.jsx
@@ -6,8 +6,6 @@ import userListService from '/imports/ui/components/user-list/service';
 import logger from '/imports/startup/client/logger';
 import { defineMessages, injectIntl, intlShape } from 'react-intl';
 import { notify } from '/imports/ui/services/notification';
-import mapUser from '/imports/ui/services/user/mapUser';
-import Users from '/imports/api/users';
 import UserOptions from './component';
 
 const propTypes = {
@@ -42,7 +40,6 @@ const UserOptionsContainer = withTracker((props) => {
       intl.formatMessage(intlMessages.clearStatusMessage), 'info', 'clear_status',
     );
   };
-  const currentUser = Users.findOne({ userId: Auth.userID });
 
   const isMeetingMuteOnStart = () => {
     const { voiceProp } = meeting;
@@ -88,7 +85,6 @@ const UserOptionsContainer = withTracker((props) => {
     users: Service.users(),
     userListService,
     isMeteorConnected: Meteor.status().connected,
-    currentUser: currentUser ? mapUser(currentUser) : {},
   };
 })(UserOptions);
 
diff --git a/bigbluebutton-html5/imports/ui/components/video-provider/many-users-notify/container.jsx b/bigbluebutton-html5/imports/ui/components/video-provider/many-users-notify/container.jsx
index e16bea1b455c65ffdf4730bca721337d872a14e4..62b498dc57905a7997c86da61384e2e0c0fb0f10 100644
--- a/bigbluebutton-html5/imports/ui/components/video-provider/many-users-notify/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/video-provider/many-users-notify/container.jsx
@@ -15,12 +15,14 @@ export default withTracker(() => ({
     hasStream: true,
     role: ROLE_VIEWER,
     presenter: false,
-  }).count(),
-  currentUserIsModerator: Users.findOne({ userId: Auth.userID }).role === ROLE_MODERATOR,
-  lockSettings: Meetings.findOne({ meetingId: Auth.meetingID }).lockSettingsProps,
+  }, { fields: {} }).count(),
+  currentUserIsModerator: Users.findOne({ userId: Auth.userID },
+    { fields: { role: 1 } }).role === ROLE_MODERATOR,
+  lockSettings: Meetings.findOne({ meetingId: Auth.meetingID },
+    { fields: { lockSettingsProps: 1 } }).lockSettingsProps,
   webcamOnlyForModerator: Meetings.findOne({
     meetingId: Auth.meetingID,
-  }).usersProp.webcamsOnlyForModerator,
+  }, { fields: { 'usersProp.webcamsOnlyForModerator': 1 } }).usersProp.webcamsOnlyForModerator,
   limitOfViewersInWebcam: Meteor.settings.public.app.viewersInWebcam,
   limitOfViewersInWebcamIsEnable: Meteor.settings.public.app.enableLimitOfViewersInWebcam,
   toggleWebcamsOnlyForModerator: LockViewersService.toggleWebcamsOnlyForModerator,
diff --git a/bigbluebutton-html5/imports/ui/components/video-provider/video-button/service.js b/bigbluebutton-html5/imports/ui/components/video-provider/video-button/service.js
index ace4df9754afae80f19c3e28fc4ef456525da0c2..202510f8daa2d69140a4c2d1dc76a4678eabe44e 100755
--- a/bigbluebutton-html5/imports/ui/components/video-provider/video-button/service.js
+++ b/bigbluebutton-html5/imports/ui/components/video-provider/video-button/service.js
@@ -1,10 +1,11 @@
 import Settings from '/imports/ui/services/settings';
-import mapUser from '/imports/ui/services/user/mapUser';
 import Auth from '/imports/ui/services/auth';
 import Users from '/imports/api/users/';
 import VideoService from '../service';
 
-const baseName = Meteor.settings.public.app.cdn + Meteor.settings.public.app.basename;
+const PUBLIC_SETTINGS = Meteor.settings.public;
+const baseName = PUBLIC_SETTINGS.app.cdn + PUBLIC_SETTINGS.app.basename;
+const ROLE_MODERATOR = PUBLIC_SETTINGS.user.role_moderator;
 
 const isSharingVideo = () => {
   const userId = Auth.userID;
@@ -19,8 +20,8 @@ const isDisabled = () => {
   const isConnected = VideoService.isConnected();
 
   const lockCam = VideoService.webcamsLocked();
-  const user = Users.findOne({ userId: Auth.userID });
-  const userLocked = mapUser(user).isLocked;
+  const user = Users.findOne({ userId: Auth.userID }, { fields: { locked: 1, role: 1 } });
+  const userLocked = user.locked && user.role !== ROLE_MODERATOR;
 
   const isConnecting = (!isSharingVideo && isConnected);
 
diff --git a/bigbluebutton-html5/imports/ui/services/audio-manager/index.js b/bigbluebutton-html5/imports/ui/services/audio-manager/index.js
index e2458d4ffbab95101da3793d91fd17654e1c2cee..9afbc93a76575111ff6f558489a4f12eab9c839d 100755
--- a/bigbluebutton-html5/imports/ui/services/audio-manager/index.js
+++ b/bigbluebutton-html5/imports/ui/services/audio-manager/index.js
@@ -268,7 +268,7 @@ class AudioManager {
 
     // listen to the VoiceUsers changes and update the flag
     if (!this.muteHandle) {
-      const query = VoiceUsers.find({ intId: Auth.userID });
+      const query = VoiceUsers.find({ intId: Auth.userID }, { fields: { muted: 1, talking: 1 } });
       this.muteHandle = query.observeChanges({
         changed: (id, fields) => {
           if (fields.muted !== undefined && fields.muted !== this.isMuted) {
diff --git a/bigbluebutton-html5/imports/ui/services/auth/index.js b/bigbluebutton-html5/imports/ui/services/auth/index.js
index 7d0c83ff55c774be5b7815c2def9d8b305b75f7e..9389a914f69c3516546a94e74e9c608e098aa4fa 100755
--- a/bigbluebutton-html5/imports/ui/services/auth/index.js
+++ b/bigbluebutton-html5/imports/ui/services/auth/index.js
@@ -219,7 +219,10 @@ class Auth {
         Meteor.subscribe('current-user', this.credentials);
 
         const selector = { meetingId: this.meetingID, userId: this.userID };
-        const User = Users.findOne(selector);
+        const fields = {
+          intId: 1, ejected: 1, validated: 1, connectionStatus: 1,
+        };
+        const User = Users.findOne(selector, { fields });
         // 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');
diff --git a/bigbluebutton-html5/imports/ui/services/network-information/index.js b/bigbluebutton-html5/imports/ui/services/network-information/index.js
index f38109631338616158caadde21d893cb34577cab..9fba045c279ef9e63e804e2879d6397ce4e5a679 100644
--- a/bigbluebutton-html5/imports/ui/services/network-information/index.js
+++ b/bigbluebutton-html5/imports/ui/services/network-information/index.js
@@ -155,7 +155,8 @@ export const startBandwidthMonitoring = () => {
       }
     }
 
-    const lastEffectiveConnectionType = Users.findOne({ userId: Auth.userID });
+    const lastEffectiveConnectionType = Users.findOne({ userId: Auth.userID },
+      { fields: { effectiveConnectionType: 1 } });
 
     if (lastEffectiveConnectionType
       && lastEffectiveConnectionType.effectiveConnectionType !== effectiveType) {
diff --git a/bigbluebutton-html5/imports/ui/services/unread-messages/index.js b/bigbluebutton-html5/imports/ui/services/unread-messages/index.js
index 7eb0f22041b66bbca0f8966fb0882e083b069ece..9c80b3f76249ea06fb0b5996fad1a02d8d7dc790 100755
--- a/bigbluebutton-html5/imports/ui/services/unread-messages/index.js
+++ b/bigbluebutton-html5/imports/ui/services/unread-messages/index.js
@@ -12,7 +12,10 @@ const PUBLIC_GROUP_CHAT_ID = CHAT_CONFIG.public_group_id;
 class UnreadMessagesTracker {
   constructor() {
     this._tracker = new Tracker.Dependency();
-    this._unreadChats = { ...Storage.getItem('UNREAD_CHATS'), [PUBLIC_GROUP_CHAT_ID]: (new Date()).getTime() };
+    this._unreadChats = {
+      ...Storage.getItem('UNREAD_CHATS'),
+      [PUBLIC_GROUP_CHAT_ID]: (new Date()).getTime(),
+    };
     this.get = this.get.bind(this);
   }
 
@@ -42,7 +45,8 @@ class UnreadMessagesTracker {
     if (chatID === PUBLIC_GROUP_CHAT_ID) {
       filter.chatId = { $eq: chatID };
     } else {
-      const privateChat = GroupChat.findOne({ users: { $all: [chatID, Auth.userID] } });
+      const privateChat = GroupChat.findOne({ users: { $all: [chatID, Auth.userID] } },
+        { fields: { chatId: 1 } });
 
       filter.chatId = { $ne: PUBLIC_GROUP_CHAT_ID };