diff --git a/app/paint/gimpsourcecore.c b/app/paint/gimpsourcecore.c
index cad949b..779c193 100644
--- a/app/paint/gimpsourcecore.c
+++ b/app/paint/gimpsourcecore.c
@@ -219,6 +219,13 @@
   GimpSourceCore    *source_core = GIMP_SOURCE_CORE (paint_core);
   GimpSourceOptions *options     = GIMP_SOURCE_OPTIONS (paint_options);
 
+  if (! source_core->src_drawable && options->src_drawable)
+    {
+      source_core->src_drawable = options->src_drawable;
+      source_core->src_x        = options->src_x;
+      source_core->src_y        = options->src_y;
+    }
+
   if (! GIMP_PAINT_CORE_CLASS (parent_class)->start (paint_core, drawable,
                                                      paint_options, coords,
                                                      error))
diff --git a/app/paint/gimpsourceoptions.c b/app/paint/gimpsourceoptions.c
index af02ed2..5d1723b 100644
--- a/app/paint/gimpsourceoptions.c
+++ b/app/paint/gimpsourceoptions.c
@@ -20,9 +20,12 @@
 #include <gdk-pixbuf/gdk-pixbuf.h>
 #include <gegl.h>
 
+#include "libgimpbase/gimpbase.h"
 #include "libgimpconfig/gimpconfig.h"
 
 #include "paint-types.h"
+
+#include "core/gimpdrawable.h"
 
 #include "gimpsourceoptions.h"
 
@@ -31,7 +34,11 @@
 {
   PROP_0,
   PROP_ALIGN_MODE,
-  PROP_SAMPLE_MERGED
+  PROP_SAMPLE_MERGED,
+  PROP_SRC_DISPLAY_ID,
+  PROP_SRC_DRAWABLE,
+  PROP_SRC_X,
+  PROP_SRC_Y
 };
 
 
@@ -66,11 +73,38 @@
                                     "sample-merged", NULL,
                                     FALSE,
                                     GIMP_PARAM_STATIC_STRINGS);
+
+  GIMP_CONFIG_INSTALL_PROP_INT (object_class, PROP_SRC_DISPLAY_ID,
+                                "src-display-id", NULL,
+                                0, G_MAXINT,
+                                0,
+                                GIMP_PARAM_READWRITE);
+
+  GIMP_CONFIG_INSTALL_PROP_OBJECT (object_class, PROP_SRC_DRAWABLE,
+                                   "src-drawable", NULL,
+                                   GIMP_TYPE_DRAWABLE,
+                                   GIMP_PARAM_READWRITE);
+
+  GIMP_CONFIG_INSTALL_PROP_DOUBLE (object_class, PROP_SRC_X,
+                                   "src-x", NULL,
+                                   0, GIMP_MAX_IMAGE_SIZE,
+                                   0.0,
+                                   GIMP_PARAM_READWRITE);
+
+  GIMP_CONFIG_INSTALL_PROP_DOUBLE (object_class, PROP_SRC_Y,
+                                   "src-y", NULL,
+                                   0, GIMP_MAX_IMAGE_SIZE,
+                                   0.0,
+                                   GIMP_PARAM_READWRITE);
 }
 
 static void
 gimp_source_options_init (GimpSourceOptions *options)
 {
+  options->src_display_ID = 0;
+  options->src_drawable   = NULL;
+  options->src_x          = 0.0;
+  options->src_y          = 0.0;
 }
 
 static void
@@ -88,6 +122,18 @@
       break;
     case PROP_SAMPLE_MERGED:
       options->sample_merged = g_value_get_boolean (value);
+      break;
+    case PROP_SRC_DISPLAY_ID:
+      options->src_display_ID = g_value_get_int (value);
+      break;
+    case PROP_SRC_DRAWABLE:
+      options->src_drawable = g_value_dup_object (value);
+      break;
+    case PROP_SRC_X:
+      options->src_x = g_value_get_double (value);
+      break;
+    case PROP_SRC_Y:
+      options->src_y = g_value_get_double (value);
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -111,8 +157,54 @@
     case PROP_SAMPLE_MERGED:
       g_value_set_boolean (value, options->sample_merged);
       break;
+    case PROP_SRC_DISPLAY_ID:
+      g_value_set_int (value, options->src_display_ID);
+      break;
+    case PROP_SRC_DRAWABLE:
+      g_value_set_object (value, options->src_drawable);
+      break;
+    case PROP_SRC_X:
+      g_value_set_double (value, options->src_x);
+      break;
+    case PROP_SRC_Y:
+      g_value_set_double (value, options->src_y);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
       break;
     }
 }
+
+void
+gimp_source_options_copy_props (GimpSourceOptions *src,
+                                GimpSourceOptions *dest)
+{
+  GimpSourceAlignMode align_mode;
+  gboolean sample_merged;
+
+  gint src_display_ID;
+  GimpDrawable *src_drawable;
+  gdouble src_x;
+  gdouble src_y;
+
+  g_return_if_fail (GIMP_IS_SOURCE_OPTIONS (src));
+  g_return_if_fail (GIMP_IS_SOURCE_OPTIONS (dest));
+
+  g_object_get (src,
+                "align-mode", &align_mode,
+                "sample-merged", &sample_merged,
+                "src-display-id", &src_display_ID,
+                "src-drawable", &src_drawable,
+                "src-x", &src_x,
+                "src-y", &src_y,
+                NULL);
+
+  g_object_set (dest,
+                "align-mode", align_mode,
+                "sample-merged", sample_merged,
+                "src-display-id", src_display_ID,
+                "src-drawable", src_drawable,
+                "src-x", src_x,
+                "src-y", src_y,
+                NULL);
+}
diff --git a/app/paint/gimpsourceoptions.h b/app/paint/gimpsourceoptions.h
index de3d38a..02f2c6c 100644
--- a/app/paint/gimpsourceoptions.h
+++ b/app/paint/gimpsourceoptions.h
@@ -34,10 +34,15 @@
 
 struct _GimpSourceOptions
 {
-  GimpPaintOptions     parent_instance;
+  GimpPaintOptions    parent_instance;
 
-  GimpSourceAlignMode  align_mode;
-  gboolean             sample_merged;
+  GimpSourceAlignMode align_mode;
+  gboolean            sample_merged;
+
+  gint                src_display_ID;
+  GimpDrawable       *src_drawable;
+  gdouble             src_x;
+  gdouble             src_y;
 };
 
 struct _GimpSourceOptionsClass
@@ -46,7 +51,10 @@
 };
 
 
-GType   gimp_source_options_get_type (void) G_GNUC_CONST;
+GType   gimp_source_options_get_type   (void) G_GNUC_CONST;
+
+void    gimp_source_options_copy_props (GimpSourceOptions *src,
+                                        GimpSourceOptions *dest);
 
 
 #endif  /*  __GIMP_SOURCE_OPTIONS_H__  */
diff --git a/app/tools/gimpsourcetool.c b/app/tools/gimpsourcetool.c
index 7fdc60f..76a4cd1 100644
--- a/app/tools/gimpsourcetool.c
+++ b/app/tools/gimpsourcetool.c
@@ -41,43 +41,50 @@
 #include "gimp-intl.h"
 
 
-static gboolean      gimp_source_tool_has_display   (GimpTool            *tool,
-                                                     GimpDisplay         *display);
-static GimpDisplay * gimp_source_tool_has_image     (GimpTool            *tool,
-                                                     GimpImage           *image);
-static void          gimp_source_tool_control       (GimpTool            *tool,
-                                                     GimpToolAction       action,
-                                                     GimpDisplay         *display);
-static void          gimp_source_tool_button_press  (GimpTool            *tool,
-                                                     const GimpCoords    *coords,
-                                                     guint32              time,
-                                                     GdkModifierType      state,
-                                                     GimpButtonPressType  press_type,
-                                                     GimpDisplay         *display);
-static void          gimp_source_tool_motion        (GimpTool            *tool,
-                                                     const GimpCoords    *coords,
-                                                     guint32              time,
-                                                     GdkModifierType      state,
-                                                     GimpDisplay         *display);
-static void          gimp_source_tool_cursor_update (GimpTool            *tool,
-                                                     const GimpCoords    *coords,
-                                                     GdkModifierType      state,
-                                                     GimpDisplay         *display);
-static void          gimp_source_tool_modifier_key  (GimpTool            *tool,
-                                                     GdkModifierType      key,
-                                                     gboolean             press,
-                                                     GdkModifierType      state,
-                                                     GimpDisplay         *display);
-static void          gimp_source_tool_oper_update   (GimpTool            *tool,
-                                                     const GimpCoords    *coords,
-                                                     GdkModifierType      state,
-                                                     gboolean             proximity,
-                                                     GimpDisplay         *display);
+static void          gimp_source_tool_dispose        (GObject             *object);
 
-static void          gimp_source_tool_draw          (GimpDrawTool        *draw_tool);
+static gboolean      gimp_source_tool_has_display    (GimpTool            *tool,
+                                                      GimpDisplay         *display);
+static GimpDisplay * gimp_source_tool_has_image      (GimpTool            *tool,
+                                                      GimpImage           *image);
+static void          gimp_source_tool_control        (GimpTool            *tool,
+                                                      GimpToolAction       action,
+                                                      GimpDisplay         *display);
+static void          gimp_source_tool_button_press   (GimpTool            *tool,
+                                                      const GimpCoords    *coords,
+                                                      guint32              time,
+                                                      GdkModifierType      state,
+                                                      GimpButtonPressType  press_type,
+                                                      GimpDisplay         *display);
+static void          gimp_source_tool_motion         (GimpTool            *tool,
+                                                      const GimpCoords    *coords,
+                                                      guint32              time,
+                                                      GdkModifierType      state,
+                                                      GimpDisplay         *display);
+static void          gimp_source_tool_cursor_update  (GimpTool            *tool,
+                                                      const GimpCoords    *coords,
+                                                      GdkModifierType      state,
+                                                      GimpDisplay         *display);
+static void          gimp_source_tool_modifier_key   (GimpTool            *tool,
+                                                      GdkModifierType      key,
+                                                      gboolean             press,
+                                                      GdkModifierType      state,
+                                                      GimpDisplay         *display);
+static void          gimp_source_tool_oper_update    (GimpTool            *tool,
+                                                      const GimpCoords    *coords,
+                                                      GdkModifierType      state,
+                                                      gboolean             proximity,
+                                                      GimpDisplay         *display);
 
-static void          gimp_source_tool_set_src_display (GimpSourceTool      *source_tool,
-                                                       GimpDisplay         *display);
+static void          gimp_source_tool_draw           (GimpDrawTool        *draw_tool);
+
+static void         gimp_source_tool_set_src_display (GimpSourceTool      *source_tool,
+                                                      GimpDisplay         *display);
+
+static void           gimp_source_tool_options_ready (GimpTool            *tool);
+
+static void gimp_source_tool_source_drawable_removed (GimpDrawable        *src_drawable,
+                                                      GimpTool            *tool);
 
 
 G_DEFINE_TYPE (GimpSourceTool, gimp_source_tool, GIMP_TYPE_BRUSH_TOOL)
@@ -90,6 +97,9 @@
 {
   GimpToolClass     *tool_class      = GIMP_TOOL_CLASS (klass);
   GimpDrawToolClass *draw_tool_class = GIMP_DRAW_TOOL_CLASS (klass);
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+  object_class->dispose     = gimp_source_tool_dispose;
 
   tool_class->has_display   = gimp_source_tool_has_display;
   tool_class->has_image     = gimp_source_tool_has_image;
@@ -99,6 +109,7 @@
   tool_class->modifier_key  = gimp_source_tool_modifier_key;
   tool_class->oper_update   = gimp_source_tool_oper_update;
   tool_class->cursor_update = gimp_source_tool_cursor_update;
+  tool_class->options_ready = gimp_source_tool_options_ready;
 
   draw_tool_class->draw     = gimp_source_tool_draw;
 }
@@ -106,7 +117,25 @@
 static void
 gimp_source_tool_init (GimpSourceTool *source)
 {
-  source->show_source_outline = TRUE;
+  source->show_source_outline             = TRUE;
+  source->src_drawable_removed_handler_id = 0;
+}
+
+static void
+gimp_source_tool_dispose (GObject *object)
+{
+  GimpTool          *tool        = GIMP_TOOL (object);
+  GimpSourceTool    *source_tool = GIMP_SOURCE_TOOL (tool);
+  GimpSourceOptions *options     = GIMP_SOURCE_TOOL_GET_OPTIONS (tool);
+
+  if (options->src_drawable &&
+      source_tool->src_drawable_removed_handler_id > 0)
+    {
+      g_signal_handler_disconnect (
+          options->src_drawable, source_tool->src_drawable_removed_handler_id);
+    }
+
+  G_OBJECT_CLASS (parent_class)->dispose (object);
 }
 
 static gboolean
@@ -176,11 +205,12 @@
                                GimpButtonPressType  press_type,
                                GimpDisplay         *display)
 {
-  GimpPaintTool  *paint_tool  = GIMP_PAINT_TOOL (tool);
-  GimpSourceTool *source_tool = GIMP_SOURCE_TOOL (tool);
-  GimpSourceCore *source      = GIMP_SOURCE_CORE (paint_tool->core);
-  GdkModifierType extend_mask = gimp_get_extend_selection_mask ();
-  GdkModifierType toggle_mask = gimp_get_toggle_behavior_mask ();
+  GimpPaintTool     *paint_tool  = GIMP_PAINT_TOOL (tool);
+  GimpSourceTool    *source_tool = GIMP_SOURCE_TOOL (tool);
+  GimpSourceCore    *source      = GIMP_SOURCE_CORE (paint_tool->core);
+  GimpSourceOptions *options     = GIMP_SOURCE_TOOL_GET_OPTIONS (tool);
+  GdkModifierType    extend_mask = gimp_get_extend_selection_mask ();
+  GdkModifierType    toggle_mask = gimp_get_toggle_behavior_mask ();
 
   gimp_draw_tool_pause (GIMP_DRAW_TOOL (tool));
 
@@ -189,6 +219,8 @@
       source->set_source = TRUE;
 
       gimp_source_tool_set_src_display (source_tool, display);
+
+      options->src_display_ID = gimp_display_get_ID (display);
     }
   else
     {
@@ -198,8 +230,25 @@
   GIMP_TOOL_CLASS (parent_class)->button_press (tool, coords, time, state,
                                                 press_type, display);
 
-  source_tool->src_x = source->src_x;
-  source_tool->src_y = source->src_y;
+  if (options->src_drawable &&
+      options->src_drawable != source->src_drawable &&
+      source_tool->src_drawable_removed_handler_id > 0)
+    {
+      g_signal_handler_disconnect (
+          options->src_drawable, source_tool->src_drawable_removed_handler_id);
+      source_tool->src_drawable_removed_handler_id = 0;
+    }
+  options->src_drawable = source->src_drawable;
+  options->src_x = source_tool->src_x = source->src_x;
+  options->src_y = source_tool->src_y = source->src_y;
+  if (options->src_drawable &&
+      source_tool->src_drawable_removed_handler_id == 0)
+    {
+      source_tool->src_drawable_removed_handler_id =
+          g_signal_connect (options->src_drawable, "removed",
+          G_CALLBACK (gimp_source_tool_source_drawable_removed),
+          tool);
+    }
 
   gimp_draw_tool_resume (GIMP_DRAW_TOOL (tool));
 }
@@ -479,3 +528,66 @@
       source_tool->src_display = display;
     }
 }
+
+static void
+gimp_source_tool_options_ready (GimpTool *tool)
+{
+  /* tool entry point where shared options are ready to use. Yay! */
+  GimpPaintTool     *paint_tool   = GIMP_PAINT_TOOL (tool);
+  GimpSourceTool    *source_tool  = GIMP_SOURCE_TOOL (tool);
+  GimpSourceOptions *options      = GIMP_SOURCE_TOOL_GET_OPTIONS (tool);
+  GimpSourceCore    *source;
+
+  source = GIMP_SOURCE_CORE (GIMP_PAINT_TOOL (tool)->core);
+
+  if (options->src_drawable)
+    {
+      source_tool->src_drawable_removed_handler_id =
+          g_signal_connect (options->src_drawable, "removed",
+          G_CALLBACK (gimp_source_tool_source_drawable_removed),
+          tool);
+
+      source->src_drawable = options->src_drawable;
+      source->src_x        = options->src_x;
+      source->src_y        = options->src_y;
+    }
+
+  if (options->src_display_ID > 0)
+    {
+      Gimp        *gimp        = GIMP_CONTEXT (options)->gimp;
+      GimpDisplay *src_display = gimp_display_get_by_ID (
+          gimp, options->src_display_ID);
+      if (src_display)
+        {
+          gimp_source_tool_set_src_display (source_tool, src_display);
+        }
+    }
+}
+
+static void
+gimp_source_tool_source_drawable_removed (GimpDrawable *src_drawable,
+                                          GimpTool     *tool)
+{
+  GimpPaintTool     *paint_tool  = GIMP_PAINT_TOOL (tool);
+  GimpSourceTool    *source_tool = GIMP_SOURCE_TOOL (tool);
+  GimpSourceCore    *source      = GIMP_SOURCE_CORE (paint_tool->core);
+  GimpSourceOptions *options     = GIMP_SOURCE_TOOL_GET_OPTIONS (tool);
+
+  g_signal_handler_disconnect (src_drawable,
+                               source_tool->src_drawable_removed_handler_id);
+  source_tool->src_drawable_removed_handler_id = 0;
+
+  if (source_tool->src_display)
+    {
+      GimpDisplayShell *src_shell;
+      src_shell = gimp_display_get_shell (source_tool->src_display);
+      gimp_display_shell_remove_tool_item (src_shell, source_tool->src_outline);
+      source_tool->src_outline = NULL;
+      source_tool->src_display = NULL;
+    }
+
+  options->src_display_ID = 0;
+  options->src_drawable   = source->src_drawable = NULL;
+  options->src_x = source_tool->src_x = source->src_x = 0;
+  options->src_y = source_tool->src_y = source->src_y = 0;
+}
diff --git a/app/tools/gimpsourcetool.h b/app/tools/gimpsourcetool.h
index 0b98d43..f354382 100644
--- a/app/tools/gimpsourcetool.h
+++ b/app/tools/gimpsourcetool.h
@@ -51,6 +51,8 @@
   const gchar    *status_paint;
   const gchar    *status_set_source;
   const gchar    *status_set_source_ctrl;
+
+  gulong          src_drawable_removed_handler_id;
 };
 
 struct _GimpSourceToolClass
diff --git a/app/tools/gimptool.c b/app/tools/gimptool.c
index 2ed0259..b27c0bc 100644
--- a/app/tools/gimptool.c
+++ b/app/tools/gimptool.c
@@ -131,6 +131,8 @@
                                                       GimpToolOptions  *options,
                                                       const GParamSpec *pspec);
 
+static void            gimp_tool_real_options_ready  (GimpTool         *tool);
+
 static void            gimp_tool_options_notify      (GimpToolOptions  *options,
                                                       const GParamSpec *pspec,
                                                       GimpTool         *tool);
@@ -176,6 +178,7 @@
   klass->redo                = gimp_tool_real_redo;
   klass->get_popup           = gimp_tool_real_get_popup;
   klass->options_notify      = gimp_tool_real_options_notify;
+  klass->options_ready       = gimp_tool_real_options_ready;
 
   g_object_class_install_property (object_class, PROP_TOOL_INFO,
                                    g_param_spec_object ("tool-info",
@@ -480,6 +483,10 @@
 {
 }
 
+static void
+gimp_tool_real_options_ready (GimpTool *tool)
+{
+}
 
 /*  public functions  */
 
@@ -1298,6 +1305,12 @@
                                  cursor, tool_cursor, modifier);
 }
 
+void
+gimp_tool_options_ready (GimpTool *tool)
+{
+  GIMP_TOOL_GET_CLASS (tool)->options_ready (tool);
+}
+
 
 /*  private functions  */
 
diff --git a/app/tools/gimptool.h b/app/tools/gimptool.h
index c8a9313..bd4121d 100644
--- a/app/tools/gimptool.h
+++ b/app/tools/gimptool.h
@@ -153,6 +153,8 @@
   void            (* options_notify)      (GimpTool              *tool,
                                            GimpToolOptions       *options,
                                            const GParamSpec      *pspec);
+
+  void            (*options_ready)        (GimpTool              *tool);
 };
 
 
@@ -268,5 +270,7 @@
                                                  GimpToolCursorType   tool_cursor,
                                                  GimpCursorModifier   modifier);
 
+void              gimp_tool_options_ready       (GimpTool            *tool);
+
 
 #endif  /*  __GIMP_TOOL_H__  */
diff --git a/app/tools/tool_manager.c b/app/tools/tool_manager.c
index 48d7bfa..ef80080 100644
--- a/app/tools/tool_manager.c
+++ b/app/tools/tool_manager.c
@@ -36,6 +36,7 @@
 #include "core/gimptoolpreset.h"
 
 #include "paint/gimppaintoptions.h"
+#include "paint/gimpsourceoptions.h"
 
 #include "display/gimpdisplay.h"
 
@@ -48,12 +49,13 @@
 
 struct _GimpToolManager
 {
-  GimpTool         *active_tool;
-  GimpPaintOptions *shared_paint_options;
-  GSList           *tool_stack;
+  GimpTool          *active_tool;
+  GimpPaintOptions  *shared_paint_options;
+  GimpSourceOptions *shared_source_options;
+  GSList            *tool_stack;
 
-  GQuark            image_clean_handler_id;
-  GQuark            image_dirty_handler_id;
+  GQuark             image_clean_handler_id;
+  GQuark             image_dirty_handler_id;
 };
 
 
@@ -118,6 +120,11 @@
                                                      "name", "tmp",
                                                      NULL);
 
+  tool_manager->shared_source_options = g_object_new (GIMP_TYPE_SOURCE_OPTIONS,
+                                                      "gimp", gimp,
+                                                      "name", "tmp",
+                                                      NULL);
+
   g_signal_connect (user_context, "tool-changed",
                     G_CALLBACK (tool_manager_tool_changed),
                     tool_manager);
@@ -156,6 +163,9 @@
 
   if (tool_manager->shared_paint_options)
     g_object_unref (tool_manager->shared_paint_options);
+
+  if (tool_manager->shared_source_options)
+    g_object_unref (tool_manager->shared_source_options);
 
   g_slice_free (GimpToolManager, tool_manager);
 }
@@ -712,6 +722,8 @@
 
   tool_manager_select_tool (user_context->gimp, new_tool);
 
+  gimp_tool_options_ready (new_tool);
+
   g_object_unref (new_tool);
 }
 
@@ -843,6 +855,12 @@
             gimp_paint_options_copy_gradient_props (tool_manager->shared_paint_options,
                                                     GIMP_PAINT_OPTIONS (tool_info->tool_options));
         }
+
+      if (GIMP_IS_SOURCE_OPTIONS(tool_info->tool_options))
+        {
+          gimp_source_options_copy_props (tool_manager->shared_source_options,
+                                          GIMP_SOURCE_OPTIONS(tool_info->tool_options));
+        }
     }
 }
 
@@ -868,6 +886,13 @@
                                                   tool_manager->shared_paint_options);
         }
 
+      if (GIMP_IS_SOURCE_OPTIONS(tool_info->tool_options))
+        {
+          gimp_source_options_copy_props (
+              GIMP_SOURCE_OPTIONS(tool_info->tool_options),
+              tool_manager->shared_source_options);
+        }
+
       gimp_context_set_parent (GIMP_CONTEXT (tool_info->tool_options), NULL);
     }
 }