diff --git a/src/components/IOC/ChangeHostAdmin/ChangeHostAdmin.js b/src/components/IOC/ChangeHostAdmin/ChangeHostAdmin.js
index 6b442ab30e904b8f197d3220614f426bd0fd6110..dfa908f5749a6adea4034553c96e922447aef487 100644
--- a/src/components/IOC/ChangeHostAdmin/ChangeHostAdmin.js
+++ b/src/components/IOC/ChangeHostAdmin/ChangeHostAdmin.js
@@ -26,7 +26,8 @@ export default function ChangeHostAdmin({
   ioc,
   getIOC,
   resetTab,
-  buttonDisabled
+  buttonDisabled,
+  setButtonDisabled
 }) {
   const initHost = useMemo(
     () => ({
@@ -72,16 +73,18 @@ export default function ChangeHostAdmin({
 
   useEffect(() => {
     if (updateHostError) {
+      setButtonDisabled(false);
       setError(updateHostError?.message);
     }
-  }, [updateHostError, setError]);
+  }, [updateHostError, setError, setButtonDisabled]);
 
   useEffect(() => {
     if (updatedIoc) {
       getIOC();
       resetTab();
+      setButtonDisabled(false);
     }
-  }, [updatedIoc, getIOC, resetTab]);
+  }, [updatedIoc, getIOC, resetTab, setButtonDisabled]);
 
   useEffect(() => {
     getHosts({ query: transformHostQuery(`${query}`) });
@@ -93,6 +96,7 @@ export default function ChangeHostAdmin({
   }, [setOpen, initHost]);
 
   const onConfirm = useCallback(() => {
+    setButtonDisabled(true);
     updateHost(
       {
         ioc_id: ioc.id
@@ -103,7 +107,7 @@ export default function ChangeHostAdmin({
         }
       }
     );
-  }, [updateHost, ioc, host?.csEntryHost?.id]);
+  }, [updateHost, ioc, host?.csEntryHost?.id, setButtonDisabled]);
 
   let disabledButtonTitle = "";
   if (buttonDisabled || ioc.operationInProgress) {
diff --git a/src/components/IOC/DeployIOC/DeployIOC.js b/src/components/IOC/DeployIOC/DeployIOC.js
index 83c29376b7154c2642a43cd644bb1c29602232c1..269d0ad795bee90b9cb40e61aeba6f93e7776dc2 100644
--- a/src/components/IOC/DeployIOC/DeployIOC.js
+++ b/src/components/IOC/DeployIOC/DeployIOC.js
@@ -12,7 +12,9 @@ export function DeployIOC({
   submitCallback,
   iocId,
   hasActiveDeployment,
-  init = {}
+  init = {},
+  buttonDisabled,
+  setButtonDisabled
 }) {
   const [error, setError] = useState();
   const client = useContext(apiContext);
@@ -27,9 +29,10 @@ export function DeployIOC({
 
   useEffect(() => {
     if (deployError) {
+      setButtonDisabled(false);
       setError(deployError?.message);
     }
-  }, [deployError]);
+  }, [deployError, setButtonDisabled]);
 
   const { watchDeployment } = useContext(notificationContext);
 
@@ -44,6 +47,8 @@ export function DeployIOC({
         hasActiveDeployment={hasActiveDeployment}
         error={error}
         resetError={() => setError(null)}
+        buttonDisabled={buttonDisabled}
+        setButtonDisabled={setButtonDisabled}
       />
     );
   } else {
diff --git a/src/components/IOC/IOCAdmin/IOCAdmin.js b/src/components/IOC/IOCAdmin/IOCAdmin.js
index 3d3a967e1260ee7a4012527fe2ff60f7df7d3ef9..64ac9a541918532522ed73784ef09018d32dc8bb 100644
--- a/src/components/IOC/IOCAdmin/IOCAdmin.js
+++ b/src/components/IOC/IOCAdmin/IOCAdmin.js
@@ -4,7 +4,13 @@ import IOCDelete from "../IOCDelete";
 import IOCDetailAdmin from "../IOCDetailAdmin";
 import ChangeHostAdmin from "../ChangeHostAdmin";
 
-export default function IOCAdmin({ ioc, getIOC, resetTab, buttonDisabled }) {
+export default function IOCAdmin({
+  ioc,
+  getIOC,
+  resetTab,
+  buttonDisabled,
+  setButtonDisabled
+}) {
   return (
     <>
       <IOCDetailAdmin
@@ -12,6 +18,7 @@ export default function IOCAdmin({ ioc, getIOC, resetTab, buttonDisabled }) {
         getIOC={getIOC}
         resetTab={resetTab}
         buttonDisabled={buttonDisabled}
+        setButtonDisabled={setButtonDisabled}
       />
       {ioc.activeDeployment && (
         <ChangeHostAdmin
@@ -19,6 +26,7 @@ export default function IOCAdmin({ ioc, getIOC, resetTab, buttonDisabled }) {
           getIOC={getIOC}
           resetTab={resetTab}
           buttonDisabled={buttonDisabled}
+          setButtonDisabled={setButtonDisabled}
         />
       )}
       <AdministerUndeployment
@@ -28,6 +36,7 @@ export default function IOCAdmin({ ioc, getIOC, resetTab, buttonDisabled }) {
       <IOCDelete
         ioc={ioc}
         buttonDisabled={buttonDisabled}
+        setButtonDisabled={setButtonDisabled}
       />
     </>
   );
diff --git a/src/components/IOC/IOCDelete/IOCDelete.js b/src/components/IOC/IOCDelete/IOCDelete.js
index f505f0f46138ac5841324fcc1d087de626f93c50..4b2a037cd4c14d7f5f117a671d27091cb7ec5a87 100644
--- a/src/components/IOC/IOCDelete/IOCDelete.js
+++ b/src/components/IOC/IOCDelete/IOCDelete.js
@@ -13,7 +13,7 @@ import AccessControl from "../../auth/AccessControl";
 import { apiContext } from "../../../api/DeployApi";
 import { useAPIMethod } from "@ess-ics/ce-ui-common";
 
-export default function IOCDelete({ ioc, buttonDisabled }) {
+export default function IOCDelete({ ioc, buttonDisabled, setButtonDisabled }) {
   const navigate = useNavigate();
 
   // for the dialog
@@ -41,15 +41,17 @@ export default function IOCDelete({ ioc, buttonDisabled }) {
 
   useEffect(() => {
     if (errorResponse) {
+      setButtonDisabled(false);
       setError(errorResponse?.message);
     }
-  }, [errorResponse, setError]);
+  }, [errorResponse, setError, setButtonDisabled]);
 
   useEffect(() => {
     if (dataready && !error) {
+      setButtonDisabled(false);
       navigate(-1);
     }
-  }, [dataready, navigate, error]);
+  }, [dataready, navigate, error, setButtonDisabled]);
 
   let disabledButtonTitle = "";
 
@@ -63,8 +65,9 @@ export default function IOCDelete({ ioc, buttonDisabled }) {
   }, [setOpen]);
 
   const onConfirm = useCallback(() => {
+    setButtonDisabled(true);
     deleteIOC();
-  }, [deleteIOC]);
+  }, [deleteIOC, setButtonDisabled]);
 
   return (
     <>
diff --git a/src/components/IOC/IOCDeployDialog/IOCDeployDialog.js b/src/components/IOC/IOCDeployDialog/IOCDeployDialog.js
index 681f0e164788e4bd9d8bfbbbb63054ec58f1e8d1..0287d83701bd2260d15bed600c51ddf5409e8a5a 100644
--- a/src/components/IOC/IOCDeployDialog/IOCDeployDialog.js
+++ b/src/components/IOC/IOCDeployDialog/IOCDeployDialog.js
@@ -25,7 +25,9 @@ export function IOCDeployDialog({
   hasActiveDeployment,
   init = {},
   error,
-  resetError
+  resetError,
+  buttonDisabled,
+  setButtonDisabled
 }) {
   const client = useContext(apiContext);
   const {
@@ -82,6 +84,7 @@ export function IOCDeployDialog({
 
   const onSubmit = (event) => {
     event.preventDefault();
+    setButtonDisabled(true);
     const { git: gitText } = event.currentTarget.elements;
     const git = gitText.value;
 
@@ -304,7 +307,7 @@ export function IOCDeployDialog({
             color="primary"
             variant="contained"
             type="submit"
-            disabled={!host || !gitVersion}
+            disabled={!host || !gitVersion || buttonDisabled}
           >
             Deploy
           </Button>
diff --git a/src/components/IOC/IOCDetailAdmin/IOCDetailAdmin.js b/src/components/IOC/IOCDetailAdmin/IOCDetailAdmin.js
index b2f37986cd2f05ce4ec81bc4d270b7343adff7bb..103816122c9d07d3792da0765391ae1ceb6e0ee7 100644
--- a/src/components/IOC/IOCDetailAdmin/IOCDetailAdmin.js
+++ b/src/components/IOC/IOCDetailAdmin/IOCDetailAdmin.js
@@ -18,7 +18,8 @@ export default function IOCDetailAdmin({
   ioc,
   getIOC,
   resetTab,
-  buttonDisabled
+  buttonDisabled,
+  setButtonDisabled
 }) {
   const [gitId, setGitId] = useState(ioc.gitProjectId);
 
@@ -65,9 +66,10 @@ export default function IOCDetailAdmin({
 
   useEffect(() => {
     if (updateError) {
+      setButtonDisabled(false);
       setError(updateError?.message);
     }
-  }, [updateError, setError]);
+  }, [updateError, setError, setButtonDisabled]);
 
   const requiredDataMissing = useCallback(() => !gitId || !name, [gitId, name]);
 
@@ -104,6 +106,7 @@ export default function IOCDetailAdmin({
   }, [setOpen]);
 
   const onConfirm = useCallback(() => {
+    setButtonDisabled(true);
     actionUpdateIoc(
       { ioc_id: ioc?.id },
       {
@@ -113,14 +116,15 @@ export default function IOCDetailAdmin({
         }
       }
     );
-  }, [actionUpdateIoc, ioc, name, gitId]);
+  }, [actionUpdateIoc, ioc, name, gitId, setButtonDisabled]);
 
   useEffect(() => {
     if (uioc) {
       getIOC();
       resetTab();
+      setButtonDisabled(false);
     }
-  }, [uioc, getIOC, resetTab]);
+  }, [uioc, getIOC, resetTab, setButtonDisabled]);
 
   const iocIsDeployed = Boolean(ioc.activeDeployment);
 
diff --git a/src/components/IOC/IOCManage/IOCManage.js b/src/components/IOC/IOCManage/IOCManage.js
index 0c02f871227662407b4d865896a2caab66ab05b8..8ee610da7637eff2e46c5fe8ddc953188a36e950 100644
--- a/src/components/IOC/IOCManage/IOCManage.js
+++ b/src/components/IOC/IOCManage/IOCManage.js
@@ -227,11 +227,15 @@ export function IOCManage({
             init={formInit}
             iocId={ioc.id}
             hasActiveDeployment={Boolean(ioc.activeDeployment)}
+            buttonDisabled={buttonDisabled}
+            setButtonDisabled={setButtonDisabled}
           />
           <UndeployIOC
             open={undeployDialogOpen}
             setOpen={setUndeployDialogOpen}
             submitCallback={closeUndeployModal}
+            buttonDisabled={buttonDisabled}
+            setButtonDisabled={setButtonDisabled}
             ioc={ioc}
           />
         </AccessControl>
diff --git a/src/components/IOC/IOCUndeployDialog/IOCUndeployDialog.js b/src/components/IOC/IOCUndeployDialog/IOCUndeployDialog.js
index ddacda21cfde10c5d974e1a5a0500e85bf8f3b62..34c31e657bb0bdc1ba1684bfb19ec184512094f0 100644
--- a/src/components/IOC/IOCUndeployDialog/IOCUndeployDialog.js
+++ b/src/components/IOC/IOCUndeployDialog/IOCUndeployDialog.js
@@ -14,7 +14,9 @@ export function IOCUndeployDialog({
   setOpen,
   submitCallback,
   ioc,
-  error
+  error,
+  buttonDisabled,
+  setButtonDisabled
 }) {
   const handleClose = () => {
     setOpen(false);
@@ -22,6 +24,7 @@ export function IOCUndeployDialog({
 
   const onSubmit = (event) => {
     event.preventDefault();
+    setButtonDisabled(true);
 
     submitCallback({
       ioc_id: ioc.id
@@ -60,6 +63,7 @@ export function IOCUndeployDialog({
             color="primary"
             variant="contained"
             type="submit"
+            disabled={buttonDisabled}
           >
             Undeploy
           </Button>
diff --git a/src/components/IOC/UndeployIOC/UndeployIOC.js b/src/components/IOC/UndeployIOC/UndeployIOC.js
index a098bc57bd8032f5f5798ccb718511ca87ad1e95..26c9920ce7ed58bb5f36cb565efdb295b5deda98 100644
--- a/src/components/IOC/UndeployIOC/UndeployIOC.js
+++ b/src/components/IOC/UndeployIOC/UndeployIOC.js
@@ -6,7 +6,14 @@ import { apiContext } from "../../../api/DeployApi";
 import { useAPIMethod } from "@ess-ics/ce-ui-common";
 
 // Process component
-export function UndeployIOC({ open, setOpen, submitCallback, ioc }) {
+export function UndeployIOC({
+  open,
+  setOpen,
+  submitCallback,
+  ioc,
+  buttonDisabled,
+  setButtonDisabled
+}) {
   const [error, setError] = useState();
   const client = useContext(apiContext);
   const {
@@ -20,9 +27,10 @@ export function UndeployIOC({ open, setOpen, submitCallback, ioc }) {
 
   useEffect(() => {
     if (deploymentError) {
+      setButtonDisabled(false);
       setError(deploymentError?.message);
     }
-  }, [deploymentError]);
+  }, [deploymentError, setButtonDisabled]);
 
   const { watchDeployment } = useContext(notificationContext);
 
@@ -34,6 +42,8 @@ export function UndeployIOC({ open, setOpen, submitCallback, ioc }) {
         submitCallback={action}
         ioc={ioc}
         error={error}
+        buttonDisabled={buttonDisabled}
+        setButtonDisabled={setButtonDisabled}
       />
     );
   } else {
diff --git a/src/views/IOC/IOCDetailsView.js b/src/views/IOC/IOCDetailsView.js
index 32839522266f8db02a5358cc58e4e8e4dc9a0e49..d7b396ea834d691a149e0626a57cd849d72522a6 100644
--- a/src/views/IOC/IOCDetailsView.js
+++ b/src/views/IOC/IOCDetailsView.js
@@ -230,6 +230,7 @@ export function IOCDetailsView({ ioc, getIOC, abortGetIOC, loading }) {
           getIOC={getIOC}
           resetTab={resetTab}
           buttonDisabled={buttonDisabled}
+          setButtonDisabled={setButtonDisabled}
         />
       )
     });