Index: src/bin/e_border.c
===================================================================
--- src/bin/e_border.c	(revision 78564)
+++ src/bin/e_border.c	(working copy)
@@ -1425,8 +1425,11 @@
 
    _e_border_move_internal(bd, x, y, 0);
 
-   if (_e_border_lost_window_internal_get(bd))
-     _e_border_reset_lost_window(bd);
+   if(e_config->screen_limits == E_SCREEN_LIMITS_PARTLY)
+     {
+        if (_e_border_lost_window_internal_get(bd))
+          _e_border_reset_lost_window(bd);
+     }
 }
 
 /**
@@ -4315,27 +4318,81 @@
    return list;
 }
 
+static void
+_e_border_zones_layout_calc(E_Zone *zone, int *zx, int *zy, int *zw, int *zh)
+{
+   int x, y, w, h;
+   E_Zone *zone_above, *zone_below, *zone_left, *zone_right;
+
+   if(!zone)
+     {
+        if(zx) *zx = 0;
+        if(zy) *zy = 0;
+        if(zw) *zw = 0;
+        if(zh) *zh = 0;
+     }
+
+   x = zone->x;
+   y = zone->y;
+   w = zone->w;
+   h = zone->h;
+
+   zone_left = e_container_zone_at_point_get(zone->container, (x - w + 5), y);
+   zone_right = e_container_zone_at_point_get(zone->container, (x + w + 5), y);
+   zone_above = e_container_zone_at_point_get(zone->container, x, (y - h + 5));
+   zone_below = e_container_zone_at_point_get(zone->container, x, (y + h + 5));
+
+   if((zone_left) && !(zone_right))
+     {
+        w += zone_left->x + zone_left->w; 
+        x -= zone_left->w;
+     }
+
+   if(zone_right)
+     {
+        if(x) x -= w;
+        w += zone_right->x;
+     }
+
+   if((zone_above) && !(zone_below))     
+     {
+        h += zone_above->y + zone_above->h;
+        y -= zone_above->h;
+     }
+     
+   if(zone_below)
+     {     
+        if(y) y -= h;
+        h += zone_below->y;
+     }
+
+   if(zx) *zx = x;
+   if(zy) *zy = y;
+   if(zw) *zw = w;
+   if(zh) *zh = h;
+}
+
 static Eina_Bool
 _e_border_lost_window_internal_get(E_Border *bd)
 {
    int loss_overlap = 5;
+   int zw, zh, zx, zy;
 
    if (bd->during_lost) return EINA_FALSE;
-   if (e_config->window_out_of_vscreen_limits) return EINA_FALSE;
    if (!(bd->zone))
      return EINA_FALSE;
 
-   if (!E_INTERSECTS(bd->zone->x + loss_overlap,
-                     bd->zone->y + loss_overlap,
-                     bd->zone->w - (2 * loss_overlap),
-                     bd->zone->h - (2 * loss_overlap),
+   _e_border_zones_layout_calc(bd->zone, &zx, &zy, &zw, &zh);
+   
+   if (!E_INTERSECTS(zx + loss_overlap,
+                     zy + loss_overlap,
+                     zw - (2 * loss_overlap),
+                     zh - (2 * loss_overlap),
                      bd->x, bd->y, bd->w, bd->h))
      {
         return EINA_TRUE;
      }
-   else if ((!E_CONTAINS(bd->zone->x, bd->zone->y,
-                         bd->zone->w, bd->zone->h,
-                         bd->x, bd->y, bd->w, bd->h)) &&
+   else if ((!E_CONTAINS(zx, zy, zw, zh, bd->x, bd->y, bd->w, bd->h)) &&
             (bd->shaped))
      {
         Ecore_X_Rectangle *rect;
@@ -5575,8 +5632,11 @@
    bd = e_border_find_by_client_window(e->win);
    if (!bd) return ECORE_CALLBACK_PASS_ON;
 
-   if (_e_border_lost_window_internal_get(bd))
-     _e_border_reset_lost_window(bd);
+   if(e_config->screen_limits == E_SCREEN_LIMITS_PARTLY)
+     {
+        if (_e_border_lost_window_internal_get(bd))
+          _e_border_reset_lost_window(bd);
+     }
 
    if (e->atom == ECORE_X_ATOM_WM_NAME)
      {
@@ -6666,13 +6726,16 @@
 _e_border_stay_within_container(E_Border *bd, int x, int y, int *new_x, int *new_y)
 {
    int new_x_max, new_y_max;
+   int zw, zh;
    Eina_Bool lw, lh;
 
-   new_x_max = bd->zone->w - bd->w;
-   new_y_max = bd->zone->h - bd->h;
-   lw = bd->w > bd->zone->w ? EINA_TRUE : EINA_FALSE;
-   lh = bd->h > bd->zone->h ? EINA_TRUE : EINA_FALSE;
+   _e_border_zones_layout_calc(bd->zone, NULL, NULL, &zw, &zh);
 
+   new_x_max = zw - bd->w;
+   new_y_max = zh - bd->h;
+   lw = bd->w > zw ? EINA_TRUE : EINA_FALSE;
+   lh = bd->h > zh ? EINA_TRUE : EINA_FALSE;
+   
    if (lw)
      {
         if (x <= new_x_max)
@@ -6748,7 +6811,7 @@
         new_x = x;
         new_y = y;
 
-        if (e_config->window_out_of_vscreen_limits_partly)
+        if (e_config->screen_limits == E_SCREEN_LIMITS_WITHIN)
           _e_border_stay_within_container(bd, x, y, &new_x, &new_y);
         else
           {
@@ -6759,6 +6822,8 @@
                                                 &new_x, &new_y, &new_w, &new_h);
              eina_list_free(skiplist);
           }
+
+   
         bd->shelf_fix.x = 0;
         bd->shelf_fix.y = 0;
         bd->shelf_fix.modified = 0;
Index: src/bin/e_border.h
===================================================================
--- src/bin/e_border.h	(revision 78564)
+++ src/bin/e_border.h	(working copy)
@@ -1,5 +1,12 @@
 #ifdef E_TYPEDEFS
 
+typedef enum _E_Screen_Limits
+{
+    E_SCREEN_LIMITS_PARTLY = 0,
+    E_SCREEN_LIMITS_COMPLETELY = 1,
+    E_SCREEN_LIMITS_WITHIN = 2
+} E_Screen_Limits;
+
 typedef enum _E_Icon_Preference
 {
    E_ICON_PREF_E_DEFAULT,
Index: src/bin/e_config.h
===================================================================
--- src/bin/e_config.h	(revision 78564)
+++ src/bin/e_config.h	(working copy)
@@ -253,8 +253,7 @@
    Eina_List                *mime_icons; // GUI
    int                       desk_auto_switch; // GUI;
    
-   int                       window_out_of_vscreen_limits;
-   int                       window_out_of_vscreen_limits_partly;
+   int                       screen_limits;
 
    int                       thumb_nice;
 
Index: src/bin/e_config.c
===================================================================
--- src/bin/e_config.c	(revision 78564)
+++ src/bin/e_config.c	(working copy)
@@ -839,8 +839,7 @@
 
    E_CONFIG_VAL(D, T, desk_auto_switch, INT);
 
-   E_CONFIG_VAL(D, T, window_out_of_vscreen_limits, INT);
-   E_CONFIG_VAL(D, T, window_out_of_vscreen_limits_partly, INT);
+   E_CONFIG_VAL(D, T, screen_limits,  INT);
 
    E_CONFIG_VAL(D, T, thumb_nice, INT);
 
@@ -1358,8 +1357,7 @@
      E_CONFIG_LIMIT(e_config->remember_internal_windows, 0, 3);
      E_CONFIG_LIMIT(e_config->desk_auto_switch, 0, 1);
 
-     E_CONFIG_LIMIT(e_config->window_out_of_vscreen_limits, 0, 1);
-     E_CONFIG_LIMIT(e_config->window_out_of_vscreen_limits_partly, 0, 1);
+     E_CONFIG_LIMIT(e_config->screen_limits, 0, 2);
 
      E_CONFIG_LIMIT(e_config->dpms_enable, 0, 1);
      E_CONFIG_LIMIT(e_config->dpms_standby_enable, 0, 1);
Index: src/modules/conf_window_manipulation/e_int_config_window_display.c
===================================================================
--- src/modules/conf_window_manipulation/e_int_config_window_display.c	(revision 78564)
+++ src/modules/conf_window_manipulation/e_int_config_window_display.c	(working copy)
@@ -21,8 +21,7 @@
    int        window_placement_policy;
    int        window_grouping;
    int        desk_auto_switch;
-   int        window_out_of_vscreen_limits;
-   int        window_out_of_vscreen_limits_partly;
+   int        screen_limits;
 
    Eina_List *shading_list;
 };
@@ -69,8 +68,7 @@
    cfdata->window_grouping = e_config->window_grouping;
    cfdata->desk_auto_switch = e_config->desk_auto_switch;
 
-   cfdata->window_out_of_vscreen_limits = e_config->window_out_of_vscreen_limits;
-   cfdata->window_out_of_vscreen_limits_partly = e_config->window_out_of_vscreen_limits_partly;
+   cfdata->screen_limits = e_config->screen_limits;
 
    cfdata->border_shade_animate = e_config->border_shade_animate;
    cfdata->border_shade_transition = e_config->border_shade_transition;
@@ -101,9 +99,7 @@
    e_config->use_app_icon = cfdata->use_app_icon;
 
    e_config->desk_auto_switch = cfdata->desk_auto_switch;
-
-   e_config->window_out_of_vscreen_limits = cfdata->window_out_of_vscreen_limits;
-   e_config->window_out_of_vscreen_limits_partly = cfdata->window_out_of_vscreen_limits_partly;
+   e_config->screen_limits = cfdata->screen_limits;
    e_config_save_queue();
    return 1;
 }
@@ -122,8 +118,7 @@
           (e_config->border_shade_speed != cfdata->border_shade_speed) ||
           (e_config->use_app_icon != cfdata->use_app_icon) ||
           (e_config->desk_auto_switch != cfdata->desk_auto_switch) ||
-          (e_config->window_out_of_vscreen_limits != cfdata->window_out_of_vscreen_limits) ||
-          (e_config->window_out_of_vscreen_limits_partly != cfdata->window_out_of_vscreen_limits_partly);
+          (e_config->screen_limits != cfdata->screen_limits);
 }
 
 static Evas_Object *
@@ -261,14 +256,17 @@
    /* Screen Limits */
    ol = e_widget_list_add(evas, 0, 0);
 
-   oc = e_widget_check_add(evas, _("Allow windows out of visual screen limits"),
-                           &(cfdata->window_out_of_vscreen_limits));
-   e_widget_list_object_append(ol, oc, 1, 1, 0.5);
+   rg = e_widget_radio_group_new(&(cfdata->screen_limits));
 
-   oc = e_widget_check_add(evas, _("Keep windows within the visual screen limits"),
-                           &(cfdata->window_out_of_vscreen_limits_partly));
-   e_widget_list_object_append(ol, oc, 1, 1, 0.5);
+   ow = e_widget_radio_add(evas, _("Allow windows partly out of the visual screen limits"), E_SCREEN_LIMITS_PARTLY, rg);
+   e_widget_list_object_append(ol, ow, 1, 1, 0.5);
 
+   ow = e_widget_radio_add(evas, _("Allow windows completely out of visual screen limits"), E_SCREEN_LIMITS_COMPLETELY, rg);
+   e_widget_list_object_append(ol, ow, 1, 1, 0.5);
+
+   ow = e_widget_radio_add(evas, _("Keep windows within the visual screen limits"), E_SCREEN_LIMITS_WITHIN, rg);
+   e_widget_list_object_append(ol, ow, 1, 1, 0.5);
+
    e_widget_toolbook_page_append(otb, NULL, _("Screen Limits"), ol,
                                  0, 0, 1, 0, 0.5, 0.0);
 
Index: src/bin/e_int_menus.c
===================================================================
--- src/bin/e_int_menus.c	(revision 78564)
+++ src/bin/e_int_menus.c	(working copy)
@@ -1339,7 +1339,7 @@
    e_util_menu_item_theme_icon_set(mi, "preferences-system-windows");
    e_menu_item_callback_set(mi, _e_int_menus_clients_cleanup_cb, zone);
 
-   if ((dat) && (e_config->window_out_of_vscreen_limits))
+   if ((dat) && (e_config->screen_limits == E_SCREEN_LIMITS_COMPLETELY))
      {
         mi = e_menu_item_new(m);
         e_menu_item_separator_set(mi, 1);
