diff --git a/ts/components/session/ActionsPanel.tsx b/ts/components/session/ActionsPanel.tsx
index a942c70cc..5b3d34982 100644
--- a/ts/components/session/ActionsPanel.tsx
+++ b/ts/components/session/ActionsPanel.tsx
@@ -32,48 +32,18 @@ import { useInterval } from '../../hooks/useInterval';
 import { clearSearch } from '../../state/ducks/search';
 import { showLeftPaneSection } from '../../state/ducks/section';
 
-import {
-  cleanUpOldDecryptedMedias,
-  getDecryptedMediaUrl,
-} from '../../session/crypto/DecryptedAttachmentsManager';
-import { OpenGroupManagerV2 } from '../../opengroup/opengroupV2/OpenGroupManagerV2';
-import { loadDefaultRooms } from '../../opengroup/opengroupV2/ApiUtil';
+import { cleanUpOldDecryptedMedias } from '../../session/crypto/DecryptedAttachmentsManager';
+import { getOpenGroupManager } from '../../opengroup/opengroupV2/OpenGroupManagerV2';
 import { forceRefreshRandomSnodePool } from '../../session/snode_api/snodePool';
 import { getSwarmPollingInstance } from '../../session/snode_api';
-import { IMAGE_JPEG } from '../../types/MIME';
-import { FSv2 } from '../../fileserver';
-import { debounce } from 'lodash';
 import { DURATION } from '../../session/constants';
 import { actions as conversationActions } from '../../state/ducks/conversations';
-import { ActionPanelOnionStatusLight, OnionPathModal } from '../OnionStatusPathDialog';
-import { EditProfileDialog } from '../EditProfileDialog';
-import { SessionConfirm } from './SessionConfirm';
-import {
-  getAddModeratorsModal,
-  getAdminLeaveClosedGroupDialog,
-  getChangeNickNameDialog,
-  getConfirmModal,
-  getEditProfileDialog,
-  getInviteContactModal,
-  getOnionPathDialog,
-  getRecoveryPhraseDialog,
-  getRemoveModeratorsModal,
-  getUpdateGroupMembersModal,
-  getUpdateGroupNameModal,
-  getUserDetailsModal,
-} from '../../state/selectors/modal';
-import { InviteContactsDialog } from '../conversation/InviteContactsDialog';
-import { AddModeratorsDialog } from '../conversation/ModeratorsAddDialog';
-import { RemoveModeratorsDialog } from '../conversation/ModeratorsRemoveDialog';
-import { UpdateGroupNameDialog } from '../conversation/UpdateGroupNameDialog';
-import { UpdateGroupMembersDialog } from '../conversation/UpdateGroupMembersDialog';
-import { UserDetailsDialog } from '../UserDetailsDialog';
-import { SessionNicknameDialog } from './SessionNicknameDialog';
 import { editProfileModal, onionPathModal } from '../../state/ducks/modalDialog';
-import { SessionSeedModal } from './SessionSeedModal';
-import { AdminLeaveClosedGroupDialog } from '../conversation/AdminLeaveClosedGroupDialog';
 import { uploadOurAvatar } from '../../interactions/conversationInteractions';
 import { ModalContainer } from './ModalContainer';
+import { debounce } from 'underscore';
+import { loadDefaultRooms } from '../../opengroup/opengroupV2/ApiUtil';
+import { ActionPanelOnionStatusLight } from '../OnionStatusPathDialog';
 
 // tslint:disable-next-line: no-import-side-effect no-submodule-imports
 
@@ -265,7 +235,7 @@ const doAppStartUp = () => {
 
   // this generates the key to encrypt attachments locally
   void generateAttachmentKeyIfEmpty();
-  void OpenGroupManagerV2.getInstance().startPolling();
+  void getOpenGroupManager().startPolling();
   // trigger a sync message if needed for our other devices
 
   void triggerSyncIfNeeded();
diff --git a/ts/opengroup/opengroupV2/JoinOpenGroupV2.ts b/ts/opengroup/opengroupV2/JoinOpenGroupV2.ts
index 2e7420e29..63fa51a62 100644
--- a/ts/opengroup/opengroupV2/JoinOpenGroupV2.ts
+++ b/ts/opengroup/opengroupV2/JoinOpenGroupV2.ts
@@ -8,7 +8,7 @@ import {
   prefixify,
   publicKeyParam,
 } from '../utils/OpenGroupUtils';
-import { OpenGroupManagerV2 } from './OpenGroupManagerV2';
+import { getOpenGroupManager } from './OpenGroupManagerV2';
 
 // Inputs that should work:
 // https://sessionopengroup.co/main?public_key=658d29b91892a2389505596b135e76a53db6e11d613a51dbd3d0816adffb231c
@@ -79,11 +79,7 @@ async function joinOpenGroupV2(room: OpenGroupV2Room, fromConfigMessage: boolean
   // Try to connect to server
   try {
     const conversation = await PromiseUtils.timeout(
-      OpenGroupManagerV2.getInstance().attemptConnectionV2OneAtATime(
-        prefixedServer,
-        roomId,
-        publicKey
-      ),
+      getOpenGroupManager().attemptConnectionV2OneAtATime(prefixedServer, roomId, publicKey),
       20000
     );
 
diff --git a/ts/opengroup/opengroupV2/OpenGroupManagerV2.ts b/ts/opengroup/opengroupV2/OpenGroupManagerV2.ts
index 4e9d638b5..dba353ec1 100644
--- a/ts/opengroup/opengroupV2/OpenGroupManagerV2.ts
+++ b/ts/opengroup/opengroupV2/OpenGroupManagerV2.ts
@@ -17,11 +17,18 @@ import _ from 'lodash';
 import { deleteAuthToken, DeleteAuthTokenRequest } from './ApiAuth';
 import autoBind from 'auto-bind';
 
+let instance: OpenGroupManagerV2 | undefined;
+
+export const getOpenGroupManager = () => {
+  if (!instance) {
+    instance = new OpenGroupManagerV2();
+  }
+  return instance;
+};
+
 export class OpenGroupManagerV2 {
   public static readonly useV2OpenGroups = false;
 
-  private static instance: OpenGroupManagerV2;
-
   /**
    * The map of opengroup pollers, by serverUrl.
    * A single poller polls for every room on the specified serverUrl
@@ -29,17 +36,10 @@ export class OpenGroupManagerV2 {
   private readonly pollers: Map<string, OpenGroupServerPoller> = new Map();
   private isPolling = false;
 
-  private constructor() {
+  constructor() {
     autoBind(this);
   }
 
-  public static getInstance() {
-    if (!OpenGroupManagerV2.instance) {
-      OpenGroupManagerV2.instance = new OpenGroupManagerV2();
-    }
-    return OpenGroupManagerV2.instance;
-  }
-
   /**
    * When we get our configuration from the network, we might get a few times the same open group on two different messages.
    * If we don't do anything, we will join them multiple times.
@@ -138,7 +138,7 @@ export class OpenGroupManagerV2 {
               }
               // remove the roomInfos locally for this open group room
               await removeV2OpenGroupRoom(roomConvoId);
-              OpenGroupManagerV2.getInstance().removeRoomFromPolledRooms(infos);
+              getOpenGroupManager().removeRoomFromPolledRooms(infos);
               // no need to remove it from the ConversationController, the convo is already not there
             }
           } catch (e) {
diff --git a/ts/session/conversations/ConversationController.ts b/ts/session/conversations/ConversationController.ts
index 02587ca93..fdf7faed1 100644
--- a/ts/session/conversations/ConversationController.ts
+++ b/ts/session/conversations/ConversationController.ts
@@ -16,7 +16,7 @@ import { PubKey } from '../types';
 import { actions as conversationActions } from '../../state/ducks/conversations';
 import { getV2OpenGroupRoom, removeV2OpenGroupRoom } from '../../data/opengroups';
 import _ from 'lodash';
-import { OpenGroupManagerV2 } from '../../opengroup/opengroupV2/OpenGroupManagerV2';
+import { getOpenGroupManager } from '../../opengroup/opengroupV2/OpenGroupManagerV2';
 import { deleteAuthToken, DeleteAuthTokenRequest } from '../../opengroup/opengroupV2/ApiAuth';
 import { deleteMessagesByConvoIdNoConfirmation } from '../../interactions/conversationInteractions';
 
@@ -211,7 +211,7 @@ export class ConversationController {
             _.pick(roomInfos, 'serverUrl', 'roomId', 'token') as DeleteAuthTokenRequest
           );
         }
-        OpenGroupManagerV2.getInstance().removeRoomFromPolledRooms(roomInfos);
+        getOpenGroupManager().removeRoomFromPolledRooms(roomInfos);
 
         // remove the roomInfos locally for this open group room
         try {