-- require("conky")
 require("signals")
 
--- Set keys
+-- Set keys {{{1
 root.keys(globalkeys)
+
+-- Autostart {{{1
+local utils = require("utils")
+-- This seems to not keep awesome as parent of these processes
+utils.spawn_terminal_once("ncmpcpp", { instance = "ncmpcpp"
+                                     , tag = mediatag
+                                     })
+utils.spawn_terminal_once("neomutt",
+                          { instance = "mutt" , tag = wwwtag })
+utils.spawn_terminal_once("weechat", { instance = "weechat"
+                                     , tag = imtag
+                                     , function (c) awful.client.setmaster(c) end
+                                     })
+-- can't get this to work propery, restarting awesowe will respawn a new qutebrowser
+awful.spawn.single_instance("qutebrowser", { instance = "qutebrowser", tag = wwwtag })
 
       properties = { floating = true } },
     { rule = { class = terminal_class },
       properties = { opacity = 0.8 } },
-    { rule = { class = terminal_class, instance = "mutt" },
-      properties = { tag = wwwtag,
-                     function (c) awful.client.setslave(c) end } },
-    { rule = { class = terminal_class, instance = "ncmpcpp" },
-      properties = { tag = mediatag,
-                     function (c) awful.client.setmaster(c) end } },
-    { rule = { class = terminal_class, instance = "weechat" },
-      properties = { tag = imtag,
-                     function (c) awful.client.setmaster(c) end } },
     { rule_any = { class = { "Steam", "steam" } },
       properties = { tag = tags[1][9] } },
 }
 
     return os.execute(('[ -d "%s" ]'):format(path))
 end
 
-function utils.spawn_terminal(prg, cprop, cb)
+local function terminal_cmd(prg, name)
     local join = require("gears.table").join
     local term_cmd = {terminal}
-    if cprop and cprop.instance then
+    if name then
         if terminal:match("rxvt") then
-            term_cmd = join(term_cmd, {"-name", cprop.instance})
+            term_cmd = join(term_cmd, {"-name", name})
         end
     end
-    awful.spawn(join(term_cmd, {"-e", prg}), cprop, cb)
+    return join(term_cmd, {"-e", prg})
+end
+
+function utils.spawn_terminal(prg, cprop, cb)
+    if not cprop then
+        cprop = {}
+    end
+    local name = cprop.instance
+    awful.spawn(terminal_cmd(prg, name), cprop, cb)
+end
+
+function utils.spawn_terminal_once(prg, rules, matcher, unique_id, cb)
+    local name = rules.instance
+    awful.spawn.once(terminal_cmd(prg, name), rules, matcher, unique_id, cb)
 end
 
 function utils.run_or_kill(prg, cprop, screen)
 
 export URXVT_PERL_LIB
 
 urxvtd -q -o -f
-hash ncmpcpp && urxvtc -name ncmpcpp -icon ~/src/dotfiles/icons/bmp.png           -e ncmpcpp
-hash weechat && urxvtc -name weechat -icon ~/src/dotfiles/icons/im-irc.png        -e weechat
-hash neomutt && urxvtc -name mutt    -icon ~/src/dotfiles/icons/internet-mail.png -e neomutt
-
 compton --config ~/.config/compton.conf &
 unclutter --timeout 1 &
 xcape -e "Control_L=Escape;Control_R=Escape"
-
-qutebrowser &