diff --git a/common/rfb/CMakeLists.txt b/common/rfb/CMakeLists.txt
index 5ae9ade..050d408 100644
--- a/common/rfb/CMakeLists.txt
+++ b/common/rfb/CMakeLists.txt
@@ -13,8 +13,6 @@
   CSecurityStack.cxx
   CSecurityVeNCrypt.cxx
   CSecurityVncAuth.cxx
-  CapsContainer.cxx
-  CapsList.cxx
   ComparingUpdateTracker.cxx
   Configuration.cxx
   ConnParams.cxx
diff --git a/common/rfb/CapsContainer.cxx b/common/rfb/CapsContainer.cxx
deleted file mode 100644
index 2b56976..0000000
--- a/common/rfb/CapsContainer.cxx
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Copyright (C) 2003-2006 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.
- */
-
-//
-// CapsContainer class implementation.
-// Member variables and functions are documented in CapsContainer.h.
-//
-
-#include <rfb/CapsContainer.h>
-#include <string.h>
-
-using namespace rfb;
-
-CapsContainer::CapsContainer(int maxCaps)
-: m_maxSize(maxCaps), m_listSize(0), m_plist(new rdr::U32[m_maxSize])
-{
-}
-
-CapsContainer::~CapsContainer()
-{
-  delete[] m_plist;
-
-  // Remove char[] strings allocated by the new[] operator.
-  std::map<rdr::U32,char*>::const_iterator iter;
-  for (iter = m_descMap.begin(); iter != m_descMap.end(); iter++) {
-    delete[] iter->second;
-  }
-}
-
-void
-CapsContainer::add(rdr::U32 code, const char *vendor, const char *name,
-                   const char *desc)
-{
-  // Fill in an rfbCapabilityInfo structure and pass it to the overloaded
-  // function.
-  CapabilityInfo capinfo;
-  capinfo.code = code;
-  memcpy(capinfo.vendorSignature, vendor, 4);
-  memcpy(capinfo.nameSignature, name, 8);
-  add(&capinfo, desc);
-}
-
-void
-CapsContainer::add(const CapabilityInfo *capinfo, const char *desc)
-{
-  m_infoMap[capinfo->code] = *capinfo;
-  m_enableMap[capinfo->code] = false;
-
-  if (isKnown(capinfo->code)) {
-    delete[] m_descMap[capinfo->code];
-  }
-  char *desc_copy = 0;
-  if (desc != 0) {
-    desc_copy = new char[strlen(desc) + 1];
-    strcpy(desc_copy, desc);
-  }
-  m_descMap[capinfo->code] = desc_copy;
-}
-
-bool
-CapsContainer::isKnown(rdr::U32 code) const
-{
-  return (m_descMap.find(code) != m_descMap.end());
-}
-
-bool
-CapsContainer::getInfo(rdr::U32 code, CapabilityInfo *capinfo) const
-{
-  if (isKnown(code)) {
-    *capinfo = m_infoMap.find(code)->second;
-    return true;
-  }
-
-  return false;
-}
-
-char *
-CapsContainer::getDescription(rdr::U32 code) const
-{
-  return (isKnown(code)) ? m_descMap.find(code)->second : 0;
-}
-
-bool
-CapsContainer::enable(const CapabilityInfo *capinfo)
-{
-  if (!isKnown(capinfo->code))
-    return false;
-
-  const CapabilityInfo *known = &(m_infoMap[capinfo->code]);
-  if ( memcmp(known->vendorSignature, capinfo->vendorSignature, 4) != 0 ||
-       memcmp(known->nameSignature, capinfo->nameSignature, 8) != 0 ) {
-    m_enableMap[capinfo->code] = false;
-    return false;
-  }
-
-  m_enableMap[capinfo->code] = true;
-  if (m_listSize < m_maxSize) {
-    m_plist[m_listSize++] = capinfo->code;
-  }
-  return true;
-}
-
-bool
-CapsContainer::isEnabled(rdr::U32 code) const
-{
-  return (isKnown(code)) ? m_enableMap.find(code)->second : false;
-}
-
-rdr::U32
-CapsContainer::getByOrder(int idx) const
-{
-  return (idx < m_listSize) ? m_plist[idx] : 0;
-}
-
diff --git a/common/rfb/CapsContainer.h b/common/rfb/CapsContainer.h
deleted file mode 100644
index 43fe815..0000000
--- a/common/rfb/CapsContainer.h
+++ /dev/null
@@ -1,132 +0,0 @@
-/* Copyright (C) 2003-2006 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.
- */
-
-//
-// CapsContainer and associated structures - dealing with TightVNC-specific
-// protocol capability lists.
-//
-
-#ifndef __RFB_CAPSCONTAINER_H__
-#define __RFB_CAPSCONTAINER_H__
-
-#include <rdr/types.h>
-
-#include <map>
-
-namespace rfb {
-
-  //
-  // CapabilityInfo - structure used to describe protocol options such as
-  // tunneling methods, authentication schemes, message types and encoding
-  // types (protocol versions 3.7 and 3.8 with TightVNC extensions).
-  //
-
-  struct CapabilityInfo {
-    rdr::U32 code;                // numeric identifier
-    rdr::U8 vendorSignature[4];   // vendor identification
-    rdr::U8 nameSignature[8];     // abbreviated option name
-  };
-
-  //
-  // CapsContainer - a container class to maintain a list of protocol
-  // capabilities.
-  //
-  // Typical usage is as follows. First, the client creates an instance
-  // of the CapsContainer class for each type of capabilities (e.g.
-  // authentication methods). It adds information about capabilities it
-  // supports, by calling add() functions. Then, the client receives
-  // information about supported capabilities from the server, and tries
-  // to "enable" each capability advertised by the server. Particular
-  // capability becomes enabled if it is known (added by the client) and
-  // matches that one received from the server. Finally, the client can
-  // check if a given capability is enabled, and also get the list of
-  // capabilities in the order they were listed by the server.
-  //
-
-  class CapsContainer
-  {
-  public:
-
-    // Constructor. The maxCaps argument is the maximum number of records
-    // in the list used by getByOrder() function. Remaining functions do not
-    // impose limitations on the number of capabilities.
-    CapsContainer(int maxCaps = 64);
-
-    // Destructor.
-    virtual ~CapsContainer();
-
-    // Add information about a particular capability into the object. These
-    // functions overwrite existing capability records with the same code.
-    // NOTE: Value 0 should not be used for capability codes.
-    void add(const CapabilityInfo *capinfo, const char *desc = 0);
-    void add(rdr::U32 code, const char *vendor, const char *name,
-             const char *desc = 0);
-
-    // Check if a capability with the specified code was added earlier.
-    bool isKnown(rdr::U32 code) const;
-
-    // Fill in an rfbCapabilityInfo structure with contents corresponding to
-    // the specified code. Returns true on success, false if the specified
-    // code is not known.
-    bool getInfo(rdr::U32 code, CapabilityInfo *capinfo) const;
-
-    // Get an optional description string for the specified capability code.
-    // Returns 0 either if the code is not known, or if there is no
-    // description for the given capability. Otherwise, the return value
-    // is a pointer valid until either add() is called again for the same
-    // capability, or the CapsContaner object is destroyed.
-    char *getDescription(rdr::U32 code) const;
-
-    // Mark the specified capability as "enabled". This function compares
-    // "vendor" and "name" signatures in the existing record and in the
-    // argument structure and enables the capability only if both records
-    // are the same.
-    bool enable(const CapabilityInfo *capinfo);
-
-    // Check if the specified capability is known and enabled.
-    bool isEnabled(rdr::U32 code) const;
-
-    // Return the number of enabled capabilities.
-    int numEnabled() const { return m_listSize; }
-
-    // Return the capability code at the specified index, from the list of
-    // enabled capabilities. Capabilities are indexed in the order they were
-    // enabled, index 0 points to the capability which was enabled first.
-    // If the index is not valid, this function returns 0.
-    rdr::U32 getByOrder(int idx) const;
-
-  private:
-
-    // Mapping codes to corresponding CapabilityInfo structures.
-    std::map<rdr::U32,CapabilityInfo> m_infoMap;
-    // Mapping capability codes to corresponding descriptions.
-    std::map<rdr::U32,char*> m_descMap;
-    // Mapping codes to boolean flags, true for enabled capabilities.
-    std::map<rdr::U32,bool> m_enableMap;
-
-    // Allocated size of m_plist[].
-    int m_maxSize;
-    // Number of valid elements in m_plist[].
-    int m_listSize;
-    // Array of enabled capabilities (allocated in constructor).
-    rdr::U32 *m_plist;
-  };
-
-}
-
-#endif // __RFB_CAPSCONTAINER_H__
diff --git a/common/rfb/CapsList.cxx b/common/rfb/CapsList.cxx
deleted file mode 100644
index 11977b2..0000000
--- a/common/rfb/CapsList.cxx
+++ /dev/null
@@ -1,81 +0,0 @@
-/* Copyright (C) 2006 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.
- */
-
-//
-// CapsList class implementation.
-// Member functions are documented in CapsList.h.
-//
-
-#include <rfb/CapsList.h>
-#include <rdr/OutStream.h>
-
-using namespace rfb;
-
-const char *const CapsList::VENDOR_STD = "STDV";
-const char *const CapsList::VENDOR_TIGHT = "TGHT";
-
-CapsList::CapsList(int maxCaps)
-  : CapsContainer(maxCaps)
-{
-}
-
-CapsList::~CapsList()
-{
-}
-
-void
-CapsList::addStandard(rdr::U32 code, const char *name)
-{
-  add3rdParty(code, name, VENDOR_STD);
-}
-
-void
-CapsList::addTightExt(rdr::U32 code, const char *name)
-{
-  add3rdParty(code, name, VENDOR_TIGHT);
-}
-
-void
-CapsList::add3rdParty(rdr::U32 code, const char *name, const char *vendor)
-{
-  add(code, vendor, name);
-
-  // NOTE: This code is a bit tricky and not the most efficient. However,
-  //       that's not a problem as we prefer simplicity to performance here.
-  //       Here we need to "enable capability" but that requires comparing
-  //       name and vendor strings. So we just make CapsContainer compare
-  //       the same strings with themselves.
-  CapabilityInfo tmp;
-  if (getInfo(code, &tmp))
-    enable(&tmp);
-}
-
-void
-CapsList::write(rdr::OutStream* os) const
-{
-  int count = getSize();
-  CapabilityInfo cap;
-
-  for (int i = 0; i < count; i++) {
-    getInfo(getByOrder(i), &cap);
-    os->writeU32(cap.code);
-    os->writeBytes(&cap.vendorSignature, 4);
-    os->writeBytes(&cap.nameSignature, 8);
-  }
-}
-
diff --git a/common/rfb/CapsList.h b/common/rfb/CapsList.h
deleted file mode 100644
index a267e93..0000000
--- a/common/rfb/CapsList.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/* Copyright (C) 2006 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.
- */
-
-//
-// CapsList - a list of server-side protocol capabilities. This class makes
-// it easy to prepare a capability list and send it via OutStream transport.
-//
-
-#ifndef __RFB_CAPSLIST_H__
-#define __RFB_CAPSLIST_H__
-
-#include <rfb/CapsContainer.h>
-
-namespace rdr { class OutStream; }
-
-namespace rfb {
-
-  // NOTE: Here we use the CapsContainer class for an off-design purpose.
-  //       However, that class is so good that I believe it's better to
-  //       use its well-tested code instead of writing new class from the
-  //       scratch.
-
-  class CapsList : private CapsContainer
-  {
-  public:
-
-    // Constructor.
-    // The maxCaps value is the maximum number of capabilities in the list.
-    CapsList(int maxCaps = 64);
-
-    virtual ~CapsList();
-
-    // Current number of capabilities in the list.
-    int getSize() const { return numEnabled(); }
-
-    // Does the list include nothing more than one particular capability?
-    bool includesOnly(rdr::U32 code) {
-      return (numEnabled() == 1 && getByOrder(0) == code);
-    }
-
-    // Add capability ("standard" vendor).
-    void addStandard(rdr::U32 code, const char *name);
-    // Add capability (TightVNC vendor).
-    void addTightExt(rdr::U32 code, const char *name);
-    // Add capability (any other vendor).
-    void add3rdParty(rdr::U32 code, const char *name, const char *vendor);
-
-    // Send the list of capabilities (not including the counter).
-    void write(rdr::OutStream* os) const;
-
-  protected:
-
-    // Pre-defined signatures for known vendors.
-    static const char *const VENDOR_STD;
-    static const char *const VENDOR_TIGHT;
-  };
-
-}
-
-#endif // __RFB_CAPSLIST_H__
diff --git a/common/rfb/ConnParams.cxx b/common/rfb/ConnParams.cxx
index 3ee3708..a636885 100644
--- a/common/rfb/ConnParams.cxx
+++ b/common/rfb/ConnParams.cxx
@@ -27,7 +27,7 @@
 using namespace rfb;
 
 ConnParams::ConnParams()
-  : majorVersion(0), minorVersion(0), tightExtensionsEnabled(false),
+  : majorVersion(0), minorVersion(0),
     width(0), height(0), useCopyRect(false),
     supportsLocalCursor(false), supportsLocalXCursor(false),
     supportsDesktopResize(false), supportsExtendedDesktopSize(false),
diff --git a/common/rfb/ConnParams.h b/common/rfb/ConnParams.h
index 54b5ada..c25e563 100644
--- a/common/rfb/ConnParams.h
+++ b/common/rfb/ConnParams.h
@@ -40,7 +40,6 @@
 
     int majorVersion;
     int minorVersion;
-    bool tightExtensionsEnabled;
 
     void setVersion(int major, int minor) {
       majorVersion = major; minorVersion = minor;
diff --git a/common/rfb/Makefile.am b/common/rfb/Makefile.am
index d9de932..1894871 100644
--- a/common/rfb/Makefile.am
+++ b/common/rfb/Makefile.am
@@ -4,7 +4,7 @@
 
 VENCRYPT_SRCS = CSecurityTLS.cxx SSecurityTLS.cxx
 
-HDRS = Blacklist.h CapsContainer.h CapsList.h CConnection.h \
+HDRS = Blacklist.h CConnection.h \
 	CMsgHandler.h CMsgReader.h CMsgReaderV3.h CMsgWriter.h \
 	CMsgWriterV3.h ColourCube.h ColourMap.h ComparingUpdateTracker.h \
 	Configuration.h ConnParams.h CSecurity.h CSecurityNone.h \
@@ -32,7 +32,7 @@
 librfb_la_SOURCES = $(HDRS) Blacklist.cxx CConnection.cxx CMsgHandler.cxx \
 	CMsgReader.cxx CMsgReaderV3.cxx CMsgWriter.cxx CMsgWriterV3.cxx \
 	CSecurityPlain.cxx CSecurityStack.cxx CSecurityVeNCrypt.cxx \
-	CSecurityVncAuth.cxx CapsContainer.cxx CapsList.cxx \
+	CSecurityVncAuth.cxx \
 	ComparingUpdateTracker.cxx Configuration.cxx ConnParams.cxx \
 	Cursor.cxx Decoder.cxx d3des.c Encoder.cxx \
 	HTTPServer.cxx HextileDecoder.cxx HextileEncoder.cxx \
diff --git a/common/rfb/SConnection.cxx b/common/rfb/SConnection.cxx
index bc4c982..3762fbb 100644
--- a/common/rfb/SConnection.cxx
+++ b/common/rfb/SConnection.cxx
@@ -20,7 +20,6 @@
 #include <rfb/Exception.h>
 #include <rfb/Security.h>
 #include <rfb/msgTypes.h>
-#include <rfb/CapsList.h>
 #include <rfb/SMsgReaderV3.h>
 #include <rfb/SMsgWriterV3.h>
 #include <rfb/SConnection.h>
@@ -89,8 +88,6 @@
   switch (state_) {
   case RFBSTATE_PROTOCOL_VERSION: processVersionMsg();      break;
   case RFBSTATE_SECURITY_TYPE:    processSecurityTypeMsg(); break;
-  case RFBSTATE_TIGHT_TUNN_TYPE:  processTunnelTypeMsg();   break;
-  case RFBSTATE_TIGHT_AUTH_TYPE:  processAuthTypeMsg();     break;
   case RFBSTATE_SECURITY:         processSecurityMsg();     break;
   case RFBSTATE_INITIALISATION:   processInitMsg();         break;
   case RFBSTATE_NORMAL:           reader_->readMsg();       break;
@@ -167,9 +164,6 @@
     return;
   }
 
-  // Add a special security type to advertise TightVNC protocol extensions.
-  secTypes.push_back(secTypeTight);
-
   // list supported security types for >=3.7 clients
 
   if (secTypes.empty())
@@ -188,107 +182,9 @@
   vlog.debug("processing security type message");
   int secType = is->readU8();
 
-  if (secType == secTypeTight) {
-    vlog.info("Enabling TightVNC protocol extensions");
-    cp.tightExtensionsEnabled = true;
-    offerTunneling();
-  } else {
-    processSecurityType(secType);
-  }
-}
-
-//
-// TightVNC-specific protocol initialization (tunneling, authentication)
-//
-
-void SConnection::offerTunneling()
-{
-  vlog.debug("offering list of tunneling methods");
-  int nTypes = 0;
-
-  // Advertise our tunneling capabilities (currently, nothing to advertise).
-  os->writeU32(nTypes);
-  os->flush();
-
-  if (nTypes) {
-    // NOTE: Never executed in current version.
-    state_ = RFBSTATE_TIGHT_TUNN_TYPE;
-  } else {
-    offerAuthentication();
-  }
-}
-
-// NOTE: This function is never called in current version.
-void SConnection::processTunnelTypeMsg()
-{
-  vlog.debug("processing tunneling type message (TightVNC extension)");
-  int tunnelType = is->readU32();
-  vlog.error("unsupported tunneling type %d requested, ignoring", tunnelType);
-  offerAuthentication();
-}
-
-void SConnection::offerAuthentication()
-{
-  vlog.debug("offering list of authentication methods");
-
-  // See processVersionMsg(), the code below is similar.
-
-  std::list<rdr::U8> secTypes;
-  std::list<rdr::U8>::iterator i;
-
-  // NOTE: In addition to standard security types, we might want to offer
-  //       TightVNC-specific authentication types. But currently we support
-  //       only the standard security types: secTypeNone and secTypeVncAuth.
-  secTypes = security->GetEnabledSecTypes();
-
-  CapsList caps;
-  for (i = secTypes.begin(); i != secTypes.end(); i++) {
-    // FIXME: Capability info should be provided by SSecurity objects.
-    switch (*i) {
-    case secTypeNone:     caps.addStandard(*i, "NOAUTH__"); break;
-    case secTypeVncAuth:  caps.addStandard(*i, "VNCAUTH_"); break;
-    default:
-      // This should not ever happen.
-      vlog.error("not offering unknown security type %d", (int)*i);
-    }
-  }
-
-  if (caps.getSize() < 1)
-    throwConnFailedException("No supported security types");
-
-  if (caps.includesOnly(secTypeNone)) {
-    // Special case - if caps includes nothing else than secTypeNone, we send
-    // an empty capability list and do not expect security type selection from
-    // the client. Then, continue the protocol like if the client has selected
-    // secTypeNone (starting at base protocol version 3.8, "security result"
-    // will follow).
-    os->writeU32(0);
-    os->flush();
-    processSecurityType(secTypeNone);
-  } else {
-    // Normal case - sending the list of authentication capabilities.
-    os->writeU32(caps.getSize());
-    caps.write(os);
-    os->flush();
-    state_ = RFBSTATE_TIGHT_AUTH_TYPE;
-  }
-}
-
-void SConnection::processAuthTypeMsg()
-{
-  vlog.debug("processing authentication type message (TightVNC extension)");
-
-  // NOTE: Currently, we support only the standard security types, so we
-  //       just pass TightVNC authentication type for standard processing,
-  //       just as it was usual RFB security type.
-  int secType = is->readU32();
   processSecurityType(secType);
 }
 
-//
-// End of TightVNC-specific code
-//
-
 void SConnection::processSecurityType(int secType)
 {
   // Verify that the requested security type should be offered
@@ -415,77 +311,9 @@
 void SConnection::clientInit(bool shared)
 {
   writer_->writeServerInit();
-
-  // FIXME: Send interaction capabilities via writer_?
-  if (cp.tightExtensionsEnabled)
-    sendInteractionCaps();
-
   state_ = RFBSTATE_NORMAL;
 }
 
-// FIXME: Move sendInteractionCaps() to a class derived from SMsgWriterV3?
-void SConnection::sendInteractionCaps()
-{
-  //
-  // Advertise support for non-standard server-to-client messages
-  //
-
-  CapsList scaps;
-
-  //
-  // Advertise support for non-standard client-to-server messages
-  //
-
-  CapsList ccaps;
-
-  //
-  // Advertise all supported encoding types (except raw encoding).
-  //
-
-  CapsList ecaps;
-
-  // First, add true encodings.
-  for (int i = 1; i <= encodingMax; i++) {
-    if (Encoder::supported(i)) {
-      // FIXME: Capability info should be provided by Encoder objects.
-      switch (i) {
-      case encodingRRE:      ecaps.addStandard(i, "RRE_____"); break;
-      case encodingCoRRE:    ecaps.addStandard(i, "CORRE___"); break;
-      case encodingHextile:  ecaps.addStandard(i, "HEXTILE_"); break;
-      case encodingZRLE:     ecaps.addStandard(i, "ZRLE____"); break;
-      case encodingTight:    ecaps.addTightExt(i, "TIGHT___"); break;
-      default:
-        // This should not ever happen.
-        vlog.error("not advertising unknown encoding type %d", (int)i);
-      }
-    }
-  }
-
-  // CopyRect is special - Encoder::supported() returns 0 for it,
-  // that's why we add it here explicitly.
-  ecaps.addStandard(encodingCopyRect,             "COPYRECT");
-
-  // Add supported pseudo encodings as well.
-  ecaps.addTightExt(pseudoEncodingCompressLevel0, "COMPRLVL");
-  ecaps.addTightExt(pseudoEncodingQualityLevel0,  "JPEGQLVL");
-  ecaps.addTightExt(pseudoEncodingXCursor,        "X11CURSR");
-  ecaps.addTightExt(pseudoEncodingCursor,         "RCHCURSR");
-  ecaps.addTightExt(pseudoEncodingLastRect,       "LASTRECT");
-  ecaps.addStandard(pseudoEncodingDesktopSize,    "NEWFBSIZ");
-
-  os->writeU16(scaps.getSize());
-  os->writeU16(ccaps.getSize());
-  os->writeU16(ecaps.getSize());
-  os->writeU16(0);
-  if (scaps.getSize())
-    scaps.write(os);
-  if (ccaps.getSize())
-    ccaps.write(os);
-  if (ecaps.getSize())
-    ecaps.write(os);
-  os->flush();
-}
-
 void SConnection::setPixelFormat(const PixelFormat& pf)
 {
   SMsgHandler::setPixelFormat(pf);
diff --git a/common/rfb/SConnection.h b/common/rfb/SConnection.h
index d0bd499..cdfde43 100644
--- a/common/rfb/SConnection.h
+++ b/common/rfb/SConnection.h
@@ -156,8 +156,6 @@
       RFBSTATE_UNINITIALISED,
       RFBSTATE_PROTOCOL_VERSION,
       RFBSTATE_SECURITY_TYPE,
-      RFBSTATE_TIGHT_TUNN_TYPE,
-      RFBSTATE_TIGHT_AUTH_TYPE,
       RFBSTATE_SECURITY,
       RFBSTATE_QUERYING,
       RFBSTATE_INITIALISATION,
@@ -179,13 +177,6 @@
     void processSecurityMsg();
     void processInitMsg();
 
-    // These functions add support for TightVNC protocol extensions.
-    void offerTunneling();
-    void processTunnelTypeMsg();
-    void offerAuthentication();
-    void processAuthTypeMsg();
-    void sendInteractionCaps();
-
     int defaultMajorVersion, defaultMinorVersion;
     rdr::InStream* is;
     rdr::OutStream* os;
