Index: lib/bezier_conn.c
===================================================================
--- lib/bezier_conn.c	(revision 4201)
+++ lib/bezier_conn.c	(working copy)
@@ -719,7 +719,20 @@
   DIA_RENDERER_GET_CLASS(renderer)->set_linejoin(renderer, LINEJOIN_ROUND);
   DIA_RENDERER_GET_CLASS(renderer)->set_linecaps(renderer, LINECAPS_BUTT);
 
-  DIA_RENDERER_GET_CLASS(renderer)->draw_bezier(renderer, points, bez->numpoints, &color_black);
+  if (DIA_RENDERER_GET_CLASS(renderer)->is_capable_to(renderer, RENDER_HOLES)) {
+    DIA_RENDERER_GET_CLASS(renderer)->draw_bezier(renderer, points, bez->numpoints, &color_black);
+  } else {
+    int i, from = 0, len;
+    
+    do {
+      for (i = from+1; i < bez->numpoints; ++i)
+        if (points[i].type == BEZ_MOVE_TO)
+          break;
+      len = i - from;
+      DIA_RENDERER_GET_CLASS(renderer)->draw_bezier(renderer, &points[from], len, &color_black);
+      from += len;
+    } while (from < bez->numpoints);
+  }
 }
 
 /** Draw the control lines from the points of the bezier conn.
Index: lib/beziershape.c
===================================================================
--- lib/beziershape.c	(revision 4201)
+++ lib/beziershape.c	(working copy)
@@ -723,6 +723,7 @@
 beziershape_simple_draw(BezierShape *bezier, DiaRenderer *renderer, real width)
 {
   BezPoint *points;
+  int numpoints;
   
   g_assert(bezier != NULL);
   g_assert(renderer != NULL);
@@ -734,6 +735,18 @@
   DIA_RENDERER_GET_CLASS(renderer)->set_linejoin(renderer, LINEJOIN_ROUND);
   DIA_RENDERER_GET_CLASS(renderer)->set_linecaps(renderer, LINECAPS_BUTT);
 
+  numpoints = bezier->numpoints;
+  if (!DIA_RENDERER_GET_CLASS(renderer)->is_capable_to(renderer, RENDER_HOLES)) {
+    /* just throw away everything from the second move */
+    int i;
+
+    for (i = 1; i < numpoints; ++i)
+      if (points[i].type == BEZ_MOVE_TO) {
+        numpoints = i;
+        break;
+      }
+  }
+
   DIA_RENDERER_GET_CLASS(renderer)->fill_bezier(renderer, points, bezier->numpoints,&color_white);
   DIA_RENDERER_GET_CLASS(renderer)->draw_bezier(renderer, points, bezier->numpoints,&color_black);
 }
Index: lib/dia_svg.c
===================================================================
--- lib/dia_svg.c	(revision 4201)
+++ lib/dia_svg.c	(working copy)
@@ -576,20 +576,25 @@
     /* check for a new command */
     switch (path[0]) {
     case 'M':
+#define MULTI_MOVE_BEZIER
+#ifndef MULTI_MOVE_BEZIER
       if (points->len > 0) {
 	need_next_element = TRUE;
 	goto MORETOPARSE;
       }
+#endif
       path++;
       path_chomp(path);
       last_type = PATH_MOVE;
       last_relative = FALSE;
       break;
     case 'm':
+#ifndef MULTI_MOVE_BEZIER
       if (points->len > 0) {
 	need_next_element = TRUE;
 	goto MORETOPARSE;
       }
+#endif
       path++;
       path_chomp(path);
       last_type = PATH_MOVE;
@@ -856,7 +861,9 @@
 	g_array_append_val(points, bez);
       }
       *closed = TRUE;
+#ifndef MULTI_MOVE_BEZIER
       need_next_element = TRUE;
+#endif
     }
     /* get rid of any ignorable characters */
     path_chomp(path);
Index: lib/diarenderer.c
===================================================================
--- lib/diarenderer.c	(revision 4201)
+++ lib/diarenderer.c	(working copy)
@@ -170,6 +170,8 @@
                                     Arrow *start_arrow,
                                     Arrow *end_arrow);
 
+static gboolean is_capable_to (DiaRenderer *renderer, RenderCapability cap);
+
 static gpointer parent_class = NULL;
 
 GType
@@ -279,6 +281,9 @@
   renderer_class->draw_polyline_with_arrows = draw_polyline_with_arrows;
   renderer_class->draw_rounded_polyline_with_arrows = draw_rounded_polyline_with_arrows;
   renderer_class->draw_bezier_with_arrows = draw_bezier_with_arrows;
+  
+  /* other */
+  renderer_class->is_capable_to = is_capable_to;
 }
 
 static void 
@@ -1449,6 +1454,14 @@
   return 0;
 }
 
+/*!
+ * The base class has none of the advanced capabilities
+ */
+static gboolean 
+is_capable_to (DiaRenderer *renderer, RenderCapability cap)
+{
+  return FALSE;
+}
 
 /*
  * non member functions
Index: lib/diarenderer.h
===================================================================
--- lib/diarenderer.h	(revision 4201)
+++ lib/diarenderer.h	(working copy)
@@ -29,6 +29,11 @@
 
 G_BEGIN_DECLS
 
+typedef enum {
+  RENDER_HOLES = (1<<0),
+  RENDER_ALPHA = (1<<1)
+} RenderCapability;
+
 /*! GObject boiler plate, create runtime information */
 #define DIA_TYPE_RENDERER           (dia_renderer_get_type ())
 /*! GObject boiler plate, a safe type cast */
@@ -251,6 +256,9 @@
                                    Color *color,
                                    Arrow *start_arrow,
                                    Arrow *end_arrow);
+  /*! allows to adapt DiaObject implementations to certain renderer capabilities */
+  gboolean (*is_capable_to) (DiaRenderer *renderer,
+			     RenderCapability cap);
 };
 
 /*
Index: lib/geometry.c
===================================================================
--- lib/geometry.c	(revision 4201)
+++ lib/geometry.c	(working copy)
@@ -328,8 +328,7 @@
 
     switch (b[i].type) {
     case BEZ_MOVE_TO:
-      /*g_assert_not_reached();*/
-      g_warning("BEZ_MOVE_TO found half way through a bezier line");
+      last = b[i].p1;
       break;
     case BEZ_LINE_TO:
       dist = distance_line_point(&last, &b[i].p1, line_width, point);
@@ -366,8 +365,8 @@
 
     switch (b[i].type) {
     case BEZ_MOVE_TO:
-      /*g_assert_not_reached();*/
-      g_warning("BEZ_MOVE_TO found half way through a bezier shape");
+      /* no complains, there are renderers capable to handle this */
+      last = b[i].p1;
       break;
     case BEZ_LINE_TO:
       dist = distance_line_point(&last, &b[i].p1, line_width, point);
Index: objects/standard/outline.c
===================================================================
--- objects/standard/outline.c	(revision 4201)
+++ objects/standard/outline.c	(working copy)
@@ -377,7 +377,14 @@
       ++n;
     }
   }
-  /* split the path data into piece which can be handled by Dia's bezier rendering */
+
+  if (DIA_RENDERER_GET_CLASS (renderer)->is_capable_to(renderer, RENDER_HOLES)) {
+    if (outline->show_background)
+      DIA_RENDERER_GET_CLASS (renderer)->fill_bezier(renderer, pts, total, &outline->fill_color);
+    DIA_RENDERER_GET_CLASS (renderer)->draw_bezier (renderer, pts, total, &outline->line_color);
+    return; /* that was easy ;) */
+  }
+  /* otherwise split the path data into piece which can be handled by Dia's standard bezier rendering */
   if (outline->show_background) {
     /* first draw the fills */
     int s1 = 0, n1 = 0;
Index: plug-ins/cairo/diacairo-renderer.c
===================================================================
--- plug-ins/cairo/diacairo-renderer.c	(revision 4201)
+++ plug-ins/cairo/diacairo-renderer.c	(working copy)
@@ -146,6 +146,16 @@
   DIAG_STATE(renderer->cr)
 }
 
+static gboolean 
+is_capable_to (DiaRenderer *renderer, RenderCapability cap)
+{
+  if (RENDER_HOLES == cap)
+    return TRUE;
+  else if (RENDER_ALPHA == cap)
+    return TRUE;
+  return FALSE;
+}
+
 static void
 set_linewidth(DiaRenderer *self, real linewidth)
 {  
@@ -975,4 +985,7 @@
   /* highest level functions */
   renderer_class->draw_rounded_rect = draw_rounded_rect;
   renderer_class->fill_rounded_rect = fill_rounded_rect;
+  
+  /* other */
+  renderer_class->is_capable_to = is_capable_to;
 }
Index: plug-ins/libart/dialibartrenderer.c
===================================================================
--- plug-ins/libart/dialibartrenderer.c	(revision 4201)
+++ plug-ins/libart/dialibartrenderer.c	(working copy)
@@ -139,8 +139,16 @@
   dia_font_pop_context();
 }
 
+static gboolean 
+is_capable_to (DiaRenderer *renderer, RenderCapability cap)
+{
+  if (RENDER_HOLES == cap)
+    return TRUE;
+  else if (RENDER_ALPHA == cap)
+    return TRUE;
+  return FALSE;
+}
 
-
 static void
 set_linewidth(DiaRenderer *self, real linewidth)
 {  /* 0 == hairline **/
@@ -1517,6 +1525,8 @@
 
   /* Interactive functions */
   renderer_class->get_text_width = get_text_width;
+  /* other */
+  renderer_class->is_capable_to = is_capable_to;
 }
 
 #endif
Index: plug-ins/wmf/wmf.cpp
===================================================================
--- plug-ins/wmf/wmf.cpp	(revision 4201)
+++ plug-ins/wmf/wmf.cpp	(working copy)
@@ -37,7 +37,6 @@
 #include "filter.h"
 #include "plug-ins.h"
 #include "dia_image.h"
-
 #ifdef __cplusplus
 }
 #endif
@@ -815,6 +814,62 @@
 }
 
 static void
+_bezier (DiaRenderer *self, 
+	    BezPoint *points,
+	    int       numpoints,
+	    Color    *colour,
+	    gboolean  fill)
+{
+    WmfRenderer *renderer = WMF_RENDERER (self);
+    W32::HGDIOBJ hBrush, hBrOld;
+    W32::HPEN hPen;
+    W32::COLORREF rgb = W32COLOR(colour);
+
+    DIAG_NOTE(renderer, "_bezier n:%d %fx%f ...\n", 
+              numpoints, points->p1.x, points->p1.y);
+
+    if (fill) {
+      hBrush = W32::CreateSolidBrush(rgb);
+      hBrOld = W32::SelectObject(renderer->hFileDC, hBrush);
+    } else {
+      hPen = UsePen(renderer, colour);
+    }
+
+    W32::BeginPath (renderer->hFileDC);
+    
+    for (int i = 0; i < numpoints; ++i) {
+        switch (points[i].type) {
+	case BezPoint::BEZ_MOVE_TO :
+	    W32::MoveToEx (renderer->hFileDC, SCX(points[i].p1.x), SCX(points[i].p1.y), NULL);
+	    break;
+	case BezPoint::BEZ_LINE_TO :
+	    W32::LineTo (renderer->hFileDC, SCX(points[i].p1.x), SCX(points[i].p1.y));
+	    break;
+	case BezPoint::BEZ_CURVE_TO :
+	  {
+	    W32::POINT pts[3] = {
+	      {SCX(points[i].p1.x), SCX(points[i].p1.y)},
+	      {SCX(points[i].p2.x), SCX(points[i].p2.y)},
+	      {SCX(points[i].p3.x), SCX(points[i].p3.y)}
+	    };
+	    W32::PolyBezierTo (renderer->hFileDC, pts, 3);
+	  }
+	  break;
+	}
+    }
+    W32::EndPath (renderer->hFileDC);
+    if (fill) {
+        W32::FillPath (renderer->hFileDC);
+        W32::SelectObject(renderer->hFileDC, 
+                          W32::GetStockObject (HOLLOW_BRUSH) );
+        W32::DeleteObject(hBrush);
+    } else {
+        W32::StrokePath (renderer->hFileDC);
+        DonePen(renderer, hPen);
+    }
+}
+
+static void
 draw_bezier(DiaRenderer *self, 
 	    BezPoint *points,
 	    int numpoints,
@@ -839,14 +894,14 @@
         {
         case _BezPoint::BEZ_MOVE_TO:
             g_warning("only first BezPoint can be a BEZ_MOVE_TO");
-	      break;
+	  break;
         case _BezPoint::BEZ_LINE_TO:
             /* everyhing the same ?*/
             pts[i*3-2].x = pts[i*3-1].x = 
             pts[i*3  ].x = SCX(points[i].p1.x);
             pts[i*3-2].y = pts[i*3-1].y = 
             pts[i*3  ].y = SCY(points[i].p1.y);
-        break;
+          break;
         case _BezPoint::BEZ_CURVE_TO:
             /* control points */
             pts[i*3-2].x = SCX(points[i].p1.x);
