diff --git a/woman/qt.py b/woman/qt.py
index 20099d552704b63ba7b5ed31e18e8f9ea8dbc251..eeb737a9e41f105b84d10d3c31269feee316f3ef 100755
--- a/woman/qt.py
+++ b/woman/qt.py
@@ -721,10 +721,19 @@ def qt_main():
                 f.move_to_workspace(target.workspace_widget.master, target.workspace_widget.slave)
 
         def move_to_workspace(self, master, slave, expand=False):
-            if (w := self.root_i3_tree_widget()) is not None:
-                w.move_to_workspace(master, slave, expand=expand)
-            for f in self._tree.floating_nodes:
-                f.move_to_workspace(master, slave)
+            try:
+                with shared.lock:
+                    shared.output_of_workspace[master][slave]
+                    empty = False
+            except KeyError:
+                empty = True
+            if empty:
+                swap_workspace(self.master, self.slave, master, slave)
+            else:
+                if (w := self.root_i3_tree_widget()) is not None:
+                    w.move_to_workspace(master, slave, expand=expand)
+                for f in self._tree.floating_nodes:
+                    f.move_to_workspace(master, slave)
 
         def quit_windows(self, *arg, **kvarg):
             if self._tree.root_node is not None:
@@ -732,6 +741,9 @@ def qt_main():
             for f in self._tree.floating_nodes:
                 f.quit_windows(*arg, **kvarg)
 
+        def swap_with_workspace(self, master, slave):
+            swap_workspace(self.master, self.slave, master, slave)
+
         def clicked(self, pos, buttons):
             if buttons == Qt.RightButton:
                 try:
@@ -763,7 +775,13 @@ def qt_main():
                 m_win.cmd_msg_clean()
                 button = s.press_event_buttons
                 try:
-                    s.move_to_workspace(self.master, self.slave, expand=button == Qt.RightButton)
+                    if button == Qt.MiddleButton:
+                        if isinstance(s, WorkspaceWidget):
+                            s.swap_with_workspace(self.master, self.slave)
+                        else:
+                            self.move(s, swap=True)
+                    else:
+                        s.move_to_workspace(self.master, self.slave, expand=button == Qt.RightButton)
                     m_win.load_i3_tree()
                 except I3CmdException as e:
                     m_win.cmd_msg(e.error, QColor(255, 100, 100))