Index: /trunk/src/VBox/Main/src-client/ConsoleImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-client/ConsoleImpl.cpp	(revision 55720)
+++ /trunk/src/VBox/Main/src-client/ConsoleImpl.cpp	(revision 55721)
@@ -6201,10 +6201,11 @@
         case MachineState_TeleportingPausedVM:
         case MachineState_OnlineSnapshotting:
-
-        /* Remove any keys which are supposed to be removed on a suspend. */
-        if (   aReason == Reason_HostSuspend
-            || aReason == Reason_HostBatteryLow)
-            i_removeSecretKeysOnSuspend();
-
+            /* Remove any keys which are supposed to be removed on a suspend. */
+            if (   aReason == Reason_HostSuspend
+                || aReason == Reason_HostBatteryLow)
+            {
+                i_removeSecretKeysOnSuspend();
+                return S_OK;
+            }
             return setError(VBOX_E_INVALID_VM_STATE, tr("Already paused"));
 
@@ -6286,5 +6287,14 @@
         VMRESUMEREASON enmReason = VMRESUMEREASON_USER;
         if (aReason == Reason_HostResume)
+        {
+            /*
+             * Host resume may be called multiple times successively. We don't want to VMR3Resume->vmR3Resume->vmR3TrySetState()
+             * to assert on us, hence check for the VM state here and bail if it's already in the 'running' state.
+             * See @bugref{3495}.
+             */
             enmReason = VMRESUMEREASON_HOST_RESUME;
+            if (VMR3GetStateU(ptrVM.rawUVM()) == VMSTATE_RUNNING)
+                return S_OK;
+        }
         else if (aReason == Reason_Snapshot)
             enmReason = VMRESUMEREASON_STATE_SAVED;
Index: /trunk/src/VBox/Main/src-server/PerformanceImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/PerformanceImpl.cpp	(revision 55720)
+++ /trunk/src/VBox/Main/src-server/PerformanceImpl.cpp	(revision 55721)
@@ -670,5 +670,7 @@
 
     int rc = RTTimerLRStop(m.sampler);
-    AssertRC(rc);
+    if (   RT_FAILURE(rc)
+        && rc != VERR_TIMER_SUSPENDED)     /* calling suspendSampling() successively shouldn't assert. See @bugref{3495}. */
+        AssertMsgFailed(("PerformanceCollector::suspendSampling(): RTTimerLRStop returned %Rrc\n", rc));
 }
 
@@ -679,5 +681,7 @@
 
     int rc = RTTimerLRStart(m.sampler, 0);
-    AssertRC(rc);
+    if (   RT_FAILURE(rc)
+        && rc != VERR_TIMER_ACTIVE)     /* calling resumeSampling() successively shouldn't assert. See @bugref{3495}. */
+        AssertMsgFailed(("PerformanceCollector::resumeSampling(): RTTimerLRStart returned %Rrc\n", rc));
 }
 
