diff --git a/Setup.lhs b/Setup.lhs
--- a/Setup.lhs
+++ b/Setup.lhs
@@ -13,15 +13,16 @@
 >
 > myPostCopy :: Args -> CopyFlags -> PackageDescription -> LocalBuildInfo -> IO ()
 > myPostCopy _ copyflags pkgdesc lbi = do
->   let dirs = absoluteInstallDirs pkgdesc lbi (fromFlag $ copyDest copyflags)
->   libExecHook dirs
->   insertPath dirs
+>   let copyDirs = absoluteInstallDirs pkgdesc lbi (fromFlag $ copyDest copyflags)
+>   libExecHook copyDirs
+>   let installDirs = absoluteInstallDirs pkgdesc lbi NoCopyDest
+>   insertPath copyDirs installDirs
 >
 > myPostInst :: Args -> InstallFlags -> PackageDescription -> LocalBuildInfo -> IO ()
 > myPostInst _ _ pkgdesc lbi = do
 >   let dirs = absoluteInstallDirs pkgdesc lbi NoCopyDest
 >   libExecHook dirs
->   insertPath dirs
+>   insertPath dirs dirs
 >
 > -- hook to move helper binaries to the libexec directory
 > libExecHook :: InstallDirs String -> IO ()
@@ -33,11 +34,10 @@
 >     renameFile (bdir </> binary) (lexecdir </> binary)
 >
 > -- hook to insert path to system wide configuration
-> insertPath :: InstallDirs String -> IO ()
-> insertPath dirs = do
->   let ddir = datadir dirs
->   let userConfigTemplate = ddir </> "etc" </> "bluetilerc_user_template"
->   let pathToSystemConfig = ddir </> "etc" </> "bluetilerc"
+> insertPath :: InstallDirs String -> InstallDirs String -> IO ()
+> insertPath copyDirs installDirs = do
+>   let userConfigTemplate = datadir copyDirs </> "etc" </> "bluetilerc_user_template"
+>   let pathToSystemConfig = datadir installDirs </> "etc" </> "bluetilerc"
 >   contents <- readFileStrict userConfigTemplate
 >   let contentsPatched = subRegex (mkRegex "__PATH_TO_BLUETILERC__") contents pathToSystemConfig
 >   writeFile userConfigTemplate contentsPatched
diff --git a/bluetile.cabal b/bluetile.cabal
--- a/bluetile.cabal
+++ b/bluetile.cabal
@@ -1,5 +1,5 @@
 Name:                bluetile
-Version:             0.5
+Version:             0.5.1
 homepage:            http://www.bluetile.org/
 synopsis:            full-featured tiling for the GNOME desktop environment
 description:
@@ -22,6 +22,7 @@
                      src/XMonad/Actions/WindowMenu.hs,
                      src/XMonad/Hooks/CurrentWorkspaceOnTop.hs,
                      src/XMonad/Hooks/EwmhDesktops.hs,
+                     src/XMonad/Hooks/Minimize.hs
                      src/XMonad/Hooks/PositionStoreHooks.hs,
                      src/XMonad/Layout/BorderResize.hs,
                      src/XMonad/Layout/ButtonDecoration.hs,
@@ -71,7 +72,7 @@
     Ghc-Options:       -fno-warn-unused-do-bind
 
 Executable gnome-bluetile-session
-  Buildable:         False
+  Buildable:         True
   Hs-Source-Dirs:    gnome-bluetile-session
   Main-is:           GnomeBluetileSession.hs
   Build-Depends:     base>=3, base<5, filepath, unix
diff --git a/bluetiledock/BluetileDock.hs b/bluetiledock/BluetileDock.hs
--- a/bluetiledock/BluetileDock.hs
+++ b/bluetiledock/BluetileDock.hs
@@ -147,7 +147,7 @@
     onClicked configBtn $ do
         home <- getEnv "HOME"
         let userConfig = home </> ".bluetilerc"
-        spawnPipe $ "gedit " ++ userConfig
+        spawnPipe $ "gnome-open " ++ userConfig
         return ()
 
     -- quit button
diff --git a/src/Config.hs b/src/Config.hs
--- a/src/Config.hs
+++ b/src/Config.hs
@@ -44,8 +44,9 @@
 import XMonad.Hooks.ManageDocks
 import XMonad.Hooks.ManageHelpers
 import XMonad.Hooks.PositionStoreHooks
-import XMonad.Hooks.RestoreMinimized
+import XMonad.Hooks.Minimize
 import XMonad.Hooks.ServerMode
+import XMonad.Hooks.SetWMName
 import XMonad.Hooks.WorkspaceByPos
 
 import XMonad.Config.Gnome
@@ -123,7 +124,7 @@
 
     -- maximizing and minimizing
     , ("key_maximize_window"                , withFocused (sendMessage . maximizeRestore))
-    , ("key_minimize_window"                , withFocused (\f -> sendMessage (MinimizeWin f)))
+    , ("key_minimize_window"                , withFocused minimizeWindow)
     , ("key_restore_minimized_window"       , sendMessage RestoreNextMinimizedWin)
     ]
     ++
@@ -189,13 +190,13 @@
 createXMonadConfig bluetilerc =
     defaultConfig
         { modMask = defaultModifierBRC bluetilerc,
-          startupHook = ewmhDesktopsStartup,
+          startupHook = ewmhDesktopsStartup >> setWMName "LG3D",
           manageHook = bluetileManageHook,
           layoutHook = bluetileLayoutHook,
           logHook = currentWorkspaceOnTop >> ewmhDesktopsLogHook,
           handleEventHook = ewmhDesktopsEventHook
                                 `mappend` fullscreenEventHook
-                                `mappend` restoreMinimizedEventHook
+                                `mappend` minimizeEventHook
                                 `mappend` serverModeEventHook' bluetileCommands
                                 `mappend` positionStoreEventHook,
           workspaces = bluetileWorkspaces,
diff --git a/src/XMonad/Actions/WindowMenu.hs b/src/XMonad/Actions/WindowMenu.hs
--- a/src/XMonad/Actions/WindowMenu.hs
+++ b/src/XMonad/Actions/WindowMenu.hs
@@ -62,7 +62,7 @@
         actions = [ ("Cancel menu", return ())
                   , ("Close"      , kill)
                   , ("Maximize"   , sendMessage $ maximizeRestore w)
-                  , ("Minimize"   , sendMessage $ MinimizeWin w)
+                  , ("Minimize"   , minimizeWindow w)
                   ] ++
                   [ ("Move to " ++ tag, windows $ W.shift tag)
                     | tag <- tags ]
diff --git a/src/XMonad/Hooks/CurrentWorkspaceOnTop.hs b/src/XMonad/Hooks/CurrentWorkspaceOnTop.hs
--- a/src/XMonad/Hooks/CurrentWorkspaceOnTop.hs
+++ b/src/XMonad/Hooks/CurrentWorkspaceOnTop.hs
@@ -26,6 +26,7 @@
 import qualified XMonad.StackSet as S
 import Control.Monad(when)
 import System.Posix.Env
+import qualified Data.Map as M
 
 -- $usage
 -- You can use this module with the following in your @~\/.xmonad\/xmonad.hs@:
@@ -48,12 +49,18 @@
     let (CWOTS lastTag) = maybe (CWOTS "") read cwotsEnvM
     let curTag = S.tag . S.workspace . S.current $ ws
     when (curTag /= lastTag) $ do
+        -- the following is more or less a reimplementation of what's happening in "XMonad.Operation"
         let s = S.current ws
             wsp = S.workspace s
             viewrect = screenRect $ S.screenDetail s
-            tmpStack = S.stack . S.workspace $ s
-        (rs, _) <- runLayout wsp { S.stack = tmpStack } viewrect
-        let wins = map fst rs
+            tmpStack = (S.stack wsp) >>= S.filter (`M.notMember` S.floating ws)
+        (rs, ml') <- runLayout wsp { S.stack = tmpStack } viewrect
+        updateLayout curTag ml'
+        let this = S.view curTag ws
+            fltWins = filter (flip M.member (S.floating ws)) $ S.index this
+            wins = fltWins ++ (map fst rs)  -- order: first all floating windows, then the order the layout returned
+        -- end of reimplementation
+
         when (not . null $ wins) $ do
             io $ raiseWindow d (head wins)  -- raise first window of current workspace to the very top,
             io $ restackWindows d wins      -- then use restackWindows to let all other windows from the workspace follow
diff --git a/src/XMonad/Hooks/Minimize.hs b/src/XMonad/Hooks/Minimize.hs
new file mode 100644
--- /dev/null
+++ b/src/XMonad/Hooks/Minimize.hs
@@ -0,0 +1,53 @@
+----------------------------------------------------------------------------
+-- |
+-- Module      :  XMonad.Hooks.Minimize
+-- Copyright   :  (c) Justin Bogner 2010
+-- License     :  BSD3-style (see LICENSE)
+--
+-- Maintainer  :  Justin Bogner <mail@justinbogner.com>
+-- Stability   :  unstable
+-- Portability :  not portable
+--
+-- Handles window manager hints to minimize and restore windows. Use
+-- this with XMonad.Layout.Minimize.
+--
+-----------------------------------------------------------------------------
+
+module XMonad.Hooks.Minimize
+    ( -- * Usage
+      -- $usage
+      minimizeEventHook
+    ) where
+
+import Data.Monoid
+import Control.Monad(when)
+
+import XMonad
+import XMonad.Layout.Minimize
+
+-- $usage
+-- You can use this module with the following in your @~\/.xmonad\/xmonad.hs@:
+--
+-- > import XMonad.Hooks.Minimize
+-- > import XMonad.Layout.Minimize
+-- >
+-- > myHandleEventHook = minimizeEventHook
+-- > myLayout = minimize (Tall 1 (3/100) (1/2)) ||| Full ||| etc..
+-- > main = xmonad defaultConfig { layoutHook = myLayout
+-- >                             , handleEventHook = myHandleEventHook }
+
+minimizeEventHook :: Event -> X All
+minimizeEventHook (ClientMessageEvent {ev_window = w,
+                                       ev_message_type = mt,
+                                       ev_data = dt}) = do
+    a_aw <- getAtom "_NET_ACTIVE_WINDOW"
+    a_cs <- getAtom "WM_CHANGE_STATE"
+
+    when (mt == a_aw) $ sendMessage (RestoreMinimizedWin w)
+    when (mt == a_cs) $ do
+      let message = fromIntegral . head $ dt
+      when (message == normalState) $ sendMessage (RestoreMinimizedWin w)
+      when (message == iconicState) $ minimizeWindow w
+
+    return (All True)
+minimizeEventHook _ = return (All True)
diff --git a/src/XMonad/Layout/DecorationAddons.hs b/src/XMonad/Layout/DecorationAddons.hs
--- a/src/XMonad/Layout/DecorationAddons.hs
+++ b/src/XMonad/Layout/DecorationAddons.hs
@@ -62,7 +62,7 @@
                              then focus mainw >> sendMessage (maximizeRestore mainw) >> return True
                   else if (fi distFromRight >= minimizeButtonOffset &&
                            fi distFromRight <= minimizeButtonOffset + buttonSize)
-                             then focus mainw >> sendMessage (MinimizeWin mainw) >> return True
+                             then focus mainw >> minimizeWindow mainw >> return True
                   else return False
     action
 
diff --git a/src/XMonad/Layout/ImageButtonDecoration.hs b/src/XMonad/Layout/ImageButtonDecoration.hs
--- a/src/XMonad/Layout/ImageButtonDecoration.hs
+++ b/src/XMonad/Layout/ImageButtonDecoration.hs
@@ -158,7 +158,7 @@
                              then focus mainw >> sendMessage (maximizeRestore mainw) >> return True
                   else if (fi distFromRight >= minimizeButtonOffset &&
                            fi distFromRight <= minimizeButtonOffset + buttonSize)
-                             then focus mainw >> sendMessage (MinimizeWin mainw) >> return True
+                             then focus mainw >> minimizeWindow mainw >> return True
                   else return False
     action
 
diff --git a/src/XMonad/Layout/Minimize.hs b/src/XMonad/Layout/Minimize.hs
--- a/src/XMonad/Layout/Minimize.hs
+++ b/src/XMonad/Layout/Minimize.hs
@@ -18,7 +18,8 @@
         -- * Usage
         -- $usage
         minimize,
-        MinimizeMsg(..)
+        minimizeWindow,
+        MinimizeMsg(RestoreMinimizedWin,RestoreNextMinimizedWin)
     ) where
 
 import XMonad
@@ -47,7 +48,7 @@
 --
 -- In the key-bindings, do something like:
 --
--- >        , ((modm,               xK_m     ), withFocused (\f -> sendMessage (MinimizeWin f)))
+-- >        , ((modm,               xK_m     ), withFocused minimizeWindow)
 -- >        , ((modm .|. shiftMask, xK_m     ), sendMessage RestoreNextMinimizedWin)
 --
 -- The first action will minimize the focused window, while the second one will restore
@@ -62,8 +63,8 @@
 -- the keyboard. Include 'BW.boringWindows' in your layout hook and see the
 -- documentation of "XMonad.Layout.BoringWindows" on how to modify your keybindings.
 --
--- Also see "XMonad.Hooks.RestoreMinimized" if you want to be able to restore
--- minimized windows from your taskbar.
+-- Also see "XMonad.Hooks.Minimize" if you want to be able to minimize
+-- and restore windows from your taskbar.
 
 data Minimize a = Minimize [Window] (M.Map Window W.RationalRect) deriving ( Read, Show )
 minimize :: LayoutClass l Window => l Window -> ModifiedLayout Minimize l Window
@@ -75,6 +76,8 @@
                     deriving (Typeable, Eq)
 instance Message MinimizeMsg
 
+minimizeWindow :: Window -> X ()
+minimizeWindow w = sendMessage (MinimizeWin w) >> BW.focusDown
 
 setMinimizedState :: Window -> Int -> (CLong -> [CLong] -> [CLong]) -> X ()
 setMinimizedState win st f = do
@@ -103,34 +106,34 @@
 
     handleMess (Minimize minimized unfloated) m
         | Just (MinimizeWin w) <- fromMessage m, not (w `elem` minimized) = do
-                BW.focusDown
                 setMinimized w
                 ws <- gets windowset
                 case M.lookup w (W.floating ws) of
                   Nothing -> return $ Just $ Minimize (w:minimized) unfloated
                   Just r -> do
-                    (windows . W.sink) w
+                    modify (\s -> s { windowset = W.sink w ws})
                     return $ Just $ Minimize (w:minimized) (M.insert w r unfloated)
         | Just (RestoreMinimizedWin w) <- fromMessage m = do
             setNotMinimized w
             case M.lookup w unfloated of
               Nothing -> return $ Just $ Minimize (minimized \\ [w]) unfloated
               Just r -> do
-                (windows . (W.float w)) r
+                ws <- gets windowset
+                modify (\s -> s { windowset = W.float w r ws})
                 return $ Just $ Minimize (minimized \\ [w]) (M.delete w unfloated)
-        | Just RestoreNextMinimizedWin <- fromMessage m =
+        | Just RestoreNextMinimizedWin <- fromMessage m = do
+          ws <- gets windowset
           if not (null minimized)
             then case M.lookup (head minimized) unfloated of
               Nothing -> do
                 let w = head minimized
                 setNotMinimized w
-                focus w
+                modify (\s -> s { windowset = W.focusWindow w ws})
                 return $ Just $ Minimize (tail minimized) unfloated
               Just r -> do
                 let w = head minimized
                 setNotMinimized w
-                (windows . (W.float w)) r
-                focus w
+                modify (\s -> s { windowset = (W.focusWindow w . W.float w r) ws})
                 return $ Just $ Minimize (tail minimized) (M.delete w unfloated)
             else return Nothing
         | Just BW.UpdateBoring <- fromMessage m = do
