diff --git a/common/rfb/CConnection.cxx b/common/rfb/CConnection.cxx
index 98ef586..3ea217f 100644
--- a/common/rfb/CConnection.cxx
+++ b/common/rfb/CConnection.cxx
@@ -41,10 +41,14 @@
 static LogWriter vlog("CConnection");
 
 CConnection::CConnection()
-  : csecurity(0), is(0), os(0), reader_(0), writer_(0),
+  : csecurity(0),
+    supportsLocalCursor(false), supportsDesktopResize(false),
+    supportsLEDState(false),
+    is(0), os(0), reader_(0), writer_(0),
     shared(false),
     state_(RFBSTATE_UNINITIALISED), useProtocol3_3(false),
     pendingPFChange(false), preferredEncoding(encodingTight),
+    compressLevel(2), qualityLevel(-1),
     formatChange(false), encodingChange(false),
     firstUpdate(true), pendingUpdate(false), continuousUpdates(false),
     forceNonincremental(true),
@@ -498,19 +502,19 @@
 
 void CConnection::setCompressLevel(int level)
 {
-  if (server.compressLevel == level)
+  if (compressLevel == level)
     return;
 
-  server.compressLevel = level;
+  compressLevel = level;
   encodingChange = true;
 }
 
 void CConnection::setQualityLevel(int level)
 {
-  if (server.qualityLevel == level)
+  if (qualityLevel == level)
     return;
 
-  server.qualityLevel = level;
+  qualityLevel = level;
   encodingChange = true;
 }
 
@@ -590,16 +594,16 @@
 {
   std::list<rdr::U32> encodings;
 
-  if (server.supportsLocalCursor) {
+  if (supportsLocalCursor) {
     encodings.push_back(pseudoEncodingCursorWithAlpha);
     encodings.push_back(pseudoEncodingCursor);
     encodings.push_back(pseudoEncodingXCursor);
   }
-  if (server.supportsDesktopResize) {
+  if (supportsDesktopResize) {
     encodings.push_back(pseudoEncodingDesktopSize);
     encodings.push_back(pseudoEncodingExtendedDesktopSize);
   }
-  if (server.supportsLEDState)
+  if (supportsLEDState)
     encodings.push_back(pseudoEncodingLEDState);
 
   encodings.push_back(pseudoEncodingDesktopName);
@@ -619,10 +623,10 @@
       encodings.push_back(i);
   }
 
-  if (server.compressLevel >= 0 && server.compressLevel <= 9)
-      encodings.push_back(pseudoEncodingCompressLevel0 + server.compressLevel);
-  if (server.qualityLevel >= 0 && server.qualityLevel <= 9)
-      encodings.push_back(pseudoEncodingQualityLevel0 + server.qualityLevel);
+  if (compressLevel >= 0 && compressLevel <= 9)
+      encodings.push_back(pseudoEncodingCompressLevel0 + compressLevel);
+  if (qualityLevel >= 0 && qualityLevel <= 9)
+      encodings.push_back(pseudoEncodingQualityLevel0 + qualityLevel);
 
   writer()->writeSetEncodings(encodings);
 }
diff --git a/common/rfb/CConnection.h b/common/rfb/CConnection.h
index a0fa54a..5a3ef91 100644
--- a/common/rfb/CConnection.h
+++ b/common/rfb/CConnection.h
@@ -188,6 +188,13 @@
 
     ModifiablePixelBuffer* getFramebuffer() { return framebuffer; }
 
+  protected:
+    // Optional capabilities that a subclass is expected to set to true
+    // if supported
+    bool supportsLocalCursor;
+    bool supportsDesktopResize;
+    bool supportsLEDState;
+
   private:
     // This is a default implementation of fences that automatically
     // responds to requests, stating no support for synchronisation.
@@ -224,6 +231,8 @@
     rfb::PixelFormat pendingPF;
 
     int preferredEncoding;
+    int compressLevel;
+    int qualityLevel;
 
     bool formatChange;
     rfb::PixelFormat nextPF;
diff --git a/common/rfb/ServerParams.cxx b/common/rfb/ServerParams.cxx
index 289c864..bfeb80d 100644
--- a/common/rfb/ServerParams.cxx
+++ b/common/rfb/ServerParams.cxx
@@ -25,12 +25,9 @@
 
 ServerParams::ServerParams()
   : majorVersion(0), minorVersion(0),
-    supportsLocalCursor(false),
-    supportsDesktopResize(false),
-    supportsLEDState(false), supportsQEMUKeyEvent(false),
+    supportsQEMUKeyEvent(false),
     supportsSetDesktopSize(false), supportsFence(false),
     supportsContinuousUpdates(false),
-    compressLevel(2), qualityLevel(-1),
     width_(0), height_(0), name_(0),
     ledState_(ledUnknown)
 {
diff --git a/common/rfb/ServerParams.h b/common/rfb/ServerParams.h
index 09ebddc..7a58ea3 100644
--- a/common/rfb/ServerParams.h
+++ b/common/rfb/ServerParams.h
@@ -69,18 +69,11 @@
     unsigned int ledState() { return ledState_; }
     void setLEDState(unsigned int state);
 
-    bool supportsLocalCursor;
-    bool supportsDesktopResize;
-    bool supportsLEDState;
     bool supportsQEMUKeyEvent;
-
     bool supportsSetDesktopSize;
     bool supportsFence;
     bool supportsContinuousUpdates;
 
-    int compressLevel;
-    int qualityLevel;
-
   private:
 
     int width_;
diff --git a/vncviewer/CConn.cxx b/vncviewer/CConn.cxx
index 5c40a70..b4610e6 100644
--- a/vncviewer/CConn.cxx
+++ b/vncviewer/CConn.cxx
@@ -80,17 +80,15 @@
   setShared(::shared);
   sock = socket;
 
-  server.supportsLocalCursor = true;
-
-  server.supportsDesktopResize = true;
-
-  server.supportsLEDState = true;
+  supportsLocalCursor = true;
+  supportsDesktopResize = true;
+  supportsLEDState = true;
 
   if (customCompressLevel)
-    setCompressLevel(compressLevel);
+    setCompressLevel(::compressLevel);
 
   if (!noJpeg)
-    setQualityLevel(qualityLevel);
+    setQualityLevel(::qualityLevel);
 
   if(sock == NULL) {
     try {
@@ -452,7 +450,7 @@
   int kbitsPerSecond = sock->inStream().kbitsPerSecond();
   unsigned int timeWaited = sock->inStream().timeWaited();
   bool newFullColour = fullColour;
-  int newQualityLevel = qualityLevel;
+  int newQualityLevel = ::qualityLevel;
 
   // Always use Tight
   setPreferredEncoding(encodingTight);
@@ -468,10 +466,10 @@
     else
       newQualityLevel = 6;
 
-    if (newQualityLevel != qualityLevel) {
+    if (newQualityLevel != ::qualityLevel) {
       vlog.info(_("Throughput %d kbit/s - changing to quality %d"),
                 kbitsPerSecond, newQualityLevel);
-      qualityLevel.setParam(newQualityLevel);
+      ::qualityLevel.setParam(newQualityLevel);
       setQualityLevel(newQualityLevel);
     }
   }
@@ -540,12 +538,12 @@
   }
 
   if (customCompressLevel)
-    self->setCompressLevel(compressLevel);
+    self->setCompressLevel(::compressLevel);
   else
     self->setCompressLevel(-1);
 
   if (!noJpeg && !autoSelect)
-    self->setQualityLevel(qualityLevel);
+    self->setQualityLevel(::qualityLevel);
   else
     self->setQualityLevel(-1);
 
