diff --git a/app/dialogs/stroke-dialog.c b/app/dialogs/stroke-dialog.c
index a71e484..bd6fb0b 100644
--- a/app/dialogs/stroke-dialog.c
+++ b/app/dialogs/stroke-dialog.c
@@ -43,16 +43,22 @@
 
 #include "gimp-intl.h"
 
+#include "tools/tools-types.h"
+#include "tools/gimptool.h"
+#include "tools/tool_manager.h"
+
 
 #define RESPONSE_RESET 1
 
 
 /*  local functions  */
 
-static void  stroke_dialog_response (GtkWidget *widget,
-                                     gint       response_id,
-                                     GtkWidget *dialog);
+static void stroke_dialog_response     (GtkWidget *widget,
+                                        gint       response_id,
+                                        GtkWidget *dialog);
 
+static void stroke_set_source_callback (GtkWidget  *widget,
+									    GtkWidget  *dialog);
 
 /*  public function  */
 
@@ -223,6 +229,15 @@
 
     g_object_set_data (G_OBJECT (dialog), "gimp-tool-menu", combo);
 
+    button = gimp_button_new ();
+    gtk_button_set_label (GTK_BUTTON (button), _("Set source"));
+    gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
+    gtk_widget_set_sensitive (button, TRUE);
+    gtk_widget_show (button);
+    g_signal_connect (button, "clicked",
+                      G_CALLBACK (stroke_set_source_callback),
+                      dialog);
+
     button = gimp_prop_check_button_new (G_OBJECT (options),
                                          "emulate-brush-dynamics",
                                          _("_Emulate brush dynamics"));
@@ -318,3 +333,18 @@
       break;
     }
 }
+
+static void
+stroke_set_source_callback (GtkWidget  *widget,
+						    GtkWidget *dialog)
+{
+	GimpContext *context = GIMP_VIEWABLE_DIALOG (dialog)->context;
+	GimpToolInfo *tool_info;
+	tool_info = gimp_get_tool_info (context->gimp, "gimp-clone-tool");
+
+	gimp_context_set_tool (gimp_get_user_context (context->gimp),
+	                       tool_info);
+
+	GimpTool *tool;
+	tool = GIMP_TOOL (tool_manager_get_active(context->gimp));
+}
diff --git a/app/paint/gimpsourcecore.c b/app/paint/gimpsourcecore.c
index cad949b..a5ad90f 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..6d9c17a 100644
--- a/app/paint/gimpsourceoptions.c
+++ b/app/paint/gimpsourceoptions.c
@@ -26,12 +26,19 @@
 
 #include "gimpsourceoptions.h"
 
+#include "core/gimpdrawable.h"
+#include "libgimpbase/gimpbase.h"
+
 
 enum
 {
   PROP_0,
   PROP_ALIGN_MODE,
-  PROP_SAMPLE_MERGED
+  PROP_SAMPLE_MERGED,
+  PROP_SRC_DISPLAY_ID,
+  PROP_SRC_DRAWABLE,
+  PROP_SRC_X,
+  PROP_SRC_Y
 };
 
 
@@ -56,21 +63,48 @@
   object_class->set_property = gimp_source_options_set_property;
   object_class->get_property = gimp_source_options_get_property;
 
-  GIMP_CONFIG_INSTALL_PROP_ENUM (object_class, PROP_ALIGN_MODE,
-                                 "align-mode", NULL,
-                                 GIMP_TYPE_SOURCE_ALIGN_MODE,
-                                 GIMP_SOURCE_ALIGN_NO,
-                                 GIMP_PARAM_STATIC_STRINGS);
+  GIMP_CONFIG_INSTALL_PROP_ENUM    (object_class, PROP_ALIGN_MODE,
+                                    "align-mode", NULL,
+                                    GIMP_TYPE_SOURCE_ALIGN_MODE,
+                                    GIMP_SOURCE_ALIGN_NO,
+                                    GIMP_PARAM_STATIC_STRINGS);
 
   GIMP_CONFIG_INSTALL_PROP_BOOLEAN (object_class, PROP_SAMPLE_MERGED,
                                     "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..72b68b2 100644
--- a/app/paint/gimpsourceoptions.h
+++ b/app/paint/gimpsourceoptions.h
@@ -38,6 +38,11 @@
 
   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..56aa48d 100644
--- a/app/tools/gimpsourcetool.c
+++ b/app/tools/gimpsourcetool.c
@@ -176,9 +176,11 @@
                                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);
+  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 ();
 
@@ -189,6 +191,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 +202,9 @@
   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;
+  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;
 
   gimp_draw_tool_resume (GIMP_DRAW_TOOL (tool));
 }
@@ -309,6 +314,19 @@
 
   source = GIMP_SOURCE_CORE (GIMP_PAINT_TOOL (tool)->core);
 
+  if (! source_tool->src_display && ! source->src_drawable
+		  && options->src_display_ID && options->src_drawable)
+    {
+	  Gimp *gimp = GIMP_CONTEXT (options)->gimp;
+
+	  GimpDisplay *src_display = gimp_display_get_by_ID (gimp, options->src_display_ID);
+	  gimp_source_tool_set_src_display (source_tool, src_display);
+
+	  source->src_drawable = options->src_drawable;
+	  source->src_x        = options->src_x;
+	  source->src_y        = options->src_y;
+    }
+
   if (proximity)
     {
       if (gimp_source_core_use_source (source, options))
diff --git a/app/tools/tool_manager.c b/app/tools/tool_manager.c
index 48d7bfa..10b67d5 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;
 };
 
 
@@ -113,10 +115,15 @@
 
   user_context = gimp_get_user_context (gimp);
 
-  tool_manager->shared_paint_options = g_object_new (GIMP_TYPE_PAINT_OPTIONS,
-                                                     "gimp", gimp,
-                                                     "name", "tmp",
-                                                     NULL);
+  tool_manager->shared_paint_options  =      g_object_new (GIMP_TYPE_PAINT_OPTIONS,
+                                                           "gimp", gimp,
+                                                           "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),
@@ -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);
 }
@@ -843,6 +853,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 +884,12 @@
                                                   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);
     }
 }