--- edit_revision_27913.pdb
+++ edit_with_line_stroke.pdb
@@ -857,6 +857,91 @@
     );
 }
 
+sub edit_stroke_line {
+    $blurb = 'Stroke the current selection with a customizeable stroke';
+
+    $help = <<'HELP';
+This procedure strokes the current selection, painting along the selection
+boundary with a solid color fill or a pattern fill. The style of the line
+cap and join can be customized. In addition, the line can be dashed. The
+paint is applied to the specified drawable regardless of the active
+selection.
+HELP
+
+    $author = 'Barak Itkin <lightningismyname@gmail.com>';
+    $copyright = 'Barak Itkin';
+    $date = '2009';
+    $since = '2.8';
+
+    @inargs = (
+    { name => 'drawable', type => 'drawable',
+      desc => 'The drawable to stroke to' },
+    { name => 'width', type => 'float'
+      desc => 'The width of the stroke in pixels' },
+    { name => 'style', type => 'enum GimpStrokeStyle'
+      desc => 'Fill the stroke with the Foreground color or with a pattern' },
+    { name => 'cap_style', type => 'enum GimpCapStyle'
+      desc => "The style of the stroke's cap" },
+    { name => 'join_style', type => 'enum GimpJoinStyle'
+      desc => "The style of the stroke's join" },
+    { name => 'miter_limit', type => 'float'
+      desc => 'Convert a mitered join to a bevelled join if the miter would
+              extend to a distance of more than miter-limit * line-width from
+              the actual join point' },
+    { name => 'dash_offser', type => 'float'
+      desc => "The offset for using the dash array" },
+    { name => 'dash_info', type => 'floatarray',
+      desc => 'An array with the dash lengths and space lengths alternatly',
+        array => { name => 'num_values',
+                   desc => 'The number of elements in the array' } }
+    );
+
+    %invoke = (
+      headers => [ qw("core/gimpstrokeoptions.h"
+                      "core/gimpdashpattern.h") ],
+    code => <<'CODE'
+{
+  if (gimp_pdb_item_is_attached (GIMP_ITEM (drawable), error))
+    {
+      GimpImage         *image   = gimp_item_get_image (GIMP_ITEM (drawable));
+      GimpStrokeOptions *options;
+      GArray            *dash_pattern;
+      GValueArray       *dash_value_array;
+      gint              i;
+      
+      dash_pattern = g_array_new (FALSE, FALSE, sizeof (gdouble));
+      for (i = 0 ; i < num_values ; i++)
+        g_array_append_val (dash_pattern, dash_info[i]);
+      dash_value_array = gimp_dash_pattern_to_value_array (dash_pattern);
+
+      options = gimp_stroke_options_new (gimp, context, TRUE);
+
+      g_object_set (options,
+                   "method", GIMP_STROKE_METHOD_LIBART,
+                   "width", width,
+                   "style", style,
+                   "cap-style", cap_style,
+                   "join-style", join_style,
+                   "miter-limit", miter_limit,
+                   "dash-offset", dash_offset,
+                   "dash-info", dash_value_array,
+                   NULL);
+
+      success = gimp_item_stroke (GIMP_ITEM (gimp_image_get_mask (image)),
+                                  drawable, context, options, TRUE, TRUE,
+                                  progress, error);
+
+      g_object_unref (options);
+      g_value_array_free (dash_value_array);
+      g_array_free (dash_pattern, TRUE);
+    }
+  else
+    success = FALSE;
+}
+CODE
+    );
+}
+
 sub edit_stroke_vectors {
     $blurb = 'Stroke the specified vectors object';
 
@@ -900,7 +985,100 @@
     );
 }
 
+sub edit_stroke_vectors_line {
+    $blurb = 'Stroke the specified vectors object with a customizeable stroke';
 
+    $help = <<'HELP';
+This procedure strokes the specified vectors object. The stroke is a line
+with a solid color fill or a pattern fill. The style of the line cap and
+join can be customized. In addition, the line can be dashed.
+HELP
+
+    $author = 'Barak Itkin <lightningismyname@gmail.com>';
+    $copyright = 'Barak Itkin';
+    $date = '2009';
+    $since = '2.8';
+
+    @inargs = (
+    { name => 'drawable', type => 'drawable',
+      desc => 'The drawable to stroke to' },
+    { name => 'vectors', type => 'vectors',
+      desc => 'The vectors object' },
+    { name => 'width', type => 'float'
+      desc => 'The width of the stroke in pixels' },
+    { name => 'style', type => 'enum GimpStrokeStyle'
+      desc => 'Fill the stroke with the Foreground color or with a pattern' },
+    { name => 'cap_style', type => 'enum GimpCapStyle'
+      desc => "The style of the stroke's cap" },
+    { name => 'join_style', type => 'enum GimpJoinStyle'
+      desc => "The style of the stroke's join" },
+    { name => 'miter_limit', type => 'float'
+      desc => 'Convert a mitered join to a bevelled join if the miter would
+              extend to a distance of more than miter-limit * line-width from
+              the actual join point' },
+    { name => 'dash_offser', type => 'float'
+      desc => "The offset for using the dash array" },
+    { name => 'dash_info', type => 'floatarray',
+      desc => 'An array with the dash lengths and space lengths alternatly',
+        array => { name => 'num_values',
+                   desc => 'The number of elements in the array' } }
+    );
+
+    %invoke = (
+    headers => [ qw("core/gimpstrokeoptions.h"
+                    "core/gimpdashpattern.h") ],
+    code => <<'CODE'
+{
+  if (gimp_pdb_item_is_attached (GIMP_ITEM (drawable), error) &&
+      gimp_pdb_item_is_attached (GIMP_ITEM (vectors), error))
+    {
+      GimpPaintInfo     *paint_info;
+      GimpPaintCore     *core;
+      GimpStrokeOptions *options;
+      GArray            *dash_pattern;
+      GValueArray       *dash_value_array;
+      gint              i;
+      
+      dash_pattern = g_array_new (FALSE, FALSE, sizeof (gdouble));
+      for (i = 0 ; i < num_values ; i++)
+        g_array_append_val (dash_pattern, dash_info[i]);
+      dash_value_array = gimp_dash_pattern_to_value_array (dash_pattern);
+
+      options = gimp_stroke_options_new (gimp, context, TRUE);
+
+      g_object_set (options,
+                   "method", GIMP_STROKE_METHOD_LIBART,
+                   "width", width,
+                   "style", style,
+                   "cap-style", cap_style,
+                   "join-style", join_style,
+                   "miter-limit", miter_limit,
+                   "dash-offset", dash_offset,
+                   "dash-info", dash_value_array,
+                   NULL);
+
+      paint_info = gimp_context_get_paint_info (GIMP_CONTEXT (options));
+      core = g_object_new (paint_info->paint_type, NULL);
+
+      success = gimp_paint_core_stroke_vectors (core, drawable,
+                                               options->paint_options,
+                                               options->emulate_dynamics,
+                                               vectors, FALSE, error);
+
+      g_object_unref (core);
+      g_object_unref (paint_info);
+      g_object_unref (options);
+      g_value_array_free (dash_value_array);
+      g_array_free (dash_pattern, TRUE);
+    }
+  else
+    success = FALSE;
+}
+CODE
+    );
+}
+
+
 @headers = qw(<string.h>
               "core/gimp.h"
               "core/gimp-edit.h"
@@ -921,7 +1099,9 @@
             edit_bucket_fill_full
 	    edit_blend
             edit_stroke
-            edit_stroke_vectors);
+            edit_stroke_line
+            edit_stroke_vectors
+            edit_stroke_vectors_line);
 
 %exports = (app => [@procs], lib => [@procs]);
 
