diff --git a/lib/reducers/master-reducer.js b/lib/reducers/master-reducer.js
--- a/lib/reducers/master-reducer.js
+++ b/lib/reducers/master-reducer.js
@@ -81,7 +81,10 @@
     reduceMessageStore(state.messageStore, action, threadInfos);
   let messageStore = reducedMessageStore;
 
-  let { keyserverStore } = reduceKeyserverStore(state.keyserverStore, action);
+  let { keyserverStore, keyserverStoreOperations } = reduceKeyserverStore(
+    state.keyserverStore,
+    action,
+  );
 
   if (
     action.type !== incrementalStateSyncActionType &&
@@ -135,6 +138,10 @@
       keyserverStore,
       replaceOperations,
     );
+    keyserverStoreOperations = [
+      ...keyserverStoreOperations,
+      ...replaceOperations,
+    ];
   }
 
   const { draftStore, draftStoreOperations } = reduceDraftStore(
@@ -203,6 +210,7 @@
       messageStoreOperations,
       reportStoreOperations,
       userStoreOperations,
+      keyserverStoreOperations,
     },
   };
 }
diff --git a/lib/types/store-ops-types.js b/lib/types/store-ops-types.js
--- a/lib/types/store-ops-types.js
+++ b/lib/types/store-ops-types.js
@@ -15,6 +15,7 @@
 import type {
   ClientDBKeyserverInfo,
   ClientDBKeyserverStoreOperation,
+  KeyserverStoreOperation,
 } from '../ops/keyserver-store-ops.js';
 import type {
   ClientDBMessageStoreOperation,
@@ -40,6 +41,7 @@
   +messageStoreOperations: $ReadOnlyArray<MessageStoreOperation>,
   +reportStoreOperations: $ReadOnlyArray<ReportStoreOperation>,
   +userStoreOperations: $ReadOnlyArray<UserStoreOperation>,
+  +keyserverStoreOperations: $ReadOnlyArray<KeyserverStoreOperation>,
 };
 
 export type ClientDBStoreOperations = {
diff --git a/native/redux/redux-setup.js b/native/redux/redux-setup.js
--- a/native/redux/redux-setup.js
+++ b/native/redux/redux-setup.js
@@ -287,6 +287,7 @@
     messageStoreOperations,
     reportStoreOperations,
     userStoreOperations,
+    keyserverStoreOperations,
   } = storeOperations;
 
   const fixUnreadActiveThreadResult = fixUnreadActiveThread(state, action);
@@ -303,6 +304,7 @@
     threadStoreOperations: threadStoreOperationsWithUnreadFix,
     reportStoreOperations,
     userStoreOperations,
+    keyserverStoreOperations,
   });
 
   return state;
diff --git a/native/redux/redux-utils.js b/native/redux/redux-utils.js
--- a/native/redux/redux-utils.js
+++ b/native/redux/redux-utils.js
@@ -2,6 +2,7 @@
 
 import { useSelector as reactReduxUseSelector } from 'react-redux';
 
+import { keyserverStoreOpsHandlers } from 'lib/ops/keyserver-store-ops.js';
 import { messageStoreOpsHandlers } from 'lib/ops/message-store-ops.js';
 import { reportStoreOpsHandlers } from 'lib/ops/report-store-ops.js';
 import { threadStoreOpsHandlers } from 'lib/ops/thread-store-ops.js';
@@ -28,6 +29,7 @@
     messageStoreOperations,
     reportStoreOperations,
     userStoreOperations,
+    keyserverStoreOperations,
   } = storeOperations;
 
   const convertedThreadStoreOperations =
@@ -38,6 +40,8 @@
     reportStoreOpsHandlers.convertOpsToClientDBOps(reportStoreOperations);
   const convertedUserStoreOperations =
     userStoreOpsHandlers.convertOpsToClientDBOps(userStoreOperations);
+  const convertedKeyserverStoreOperations =
+    keyserverStoreOpsHandlers.convertOpsToClientDBOps(keyserverStoreOperations);
 
   try {
     const promises = [];
@@ -72,6 +76,13 @@
         commCoreModule.processUserStoreOperations(convertedUserStoreOperations),
       );
     }
+    if (convertedKeyserverStoreOperations.length > 0) {
+      promises.push(
+        commCoreModule.processKeyserverStoreOperations(
+          convertedKeyserverStoreOperations,
+        ),
+      );
+    }
     await Promise.all(promises);
   } catch (e) {
     if (isTaskCancelledError(e)) {
diff --git a/web/database/utils/store.js b/web/database/utils/store.js
--- a/web/database/utils/store.js
+++ b/web/database/utils/store.js
@@ -1,5 +1,6 @@
 // @flow
 
+import { keyserverStoreOpsHandlers } from 'lib/ops/keyserver-store-ops.js';
 import { reportStoreOpsHandlers } from 'lib/ops/report-store-ops.js';
 import { threadStoreOpsHandlers } from 'lib/ops/thread-store-ops.js';
 import { canUseDatabaseOnWeb } from 'lib/shared/web-database.js';
@@ -54,8 +55,12 @@
   storeOperations: StoreOperations,
   userID: null | string,
 ): Promise<void> {
-  const { draftStoreOperations, threadStoreOperations, reportStoreOperations } =
-    storeOperations;
+  const {
+    draftStoreOperations,
+    threadStoreOperations,
+    reportStoreOperations,
+    keyserverStoreOperations,
+  } = storeOperations;
 
   const canUseDatabase = canUseDatabaseOnWeb(userID);
 
@@ -64,11 +69,14 @@
     : [];
   const convertedReportStoreOperations =
     reportStoreOpsHandlers.convertOpsToClientDBOps(reportStoreOperations);
+  const convertedKeyserverStoreOperations =
+    keyserverStoreOpsHandlers.convertOpsToClientDBOps(keyserverStoreOperations);
 
   if (
     convertedThreadStoreOperations.length === 0 &&
     convertedReportStoreOperations.length === 0 &&
-    draftStoreOperations.length === 0
+    draftStoreOperations.length === 0 &&
+    convertedKeyserverStoreOperations.length === 0
   ) {
     return;
   }
@@ -85,6 +93,7 @@
         draftStoreOperations,
         reportStoreOperations: convertedReportStoreOperations,
         threadStoreOperations: convertedThreadStoreOperations,
+        keyserverStoreOperations: convertedKeyserverStoreOperations,
       },
     });
   } catch (e) {
diff --git a/web/redux/initial-state-gate.js b/web/redux/initial-state-gate.js
--- a/web/redux/initial-state-gate.js
+++ b/web/redux/initial-state-gate.js
@@ -120,6 +120,7 @@
             messageStoreOperations: [],
             reportStoreOperations: [],
             userStoreOperations: [],
+            keyserverStoreOperations: [],
           },
           currentLoggedInUserID,
         );
diff --git a/web/redux/redux-setup.js b/web/redux/redux-setup.js
--- a/web/redux/redux-setup.js
+++ b/web/redux/redux-setup.js
@@ -143,6 +143,7 @@
     messageStoreOperations: [],
     reportStoreOperations: [],
     userStoreOperations: [],
+    keyserverStoreOperations: [],
   };
 
   if (action.type === setInitialReduxState) {
@@ -172,7 +173,13 @@
         ),
         initialStateLoaded: true,
       },
-      storeOperations,
+      {
+        ...storeOperations,
+        keyserverStoreOperations: [
+          ...storeOperations.keyserverStoreOperations,
+          ...replaceOperations,
+        ],
+      },
     );
   } else if (action.type === updateWindowDimensionsActionType) {
     return validateStateAndProcessDBOperations(
@@ -235,6 +242,13 @@
         [replaceOperation],
       ),
     };
+    storeOperations = {
+      ...storeOperations,
+      keyserverStoreOperations: [
+        ...storeOperations.keyserverStoreOperations,
+        replaceOperation,
+      ],
+    };
   } else if (action.type === deleteKeyserverAccountActionTypes.success) {
     const { currentUserInfo, preRequestUserState } = action.payload;
     const newKeyserverIDs = [];
@@ -301,7 +315,13 @@
   ) {
     const baseReducerResult = baseReducer(state, action, onStateDifference);
     state = baseReducerResult.state;
-    storeOperations = baseReducerResult.storeOperations;
+    storeOperations = {
+      ...baseReducerResult.storeOperations,
+      keyserverStoreOperations: [
+        ...storeOperations.keyserverStoreOperations,
+        ...baseReducerResult.storeOperations.keyserverStoreOperations,
+      ],
+    };
   }
 
   const communityPickerStore = reduceCommunityPickerStore(