diff --git a/src/client.c b/src/client.c
index b964b60ac41fb530521beaba8d248aeed134ef9c..e184eb239634ae0853c3807f2fc00476eff26763 100644
--- a/src/client.c
+++ b/src/client.c
@@ -2500,9 +2500,12 @@ clientShade (Client * c)
     clientSetNetState (c);
     if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_MANAGED))
     {
+        clientConstrainPos (c, FALSE);
+        wc.x = c->x;
+        wc.y = c->y;
         wc.width = c->width;
         wc.height = c->height;
-        clientConfigure (c, &wc, CWWidth | CWHeight, CFG_FORCE_REDRAW);
+        clientConfigure (c, &wc, CWX | CWY | CWWidth | CWHeight, CFG_FORCE_REDRAW);
     }
 }
 
@@ -3512,6 +3515,7 @@ clientResize_event_filter (XEvent * xevent, gpointer data)
     int move_top, move_bottom, move_left, move_right;
     GdkRectangle rect;
     gint monitor_nbr;
+    gint min_visible;
 
     TRACE ("entering clientResize_event_filter");
 
@@ -3527,6 +3531,7 @@ clientResize_event_filter (XEvent * xevent, gpointer data)
     frame_left = frameLeft (c);
     frame_right = frameRight (c);
     frame_bottom = frameBottom (c);
+    min_visible = MAX (frame_top, CLIENT_MIN_VISIBLE);
 
     cx = frame_x + (frame_width / 2);
     cy = frame_y + (frame_height / 2);
@@ -3626,13 +3631,13 @@ clientResize_event_filter (XEvent * xevent, gpointer data)
             }
             else
             {
-                if ((c->x + c->width < disp_x + CLIENT_MIN_VISIBLE)
-                    || (c->x + c->width < screen_info->margins [LEFT] + CLIENT_MIN_VISIBLE))
+                if ((c->x + c->width < disp_x + min_visible)
+                    || (c->x + c->width < screen_info->margins [LEFT] + min_visible))
                 {
                     c->width = prev_width;
                 }
-                if ((c->y + c->height < disp_y + CLIENT_MIN_VISIBLE)
-                    || (c->y + c->height < screen_info->margins [TOP] + CLIENT_MIN_VISIBLE))
+                if ((c->y + c->height < disp_y + min_visible)
+                    || (c->y + c->height < screen_info->margins [TOP] + min_visible))
                 {
                     c->height = prev_height;
                 }
@@ -3744,9 +3749,9 @@ clientResize_event_filter (XEvent * xevent, gpointer data)
 
         if (move_top)
         {
-            if ((c->y > disp_max_y - CLIENT_MIN_VISIBLE)
+            if ((c->y > disp_max_y - min_visible)
                 || (c->y > gdk_screen_get_height (screen_info->gscr)
-                           - screen_info->margins [BOTTOM] - CLIENT_MIN_VISIBLE))
+                           - screen_info->margins [BOTTOM] - min_visible))
             {
                 c->y = prev_y;
                 c->height = prev_height;
@@ -3754,17 +3759,17 @@ clientResize_event_filter (XEvent * xevent, gpointer data)
         }
         else if (move_bottom)
         {
-            if ((c->y + c->height < disp_y + CLIENT_MIN_VISIBLE)
-                || (c->y + c->height < screen_info->margins [TOP] + CLIENT_MIN_VISIBLE))
+            if ((c->y + c->height < disp_y + min_visible)
+                || (c->y + c->height < screen_info->margins [TOP] + min_visible))
             {
                 c->height = prev_height;
             }
         }
         if (move_left)
         {
-            if ((c->x > disp_max_x - CLIENT_MIN_VISIBLE)
+            if ((c->x > disp_max_x - min_visible)
                 || (c->x > gdk_screen_get_width (screen_info->gscr)
-                           - screen_info->margins [RIGHT] - CLIENT_MIN_VISIBLE))
+                           - screen_info->margins [RIGHT] - min_visible))
             {
                 c->x = prev_x;
                 c->width = prev_width;
@@ -3772,8 +3777,8 @@ clientResize_event_filter (XEvent * xevent, gpointer data)
         }
         else if (move_right)
         {
-            if ((c->x + c->width < disp_x + CLIENT_MIN_VISIBLE)
-                || (c->x + c->width < screen_info->margins [LEFT] + CLIENT_MIN_VISIBLE))
+            if ((c->x + c->width < disp_x + min_visible)
+                || (c->x + c->width < screen_info->margins [LEFT] + min_visible))
             {
                 c->width = prev_width;
             }
diff --git a/src/client.h b/src/client.h
index 6337907be74817687c182de9c9f35a0a9e896e37..4dfe345cffec2503ef222186147c3750f1bb7719 100644
--- a/src/client.h
+++ b/src/client.h
@@ -79,77 +79,79 @@
                                          UPDATE_GRAVITY | \
                                          UPDATE_CACHE)
 
-#define CLIENT_MIN_VISIBLE              10      /* pixels */
+#ifndef CLIENT_MIN_VISIBLE
+#define CLIENT_MIN_VISIBLE              15
+#endif
 
-#define XFWM_FLAG_HAS_BORDER           (1L<<0)
-#define XFWM_FLAG_HAS_MENU             (1L<<1)
-#define XFWM_FLAG_HAS_MAXIMIZE         (1L<<2)
-#define XFWM_FLAG_HAS_CLOSE            (1L<<3)
-#define XFWM_FLAG_HAS_HIDE             (1L<<4)
-#define XFWM_FLAG_HAS_MOVE             (1L<<5)
-#define XFWM_FLAG_HAS_RESIZE           (1L<<6)
-#define XFWM_FLAG_HAS_STICK            (1L<<7)
-#define XFWM_FLAG_FOCUS                (1L<<8)
-#define XFWM_FLAG_IS_RESIZABLE         (1L<<9)
-#define XFWM_FLAG_MAP_PENDING          (1L<<10)
-#define XFWM_FLAG_VISIBLE              (1L<<11)
-#define XFWM_FLAG_MANAGED              (1L<<13)
-#define XFWM_FLAG_SESSION_MANAGED      (1L<<14)
-#define XFWM_FLAG_WORKSPACE_SET        (1L<<15)
-#define XFWM_FLAG_WAS_SHOWN            (1L<<16)
-#define XFWM_FLAG_DRAW_ACTIVE          (1L<<17)
-#define XFWM_FLAG_SEEN_ACTIVE          (1L<<18)
-#define XFWM_FLAG_FIRST_MAP            (1L<<19)
-#define XFWM_FLAG_LEGACY_FULLSCREEN    (1L<<20)
-#define XFWM_FLAG_MOVING_RESIZING      (1L<<21)
+#define XFWM_FLAG_HAS_BORDER            (1L<<0)
+#define XFWM_FLAG_HAS_MENU              (1L<<1)
+#define XFWM_FLAG_HAS_MAXIMIZE          (1L<<2)
+#define XFWM_FLAG_HAS_CLOSE             (1L<<3)
+#define XFWM_FLAG_HAS_HIDE              (1L<<4)
+#define XFWM_FLAG_HAS_MOVE              (1L<<5)
+#define XFWM_FLAG_HAS_RESIZE            (1L<<6)
+#define XFWM_FLAG_HAS_STICK             (1L<<7)
+#define XFWM_FLAG_FOCUS                 (1L<<8)
+#define XFWM_FLAG_IS_RESIZABLE          (1L<<9)
+#define XFWM_FLAG_MAP_PENDING           (1L<<10)
+#define XFWM_FLAG_VISIBLE               (1L<<11)
+#define XFWM_FLAG_MANAGED               (1L<<13)
+#define XFWM_FLAG_SESSION_MANAGED       (1L<<14)
+#define XFWM_FLAG_WORKSPACE_SET         (1L<<15)
+#define XFWM_FLAG_WAS_SHOWN             (1L<<16)
+#define XFWM_FLAG_DRAW_ACTIVE           (1L<<17)
+#define XFWM_FLAG_SEEN_ACTIVE           (1L<<18)
+#define XFWM_FLAG_FIRST_MAP             (1L<<19)
+#define XFWM_FLAG_LEGACY_FULLSCREEN     (1L<<20)
+#define XFWM_FLAG_MOVING_RESIZING       (1L<<21)
 
-#define CLIENT_FLAG_HAS_STRUT          (1L<<0)
-#define CLIENT_FLAG_HAS_STRUT_PARTIAL  (1L<<1)
-#define CLIENT_FLAG_HAS_USER_TIME      (1L<<2)
-#define CLIENT_FLAG_ABOVE              (1L<<3)
-#define CLIENT_FLAG_BELOW              (1L<<4)
-#define CLIENT_FLAG_FULLSCREEN         (1L<<5)
-#define CLIENT_FLAG_ICONIFIED          (1L<<6)
-#define CLIENT_FLAG_MAXIMIZED_VERT     (1L<<7)
-#define CLIENT_FLAG_MAXIMIZED_HORIZ    (1L<<8)
-#define CLIENT_FLAG_MAXIMIZED          (CLIENT_FLAG_MAXIMIZED_VERT | \
-                                        CLIENT_FLAG_MAXIMIZED_HORIZ)
-#define CLIENT_FLAG_SHADED             (1L<<9)
-#define CLIENT_FLAG_SKIP_PAGER         (1L<<10)
-#define CLIENT_FLAG_SKIP_TASKBAR       (1L<<11)
-#define CLIENT_FLAG_STATE_MODAL        (1L<<12)
-#define CLIENT_FLAG_STICKY             (1L<<13)
-#define CLIENT_FLAG_NAME_CHANGED       (1L<<15)
-#define CLIENT_FLAG_DEMANDS_ATTENTION  (1L<<16)
-#define CLIENT_FLAG_HAS_SHAPE          (1L<<17)
+#define CLIENT_FLAG_HAS_STRUT           (1L<<0)
+#define CLIENT_FLAG_HAS_STRUT_PARTIAL   (1L<<1)
+#define CLIENT_FLAG_HAS_USER_TIME       (1L<<2)
+#define CLIENT_FLAG_ABOVE               (1L<<3)
+#define CLIENT_FLAG_BELOW               (1L<<4)
+#define CLIENT_FLAG_FULLSCREEN          (1L<<5)
+#define CLIENT_FLAG_ICONIFIED           (1L<<6)
+#define CLIENT_FLAG_MAXIMIZED_VERT      (1L<<7)
+#define CLIENT_FLAG_MAXIMIZED_HORIZ     (1L<<8)
+#define CLIENT_FLAG_MAXIMIZED           (CLIENT_FLAG_MAXIMIZED_VERT | \
+                                         CLIENT_FLAG_MAXIMIZED_HORIZ)
+#define CLIENT_FLAG_SHADED              (1L<<9)
+#define CLIENT_FLAG_SKIP_PAGER          (1L<<10)
+#define CLIENT_FLAG_SKIP_TASKBAR        (1L<<11)
+#define CLIENT_FLAG_STATE_MODAL         (1L<<12)
+#define CLIENT_FLAG_STICKY              (1L<<13)
+#define CLIENT_FLAG_NAME_CHANGED        (1L<<15)
+#define CLIENT_FLAG_DEMANDS_ATTENTION   (1L<<16)
+#define CLIENT_FLAG_HAS_SHAPE           (1L<<17)
 
-#define WM_FLAG_DELETE                 (1L<<0)
-#define WM_FLAG_INPUT                  (1L<<1)
-#define WM_FLAG_TAKEFOCUS              (1L<<2)
-#define WM_FLAG_CONTEXT_HELP           (1L<<3)
-#define WM_FLAG_URGENT                 (1L<<4)
+#define WM_FLAG_DELETE                  (1L<<0)
+#define WM_FLAG_INPUT                   (1L<<1)
+#define WM_FLAG_TAKEFOCUS               (1L<<2)
+#define WM_FLAG_CONTEXT_HELP            (1L<<3)
+#define WM_FLAG_URGENT                  (1L<<4)
 
-#define CLIENT_FLAG_INITIAL_VALUES     XFWM_FLAG_HAS_BORDER | \
-                                       XFWM_FLAG_HAS_MENU | \
-                                       XFWM_FLAG_HAS_MAXIMIZE | \
-                                       XFWM_FLAG_HAS_STICK | \
-                                       XFWM_FLAG_HAS_HIDE | \
-                                       XFWM_FLAG_HAS_CLOSE | \
-                                       XFWM_FLAG_HAS_MOVE | \
-                                       XFWM_FLAG_HAS_RESIZE | \
-                                       XFWM_FLAG_FIRST_MAP
+#define CLIENT_FLAG_INITIAL_VALUES      XFWM_FLAG_HAS_BORDER | \
+                                        XFWM_FLAG_HAS_MENU | \
+                                        XFWM_FLAG_HAS_MAXIMIZE | \
+                                        XFWM_FLAG_HAS_STICK | \
+                                        XFWM_FLAG_HAS_HIDE | \
+                                        XFWM_FLAG_HAS_CLOSE | \
+                                        XFWM_FLAG_HAS_MOVE | \
+                                        XFWM_FLAG_HAS_RESIZE | \
+                                        XFWM_FLAG_FIRST_MAP
 
-#define ALL_WORKSPACES                 (int) 0xFFFFFFFF
+#define ALL_WORKSPACES                  (int) 0xFFFFFFFF
 
-#define CONSTRAINED_WINDOW(c)          ((c->win_layer > WIN_LAYER_DESKTOP) && \
-                                        (c->win_layer < WIN_LAYER_ABOVE_DOCK) && \
-                                       !(c->type & (WINDOW_DESKTOP | WINDOW_DOCK)) && \
-                                       !FLAG_TEST(c->xfwm_flags, XFWM_FLAG_LEGACY_FULLSCREEN))
+#define CONSTRAINED_WINDOW(c)           ((c->win_layer > WIN_LAYER_DESKTOP) && \
+                                         (c->win_layer < WIN_LAYER_ABOVE_DOCK) && \
+                                        !(c->type & (WINDOW_DESKTOP | WINDOW_DOCK)) && \
+                                        !FLAG_TEST(c->xfwm_flags, XFWM_FLAG_LEGACY_FULLSCREEN))
 
-#define WINDOW_TYPE_DIALOG             (WINDOW_DIALOG | WINDOW_MODAL_DIALOG)
-#define WINDOW_TYPE_DONT_PLACE         (WINDOW_DESKTOP | WINDOW_DOCK | WINDOW_SPLASHSCREEN)
-#define WINDOW_REGULAR_FOCUSABLE       (WINDOW_NORMAL | WINDOW_UTILITY | WINDOW_DIALOG | WINDOW_MODAL_DIALOG)
-#define WINDOW_TYPE_DONT_FOCUS         (WINDOW_DOCK)
+#define WINDOW_TYPE_DIALOG              (WINDOW_DIALOG | WINDOW_MODAL_DIALOG)
+#define WINDOW_TYPE_DONT_PLACE          (WINDOW_DESKTOP | WINDOW_DOCK | WINDOW_SPLASHSCREEN)
+#define WINDOW_REGULAR_FOCUSABLE        (WINDOW_NORMAL | WINDOW_UTILITY | WINDOW_DIALOG | WINDOW_MODAL_DIALOG)       
+#define WINDOW_TYPE_DONT_FOCUS          (WINDOW_DOCK)
 
 
 
diff --git a/src/placement.c b/src/placement.c
index 76dcf3e86b429f4c549a9b7e09c5e93ac57c1b6c..40d4f14293b63e7454c54344e0771bc3c218da21 100644
--- a/src/placement.c
+++ b/src/placement.c
@@ -221,6 +221,7 @@ clientConstrainPos (Client * c, gboolean show_full)
     unsigned int ret = 0;
     GdkRectangle rect;
     gint monitor_nbr;
+    gint min_visible;
 
     g_return_val_if_fail (c != NULL, 0);
     TRACE ("entering clientConstrainPos %s",
@@ -235,6 +236,7 @@ clientConstrainPos (Client * c, gboolean show_full)
     frame_top = frameTop (c);
     frame_left = frameLeft (c);
     frame_visible = (frame_top ? frame_top : frame_height);
+    min_visible = MAX (frame_top, CLIENT_MIN_VISIBLE);
 
     cx = frame_x + (frame_width / 2);
     cy = frame_y + (frame_height / 2);
@@ -361,27 +363,27 @@ clientConstrainPos (Client * c, gboolean show_full)
     }
     else
     {
-        if (frame_x + frame_width < disp_x + CLIENT_MIN_VISIBLE)
+        if (frame_x + frame_width < disp_x + min_visible)
         {
-            c->x = disp_x + CLIENT_MIN_VISIBLE - frame_width + frame_left;
+            c->x = disp_x + min_visible - frame_width + frame_left;
             frame_x = frameX (c);
-             ret |= CLIENT_CONSTRAINED_LEFT;
+            ret |= CLIENT_CONSTRAINED_LEFT;
         }
-        if (frame_x + CLIENT_MIN_VISIBLE > disp_max_x)
+        if (frame_x + min_visible > disp_max_x)
         {
-            c->x = disp_max_x - CLIENT_MIN_VISIBLE + frame_left;
+            c->x = disp_max_x - min_visible + frame_left;
             frame_x = frameX (c);
-             ret |= CLIENT_CONSTRAINED_RIGHT;
+            ret |= CLIENT_CONSTRAINED_RIGHT;
         }
-        if (frame_y + frame_height < disp_y + CLIENT_MIN_VISIBLE)
+        if (frame_y + frame_height < disp_y + min_visible)
         {
-            c->y = disp_y + CLIENT_MIN_VISIBLE  - frame_height + frame_top;
+            c->y = disp_y + min_visible  - frame_height + frame_top;
             frame_y = frameY (c);
-             ret |= CLIENT_CONSTRAINED_TOP;
+            ret |= CLIENT_CONSTRAINED_TOP;
         }
-        if (frame_y + CLIENT_MIN_VISIBLE > disp_max_y)
+        if (frame_y + min_visible > disp_max_y)
         {
-            c->y = disp_max_y - CLIENT_MIN_VISIBLE + frame_top;
+            c->y = disp_max_y - min_visible + frame_top;
             frame_y = frameY (c);
             ret |= CLIENT_CONSTRAINED_BOTTOM;            
         }
@@ -402,9 +404,9 @@ clientConstrainPos (Client * c, gboolean show_full)
                 if (overlapY (frame_y, frame_y + frame_height,
                               c2->struts[RIGHT_START_Y], c2->struts[RIGHT_END_Y]))
                 {
-                    if (frame_x > screen_width - c2->struts[RIGHT] - CLIENT_MIN_VISIBLE)
+                    if (frame_x > screen_width - c2->struts[RIGHT] - min_visible)
                     {
-                        c->x = screen_width - c2->struts[RIGHT] - CLIENT_MIN_VISIBLE + frame_left;
+                        c->x = screen_width - c2->struts[RIGHT] - min_visible + frame_left;
                         frame_x = frameX (c);
                         ret |= CLIENT_CONSTRAINED_RIGHT;
                     }
@@ -414,9 +416,9 @@ clientConstrainPos (Client * c, gboolean show_full)
                 if (overlapY (frame_y, frame_y + frame_height,
                               c2->struts[LEFT_START_Y], c2->struts[LEFT_END_Y]))
                 {
-                    if (frame_x + frame_width < c2->struts[LEFT] + CLIENT_MIN_VISIBLE)
+                    if (frame_x + frame_width < c2->struts[LEFT] + min_visible)
                     {
-                        c->x = c2->struts[LEFT] + CLIENT_MIN_VISIBLE - frame_width + frame_left;
+                        c->x = c2->struts[LEFT] + min_visible - frame_width + frame_left;
                         frame_x = frameX (c);
                         ret |= CLIENT_CONSTRAINED_LEFT;
                     }
@@ -426,9 +428,9 @@ clientConstrainPos (Client * c, gboolean show_full)
                 if (overlapX (frame_x, frame_x + frame_width,
                               c2->struts[BOTTOM_START_X], c2->struts[BOTTOM_END_X]))
                 {
-                    if (frame_y > screen_height - c2->struts[BOTTOM] - CLIENT_MIN_VISIBLE)
+                    if (frame_y > screen_height - c2->struts[BOTTOM] - min_visible)
                     {
-                        c->y = screen_height - c2->struts[BOTTOM] - CLIENT_MIN_VISIBLE + frame_top;
+                        c->y = screen_height - c2->struts[BOTTOM] - min_visible + frame_top;
                         frame_y = frameY (c);
                         ret |= CLIENT_CONSTRAINED_BOTTOM;
                     }
@@ -444,9 +446,9 @@ clientConstrainPos (Client * c, gboolean show_full)
                         frame_y = frameY (c);
                         ret |= CLIENT_CONSTRAINED_TOP;
                     }
-                    if (frame_y + frame_height < c2->struts[TOP] + CLIENT_MIN_VISIBLE)
+                    if (frame_y + frame_height < c2->struts[TOP] + min_visible)
                     {
-                        c->y = c2->struts[TOP] + CLIENT_MIN_VISIBLE - frame_height + frame_top;
+                        c->y = c2->struts[TOP] + min_visible - frame_height + frame_top;
                         frame_y = frameY (c);
                         ret |= CLIENT_CONSTRAINED_TOP;
                     }