diff --git a/ChangeLog b/ChangeLog
index 9abff54d49..31bdd30904 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,92 @@
+2002-05-08  Michael Natterer  <mitch@gimp.org>
+
+	Started to get rid of the gdisplays_foo() functions in
+	app/display/gimpdisplay-foreach.[ch]. Work in progress...
+
+	* app/core/gimp.[ch]: added the display list to the Gimp object
+	(as a GimpList of GimpObjects). This way we get more independent
+	from whether there is GUI or not, as gimp->displays will simply
+	be an empty list for the --no-interface case.
+
+	* app/display/gimpdisplay.[ch]: Removed the global "display_list"
+	and "display_num" variables. Use gimp->displays instead.
+
+	* app/display/gimpdisplay-foreach.[ch]: renamed most functions
+	from gdisplays_foo() to gimp_displays_foo() and pass them a Gimp
+	pointer. 
+
+	* app/core/gimpimage.[ch]: added a "flush" signal.
+
+	* app/display/gimpdisplay-handlers.c: connect to "flush" and call
+	gimp_display_flush() in the callback.
+
+	* tools/pdbgen/pdb/display.pdb: use gimp_displays_flush(gimp)
+	here and only here.
+
+	* app/pdb/display_cmds.c: regenerated.
+
+	* app/app_procs.c
+	* app/gui/gui.c
+	* app/gui/preferences-dialog.c:
+	s/gdislays_foo()/gimp_displays_foo(gimp)/
+
+	* app/image_map.c
+	* app/undo_history.c
+	* app/display/gimpdisplayshell-callbacks.c
+	* app/display/gimpdisplayshell-dnd.c
+	* app/display/gimpdisplayshell-layer-select.c
+	* app/display/gimpdisplayshell-scale.c
+	* app/gui/channels-commands.c
+	* app/gui/colormap-editor-commands.c
+	* app/gui/convert-dialog.c
+	* app/gui/drawable-commands.c
+	* app/gui/edit-commands.c
+	* app/gui/file-commands.c
+	* app/gui/image-commands.c
+	* app/gui/layers-commands.c
+	* app/gui/offset-dialog.c
+	* app/gui/qmask-commands.c
+	* app/gui/select-commands.c
+	* app/gui/vectors-commands.c
+	* app/paint/gimpairbrush.c
+	* app/tools/gimpbezierselecttool.c
+	* app/tools/gimpblendtool.c
+	* app/tools/gimpbrightnesscontrasttool.c
+	* app/tools/gimpbucketfilltool.c
+	* app/tools/gimpbycolorselecttool.c
+	* app/tools/gimpcolorbalancetool.c
+	* app/tools/gimpcurvestool.c
+	* app/tools/gimpeditselectiontool.c
+	* app/tools/gimpfreeselecttool.c
+	* app/tools/gimpfuzzyselecttool.c
+	* app/tools/gimphuesaturationtool.c
+	* app/tools/gimpinktool.c
+	* app/tools/gimpiscissorstool.c
+	* app/tools/gimplevelstool.c
+	* app/tools/gimpmeasuretool.c
+	* app/tools/gimpmovetool.c
+	* app/tools/gimppainttool.c
+	* app/tools/gimpposterizetool.c
+	* app/tools/gimprectselecttool.c
+	* app/tools/gimptexttool.c
+	* app/tools/gimpthresholdtool.c
+	* app/tools/gimptransformtool.c
+	* app/tools/gimpvectortool.c
+	* app/widgets/gimpbufferview.c
+	* app/widgets/gimpchannellistview.c
+	* app/widgets/gimpcomponentlistitem.c
+	* app/widgets/gimpdocumentview.c
+	* app/widgets/gimpdrawablelistitem.c
+	* app/widgets/gimpdrawablelistview.c
+	* app/widgets/gimpimageview.c
+	* app/widgets/gimpitemlistitem.c
+	* app/widgets/gimpitemlistview.c
+	* app/widgets/gimplayerlistitem.c
+	* app/widgets/gimplayerlistview.c
+	* app/widgets/gimpvectorslistview.c: replaced gdisplays_flush()
+	with calls to gimp_image_flush(gimage). Removed inclusion of
+	"display/gimpdisplay-foreach.h" from most files.
+
 2002-05-08  Sven Neumann  <sven@gimp.org>
 
 	* plug-ins/print/gimp_color_window.c
diff --git a/app/actions/channels-commands.c b/app/actions/channels-commands.c
index 39ccbb6fd4..53d98cec9d 100644
--- a/app/actions/channels-commands.c
+++ b/app/actions/channels-commands.c
@@ -35,8 +35,6 @@
 #include "core/gimpimage-mask-select.h"
 #include "core/gimplist.h"
 
-#include "display/gimpdisplay-foreach.h"
-
 #include "widgets/gimpcolorpanel.h"
 #include "widgets/gimpitemfactory.h"
 #include "widgets/gimpwidgets-utils.h"
@@ -91,7 +89,7 @@ channels_raise_channel_cmd_callback (GtkWidget *widget,
   return_if_no_channel (gimage, active_channel);
 
   gimp_image_raise_channel (gimage, active_channel);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -103,7 +101,7 @@ channels_lower_channel_cmd_callback (GtkWidget *widget,
   return_if_no_channel (gimage, active_channel);
 
   gimp_image_lower_channel (gimage, active_channel);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -119,7 +117,7 @@ channels_duplicate_channel_cmd_callback (GtkWidget *widget,
                                    G_TYPE_FROM_INSTANCE (active_channel),
                                    TRUE);
   gimp_image_add_channel (gimage, new_channel, -1);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -131,7 +129,7 @@ channels_delete_channel_cmd_callback (GtkWidget *widget,
   return_if_no_channel (gimage, active_channel);
 
   gimp_image_remove_channel (gimage, active_channel);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 static void
@@ -148,7 +146,7 @@ channels_channel_to_sel (GtkWidget      *widget,
                                   0, 0,
                                   op,
                                   FALSE, 0, 0);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -237,7 +235,7 @@ new_channel_query_ok_callback (GtkWidget *widget,
 				  GIMP_TRANSPARENT_FILL);
 
       gimp_image_add_channel (gimage, new_channel, -1);
-      gdisplays_flush ();
+      gimp_image_flush (gimage);
     }
 
   gtk_widget_destroy (options->query_box);
@@ -281,7 +279,7 @@ channels_new_channel_query (GimpImage   *gimage,
 
       undo_push_group_end (gimage);
 
-      gdisplays_flush ();
+      gimp_image_flush (gimage);
       return;
     }
 
@@ -413,7 +411,7 @@ edit_channel_query_ok_callback (GtkWidget *widget,
 	{
 	  gimp_channel_set_color (channel, &color);
 
-	  gdisplays_flush ();
+          gimp_image_flush (options->gimage);
 	}
     }
 
diff --git a/app/actions/colormap-commands.c b/app/actions/colormap-commands.c
index e2cbf5da15..32592b1747 100644
--- a/app/actions/colormap-commands.c
+++ b/app/actions/colormap-commands.c
@@ -30,8 +30,6 @@
 #include "core/gimp.h"
 #include "core/gimpimage.h"
 
-#include "display/gimpdisplay-foreach.h"
-
 #include "widgets/gimpcolormapeditor.h"
 #include "widgets/gimpitemfactory.h"
 #include "widgets/gimpwidgets-utils.h"
@@ -171,7 +169,7 @@ colormap_editor_color_notebook_callback (ColorNotebook      *color_notebook,
 			  &gimage->cmap[editor->col_index * 3 + 2]);
 
       gimp_image_colormap_changed (gimage, editor->col_index);
-      gdisplays_flush ();
+      gimp_image_flush (gimage);
       /* Fall through */
     case COLOR_NOTEBOOK_CANCEL:
       color_notebook_hide (editor->color_notebook);
diff --git a/app/actions/colormap-editor-commands.c b/app/actions/colormap-editor-commands.c
index e2cbf5da15..32592b1747 100644
--- a/app/actions/colormap-editor-commands.c
+++ b/app/actions/colormap-editor-commands.c
@@ -30,8 +30,6 @@
 #include "core/gimp.h"
 #include "core/gimpimage.h"
 
-#include "display/gimpdisplay-foreach.h"
-
 #include "widgets/gimpcolormapeditor.h"
 #include "widgets/gimpitemfactory.h"
 #include "widgets/gimpwidgets-utils.h"
@@ -171,7 +169,7 @@ colormap_editor_color_notebook_callback (ColorNotebook      *color_notebook,
 			  &gimage->cmap[editor->col_index * 3 + 2]);
 
       gimp_image_colormap_changed (gimage, editor->col_index);
-      gdisplays_flush ();
+      gimp_image_flush (gimage);
       /* Fall through */
     case COLOR_NOTEBOOK_CANCEL:
       color_notebook_hide (editor->color_notebook);
diff --git a/app/actions/drawable-commands.c b/app/actions/drawable-commands.c
index 19ad9fc359..513bb8477f 100644
--- a/app/actions/drawable-commands.c
+++ b/app/actions/drawable-commands.c
@@ -34,8 +34,6 @@
 #include "core/gimpdrawable-invert.h"
 #include "core/gimpimage.h"
 
-#include "display/gimpdisplay-foreach.h"
-
 #include "widgets/gimpitemfactory.h"
 #include "widgets/gimpwidgets-utils.h"
 
@@ -76,7 +74,7 @@ drawable_desaturate_cmd_callback (GtkWidget *widget,
     }
 
   gimp_drawable_desaturate (active_drawable);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -94,7 +92,7 @@ drawable_invert_cmd_callback (GtkWidget *widget,
     }
 
   gimp_drawable_invert (active_drawable);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -112,7 +110,7 @@ drawable_equalize_cmd_callback (GtkWidget *widget,
     }
 
   gimp_drawable_equalize (active_drawable, TRUE);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
diff --git a/app/actions/edit-commands.c b/app/actions/edit-commands.c
index 4ccb77da09..7f37fe8e8a 100644
--- a/app/actions/edit-commands.c
+++ b/app/actions/edit-commands.c
@@ -36,7 +36,6 @@
 #include "core/gimpimage-mask.h"
 
 #include "display/gimpdisplay.h"
-#include "display/gimpdisplay-foreach.h"
 
 #include "tools/tool_manager.h"
 
@@ -81,9 +80,7 @@ edit_undo_cmd_callback (GtkWidget *widget,
   return_if_no_image (gimage, data);
 
   if (undo_pop (gimage))
-    {
-      gdisplays_flush ();
-    }
+    gimp_image_flush (gimage);
 }
 
 void
@@ -94,9 +91,7 @@ edit_redo_cmd_callback (GtkWidget *widget,
   return_if_no_image (gimage, data);
 
   if (undo_redo (gimage))
-    {
-      gdisplays_flush ();
-    }
+    gimp_image_flush (gimage);
 }
 
 void
@@ -112,7 +107,7 @@ edit_cut_cmd_callback (GtkWidget *widget,
   if (gimp_edit_cut (gdisp->gimage,
 		     gimp_image_active_drawable (gdisp->gimage)))
     {
-      gdisplays_flush ();
+      gimp_image_flush (gdisp->gimage);
     }
 }
 
@@ -125,7 +120,7 @@ edit_copy_cmd_callback (GtkWidget *widget,
 
   if (gimp_edit_copy (gimage, gimp_image_active_drawable (gimage)))
     {
-      gdisplays_flush ();
+      gimp_image_flush (gimage);
     }
 }
 
@@ -146,7 +141,7 @@ edit_paste_cmd_callback (GtkWidget *widget,
 			   gdisp->gimage->gimp->global_buffer,
 			   FALSE))
 	{
-	  gdisplays_flush ();
+          gimp_image_flush (gdisp->gimage);
 	}
     }
 }
@@ -168,7 +163,7 @@ edit_paste_into_cmd_callback (GtkWidget *widget,
 			   gdisp->gimage->gimp->global_buffer,
 			   TRUE))
 	{
-	  gdisplays_flush ();
+          gimp_image_flush (gdisp->gimage);
 	}
     }
 }
@@ -245,7 +240,7 @@ edit_clear_cmd_callback (GtkWidget *widget,
   return_if_no_image (gimage, data);
 
   gimp_edit_clear (gimage, gimp_image_active_drawable (gimage));
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -262,8 +257,7 @@ edit_fill_cmd_callback (GtkWidget *widget,
   gimp_edit_fill (gimage,
 		  gimp_image_active_drawable (gimage),
 		  fill_type);
-
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -276,8 +270,7 @@ edit_stroke_cmd_callback (GtkWidget *widget,
   gimp_image_mask_stroke (gimage,
                           gimp_image_active_drawable (gimage),
                           gimp_get_current_context (gimage->gimp));
-
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 
@@ -309,7 +302,7 @@ cut_named_buffer_callback (GtkWidget *widget,
                           GIMP_OBJECT (new_buffer));
     }
 
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 static void
diff --git a/app/actions/file-commands.c b/app/actions/file-commands.c
index 0ebcba56ca..a079b4b3cd 100644
--- a/app/actions/file-commands.c
+++ b/app/actions/file-commands.c
@@ -310,7 +310,7 @@ file_revert_confirm_callback (GtkWidget *widget,
 
 	  gimp_image_clean_all (new_gimage);
 
-          gdisplays_flush ();
+          gimp_image_flush (new_gimage);
 	}
       else if (status != GIMP_PDB_CANCEL)
 	{
diff --git a/app/actions/image-commands.c b/app/actions/image-commands.c
index a762079ec9..99568a0c86 100644
--- a/app/actions/image-commands.c
+++ b/app/actions/image-commands.c
@@ -35,7 +35,6 @@
 #include "core/gimpimage-scale.h"
 
 #include "display/gimpdisplay.h"
-#include "display/gimpdisplay-foreach.h"
 #include "display/gimpprogress.h"
 
 #include "convert-dialog.h"
@@ -234,7 +233,7 @@ image_flatten_image_cmd_callback (GtkWidget *widget,
   return_if_no_image (gimage, data);
 
   gimp_image_flatten (gimage);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 /****************************/
 /*  The layer merge dialog  */
@@ -264,7 +263,7 @@ image_layers_merge_query_ok_callback (GtkWidget *widget,
   if (options->merge_visible)
     gimp_image_merge_visible_layers (gimage, options->merge_type);
 
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 
   gtk_widget_destroy (options->query_box);
 }
@@ -358,7 +357,7 @@ image_resize_callback (GtkWidget *widget,
 			 image_resize->resize->height,
 			 image_resize->resize->offset_x,
 			 image_resize->resize->offset_y);
-      gdisplays_flush ();
+      gimp_image_flush (image_resize->gimage);
     }
   else 
     {
@@ -506,6 +505,6 @@ image_scale_implement (ImageResize *image_scale)
   if (display_flush)
     {
       undo_push_group_end (gimage);
-      gdisplays_flush ();
+      gimp_image_flush (gimage);
     }
 }
diff --git a/app/actions/layers-commands.c b/app/actions/layers-commands.c
index 08b719b323..80dad0b1f9 100644
--- a/app/actions/layers-commands.c
+++ b/app/actions/layers-commands.c
@@ -40,8 +40,6 @@
 
 #include "pdb/procedural_db.h"
 
-#include "display/gimpdisplay-foreach.h"
-
 #include "widgets/gimpitemfactory.h"
 #include "widgets/gimpwidgets-utils.h"
 
@@ -98,7 +96,7 @@ layers_previous_cmd_callback (GtkWidget *widget,
       if (new_layer)
 	{
 	  gimp_image_set_active_layer (gimage, new_layer);
-	  gdisplays_flush ();
+	  gimp_image_flush (gimage);
 	}
     }
 }
@@ -122,7 +120,7 @@ layers_next_cmd_callback (GtkWidget *widget,
   if (new_layer)
     {
       gimp_image_set_active_layer (gimage, new_layer);
-      gdisplays_flush ();
+      gimp_image_flush (gimage);
     }
 }
 
@@ -135,7 +133,7 @@ layers_raise_cmd_callback (GtkWidget *widget,
   return_if_no_layer (gimage,active_layer);
 
   gimp_image_raise_layer (gimage, active_layer);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -147,7 +145,7 @@ layers_lower_cmd_callback (GtkWidget *widget,
   return_if_no_layer (gimage,active_layer);
 
   gimp_image_lower_layer (gimage, active_layer);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -159,7 +157,7 @@ layers_raise_to_top_cmd_callback (GtkWidget *widget,
   return_if_no_layer (gimage,active_layer);
 
   gimp_image_raise_layer_to_top (gimage, active_layer);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -171,7 +169,7 @@ layers_lower_to_bottom_cmd_callback (GtkWidget *widget,
   return_if_no_layer (gimage, active_layer);
 
   gimp_image_lower_layer_to_bottom (gimage, active_layer);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -198,7 +196,7 @@ layers_duplicate_cmd_callback (GtkWidget *widget,
                                TRUE);
   gimp_image_add_layer (gimage, new_layer, -1);
 
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -221,7 +219,7 @@ layers_merge_down_cmd_callback (GtkWidget *widget,
   return_if_no_layer (gimage, active_layer);
 
   gimp_image_merge_down (gimage, active_layer, GIMP_EXPAND_AS_NECESSARY);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -237,7 +235,7 @@ layers_delete_cmd_callback (GtkWidget *widget,
   else
     gimp_image_remove_layer (gimage, active_layer);
 
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -260,7 +258,7 @@ layers_resize_to_image_cmd_callback (GtkWidget *widget,
   return_if_no_layer (gimage, active_layer);
   
   gimp_layer_resize_to_image (active_layer);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -307,7 +305,7 @@ layers_crop_cmd_callback (GtkWidget *widget,
 
   undo_push_group_end (gimage);
 
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -338,7 +336,7 @@ layers_apply_layer_mask_cmd_callback (GtkWidget *widget,
       gimp_layer_apply_mask (active_layer, GIMP_MASK_APPLY, TRUE);
 
       if (flush)
-	gdisplays_flush ();
+        gimp_image_flush (gimage);
     }
 }
 
@@ -359,7 +357,7 @@ layers_delete_layer_mask_cmd_callback (GtkWidget *widget,
       gimp_layer_apply_mask (active_layer, GIMP_MASK_DISCARD, TRUE);
 
       if (flush)
-	gdisplays_flush ();
+        gimp_image_flush (gimage);
     }
 }
 
@@ -374,7 +372,7 @@ layers_mask_select_cmd_callback (GtkWidget *widget,
   if (gimp_layer_get_mask (active_layer))
     {
       gimp_image_mask_layer_mask (gimage, active_layer);
-      gdisplays_flush ();
+      gimp_image_flush (gimage);
     }
 }
 
@@ -387,7 +385,7 @@ layers_alpha_select_cmd_callback (GtkWidget *widget,
   return_if_no_layer (gimage, active_layer);
 
   gimp_image_mask_layer_alpha (gimage, active_layer);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -401,7 +399,7 @@ layers_add_alpha_channel_cmd_callback (GtkWidget *widget,
   if (! gimp_drawable_has_alpha (GIMP_DRAWABLE (active_layer)))
     {
       gimp_layer_add_alpha (active_layer);
-      gdisplays_flush ();
+      gimp_image_flush (gimage);
     }
 }
 
@@ -437,7 +435,7 @@ layers_anchor_layer (GimpLayer *layer)
   if (gimp_layer_is_floating_sel (layer))
     {
       floating_sel_anchor (layer);
-      gdisplays_flush ();
+      gimp_image_flush (gimp_item_get_image (GIMP_ITEM (layer)));
     }
 }
 
@@ -500,7 +498,7 @@ new_layer_query_ok_callback (GtkWidget *widget,
 				      fill_type);
 	  gimp_image_add_layer (gimage, layer, -1);
 	  
-	  gdisplays_flush ();
+          gimp_image_flush (gimage);
 	} 
       else 
 	{
@@ -534,8 +532,7 @@ layers_new_layer_query (GimpImage *gimage,
   if ((floating_sel = gimp_image_floating_sel (gimage)))
     {
       floating_sel_to_layer (floating_sel);
-
-      gdisplays_flush ();
+      gimp_image_flush (gimage);
       return;
     }
 
@@ -567,7 +564,7 @@ layers_new_layer_query (GimpImage *gimage,
 
       undo_push_group_end (gimage);
 
-      gdisplays_flush ();
+      gimp_image_flush (gimage);
       return;
     }
 
@@ -749,7 +746,7 @@ edit_layer_query_ok_callback (GtkWidget *widget,
         }
     }
 
-  gdisplays_flush ();
+  gimp_image_flush (options->gimage);
 
   gtk_widget_destroy (options->query_box); 
 }
@@ -852,7 +849,7 @@ add_mask_query_ok_callback (GtkWidget *widget,
     {
       mask = gimp_layer_create_mask (layer, options->add_mask_type);
       gimp_layer_add_mask (layer, mask, TRUE);
-      gdisplays_flush ();
+      gimp_image_flush (gimage);
     }
 
   gtk_widget_destroy (options->query_box);
@@ -1007,7 +1004,7 @@ scale_layer_query_ok_callback (GtkWidget *widget,
 
 	  undo_push_group_end (gimage);
 
-	  gdisplays_flush ();
+          gimp_image_flush (gimage);
 	}
 
       gtk_widget_destroy (options->resize->resize_shell);
@@ -1099,7 +1096,7 @@ resize_layer_query_ok_callback (GtkWidget *widget,
 
 	  undo_push_group_end (gimage);
 
-	  gdisplays_flush ();
+          gimp_image_flush (gimage);
 	}
 
       gtk_widget_destroy (options->resize->resize_shell);
diff --git a/app/actions/qmask-commands.c b/app/actions/qmask-commands.c
index ea0bf2541d..ec75b35532 100644
--- a/app/actions/qmask-commands.c
+++ b/app/actions/qmask-commands.c
@@ -34,7 +34,6 @@
 #include "widgets/gimpwidgets-utils.h"
 
 #include "display/gimpdisplay.h"
-#include "display/gimpdisplay-foreach.h"
 #include "display/gimpdisplayshell.h"
 
 #include "qmask-commands.h"
@@ -84,7 +83,7 @@ qmask_toggle_cmd_callback (GtkWidget *widget,
   gimp_image_set_qmask_state (shell->gdisp->gimage,
                               GTK_CHECK_MENU_ITEM (widget)->active);
 
-  gdisplays_flush ();
+  gimp_image_flush (shell->gdisp->gimage);
 }
 
 void
@@ -104,7 +103,7 @@ qmask_invert_cmd_callback (GtkWidget *widget,
       gimp_image_qmask_invert (shell->gdisp->gimage);
 
       if (shell->gdisp->gimage->qmask_state)
-        gdisplays_flush ();
+        gimp_image_flush (shell->gdisp->gimage);
     }
 }
 
@@ -255,7 +254,7 @@ qmask_query_ok_callback (GtkWidget *widget,
 	{
 	  gimp_channel_set_color (channel, &color);
 
-	  gdisplays_flush ();
+	  gimp_image_flush (options->gimage);
 	}
     }
 
diff --git a/app/actions/quick-mask-commands.c b/app/actions/quick-mask-commands.c
index ea0bf2541d..ec75b35532 100644
--- a/app/actions/quick-mask-commands.c
+++ b/app/actions/quick-mask-commands.c
@@ -34,7 +34,6 @@
 #include "widgets/gimpwidgets-utils.h"
 
 #include "display/gimpdisplay.h"
-#include "display/gimpdisplay-foreach.h"
 #include "display/gimpdisplayshell.h"
 
 #include "qmask-commands.h"
@@ -84,7 +83,7 @@ qmask_toggle_cmd_callback (GtkWidget *widget,
   gimp_image_set_qmask_state (shell->gdisp->gimage,
                               GTK_CHECK_MENU_ITEM (widget)->active);
 
-  gdisplays_flush ();
+  gimp_image_flush (shell->gdisp->gimage);
 }
 
 void
@@ -104,7 +103,7 @@ qmask_invert_cmd_callback (GtkWidget *widget,
       gimp_image_qmask_invert (shell->gdisp->gimage);
 
       if (shell->gdisp->gimage->qmask_state)
-        gdisplays_flush ();
+        gimp_image_flush (shell->gdisp->gimage);
     }
 }
 
@@ -255,7 +254,7 @@ qmask_query_ok_callback (GtkWidget *widget,
 	{
 	  gimp_channel_set_color (channel, &color);
 
-	  gdisplays_flush ();
+	  gimp_image_flush (options->gimage);
 	}
     }
 
diff --git a/app/actions/select-commands.c b/app/actions/select-commands.c
index 6c1b0ff9d3..3f2b5ac70f 100644
--- a/app/actions/select-commands.c
+++ b/app/actions/select-commands.c
@@ -31,7 +31,6 @@
 #include "core/gimpimage-mask.h"
 
 #include "display/gimpdisplay.h"
-#include "display/gimpdisplay-foreach.h"
 
 #include "libgimp/gimpintl.h"
 
@@ -84,7 +83,7 @@ select_invert_cmd_callback (GtkWidget *widget,
   return_if_no_image (gimage, data);
 
   gimp_image_mask_invert (gimage);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -95,7 +94,7 @@ select_all_cmd_callback (GtkWidget *widget,
   return_if_no_image (gimage, data);
 
   gimp_image_mask_all (gimage);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -106,7 +105,7 @@ select_none_cmd_callback (GtkWidget *widget,
   return_if_no_image (gimage, data);
 
   gimp_image_mask_none (gimage);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -117,7 +116,7 @@ select_float_cmd_callback (GtkWidget *widget,
   return_if_no_image (gimage, data);
 
   gimp_image_mask_float (gimage, gimp_image_active_drawable (gimage), 0, 0);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -150,7 +149,7 @@ select_sharpen_cmd_callback (GtkWidget *widget,
   return_if_no_image (gimage, data);
 
   gimp_image_mask_sharpen (gimage);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -240,7 +239,7 @@ select_save_cmd_callback (GtkWidget *widget,
   return_if_no_image (gimage, data);
 
   gimp_image_mask_save (gimage);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 
@@ -276,7 +275,7 @@ gimp_image_mask_feather_callback (GtkWidget *widget,
     }
 
   gimp_image_mask_feather (gimage, radius_x, radius_y);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 static void
@@ -309,7 +308,7 @@ gimp_image_mask_border_callback (GtkWidget *widget,
     }
 
   gimp_image_mask_border (gimage, radius_x, radius_y);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 static void
@@ -342,7 +341,7 @@ gimp_image_mask_grow_callback (GtkWidget *widget,
     }
 
   gimp_image_mask_grow (gimage, radius_x, radius_y);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 static void
@@ -380,5 +379,5 @@ gimp_image_mask_shrink_callback (GtkWidget *widget,
 
   gimp_image_mask_shrink (gimage, radius_x, radius_y,
                           selection_shrink_edge_lock);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
diff --git a/app/actions/vectors-commands.c b/app/actions/vectors-commands.c
index ac2abbc3b9..93b613a5db 100644
--- a/app/actions/vectors-commands.c
+++ b/app/actions/vectors-commands.c
@@ -41,8 +41,6 @@
 
 #include "vectors/gimpvectors.h"
 
-#include "display/gimpdisplay-foreach.h"
-
 #include "widgets/gimpitemfactory.h"
 #include "widgets/gimpwidgets-utils.h"
 
@@ -92,7 +90,7 @@ vectors_raise_vectors_cmd_callback (GtkWidget *widget,
   return_if_no_vectors (gimage, active_vectors);
 
   gimp_image_raise_vectors (gimage, active_vectors);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -104,7 +102,7 @@ vectors_lower_vectors_cmd_callback (GtkWidget *widget,
   return_if_no_vectors (gimage, active_vectors);
 
   gimp_image_lower_vectors (gimage, active_vectors);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -122,7 +120,7 @@ vectors_duplicate_vectors_cmd_callback (GtkWidget *widget,
                                    G_TYPE_FROM_INSTANCE (active_vectors),
                                    TRUE);
   gimp_image_add_vectors (gimage, new_vectors, -1);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 #endif
 }
 
@@ -135,7 +133,7 @@ vectors_delete_vectors_cmd_callback (GtkWidget *widget,
   return_if_no_vectors (gimage, active_vectors);
 
   gimp_image_remove_vectors (gimage, active_vectors);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 static void
@@ -152,7 +150,7 @@ vectors_vectors_to_sel (GtkWidget      *widget,
                                   op,
                                   TRUE,
                                   FALSE, 0, 0);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -324,7 +322,7 @@ vectors_stroke_vectors (GimpVectors *vectors)
 
       g_object_unref (G_OBJECT (core));
 
-      gdisplays_flush ();
+      gimp_image_flush (gimage);
     }
 }
 
@@ -396,7 +394,7 @@ new_vectors_query_ok_callback (GtkWidget *widget,
 
       gimp_object_set_name (GIMP_OBJECT (new_vectors), vectors_name);
 
-      gdisplays_flush ();
+      gimp_image_flush (gimage);
     }
 
   gtk_widget_destroy (options->query_box);
@@ -427,13 +425,13 @@ vectors_new_vectors_query (GimpImage   *gimage,
 
       /* undo_push_group_end (gimage); */
 
-      gdisplays_flush ();
+      gimp_image_flush (gimage);
       return;
     }
 
   /*  the new options structure  */
   options = g_new (NewVectorsOptions, 1);
-  options->gimage      = gimage;
+  options->gimage = gimage;
   
   /*  The dialog  */
   options->query_box =
diff --git a/app/app_procs.c b/app/app_procs.c
index 099ae3357f..86eba1888e 100644
--- a/app/app_procs.c
+++ b/app/app_procs.c
@@ -219,7 +219,7 @@ void
 app_exit (gboolean kill_it)
 {
   /*  If it's the user's perogative, and there are dirty images  */
-  if (! kill_it && gdisplays_dirty () && ! no_interface)
+  if (! kill_it && gimp_displays_dirty (the_gimp) && ! no_interface)
     gui_really_quit_dialog (G_CALLBACK (app_exit_finish));
   else
     app_exit_finish ();
diff --git a/app/base/color-balance.c b/app/base/color-balance.c
index defa024b2c..065dd5cb95 100644
--- a/app/base/color-balance.c
+++ b/app/base/color-balance.c
@@ -32,7 +32,6 @@
 #include "core/gimpimage.h"
 
 #include "display/gimpdisplay.h"
-#include "display/gimpdisplay-foreach.h"
 
 #include "widgets/gimpenummenu.h"
 
@@ -617,7 +616,7 @@ color_balance_cancel_callback (GtkWidget *widget,
       image_map_abort (cbd->image_map);
       gimp_tool_control_set_preserve (active_tool->control, FALSE);
 
-      gdisplays_flush ();
+      gimp_image_flush (active_tool->gdisp->gimage);
       cbd->image_map = NULL;
     }
 
@@ -677,7 +676,8 @@ color_balance_preview_update (GtkWidget *widget,
 	  gimp_tool_control_set_preserve (active_tool->control, TRUE);
 	  image_map_clear (cbd->image_map);
 	  gimp_tool_control_set_preserve (active_tool->control, FALSE);
-	  gdisplays_flush ();
+
+	  gimp_image_flush (active_tool->gdisp->gimage);
 	}
     }
 }
diff --git a/app/base/curves.c b/app/base/curves.c
index 7ae90db49c..5b1a08d145 100644
--- a/app/base/curves.c
+++ b/app/base/curves.c
@@ -45,7 +45,6 @@
 #include "widgets/gimpenummenu.h"
 
 #include "display/gimpdisplay.h"
-#include "display/gimpdisplay-foreach.h"
 
 #include "gimpcurvestool.h"
 #include "tool_manager.h"
@@ -1414,7 +1413,7 @@ curves_cancel_callback (GtkWidget *widget,
       image_map_abort (cd->image_map);
       gimp_tool_control_set_preserve (active_tool->control, FALSE);
 
-      gdisplays_flush ();
+      gimp_image_flush (active_tool->gdisp->gimage);
       cd->image_map = NULL;
     }
 
@@ -1476,7 +1475,8 @@ curves_preview_update (GtkWidget *widget,
 	  gimp_tool_control_set_preserve (active_tool->control, TRUE);
 	  image_map_clear (cd->image_map);
 	  gimp_tool_control_set_preserve (active_tool->control, FALSE);
-	  gdisplays_flush ();
+
+	  gimp_image_flush (active_tool->gdisp->gimage);
 	}
     }
 }
diff --git a/app/base/hue-saturation.c b/app/base/hue-saturation.c
index 0ac305b6d0..4e9bca1f4a 100644
--- a/app/base/hue-saturation.c
+++ b/app/base/hue-saturation.c
@@ -38,7 +38,6 @@
 #include "core/gimpimage-mask.h"
 
 #include "display/gimpdisplay.h"
-#include "display/gimpdisplay-foreach.h"
 
 #include "gimphuesaturationtool.h"
 #include "tool_manager.h"
@@ -789,7 +788,7 @@ hue_saturation_cancel_callback (GtkWidget *widget,
       image_map_abort (hsd->image_map);
       gimp_tool_control_set_preserve (active_tool->control, FALSE);
 
-      gdisplays_flush ();
+      gimp_image_flush (active_tool->gdisp->gimage);
       hsd->image_map = NULL;
     }
 
@@ -837,7 +836,8 @@ hue_saturation_preview_update (GtkWidget *widget,
 	  gimp_tool_control_set_preserve (active_tool->control, TRUE);
 	  image_map_clear (hsd->image_map);
 	  gimp_tool_control_set_preserve (active_tool->control, FALSE);
-	  gdisplays_flush ();
+
+	  gimp_image_flush (active_tool->gdisp->gimage);
 	}
     }
 }
diff --git a/app/base/threshold.c b/app/base/threshold.c
index f452a22929..7b06403102 100644
--- a/app/base/threshold.c
+++ b/app/base/threshold.c
@@ -36,7 +36,6 @@
 #include "widgets/gimphistogramview.h"
 
 #include "display/gimpdisplay.h"
-#include "display/gimpdisplay-foreach.h"
 
 #include "gimpthresholdtool.h"
 #include "tool_manager.h"
@@ -533,7 +532,7 @@ threshold_cancel_callback (GtkWidget *widget,
       gimp_tool_control_set_preserve (active_tool->control, FALSE);
 
       td->image_map = NULL;
-      gdisplays_flush ();
+      gimp_image_flush (active_tool->gdisp->gimage);
     }
 
   active_tool->gdisp    = NULL;
@@ -564,7 +563,8 @@ threshold_preview_update (GtkWidget *widget,
 	  gimp_tool_control_set_preserve (active_tool->control, TRUE);
 	  image_map_clear (td->image_map);
 	  gimp_tool_control_set_preserve (active_tool->control, FALSE);
-	  gdisplays_flush ();
+
+	  gimp_image_flush (active_tool->gdisp->gimage);
 	}
     }
 }
diff --git a/app/core/gimp.c b/app/core/gimp.c
index e9c3621749..c4d10736cb 100644
--- a/app/core/gimp.c
+++ b/app/core/gimp.c
@@ -156,6 +156,12 @@ gimp_init (Gimp *gimp)
   gimp->next_item_ID        = 1;
   gimp->item_table          = g_hash_table_new (g_direct_hash, NULL);
 
+  gimp->displays            = gimp_list_new (GIMP_TYPE_OBJECT,
+                                             GIMP_CONTAINER_POLICY_WEAK);
+  gimp_object_set_name (GIMP_OBJECT (gimp->displays), "displays");
+
+  gimp->next_display_ID     = 1;
+
   gimp->global_buffer       = NULL;
   gimp->named_buffers       = gimp_list_new (GIMP_TYPE_BUFFER,
 					     GIMP_CONTAINER_POLICY_STRONG);
@@ -302,6 +308,12 @@ gimp_finalize (GObject *object)
       gimp->global_buffer = NULL;
     }
 
+  if (gimp->displays)
+    {
+      g_object_unref (gimp->displays);
+      gimp->displays = NULL;
+    }
+
   if (gimp->item_table)
     {
       g_hash_table_destroy (gimp->item_table);
@@ -352,6 +364,8 @@ gimp_get_memsize (GimpObject *object)
   memsize += (g_hash_table_size (gimp->item_table) *
               3 * sizeof (gpointer)); /* FIXME */
 
+  memsize += gimp_object_get_memsize (GIMP_OBJECT (gimp->displays));
+
   if (gimp->global_buffer)
     memsize += gimp_object_get_memsize (GIMP_OBJECT (gimp->global_buffer));
 
@@ -711,15 +725,19 @@ gimp_create_display (Gimp      *gimp,
 		     GimpImage *gimage,
                      guint      scale)
 {
+  GimpObject *display = NULL;
+
   g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
   g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL);
 
   if (gimp->gui_create_display_func)
     {
-      return gimp->gui_create_display_func (gimage, scale);
+      display = gimp->gui_create_display_func (gimage, scale);
+
+      gimp_container_add (gimp->displays, display);
     }
 
-  return NULL;
+  return display;
 }
 
 GimpContext *
diff --git a/app/core/gimp.h b/app/core/gimp.h
index f9874a5649..d76cc93d60 100644
--- a/app/core/gimp.h
+++ b/app/core/gimp.h
@@ -84,6 +84,9 @@ struct _Gimp
   gint                   next_item_ID;
   GHashTable            *item_table;
 
+  GimpContainer         *displays;
+  gint                   next_display_ID;
+
   GimpBuffer            *global_buffer;
   GimpContainer         *named_buffers;
 
diff --git a/app/core/gimpimage.c b/app/core/gimpimage.c
index 0e848ab2e5..12b7cc0bcb 100644
--- a/app/core/gimpimage.c
+++ b/app/core/gimpimage.c
@@ -90,6 +90,7 @@ enum
   UPDATE_GUIDE,
   COLORMAP_CHANGED,
   UNDO_EVENT,
+  FLUSH,
   LAST_SIGNAL
 };
 
@@ -364,6 +365,15 @@ gimp_image_class_init (GimpImageClass *klass)
 		  G_TYPE_NONE, 1,
 		  G_TYPE_INT);
 
+  gimp_image_signals[FLUSH] =
+    g_signal_new ("flush",
+		  G_TYPE_FROM_CLASS (klass),
+		  G_SIGNAL_RUN_FIRST,
+		  G_STRUCT_OFFSET (GimpImageClass, flush),
+		  NULL, NULL,
+		  gimp_marshal_VOID__VOID,
+		  G_TYPE_NONE, 0);
+
   object_class->dispose               = gimp_image_dispose;
   object_class->finalize              = gimp_image_finalize;
 
@@ -1614,6 +1624,17 @@ gimp_image_clean_all (GimpImage *gimage)
 }
 
 
+/*  flush this image's displays  */
+
+void
+gimp_image_flush (GimpImage *gimage)
+{
+  g_return_if_fail (GIMP_IS_IMAGE (gimage));
+
+  g_signal_emit (G_OBJECT (gimage), gimp_image_signals[FLUSH], 0);
+}
+
+
 /*  color transforms / utilities  */
 
 
diff --git a/app/core/gimpimage.h b/app/core/gimpimage.h
index 47f734d7e3..5b23d50980 100644
--- a/app/core/gimpimage.h
+++ b/app/core/gimpimage.h
@@ -205,6 +205,8 @@ struct _GimpImageClass
 
   void (* undo)                         (GimpImage            *gimage);
   void (* redo)                         (GimpImage            *gimage);
+
+  void (* flush)                        (GimpImage            *gimage);
 };
 
 
@@ -308,6 +310,11 @@ gint            gimp_image_clean                 (GimpImage          *gimage);
 void            gimp_image_clean_all             (GimpImage          *gimage);
 
 
+/*  flush this image's displays  */
+
+void            gimp_image_flush                 (GimpImage          *gimage);
+
+
 /*  color transforms / utilities  */
 
 void            gimp_image_get_foreground        (const GimpImage    *gimage,
diff --git a/app/core/gimpimagemap.c b/app/core/gimpimagemap.c
index 2ab024c8c9..49b66ce2d9 100644
--- a/app/core/gimpimagemap.c
+++ b/app/core/gimpimagemap.c
@@ -32,7 +32,6 @@
 #include "core/gimpimage.h"
 
 #include "display/gimpdisplay.h"
-#include "display/gimpdisplay-foreach.h"
 #include "display/gimpdisplayshell.h"
 
 #include "image_map.h"
@@ -434,7 +433,7 @@ image_map_do (gpointer data)
   if (image_map->PRI == NULL)
     {
       image_map->state = IMAGE_MAP_WAITING;
-      gdisplays_flush ();
+      gimp_image_flush (image_map->gdisp->gimage);
 
       return FALSE;
     }
diff --git a/app/core/gimpprojection.c b/app/core/gimpprojection.c
index 0f05d445ad..a18dffc62f 100644
--- a/app/core/gimpprojection.c
+++ b/app/core/gimpprojection.c
@@ -25,10 +25,12 @@
 #include "tools/tools-types.h"
 
 #include "core/gimp.h"
+#include "core/gimpcontainer.h"
 #include "core/gimpcontext.h"
 #include "core/gimpdrawable.h"
 #include "core/gimpimage.h"
 #include "core/gimpimage-projection.h"
+#include "core/gimplist.h"
 
 #include "libgimptool/gimptool.h"
 
@@ -66,9 +68,6 @@ static void       gimp_display_paint_area            (GimpDisplay      *gdisp,
 
 static GimpObjectClass *parent_class = NULL;
 
-GSList      *display_list = NULL;
-static gint  display_num  = 1;
-
 
 GType
 gimp_display_get_type (void)
@@ -113,7 +112,7 @@ gimp_display_class_init (GimpDisplayClass *klass)
 static void
 gimp_display_init (GimpDisplay *gdisp)
 {
-  gdisp->ID                       = display_num++;
+  gdisp->ID                       = 0;
 
   gdisp->gimage                   = NULL;
   gdisp->instance                 = 0;
@@ -157,8 +156,7 @@ gimp_display_new (GimpImage *gimage,
 
   gdisp = g_object_new (GIMP_TYPE_DISPLAY, NULL);
 
-  /*  add the new display to the list so that it isn't lost  */
-  display_list = g_slist_append (display_list, gdisp);
+  gdisp->ID = gimage->gimp->next_display_ID;
 
   /*  refs the image  */
   gimp_display_connect (gdisp, gimage);
@@ -182,7 +180,8 @@ gimp_display_delete (GimpDisplay *gdisp)
   g_return_if_fail (GIMP_IS_DISPLAY (gdisp));
 
   /* remove the display from the list */
-  display_list = g_slist_remove (display_list, gdisp);
+  gimp_container_remove (gdisp->gimage->gimp->displays,
+                         GIMP_OBJECT (gdisp));
 
   /*  stop any active tool  */
   tool_manager_control_active (gdisp->gimage->gimp, HALT, gdisp);
@@ -234,14 +233,13 @@ gimp_display_get_by_ID (Gimp *gimp,
                         gint  ID)
 {
   GimpDisplay *gdisp;
-  GSList      *list;
+  GList       *list;
 
   g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
 
-  /*  Traverse the list of displays, returning the one that matches the ID
-   *  If no display in the list is a match, return NULL.
-   */
-  for (list = display_list; list; list = g_slist_next (list))
+  for (list = GIMP_LIST (gimp->displays)->list;
+       list;
+       list = g_list_next (list))
     {
       gdisp = (GimpDisplay *) list->data;
 
diff --git a/app/core/gimpprojection.h b/app/core/gimpprojection.h
index ad368b8f88..60e0b381c3 100644
--- a/app/core/gimpprojection.h
+++ b/app/core/gimpprojection.h
@@ -68,9 +68,6 @@ struct _IdleRenderStruct
 };
 
 
-extern GSList *display_list; /* EEK */
-
-
 #define GIMP_TYPE_DISPLAY            (gimp_display_get_type ())
 #define GIMP_DISPLAY(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_DISPLAY, GimpDisplay))
 #define GIMP_DISPLAY_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_DISPLAY, GimpDisplayClass))
diff --git a/app/dialogs/convert-dialog.c b/app/dialogs/convert-dialog.c
index 591e85dade..ef940486d4 100644
--- a/app/dialogs/convert-dialog.c
+++ b/app/dialogs/convert-dialog.c
@@ -31,8 +31,6 @@
 #include "core/gimplist.h"
 #include "core/gimppalette.h"
 
-#include "display/gimpdisplay-foreach.h"
-
 #include "libgimptool/gimptool.h"
 #include "tools/tool_manager.h"
 
@@ -86,14 +84,14 @@ void
 convert_to_rgb (GimpImage *gimage)
 {
   gimp_image_convert (gimage, GIMP_RGB, 0, 0, 0, 0, 0, NULL);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
 convert_to_grayscale (GimpImage* gimage)
 {
   gimp_image_convert (gimage, GIMP_GRAY, 0, 0, 0, 0, 0, NULL);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -451,7 +449,7 @@ indexed_ok_callback (GtkWidget *widget,
 		      dialog->remove_dups, 
                       dialog->palette_type, 
                       theCustomPalette);
-  gdisplays_flush ();
+  gimp_image_flush (dialog->gimage);
 
   /* Save defaults for next time */
   sdither_type  = dialog->dither_type;
diff --git a/app/dialogs/offset-dialog.c b/app/dialogs/offset-dialog.c
index 5bcfe0f88e..48747b064a 100644
--- a/app/dialogs/offset-dialog.c
+++ b/app/dialogs/offset-dialog.c
@@ -32,8 +32,6 @@
 #include "core/gimplayermask.h"
 #include "core/gimpimage.h"
 
-#include "display/gimpdisplay-foreach.h"
-
 #include "offset-dialog.h"
 
 #include "libgimp/gimpintl.h"
@@ -251,7 +249,7 @@ offset_ok_callback (GtkWidget *widget,
       gimp_drawable_offset (drawable,
 			    off_d->wrap_around, off_d->fill_type,
 			    offset_x, offset_y);
-      gdisplays_flush ();
+      gimp_image_flush (gimage);
     }
 
   gtk_widget_destroy (off_d->dlg);
diff --git a/app/dialogs/preferences-dialog.c b/app/dialogs/preferences-dialog.c
index 7e761db94c..b45e3f1ca4 100644
--- a/app/dialogs/preferences-dialog.c
+++ b/app/dialogs/preferences-dialog.c
@@ -957,7 +957,7 @@ prefs_cancel_callback (GtkWidget *widget,
 			      NULL);
 
       gdisplays_expose_full ();
-      gdisplays_flush ();
+      gimp_displays_flush (gimp);
     }
 
   prefs_strset (&gimprc.image_title_format,     old_image_title_format);
@@ -1060,7 +1060,7 @@ prefs_toggle_callback (GtkWidget *widget,
 			      (GFunc) gimp_image_invalidate_layer_previews,
 			      NULL);
       gdisplays_expose_full ();
-      gdisplays_flush ();
+      gimp_displays_flush (gimp);
     }
   /*  no matching varible found  */
   else
diff --git a/app/display/gimpdisplay-foreach.c b/app/display/gimpdisplay-foreach.c
index cb0a83bedd..45043c948c 100644
--- a/app/display/gimpdisplay-foreach.c
+++ b/app/display/gimpdisplay-foreach.c
@@ -22,27 +22,26 @@
 
 #include "display-types.h"
 
+#include "core/gimp.h"
 #include "core/gimpimage.h"
+#include "core/gimplist.h"
 
 #include "gimpdisplay.h"
 #include "gimpdisplay-foreach.h"
 #include "gimpdisplayshell.h"
 
+#include "app_procs.h"
 
-void
-gdisplays_foreach (GFunc    func, 
-		   gpointer user_data)
-{
-  g_slist_foreach (display_list, func, user_data);
-}
 
 void
 gdisplays_expose_full (void)
 {
   GimpDisplay *gdisp;
-  GSList      *list;
+  GList       *list;
 
-  for (list = display_list; list; list = g_slist_next (list))
+  for (list = GIMP_LIST (the_gimp->displays)->list;
+       list;
+       list = g_list_next (list))
     {
       gdisp = (GimpDisplay *) list->data;
 
@@ -51,31 +50,36 @@ gdisplays_expose_full (void)
 }
 
 gboolean
-gdisplays_dirty (void)
+gimp_displays_dirty (Gimp *gimp)
 {
-  gboolean  dirty = FALSE;
-  GSList   *list;
+  GList *list;
 
-  for (list = display_list; list; list = g_slist_next (list))
+  g_return_val_if_fail (GIMP_IS_GIMP (gimp), FALSE);
+
+  for (list = GIMP_LIST (the_gimp->displays)->list;
+       list;
+       list = g_list_next (list))
     {
       if (((GimpDisplay *) list->data)->gimage->dirty != 0)
-	dirty = TRUE;
+	return TRUE;
     }
 
-  return dirty;
+  return FALSE;
 }
 
 void
-gdisplays_delete (void)
+gimp_displays_delete (Gimp *gimp)
 {
   GimpDisplay *gdisp;
 
+  g_return_if_fail (GIMP_IS_GIMP (gimp));
+
   /*  this removes the GimpDisplay from the list, so do a while loop
    *  "around" the first element to get them all
    */
-  while (display_list)
+  while (GIMP_LIST (gimp->displays)->list)
     {
-      gdisp = (GimpDisplay *) display_list->data;
+      gdisp = (GimpDisplay *) GIMP_LIST (gimp->displays)->list->data;
 
       gimp_display_delete (gdisp);
     }
@@ -92,9 +96,11 @@ gdisplays_check_valid (GimpDisplay *gtest,
 
   GimpDisplay *gdisp;
   GimpDisplay *gdisp_found = NULL;
-  GSList      *list;
+  GList       *list;
 
-  for (list = display_list; list; list = g_slist_next (list))
+  for (list = GIMP_LIST (the_gimp->displays)->list;
+       list;
+       list = g_list_next (list))
     {
       gdisp = (GimpDisplay *) list->data;
 
@@ -109,13 +115,15 @@ gdisplays_check_valid (GimpDisplay *gtest,
 }
 
 void
-gdisplays_flush (void)
+gimp_displays_flush (Gimp *gimp)
 {
   static gboolean flushing = FALSE;
 
-  GSList      *list;
+  GList       *list;
   GimpDisplay *gdisp;
 
+  g_return_if_fail (GIMP_IS_GIMP (gimp));
+
   /*  this prevents multiple recursive calls to this procedure  */
   if (flushing == TRUE)
     {
@@ -125,9 +133,11 @@ gdisplays_flush (void)
 
   flushing = TRUE;
 
-  for (list = display_list; list; list = g_slist_next (list))
+  for (list = GIMP_LIST (gimp->displays)->list;
+       list;
+       list = g_list_next (list))
     {
-      gdisp = list->data;
+      gdisp = (GimpDisplay *) list->data;
 
       gimp_display_flush (gdisp);
     }
@@ -137,12 +147,16 @@ gdisplays_flush (void)
 
 /* Force all gdisplays to finish their idlerender projection */
 void
-gdisplays_finish_draw (void)
+gimp_displays_finish_draw (Gimp *gimp)
 {
-  GSList      *list;
+  GList       *list;
   GimpDisplay *gdisp;
 
-  for (list = display_list; list; list = g_slist_next (list))
+  g_return_if_fail (GIMP_IS_GIMP (gimp));
+
+  for (list = GIMP_LIST (gimp->displays)->list;
+       list;
+       list = g_list_next (list))
     {
       gdisp = (GimpDisplay *) list->data;
       
@@ -154,13 +168,15 @@ void
 gdisplays_reconnect (GimpImage *old,
 		     GimpImage *new)
 {
-  GSList      *list;
+  GList       *list;
   GimpDisplay *gdisp;
 
   g_return_if_fail (old != NULL);
   g_return_if_fail (GIMP_IS_IMAGE (new));
   
-  for (list = display_list; list; list = g_slist_next (list))
+  for (list = GIMP_LIST (new->gimp->displays)->list;
+       list;
+       list = g_list_next (list))
     {
       gdisp = list->data;
       
@@ -170,12 +186,16 @@ gdisplays_reconnect (GimpImage *old,
 }
 
 void
-gdisplays_set_busy (void)
+gimp_displays_set_busy (Gimp *gimp)
 {
-  GSList           *list;
+  GList            *list;
   GimpDisplayShell *shell;
 
-  for (list = display_list; list; list = g_slist_next (list))
+  g_return_if_fail (GIMP_IS_GIMP (gimp));
+
+  for (list = GIMP_LIST (gimp->displays)->list;
+       list;
+       list = g_list_next (list))
     {
       shell = GIMP_DISPLAY_SHELL (GIMP_DISPLAY (list->data)->shell);
 
@@ -184,12 +204,16 @@ gdisplays_set_busy (void)
 }
 
 void
-gdisplays_unset_busy (void)
+gimp_displays_unset_busy (Gimp *gimp)
 {
-  GSList           *list;
+  GList            *list;
   GimpDisplayShell *shell;
 
-  for (list = display_list; list; list = g_slist_next (list))
+  g_return_if_fail (GIMP_IS_GIMP (gimp));
+
+  for (list = GIMP_LIST (gimp->displays)->list;
+       list;
+       list = g_list_next (list))
     {
       shell = GIMP_DISPLAY_SHELL (GIMP_DISPLAY (list->data)->shell);
       
diff --git a/app/display/gimpdisplay-foreach.h b/app/display/gimpdisplay-foreach.h
index 4cb7d2b3d1..728fe70f16 100644
--- a/app/display/gimpdisplay-foreach.h
+++ b/app/display/gimpdisplay-foreach.h
@@ -20,19 +20,19 @@
 #define __GIMP_DISPLAY_FOREACH_H__
 
 
-void          gdisplays_foreach                 (GFunc        func,
-                                                 gpointer     user_data);
 GimpDisplay * gdisplays_check_valid             (GimpDisplay *gdisp,
                                                  GimpImage   *gimage);
 void          gdisplays_reconnect               (GimpImage   *old,
                                                  GimpImage   *new);
 void          gdisplays_expose_full             (void);
-gboolean      gdisplays_dirty                   (void);
-void          gdisplays_delete                  (void);
-void          gdisplays_flush                   (void);
-void          gdisplays_finish_draw             (void);
-void          gdisplays_set_busy                (void);
-void          gdisplays_unset_busy              (void);
+
+gboolean      gimp_displays_dirty               (Gimp        *gimp);
+void          gimp_displays_delete              (Gimp        *gimp);
+void          gimp_displays_flush               (Gimp        *gimp);
+void          gimp_displays_finish_draw         (Gimp        *gimp);
+
+void          gimp_displays_set_busy            (Gimp        *gimp);
+void          gimp_displays_unset_busy          (Gimp        *gimp);
 
 
 #endif /*  __GIMP_DISPLAY_FOREACH_H__  */
diff --git a/app/display/gimpdisplay-handlers.c b/app/display/gimpdisplay-handlers.c
index 307ec91062..ee277b4427 100644
--- a/app/display/gimpdisplay-handlers.c
+++ b/app/display/gimpdisplay-handlers.c
@@ -43,6 +43,8 @@ static void   gimp_display_colormap_changed_handler (GimpImage   *gimage,
                                                      GimpDisplay *gdisp);
 static void   gimp_display_size_changed_handler     (GimpImage   *gimage,
                                                      GimpDisplay *gdisp);
+static void   gimp_display_flush_handler            (GimpImage   *gimage,
+                                                     GimpDisplay *gdisp);
 
 
 /*  public functions  */
@@ -78,6 +80,9 @@ gimp_display_connect (GimpDisplay *gdisp,
   g_signal_connect (G_OBJECT (gimage), "size_changed",
                     G_CALLBACK (gimp_display_size_changed_handler),
                     gdisp);
+  g_signal_connect (G_OBJECT (gimage), "flush",
+                    G_CALLBACK (gimp_display_flush_handler),
+                    gdisp);
 }
 
 void
@@ -86,6 +91,9 @@ gimp_display_disconnect (GimpDisplay *gdisp)
   g_return_if_fail (GIMP_IS_DISPLAY (gdisp));
   g_return_if_fail (GIMP_IS_IMAGE (gdisp->gimage));
 
+  g_signal_handlers_disconnect_by_func (G_OBJECT (gdisp->gimage),
+                                        gimp_display_flush_handler,
+                                        gdisp);
   g_signal_handlers_disconnect_by_func (G_OBJECT (gdisp->gimage),
                                         gimp_display_size_changed_handler,
                                         gdisp);
@@ -155,3 +163,10 @@ gimp_display_size_changed_handler (GimpImage   *gimage,
                                 gdisp->gimage->width,
                                 gdisp->gimage->height);
 }
+
+static void
+gimp_display_flush_handler (GimpImage   *gimage,
+                            GimpDisplay *gdisp)
+{
+  gimp_display_flush (gdisp);
+}
diff --git a/app/display/gimpdisplay.c b/app/display/gimpdisplay.c
index 0f05d445ad..a18dffc62f 100644
--- a/app/display/gimpdisplay.c
+++ b/app/display/gimpdisplay.c
@@ -25,10 +25,12 @@
 #include "tools/tools-types.h"
 
 #include "core/gimp.h"
+#include "core/gimpcontainer.h"
 #include "core/gimpcontext.h"
 #include "core/gimpdrawable.h"
 #include "core/gimpimage.h"
 #include "core/gimpimage-projection.h"
+#include "core/gimplist.h"
 
 #include "libgimptool/gimptool.h"
 
@@ -66,9 +68,6 @@ static void       gimp_display_paint_area            (GimpDisplay      *gdisp,
 
 static GimpObjectClass *parent_class = NULL;
 
-GSList      *display_list = NULL;
-static gint  display_num  = 1;
-
 
 GType
 gimp_display_get_type (void)
@@ -113,7 +112,7 @@ gimp_display_class_init (GimpDisplayClass *klass)
 static void
 gimp_display_init (GimpDisplay *gdisp)
 {
-  gdisp->ID                       = display_num++;
+  gdisp->ID                       = 0;
 
   gdisp->gimage                   = NULL;
   gdisp->instance                 = 0;
@@ -157,8 +156,7 @@ gimp_display_new (GimpImage *gimage,
 
   gdisp = g_object_new (GIMP_TYPE_DISPLAY, NULL);
 
-  /*  add the new display to the list so that it isn't lost  */
-  display_list = g_slist_append (display_list, gdisp);
+  gdisp->ID = gimage->gimp->next_display_ID;
 
   /*  refs the image  */
   gimp_display_connect (gdisp, gimage);
@@ -182,7 +180,8 @@ gimp_display_delete (GimpDisplay *gdisp)
   g_return_if_fail (GIMP_IS_DISPLAY (gdisp));
 
   /* remove the display from the list */
-  display_list = g_slist_remove (display_list, gdisp);
+  gimp_container_remove (gdisp->gimage->gimp->displays,
+                         GIMP_OBJECT (gdisp));
 
   /*  stop any active tool  */
   tool_manager_control_active (gdisp->gimage->gimp, HALT, gdisp);
@@ -234,14 +233,13 @@ gimp_display_get_by_ID (Gimp *gimp,
                         gint  ID)
 {
   GimpDisplay *gdisp;
-  GSList      *list;
+  GList       *list;
 
   g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
 
-  /*  Traverse the list of displays, returning the one that matches the ID
-   *  If no display in the list is a match, return NULL.
-   */
-  for (list = display_list; list; list = g_slist_next (list))
+  for (list = GIMP_LIST (gimp->displays)->list;
+       list;
+       list = g_list_next (list))
     {
       gdisp = (GimpDisplay *) list->data;
 
diff --git a/app/display/gimpdisplay.h b/app/display/gimpdisplay.h
index ad368b8f88..60e0b381c3 100644
--- a/app/display/gimpdisplay.h
+++ b/app/display/gimpdisplay.h
@@ -68,9 +68,6 @@ struct _IdleRenderStruct
 };
 
 
-extern GSList *display_list; /* EEK */
-
-
 #define GIMP_TYPE_DISPLAY            (gimp_display_get_type ())
 #define GIMP_DISPLAY(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_DISPLAY, GimpDisplay))
 #define GIMP_DISPLAY_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_DISPLAY, GimpDisplayClass))
diff --git a/app/display/gimpdisplayshell-callbacks.c b/app/display/gimpdisplayshell-callbacks.c
index 22c7732c74..447e09d3ca 100644
--- a/app/display/gimpdisplayshell-callbacks.c
+++ b/app/display/gimpdisplayshell-callbacks.c
@@ -50,7 +50,6 @@
 #include "gui/dialogs.h"
 
 #include "gimpdisplay.h"
-#include "gimpdisplay-foreach.h"
 #include "gimpdisplayshell.h"
 #include "gimpdisplayshell-callbacks.h"
 #include "gimpdisplayshell-layer-select.h"
@@ -1231,7 +1230,7 @@ gimp_display_shell_qmask_toggled (GtkWidget        *widget,
   gimp_image_set_qmask_state (shell->gdisp->gimage,
                               GTK_TOGGLE_BUTTON (widget)->active);
 
-  gdisplays_flush ();
+  gimp_image_flush (shell->gdisp->gimage);
 }
 
 gboolean
diff --git a/app/display/gimpdisplayshell-dnd.c b/app/display/gimpdisplayshell-dnd.c
index 2c3d35ef8a..ea43d2eb29 100644
--- a/app/display/gimpdisplayshell-dnd.c
+++ b/app/display/gimpdisplayshell-dnd.c
@@ -37,7 +37,6 @@
 #include "gimpdisplay.h"
 #include "gimpdisplayshell.h"
 #include "gimpdisplayshell-dnd.h"
-#include "gimpdisplay-foreach.h"
 
 #include "undo.h"
 
@@ -74,7 +73,7 @@ gimp_display_shell_drop_drawable (GtkWidget    *widget,
 
   undo_push_group_end (gdisp->gimage);
 
-  gdisplays_flush ();
+  gimp_image_flush (gdisp->gimage);
 
   gimp_context_set_display (gimp_get_user_context (gdisp->gimage->gimp), gdisp);
 }
@@ -119,7 +118,7 @@ gimp_display_shell_bucket_fill (GimpImage          *gimage,
                                   FALSE /* no seed fill */,
                                   FALSE, 0.0, FALSE, 0.0, 0.0 /* fill params */);
 
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -177,5 +176,5 @@ gimp_display_shell_drop_buffer (GtkWidget    *widget,
 		   buffer,
 		   FALSE);
 
-  gdisplays_flush ();
+  gimp_image_flush (gdisp->gimage);
 }
diff --git a/app/display/gimpdisplayshell-layer-select.c b/app/display/gimpdisplayshell-layer-select.c
index 1af10e9374..a761ef2871 100644
--- a/app/display/gimpdisplayshell-layer-select.c
+++ b/app/display/gimpdisplayshell-layer-select.c
@@ -29,7 +29,6 @@
 
 #include "widgets/gimppreview.h"
 
-#include "gimpdisplay-foreach.h"
 #include "gimpdisplayshell-layer-select.h"
 
 #include "gimprc.h"
@@ -211,7 +210,7 @@ layer_select_end (LayerSelect *layer_select,
     {
       gimp_image_set_active_layer (layer_select->gimage, 
 				   layer_select->current_layer);
-      gdisplays_flush ();
+      gimp_image_flush (layer_select->gimage);
     }
 }
 
diff --git a/app/display/gimpdisplayshell-scale.c b/app/display/gimpdisplayshell-scale.c
index 057157ae58..9a0ea3ff9d 100644
--- a/app/display/gimpdisplayshell-scale.c
+++ b/app/display/gimpdisplayshell-scale.c
@@ -33,7 +33,6 @@
 #include "tools/tool_manager.h"
 
 #include "gimpdisplay.h"
-#include "gimpdisplay-foreach.h"
 #include "gimpdisplayshell.h"
 #include "gimpdisplayshell-scale.h"
 #include "gimpdisplayshell-scroll.h"
@@ -423,7 +422,7 @@ gimp_display_shell_scale_resize (GimpDisplayShell *shell,
       /* title may have changed if it includes the zoom ratio */
       shell->title_dirty = TRUE;
 
-      gdisplays_flush ();
+      gimp_display_shell_flush (shell);
     }
 
   /* re-enable the active tool */
diff --git a/app/gui/channels-commands.c b/app/gui/channels-commands.c
index 39ccbb6fd4..53d98cec9d 100644
--- a/app/gui/channels-commands.c
+++ b/app/gui/channels-commands.c
@@ -35,8 +35,6 @@
 #include "core/gimpimage-mask-select.h"
 #include "core/gimplist.h"
 
-#include "display/gimpdisplay-foreach.h"
-
 #include "widgets/gimpcolorpanel.h"
 #include "widgets/gimpitemfactory.h"
 #include "widgets/gimpwidgets-utils.h"
@@ -91,7 +89,7 @@ channels_raise_channel_cmd_callback (GtkWidget *widget,
   return_if_no_channel (gimage, active_channel);
 
   gimp_image_raise_channel (gimage, active_channel);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -103,7 +101,7 @@ channels_lower_channel_cmd_callback (GtkWidget *widget,
   return_if_no_channel (gimage, active_channel);
 
   gimp_image_lower_channel (gimage, active_channel);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -119,7 +117,7 @@ channels_duplicate_channel_cmd_callback (GtkWidget *widget,
                                    G_TYPE_FROM_INSTANCE (active_channel),
                                    TRUE);
   gimp_image_add_channel (gimage, new_channel, -1);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -131,7 +129,7 @@ channels_delete_channel_cmd_callback (GtkWidget *widget,
   return_if_no_channel (gimage, active_channel);
 
   gimp_image_remove_channel (gimage, active_channel);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 static void
@@ -148,7 +146,7 @@ channels_channel_to_sel (GtkWidget      *widget,
                                   0, 0,
                                   op,
                                   FALSE, 0, 0);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -237,7 +235,7 @@ new_channel_query_ok_callback (GtkWidget *widget,
 				  GIMP_TRANSPARENT_FILL);
 
       gimp_image_add_channel (gimage, new_channel, -1);
-      gdisplays_flush ();
+      gimp_image_flush (gimage);
     }
 
   gtk_widget_destroy (options->query_box);
@@ -281,7 +279,7 @@ channels_new_channel_query (GimpImage   *gimage,
 
       undo_push_group_end (gimage);
 
-      gdisplays_flush ();
+      gimp_image_flush (gimage);
       return;
     }
 
@@ -413,7 +411,7 @@ edit_channel_query_ok_callback (GtkWidget *widget,
 	{
 	  gimp_channel_set_color (channel, &color);
 
-	  gdisplays_flush ();
+          gimp_image_flush (options->gimage);
 	}
     }
 
diff --git a/app/gui/colormap-editor-commands.c b/app/gui/colormap-editor-commands.c
index e2cbf5da15..32592b1747 100644
--- a/app/gui/colormap-editor-commands.c
+++ b/app/gui/colormap-editor-commands.c
@@ -30,8 +30,6 @@
 #include "core/gimp.h"
 #include "core/gimpimage.h"
 
-#include "display/gimpdisplay-foreach.h"
-
 #include "widgets/gimpcolormapeditor.h"
 #include "widgets/gimpitemfactory.h"
 #include "widgets/gimpwidgets-utils.h"
@@ -171,7 +169,7 @@ colormap_editor_color_notebook_callback (ColorNotebook      *color_notebook,
 			  &gimage->cmap[editor->col_index * 3 + 2]);
 
       gimp_image_colormap_changed (gimage, editor->col_index);
-      gdisplays_flush ();
+      gimp_image_flush (gimage);
       /* Fall through */
     case COLOR_NOTEBOOK_CANCEL:
       color_notebook_hide (editor->color_notebook);
diff --git a/app/gui/convert-dialog.c b/app/gui/convert-dialog.c
index 591e85dade..ef940486d4 100644
--- a/app/gui/convert-dialog.c
+++ b/app/gui/convert-dialog.c
@@ -31,8 +31,6 @@
 #include "core/gimplist.h"
 #include "core/gimppalette.h"
 
-#include "display/gimpdisplay-foreach.h"
-
 #include "libgimptool/gimptool.h"
 #include "tools/tool_manager.h"
 
@@ -86,14 +84,14 @@ void
 convert_to_rgb (GimpImage *gimage)
 {
   gimp_image_convert (gimage, GIMP_RGB, 0, 0, 0, 0, 0, NULL);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
 convert_to_grayscale (GimpImage* gimage)
 {
   gimp_image_convert (gimage, GIMP_GRAY, 0, 0, 0, 0, 0, NULL);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -451,7 +449,7 @@ indexed_ok_callback (GtkWidget *widget,
 		      dialog->remove_dups, 
                       dialog->palette_type, 
                       theCustomPalette);
-  gdisplays_flush ();
+  gimp_image_flush (dialog->gimage);
 
   /* Save defaults for next time */
   sdither_type  = dialog->dither_type;
diff --git a/app/gui/drawable-commands.c b/app/gui/drawable-commands.c
index 19ad9fc359..513bb8477f 100644
--- a/app/gui/drawable-commands.c
+++ b/app/gui/drawable-commands.c
@@ -34,8 +34,6 @@
 #include "core/gimpdrawable-invert.h"
 #include "core/gimpimage.h"
 
-#include "display/gimpdisplay-foreach.h"
-
 #include "widgets/gimpitemfactory.h"
 #include "widgets/gimpwidgets-utils.h"
 
@@ -76,7 +74,7 @@ drawable_desaturate_cmd_callback (GtkWidget *widget,
     }
 
   gimp_drawable_desaturate (active_drawable);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -94,7 +92,7 @@ drawable_invert_cmd_callback (GtkWidget *widget,
     }
 
   gimp_drawable_invert (active_drawable);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -112,7 +110,7 @@ drawable_equalize_cmd_callback (GtkWidget *widget,
     }
 
   gimp_drawable_equalize (active_drawable, TRUE);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
diff --git a/app/gui/edit-commands.c b/app/gui/edit-commands.c
index 4ccb77da09..7f37fe8e8a 100644
--- a/app/gui/edit-commands.c
+++ b/app/gui/edit-commands.c
@@ -36,7 +36,6 @@
 #include "core/gimpimage-mask.h"
 
 #include "display/gimpdisplay.h"
-#include "display/gimpdisplay-foreach.h"
 
 #include "tools/tool_manager.h"
 
@@ -81,9 +80,7 @@ edit_undo_cmd_callback (GtkWidget *widget,
   return_if_no_image (gimage, data);
 
   if (undo_pop (gimage))
-    {
-      gdisplays_flush ();
-    }
+    gimp_image_flush (gimage);
 }
 
 void
@@ -94,9 +91,7 @@ edit_redo_cmd_callback (GtkWidget *widget,
   return_if_no_image (gimage, data);
 
   if (undo_redo (gimage))
-    {
-      gdisplays_flush ();
-    }
+    gimp_image_flush (gimage);
 }
 
 void
@@ -112,7 +107,7 @@ edit_cut_cmd_callback (GtkWidget *widget,
   if (gimp_edit_cut (gdisp->gimage,
 		     gimp_image_active_drawable (gdisp->gimage)))
     {
-      gdisplays_flush ();
+      gimp_image_flush (gdisp->gimage);
     }
 }
 
@@ -125,7 +120,7 @@ edit_copy_cmd_callback (GtkWidget *widget,
 
   if (gimp_edit_copy (gimage, gimp_image_active_drawable (gimage)))
     {
-      gdisplays_flush ();
+      gimp_image_flush (gimage);
     }
 }
 
@@ -146,7 +141,7 @@ edit_paste_cmd_callback (GtkWidget *widget,
 			   gdisp->gimage->gimp->global_buffer,
 			   FALSE))
 	{
-	  gdisplays_flush ();
+          gimp_image_flush (gdisp->gimage);
 	}
     }
 }
@@ -168,7 +163,7 @@ edit_paste_into_cmd_callback (GtkWidget *widget,
 			   gdisp->gimage->gimp->global_buffer,
 			   TRUE))
 	{
-	  gdisplays_flush ();
+          gimp_image_flush (gdisp->gimage);
 	}
     }
 }
@@ -245,7 +240,7 @@ edit_clear_cmd_callback (GtkWidget *widget,
   return_if_no_image (gimage, data);
 
   gimp_edit_clear (gimage, gimp_image_active_drawable (gimage));
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -262,8 +257,7 @@ edit_fill_cmd_callback (GtkWidget *widget,
   gimp_edit_fill (gimage,
 		  gimp_image_active_drawable (gimage),
 		  fill_type);
-
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -276,8 +270,7 @@ edit_stroke_cmd_callback (GtkWidget *widget,
   gimp_image_mask_stroke (gimage,
                           gimp_image_active_drawable (gimage),
                           gimp_get_current_context (gimage->gimp));
-
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 
@@ -309,7 +302,7 @@ cut_named_buffer_callback (GtkWidget *widget,
                           GIMP_OBJECT (new_buffer));
     }
 
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 static void
diff --git a/app/gui/file-commands.c b/app/gui/file-commands.c
index 0ebcba56ca..a079b4b3cd 100644
--- a/app/gui/file-commands.c
+++ b/app/gui/file-commands.c
@@ -310,7 +310,7 @@ file_revert_confirm_callback (GtkWidget *widget,
 
 	  gimp_image_clean_all (new_gimage);
 
-          gdisplays_flush ();
+          gimp_image_flush (new_gimage);
 	}
       else if (status != GIMP_PDB_CANCEL)
 	{
diff --git a/app/gui/gui.c b/app/gui/gui.c
index e40ca78baf..fdd4c130a9 100644
--- a/app/gui/gui.c
+++ b/app/gui/gui.c
@@ -283,7 +283,7 @@ gui_shutdown (Gimp *gimp)
   if (gimprc.save_device_status)
     gimp_devices_save (gimp);
 
-  gdisplays_delete ();
+  gimp_displays_delete (gimp);
 }
 
 void
@@ -384,7 +384,7 @@ gui_main_quit (Gimp *gimp)
 static void
 gui_set_busy (Gimp *gimp)
 {
-  gdisplays_set_busy ();
+  gimp_displays_set_busy (gimp);
   gimp_dialog_factories_idle ();
 
   gdk_flush ();
@@ -393,7 +393,7 @@ gui_set_busy (Gimp *gimp)
 static void
 gui_unset_busy (Gimp *gimp)
 {
-  gdisplays_unset_busy ();
+  gimp_displays_unset_busy (gimp);
   gimp_dialog_factories_unidle ();
 
   gdk_flush ();
diff --git a/app/gui/image-commands.c b/app/gui/image-commands.c
index a762079ec9..99568a0c86 100644
--- a/app/gui/image-commands.c
+++ b/app/gui/image-commands.c
@@ -35,7 +35,6 @@
 #include "core/gimpimage-scale.h"
 
 #include "display/gimpdisplay.h"
-#include "display/gimpdisplay-foreach.h"
 #include "display/gimpprogress.h"
 
 #include "convert-dialog.h"
@@ -234,7 +233,7 @@ image_flatten_image_cmd_callback (GtkWidget *widget,
   return_if_no_image (gimage, data);
 
   gimp_image_flatten (gimage);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 /****************************/
 /*  The layer merge dialog  */
@@ -264,7 +263,7 @@ image_layers_merge_query_ok_callback (GtkWidget *widget,
   if (options->merge_visible)
     gimp_image_merge_visible_layers (gimage, options->merge_type);
 
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 
   gtk_widget_destroy (options->query_box);
 }
@@ -358,7 +357,7 @@ image_resize_callback (GtkWidget *widget,
 			 image_resize->resize->height,
 			 image_resize->resize->offset_x,
 			 image_resize->resize->offset_y);
-      gdisplays_flush ();
+      gimp_image_flush (image_resize->gimage);
     }
   else 
     {
@@ -506,6 +505,6 @@ image_scale_implement (ImageResize *image_scale)
   if (display_flush)
     {
       undo_push_group_end (gimage);
-      gdisplays_flush ();
+      gimp_image_flush (gimage);
     }
 }
diff --git a/app/gui/layers-commands.c b/app/gui/layers-commands.c
index 08b719b323..80dad0b1f9 100644
--- a/app/gui/layers-commands.c
+++ b/app/gui/layers-commands.c
@@ -40,8 +40,6 @@
 
 #include "pdb/procedural_db.h"
 
-#include "display/gimpdisplay-foreach.h"
-
 #include "widgets/gimpitemfactory.h"
 #include "widgets/gimpwidgets-utils.h"
 
@@ -98,7 +96,7 @@ layers_previous_cmd_callback (GtkWidget *widget,
       if (new_layer)
 	{
 	  gimp_image_set_active_layer (gimage, new_layer);
-	  gdisplays_flush ();
+	  gimp_image_flush (gimage);
 	}
     }
 }
@@ -122,7 +120,7 @@ layers_next_cmd_callback (GtkWidget *widget,
   if (new_layer)
     {
       gimp_image_set_active_layer (gimage, new_layer);
-      gdisplays_flush ();
+      gimp_image_flush (gimage);
     }
 }
 
@@ -135,7 +133,7 @@ layers_raise_cmd_callback (GtkWidget *widget,
   return_if_no_layer (gimage,active_layer);
 
   gimp_image_raise_layer (gimage, active_layer);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -147,7 +145,7 @@ layers_lower_cmd_callback (GtkWidget *widget,
   return_if_no_layer (gimage,active_layer);
 
   gimp_image_lower_layer (gimage, active_layer);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -159,7 +157,7 @@ layers_raise_to_top_cmd_callback (GtkWidget *widget,
   return_if_no_layer (gimage,active_layer);
 
   gimp_image_raise_layer_to_top (gimage, active_layer);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -171,7 +169,7 @@ layers_lower_to_bottom_cmd_callback (GtkWidget *widget,
   return_if_no_layer (gimage, active_layer);
 
   gimp_image_lower_layer_to_bottom (gimage, active_layer);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -198,7 +196,7 @@ layers_duplicate_cmd_callback (GtkWidget *widget,
                                TRUE);
   gimp_image_add_layer (gimage, new_layer, -1);
 
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -221,7 +219,7 @@ layers_merge_down_cmd_callback (GtkWidget *widget,
   return_if_no_layer (gimage, active_layer);
 
   gimp_image_merge_down (gimage, active_layer, GIMP_EXPAND_AS_NECESSARY);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -237,7 +235,7 @@ layers_delete_cmd_callback (GtkWidget *widget,
   else
     gimp_image_remove_layer (gimage, active_layer);
 
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -260,7 +258,7 @@ layers_resize_to_image_cmd_callback (GtkWidget *widget,
   return_if_no_layer (gimage, active_layer);
   
   gimp_layer_resize_to_image (active_layer);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -307,7 +305,7 @@ layers_crop_cmd_callback (GtkWidget *widget,
 
   undo_push_group_end (gimage);
 
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -338,7 +336,7 @@ layers_apply_layer_mask_cmd_callback (GtkWidget *widget,
       gimp_layer_apply_mask (active_layer, GIMP_MASK_APPLY, TRUE);
 
       if (flush)
-	gdisplays_flush ();
+        gimp_image_flush (gimage);
     }
 }
 
@@ -359,7 +357,7 @@ layers_delete_layer_mask_cmd_callback (GtkWidget *widget,
       gimp_layer_apply_mask (active_layer, GIMP_MASK_DISCARD, TRUE);
 
       if (flush)
-	gdisplays_flush ();
+        gimp_image_flush (gimage);
     }
 }
 
@@ -374,7 +372,7 @@ layers_mask_select_cmd_callback (GtkWidget *widget,
   if (gimp_layer_get_mask (active_layer))
     {
       gimp_image_mask_layer_mask (gimage, active_layer);
-      gdisplays_flush ();
+      gimp_image_flush (gimage);
     }
 }
 
@@ -387,7 +385,7 @@ layers_alpha_select_cmd_callback (GtkWidget *widget,
   return_if_no_layer (gimage, active_layer);
 
   gimp_image_mask_layer_alpha (gimage, active_layer);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -401,7 +399,7 @@ layers_add_alpha_channel_cmd_callback (GtkWidget *widget,
   if (! gimp_drawable_has_alpha (GIMP_DRAWABLE (active_layer)))
     {
       gimp_layer_add_alpha (active_layer);
-      gdisplays_flush ();
+      gimp_image_flush (gimage);
     }
 }
 
@@ -437,7 +435,7 @@ layers_anchor_layer (GimpLayer *layer)
   if (gimp_layer_is_floating_sel (layer))
     {
       floating_sel_anchor (layer);
-      gdisplays_flush ();
+      gimp_image_flush (gimp_item_get_image (GIMP_ITEM (layer)));
     }
 }
 
@@ -500,7 +498,7 @@ new_layer_query_ok_callback (GtkWidget *widget,
 				      fill_type);
 	  gimp_image_add_layer (gimage, layer, -1);
 	  
-	  gdisplays_flush ();
+          gimp_image_flush (gimage);
 	} 
       else 
 	{
@@ -534,8 +532,7 @@ layers_new_layer_query (GimpImage *gimage,
   if ((floating_sel = gimp_image_floating_sel (gimage)))
     {
       floating_sel_to_layer (floating_sel);
-
-      gdisplays_flush ();
+      gimp_image_flush (gimage);
       return;
     }
 
@@ -567,7 +564,7 @@ layers_new_layer_query (GimpImage *gimage,
 
       undo_push_group_end (gimage);
 
-      gdisplays_flush ();
+      gimp_image_flush (gimage);
       return;
     }
 
@@ -749,7 +746,7 @@ edit_layer_query_ok_callback (GtkWidget *widget,
         }
     }
 
-  gdisplays_flush ();
+  gimp_image_flush (options->gimage);
 
   gtk_widget_destroy (options->query_box); 
 }
@@ -852,7 +849,7 @@ add_mask_query_ok_callback (GtkWidget *widget,
     {
       mask = gimp_layer_create_mask (layer, options->add_mask_type);
       gimp_layer_add_mask (layer, mask, TRUE);
-      gdisplays_flush ();
+      gimp_image_flush (gimage);
     }
 
   gtk_widget_destroy (options->query_box);
@@ -1007,7 +1004,7 @@ scale_layer_query_ok_callback (GtkWidget *widget,
 
 	  undo_push_group_end (gimage);
 
-	  gdisplays_flush ();
+          gimp_image_flush (gimage);
 	}
 
       gtk_widget_destroy (options->resize->resize_shell);
@@ -1099,7 +1096,7 @@ resize_layer_query_ok_callback (GtkWidget *widget,
 
 	  undo_push_group_end (gimage);
 
-	  gdisplays_flush ();
+          gimp_image_flush (gimage);
 	}
 
       gtk_widget_destroy (options->resize->resize_shell);
diff --git a/app/gui/offset-dialog.c b/app/gui/offset-dialog.c
index 5bcfe0f88e..48747b064a 100644
--- a/app/gui/offset-dialog.c
+++ b/app/gui/offset-dialog.c
@@ -32,8 +32,6 @@
 #include "core/gimplayermask.h"
 #include "core/gimpimage.h"
 
-#include "display/gimpdisplay-foreach.h"
-
 #include "offset-dialog.h"
 
 #include "libgimp/gimpintl.h"
@@ -251,7 +249,7 @@ offset_ok_callback (GtkWidget *widget,
       gimp_drawable_offset (drawable,
 			    off_d->wrap_around, off_d->fill_type,
 			    offset_x, offset_y);
-      gdisplays_flush ();
+      gimp_image_flush (gimage);
     }
 
   gtk_widget_destroy (off_d->dlg);
diff --git a/app/gui/preferences-dialog.c b/app/gui/preferences-dialog.c
index 7e761db94c..b45e3f1ca4 100644
--- a/app/gui/preferences-dialog.c
+++ b/app/gui/preferences-dialog.c
@@ -957,7 +957,7 @@ prefs_cancel_callback (GtkWidget *widget,
 			      NULL);
 
       gdisplays_expose_full ();
-      gdisplays_flush ();
+      gimp_displays_flush (gimp);
     }
 
   prefs_strset (&gimprc.image_title_format,     old_image_title_format);
@@ -1060,7 +1060,7 @@ prefs_toggle_callback (GtkWidget *widget,
 			      (GFunc) gimp_image_invalidate_layer_previews,
 			      NULL);
       gdisplays_expose_full ();
-      gdisplays_flush ();
+      gimp_displays_flush (gimp);
     }
   /*  no matching varible found  */
   else
diff --git a/app/gui/qmask-commands.c b/app/gui/qmask-commands.c
index ea0bf2541d..ec75b35532 100644
--- a/app/gui/qmask-commands.c
+++ b/app/gui/qmask-commands.c
@@ -34,7 +34,6 @@
 #include "widgets/gimpwidgets-utils.h"
 
 #include "display/gimpdisplay.h"
-#include "display/gimpdisplay-foreach.h"
 #include "display/gimpdisplayshell.h"
 
 #include "qmask-commands.h"
@@ -84,7 +83,7 @@ qmask_toggle_cmd_callback (GtkWidget *widget,
   gimp_image_set_qmask_state (shell->gdisp->gimage,
                               GTK_CHECK_MENU_ITEM (widget)->active);
 
-  gdisplays_flush ();
+  gimp_image_flush (shell->gdisp->gimage);
 }
 
 void
@@ -104,7 +103,7 @@ qmask_invert_cmd_callback (GtkWidget *widget,
       gimp_image_qmask_invert (shell->gdisp->gimage);
 
       if (shell->gdisp->gimage->qmask_state)
-        gdisplays_flush ();
+        gimp_image_flush (shell->gdisp->gimage);
     }
 }
 
@@ -255,7 +254,7 @@ qmask_query_ok_callback (GtkWidget *widget,
 	{
 	  gimp_channel_set_color (channel, &color);
 
-	  gdisplays_flush ();
+	  gimp_image_flush (options->gimage);
 	}
     }
 
diff --git a/app/gui/select-commands.c b/app/gui/select-commands.c
index 6c1b0ff9d3..3f2b5ac70f 100644
--- a/app/gui/select-commands.c
+++ b/app/gui/select-commands.c
@@ -31,7 +31,6 @@
 #include "core/gimpimage-mask.h"
 
 #include "display/gimpdisplay.h"
-#include "display/gimpdisplay-foreach.h"
 
 #include "libgimp/gimpintl.h"
 
@@ -84,7 +83,7 @@ select_invert_cmd_callback (GtkWidget *widget,
   return_if_no_image (gimage, data);
 
   gimp_image_mask_invert (gimage);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -95,7 +94,7 @@ select_all_cmd_callback (GtkWidget *widget,
   return_if_no_image (gimage, data);
 
   gimp_image_mask_all (gimage);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -106,7 +105,7 @@ select_none_cmd_callback (GtkWidget *widget,
   return_if_no_image (gimage, data);
 
   gimp_image_mask_none (gimage);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -117,7 +116,7 @@ select_float_cmd_callback (GtkWidget *widget,
   return_if_no_image (gimage, data);
 
   gimp_image_mask_float (gimage, gimp_image_active_drawable (gimage), 0, 0);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -150,7 +149,7 @@ select_sharpen_cmd_callback (GtkWidget *widget,
   return_if_no_image (gimage, data);
 
   gimp_image_mask_sharpen (gimage);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -240,7 +239,7 @@ select_save_cmd_callback (GtkWidget *widget,
   return_if_no_image (gimage, data);
 
   gimp_image_mask_save (gimage);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 
@@ -276,7 +275,7 @@ gimp_image_mask_feather_callback (GtkWidget *widget,
     }
 
   gimp_image_mask_feather (gimage, radius_x, radius_y);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 static void
@@ -309,7 +308,7 @@ gimp_image_mask_border_callback (GtkWidget *widget,
     }
 
   gimp_image_mask_border (gimage, radius_x, radius_y);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 static void
@@ -342,7 +341,7 @@ gimp_image_mask_grow_callback (GtkWidget *widget,
     }
 
   gimp_image_mask_grow (gimage, radius_x, radius_y);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 static void
@@ -380,5 +379,5 @@ gimp_image_mask_shrink_callback (GtkWidget *widget,
 
   gimp_image_mask_shrink (gimage, radius_x, radius_y,
                           selection_shrink_edge_lock);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
diff --git a/app/gui/vectors-commands.c b/app/gui/vectors-commands.c
index ac2abbc3b9..93b613a5db 100644
--- a/app/gui/vectors-commands.c
+++ b/app/gui/vectors-commands.c
@@ -41,8 +41,6 @@
 
 #include "vectors/gimpvectors.h"
 
-#include "display/gimpdisplay-foreach.h"
-
 #include "widgets/gimpitemfactory.h"
 #include "widgets/gimpwidgets-utils.h"
 
@@ -92,7 +90,7 @@ vectors_raise_vectors_cmd_callback (GtkWidget *widget,
   return_if_no_vectors (gimage, active_vectors);
 
   gimp_image_raise_vectors (gimage, active_vectors);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -104,7 +102,7 @@ vectors_lower_vectors_cmd_callback (GtkWidget *widget,
   return_if_no_vectors (gimage, active_vectors);
 
   gimp_image_lower_vectors (gimage, active_vectors);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -122,7 +120,7 @@ vectors_duplicate_vectors_cmd_callback (GtkWidget *widget,
                                    G_TYPE_FROM_INSTANCE (active_vectors),
                                    TRUE);
   gimp_image_add_vectors (gimage, new_vectors, -1);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 #endif
 }
 
@@ -135,7 +133,7 @@ vectors_delete_vectors_cmd_callback (GtkWidget *widget,
   return_if_no_vectors (gimage, active_vectors);
 
   gimp_image_remove_vectors (gimage, active_vectors);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 static void
@@ -152,7 +150,7 @@ vectors_vectors_to_sel (GtkWidget      *widget,
                                   op,
                                   TRUE,
                                   FALSE, 0, 0);
-  gdisplays_flush ();
+  gimp_image_flush (gimage);
 }
 
 void
@@ -324,7 +322,7 @@ vectors_stroke_vectors (GimpVectors *vectors)
 
       g_object_unref (G_OBJECT (core));
 
-      gdisplays_flush ();
+      gimp_image_flush (gimage);
     }
 }
 
@@ -396,7 +394,7 @@ new_vectors_query_ok_callback (GtkWidget *widget,
 
       gimp_object_set_name (GIMP_OBJECT (new_vectors), vectors_name);
 
-      gdisplays_flush ();
+      gimp_image_flush (gimage);
     }
 
   gtk_widget_destroy (options->query_box);
@@ -427,13 +425,13 @@ vectors_new_vectors_query (GimpImage   *gimage,
 
       /* undo_push_group_end (gimage); */
 
-      gdisplays_flush ();
+      gimp_image_flush (gimage);
       return;
     }
 
   /*  the new options structure  */
   options = g_new (NewVectorsOptions, 1);
-  options->gimage      = gimage;
+  options->gimage = gimage;
   
   /*  The dialog  */
   options->query_box =
diff --git a/app/image_map.c b/app/image_map.c
index 2ab024c8c9..49b66ce2d9 100644
--- a/app/image_map.c
+++ b/app/image_map.c
@@ -32,7 +32,6 @@
 #include "core/gimpimage.h"
 
 #include "display/gimpdisplay.h"
-#include "display/gimpdisplay-foreach.h"
 #include "display/gimpdisplayshell.h"
 
 #include "image_map.h"
@@ -434,7 +433,7 @@ image_map_do (gpointer data)
   if (image_map->PRI == NULL)
     {
       image_map->state = IMAGE_MAP_WAITING;
-      gdisplays_flush ();
+      gimp_image_flush (image_map->gdisp->gimage);
 
       return FALSE;
     }
diff --git a/app/paint/gimpairbrush.c b/app/paint/gimpairbrush.c
index e5232794cf..1350b28bad 100644
--- a/app/paint/gimpairbrush.c
+++ b/app/paint/gimpairbrush.c
@@ -219,10 +219,7 @@ gimp_airbrush_timeout (gpointer client_data)
                         airbrush_timeout.drawable,
                         airbrush_timeout.paint_options);
 
-#ifdef __GNUC__
-#warning: FIXME: gdisplays_flush()
-#endif
-  gdisplays_flush ();
+  gimp_image_flush (gimp_item_get_image (GIMP_ITEM (airbrush_timeout.drawable)));
 
   rate = ((GimpAirbrushOptions *) airbrush_timeout.paint_options)->rate;
 
diff --git a/app/paint/gimpink.c b/app/paint/gimpink.c
index 5d613f07b3..07ae1e32a8 100644
--- a/app/paint/gimpink.c
+++ b/app/paint/gimpink.c
@@ -45,7 +45,6 @@
 #include "paint/gimppaintoptions.h"
 
 #include "display/gimpdisplay.h"
-#include "display/gimpdisplay-foreach.h"
 
 #include "gimpinktool.h"
 #include "gimpinktool-blob.h"
@@ -443,7 +442,7 @@ gimp_ink_tool_button_release (GimpTool        *tool,
   ink_tool->last_blob = NULL;
 
   ink_finish (ink_tool, gimp_image_active_drawable (gdisp->gimage));
-  gdisplays_flush ();
+  gimp_image_flush (gdisp->gimage);
 }
 
 static void
diff --git a/app/pdb/display_cmds.c b/app/pdb/display_cmds.c
index 70e2c5b8e8..f1b0595143 100644
--- a/app/pdb/display_cmds.c
+++ b/app/pdb/display_cmds.c
@@ -154,7 +154,7 @@ static Argument *
 displays_flush_invoker (Gimp     *gimp,
                         Argument *args)
 {
-  gdisplays_flush ();
+  gimp_displays_flush (gimp);
   return procedural_db_return_args (&displays_flush_proc, TRUE);
 }
 
diff --git a/app/tools/gimpbezierselecttool.c b/app/tools/gimpbezierselecttool.c
index 66e3a6e706..30df5d1ad0 100644
--- a/app/tools/gimpbezierselecttool.c
+++ b/app/tools/gimpbezierselecttool.c
@@ -43,7 +43,6 @@
 #include "pdb/procedural_db.h"
 
 #include "display/gimpdisplay.h"
-#include "display/gimpdisplay-foreach.h"
 
 #include "gui/paths-dialog.h"
 
@@ -2914,7 +2913,7 @@ bezier_to_sel_internal (GimpBezierSelectTool *bezier_sel,
                                   sel_options->feather_radius);
   
   /*  show selection on all views  */
-  gdisplays_flush ();
+  gimp_image_flush (gdisp->gimage);
 }
 
 static gboolean
@@ -3475,7 +3474,7 @@ bezier_stroke (GimpBezierSelectTool *bezier_sel,
 
   /*  End an undo group  */
   undo_push_group_end (gdisp->gimage);
-  gdisplays_flush ();
+  gimp_image_flush (gdisp->gimage);
 }
 
 static void
diff --git a/app/tools/gimpblendtool.c b/app/tools/gimpblendtool.c
index c08f9a4018..42a28c9d1d 100644
--- a/app/tools/gimpblendtool.c
+++ b/app/tools/gimpblendtool.c
@@ -38,7 +38,6 @@
 #include "paint/gimppaintoptions.h"
 
 #include "display/gimpdisplay.h"
-#include "display/gimpdisplay-foreach.h"
 #include "display/gimpprogress.h"
 
 #include "widgets/gimpdnd.h"
@@ -314,7 +313,7 @@ gimp_blend_tool_button_release (GimpTool        *tool,
       if (progress)
 	gimp_progress_end (progress);
 
-      gdisplays_flush ();
+      gimp_image_flush (gimage);
     }
 }
 
diff --git a/app/tools/gimpbrightnesscontrasttool.c b/app/tools/gimpbrightnesscontrasttool.c
index 1830417572..d46c7ed775 100644
--- a/app/tools/gimpbrightnesscontrasttool.c
+++ b/app/tools/gimpbrightnesscontrasttool.c
@@ -32,7 +32,6 @@
 #include "core/gimpimage.h"
 
 #include "display/gimpdisplay.h"
-#include "display/gimpdisplay-foreach.h"
 
 #include "gimpbrightnesscontrasttool.h"
 #include "tool_manager.h"
@@ -481,7 +480,7 @@ brightness_contrast_cancel_callback (GtkWidget *widget,
       gimp_tool_control_set_preserve (active_tool->control, FALSE);
 
       bcd->image_map = NULL;
-      gdisplays_flush ();
+      gimp_image_flush (active_tool->gdisp->gimage);
     }
 
   active_tool->gdisp    = NULL;
@@ -512,7 +511,8 @@ brightness_contrast_preview_update (GtkWidget *widget,
 	  gimp_tool_control_set_preserve (active_tool->control, TRUE);
 	  image_map_clear (bcd->image_map);
 	  gimp_tool_control_set_preserve (active_tool->control, FALSE);
-	  gdisplays_flush ();
+
+          gimp_image_flush (active_tool->gdisp->gimage);
 	}
     }
 }
diff --git a/app/tools/gimpbrushtool.c b/app/tools/gimpbrushtool.c
index b9d781cebe..e0c7d00522 100644
--- a/app/tools/gimpbrushtool.c
+++ b/app/tools/gimpbrushtool.c
@@ -40,7 +40,6 @@
 #include "widgets/gimpdevices.h"
 
 #include "display/gimpdisplay.h"
-#include "display/gimpdisplay-foreach.h"
 #include "display/gimpdisplayshell.h"
 #include "display/gimpstatusbar.h"
 
@@ -420,7 +419,7 @@ gimp_paint_tool_button_release (GimpTool        *tool,
 
   gimp_paint_core_finish (core, drawable);
 
-  gdisplays_flush ();
+  gimp_image_flush (gdisp->gimage);
 }
 
 static void
diff --git a/app/tools/gimpbucketfilltool.c b/app/tools/gimpbucketfilltool.c
index 46e205d877..9cc8e02559 100644
--- a/app/tools/gimpbucketfilltool.c
+++ b/app/tools/gimpbucketfilltool.c
@@ -36,7 +36,6 @@
 #include "paint/gimppaintoptions.h"
 
 #include "display/gimpdisplay.h"
-#include "display/gimpdisplay-foreach.h"
 
 #include "widgets/gimpenummenu.h"
 
@@ -243,7 +242,7 @@ gimp_bucket_fill_tool_button_release (GimpTool        *tool,
                                  bucket_tool->target_x,
                                  bucket_tool->target_y);
 
-      gdisplays_flush ();
+      gimp_image_flush (gdisp->gimage);
     }
 
   gimp_tool_control_halt (tool->control);    /* sets paused_count to 0 -- is this ok? */
diff --git a/app/tools/gimpbycolorselecttool.c b/app/tools/gimpbycolorselecttool.c
index 6483479687..c8b4a9c445 100644
--- a/app/tools/gimpbycolorselecttool.c
+++ b/app/tools/gimpbycolorselecttool.c
@@ -53,7 +53,6 @@
 #include "widgets/gimpdnd.h"
 
 #include "display/gimpdisplay.h"
-#include "display/gimpdisplay-foreach.h"
 
 #include "gimpbycolorselecttool.h"
 #include "selection_options.h"
@@ -415,7 +414,7 @@ by_color_select_button_release (GimpTool        *tool,
                                            sel_options->feather_radius);
 
 	  /*  show selection on all views  */
-	  gdisplays_flush ();
+	  gimp_image_flush (gdisp->gimage);
 
 	  /*  update the preview window  */
 	  by_color_select_render (by_color_dialog, gdisp->gimage);
@@ -767,7 +766,7 @@ by_color_select_invert_callback (GtkWidget *widget,
   gimp_image_mask_invert (bcd->gimage);
 
   /*  show selection on all views  */
-  gdisplays_flush ();
+  gimp_image_flush (bcd->gimage);
 
   /*  update the preview window  */
   by_color_select_render (bcd, bcd->gimage);
@@ -793,7 +792,7 @@ by_color_select_select_all_callback (GtkWidget *widget,
   gimp_image_mask_all (bcd->gimage);
 
   /*  show selection on all views  */
-  gdisplays_flush ();
+  gimp_image_flush (bcd->gimage);
 
   /*  update the preview window  */
   by_color_select_render (bcd, bcd->gimage);
@@ -819,7 +818,7 @@ by_color_select_select_none_callback (GtkWidget *widget,
   gimp_image_mask_clear (bcd->gimage);
 
   /*  show selection on all views  */
-  gdisplays_flush ();
+  gimp_image_flush (bcd->gimage);
 
   /*  update the preview window  */
   by_color_select_render (bcd, bcd->gimage);
@@ -937,7 +936,7 @@ by_color_select_preview_button_press (ByColorDialog  *bcd,
                                    sel_options->feather_radius);
 
   /*  show selection on all views  */
-  gdisplays_flush ();
+  gimp_image_flush (bcd->gimage);
 
   /*  update the preview window  */
   by_color_select_render (bcd, bcd->gimage);
@@ -976,7 +975,7 @@ by_color_select_color_drop (GtkWidget     *widget,
                                    sel_options->feather_radius);
 
   /*  show selection on all views  */
-  gdisplays_flush ();
+  gimp_image_flush (bcd->gimage);
 
   /*  update the preview window  */
   by_color_select_render (bcd, bcd->gimage);
diff --git a/app/tools/gimpcolorbalancetool.c b/app/tools/gimpcolorbalancetool.c
index defa024b2c..065dd5cb95 100644
--- a/app/tools/gimpcolorbalancetool.c
+++ b/app/tools/gimpcolorbalancetool.c
@@ -32,7 +32,6 @@
 #include "core/gimpimage.h"
 
 #include "display/gimpdisplay.h"
-#include "display/gimpdisplay-foreach.h"
 
 #include "widgets/gimpenummenu.h"
 
@@ -617,7 +616,7 @@ color_balance_cancel_callback (GtkWidget *widget,
       image_map_abort (cbd->image_map);
       gimp_tool_control_set_preserve (active_tool->control, FALSE);
 
-      gdisplays_flush ();
+      gimp_image_flush (active_tool->gdisp->gimage);
       cbd->image_map = NULL;
     }
 
@@ -677,7 +676,8 @@ color_balance_preview_update (GtkWidget *widget,
 	  gimp_tool_control_set_preserve (active_tool->control, TRUE);
 	  image_map_clear (cbd->image_map);
 	  gimp_tool_control_set_preserve (active_tool->control, FALSE);
-	  gdisplays_flush ();
+
+	  gimp_image_flush (active_tool->gdisp->gimage);
 	}
     }
 }
diff --git a/app/tools/gimpcurvestool.c b/app/tools/gimpcurvestool.c
index 7ae90db49c..5b1a08d145 100644
--- a/app/tools/gimpcurvestool.c
+++ b/app/tools/gimpcurvestool.c
@@ -45,7 +45,6 @@
 #include "widgets/gimpenummenu.h"
 
 #include "display/gimpdisplay.h"
-#include "display/gimpdisplay-foreach.h"
 
 #include "gimpcurvestool.h"
 #include "tool_manager.h"
@@ -1414,7 +1413,7 @@ curves_cancel_callback (GtkWidget *widget,
       image_map_abort (cd->image_map);
       gimp_tool_control_set_preserve (active_tool->control, FALSE);
 
-      gdisplays_flush ();
+      gimp_image_flush (active_tool->gdisp->gimage);
       cd->image_map = NULL;
     }
 
@@ -1476,7 +1475,8 @@ curves_preview_update (GtkWidget *widget,
 	  gimp_tool_control_set_preserve (active_tool->control, TRUE);
 	  image_map_clear (cd->image_map);
 	  gimp_tool_control_set_preserve (active_tool->control, FALSE);
-	  gdisplays_flush ();
+
+	  gimp_image_flush (active_tool->gdisp->gimage);
 	}
     }
 }
diff --git a/app/tools/gimpeditselectiontool.c b/app/tools/gimpeditselectiontool.c
index 3c6f8d61f0..01470750a7 100644
--- a/app/tools/gimpeditselectiontool.c
+++ b/app/tools/gimpeditselectiontool.c
@@ -40,7 +40,6 @@
 #include "core/gimplist.h"
 
 #include "display/gimpdisplay.h"
-#include "display/gimpdisplay-foreach.h"
 #include "display/gimpdisplayshell.h"
 #include "display/gimpdisplayshell-selection.h"
 
@@ -391,7 +390,7 @@ gimp_edit_selection_tool_button_release (GimpTool        *tool,
       undo_pop (gdisp->gimage);
     }
 
-  gdisplays_flush ();
+  gimp_image_flush (gdisp->gimage);
 
   g_object_unref (G_OBJECT (edit_select));
 }
@@ -942,5 +941,5 @@ gimp_edit_selection_tool_arrow_key (GimpTool    *tool,
     }
 
   undo_push_group_end (gdisp->gimage);
-  gdisplays_flush ();
+  gimp_image_flush (gdisp->gimage);
 }
diff --git a/app/tools/gimpfreeselecttool.c b/app/tools/gimpfreeselecttool.c
index 252d62612c..539793fc67 100644
--- a/app/tools/gimpfreeselecttool.c
+++ b/app/tools/gimpfreeselecttool.c
@@ -37,7 +37,6 @@
 #include "core/gimptoolinfo.h"
 
 #include "display/gimpdisplay.h"
-#include "display/gimpdisplay-foreach.h"
 
 #include "gimpeditselectiontool.h"
 #include "gimpfreeselecttool.h"
@@ -247,7 +246,7 @@ gimp_free_select_tool_button_release (GimpTool        *tool,
 	  else
 	    gimp_image_mask_clear (gdisp->gimage);
 
-	  gdisplays_flush ();
+	  gimp_image_flush (gdisp->gimage);
 	  return;
 	}
 
@@ -260,7 +259,7 @@ gimp_free_select_tool_button_release (GimpTool        *tool,
                                       sel_options->feather_radius,
                                       sel_options->feather_radius);
 
-      gdisplays_flush ();
+      gimp_image_flush (gdisp->gimage);
     }
 }
 
diff --git a/app/tools/gimpfuzzyselecttool.c b/app/tools/gimpfuzzyselecttool.c
index 93c6e4e5eb..7bd428ba91 100644
--- a/app/tools/gimpfuzzyselecttool.c
+++ b/app/tools/gimpfuzzyselecttool.c
@@ -41,7 +41,6 @@
 #include "core/gimptoolinfo.h"
 
 #include "display/gimpdisplay.h"
-#include "display/gimpdisplay-foreach.h"
 #include "display/gimpdisplayshell.h"
 
 #include "gimpeditselectiontool.h"
@@ -270,7 +269,7 @@ gimp_fuzzy_select_tool_button_release (GimpTool        *tool,
 	  else
 	    gimp_image_mask_clear (gdisp->gimage);
 
-	  gdisplays_flush ();
+	  gimp_image_flush (gdisp->gimage);
 	  return;
 	}
 
@@ -300,7 +299,7 @@ gimp_fuzzy_select_tool_button_release (GimpTool        *tool,
       g_object_unref (G_OBJECT (fuzzy_sel->fuzzy_mask));
       fuzzy_sel->fuzzy_mask = NULL;
 
-      gdisplays_flush ();
+      gimp_image_flush (gdisp->gimage);
     }
 
   /*  If the segment array is allocated, free it  */
diff --git a/app/tools/gimphuesaturationtool.c b/app/tools/gimphuesaturationtool.c
index 0ac305b6d0..4e9bca1f4a 100644
--- a/app/tools/gimphuesaturationtool.c
+++ b/app/tools/gimphuesaturationtool.c
@@ -38,7 +38,6 @@
 #include "core/gimpimage-mask.h"
 
 #include "display/gimpdisplay.h"
-#include "display/gimpdisplay-foreach.h"
 
 #include "gimphuesaturationtool.h"
 #include "tool_manager.h"
@@ -789,7 +788,7 @@ hue_saturation_cancel_callback (GtkWidget *widget,
       image_map_abort (hsd->image_map);
       gimp_tool_control_set_preserve (active_tool->control, FALSE);
 
-      gdisplays_flush ();
+      gimp_image_flush (active_tool->gdisp->gimage);
       hsd->image_map = NULL;
     }
 
@@ -837,7 +836,8 @@ hue_saturation_preview_update (GtkWidget *widget,
 	  gimp_tool_control_set_preserve (active_tool->control, TRUE);
 	  image_map_clear (hsd->image_map);
 	  gimp_tool_control_set_preserve (active_tool->control, FALSE);
-	  gdisplays_flush ();
+
+	  gimp_image_flush (active_tool->gdisp->gimage);
 	}
     }
 }
diff --git a/app/tools/gimpinktool.c b/app/tools/gimpinktool.c
index 5d613f07b3..07ae1e32a8 100644
--- a/app/tools/gimpinktool.c
+++ b/app/tools/gimpinktool.c
@@ -45,7 +45,6 @@
 #include "paint/gimppaintoptions.h"
 
 #include "display/gimpdisplay.h"
-#include "display/gimpdisplay-foreach.h"
 
 #include "gimpinktool.h"
 #include "gimpinktool-blob.h"
@@ -443,7 +442,7 @@ gimp_ink_tool_button_release (GimpTool        *tool,
   ink_tool->last_blob = NULL;
 
   ink_finish (ink_tool, gimp_image_active_drawable (gdisp->gimage));
-  gdisplays_flush ();
+  gimp_image_flush (gdisp->gimage);
 }
 
 static void
diff --git a/app/tools/gimpiscissorstool.c b/app/tools/gimpiscissorstool.c
index d4d0b9a559..7b2c7e750f 100644
--- a/app/tools/gimpiscissorstool.c
+++ b/app/tools/gimpiscissorstool.c
@@ -72,7 +72,6 @@
 #include "core/gimptoolinfo.h"
 
 #include "display/gimpdisplay.h"
-#include "display/gimpdisplay-foreach.h"
 
 #include "gimpbezierselecttool.h"
 #include "gimpiscissorstool.h"
@@ -501,7 +500,7 @@ gimp_iscissors_tool_button_press (GimpTool        *tool,
 
 	  gimp_iscissors_tool_reset (iscissors);
 
-	  gdisplays_flush ();
+	  gimp_image_flush (gdisp->gimage);
 	}
       else if (! iscissors->connected)
 	{
diff --git a/app/tools/gimplevelstool.c b/app/tools/gimplevelstool.c
index 4d9669dbdf..5d39c490f5 100644
--- a/app/tools/gimplevelstool.c
+++ b/app/tools/gimplevelstool.c
@@ -48,7 +48,6 @@
 #include "widgets/gimphistogramview.h"
 
 #include "display/gimpdisplay.h"
-#include "display/gimpdisplay-foreach.h"
 
 #include "gimplevelstool.h"
 #include "tool_manager.h"
@@ -1134,7 +1133,7 @@ levels_cancel_callback (GtkWidget *widget,
       image_map_abort (ld->image_map);
       gimp_tool_control_set_preserve (active_tool->control, FALSE);
 
-      gdisplays_flush ();
+      gimp_image_flush (active_tool->gdisp->gimage);
       ld->image_map = NULL;
     }
 
@@ -1225,7 +1224,8 @@ levels_preview_update (GtkWidget *widget,
 	  gimp_tool_control_set_preserve (active_tool->control, TRUE);
 	  image_map_clear (ld->image_map);
 	  gimp_tool_control_set_preserve (active_tool->control, FALSE);
-	  gdisplays_flush ();
+
+	  gimp_image_flush (active_tool->gdisp->gimage);
 	}
     }
 
diff --git a/app/tools/gimpmeasuretool.c b/app/tools/gimpmeasuretool.c
index 6f80ac7ac0..0799d08789 100644
--- a/app/tools/gimpmeasuretool.c
+++ b/app/tools/gimpmeasuretool.c
@@ -39,7 +39,6 @@
 #include "core/gimptoolinfo.h"
 
 #include "display/gimpdisplay.h"
-#include "display/gimpdisplay-foreach.h"
 #include "display/gimpdisplayshell.h"
 
 #include "gui/info-dialog.h"
@@ -317,7 +316,7 @@ gimp_measure_tool_button_press (GimpTool        *tool,
 		    undo_push_group_end (gdisp->gimage);
 
 		  if (create_hguide || create_vguide)
-                    gdisplays_flush ();
+                    gimp_image_flush (gdisp->gimage);
 
 		  measure_tool->function = GUIDING;
 		  break;
diff --git a/app/tools/gimpmovetool.c b/app/tools/gimpmovetool.c
index 0f50c05a73..c5733f1ad5 100644
--- a/app/tools/gimpmovetool.c
+++ b/app/tools/gimpmovetool.c
@@ -367,7 +367,7 @@ gimp_move_tool_button_release (GimpTool        *tool,
 	}
 
       gimp_display_shell_selection_visibility (shell, GIMP_SELECTION_RESUME);
-      gdisplays_flush ();
+      gimp_image_flush (gdisp->gimage);
 
       if (move->guide)
 	gimp_display_shell_draw_guide (shell, move->guide, TRUE);
@@ -380,7 +380,7 @@ gimp_move_tool_button_release (GimpTool        *tool,
 	  if (move->layer)
 	    {
 	      floating_sel_anchor (move->layer);
-	      gdisplays_flush ();
+	      gimp_image_flush (gdisp->gimage);
 	    }
 	}
     }
diff --git a/app/tools/gimppainttool.c b/app/tools/gimppainttool.c
index b9d781cebe..e0c7d00522 100644
--- a/app/tools/gimppainttool.c
+++ b/app/tools/gimppainttool.c
@@ -40,7 +40,6 @@
 #include "widgets/gimpdevices.h"
 
 #include "display/gimpdisplay.h"
-#include "display/gimpdisplay-foreach.h"
 #include "display/gimpdisplayshell.h"
 #include "display/gimpstatusbar.h"
 
@@ -420,7 +419,7 @@ gimp_paint_tool_button_release (GimpTool        *tool,
 
   gimp_paint_core_finish (core, drawable);
 
-  gdisplays_flush ();
+  gimp_image_flush (gdisp->gimage);
 }
 
 static void
diff --git a/app/tools/gimpposterizetool.c b/app/tools/gimpposterizetool.c
index 8b31aa679b..2234343e56 100644
--- a/app/tools/gimpposterizetool.c
+++ b/app/tools/gimpposterizetool.c
@@ -31,7 +31,6 @@
 #include "core/gimpimage.h"
 
 #include "display/gimpdisplay.h"
-#include "display/gimpdisplay-foreach.h"
 
 #include "gimpposterizetool.h"
 #include "tool_manager.h"
@@ -396,7 +395,7 @@ posterize_cancel_callback (GtkWidget *widget,
       gimp_tool_control_set_preserve (active_tool->control, FALSE);
 
       pd->image_map = NULL;
-      gdisplays_flush ();
+      gimp_image_flush (active_tool->gdisp->gimage);
     }
 
   active_tool->gdisp    = NULL;
@@ -427,7 +426,8 @@ posterize_preview_update (GtkWidget *widget,
 	  gimp_tool_control_set_preserve (active_tool->control, TRUE);
 	  image_map_clear (pd->image_map);
 	  gimp_tool_control_set_preserve (active_tool->control, FALSE);
-	  gdisplays_flush ();
+
+	  gimp_image_flush (active_tool->gdisp->gimage);
 	}
     }
 }
diff --git a/app/tools/gimprectselecttool.c b/app/tools/gimprectselecttool.c
index bec374a5d1..7d2ca3e165 100644
--- a/app/tools/gimprectselecttool.c
+++ b/app/tools/gimprectselecttool.c
@@ -38,7 +38,6 @@
 #include "core/gimptoolinfo.h"
 
 #include "display/gimpdisplay.h"
-#include "display/gimpdisplay-foreach.h"
 
 #include "gimpeditselectiontool.h"
 #include "gimprectselecttool.h"
@@ -292,7 +291,7 @@ gimp_rect_select_tool_button_release (GimpTool        *tool,
           else
             gimp_image_mask_clear (gdisp->gimage);
 
-          gdisplays_flush ();
+          gimp_image_flush (gdisp->gimage);
           return;
         }
 
@@ -305,7 +304,7 @@ gimp_rect_select_tool_button_release (GimpTool        *tool,
                                          x1, y1, (x2 - x1), (y2 - y1));
 
       /*  show selection on all views  */
-      gdisplays_flush ();
+      gimp_image_flush (gdisp->gimage);
     }
 }
 
diff --git a/app/tools/gimpregionselecttool.c b/app/tools/gimpregionselecttool.c
index 93c6e4e5eb..7bd428ba91 100644
--- a/app/tools/gimpregionselecttool.c
+++ b/app/tools/gimpregionselecttool.c
@@ -41,7 +41,6 @@
 #include "core/gimptoolinfo.h"
 
 #include "display/gimpdisplay.h"
-#include "display/gimpdisplay-foreach.h"
 #include "display/gimpdisplayshell.h"
 
 #include "gimpeditselectiontool.h"
@@ -270,7 +269,7 @@ gimp_fuzzy_select_tool_button_release (GimpTool        *tool,
 	  else
 	    gimp_image_mask_clear (gdisp->gimage);
 
-	  gdisplays_flush ();
+	  gimp_image_flush (gdisp->gimage);
 	  return;
 	}
 
@@ -300,7 +299,7 @@ gimp_fuzzy_select_tool_button_release (GimpTool        *tool,
       g_object_unref (G_OBJECT (fuzzy_sel->fuzzy_mask));
       fuzzy_sel->fuzzy_mask = NULL;
 
-      gdisplays_flush ();
+      gimp_image_flush (gdisp->gimage);
     }
 
   /*  If the segment array is allocated, free it  */
diff --git a/app/tools/gimptexttool.c b/app/tools/gimptexttool.c
index f3f5e836d5..eaf1e7e8da 100644
--- a/app/tools/gimptexttool.c
+++ b/app/tools/gimptexttool.c
@@ -44,7 +44,6 @@
 #include "widgets/gimpfontselection.h"
 
 #include "display/gimpdisplay.h"
-#include "display/gimpdisplay-foreach.h"
 
 #include "gimpeditselectiontool.h"
 #include "gimptexttool.h"
@@ -364,7 +363,7 @@ text_tool_render (GimpTextTool *text_tool)
 
   g_free (fontname);
 
-  gdisplays_flush ();
+  gimp_image_flush (gdisp->gimage);
 }
 
 GimpLayer *
diff --git a/app/tools/gimpthresholdtool.c b/app/tools/gimpthresholdtool.c
index f452a22929..7b06403102 100644
--- a/app/tools/gimpthresholdtool.c
+++ b/app/tools/gimpthresholdtool.c
@@ -36,7 +36,6 @@
 #include "widgets/gimphistogramview.h"
 
 #include "display/gimpdisplay.h"
-#include "display/gimpdisplay-foreach.h"
 
 #include "gimpthresholdtool.h"
 #include "tool_manager.h"
@@ -533,7 +532,7 @@ threshold_cancel_callback (GtkWidget *widget,
       gimp_tool_control_set_preserve (active_tool->control, FALSE);
 
       td->image_map = NULL;
-      gdisplays_flush ();
+      gimp_image_flush (active_tool->gdisp->gimage);
     }
 
   active_tool->gdisp    = NULL;
@@ -564,7 +563,8 @@ threshold_preview_update (GtkWidget *widget,
 	  gimp_tool_control_set_preserve (active_tool->control, TRUE);
 	  image_map_clear (td->image_map);
 	  gimp_tool_control_set_preserve (active_tool->control, FALSE);
-	  gdisplays_flush ();
+
+	  gimp_image_flush (active_tool->gdisp->gimage);
 	}
     }
 }
diff --git a/app/tools/gimptransformtool.c b/app/tools/gimptransformtool.c
index 7d1e6ad458..d1613ffd21 100644
--- a/app/tools/gimptransformtool.c
+++ b/app/tools/gimptransformtool.c
@@ -785,7 +785,7 @@ gimp_transform_tool_doit (GimpTransformTool  *tr_tool,
 
   gimp_unset_busy (gdisp->gimage->gimp);
 
-  gdisplays_flush ();
+  gimp_image_flush (gdisp->gimage);
 
   gimp_transform_tool_reset (tr_tool, gdisp);
 }
diff --git a/app/tools/gimpvectortool.c b/app/tools/gimpvectortool.c
index 81ae960f8e..ed065d99e7 100644
--- a/app/tools/gimpvectortool.c
+++ b/app/tools/gimpvectortool.c
@@ -34,6 +34,7 @@
 #include "core/gimp.h"
 #include "core/gimpcontext.h"
 #include "core/gimpimage.h"
+#include "core/gimplist.h"
 #include "core/gimptoolinfo.h"
 
 #include "vectors/gimpanchor.h"
@@ -517,11 +518,13 @@ gimp_vector_tool_set_vectors (GimpVectorTool *vector_tool,
 
       if (gdisp->gimage != item->gimage)
         {
-          GSList *list;
+          GList *list;
 
           gdisp = NULL;
 
-          for (list = display_list; list; list = g_slist_next (list))
+          for (list = GIMP_LIST (item->gimage->gimp->displays)->list;
+               list;
+               list = g_list_next (list))
             {
               if (((GimpDisplay *) list->data)->gimage == item->gimage)
                 {
diff --git a/app/undo_history.c b/app/undo_history.c
index cc2120520c..468bebc2f9 100644
--- a/app/undo_history.c
+++ b/app/undo_history.c
@@ -66,8 +66,6 @@
 
 #include "file/file-utils.h"
 
-#include "display/gimpdisplay-foreach.h"
-
 #include "gimprc.h"
 #include "undo.h"
 #include "undo_types.h"
@@ -523,9 +521,7 @@ undo_history_undo_callback (GtkWidget *widget,
   undo_history_st *st = data;
 
   if (undo_pop (st->gimage))
-    {
-      gdisplays_flush ();
-    }
+    gimp_image_flush (st->gimage);
 }
 
 /* redo button clicked */
@@ -536,9 +532,7 @@ undo_history_redo_callback (GtkWidget *widget,
   undo_history_st *st = data;
 
   if (undo_redo (st->gimage))
-    {
-      gdisplays_flush ();
-    }
+    gimp_image_flush (st->gimage);
 }
 
 
@@ -705,13 +699,15 @@ undo_history_select_row_callback (GtkWidget *widget,
       st->old_selection++;
     }
 
-  gdisplays_flush ();
+  gimp_image_flush (st->gimage);
 
-  undo_history_set_pixmap (GTK_CLIST (widget), cur_selection, st->preview_size, st->gimage);
+  undo_history_set_pixmap (GTK_CLIST (widget),
+                           cur_selection, st->preview_size, st->gimage);
 
   /*  if the image is clean, set the clean pixmap  */ 
   if (st->gimage->dirty == 0)
-    gtk_clist_set_pixmap (GTK_CLIST (widget), cur_selection, 1, clean_pixmap, clean_mask);
+    gtk_clist_set_pixmap (GTK_CLIST (widget),
+                          cur_selection, 1, clean_pixmap, clean_mask);
 
   g_signal_handlers_unblock_by_func (G_OBJECT (st->gimage),
                                      undo_history_undo_event, st);    
diff --git a/app/widgets/gimpbufferview.c b/app/widgets/gimpbufferview.c
index a587c4ae20..13b1719971 100644
--- a/app/widgets/gimpbufferview.c
+++ b/app/widgets/gimpbufferview.c
@@ -27,17 +27,12 @@
 
 #include "widgets-types.h"
 
-#warning FIXME #include "display/display-types.h"
-#include "display/display-types.h"
-
 #include "core/gimpbuffer.h"
 #include "core/gimpcontainer.h"
 #include "core/gimpcontext.h"
 #include "core/gimpedit.h"
 #include "core/gimpimage.h"
 
-#include "display/gimpdisplay-foreach.h"
-
 #include "gimpcontainerview.h"
 #include "gimpbufferview.h"
 #include "gimpdnd.h"
@@ -224,7 +219,7 @@ gimp_buffer_view_paste_clicked (GtkWidget      *widget,
 			   buffer,
 			   FALSE);
 
-	  gdisplays_flush ();
+	  gimp_image_flush (gimage);
 	}
     }
 }
@@ -254,7 +249,7 @@ gimp_buffer_view_paste_into_clicked (GtkWidget      *widget,
 			   buffer,
 			   TRUE);
 
-	  gdisplays_flush ();
+	  gimp_image_flush (gimage);
 	}
     }
 }
diff --git a/app/widgets/gimpchannellistview.c b/app/widgets/gimpchannellistview.c
index a857522aae..84e292bcd7 100644
--- a/app/widgets/gimpchannellistview.c
+++ b/app/widgets/gimpchannellistview.c
@@ -33,16 +33,11 @@
 
 #include "widgets-types.h"
 
-#warning FIXME #include "display/display-types.h"
-#include "display/display-types.h"
-
 #include "core/gimpchannel.h"
 #include "core/gimpcontainer.h"
 #include "core/gimpimage.h"
 #include "core/gimpimage-mask-select.h"
 
-#include "display/gimpdisplay-foreach.h"
-
 #include "gimpchannellistview.h"
 #include "gimpcomponentlistitem.h"
 #include "gimpdnd.h"
@@ -308,7 +303,8 @@ gimp_channel_list_view_toselection_extended_clicked (GtkWidget           *widget
 
   if (viewable)
     {
-      GimpChannelOps operation = GIMP_CHANNEL_OP_REPLACE;
+      GimpChannelOps  operation = GIMP_CHANNEL_OP_REPLACE;
+      GimpImage      *gimage;
 
       if (state & GDK_SHIFT_MASK)
 	{
@@ -322,12 +318,14 @@ gimp_channel_list_view_toselection_extended_clicked (GtkWidget           *widget
 	  operation = GIMP_CHANNEL_OP_SUBTRACT;
 	}
 
-      gimp_image_mask_select_channel (gimp_item_get_image (GIMP_ITEM (viewable)),
+      gimage = gimp_item_get_image (GIMP_ITEM (viewable));
+
+      gimp_image_mask_select_channel (gimage,
                                       GIMP_CHANNEL (viewable),
                                       0, 0,
                                       operation,
                                       FALSE, 0.0, 0.0);
-      gdisplays_flush ();
+      gimp_image_flush (gimage);
     }
 }
 
diff --git a/app/widgets/gimpchanneltreeview.c b/app/widgets/gimpchanneltreeview.c
index a857522aae..84e292bcd7 100644
--- a/app/widgets/gimpchanneltreeview.c
+++ b/app/widgets/gimpchanneltreeview.c
@@ -33,16 +33,11 @@
 
 #include "widgets-types.h"
 
-#warning FIXME #include "display/display-types.h"
-#include "display/display-types.h"
-
 #include "core/gimpchannel.h"
 #include "core/gimpcontainer.h"
 #include "core/gimpimage.h"
 #include "core/gimpimage-mask-select.h"
 
-#include "display/gimpdisplay-foreach.h"
-
 #include "gimpchannellistview.h"
 #include "gimpcomponentlistitem.h"
 #include "gimpdnd.h"
@@ -308,7 +303,8 @@ gimp_channel_list_view_toselection_extended_clicked (GtkWidget           *widget
 
   if (viewable)
     {
-      GimpChannelOps operation = GIMP_CHANNEL_OP_REPLACE;
+      GimpChannelOps  operation = GIMP_CHANNEL_OP_REPLACE;
+      GimpImage      *gimage;
 
       if (state & GDK_SHIFT_MASK)
 	{
@@ -322,12 +318,14 @@ gimp_channel_list_view_toselection_extended_clicked (GtkWidget           *widget
 	  operation = GIMP_CHANNEL_OP_SUBTRACT;
 	}
 
-      gimp_image_mask_select_channel (gimp_item_get_image (GIMP_ITEM (viewable)),
+      gimage = gimp_item_get_image (GIMP_ITEM (viewable));
+
+      gimp_image_mask_select_channel (gimage,
                                       GIMP_CHANNEL (viewable),
                                       0, 0,
                                       operation,
                                       FALSE, 0.0, 0.0);
-      gdisplays_flush ();
+      gimp_image_flush (gimage);
     }
 }
 
diff --git a/app/widgets/gimpcomponentlistitem.c b/app/widgets/gimpcomponentlistitem.c
index 79db390f08..7fcfd8d7ae 100644
--- a/app/widgets/gimpcomponentlistitem.c
+++ b/app/widgets/gimpcomponentlistitem.c
@@ -27,14 +27,9 @@
 
 #include "widgets-types.h"
 
-#warning FIXME #include "display/display-types.h"
-#include "display/display-types.h"
-
 #include "core/gimpimage.h"
 #include "core/gimpviewable.h"
 
-#include "display/gimpdisplay-foreach.h"
-
 #include "gimpcomponentlistitem.h"
 #include "gimpdnd.h"
 #include "gimpimagepreview.h"
@@ -273,7 +268,7 @@ gimp_component_list_item_eye_toggled (GtkWidget *widget,
 					 gimp_component_list_item_visibility_changed,
 					 list_item);
 
-      gdisplays_flush ();
+      gimp_image_flush (gimage);
     }
 }
 
diff --git a/app/widgets/gimpdocumentview.c b/app/widgets/gimpdocumentview.c
index 56bfbc6212..5a7f7c8c8d 100644
--- a/app/widgets/gimpdocumentview.c
+++ b/app/widgets/gimpdocumentview.c
@@ -32,6 +32,7 @@
 #warning FIXME #include "display/display-types.h"
 #include "display/display-types.h"
 
+#include "core/gimp.h"
 #include "core/gimpcontainer.h"
 #include "core/gimpcontext.h"
 #include "core/gimpedit.h"
@@ -41,7 +42,6 @@
 #include "file/file-open.h"
 
 #include "display/gimpdisplay.h"
-#include "display/gimpdisplay-foreach.h"
 
 #include "gui/file-open-dialog.h"
 
@@ -282,7 +282,9 @@ gimp_document_view_open_extended_clicked (GtkWidget        *widget,
           closure.name  = gimp_object_get_name (GIMP_OBJECT (imagefile));
           closure.found = FALSE;
 
-          gdisplays_foreach (gimp_document_view_raise_display, &closure);
+          gimp_container_foreach (editor->view->context->gimp->displays,
+                                  gimp_document_view_raise_display,
+                                  &closure);
 
           if (! closure.found)
             {
diff --git a/app/widgets/gimpdrawablelistitem.c b/app/widgets/gimpdrawablelistitem.c
index 09c0efa6fe..17b39882fe 100644
--- a/app/widgets/gimpdrawablelistitem.c
+++ b/app/widgets/gimpdrawablelistitem.c
@@ -32,12 +32,8 @@
 
 #include "widgets-types.h"
 
-#warning FIXME #include "display/display-types.h"
-#include "display/display-types.h"
-
 #include "core/gimpdrawable.h"
-
-#include "display/gimpdisplay-foreach.h"
+#include "core/gimpimage.h"
 
 #include "gimpdnd.h"
 #include "gimpdrawablelistitem.h"
@@ -210,7 +206,7 @@ gimp_drawable_list_item_eye_toggled (GtkWidget *widget,
 					 gimp_drawable_list_item_visibility_changed,
 					 list_item);
 
-      gdisplays_flush ();
+      gimp_image_flush (gimp_item_get_image (GIMP_ITEM (drawable)));
     }
 }
 
diff --git a/app/widgets/gimpdrawablelistview.c b/app/widgets/gimpdrawablelistview.c
index 7841f9920c..999338c431 100644
--- a/app/widgets/gimpdrawablelistview.c
+++ b/app/widgets/gimpdrawablelistview.c
@@ -33,9 +33,6 @@
 
 #include "widgets-types.h"
 
-#warning FIXME #include "display/display-types.h"
-#include "display/display-types.h"
-
 #include "core/gimpchannel.h"
 #include "core/gimpcontainer.h"
 #include "core/gimpdrawable.h"
@@ -43,8 +40,6 @@
 #include "core/gimplayer.h"
 #include "core/gimpmarshal.h"
 
-#include "display/gimpdisplay-foreach.h"
-
 #include "gimpchannellistview.h"
 #include "gimpdnd.h"
 #include "gimpdrawablelistview.h"
diff --git a/app/widgets/gimpdrawabletreeview.c b/app/widgets/gimpdrawabletreeview.c
index 7841f9920c..999338c431 100644
--- a/app/widgets/gimpdrawabletreeview.c
+++ b/app/widgets/gimpdrawabletreeview.c
@@ -33,9 +33,6 @@
 
 #include "widgets-types.h"
 
-#warning FIXME #include "display/display-types.h"
-#include "display/display-types.h"
-
 #include "core/gimpchannel.h"
 #include "core/gimpcontainer.h"
 #include "core/gimpdrawable.h"
@@ -43,8 +40,6 @@
 #include "core/gimplayer.h"
 #include "core/gimpmarshal.h"
 
-#include "display/gimpdisplay-foreach.h"
-
 #include "gimpchannellistview.h"
 #include "gimpdnd.h"
 #include "gimpdrawablelistview.h"
diff --git a/app/widgets/gimpimageview.c b/app/widgets/gimpimageview.c
index db3cdcac9a..a2b0d87294 100644
--- a/app/widgets/gimpimageview.c
+++ b/app/widgets/gimpimageview.c
@@ -27,17 +27,11 @@
 
 #include "widgets-types.h"
 
-#warning FIXME #include "display/display-types.h"
-#include "display/display-types.h"
-
 #include "core/gimp.h"
 #include "core/gimpcontainer.h"
 #include "core/gimpcontext.h"
 #include "core/gimpimage.h"
 
-#include "display/gimpdisplay.h"
-#include "display/gimpdisplay-foreach.h"
-
 #include "gimpcontainerview.h"
 #include "gimpimageview.h"
 #include "gimpdnd.h"
diff --git a/app/widgets/gimpitemlistitem.c b/app/widgets/gimpitemlistitem.c
index cc69b6bb97..715b7d27ce 100644
--- a/app/widgets/gimpitemlistitem.c
+++ b/app/widgets/gimpitemlistitem.c
@@ -32,13 +32,9 @@
 
 #include "widgets-types.h"
 
-#warning FIXME #include "display/display-types.h"
-#include "display/display-types.h"
-
+#include "core/gimpimage.h"
 #include "core/gimpitem.h"
 
-#include "display/gimpdisplay-foreach.h"
-
 #include "gimpdnd.h"
 #include "gimpitemlistitem.h"
 #include "gimpitemlistview.h"
@@ -160,8 +156,8 @@ gimp_item_list_item_drag_drop (GtkWidget      *widget,
                                         new_viewable,
                                         dest_index);
             }
-
-          gdisplays_flush ();
+          
+          gimp_image_flush (item_view->gimage);
         }
       else
         {
diff --git a/app/widgets/gimpitemlistview.c b/app/widgets/gimpitemlistview.c
index cb2a35f379..3bf93240d8 100644
--- a/app/widgets/gimpitemlistview.c
+++ b/app/widgets/gimpitemlistview.c
@@ -33,9 +33,6 @@
 
 #include "widgets-types.h"
 
-#warning FIXME #include "display/display-types.h"
-#include "display/display-types.h"
-
 #include "core/gimpchannel.h"
 #include "core/gimpcontainer.h"
 #include "core/gimpimage.h"
@@ -44,8 +41,6 @@
 
 #include "vectors/gimpvectors.h"
 
-#include "display/gimpdisplay-foreach.h"
-
 #include "gimpchannellistview.h"
 #include "gimpdnd.h"
 #include "gimpitemlistview.h"
@@ -468,7 +463,7 @@ gimp_item_list_view_select_item (GimpContainerView *view,
 	{
 	  list_view->set_item_func (list_view->gimage, item);
 
-	  gdisplays_flush ();
+	  gimp_image_flush (list_view->gimage);
 	}
 
       index = gimp_container_get_child_index (view->container,
@@ -584,7 +579,7 @@ gimp_item_list_view_duplicate_clicked (GtkWidget        *widget,
     {
       view->add_item_func (view->gimage, new_viewable, -1);
 
-      gdisplays_flush ();
+      gimp_image_flush (view->gimage);
     }
 }
 
@@ -608,7 +603,7 @@ gimp_item_list_view_raise_clicked (GtkWidget        *widget,
     {
       view->reorder_item_func (view->gimage, viewable, index - 1, TRUE);
 
-      gdisplays_flush ();
+      gimp_image_flush (view->gimage);
     }
 }
 
@@ -630,7 +625,7 @@ gimp_item_list_view_raise_extended_clicked (GtkWidget        *widget,
     {
       view->reorder_item_func (view->gimage, viewable, 0, TRUE);
 
-      gdisplays_flush ();
+      gimp_image_flush (view->gimage);
     }
 }
 
@@ -651,7 +646,7 @@ gimp_item_list_view_lower_clicked (GtkWidget        *widget,
     {
       view->reorder_item_func (view->gimage, viewable, index + 1, TRUE);
 
-      gdisplays_flush ();
+      gimp_image_flush (view->gimage);
     }
 }
 
@@ -674,7 +669,7 @@ gimp_item_list_view_lower_extended_clicked (GtkWidget        *widget,
       view->reorder_item_func (view->gimage, viewable,
                                container->num_children - 1, TRUE);
 
-      gdisplays_flush ();
+      gimp_image_flush (view->gimage);
     }
 }
 
@@ -705,7 +700,7 @@ gimp_item_list_view_delete_clicked (GtkWidget        *widget,
 
   view->remove_item_func (view->gimage, viewable);
 
-  gdisplays_flush ();
+  gimp_image_flush (view->gimage);
 }
 
 
diff --git a/app/widgets/gimpitemtreeview.c b/app/widgets/gimpitemtreeview.c
index cb2a35f379..3bf93240d8 100644
--- a/app/widgets/gimpitemtreeview.c
+++ b/app/widgets/gimpitemtreeview.c
@@ -33,9 +33,6 @@
 
 #include "widgets-types.h"
 
-#warning FIXME #include "display/display-types.h"
-#include "display/display-types.h"
-
 #include "core/gimpchannel.h"
 #include "core/gimpcontainer.h"
 #include "core/gimpimage.h"
@@ -44,8 +41,6 @@
 
 #include "vectors/gimpvectors.h"
 
-#include "display/gimpdisplay-foreach.h"
-
 #include "gimpchannellistview.h"
 #include "gimpdnd.h"
 #include "gimpitemlistview.h"
@@ -468,7 +463,7 @@ gimp_item_list_view_select_item (GimpContainerView *view,
 	{
 	  list_view->set_item_func (list_view->gimage, item);
 
-	  gdisplays_flush ();
+	  gimp_image_flush (list_view->gimage);
 	}
 
       index = gimp_container_get_child_index (view->container,
@@ -584,7 +579,7 @@ gimp_item_list_view_duplicate_clicked (GtkWidget        *widget,
     {
       view->add_item_func (view->gimage, new_viewable, -1);
 
-      gdisplays_flush ();
+      gimp_image_flush (view->gimage);
     }
 }
 
@@ -608,7 +603,7 @@ gimp_item_list_view_raise_clicked (GtkWidget        *widget,
     {
       view->reorder_item_func (view->gimage, viewable, index - 1, TRUE);
 
-      gdisplays_flush ();
+      gimp_image_flush (view->gimage);
     }
 }
 
@@ -630,7 +625,7 @@ gimp_item_list_view_raise_extended_clicked (GtkWidget        *widget,
     {
       view->reorder_item_func (view->gimage, viewable, 0, TRUE);
 
-      gdisplays_flush ();
+      gimp_image_flush (view->gimage);
     }
 }
 
@@ -651,7 +646,7 @@ gimp_item_list_view_lower_clicked (GtkWidget        *widget,
     {
       view->reorder_item_func (view->gimage, viewable, index + 1, TRUE);
 
-      gdisplays_flush ();
+      gimp_image_flush (view->gimage);
     }
 }
 
@@ -674,7 +669,7 @@ gimp_item_list_view_lower_extended_clicked (GtkWidget        *widget,
       view->reorder_item_func (view->gimage, viewable,
                                container->num_children - 1, TRUE);
 
-      gdisplays_flush ();
+      gimp_image_flush (view->gimage);
     }
 }
 
@@ -705,7 +700,7 @@ gimp_item_list_view_delete_clicked (GtkWidget        *widget,
 
   view->remove_item_func (view->gimage, viewable);
 
-  gdisplays_flush ();
+  gimp_image_flush (view->gimage);
 }
 
 
diff --git a/app/widgets/gimplayerlistitem.c b/app/widgets/gimplayerlistitem.c
index ce702bddb3..73dfdd2aa0 100644
--- a/app/widgets/gimplayerlistitem.c
+++ b/app/widgets/gimplayerlistitem.c
@@ -33,16 +33,11 @@
 
 #include "widgets-types.h"
 
-#warning FIXME #include "display/display-types.h"
-#include "display/display-types.h"
-
 #include "core/gimpdrawable.h"
 #include "core/gimpimage.h"
 #include "core/gimplayer.h"
 #include "core/gimplayermask.h"
 
-#include "display/gimpdisplay-foreach.h"
-
 #include "gimpdnd.h"
 #include "gimplayerlistitem.h"
 #include "gimppreview.h"
@@ -602,5 +597,5 @@ gimp_layer_list_item_mask_extended_clicked (GtkWidget     *widget,
     }
 
   if (flush)
-    gdisplays_flush ();
+    gimp_image_flush (gimp_item_get_image (GIMP_ITEM (mask)));
 }
diff --git a/app/widgets/gimplayerlistview.c b/app/widgets/gimplayerlistview.c
index 4dba05b134..f051db28f9 100644
--- a/app/widgets/gimplayerlistview.c
+++ b/app/widgets/gimplayerlistview.c
@@ -28,14 +28,9 @@
 
 #include "widgets-types.h"
 
-#warning FIXME #include "display/display-types.h"
-#include "display/display-types.h"
-
 #include "core/gimpcontainer.h"
-#include "core/gimpdrawable.h"
 #include "core/gimplayer.h"
-
-#include "display/gimpdisplay-foreach.h"
+#include "core/gimpimage.h"
 
 #include "gimpdnd.h"
 #include "gimplayerlistview.h"
@@ -386,7 +381,7 @@ gimp_layer_list_view_paint_mode_menu_callback (GtkWidget         *widget,
 	  gimp_layer_set_mode (layer, mode);
 	  UNBLOCK();
 
-	  gdisplays_flush ();
+	  gimp_image_flush (item_view->gimage);
 	}
     }
 }
@@ -440,7 +435,7 @@ gimp_layer_list_view_opacity_scale_changed (GtkAdjustment     *adjustment,
 	  gimp_layer_set_opacity (layer, opacity);
 	  UNBLOCK();
 
-	  gdisplays_flush ();
+	  gimp_image_flush (item_view->gimage);
 	}
     }
 }
diff --git a/app/widgets/gimplayertreeview.c b/app/widgets/gimplayertreeview.c
index 4dba05b134..f051db28f9 100644
--- a/app/widgets/gimplayertreeview.c
+++ b/app/widgets/gimplayertreeview.c
@@ -28,14 +28,9 @@
 
 #include "widgets-types.h"
 
-#warning FIXME #include "display/display-types.h"
-#include "display/display-types.h"
-
 #include "core/gimpcontainer.h"
-#include "core/gimpdrawable.h"
 #include "core/gimplayer.h"
-
-#include "display/gimpdisplay-foreach.h"
+#include "core/gimpimage.h"
 
 #include "gimpdnd.h"
 #include "gimplayerlistview.h"
@@ -386,7 +381,7 @@ gimp_layer_list_view_paint_mode_menu_callback (GtkWidget         *widget,
 	  gimp_layer_set_mode (layer, mode);
 	  UNBLOCK();
 
-	  gdisplays_flush ();
+	  gimp_image_flush (item_view->gimage);
 	}
     }
 }
@@ -440,7 +435,7 @@ gimp_layer_list_view_opacity_scale_changed (GtkAdjustment     *adjustment,
 	  gimp_layer_set_opacity (layer, opacity);
 	  UNBLOCK();
 
-	  gdisplays_flush ();
+	  gimp_image_flush (item_view->gimage);
 	}
     }
 }
diff --git a/app/widgets/gimpvectorslistview.c b/app/widgets/gimpvectorslistview.c
index a722679213..ebbdcaa398 100644
--- a/app/widgets/gimpvectorslistview.c
+++ b/app/widgets/gimpvectorslistview.c
@@ -33,9 +33,6 @@
 
 #include "widgets-types.h"
 
-#warning FIXME #include "display/display-types.h"
-#include "display/display-types.h"
-
 #include "core/gimpchannel.h"
 #include "core/gimpcontainer.h"
 #include "core/gimpimage.h"
@@ -43,8 +40,6 @@
 
 #include "vectors/gimpvectors.h"
 
-#include "display/gimpdisplay-foreach.h"
-
 #include "gimpvectorslistview.h"
 #include "gimpcomponentlistitem.h"
 #include "gimpdnd.h"
@@ -195,13 +190,17 @@ gimp_vectors_list_view_to_selection (GimpVectorsListView *view,
 {
   if (vectors)
     {
-      gimp_image_mask_select_vectors (GIMP_ITEM (vectors)->gimage,
+      GimpImage *gimage;
+
+      gimage = gimp_item_get_image (GIMP_ITEM (vectors));
+
+      gimp_image_mask_select_vectors (gimage,
                                       vectors,
                                       operation,
                                       TRUE,
                                       FALSE, 0, 0);
 
-      gdisplays_flush ();
+      gimp_image_flush (gimage);
     }
 }
 
diff --git a/app/widgets/gimpvectorstreeview.c b/app/widgets/gimpvectorstreeview.c
index a722679213..ebbdcaa398 100644
--- a/app/widgets/gimpvectorstreeview.c
+++ b/app/widgets/gimpvectorstreeview.c
@@ -33,9 +33,6 @@
 
 #include "widgets-types.h"
 
-#warning FIXME #include "display/display-types.h"
-#include "display/display-types.h"
-
 #include "core/gimpchannel.h"
 #include "core/gimpcontainer.h"
 #include "core/gimpimage.h"
@@ -43,8 +40,6 @@
 
 #include "vectors/gimpvectors.h"
 
-#include "display/gimpdisplay-foreach.h"
-
 #include "gimpvectorslistview.h"
 #include "gimpcomponentlistitem.h"
 #include "gimpdnd.h"
@@ -195,13 +190,17 @@ gimp_vectors_list_view_to_selection (GimpVectorsListView *view,
 {
   if (vectors)
     {
-      gimp_image_mask_select_vectors (GIMP_ITEM (vectors)->gimage,
+      GimpImage *gimage;
+
+      gimage = gimp_item_get_image (GIMP_ITEM (vectors));
+
+      gimp_image_mask_select_vectors (gimage,
                                       vectors,
                                       operation,
                                       TRUE,
                                       FALSE, 0, 0);
 
-      gdisplays_flush ();
+      gimp_image_flush (gimage);
     }
 }
 
diff --git a/tools/pdbgen/pdb/display.pdb b/tools/pdbgen/pdb/display.pdb
index bdaadd9867..bbc28ada99 100644
--- a/tools/pdbgen/pdb/display.pdb
+++ b/tools/pdbgen/pdb/display.pdb
@@ -79,7 +79,7 @@ HELP
 
     &std_pdb_misc;
 
-    %invoke = ( code => 'gdisplays_flush ();' );
+    %invoke = ( code => 'gimp_displays_flush (gimp);' );
 }
 
 @headers = qw("core/gimp.h" "display/display-types.h" "display/gimpdisplay.h"