diff --git a/Magick++/lib/ImageRef.cpp b/Magick++/lib/ImageRef.cpp
new file mode 100644
index 0000000..8dab259
--- /dev/null
+++ b/Magick++/lib/ImageRef.cpp
@@ -0,0 +1,104 @@
+// This may look like C code, but it is really -*- C++ -*-
+//
+// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002
+//
+// Implementation of ImageRef
+//
+// This is an internal implementation class.
+//
+
+#define MAGICKCORE_IMPLEMENTATION  1
+#define MAGICK_PLUSPLUS_IMPLEMENTATION 1
+
+#include "Magick++/ImageRef.h"
+#include "Magick++/Exception.h"
+#include "Magick++/Options.h"
+
+// Construct with an image and default options
+Magick::ImageRef::ImageRef ( MagickCore::Image * image_ )
+  : _image(image_),
+    _options(new Options),
+    _id(-1),
+    _refCount(1),
+    _mutexLock()
+{
+}
+
+// Construct with an image and options
+// Inserts Image* in image, but copies Options into image.
+Magick::ImageRef::ImageRef ( MagickCore::Image * image_,
+			     const Options * options_ )
+  : _image(image_),
+    _options(0),
+    _id(-1),
+    _refCount(1),
+    _mutexLock()
+{
+  _options = new Options( *options_ );
+}
+
+// Default constructor
+Magick::ImageRef::ImageRef ( void )
+  : _image(0),
+    _options(new Options),
+    _id(-1),
+    _refCount(1),
+    _mutexLock()
+{
+  // Allocate default image
+  _image = AcquireImage( _options->imageInfo() );
+
+  // Test for error and throw exception (like throwImageException())
+  throwException(_image->exception);
+}
+
+// Destructor
+Magick::ImageRef::~ImageRef( void )
+{
+  // Unregister image (if still registered)
+  if( _id > -1 )
+    {
+      char id[MaxTextExtent];
+      sprintf(id,"%ld",_id);
+      DeleteImageRegistry( id );
+      _id=-1;
+    }
+
+  // Deallocate image
+  if ( _image )
+    {
+      DestroyImageList( _image );
+      _image = 0;
+    }
+
+  // Deallocate image options
+  delete _options;
+  _options = 0;
+}
+
+// Assign image to reference
+void Magick::ImageRef::image ( MagickCore::Image * image_ )
+{
+  if(_image)
+    DestroyImageList( _image );
+  _image = image_;
+}
+
+// Assign options to reference
+void  Magick::ImageRef::options ( Magick::Options * options_ )
+{
+  delete _options;
+  _options = options_;
+}
+
+// Assign registration id to reference
+void Magick::ImageRef::id ( const long id_ )
+{
+  if( _id > -1 )
+    {
+      char id[MaxTextExtent];
+      sprintf(id,"%ld",_id);
+      DeleteImageRegistry( id );
+    }
+  _id = id_;
+}