Index: app/display/gimpdisplayshell-scroll.c
===================================================================
--- app/display/gimpdisplayshell-scroll.c	(revision 25974)
+++ app/display/gimpdisplayshell-scroll.c	(working copy)
@@ -99,15 +99,18 @@
       sx = SCALEX (shell, gimp_image_get_width  (shell->display->image));
       sy = SCALEY (shell, gimp_image_get_height (shell->display->image));
 
-      shell->offset_x = CLAMP (shell->offset_x, 0,
-                               MAX (sx - shell->disp_width, 0));
+      shell->offset_x = CLAMP (shell->offset_x, -0.5 * shell->disp_width,
+                               MAX (MAX (sx, shell->disp_width) - 0.5 * shell->disp_width, 
+                                    -0.5 * shell->disp_width));
 
-      shell->offset_y = CLAMP (shell->offset_y, 0,
-                               MAX (sy - shell->disp_height, 0));
+      shell->offset_y = CLAMP (shell->offset_y, -0.5 * shell->disp_height,
+                               MAX (MAX (sy, shell->disp_height) - 0.5 * shell->disp_height, 
+                                    -0.5 * shell->disp_height));
     }
   else
     {
       shell->offset_x = 0;
       shell->offset_y = 0;
+
     }
 }
Index: app/display/gimpdisplayshell.c
===================================================================
--- app/display/gimpdisplayshell.c	(revision 25974)
+++ app/display/gimpdisplayshell.c	(working copy)
@@ -934,13 +934,13 @@
   /*  create the scrollbars  *************************************************/
 
   /*  the horizontal scrollbar  */
-  shell->hsbdata = GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, image_width,
+  shell->hsbdata = GTK_ADJUSTMENT (gtk_adjustment_new (0, -0.5 * shell->disp_width, image_width + 0.5 * shell->disp_width,
                                                        1, 1, image_width));
   shell->hsb = gtk_hscrollbar_new (shell->hsbdata);
   GTK_WIDGET_UNSET_FLAGS (shell->hsb, GTK_CAN_FOCUS);
 
   /*  the vertical scrollbar  */
-  shell->vsbdata = GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, image_height,
+  shell->vsbdata = GTK_ADJUSTMENT (gtk_adjustment_new (0, -0.5 * shell->disp_height, image_height + 0.5 * shell->disp_height,
                                                        1, 1, image_height));
   shell->vsb = gtk_vscrollbar_new (shell->vsbdata);
   GTK_WIDGET_UNSET_FLAGS (shell->vsb, GTK_CAN_FOCUS);
Index: app/display/gimpdisplayshell-scale.c
===================================================================
--- app/display/gimpdisplayshell-scale.c	(revision 25974)
+++ app/display/gimpdisplayshell-scale.c	(working copy)
@@ -121,14 +121,16 @@
     }
 
   shell->hsbdata->value          = shell->offset_x;
-  shell->hsbdata->upper          = sx;
-  shell->hsbdata->page_size      = MIN (sx, shell->disp_width);
+  shell->hsbdata->lower          = - 0.5 * shell->disp_width;
+  shell->hsbdata->upper          = MAX (sx, shell->disp_width)  + shell->disp_width * 2;
+  shell->hsbdata->page_size      = MIN (sx, shell->disp_width * 2);
   shell->hsbdata->page_increment = shell->disp_width / 2;
   shell->hsbdata->step_increment = shell->scale_x;
 
   shell->vsbdata->value          = shell->offset_y;
-  shell->vsbdata->upper          = sy;
-  shell->vsbdata->page_size      = MIN (sy, shell->disp_height);
+  shell->vsbdata->lower          = - 0.5 * shell->disp_height;
+  shell->vsbdata->upper          = MAX (sy,  shell->disp_height) + shell->disp_height * 2;
+  shell->vsbdata->page_size      = MIN (sy, shell->disp_height * 2);
   shell->vsbdata->page_increment = shell->disp_height / 2;
   shell->vsbdata->step_increment = shell->scale_y;
 
