diff --git a/woman/lib.py b/woman/lib.py
index 9416f2d4078456041430d2116ee4e9747c016d0d..2afe3c3561227fe3c10bed142a540314e548ac0d 100644
--- a/woman/lib.py
+++ b/woman/lib.py
@@ -52,6 +52,35 @@ def move_container(master, slave):
     shared.i3_cmd(f'move container to workspace {workspace(master, slave)}')
     shared.qt_task("ws_changed", master, slave)
 
+def swap_master(a, b):
+    do_after = []
+    def proc_one_direction(a, b):
+        for i in shared.master_on:
+            if a == shared.master_on[i]:
+                @do_after.append
+                def _():
+                    shared.master_on[i] = b
+        for i in shared.slave_on_for:
+            x = shared.slave_on_for[i][a]
+            @do_after.append
+            def _():
+                shared.slave_on_for[i][b] = x
+        x = shared.slave_for[a]
+        @do_after.append
+        def _():
+            shared.slave_for[b] = x
+    proc_one_direction(a, b)
+    proc_one_direction(b, a)
+
+    for slave in range(MIN_SLAVE, MAX_MASTERED_SLAVE+1):
+        swap_workspace(a, slave, b, slave)
+
+    for f in do_after:
+        f()
+
+    for slave in range(MIN_SLAVE, MAX_MASTERED_SLAVE+1):
+        shared.qt_task("ws_metadata_changed", a, slave)
+        shared.qt_task("ws_metadata_changed", b, slave)
 
 def swap_workspace(a_master, a_slave, b_master, b_slave):
     if (a_master, a_slave) == (b_master, b_slave):
diff --git a/woman/main_functions.py b/woman/main_functions.py
index 39885af994d0650cc5e199fd216f0097876e4380..99acde5473391c4ec5a0bf72dc89477a9aa6a5b8 100644
--- a/woman/main_functions.py
+++ b/woman/main_functions.py
@@ -111,6 +111,18 @@ def mf_goto_workspace(params):
     n_master, n_slave = params_workspace(params)
     goto_workspace(n_master, n_slave)
 
+@main_function(["swap-master-with", "sm"], [
+        arg('-m', "--master", type=MasterType, help="Switch master workspace"),
+        arg('-n', "--notify", action='store_true'),
+    ] , "Swap current master with specified master.")
+def mf_swap_master_with(params):
+    current = shared.workspace_on[shared.output]
+    if current[0] is not None and current != GUI_WORKSPACE:
+        n_master, n_slave = get_workspace(params.master)
+        if params.notify:
+            osd.notify(f"MASTER {n_master}", color="magenta", to='display', min_duration=0, duration=500)
+        swap_master(n_master, current[0])
+
 @main_function(["swap-with-workspace", "s"], std_parser, "Swap current workspace with specified workspace.")
 def mf_swap_with_workspace(params):
     current = shared.workspace_on[shared.output]