diff --git a/defaults/defaults b/defaults/defaults
index cf0dc175b3ba913b560b475c45f7360ba4f70d12..0233e82a64f6b6f4917ce29e2566dfc4d163111f 100644
--- a/defaults/defaults
+++ b/defaults/defaults
@@ -20,6 +20,10 @@ raise_on_focus=false
 snap_to_border=true
 snap_to_windows=false
 snap_width=10
+shadow_delta_x=0
+shadow_delta_y=0
+shadow_delta_width=0
+shadow_delta_height=0
 title_alignment=left
 title_horizontal_offset=0
 title_shadow_active=false
diff --git a/src/compositor.c b/src/compositor.c
index b5aab1af2f157ba623a184a740cb861fa7f115d1..3b667da06ede2e1720c7ac648dde073f33016943 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -323,18 +323,29 @@ make_shadow (ScreenInfo *screen_info, gdouble opacity, gint width, gint height)
     XImage *ximage;
     guchar *data;
     guchar d;
-    gint gsize = screen_info->gaussianMap->size;
+    gint gsize;
     gint ylimit, xlimit;
-    gint swidth = width + gsize;
-    gint sheight = height + gsize;
-    gint center = gsize / 2;
+    gint swidth;
+    gint sheight;
+    gint center;
     gint x, y;
     gint x_diff;
-    gint opacity_gint = (gint) (opacity * 25);
+    gint opacity_gint;
     
     g_return_val_if_fail (screen_info != NULL, NULL);
     TRACE ("entering make_shadow");
     
+    gsize = screen_info->gaussianMap->size;
+    swidth = width + gsize - screen_info->params->shadow_delta_width - screen_info->params->shadow_delta_x;
+    sheight = height + gsize - screen_info->params->shadow_delta_height - screen_info->params->shadow_delta_y;
+    center = gsize / 2;
+    opacity_gint = (gint) (opacity * 25);
+    
+    if ((swidth < 1) || (sheight < 1))
+    {
+        return NULL;
+    }
+    
     data = g_malloc (swidth * sheight * sizeof (guchar));
     
     ximage = XCreateImage (myScreenGetXDisplay (screen_info),
@@ -466,7 +477,11 @@ shadow_picture (ScreenInfo *screen_info, gdouble opacity,
     g_return_val_if_fail (render_format != NULL, None);
 
     shadowImage = make_shadow (screen_info, opacity, width, height);
-    g_return_val_if_fail (shadowImage != None, None);
+    if (shadowImage == NULL)
+    {
+        *wp = *hp = 0;
+	return (None);
+    }
 
     shadowPixmap = XCreatePixmap (myScreenGetXDisplay (screen_info), screen_info->xroot, 
                                 shadowImage->width, shadowImage->height, 8);
@@ -726,8 +741,8 @@ win_extents (CWindow *cw)
             XRectangle sr;
     
             TRACE ("window 0x%lx (%s) has extents", cw->id, c->name);    
-            cw->shadow_dx = SHADOW_OFFSET_X;
-            cw->shadow_dy = SHADOW_OFFSET_Y;
+            cw->shadow_dx = SHADOW_OFFSET_X + screen_info->params->shadow_delta_x;
+            cw->shadow_dy = SHADOW_OFFSET_Y + screen_info->params->shadow_delta_y;
             if (!cw->shadow)
             {
                 double opacity = SHADOW_OPACITY;
diff --git a/src/settings.c b/src/settings.c
index e26ea7153c6a51042b4453ce0066b497e262d0ba..8a14ce06bac838b6e2b6f642a5c8a2323dd0c9a8 100644
--- a/src/settings.c
+++ b/src/settings.c
@@ -560,6 +560,15 @@ loadTheme (ScreenInfo *screen_info, Settings rc[])
     theme = getThemeDir (getValue ("theme", rc), THEMERC);
     parseRc (THEMERC, theme, rc);
 
+    screen_info->params->shadow_delta_x = 
+        abs (TOINT (getValue ("shadow_delta_x", rc)));
+    screen_info->params->shadow_delta_y = 
+        abs (TOINT (getValue ("shadow_delta_y", rc)));
+    screen_info->params->shadow_delta_width = 
+        abs (TOINT (getValue ("shadow_delta_width", rc)));
+    screen_info->params->shadow_delta_height = 
+        abs (TOINT (getValue ("shadow_delta_height", rc)));
+
     for (i = 0; i < 20; i++)
     {
         colsym[i].name = rc[i].option;
@@ -1013,6 +1022,10 @@ loadSettings (ScreenInfo *screen_info)
         {"snap_to_border", NULL, TRUE},
         {"snap_to_windows", NULL, TRUE},
         {"snap_width", NULL, TRUE},
+        {"shadow_delta_x", NULL, TRUE},
+        {"shadow_delta_y", NULL, TRUE},
+        {"shadow_delta_width", NULL, TRUE},
+        {"shadow_delta_height", NULL, TRUE},
         {"theme", NULL, TRUE},
         {"title_alignment", NULL, TRUE},
         {"title_font", NULL, FALSE},
@@ -1143,7 +1156,6 @@ loadSettings (ScreenInfo *screen_info)
         !g_ascii_strcasecmp ("true", getValue ("snap_to_windows", rc));
     screen_info->params->snap_width = abs (TOINT (getValue ("snap_width", rc)));
 
-
     set_settings_margin (screen_info, LEFT,   TOINT (getValue ("margin_left", rc)));
     set_settings_margin (screen_info, RIGHT,  TOINT (getValue ("margin_right", rc)));
     set_settings_margin (screen_info, BOTTOM, TOINT (getValue ("margin_bottom", rc)));
diff --git a/src/settings.h b/src/settings.h
index 6edcde514a5ad963015b4ee81e208050e2aa584d..bb2926e4e8a30ff3f72e09216e6e8fb2ecb7aa2b 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -153,6 +153,10 @@ struct _XfwmParams
     int double_click_action;
     int raise_delay;
     int snap_width;
+    int shadow_delta_x;
+    int shadow_delta_y;
+    int shadow_delta_width;
+    int shadow_delta_height;
     int title_alignment;
     int title_horizontal_offset;
     int wrap_resistance;