diff --git a/bigbluebutton-html5/imports/ui/components/actions-bar/container.jsx b/bigbluebutton-html5/imports/ui/components/actions-bar/container.jsx
index 646bae710f371ed62c7117dd63bde9a455019606..748d22edcbf0c0a2f8bbe70638bc465b8e440569 100644
--- a/bigbluebutton-html5/imports/ui/components/actions-bar/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/actions-bar/container.jsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import React, { useContext } from 'react';
 import { Meteor } from 'meteor/meteor';
 import { withTracker } from 'meteor/react-meteor-data';
 import { injectIntl } from 'react-intl';
@@ -6,6 +6,7 @@ import getFromUserSettings from '/imports/ui/services/users-settings';
 import Auth from '/imports/ui/services/auth';
 import PresentationService from '/imports/ui/components/presentation/service';
 import Presentations from '/imports/api/presentations';
+import { UsersContext } from '../components-data/users-context/context';
 import ActionsBar from './component';
 import Service from './service';
 import UserListService from '/imports/ui/components/user-list/service';
@@ -17,7 +18,21 @@ import MediaService, {
   shouldEnableSwapLayout,
 } from '../media/service';
 
-const ActionsBarContainer = props => <ActionsBar {...props} />;
+const ActionsBarContainer = (props) => {
+  const usingUsersContext = useContext(UsersContext);
+  const { users } = usingUsersContext;
+  const currentUser = users[Auth.userID];
+  return (
+    <ActionsBar {
+      ...{
+        ...props,
+        currentUser,
+      }
+    }
+    />
+  );
+};
+
 const POLLING_ENABLED = Meteor.settings.public.poll.enabled;
 const PRESENTATION_DISABLED = Meteor.settings.public.layout.hidePresentation;
 const SELECT_RANDOM_USER_ENABLED = Meteor.settings.public.selectRandomUser.enabled;
@@ -42,5 +57,4 @@ export default withTracker(() => ({
     { fields: {} }),
   allowExternalVideo: Meteor.settings.public.externalVideoPlayer.enabled,
   setEmojiStatus: UserListService.setEmojiStatus,
-  currentUser: Service.currentUser(),
 }))(injectIntl(ActionsBarContainer));
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 c4c0149bfd41d821484259e20fa2c5f53f1657a9..872c7263c47f4697907809b8c24b9ed00c2013b6 100755
--- a/bigbluebutton-html5/imports/ui/components/audio/audio-controls/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/audio/audio-controls/container.jsx
@@ -4,9 +4,9 @@ import { withModalMounter } from '/imports/ui/components/modal/service';
 import AudioManager from '/imports/ui/services/audio-manager';
 import { makeCall } from '/imports/ui/services/api';
 import lockContextContainer from '/imports/ui/components/lock-viewers/context/container';
+import { withUsersConsumer } from '/imports/ui/components/components-data/users-context/context';
 import logger from '/imports/startup/client/logger';
 import Auth from '/imports/ui/services/auth';
-import Users from '/imports/api/users';
 import Storage from '/imports/ui/services/storage/session';
 import getFromUserSettings from '/imports/ui/services/users-settings';
 import AudioControls from './component';
@@ -74,13 +74,8 @@ const {
   joinListenOnly,
 } = Service;
 
-export default lockContextContainer(withModalMounter(withTracker(({ mountModal, userLocks }) => {
-  const currentUser = Users.findOne({ meetingId: Auth.meetingID, userId: Auth.userID }, {
-    fields: {
-      role: 1,
-      presenter: 1,
-    },
-  });
+export default withUsersConsumer(lockContextContainer(withModalMounter(withTracker(({ mountModal, userLocks, users }) => {
+  const currentUser = users[Auth.userID];
   const isViewer = currentUser.role === ROLE_VIEWER;
   const isPresenter = currentUser.presenter;
   const { status } = Service.getBreakoutAudioTransferStatus();
@@ -108,4 +103,4 @@ export default lockContextContainer(withModalMounter(withTracker(({ mountModal,
     isViewer,
     isPresenter,
   });
-})(AudioControlsContainer)));
+})(AudioControlsContainer))));
diff --git a/bigbluebutton-html5/imports/ui/components/chat/alert/container.jsx b/bigbluebutton-html5/imports/ui/components/chat/alert/container.jsx
index dd0ad81433fb613244856c71d7022b1208e2570a..bf495ad4237aa1e713ab3f97fbdcecb096aae14f 100755
--- a/bigbluebutton-html5/imports/ui/components/chat/alert/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/chat/alert/container.jsx
@@ -1,20 +1,24 @@
-import React, { memo } from 'react';
+import React, { memo, useContext } from 'react';
 import { withTracker } from 'meteor/react-meteor-data';
-import UserListService from '/imports/ui/components/user-list/service';
 import Settings from '/imports/ui/services/settings';
 import ChatAlert from './component';
 import Auth from '/imports/ui/services/auth';
-import Users from '/imports/api/users';
+import { UsersContext } from '/imports/ui/components/components-data/users-context/context';
 
-const ChatAlertContainer = props => (
-  <ChatAlert {...props} />
-);
+const ChatAlertContainer = (props) => {
+  const usingUsersContext = useContext(UsersContext);
+  const { users } = usingUsersContext;
+  const currentUser = users[Auth.userID];
+  const { authTokenValidatedTime } = currentUser;
+  return (
+    <ChatAlert {...props} joinTimestamp={authTokenValidatedTime} />
+  );
+};
 
 export default withTracker(() => {
   const AppSettings = Settings.application;
   const activeChats = [];
   // UserListService.getActiveChats();
-  const { loginTime } = Users.findOne({ userId: Auth.userID }, { fields: { loginTime: 1 } });
 
   const openPanel = Session.get('openPanel');
   let idChatOpen = Session.get('idChatOpen');
@@ -31,7 +35,6 @@ export default withTracker(() => {
     pushAlertDisabled: !AppSettings.chatPushAlerts,
     activeChats,
     publicUserId: Meteor.settings.public.chat.public_group_id,
-    joinTimestamp: loginTime,
     idChatOpen,
   };
 })(memo(ChatAlertContainer));
diff --git a/bigbluebutton-html5/imports/ui/components/chat/component.jsx b/bigbluebutton-html5/imports/ui/components/chat/component.jsx
index 8647e56b28f96af422f29a830076d83a6048734a..4746fc948186f3becc174c98b64d95a38406e932 100755
--- a/bigbluebutton-html5/imports/ui/components/chat/component.jsx
+++ b/bigbluebutton-html5/imports/ui/components/chat/component.jsx
@@ -143,12 +143,6 @@ export default withShortcutHelper(injectWbResizeEvent(injectIntl(memo(Chat))), [
 const propTypes = {
   chatID: PropTypes.string.isRequired,
   title: PropTypes.string.isRequired,
-  messages: PropTypes.arrayOf(PropTypes.objectOf(PropTypes.oneOfType([
-    PropTypes.array,
-    PropTypes.string,
-    PropTypes.number,
-    PropTypes.object,
-  ])).isRequired).isRequired,
   shortcuts: PropTypes.objectOf(PropTypes.string),
   partnerIsLoggedOut: PropTypes.bool.isRequired,
   isChatLocked: PropTypes.bool.isRequired,
diff --git a/bigbluebutton-html5/imports/ui/components/chat/container.jsx b/bigbluebutton-html5/imports/ui/components/chat/container.jsx
index 001b37f9ac0eb1931774b1823a7ca8d7c098a218..cb84a08ada09e0a0f47fdaed3430f62da6c99d5c 100755
--- a/bigbluebutton-html5/imports/ui/components/chat/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/chat/container.jsx
@@ -8,7 +8,9 @@ import Storage from '/imports/ui/services/storage/session';
 import { meetingIsBreakout } from '/imports/ui/components/app/service';
 import { ChatContext, getLoginTime } from '../components-data/chat-context/context';
 import { GroupChatContext } from '../components-data/group-chat-context/context';
+import { UsersContext } from '../components-data/users-context/context';
 import ChatLogger from '/imports/ui/components/chat/chat-logger/ChatLogger';
+import lockContextContainer from '/imports/ui/components/lock-viewers/context/container';
 import Chat from './component';
 import ChatService from './service';
 
@@ -60,6 +62,7 @@ const throttledFunc = _.throttle(() => {
 }, DEBOUNCE_TIME, { trailing: true, leading: true });
 
 const ChatContainer = (props) => {
+
   useEffect(() => {
     ChatService.removeFromClosedChatsSession();
   }, []);
@@ -71,11 +74,13 @@ const ChatContainer = (props) => {
     children,
     unmounting,
     chatID,
-    amIModerator,
     loginTime,
     intl,
+    userLocks,
+    lockSettings,
+    users: propUsers,
+    ...restProps
   } = props;
-
   ChatLogger.debug('ChatContainer::render::props', props);
 
   const isPublicChat = chatID === PUBLIC_CHAT_KEY;
@@ -103,7 +108,10 @@ const ChatContainer = (props) => {
       sender: null,
     }
   };
-
+  const usingUsersContext = useContext(UsersContext);
+  const { users } = usingUsersContext;
+  const currentUser = users[Auth.userID];
+  const amIModerator = currentUser.role === ROLE_MODERATOR;
   const systemMessagesIds = [sysMessagesIds.welcomeId, amIModerator && modOnlyMessage && sysMessagesIds.moderatorId].filter(i => i);
 
   const usingChatContext = useContext(ChatContext);
@@ -111,7 +119,7 @@ const ChatContainer = (props) => {
   const [stateLastMsg, setLastMsg] = useState(null);
   const [stateTimeWindows, setTimeWindows] = useState(isPublicChat ? [...systemMessagesIds.map((item) => systemMessages[item])] : []);
   const [lastTimeWindowValuesBuild, setLastTimeWindowValuesBuild] = useState(0);
-
+  
   const { groupChat } = usingGroupChatContext;
   const participants = groupChat[chatID]?.participants;
   const chatName = participants?.filter((user) => user.id !== Auth.userID)[0]?.name;
@@ -171,10 +179,10 @@ const ChatContainer = (props) => {
     ["ReactVirtualized__Grid", "ReactVirtualized__Grid__innerScrollContainer"], 
     "role"
   );
-  
+
   return (
     <Chat {...{
-      ...props,
+      ...restProps,
       chatID,
       amIModerator,
       count: (contextChat?.unreadTimeWindows.size || 0),
@@ -184,7 +192,6 @@ const ChatContainer = (props) => {
       syncing: contextChat?.syncing,
       syncedPercent: contextChat?.syncedPercent,
       chatName,
-      contextChat,
       lastTimeWindowValuesBuild,
     }}>
       {children}
@@ -192,16 +199,11 @@ const ChatContainer = (props) => {
   );
 };
 
-export default injectIntl(withTracker(({ intl }) => {
+export default lockContextContainer(injectIntl(withTracker(({ intl, userLocks }) => {
   const chatID = Session.get('idChatOpen');
-  let isChatLocked = ChatService.isChatLocked(chatID);
-
-  // let chatName = title;
+  const isChatLocked = userLocks.userPrivateChat || userLocks.userPublicChat;
   let partnerIsLoggedOut = false;
 
-  const currentUser = ChatService.getUser(Auth.userID);
-  const amIModerator = currentUser.role === ROLE_MODERATOR;
-
   if (!chatID) {
     // No chatID is set so the panel is closed, about to close, or wasn't opened correctly
     return {
@@ -209,22 +211,18 @@ export default injectIntl(withTracker(({ intl }) => {
     };
   }
 
-
-
   const { connected: isMeteorConnected } = Meteor.status();
 
   return {
     chatID,
     intl,
-    messages: [],
     partnerIsLoggedOut,
     isChatLocked,
     isMeteorConnected,
-    amIModerator,
     meetingIsBreakout: meetingIsBreakout(),
     loginTime: getLoginTime(),
     actions: {
       handleClosePrivateChat: ChatService.closePrivateChat,
     },
   };
-})(ChatContainer));
+})(ChatContainer)));
diff --git a/bigbluebutton-html5/imports/ui/components/components-data/users-context/context.jsx b/bigbluebutton-html5/imports/ui/components/components-data/users-context/context.jsx
index 18585a8b2a75a8f0fb46b10783c57581e794baf3..2b73a0d49ff226321e541e8673ab51fdf210a2e5 100644
--- a/bigbluebutton-html5/imports/ui/components/components-data/users-context/context.jsx
+++ b/bigbluebutton-html5/imports/ui/components/components-data/users-context/context.jsx
@@ -109,8 +109,9 @@ export const UsersContextConsumer = Component => props => (
   </UsersContext.Consumer>
 );
 
+export const withUsersConsumer = Component => UsersContextConsumer(Component);
+
 export default {
   UsersContextConsumer,
   UsersContextProvider,
 };
-
diff --git a/bigbluebutton-html5/imports/ui/components/lock-viewers/context/container.jsx b/bigbluebutton-html5/imports/ui/components/lock-viewers/context/container.jsx
index 33f8bc1bc1255e1fb71d093801ea08e788566a36..e3573e5ed5c03ff984d24fd5cab3e09e07c6da6f 100644
--- a/bigbluebutton-html5/imports/ui/components/lock-viewers/context/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/lock-viewers/context/container.jsx
@@ -1,17 +1,17 @@
 import { withTracker } from 'meteor/react-meteor-data';
 import Meetings from '/imports/api/meetings';
-import Users from '/imports/api/users';
 import Auth from '/imports/ui/services/auth';
 import { LockStruct } from './context';
+import { withUsersConsumer } from '/imports/ui/components/components-data/users-context/context';
 import { withLockContext } from './withContext';
 
 const ROLE_MODERATOR = Meteor.settings.public.user.role_moderator;
 
-const lockContextContainer = component => withTracker(() => {
+const lockContextContainer = component => withUsersConsumer(withTracker(({ users }) => {
   const lockSetting = new LockStruct();
   const Meeting = Meetings.findOne({ meetingId: Auth.meetingID },
     { fields: { lockSettingsProps: 1 } });
-  const User = Users.findOne({ userId: Auth.userID }, { fields: { locked: 1, role: 1 } });
+  const User = users[Auth.userID];
   const userIsLocked = User.locked && User.role !== ROLE_MODERATOR;
   const lockSettings = Meeting.lockSettingsProps;
 
@@ -25,6 +25,6 @@ const lockContextContainer = component => withTracker(() => {
   lockSetting.userLocks.userLockedLayout = userIsLocked && lockSettings.lockedLayout;
 
   return lockSetting;
-})(withLockContext(component));
+})(withLockContext(component)));
 
 export default lockContextContainer;
diff --git a/bigbluebutton-html5/imports/ui/components/nav-bar/container.jsx b/bigbluebutton-html5/imports/ui/components/nav-bar/container.jsx
index 7669d8c133ac59b89685485479e091e2be3b5fbb..e207de41f7204c94f6e9d5ce92526dc49d9cddc4 100755
--- a/bigbluebutton-html5/imports/ui/components/nav-bar/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/nav-bar/container.jsx
@@ -3,7 +3,6 @@ import { Meteor } from 'meteor/meteor';
 import { withTracker } from 'meteor/react-meteor-data';
 import { Session } from 'meteor/session';
 import Meetings from '/imports/api/meetings';
-import Users from '/imports/api/users';
 import Auth from '/imports/ui/services/auth';
 import getFromUserSettings from '/imports/ui/services/users-settings';
 import { ChatContext } from '/imports/ui/components/components-data/chat-context/context';
@@ -35,15 +34,16 @@ const NavBarContainer = ({ children, ...props }) => {
   const { groupChat: groupChats } = usingGroupChatContext;
   const hasUnreadMessages = checkUnreadMessages({ groupChatsMessages, groupChats, users });
 
+  const currentUser = users[Auth.userID];
+  const amIModerator = currentUser.role === ROLE_MODERATOR;
+
   return (
-    <NavBar {...props} hasUnreadMessages={hasUnreadMessages}>
+    <NavBar {...props} amIModerator={amIModerator} hasUnreadMessages={hasUnreadMessages}>
       {children}
     </NavBar>
   );
 }
 
-
-
 export default withTracker(() => {
   const CLIENT_TITLE = getFromUserSettings('bbb_client_title', PUBLIC_CONFIG.app.clientTitle);
 
@@ -66,15 +66,11 @@ export default withTracker(() => {
   }
 
   const { connectRecordingObserver, processOutsideToggleRecording } = Service;
-  const currentUser = Users.findOne({ userId: Auth.userID }, { fields: { role: 1 } });
   const openPanel = Session.get('openPanel');
   const isExpanded = openPanel !== '';
-  const amIModerator = currentUser.role === ROLE_MODERATOR;
   const hasUnreadNotes = NoteService.hasUnreadNotes();
-  
 
   return {
-    amIModerator,
     isExpanded,
     currentUserId: Auth.userID,
     processOutsideToggleRecording,
diff --git a/bigbluebutton-html5/imports/ui/components/presentation/container.jsx b/bigbluebutton-html5/imports/ui/components/presentation/container.jsx
index 3a5d8790783f89f71d35d0e52c1bd81e1841914e..5a0cde5ea8f94a1237892099a2a5146ae5b11614 100755
--- a/bigbluebutton-html5/imports/ui/components/presentation/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/presentation/container.jsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import React, { useContext } from 'react';
 import { withTracker } from 'meteor/react-meteor-data';
 import MediaService, { getSwapLayout, shouldEnableSwapLayout } from '/imports/ui/components/media/service';
 import { notify } from '/imports/ui/services/notification';
@@ -6,17 +6,30 @@ import PresentationAreaService from './service';
 import { Slides } from '/imports/api/slides';
 import PresentationArea from './component';
 import PresentationToolbarService from './presentation-toolbar/service';
+import { UsersContext } from '../components-data/users-context/context';
 import Auth from '/imports/ui/services/auth';
 import Meetings from '/imports/api/meetings';
-import Users from '/imports/api/users';
 import getFromUserSettings from '/imports/ui/services/users-settings';
 import WhiteboardService from '/imports/ui/components/whiteboard/service';
 
 const ROLE_VIEWER = Meteor.settings.public.user.role_viewer;
 
-const PresentationAreaContainer = ({ presentationPodIds, mountPresentationArea, ...props }) => (
-  mountPresentationArea && <PresentationArea {...props} />
-);
+const PresentationAreaContainer = ({ presentationPodIds, mountPresentationArea, ...props }) => {
+  const usingUsersContext = useContext(UsersContext);
+  const { users } = usingUsersContext;
+  const currentUser = users[Auth.userID];
+  return mountPresentationArea
+    && (
+      <PresentationArea
+        {
+        ...{
+          ...props,
+          isViewer: currentUser.role === ROLE_VIEWER,
+        }
+        }
+      />
+    );
+};
 
 const APP_CONFIG = Meteor.settings.public.app;
 const PRELOAD_NEXT_SLIDE = APP_CONFIG.preloadNextSlides;
@@ -26,11 +39,6 @@ export default withTracker(({ podId }) => {
   const currentSlide = PresentationAreaService.getCurrentSlide(podId);
   const presentationIsDownloadable = PresentationAreaService.isPresentationDownloadable(podId);
   const layoutSwapped = getSwapLayout() && shouldEnableSwapLayout();
-  const isViewer = Users.findOne({ meetingId: Auth.meetingID, userId: Auth.userID }, {
-    fields: {
-      role: 1,
-    },
-  }).role === ROLE_VIEWER;
 
   let slidePosition;
   if (currentSlide) {
@@ -89,7 +97,6 @@ export default withTracker(({ podId }) => {
         publishedPoll: 1,
       },
     }).publishedPoll,
-    isViewer,
     currentPresentationId: Session.get('currentPresentationId') || null,
     restoreOnUpdate: getFromUserSettings(
       'bbb_force_restore_presentation_on_new_events',
diff --git a/bigbluebutton-html5/imports/ui/components/status-notifier/container.jsx b/bigbluebutton-html5/imports/ui/components/status-notifier/container.jsx
index ab6d34f43441cbe8ebf43faaea604bd0fee58940..efbbc1e1820f55bd8f705ce78ff0acaf1749c50d 100644
--- a/bigbluebutton-html5/imports/ui/components/status-notifier/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/status-notifier/container.jsx
@@ -1,18 +1,30 @@
-import React from 'react';
+import React, { useContext } from 'react';
 import { withTracker } from 'meteor/react-meteor-data';
 import Auth from '/imports/ui/services/auth';
 import Users from '/imports/api/users';
 import Settings from '/imports/ui/services/settings';
+import { UsersContext } from '/imports/ui/components/components-data/users-context/context';
 import { makeCall } from '/imports/ui/services/api';
 import StatusNotifier from './component';
 
 const ROLE_VIEWER = Meteor.settings.public.user.role_viewer;
 
-const StatusNotifierContainer = ({ ...props }) => <StatusNotifier {...props} />;
+const StatusNotifierContainer = (props) => {
+  const usingUsersContext = useContext(UsersContext);
+  const { users } = usingUsersContext;
+  const currentUser = users[Auth.userID];
+  const isViewer = currentUser.role === ROLE_VIEWER;
+  return (
+    <StatusNotifier {...{
+      ...props,
+      isViewer,
+    }}
+    />
+  );
+};
 
 export default withTracker((props) => {
   const AppSettings = Settings.application;
-  const currentUser = Users.findOne({ userId: Auth.userID }, { fields: { userId: 1, role: 1 } });
   const { status } = props;
   const emojiUsers = Users.find({ meetingId: Auth.meetingID, emoji: status }, {
     fields: {
@@ -20,11 +32,10 @@ export default withTracker((props) => {
     },
   })
     .fetch()
-    .filter(u => u.emoji === status && u.userId !== currentUser.userId);
+    .filter(u => u.emoji === status && u.userId !== Auth.userID);
   const clearUserStatus = userId => makeCall('setEmojiStatus', userId, 'none');
 
   return {
-    isViewer: currentUser.role === ROLE_VIEWER,
     clearUserStatus,
     emojiUsers,
     status,
diff --git a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/container.jsx b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/container.jsx
index b51e10cb1d030c0a31eb767c7ea8896b9d9deba1..9bcf276195d01657380d1d4cc63482f7e6721b28 100644
--- a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/container.jsx
@@ -1,29 +1,25 @@
-import React from 'react';
+import React, { useContext } from 'react';
 import { withTracker } from 'meteor/react-meteor-data';
 import { Session } from 'meteor/session';
 import Auth from '/imports/ui/services/auth';
 import Storage from '/imports/ui/services/storage/session';
 import UserContent from './component';
 import GuestUsers from '/imports/api/guest-users/';
-import Users from '/imports/api/users';
+import { UsersContext } from '/imports/ui/components/components-data/users-context/context';
 
 const CLOSED_CHAT_LIST_KEY = 'closedChatList';
 
-const UserContentContainer = props => <UserContent {...props} />;
+const UserContentContainer = (props) => {
+  const usingUsersContext = useContext(UsersContext);
+  const { users } = usingUsersContext;
+  const currentUser = users[Auth.userID];
+  return (<UserContent {...props} currentUser={currentUser} />);
+}
 
 export default withTracker(() => ({
   pollIsOpen: Session.equals('isPollOpen', true),
   forcePollOpen: Session.equals('forcePollOpen', true),
   currentClosedChats: Storage.getItem(CLOSED_CHAT_LIST_KEY) || [],
-  currentUser: Users.findOne({ userId: Auth.userID }, {
-    fields: {
-      userId: 1,
-      role: 1,
-      guest: 1,
-      locked: 1,
-      presenter: 1,
-    },
-  }),
   pendingUsers: GuestUsers.find({
     meetingId: Auth.meetingID,
     approved: false,
diff --git a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-notes/container.jsx b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-notes/container.jsx
index 9090376936ff3e58ea762728529e335fd9397e7e..f6814b5a5648543bc4dadd774b2f9a96621535c7 100644
--- a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-notes/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-notes/container.jsx
@@ -1,28 +1,16 @@
 import React from 'react';
 import { withTracker } from 'meteor/react-meteor-data';
 import NoteService from '/imports/ui/components/note/service';
-import Meetings from '/imports/api/meetings';
-import Users from '/imports/api/users';
-import Auth from '/imports/ui/services/auth';
+import lockContextContainer from '/imports/ui/components/lock-viewers/context/container';
 import UserNotes from './component';
 
-const ROLE_VIEWER = Meteor.settings.public.user.role_viewer;
-
 const UserNotesContainer = props => <UserNotes {...props} />;
 
-export default withTracker(() => {
-  const Meeting = Meetings.findOne({ meetingId: Auth.meetingID },
-    { fields: { 'lockSettingsProps.disableNote': 1 } });
-  const isViewer = Users.findOne({ meetingId: Auth.meetingID, userId: Auth.userID }, {
-    fields: {
-      role: 1,
-    },
-  }).role === ROLE_VIEWER;
-  const shouldDisableNote = (Meeting.lockSettingsProps.disableNote) && isViewer;
-
+export default lockContextContainer(withTracker(({ userLocks }) => {
+  const shouldDisableNote = userLocks.userNote;
   return {
     isPanelOpened: NoteService.isPanelOpened(),
     revs: NoteService.getRevs(),
     disableNote: shouldDisableNote,
   };
-})(UserNotesContainer);
+})(UserNotesContainer));
diff --git a/bigbluebutton-html5/imports/ui/components/waiting-users/alert/container.jsx b/bigbluebutton-html5/imports/ui/components/waiting-users/alert/container.jsx
index b9def40f1d2df569f642068a60f5c8a77e561148..9e8db5573db62ec6de20bbe504a23c010b0c26cf 100644
--- a/bigbluebutton-html5/imports/ui/components/waiting-users/alert/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/waiting-users/alert/container.jsx
@@ -1,21 +1,30 @@
-import React, { PureComponent } from 'react';
+import React, { useContext } from 'react';
 import { Session } from 'meteor/session';
 import { withTracker } from 'meteor/react-meteor-data';
 import Auth from '/imports/ui/services/auth';
 import GuestUsers from '/imports/api/guest-users/';
-import Users from '/imports/api/users/';
+import { UsersContext } from '/imports/ui/components/components-data/users-context/context';
 import WaitingComponent from './component';
 
 const USER_CONFIG = Meteor.settings.public.user;
 const ROLE_MODERATOR = USER_CONFIG.role_moderator;
 
-class WaitingContainer extends PureComponent {
-  render() {
-    return (
-      <WaitingComponent {...this.props} />
-    );
-  }
-}
+const WaitingContainer = (props) => {
+  const usingUsersContext = useContext(UsersContext);
+  const { users } = usingUsersContext;
+  const currentUser = users[Auth.userID];
+  const currentUserIsModerator = currentUser.role === ROLE_MODERATOR;
+  const joinTime = currentUser.authTokenValidatedTime;
+  return (
+    <WaitingComponent {...{
+      ...props,
+      currentUserIsModerator,
+      joinTime,
+    }}
+    />
+  );
+};
+
 
 export default withTracker(() => {
   const pendingUsers = GuestUsers.find({
@@ -25,12 +34,8 @@ export default withTracker(() => {
   }).fetch();
   const managementPanelIsOpen = Session.get('openPanel') === 'waitingUsersPanel';
 
-  const currentUser = Users.findOne({ userId: Auth.userID },
-    { fields: { role: 1, loginTime: 1 } });
   return {
     managementPanelIsOpen,
     pendingUsers,
-    currentUserIsModerator: currentUser.role === ROLE_MODERATOR,
-    joinTime: currentUser.loginTime,
   };
 })(WaitingContainer);