diff --git a/pd/src/g_template.c b/pd/src/g_template.c
index 5c1f437bd4be84107d604d30cc4929598f722a58..107dcf4d737cb1a416c717823b0737816166a804 100644
--- a/pd/src/g_template.c
+++ b/pd/src/g_template.c
@@ -3878,7 +3878,35 @@ static int legacy_draw_in_group(t_canvas *c)
         return (0);
 }
 
-    
+/* this is a conversion from tk's smooth method to an svg path command.
+   It is here for backwards-compabitility with the legacy data structure
+   drawing commands. A description of tk's curve implementation may be
+   found here:
+   http://www.tcl.tk/cgi-bin/tct/tip/168.html */
+void curve_smooth_to_q(int *pix, int n, int closed)
+{
+    int i, end = (closed ? n : n - 1);
+    sys_vgui("M %d %d\\\n", pix[0], pix[1]);
+    int ox = pix[2], oy = pix[3];
+    for (i = 2; i < n - 1; i++)
+    {
+        sys_vgui("Q %d %d %d %d\\\n",
+            ox, oy,
+            (int)(0.5*ox + 0.5*pix[i*2]),
+            (int)(0.5*oy + 0.5*pix[i*2+1]));
+        ox = pix[i*2];
+        oy = pix[i*2+1];
+    }
+    /* this part for closed curves doesn't work yet. The numbers I have
+       placed in the command need to be replaced with different, less
+       wrong numbers. */
+    if (closed)
+        sys_vgui("Q %d %d %d %d\\\n", pix[n*2-2], pix[n*2-1], pix[0], pix[1]);
+    else
+       sys_vgui("Q %d %d %d %d\\\n", pix[n*2-4], pix[n*2-3],
+           pix[n*2-2], pix[n*2-1]);
+}
+
 static void *curve_new(t_symbol *classsym, t_int argc, t_atom *argv)
 {
     if (legacy_draw_in_group(canvas_getcurrent()))
@@ -4117,8 +4145,12 @@ static void curve_vis(t_gobj *z, t_glist *glist, t_glist *parentglist,
                     fill);
                 if (flags & CLOSED && !(flags & BBOX))
                 {
-                    sys_vgui(".x%lx.c create ppolygon \\\n",
-                        glist_getcanvas(glist));
+                    if (flags & BEZ)
+                        sys_vgui(".x%lx.c create path {\\\n",
+                            glist_getcanvas(glist));
+                    else
+                        sys_vgui(".x%lx.c create ppolygon \\\n",
+                            glist_getcanvas(glist));
                 }
                 else if (flags & BBOX) /* rectangles and ellipses */
                 {
@@ -4139,22 +4171,37 @@ static void curve_vis(t_gobj *z, t_glist *glist, t_glist *parentglist,
                         sys_vgui(".x%lx.c create ellipse \\\n", glist_getcanvas(glist));
                     else
                         sys_vgui(".x%lx.c create prect \\\n", glist_getcanvas(glist));
-                } else
-                    sys_vgui(".x%lx.c create polyline \\\n", glist_getcanvas(glist));
+                }
+                else
+                { 
+                    if(flags & BEZ)
+                        sys_vgui(".x%lx.c create path {\\\n", glist_getcanvas(glist));
+                    else
+                        sys_vgui(".x%lx.c create polyline \\\n", glist_getcanvas(glist));
+                }
             }
-            for (i = 0; i < n; i++)
+
+            if ((flags & BEZ) && !(flags & BBOX))
+            {
+                curve_smooth_to_q(pix, n, (flags & CLOSED));
+                sys_gui("}\\\n");
+            }
+            else
             {
-                sys_vgui("%d %d \\\n",
-                    pix[2*i],
-                    pix[2*i+1]);
-                if ((flags & BEZ) && (flags & BBOX))
+                for (i = 0; i < n; i++)
                 {
-                    sys_vgui("-rx %d -ry %d \\\n",
-                        (t_int)fielddesc_getfloat(x->x_vec+2,
-                            template, data, 1),
-                        (t_int)fielddesc_getfloat(x->x_vec+3,
-                            template, data, 1));
-                    break;
+                    sys_vgui("%d %d \\\n",
+                        pix[2*i],
+                        pix[2*i+1]);
+                    if ((flags & BEZ) && (flags & BBOX))
+                    {
+                        sys_vgui("-rx %d -ry %d \\\n",
+                            (t_int)fielddesc_getfloat(x->x_vec+2,
+                                template, data, 1),
+                            (t_int)fielddesc_getfloat(x->x_vec+3,
+                                template, data, 1));
+                        break;
+                    }
                 }
             }
             sys_vgui("-strokewidth %f \\\n", width);