diff --git a/src/libvirt-machine.vala b/src/libvirt-machine.vala
index 163b0fa..12c7ce4 100644
--- a/src/libvirt-machine.vala
+++ b/src/libvirt-machine.vala
@@ -8,11 +8,18 @@ private class Boxes.LibvirtMachine: Boxes.Machine {
     public GVir.Connection connection;
     private string? storage_volume_path;
 
-    private DomainState get_state_sync () {
-        try {
-            return domain.get_info ().state;
-        } catch (GLib.Error error) {
-            return DomainState.NONE;
+    public enum MachineState {
+        UNKNOWN,
+        STOPPED,
+        RUNNING,
+        PAUSED
+    }
+
+    private MachineState _state;
+    public MachineState state { get { return _state; }
+        private set {
+            _state = value;
+            debug ("State of '%s' changed to %s", name, state.to_string ());
         }
     }
 
@@ -35,12 +42,40 @@ private class Boxes.LibvirtMachine: Boxes.Machine {
         if (display != null)
             return;
 
-        var state = get_state_sync ();
-        if (state != DomainState.RUNNING) {
+        try {
+            var s = domain.get_info ().state;
+            switch (s) {
+            case DomainState.RUNNING:
+            case DomainState.BLOCKED:
+                state = MachineState.RUNNING;
+                break;
+            case DomainState.PAUSED:
+                state = MachineState.PAUSED;
+                break;
+            case DomainState.SHUTDOWN:
+            case DomainState.SHUTOFF:
+            case DomainState.CRASHED:
+                state = MachineState.STOPPED;
+                break;
+            default:
+            case DomainState.NONE:
+                state = MachineState.UNKNOWN;
+                break;
+            }
+        } catch (GLib.Error error) {
+            state = MachineState.UNKNOWN;
+        }
+
+        domain.started.connect (() => { state = MachineState.RUNNING; });
+        domain.suspended.connect (() => { state = MachineState.PAUSED; });
+        domain.resumed.connect (() => { state = MachineState.RUNNING; });
+        domain.stopped.connect (() => { state = MachineState.STOPPED; });
+
+        if (state != MachineState.RUNNING) {
             if (started_id != 0)
                 return;
 
-            if (state == DomainState.PAUSED) {
+            if (state == MachineState.PAUSED) {
                 started_id = domain.resumed.connect (() => {
                     domain.disconnect (started_id);
                     started_id = 0;
@@ -126,8 +161,7 @@ private class Boxes.LibvirtMachine: Boxes.Machine {
     private void update_cpu_stat (DomainInfo info, ref MachineStat stat) {
         var prev = stats[STATS_SIZE - 1];
 
-        if (info.state == DomainState.CRASHED ||
-            info.state == DomainState.SHUTOFF)
+        if (info.state == DomainState.CRASHED || info.state == DomainState.SHUTOFF)
             return;
 
         stat.cpu_time = info.cpuTime - prev.cpu_time_abs;
@@ -321,7 +355,7 @@ private class Boxes.LibvirtMachine: Boxes.Machine {
     }
 
     public override bool is_running () {
-        return get_state_sync () == DomainState.RUNNING;
+        return state == MachineState.RUNNING;
     }
 
     public override async bool take_screenshot () throws GLib.Error {
