diff --git a/unix/x0vncserver/PollingManager.h b/unix/x0vncserver/PollingManager.h
new file mode 100644
index 0000000..b8eef50
--- /dev/null
+++ b/unix/x0vncserver/PollingManager.h
@@ -0,0 +1,148 @@
+/* Copyright (C) 2004-2005 Constantin Kaplinsky.  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
+ * (at your option) any later version.
+ * 
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this software; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
+ * USA.
+ */
+
+//
+// PollingManager.h
+//
+
+#ifndef __POLLINGMANAGER_H__
+#define __POLLINGMANAGER_H__
+
+#include <X11/Xlib.h>
+#include <rfb/VNCServer.h>
+
+#include <x0vncserver/Image.h>
+
+#ifdef DEBUG
+#include <x0vncserver/TimeMillis.h>
+#endif
+
+using namespace rfb;
+
+class PollingManager {
+
+public:
+
+  PollingManager(Display *dpy, Image *image, ImageFactory *factory,
+                 int offsetLeft = 0, int offsetTop = 0);
+  virtual ~PollingManager();
+
+  void setVNCServer(VNCServer *s);
+
+  void setPointerPos(const Point &pos);
+  void unsetPointerPos();
+
+  void poll();
+
+  // Configurable parameters.
+  static BoolParameter pollPointer;
+  static IntParameter pollingType;
+
+protected:
+
+  //
+  // Implementations of different polling algorithms.
+  // Return value of true reports that some changes were detected.
+  //
+  bool poll_DetectVideo();
+  bool poll_SkipCycles();
+  bool poll_Traditional();
+  bool poll_Dumb();
+
+  // Separate polling for the area around current pointer position.
+  void computePointerArea(Rect *r);
+  bool pollPointerArea();
+
+  Display *m_dpy;
+  VNCServer *m_server;
+
+  Image *m_image;
+  int m_offsetLeft;
+  int m_offsetTop;
+  int m_width;
+  int m_height;
+  int m_widthTiles;
+  int m_heightTiles;
+
+  // Tracking pointer position for polling improvements.
+  bool m_pointerPosKnown;
+  Point m_pointerPos;
+  time_t m_pointerPosTime;
+
+private:
+
+  inline void getScreen() {
+    m_image->get(DefaultRootWindow(m_dpy), m_offsetLeft, m_offsetTop);
+  }
+
+  inline void getRow(int y) {
+    m_rowImage->get(DefaultRootWindow(m_dpy), m_offsetLeft, m_offsetTop + y);
+  }
+
+  inline void getTile32(int tx, int ty, int w, int h) {
+    if (w == 32 && h == 32) {
+      // This version of get() may be better optimized.
+      m_tileImage->get(DefaultRootWindow(m_dpy),
+                       m_offsetLeft + tx * 32, m_offsetTop + ty * 32);
+    } else {
+      // Generic version of get() for arbitrary width and height.
+      m_tileImage->get(DefaultRootWindow(m_dpy),
+                       m_offsetLeft + tx * 32, m_offsetTop + ty * 32, w, h);
+    }
+  }
+
+  inline void getArea128(int x, int y, int w, int h) {
+    if (w == 128 && h == 128) {
+      // This version of get() may be better optimized.
+      m_areaImage->get(DefaultRootWindow(m_dpy),
+                       m_offsetLeft + x, m_offsetTop + y);
+    } else {
+      // Generic version of get() for arbitrary width and height.
+      m_areaImage->get(DefaultRootWindow(m_dpy),
+                       m_offsetLeft + x, m_offsetTop + y, w, h);
+    }
+  }
+
+  void adjustVideoArea();
+
+  // Additional images used in polling algorithms.
+  Image *m_rowImage;            // One row of the framebuffer
+  Image *m_tileImage;           // One tile (32x32 or less)
+  Image *m_areaImage;           // Area around the pointer (up to 128x128)
+
+  char *m_statusMatrix;
+
+  char *m_rateMatrix;
+  char *m_videoFlags;
+  char *m_changedFlags;
+
+  unsigned int m_pollingStep;
+  static const int m_pollingOrder[];
+
+#ifdef DEBUG
+private:
+
+  void debugBeforePoll();
+  void debugAfterPoll();
+
+  TimeMillis m_timeSaved;
+#endif
+
+};
+
+#endif // __POLLINGMANAGER_H__
