diff --git a/scripts/network.js b/scripts/network.js
--- a/scripts/network.js
+++ b/scripts/network.js
@@ -9,7 +9,7 @@
 
   const INACTIVE_COLOR = '#999';
 
-  self.settings_command = 'gnome-control-center network &';
+  self.settings_command = 'gnome-control-center network';
 
   self.widget = function () {
     return $('.widget-network');
@@ -319,7 +319,7 @@
 
   $(document).ready(function () {
     self.widget().click(function () {
-      $.ajax('tianbar:///execute', {
+      $.ajax('tianbar:///spawn', {
         data: {
           command: self.settings_command
         }
diff --git a/scripts/volume.js b/scripts/volume.js
--- a/scripts/volume.js
+++ b/scripts/volume.js
@@ -21,7 +21,7 @@
 
   const self = {};
 
-  self.settings_command = 'gnome-control-center sound &';
+  self.settings_command = 'gnome-control-center sound';
 
   function uid() {
     return $.ajax('tianbar:///root/proc/self/status')
@@ -132,7 +132,7 @@
 
   $(document).ready(function () {
     self.widget().click(function () {
-      $.ajax('tianbar:///execute', {
+      $.ajax('tianbar:///spawn', {
         data: {
           command: self.settings_command
         }
diff --git a/src/System/Tianbar/Plugin.hs b/src/System/Tianbar/Plugin.hs
--- a/src/System/Tianbar/Plugin.hs
+++ b/src/System/Tianbar/Plugin.hs
@@ -10,7 +10,9 @@
     URI (..),
     dir,
     look,
+    lookBS,
     looks,
+    looksBS,
     newCallback,
     nullDir,
     parseURI,
diff --git a/src/System/Tianbar/Plugin/ExecuteCommand.hs b/src/System/Tianbar/Plugin/ExecuteCommand.hs
--- a/src/System/Tianbar/Plugin/ExecuteCommand.hs
+++ b/src/System/Tianbar/Plugin/ExecuteCommand.hs
@@ -2,6 +2,8 @@
 
 -- Execute arbitrary commands
 
+import Control.Concurrent
+import Control.Monad
 import Control.Monad.Trans
 
 import System.Process
@@ -14,7 +16,9 @@
 instance Plugin ExecuteCommand where
     initialize = return ExecuteCommand
 
-    handler = dir "execute" executeHandler
+    handler = msum [ dir "execute" executeHandler
+                   , dir "spawn" launchHandler
+                   ]
 
 executeHandler :: ServerPart ExecuteCommand Response
 executeHandler = do
@@ -22,3 +26,15 @@
     command <- look "command"
     output <- liftIO $ readCreateProcess (shell command) ""
     stringResponse output
+
+
+launchHandler :: ServerPart ExecuteCommand Response
+launchHandler = do
+    nullDir
+    command <- look "command"
+    _ <- liftIO $ do
+        process <- spawnCommand command
+        forkIO $ do
+            _ <- waitForProcess process
+            return ()
+    okResponse
diff --git a/src/System/Tianbar/Plugin/Socket.hs b/src/System/Tianbar/Plugin/Socket.hs
--- a/src/System/Tianbar/Plugin/Socket.hs
+++ b/src/System/Tianbar/Plugin/Socket.hs
@@ -10,9 +10,11 @@
 import Control.Monad.State
 import Control.Monad.Trans.Maybe
 
+import qualified Data.ByteString.UTF8 as U
 import qualified Data.Map as M
 
 import Network.Socket
+import qualified Network.Socket.ByteString as SB
 
 import System.Tianbar.Callbacks
 import System.Tianbar.Plugin
@@ -42,8 +44,8 @@
         return s
     (callback, index) <- newCallback
     _ <- liftIO $ forkIO $ void $ forever $ do
-        sockData <- recv sock 4096
-        liftIO $ callback [sockData]
+        sockData <- SB.recv sock 4096
+        liftIO $ callback [U.toString sockData]
         return ()
     spSock . at index .= Just sock
     callbackResponse index
@@ -53,9 +55,9 @@
     nullDir
     index <- fromData
     sock <- MaybeT $ getSocket index
-    dataToSend <- look "data"
+    dataToSend <- lookBS "data"
     -- TODO: resend until done
-    _ <- liftIO $ send sock dataToSend
+    _ <- liftIO $ SB.send sock dataToSend
     callbackResponse index
 
 closeHandler :: ServerPart SocketPlugin Response
diff --git a/src/System/Tianbar/RequestResponse.hs b/src/System/Tianbar/RequestResponse.hs
--- a/src/System/Tianbar/RequestResponse.hs
+++ b/src/System/Tianbar/RequestResponse.hs
@@ -7,7 +7,9 @@
     bytestringResponse,
     jsonResponse,
     look,
+    lookBS,
     looks,
+    looksBS,
     okResponse,
     parseURI,
     serveFile,
@@ -75,14 +77,20 @@
     return $ Response contents (Just $ U.toString fileType)
 
 look :: (MonadPlus m, MonadReader URI m) => String -> m String
-look param = looks param >>= \values -> case values of
+look = fmap U.toString . lookBS
+
+looks :: (MonadPlus m, MonadReader URI m) => String -> m [String]
+looks = fmap (map U.toString) . looksBS
+
+lookBS :: (MonadPlus m, MonadReader URI m) => String -> m B.ByteString
+lookBS param = looksBS param >>= \values -> case values of
                [value] -> return value
                _ -> mzero
 
-looks :: (MonadPlus m, MonadReader URI m) => String -> m [String]
-looks param = asks uriQuery >>= \params -> do
+looksBS :: (MonadPlus m, MonadReader URI m) => String -> m [B.ByteString]
+looksBS param = asks uriQuery >>= \params -> do
     let paramTxt = U.fromString param
-    let isParam (p, value) | p == paramTxt = fmap U.toString value
+    let isParam (p, value) | p == paramTxt = value
                            | otherwise = Nothing
     return $ mapMaybe isParam params
 
diff --git a/src/System/Tianbar/StrutProperties.hs b/src/System/Tianbar/StrutProperties.hs
--- a/src/System/Tianbar/StrutProperties.hs
+++ b/src/System/Tianbar/StrutProperties.hs
@@ -14,7 +14,6 @@
 import GI.Gdk.Structs.Atom
 
 import Foreign
-import Foreign.C.Types
 
 type StrutProperties = (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int)
 
diff --git a/tianbar.cabal b/tianbar.cabal
--- a/tianbar.cabal
+++ b/tianbar.cabal
@@ -1,5 +1,5 @@
 name:                tianbar
-version:             1.1.0.1
+version:             1.1.1.1
 synopsis:            A desktop bar based on WebKit
 description:
   A desktop bar using WebKit for rendering as much as possible.
