diff --git a/common/rdr/types.h b/common/rdr/types.h
index 6421b13..458a13e 100644
--- a/common/rdr/types.h
+++ b/common/rdr/types.h
@@ -61,6 +61,16 @@
     U32* buf;
   };
 
+  class S32Array {
+  public:
+    S32Array() : buf(0) {}
+    S32Array(S32* a) : buf(a) {} // note: assumes ownership
+    S32Array(int len) : buf(new S32[len]) {}
+    ~S32Array() { delete [] buf; }
+    S32* takeBuf() { S32* tmp = buf; buf = 0; return tmp; }
+    S32* buf;
+  };
+
 } // end of namespace rdr
 
 #endif
diff --git a/common/rfb/CMsgHandler.h b/common/rfb/CMsgHandler.h
index 9205ef5..d8b949b 100644
--- a/common/rfb/CMsgHandler.h
+++ b/common/rfb/CMsgHandler.h
@@ -56,8 +56,8 @@
 
     virtual void framebufferUpdateStart() = 0;
     virtual void framebufferUpdateEnd() = 0;
-    virtual void beginRect(const Rect& r, unsigned int encoding) = 0;
-    virtual void endRect(const Rect& r, unsigned int encoding) = 0;
+    virtual void beginRect(const Rect& r, int encoding) = 0;
+    virtual void endRect(const Rect& r, int encoding) = 0;
 
     virtual void setColourMapEntries(int firstColour, int nColours,
 				     rdr::U16* rgbs) = 0;
diff --git a/common/rfb/CMsgReader.cxx b/common/rfb/CMsgReader.cxx
index a78a1a0..e3b73bf 100644
--- a/common/rfb/CMsgReader.cxx
+++ b/common/rfb/CMsgReader.cxx
@@ -28,14 +28,14 @@
   : imageBufIdealSize(0), handler(handler_), is(is_),
     imageBuf(0), imageBufSize(0)
 {
-  for (unsigned int i = 0; i <= encodingMax; i++) {
+  for (int i = 0; i <= encodingMax; i++) {
     decoders[i] = 0;
   }
 }
 
 CMsgReader::~CMsgReader()
 {
-  for (unsigned int i = 0; i <= encodingMax; i++) {
+  for (int i = 0; i <= encodingMax; i++) {
     delete decoders[i];
   }
   delete [] imageBuf;
@@ -82,7 +82,7 @@
   handler->framebufferUpdateEnd();
 }
 
-void CMsgReader::readRect(const Rect& r, unsigned int encoding)
+void CMsgReader::readRect(const Rect& r, int encoding)
 {
   if ((r.br.x > handler->cp.width) || (r.br.y > handler->cp.height)) {
     fprintf(stderr, "Rect too big: %dx%d at %d,%d exceeds %dx%d\n",
diff --git a/common/rfb/CMsgReader.h b/common/rfb/CMsgReader.h
index 7a611fc..7b36160 100644
--- a/common/rfb/CMsgReader.h
+++ b/common/rfb/CMsgReader.h
@@ -55,7 +55,7 @@
 
     virtual void readFramebufferUpdateStart();
     virtual void readFramebufferUpdateEnd();
-    virtual void readRect(const Rect& r, unsigned int encoding);
+    virtual void readRect(const Rect& r, int encoding);
 
     virtual void readCopyRect(const Rect& r);
 
diff --git a/common/rfb/CMsgReaderV3.cxx b/common/rfb/CMsgReaderV3.cxx
index 5471593..ba516bf 100644
--- a/common/rfb/CMsgReaderV3.cxx
+++ b/common/rfb/CMsgReaderV3.cxx
@@ -72,7 +72,7 @@
     int y = is->readU16();
     int w = is->readU16();
     int h = is->readU16();
-    unsigned int encoding = is->readU32();
+    int encoding = is->readS32();
 
     switch (encoding) {
     case pseudoEncodingDesktopSize:
diff --git a/common/rfb/ConnParams.cxx b/common/rfb/ConnParams.cxx
index 7b27a73..9bfc302 100644
--- a/common/rfb/ConnParams.cxx
+++ b/common/rfb/ConnParams.cxx
@@ -85,11 +85,11 @@
   name_ = strDup(name);
 }
 
-void ConnParams::setEncodings(int nEncodings, const rdr::U32* encodings)
+void ConnParams::setEncodings(int nEncodings, const rdr::S32* encodings)
 {
   if (nEncodings > nEncodings_) {
     delete [] encodings_;
-    encodings_ = new rdr::U32[nEncodings];
+    encodings_ = new rdr::S32[nEncodings];
   }
   nEncodings_ = nEncodings;
   useCopyRect = false;
diff --git a/common/rfb/ConnParams.h b/common/rfb/ConnParams.h
index 7779640..54b5ada 100644
--- a/common/rfb/ConnParams.h
+++ b/common/rfb/ConnParams.h
@@ -66,10 +66,10 @@
     const char* name() { return name_; }
     void setName(const char* name);
 
-    rdr::U32 currentEncoding() { return currentEncoding_; }
+    rdr::S32 currentEncoding() { return currentEncoding_; }
     int nEncodings() { return nEncodings_; }
-    const rdr::U32* encodings() { return encodings_; }
-    void setEncodings(int nEncodings, const rdr::U32* encodings);
+    const rdr::S32* encodings() { return encodings_; }
+    void setEncodings(int nEncodings, const rdr::S32* encodings);
     bool useCopyRect;
 
     bool supportsLocalCursor;
@@ -91,7 +91,7 @@
     PixelFormat pf_;
     char* name_;
     int nEncodings_;
-    rdr::U32* encodings_;
+    rdr::S32* encodings_;
     int currentEncoding_;
     char verStr[13];
     int verStrPos;
diff --git a/common/rfb/Decoder.cxx b/common/rfb/Decoder.cxx
index b6e4fd5..61d8bce 100644
--- a/common/rfb/Decoder.cxx
+++ b/common/rfb/Decoder.cxx
@@ -32,19 +32,19 @@
 
 DecoderCreateFnType Decoder::createFns[encodingMax+1] = { 0 };
 
-bool Decoder::supported(unsigned int encoding)
+bool Decoder::supported(int encoding)
 {
   return encoding <= encodingMax && createFns[encoding];
 }
 
-Decoder* Decoder::createDecoder(unsigned int encoding, CMsgReader* reader)
+Decoder* Decoder::createDecoder(int encoding, CMsgReader* reader)
 {
   if (encoding <= encodingMax && createFns[encoding])
     return (*createFns[encoding])(reader);
   return 0;
 }
 
-void Decoder::registerDecoder(unsigned int encoding,
+void Decoder::registerDecoder(int encoding,
                               DecoderCreateFnType createFn)
 {
   if (encoding > encodingMax)
diff --git a/common/rfb/Decoder.h b/common/rfb/Decoder.h
index 3fdba53..50aee82 100644
--- a/common/rfb/Decoder.h
+++ b/common/rfb/Decoder.h
@@ -32,9 +32,9 @@
     virtual ~Decoder();
     virtual void readRect(const Rect& r, CMsgHandler* handler)=0;
 
-    static bool supported(unsigned int encoding);
-    static Decoder* createDecoder(unsigned int encoding, CMsgReader* reader);
-    static void registerDecoder(unsigned int encoding,
+    static bool supported(int encoding);
+    static Decoder* createDecoder(int encoding, CMsgReader* reader);
+    static void registerDecoder(int encoding,
                                 DecoderCreateFnType createFn);
   private:
     static DecoderCreateFnType createFns[encodingMax+1];
diff --git a/common/rfb/Encoder.cxx b/common/rfb/Encoder.cxx
index 53cb170..b0bd147 100644
--- a/common/rfb/Encoder.cxx
+++ b/common/rfb/Encoder.cxx
@@ -32,19 +32,19 @@
 
 EncoderCreateFnType Encoder::createFns[encodingMax+1] = { 0 };
 
-bool Encoder::supported(unsigned int encoding)
+bool Encoder::supported(int encoding)
 {
   return encoding <= encodingMax && createFns[encoding];
 }
 
-Encoder* Encoder::createEncoder(unsigned int encoding, SMsgWriter* writer)
+Encoder* Encoder::createEncoder(int encoding, SMsgWriter* writer)
 {
   if (encoding <= encodingMax && createFns[encoding])
     return (*createFns[encoding])(writer);
   return 0;
 }
 
-void Encoder::registerEncoder(unsigned int encoding,
+void Encoder::registerEncoder(int encoding,
                               EncoderCreateFnType createFn)
 {
   if (encoding > encodingMax)
@@ -56,7 +56,7 @@
   createFns[encoding] = createFn;
 }
 
-void Encoder::unregisterEncoder(unsigned int encoding)
+void Encoder::unregisterEncoder(int encoding)
 {
   if (encoding > encodingMax)
     throw Exception("Encoder::unregisterEncoder: encoding out of range");
diff --git a/common/rfb/Encoder.h b/common/rfb/Encoder.h
index df50dd6..2a6e2f6 100644
--- a/common/rfb/Encoder.h
+++ b/common/rfb/Encoder.h
@@ -40,11 +40,11 @@
     // rectangle which was updated.
     virtual bool writeRect(const Rect& r, ImageGetter* ig, Rect* actual)=0;
 
-    static bool supported(unsigned int encoding);
-    static Encoder* createEncoder(unsigned int encoding, SMsgWriter* writer);
-    static void registerEncoder(unsigned int encoding,
+    static bool supported(int encoding);
+    static Encoder* createEncoder(int encoding, SMsgWriter* writer);
+    static void registerEncoder(int encoding,
                                 EncoderCreateFnType createFn);
-    static void unregisterEncoder(unsigned int encoding);
+    static void unregisterEncoder(int encoding);
   private:
     static EncoderCreateFnType createFns[encodingMax+1];
   };
diff --git a/common/rfb/SConnection.cxx b/common/rfb/SConnection.cxx
index 084fcd3..30def29 100644
--- a/common/rfb/SConnection.cxx
+++ b/common/rfb/SConnection.cxx
@@ -442,7 +442,7 @@
   CapsList ecaps;
 
   // First, add true encodings.
-  for (unsigned int i = 1; i <= encodingMax; i++) {
+  for (int i = 1; i <= encodingMax; i++) {
     if (Encoder::supported(i)) {
       // FIXME: Capability info should be provided by Encoder objects.
       switch (i) {
diff --git a/common/rfb/SMsgHandler.cxx b/common/rfb/SMsgHandler.cxx
index 8124c50..730bc2c 100644
--- a/common/rfb/SMsgHandler.cxx
+++ b/common/rfb/SMsgHandler.cxx
@@ -39,7 +39,7 @@
   cp.setPF(pf);
 }
 
-void SMsgHandler::setEncodings(int nEncodings, rdr::U32* encodings)
+void SMsgHandler::setEncodings(int nEncodings, rdr::S32* encodings)
 {
   cp.setEncodings(nEncodings, encodings);
   supportsLocalCursor();
diff --git a/common/rfb/SMsgHandler.h b/common/rfb/SMsgHandler.h
index f212edf..a0bc64a 100644
--- a/common/rfb/SMsgHandler.h
+++ b/common/rfb/SMsgHandler.h
@@ -46,7 +46,7 @@
     virtual void clientInit(bool shared);
 
     virtual void setPixelFormat(const PixelFormat& pf);
-    virtual void setEncodings(int nEncodings, rdr::U32* encodings);
+    virtual void setEncodings(int nEncodings, rdr::S32* encodings);
     virtual void framebufferUpdateRequest(const Rect& r, bool incremental) = 0;
     virtual void setDesktopSize(int fb_width, int fb_height,
                                 const ScreenSet& layout) = 0;
diff --git a/common/rfb/SMsgReader.cxx b/common/rfb/SMsgReader.cxx
index 447e0a4..49d8dcf 100644
--- a/common/rfb/SMsgReader.cxx
+++ b/common/rfb/SMsgReader.cxx
@@ -51,7 +51,7 @@
 {
   is->skip(1);
   int nEncodings = is->readU16();
-  rdr::U32Array encodings(nEncodings);
+  rdr::S32Array encodings(nEncodings);
   for (int i = 0; i < nEncodings; i++)
     encodings.buf[i] = is->readU32();
   handler->setEncodings(nEncodings, encodings.buf);
diff --git a/common/rfb/SMsgWriter.cxx b/common/rfb/SMsgWriter.cxx
index 1695161..2262be0 100644
--- a/common/rfb/SMsgWriter.cxx
+++ b/common/rfb/SMsgWriter.cxx
@@ -34,7 +34,7 @@
     currentEncoding(0), updatesSent(0), rawBytesEquivalent(0),
     imageBuf(0), imageBufSize(0)
 {
-  for (unsigned int i = 0; i <= encodingMax; i++) {
+  for (int i = 0; i <= encodingMax; i++) {
     encoders[i] = 0;
     bytesSent[i] = 0;
     rectsSent[i] = 0;
@@ -45,7 +45,7 @@
 {
   vlog.info("framebuffer updates %d",updatesSent);
   int bytes = 0;
-  for (unsigned int i = 0; i <= encodingMax; i++) {
+  for (int i = 0; i <= encodingMax; i++) {
     delete encoders[i];
     if (i != encodingCopyRect)
       bytes += bytesSent[i];
@@ -92,7 +92,7 @@
 
 void SMsgWriter::setupCurrentEncoder()
 {
-  unsigned int encoding = cp->currentEncoding();
+  int encoding = cp->currentEncoding();
 
   // FIXME: Code duplication, see writeRect().
   if (!encoders[encoding]) {
@@ -106,7 +106,7 @@
 
 int SMsgWriter::getNumRects(const Rect &r)
 {
-  unsigned int encoding = cp->currentEncoding();
+  int encoding = cp->currentEncoding();
 
   if (!encoders[encoding])
     setupCurrentEncoder();
@@ -169,7 +169,7 @@
   return writeRect(r, cp->currentEncoding(), ig, actual);
 }
 
-bool SMsgWriter::writeRect(const Rect& r, unsigned int encoding,
+bool SMsgWriter::writeRect(const Rect& r, int encoding,
                            ImageGetter* ig, Rect* actual)
 {
   if (!encoders[encoding]) {
diff --git a/common/rfb/SMsgWriter.h b/common/rfb/SMsgWriter.h
index 44a3915..007d758 100644
--- a/common/rfb/SMsgWriter.h
+++ b/common/rfb/SMsgWriter.h
@@ -145,12 +145,12 @@
     // write the whole rectangle it returns false and sets actual to the actual
     // rectangle which was updated.
     virtual bool writeRect(const Rect& r, ImageGetter* ig, Rect* actual);
-    virtual bool writeRect(const Rect& r, unsigned int encoding,
+    virtual bool writeRect(const Rect& r, int encoding,
                            ImageGetter* ig, Rect* actual);
 
     virtual void writeCopyRect(const Rect& r, int srcX, int srcY);
 
-    virtual void startRect(const Rect& r, unsigned int enc)=0;
+    virtual void startRect(const Rect& r, int enc)=0;
     virtual void endRect()=0;
 
     ConnParams* getConnParams() { return cp; }
@@ -176,7 +176,7 @@
 
     Encoder* encoders[encodingMax+1];
     int lenBeforeRect;
-    unsigned int currentEncoding;
+    int currentEncoding;
     int updatesSent;
     int bytesSent[encodingMax+1];
     int rectsSent[encodingMax+1];
diff --git a/common/rfb/SMsgWriterV3.cxx b/common/rfb/SMsgWriterV3.cxx
index 6f0aed0..08f5a2e 100644
--- a/common/rfb/SMsgWriterV3.cxx
+++ b/common/rfb/SMsgWriterV3.cxx
@@ -221,7 +221,7 @@
   endMsg();
 }
 
-void SMsgWriterV3::startRect(const Rect& r, unsigned int encoding)
+void SMsgWriterV3::startRect(const Rect& r, int encoding)
 {
   if (++nRectsInUpdate > nRectsInHeader && nRectsInHeader)
     throw Exception("SMsgWriterV3::startRect: nRects out of sync");
diff --git a/common/rfb/SMsgWriterV3.h b/common/rfb/SMsgWriterV3.h
index 5e0a3f1..8918a04 100644
--- a/common/rfb/SMsgWriterV3.h
+++ b/common/rfb/SMsgWriterV3.h
@@ -52,7 +52,7 @@
     virtual void writeFramebufferUpdateStart(int nRects);
     virtual void writeFramebufferUpdateStart();
     virtual void writeFramebufferUpdateEnd();
-    virtual void startRect(const Rect& r, unsigned int encoding);
+    virtual void startRect(const Rect& r, int encoding);
     virtual void endRect();
 
   protected:
diff --git a/common/rfb/encodings.cxx b/common/rfb/encodings.cxx
index 6aa81c4..97f547b 100644
--- a/common/rfb/encodings.cxx
+++ b/common/rfb/encodings.cxx
@@ -34,7 +34,7 @@
   return -1;
 }
 
-const char* rfb::encodingName(unsigned int num)
+const char* rfb::encodingName(int num)
 {
   switch (num) {
   case encodingRaw:      return "raw";
diff --git a/common/rfb/encodings.h b/common/rfb/encodings.h
index 17c7f29..16cd73a 100644
--- a/common/rfb/encodings.h
+++ b/common/rfb/encodings.h
@@ -20,30 +20,30 @@
 
 namespace rfb {
 
-  const unsigned int encodingRaw = 0;
-  const unsigned int encodingCopyRect = 1;
-  const unsigned int encodingRRE = 2;
-  const unsigned int encodingCoRRE = 4;
-  const unsigned int encodingHextile = 5;
-  const unsigned int encodingTight = 7;
-  const unsigned int encodingZRLE = 16;
+  const int encodingRaw = 0;
+  const int encodingCopyRect = 1;
+  const int encodingRRE = 2;
+  const int encodingCoRRE = 4;
+  const int encodingHextile = 5;
+  const int encodingTight = 7;
+  const int encodingZRLE = 16;
 
-  const unsigned int encodingMax = 255;
+  const int encodingMax = 255;
 
-  const unsigned int pseudoEncodingXCursor = 0xffffff10;
-  const unsigned int pseudoEncodingCursor = 0xffffff11;
-  const unsigned int pseudoEncodingDesktopSize = 0xffffff21;
-  const unsigned int pseudoEncodingExtendedDesktopSize = 0xfffffecc;
-  const unsigned int pseudoEncodingDesktopName = 0xfffffecdl;
+  const int pseudoEncodingXCursor = -240;
+  const int pseudoEncodingCursor = -239;
+  const int pseudoEncodingDesktopSize = -223;
+  const int pseudoEncodingExtendedDesktopSize = -308;
+  const int pseudoEncodingDesktopName = -307;
 
   // TightVNC-specific
-  const unsigned int pseudoEncodingLastRect = 0xFFFFFF20;
-  const unsigned int pseudoEncodingQualityLevel0 = 0xFFFFFFE0;
-  const unsigned int pseudoEncodingQualityLevel9 = 0xFFFFFFE9;
-  const unsigned int pseudoEncodingCompressLevel0 = 0xFFFFFF00;
-  const unsigned int pseudoEncodingCompressLevel9 = 0xFFFFFF09;
+  const int pseudoEncodingLastRect = -224;
+  const int pseudoEncodingQualityLevel0 = -32;
+  const int pseudoEncodingQualityLevel9 = -23;
+  const int pseudoEncodingCompressLevel0 = -256;
+  const int pseudoEncodingCompressLevel9 = -247;
 
   int encodingNum(const char* name);
-  const char* encodingName(unsigned int num);
+  const char* encodingName(int num);
 }
 #endif
