diff --git a/rfb_win32/WMWindowCopyRect.cxx b/rfb_win32/WMWindowCopyRect.cxx
index 46d85ea..63c1da2 100644
--- a/rfb_win32/WMWindowCopyRect.cxx
+++ b/rfb_win32/WMWindowCopyRect.cxx
@@ -1,5 +1,5 @@
-/* Copyright (C) 2002-2003 RealVNC Ltd.  All Rights Reserved.
- *    
+/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * 
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
@@ -29,55 +29,39 @@
 
 // -=- WMHooks class
 
-rfb::win32::WMCopyRect::WMCopyRect() : clipper(0), fg_window(0) {
-}
-
-rfb::win32::WMCopyRect::~WMCopyRect() {
-  if (clipper) delete clipper;
+rfb::win32::WMCopyRect::WMCopyRect() : ut(0), fg_window(0) {
 }
 
 bool
 rfb::win32::WMCopyRect::processEvent() {
-  if (clipper) {
-    // See if the foreground window has moved
-    HWND window = GetForegroundWindow();
-    if (window) {
-      RECT wrect;
-      if (IsWindow(window) && IsWindowVisible(window) && GetWindowRect(window, &wrect)) {
-        Rect winrect(wrect.left, wrect.top, wrect.right, wrect.bottom);
-        if (fg_window == window) {
-
-          if (!fg_window_rect.tl.equals(winrect.tl)) {
-            // Window has moved - send a copyrect event to the client
-            Point delta = Point(winrect.tl.x-fg_window_rect.tl.x, winrect.tl.y-fg_window_rect.tl.y);
-            Region copy_dest = winrect;
-            clipper->add_copied(copy_dest, delta);
-            clipper->add_changed(Region(fg_window_rect).subtract(copy_dest));
-          }
+  // See if the foreground window has moved
+  HWND window = GetForegroundWindow();
+  if (window) {
+    RECT wrect;
+    if (IsWindow(window) && IsWindowVisible(window) && GetWindowRect(window, &wrect)) {
+      Rect winrect(wrect.left, wrect.top, wrect.right, wrect.bottom);
+      if (fg_window == window) {
+        if (!fg_window_rect.tl.equals(winrect.tl)  && ut) {
+          // Window has moved - send a copyrect event to the client
+          Point delta = Point(winrect.tl.x-fg_window_rect.tl.x, winrect.tl.y-fg_window_rect.tl.y);
+          Region copy_dest = winrect;
+          ut->add_copied(copy_dest, delta);
+          ut->add_changed(Region(fg_window_rect).subtract(copy_dest));
         }
-        fg_window = window;
-        fg_window_rect = winrect;
-      } else {
-        fg_window = 0;
       }
+      fg_window = window;
+      fg_window_rect = winrect;
     } else {
       fg_window = 0;
     }
+  } else {
+    fg_window = 0;
   }
   return false;
 }
 
 bool
-rfb::win32::WMCopyRect::setClipRect(const Rect& r) {
-  clip_region = r;
-  if (clipper) clipper->set_clip_region(clip_region);
-  return true;
-}
-
-bool
-rfb::win32::WMCopyRect::setUpdateTracker(UpdateTracker* ut) {
-  if (clipper) delete clipper;
-  clipper = new ClippedUpdateTracker(*ut);
-  clipper->set_clip_region(clip_region);
+rfb::win32::WMCopyRect::setUpdateTracker(UpdateTracker* ut_) {
+  ut = ut_;
   return true;
 }
