diff --git a/unix/x0vncserver/XPixelBuffer.cxx b/unix/x0vncserver/XPixelBuffer.cxx
index 164c704..7e515b2 100644
--- a/unix/x0vncserver/XPixelBuffer.cxx
+++ b/unix/x0vncserver/XPixelBuffer.cxx
@@ -27,40 +27,48 @@
 
 using namespace rfb;
 
-XPixelBuffer::XPixelBuffer(Display *dpy, Image* image,
+XPixelBuffer::XPixelBuffer(Display *dpy, ImageFactory &factory,
                            int offsetLeft, int offsetTop,
+                           int width, int height,
                            ColourMap* cm)
   : FullFramePixelBuffer(),
     m_dpy(dpy),
-    m_image(image),
+    m_image(0),
     m_offsetLeft(offsetLeft),
     m_offsetTop(offsetTop),
-    m_stride(image->xim->bytes_per_line * 8 / image->xim->bits_per_pixel)
+    m_stride(0)
 {
+  m_image = factory.newImage(dpy, width, height);
+
   // Fill in the PixelFormat structure of the parent class.
-  format.bpp        = image->xim->bits_per_pixel;
-  format.depth      = image->xim->depth;
-  format.bigEndian  = (image->xim->byte_order == MSBFirst);
-  format.trueColour = image->isTrueColor();
-  format.redShift   = ffs(image->xim->red_mask) - 1;
-  format.greenShift = ffs(image->xim->green_mask) - 1;
-  format.blueShift  = ffs(image->xim->blue_mask) - 1;
-  format.redMax     = image->xim->red_mask   >> format.redShift;
-  format.greenMax   = image->xim->green_mask >> format.greenShift;
-  format.blueMax    = image->xim->blue_mask  >> format.blueShift;
+  format.bpp        = m_image->xim->bits_per_pixel;
+  format.depth      = m_image->xim->depth;
+  format.bigEndian  = (m_image->xim->byte_order == MSBFirst);
+  format.trueColour = m_image->isTrueColor();
+  format.redShift   = ffs(m_image->xim->red_mask) - 1;
+  format.greenShift = ffs(m_image->xim->green_mask) - 1;
+  format.blueShift  = ffs(m_image->xim->blue_mask) - 1;
+  format.redMax     = m_image->xim->red_mask   >> format.redShift;
+  format.greenMax   = m_image->xim->green_mask >> format.greenShift;
+  format.blueMax    = m_image->xim->blue_mask  >> format.blueShift;
 
   // Set up the remaining data of the parent class.
-  width_ = image->xim->width;
-  height_ = image->xim->height;
-  data = (rdr::U8 *)image->xim->data;
+  width_ = width;
+  height_ = height;
+  data = (rdr::U8 *)m_image->xim->data;
   colourmap = cm;
 
+  // Calculate the distance in pixels between two subsequent scan
+  // lines of the framebuffer.
+  m_stride = m_image->xim->bytes_per_line * 8 / m_image->xim->bits_per_pixel;
+
   // Get initial screen image from the X display.
   m_image->get(DefaultRootWindow(m_dpy), m_offsetLeft, m_offsetTop);
 }
 
 XPixelBuffer::~XPixelBuffer()
 {
+  delete m_image;
 }
 
 void
diff --git a/unix/x0vncserver/XPixelBuffer.h b/unix/x0vncserver/XPixelBuffer.h
index 75cd552..7829038 100644
--- a/unix/x0vncserver/XPixelBuffer.h
+++ b/unix/x0vncserver/XPixelBuffer.h
@@ -35,8 +35,9 @@
 class XPixelBuffer : public FullFramePixelBuffer
 {
 public:
-  XPixelBuffer(Display *dpy, Image* image,
+  XPixelBuffer(Display *dpy, ImageFactory &factory,
                int offsetLeft, int offsetTop,
+               int width, int height,
                ColourMap* cm);
   virtual ~XPixelBuffer();
 
@@ -46,9 +47,10 @@
   //       Or better do not allow public access at all.
   virtual Image *getImage() const { return m_image; }
 
+  // Override PixelBuffer::getStride().
   virtual int getStride() const { return m_stride; }
 
-  // Override PixelBuffer's function.
+  // Override PixelBuffer::grabRegion().
   virtual void grabRegion(const rfb::Region& region);
 
 protected:
diff --git a/unix/x0vncserver/x0vncserver.cxx b/unix/x0vncserver/x0vncserver.cxx
index 9331cf5..f2ff430 100644
--- a/unix/x0vncserver/x0vncserver.cxx
+++ b/unix/x0vncserver/x0vncserver.cxx
@@ -138,7 +138,7 @@
 {
 public:
   XDesktop(Display* dpy_, Geometry *geometry_)
-    : dpy(dpy_), geometry(geometry_), pb(0), server(0), image(0), pollmgr(0),
+    : dpy(dpy_), geometry(geometry_), pb(0), server(0), pollmgr(0),
       oldButtonMask(0), haveXtest(false), maxButtons(0), running(false)
   {
 #ifdef HAVE_XTEST
@@ -175,15 +175,17 @@
     vlog.info("Enabling %d button%s of X pointer device",
               maxButtons, (maxButtons != 1) ? "s" : "");
 
-    // Create an image for maintaining framebuffer data.
+    // Create an ImageFactory instance for producing Image objects.
     ImageFactory factory((bool)useShm, (bool)useOverlay);
-    image = factory.newImage(dpy, geometry->width(), geometry->height());
-    vlog.info("Allocated %s", image->classDesc());
 
     // Provide pixel buffer to the server object.
-    pb = new XPixelBuffer(dpy, image,
+    // FIXME: Pass coordinates in a structure?
+    pb = new XPixelBuffer(dpy, factory,
                           geometry->offsetLeft(), geometry->offsetTop(),
+                          geometry->width(), geometry->height(),
                           this);
+    vlog.info("Allocated %s", pb->getImage()->classDesc());
+
     server = vs;
     server->setPixelBuffer(pb);
 
@@ -199,11 +201,9 @@
 
     delete pb;
     delete pollmgr;
-    delete image;
 
     pb = 0;
     pollmgr = 0;
-    image = 0;
   }
 
   inline bool isRunning() {
@@ -273,7 +273,6 @@
   Geometry* geometry;
   XPixelBuffer* pb;
   VNCServer* server;
-  Image* image;
   PollingManager* pollmgr;
   int oldButtonMask;
   bool haveXtest;
