diff --git a/CHANGES.md b/CHANGES.md
index bd050ae7..4aac841d 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -58,6 +58,19 @@
 
 ### Bug Fixes and Minor Changes
 
+  * `XMonad.Layout.LayoutHints`
+
+    Preserve the window order of the modified layout, except for the focused
+    window that is placed on top. This fixes an issue where the border of the
+    focused window in certain situations could be rendered below borders of
+    unfocused windows. It also has a lower risk of interfering with the
+    modified layout.
+
+  * `XMonad.Layout.MultiColumns`
+
+    The focused window is placed above the other windows if they would be made to
+    overlap due to a layout modifier. (As long as it preserves the window order.)
+
   * `XMonad.Actions.GridSelect`
 
     - The vertical centring of text in each cell has been improved.
diff --git a/XMonad/Layout/LayoutHints.hs b/XMonad/Layout/LayoutHints.hs
index 864cf6c4..a5258b13 100644
--- a/XMonad/Layout/LayoutHints.hs
+++ b/XMonad/Layout/LayoutHints.hs
@@ -44,6 +44,7 @@ import Data.Monoid(All(..))
 
 import Data.Set (Set)
 import qualified Data.Set as Set
+import Data.Maybe(fromJust)
 
 -- $usage
 -- You can use this module with the following in your @~\/.xmonad\/xmonad.hs@:
@@ -147,10 +148,15 @@ instance LayoutModifier LayoutHintsToCenter Window where
     modifyLayout _ ws@(W.Workspace _ _ (Just st)) r = do
         (arrs,ol) <- runLayout ws r
         flip (,) ol
+            . changeOrder (W.focus st : (filter (/= W.focus st) $ map fst arrs))
             . head . reverse . sortBy (compare `on` (fitting . map snd))
             . map (applyHints st r) . applyOrder r
             <$> mapM (\x -> fmap ((,) x) $ mkAdjust (fst x)) arrs
 
+changeOrder :: [Window] -> [(Window, Rectangle)] -> [(Window, Rectangle)]
+changeOrder w wr = zip w' $ map (fromJust . flip lookup wr) w'
+    where w' = filter (`elem` map fst wr) w
+
 -- apply hints to first, grow adjacent windows
 applyHints :: W.Stack Window -> Rectangle -> [((Window, Rectangle),(D -> D))] -> [(Window, Rectangle)]
 applyHints _ _ [] = []
diff --git a/XMonad/Layout/MultiColumns.hs b/XMonad/Layout/MultiColumns.hs
index bea4be35..3e9321d1 100644
--- a/XMonad/Layout/MultiColumns.hs
+++ b/XMonad/Layout/MultiColumns.hs
@@ -77,10 +77,9 @@ data MultiCol a = MultiCol
   } deriving (Show,Read,Eq)
 
 instance LayoutClass MultiCol a where
-    doLayout l r s = return (zip w rlist, resl)
+    doLayout l r s = return (combine s rlist, resl)
         where rlist = doL (multiColNWin l') (multiColSize l') r wlen
-              w = W.integrate s
-              wlen = length w
+              wlen = length $ W.integrate s
               -- Make sure the list of columns is big enough and update active column
               nw = multiColNWin l ++ repeat (multiColDefWin l)
               l' = l { multiColNWin = take (max (length $ multiColNWin l) $ getCol (wlen-1) nw + 1) nw
@@ -90,6 +89,7 @@ instance LayoutClass MultiCol a where
               resl = if l'==l
                      then Nothing
                      else Just l'
+              combine (W.Stack foc left right) rs = zip (foc : reverse left ++ right) $ raiseFocused (length left) rs
     handleMessage l m =
         return $ msum [fmap resize     (fromMessage m)
                       ,fmap incmastern (fromMessage m)]
@@ -104,6 +104,10 @@ instance LayoutClass MultiCol a where
                   a = multiColActive l
     description _ = "MultiCol"
 
+raiseFocused :: Int -> [a] -> [a]
+raiseFocused n xs = actual ++ before ++ after
+    where (before,rest) = splitAt n xs
+          (actual,after) = splitAt 1 rest
 
 -- | Get which column a window is in, starting at 0.
 getCol :: Int -> [Int] -> Int