diff --git a/Magick++/demo/piddle.cpp b/Magick++/demo/piddle.cpp
new file mode 100644
index 0000000..f189587
--- /dev/null
+++ b/Magick++/demo/piddle.cpp
@@ -0,0 +1,174 @@
+// This may look like C code, but it is really -*- C++ -*-
+//
+// Copyright Bob Friesenhahn, 1999, 2000, 2002, 2003
+//
+// PerlMagick "piddle" demo re-implemented using Magick++ methods.
+// The PerlMagick "piddle" demo is written by John Cristy
+//
+
+#include <Magick++.h>
+#include <string>
+#include <iostream>
+
+using namespace std;
+
+using namespace Magick;
+
+int main( int /*argc*/, char ** argv)
+{
+
+  // Initialize ImageMagick install location for Windows
+  InitializeMagick(*argv);
+
+  try {
+
+    string srcdir("");
+    if(getenv("SRCDIR") != 0)
+      srcdir = getenv("SRCDIR");
+
+    //
+    // Create a 300x300 white canvas.
+    //
+    Image image( "300x300", "white" );
+
+    // Drawing list
+    std::list<Magick::Drawable> drawList;
+
+    // Start drawing by pushing a drawing context with specified
+    // viewbox size
+    drawList.push_back(DrawablePushGraphicContext());
+    drawList.push_back(DrawableViewbox(0,0,image.columns(),image.rows()));
+
+    //
+    // Draw blue grid
+    //
+    drawList.push_back(DrawableStrokeColor("#ccf"));
+    for ( int i=0; i < 300; i += 10 )
+      {
+        drawList.push_back(DrawableLine(i,0, i,300));
+        drawList.push_back(DrawableLine(0,i, 300,i));
+      }
+
+    //
+    // Draw rounded rectangle.
+    //
+    drawList.push_back(DrawableFillColor("blue"));
+    drawList.push_back(DrawableStrokeColor("red"));
+    drawList.push_back(DrawableRoundRectangle(15,15, 70,70, 10,10));
+
+    drawList.push_back(DrawableFillColor("blue"));
+    drawList.push_back(DrawableStrokeColor("maroon"));
+    drawList.push_back(DrawableStrokeWidth(4));
+    drawList.push_back(DrawableRoundRectangle(15,15, 70,70, 10,10));
+
+    //
+    // Draw curve.
+    //
+    {
+      drawList.push_back(DrawableStrokeColor("black"));
+      drawList.push_back(DrawableStrokeWidth(4));
+      drawList.push_back(DrawableFillColor(Color()));
+
+      std::list<Magick::Coordinate> points;
+      points.push_back(Coordinate(20,20));
+      points.push_back(Coordinate(100,50));
+      points.push_back(Coordinate(50,100));
+      points.push_back(Coordinate(160,160));
+      drawList.push_back(DrawableBezier(points));
+    }
+
+    //
+    // Draw line
+    //
+    drawList.push_back(DrawableStrokeColor("red"));
+    drawList.push_back(DrawableStrokeWidth(1));
+    drawList.push_back(DrawableLine(10,200, 20,190));
+
+    //
+    // Draw arc within a circle.
+    //
+    drawList.push_back(DrawableStrokeColor("black"));
+    drawList.push_back(DrawableFillColor("yellow"));
+    drawList.push_back(DrawableStrokeWidth(4));
+    drawList.push_back(DrawableCircle(160,70, 200,70));
+
+    drawList.push_back(DrawableStrokeColor("black"));
+    drawList.push_back(DrawableFillColor("blue"));
+    drawList.push_back(DrawableStrokeWidth(4));
+    {
+      std::list<VPath> path;
+      path.push_back(PathMovetoAbs(Coordinate(160,70)));
+      path.push_back(PathLinetoVerticalRel(-40));
+      path.push_back(PathArcRel(PathArcArgs(40,40, 0, 0, 0, -40,40)));
+      path.push_back(PathClosePath());
+      drawList.push_back(DrawablePath(path));
+    }
+
+    //
+    // Draw pentogram.
+    //
+    {
+      drawList.push_back(DrawableStrokeColor("red"));
+      drawList.push_back(DrawableFillColor("LimeGreen"));
+      drawList.push_back(DrawableStrokeWidth(3));
+
+      std::list<Magick::Coordinate> points;
+      points.push_back(Coordinate(160,120));
+      points.push_back(Coordinate(130,190));
+      points.push_back(Coordinate(210,145));
+      points.push_back(Coordinate(110,145));
+      points.push_back(Coordinate(190,190));
+      points.push_back(Coordinate(160,120));
+      drawList.push_back(DrawablePolygon(points));
+    }
+
+    //
+    // Draw rectangle.
+    //
+    drawList.push_back(DrawableStrokeWidth(5));
+    drawList.push_back(DrawableFillColor(Color())); // No fill
+    drawList.push_back(DrawableStrokeColor("yellow"));
+    drawList.push_back(DrawableLine(200,260, 200,200));
+    drawList.push_back(DrawableLine(200,200, 260,200));
+    drawList.push_back(DrawableStrokeColor("red"));
+    drawList.push_back(DrawableLine(260,200, 260,260));
+    drawList.push_back(DrawableStrokeColor("green"));
+    drawList.push_back(DrawableLine(200,260, 260,260));
+
+    //
+    // Draw text.
+    //
+    drawList.push_back(DrawableFillColor("green"));
+    drawList.push_back(DrawableStrokeColor(Color())); // unset color
+    drawList.push_back(DrawablePointSize(24));
+    drawList.push_back(DrawableTranslation(30,140));
+    drawList.push_back(DrawableRotation(45.0));
+    drawList.push_back(DrawableText(0,0,"This is a test!"));
+
+    // Finish drawing by popping back to base context.
+    drawList.push_back(DrawablePopGraphicContext());
+
+    // Draw everything using completed drawing list
+    //    image.debug(true);
+    image.draw(drawList);
+
+    //     image.write( "piddle.mvg" );
+
+    cout << "Writing image \"piddle_out.miff\" ..." << endl;
+    image.compressType( RLECompression );
+    image.write( "piddle_out.miff" );
+    cout << "Writing MVG metafile \"piddle_out.mvg\" ..." << endl;
+    image.write( "piddle_out.mvg" );
+
+    //     cout << "Display image..." << endl;
+    //     image.display( );
+
+  }
+  catch( exception &error_ )
+    {
+      cout << "Caught exception: " << error_.what() << endl;
+      return 1;
+    }
+  
+  return 0;
+}