diff --git a/tests/test_vagrant.py b/tests/test_vagrant.py
index c9788cc..d131a02 100644
--- a/tests/test_vagrant.py
+++ b/tests/test_vagrant.py
@@ -30,6 +30,20 @@
 import vagrant
 from vagrant import compat
 
+
+# must be defined before TEST_PROVIDER.
+def get_provider() -> str:
+    """
+    Return the provider to use for testing and allow to set it
+    with PYTHON_VAGRANT_TEST_PROVIDER environment variable is set.
+    Defauts to virtualbox
+    """
+    my_prov = "virtualbox"
+    if "PYTHON_VAGRANT_TEST_PROVIDER" in os.environ:
+        my_prov = os.environ["PYTHON_VAGRANT_TEST_PROVIDER"]
+    return my_prov
+
+
 # location of Vagrant executable
 VAGRANT_EXE = vagrant.get_vagrant_executable()
 
@@ -53,7 +67,7 @@
 # name of the base box used for testing
 TEST_BOX_URL = "generic/alpine315"
 TEST_BOX_NAME = TEST_BOX_URL
-TEST_PROVIDER = "virtualbox"
+TEST_PROVIDER = get_provider()
 TEST_DUMMY_BOX_URL = os.path.join(
     os.path.dirname(os.path.abspath(__file__)), "tools", f"dummy-{TEST_PROVIDER}.box"
 )
@@ -459,7 +473,7 @@ def test_boxesvm(test_dir):
     """
     v = vagrant.Vagrant(test_dir)
     box_name = "python-vagrant-dummy-box"
-    provider = "virtualbox"
+    provider = f"{TEST_PROVIDER}"
 
     # Start fresh with no dummy box
     if box_name in list_box_names():
diff --git a/tox.ini b/tox.ini
index e7fb963..a364fe9 100644
--- a/tox.ini
+++ b/tox.ini
@@ -26,6 +26,7 @@ commands =
     --no-cov-on-fail \
   }
 passenv =
+    PYTHON_VAGRANT_TEST_PROVIDER
     # Pass HOME to the test environment as it is required by
     # vagrant. Otherwise error happens due to missing HOME env variable.
     HOME
diff --git a/vagrant/__init__.py b/vagrant/__init__.py
index 9a8dcd4..23d1afb 100644
--- a/vagrant/__init__.py
+++ b/vagrant/__init__.py
@@ -524,6 +524,22 @@ def status(self, vm_name=None):
         output = self._run_vagrant_command(["status", "--machine-readable", vm_name])
         return self._parse_status(output)
 
+    def _normalize_status(self, status, provider):
+        """
+        Normalise VM status to cope with state name being different
+        between providers
+        """
+        if provider == "virtualbox":
+            return status
+
+        if provider == "libvirt":
+            if status == "shutoff":
+                return self.POWEROFF
+            if status == "paused":
+                return self.SAVED
+
+        return status
+
     def _parse_status(self, output):
         """
         Unit testing is so much easier when Vagrant is removed from the
@@ -537,8 +553,9 @@ def _parse_status(self, output):
         for target, tuples in itertools.groupby(parsed, lambda tup: tup[1]):
             # transform tuples into a dict mapping "type" to "data"
             info = {kind: data for timestamp, _, kind, data in tuples}
+            state = self._normalize_status(info.get("state"), info.get("provider-name"))
             status = Status(
-                name=target, state=info.get("state"), provider=info.get("provider-name")
+                name=target, state=state, provider=info.get("provider-name")
             )
             statuses.append(status)