Merge branch 'readonlypassword' of https://github.com/michalsrb/tigervnc into viewonly
diff --git a/BUILDING.txt b/BUILDING.txt
index 8f686cc..41f493e 100644
--- a/BUILDING.txt
+++ b/BUILDING.txt
@@ -15,6 +15,7 @@
 
 -- If building TLS support:
    * GnuTLS
+   * See "Building TLS Support" below.
 
 -- If building native language support (NLS):
    * Gnu gettext 0.14.4 or later
@@ -322,6 +323,26 @@
 
 
 ======================================
+Building TLS Support
+======================================
+
+TLS requires GnuTLS, which is supplied with most Linux distributions and
+with MinGW for Windows and can be built from source on OS X and other 
+Unix variants. However, GnuTLS versions > 2.12.x && < 3.3.x should be
+avoided because of potential incompatibilities during initial handshaking.
+
+You can override the GNUTLS_LIBRARY and GNUTLS_INCLUDE_DIR CMake variables
+to specify the locations of libgnutls and any dependencies.  For instance,
+adding
+
+  -DGNUTLS_INCLUDE_DIR=/usr/local/include \
+  -DGNUTLS_LIBRARY=/usr/local/lib/libgnutls.a
+
+to the CMake command line would link TigerVNC against a static version of
+libgnutls located under /usr/local.
+
+
+======================================
 Building Native Language Support (NLS)
 ======================================
 
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1dcfd9e..3091d7b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -18,10 +18,10 @@
 include(CMakeMacroLibtoolFile)
 
 project(tigervnc)
-set(VERSION 1.3.80)
+set(VERSION 1.4.80)
 
 # The RC version must always be four comma-separated numbers
-set(RCVERSION 1,3,80,0)
+set(RCVERSION 1,4,80,0)
 
 # Installation paths
 set(BIN_DIR "${CMAKE_INSTALL_PREFIX}/bin")
@@ -321,6 +321,12 @@
   set(CMAKE_EXTRA_INCLUDE_FILES sys/socket.h)
 endif()
 check_function_exists(inet_aton HAVE_INET_ATON)
+# This might give a false positive on Windows as it is also guarded by
+# a version check that we do not satisfy (requires Vista, but we target
+# Windows 2000).
+if(NOT WIN32)
+check_function_exists(inet_pton HAVE_INET_PTON)
+endif()
 check_function_exists(getaddrinfo HAVE_GETADDRINFO)
 set(CMAKE_EXTRA_INCLUDE_FILES) 
 set(CMAKE_REQUIRED_LIBRARIES)
diff --git a/cmake/Modules/CMakeMacroLibtoolFile.cmake b/cmake/Modules/CMakeMacroLibtoolFile.cmake
index 0afb7a6..f2ea7f8 100644
--- a/cmake/Modules/CMakeMacroLibtoolFile.cmake
+++ b/cmake/Modules/CMakeMacroLibtoolFile.cmake
@@ -14,7 +14,21 @@
   # into libtool control file as library dependencies, and handle a few corner
   # cases.
   #
+
+  # First we need to split up any internal entries
+  set(target_libs "")
   foreach(library ${${_target}_LIB_DEPENDS})
+    if("${library}" MATCHES " ")
+      string(REPLACE " " ";" lib_list "${library}")
+      list(APPEND target_libs ${lib_list})
+    else()
+      list(APPEND target_libs "${library}")
+    endif()
+  endforeach()
+
+  set(STATIC_MODE OFF)
+
+  foreach(library ${target_libs})
     # Assume all entries are shared libs if platform-specific static library
     # extension is not matched.
     if("${library}" MATCHES "[^.+\\${CMAKE_STATIC_LIBRARY_SUFFIX}]$")
@@ -31,23 +45,46 @@
         # No shared library extension matched.  Check whether target is a CMake
         # target.
         get_target_property(_ltp ${library} TYPE)
-        if(NOT _ltp AND NOT ${library} STREQUAL "general")
-          # Not a CMake target, so use find_library() to attempt to locate the
+        if(_ltp OR ${library} STREQUAL "general")
+          # Target is a CMake target, so ignore (CMake targets are static
+          # libs in TigerVNC.)
+        elseif(${library} STREQUAL "-Wl,-Bstatic")
+          # All following libraries should be static
+          set(STATIC_MODE ON)
+        elseif(${library} STREQUAL "-Wl,-Bdynamic")
+          # All following libraries should be dynamic
+          set(STATIC_MODE OFF)
+        else()
+          # Normal library, so use find_library() to attempt to locate the
           # library in a system directory.
+
+          # Need to remove -l prefix
+          if (${library} MATCHES "^\\${CMAKE_LINK_LIBRARY_FLAG}")
+            string(REPLACE ${CMAKE_LINK_LIBRARY_FLAG} "" library ${library})
+          endif()
+
+          if(STATIC_MODE)
+            set(library ${CMAKE_STATIC_LIBRARY_PREFIX}${library}${CMAKE_STATIC_LIBRARY_SUFFIX})
+          endif()
+
           find_library(FL ${library})
           if(FL)
-            # Found library, so extract the path and library name, then add the
+            # Found library. Depending on if it's static or not we might
+            # extract the path and library name, then add the
             # result to the libtool dependency libs.
-            get_filename_component(_shared_lib ${FL} NAME_WE)
-            get_filename_component(_shared_lib_path ${FL} PATH)
-            string(REPLACE "lib" "" _shared_lib ${_shared_lib})
-            set(_target_dependency_libs "${_target_dependency_libs} -L${_shared_lib_path} -l${_shared_lib}")
+            if(STATIC_MODE)
+              set(_target_dependency_libs "${_target_dependency_libs} ${FL}")
+            else()
+              get_filename_component(_shared_lib ${FL} NAME_WE)
+              get_filename_component(_shared_lib_path ${FL} PATH)
+              string(REPLACE "lib" "" _shared_lib ${_shared_lib})
+              set(_target_dependency_libs "${_target_dependency_libs} -L${_shared_lib_path} -l${_shared_lib}")
+            endif()
           else()
-            # No shared library found, so ignore target.
+            # No library found, so ignore target.
           endif()
-        else()
-          # Target is a CMake target, so ignore if (CMake targets are static
-          # libs in TigerVNC.)
+          # Need to clear FL to get new results next loop
+          unset(FL CACHE)
         endif()
       endif()
     else()
@@ -69,6 +106,8 @@
         else()
           # No absolute pathname found.  Ignore it.
         endif()
+        # Need to clear FL to get new results next loop
+        unset(FL CACHE)
       endif()
     endif()
   endforeach()
@@ -76,10 +115,6 @@
   # Write the libtool control file for the static library
   get_filename_component(_lname ${_target_location} NAME_WE)
   set(_laname ${CMAKE_CURRENT_BINARY_DIR}/${_lname}.la)
- 
-  if(BUILD_STATIC)
-    set(_target_dependency_libs "${_target_dependency_libs} -L${CMAKE_BINARY_DIR}/staticlib")
-  endif()
 
   file(WRITE ${_laname} "# ${_lname}.la - a libtool library file\n# Generated by ltmain.sh (GNU libtool) 2.2.6b\n")
   file(APPEND ${_laname} "dlname=''\n\n")
diff --git a/cmake/StaticBuild.cmake b/cmake/StaticBuild.cmake
index 7679f45..49706bd 100644
--- a/cmake/StaticBuild.cmake
+++ b/cmake/StaticBuild.cmake
@@ -30,9 +30,14 @@
       HINTS ${PC_GNUTLS_LIBDIR} ${PC_GNUTLS_LIBRARY_DIRS})
     FIND_LIBRARY(NETTLE_LIBRARY NAMES nettle libnettle
       HINTS ${PC_GNUTLS_LIBDIR} ${PC_GNUTLS_LIBRARY_DIRS})
+    FIND_LIBRARY(TASN1_LIBRARY NAMES tasn1 libtasn1
+      HINTS ${PC_GNUTLS_LIBDIR} ${PC_GNUTLS_LIBRARY_DIRS})
 
-    set(GNUTLS_LIBRARIES "-Wl,-Bstatic -lgnutls -ltasn1")
+    set(GNUTLS_LIBRARIES "-Wl,-Bstatic -lgnutls")
 
+    if(TASN1_LIBRARY)
+      set(GNUTLS_LIBRARIES "${GNUTLS_LIBRARIES} -ltasn1")
+    endif()
     if(NETTLE_LIBRARY)
       set(GNUTLS_LIBRARIES "${GNUTLS_LIBRARIES} -lnettle -lhogweed -lgmp")
     endif()
@@ -101,7 +106,11 @@
   set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -nodefaultlibs")
   set(STATIC_BASE_LIBRARIES "-Wl,-Bstatic -lstdc++ -Wl,-Bdynamic")
   if(WIN32)
-    set(STATIC_BASE_LIBRARIES "${STATIC_BASE_LIBRARIES} -lmingw32 -lmoldname -lmingwex -lgcc -lgcc_eh -lmsvcrt -lkernel32")
+    set(STATIC_BASE_LIBRARIES "${STATIC_BASE_LIBRARIES} -lmingw32 -lgcc_eh -lgcc -lmoldname -lmingwex -lmsvcrt")
+    set(STATIC_BASE_LIBRARIES "${STATIC_BASE_LIBRARIES} -luser32 -lkernel32 -ladvapi32 -lshell32")
+    # mingw has some fun circular dependencies that requires us to link
+    # these things again
+    set(STATIC_BASE_LIBRARIES "${STATIC_BASE_LIBRARIES} -lmingw32 -lgcc_eh -lgcc -lmoldname -lmingwex -lmsvcrt")
   else()
     set(STATIC_BASE_LIBRARIES "${STATIC_BASE_LIBRARIES} -lgcc -lgcc_eh -lc")
   endif()
diff --git a/common/network/TcpSocket.cxx b/common/network/TcpSocket.cxx
index d9e9376..0db6ff6 100644
--- a/common/network/TcpSocket.cxx
+++ b/common/network/TcpSocket.cxx
@@ -239,27 +239,66 @@
 }
 
 char* TcpSocket::getPeerAddress() {
-  struct sockaddr_in  info;
-  struct in_addr    addr;
-  socklen_t info_size = sizeof(info);
+  vnc_sockaddr_t sa;
+  socklen_t sa_size = sizeof(sa);
 
-  getpeername(getFd(), (struct sockaddr *)&info, &info_size);
-  memcpy(&addr, &info.sin_addr, sizeof(addr));
-
-  char* name = inet_ntoa(addr);
-  if (name) {
-    return rfb::strDup(name);
-  } else {
+  if (getpeername(getFd(), &sa.u.sa, &sa_size) != 0) {
+    vlog.error("unable to get peer name for socket");
     return rfb::strDup("");
   }
+
+#if defined(HAVE_GETADDRINFO) && defined(HAVE_INET_PTON)
+  if (sa.u.sa.sa_family == AF_INET6) {
+    char buffer[INET6_ADDRSTRLEN + 2];
+    const char *name;
+
+    buffer[0] = '[';
+
+    name = inet_ntop(sa.u.sa.sa_family, &sa.u.sin6.sin6_addr,
+                     buffer + 1, sizeof(buffer) - 2);
+    if (name == NULL) {
+      vlog.error("unable to convert peer name to a string");
+      return rfb::strDup("");
+    }
+
+    strcat(buffer, "]");
+
+    return rfb::strDup(buffer);
+  }
+#endif
+
+  if (sa.u.sa.sa_family == AF_INET) {
+    char *name;
+
+    name = inet_ntoa(sa.u.sin.sin_addr);
+    if (name == NULL) {
+      vlog.error("unable to convert peer name to a string");
+      return rfb::strDup("");
+    }
+
+    return rfb::strDup(name);
+  }
+
+  vlog.error("unknown address family for socket");
+  return rfb::strDup("");
 }
 
 int TcpSocket::getPeerPort() {
-  struct sockaddr_in  info;
-  socklen_t info_size = sizeof(info);
+  vnc_sockaddr_t sa;
+  socklen_t sa_size = sizeof(sa);
 
-  getpeername(getFd(), (struct sockaddr *)&info, &info_size);
-  return ntohs(info.sin_port);
+  getpeername(getFd(), &sa.u.sa, &sa_size);
+
+  switch (sa.u.sa.sa_family) {
+#ifdef HAVE_GETADDRINFO
+  case AF_INET6:
+    return ntohs(sa.u.sin6.sin6_port);
+#endif /* HAVE_GETADDRINFO */
+  case AF_INET:
+    return ntohs(sa.u.sin.sin_port);
+  default:
+    return 0;
+  }
 }
 
 char* TcpSocket::getPeerEndpoint() {
@@ -293,7 +332,11 @@
 				&myaddr.u.sin6.sin6_addr);
 #endif
 
-  return (peeraddr.u.sin.sin_addr.s_addr == myaddr.u.sin.sin_addr.s_addr);
+  if (peeraddr.u.sa.sa_family == AF_INET)
+    return (peeraddr.u.sin.sin_addr.s_addr == myaddr.u.sin.sin_addr.s_addr);
+
+  // No idea what this is. Assume we're on different machines.
+  return false;
 }
 
 void TcpSocket::shutdown()
@@ -326,25 +369,34 @@
 
 bool TcpSocket::isSocket(int sock)
 {
-  struct sockaddr_in info;
-  socklen_t info_size = sizeof(info);
-  return getsockname(sock, (struct sockaddr *)&info, &info_size) >= 0;
+  vnc_sockaddr_t sa;
+  socklen_t sa_size = sizeof(sa);
+  return getsockname(sock, &sa.u.sa, &sa_size) >= 0;
 }
 
 bool TcpSocket::isConnected(int sock)
 {
-  struct sockaddr_in info;
-  socklen_t info_size = sizeof(info);
-  return getpeername(sock, (struct sockaddr *)&info, &info_size) >= 0;
+  vnc_sockaddr_t sa;
+  socklen_t sa_size = sizeof(sa);
+  return getpeername(sock, &sa.u.sa, &sa_size) >= 0;
 }
 
 int TcpSocket::getSockPort(int sock)
 {
-  struct sockaddr_in info;
-  socklen_t info_size = sizeof(info);
-  if (getsockname(sock, (struct sockaddr *)&info, &info_size) < 0)
+  vnc_sockaddr_t sa;
+  socklen_t sa_size = sizeof(sa);
+  if (getsockname(sock, &sa.u.sa, &sa_size) < 0)
     return 0;
-  return ntohs(info.sin_port);
+
+  switch (sa.u.sa.sa_family) {
+#ifdef HAVE_GETADDRINFO
+  case AF_INET6:
+    return ntohs(sa.u.sin6.sin6_port);
+#endif /* HAVE_GETADDRINFO */
+
+  default:
+    return ntohs(sa.u.sin.sin_port);
+  }
 }
 
 
@@ -356,9 +408,40 @@
     return;
   }
 
+  bool use_ipv6;
+  int af;
+#ifdef HAVE_GETADDRINFO
+  use_ipv6 = true;
+  af = AF_INET6;
+#else
+  use_ipv6 = false;
+  af = AF_INET;
+#endif
+
   initSockets();
-  if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
-    throw SocketException("unable to create listening socket", errorNumber);
+  if ((fd = socket(af, SOCK_STREAM, 0)) < 0) {
+    // - Socket creation failed
+    if (use_ipv6) {
+      // - Trying to make an IPv6-capable socket failed - try again, IPv4-only
+      use_ipv6 = false;
+      af = AF_INET;
+      fd = socket(af, SOCK_STREAM, 0);
+    }
+    if (fd < 0)
+      throw SocketException("unable to create listening socket", errorNumber);
+  } else {
+    // - Socket creation succeeded
+    if (use_ipv6) {
+#ifdef IPV6_V6ONLY
+      // - We made an IPv6-capable socket, and we need it to do IPv4 too
+      int opt = 0;
+      setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (char *)&opt, sizeof(opt));
+#else
+      vlog.error("IPV6_V6ONLY support is missing. "
+		 "IPv4 clients may not be able to connect.");
+#endif
+    }
+  }
 
 #ifndef WIN32
   // - By default, close the socket on exec()
@@ -375,27 +458,62 @@
 
   // - Bind it to the desired port
   struct sockaddr_in addr;
-  memset(&addr, 0, sizeof(addr));
-  addr.sin_family = AF_INET;
-
-  if (localhostOnly) {
-    addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
-  } else if (listenaddr != NULL) {
-#ifdef HAVE_INET_ATON
-    if (inet_aton(listenaddr, &addr.sin_addr) == 0)
-#else
-    /* Some systems (e.g. Windows) do not have inet_aton, sigh */
-    if ((addr.sin_addr.s_addr = inet_addr(listenaddr)) == INADDR_NONE)
+#ifdef HAVE_GETADDRINFO
+  struct sockaddr_in6 addr6;
 #endif
-    {
-      closesocket(fd);
-      throw Exception("invalid network interface address: %s", listenaddr);
+  struct sockaddr *sa;
+  int sa_len;
+
+#ifdef HAVE_GETADDRINFO
+  if (use_ipv6) {
+    memset(&addr6, 0, (sa_len = sizeof(addr6)));
+    addr6.sin6_family = af;
+    addr6.sin6_port = htons(port);
+
+    if (localhostOnly)
+      addr6.sin6_addr = in6addr_loopback;
+    else if (listenaddr != NULL) {
+#ifdef HAVE_INET_PTON
+      if (inet_pton(AF_INET6, listenaddr, &addr6.sin6_addr) != 1)
+	use_ipv6 = false;
+#else
+      // Unable to parse without inet_pton
+      use_ipv6 = false;
+#endif
     }
-  } else
-    addr.sin_addr.s_addr = htonl(INADDR_ANY); /* Bind to 0.0.0.0 by default. */
+
+    if (use_ipv6)
+      sa = (struct sockaddr *)&addr6;
+  }
+#endif
+
+  if (!use_ipv6) {
+    memset(&addr, 0, (sa_len = sizeof(addr)));
+    addr.sin_family = af;
+    addr.sin_port = htons(port);
+
+    if (localhostOnly) {
+      addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+    } else if (listenaddr != NULL) {
+#ifdef HAVE_INET_ATON
+      if (inet_aton(listenaddr, &addr.sin_addr) == 0)
+#else
+	/* Some systems (e.g. Windows) do not have inet_aton, sigh */
+	if ((addr.sin_addr.s_addr = inet_addr(listenaddr)) == INADDR_NONE)
+#endif
+	{
+	  closesocket(fd);
+	  throw Exception("invalid network interface address: %s", listenaddr);
+	}
+    } else
+      /* Bind to 0.0.0.0 by default. */
+      addr.sin_addr.s_addr = htonl(INADDR_ANY);
+
+    sa = (struct sockaddr *)&addr;
+  }
 
   addr.sin_port = htons(port);
-  if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
+  if (bind(fd, sa, sa_len) < 0) {
     int e = errorNumber;
     closesocket(fd);
     throw SocketException("unable to bind listening socket", e);
@@ -449,6 +567,30 @@
 }
 
 void TcpListener::getMyAddresses(std::list<char*>* result) {
+#if defined(HAVE_GETADDRINFO) && defined(HAVE_INET_PTON)
+  vnc_sockaddr_t sa;
+  struct addrinfo *ai, *current, hints;
+
+  memset(&hints, 0, sizeof(struct addrinfo));
+  hints.ai_family = AF_UNSPEC;
+  hints.ai_socktype = SOCK_STREAM;
+  hints.ai_canonname = NULL;
+  hints.ai_addr = NULL;
+  hints.ai_next = NULL;
+
+  if ((getaddrinfo(NULL, NULL, &hints, &ai)) != 0)
+    return;
+
+  for (current= ai; current != NULL; current = current->ai_next) {
+    if (current->ai_family != AF_INET && current->ai_family != AF_INET6)
+      continue;
+
+    char *addr = new char[INET6_ADDRSTRLEN];
+    inet_ntop(current->ai_family, current->ai_addr, addr, INET6_ADDRSTRLEN);
+    result->push_back(addr);
+  }
+  freeaddrinfo(ai);
+#else
   const hostent* addrs = gethostbyname(0);
   if (addrs == 0)
     throw rdr::SystemException("gethostbyname", errorNumber);
@@ -460,6 +602,7 @@
     strcpy(addr, addrC);
     result->push_back(addr);
   }
+#endif /* defined(HAVE_GETADDRINFO) && defined(HAVE_INET_PTON) */
 }
 
 int TcpListener::getMyPort() {
@@ -493,6 +636,15 @@
 TcpFilter::verifyConnection(Socket* s) {
   rfb::CharArray name;
 
+#ifdef HAVE_GETADDRINFO
+  vnc_sockaddr_t sa;
+  socklen_t sa_size = sizeof(sa);
+  if (getpeername(s->getFd(), &sa.u.sa, &sa_size) != 0 ||
+      sa.u.sa.sa_family != AF_INET)
+    /* Matching only works for IPv4 */
+    return false;
+#endif /* HAVE_GETADDRINFO */
+
   name.buf = s->getPeerAddress();
   std::list<TcpFilter::Pattern>::iterator i;
   for (i=filter.begin(); i!=filter.end(); i++) {
diff --git a/common/rfb/CConnection.cxx b/common/rfb/CConnection.cxx
index 1695c3a..e0a23b5 100644
--- a/common/rfb/CConnection.cxx
+++ b/common/rfb/CConnection.cxx
@@ -181,7 +181,7 @@
     if (secType != secTypeInvalid) {
       os->writeU8(secType);
       os->flush();
-      vlog.debug("Choosing security type %s(%d)",secTypeName(secType),secType);
+      vlog.info("Choosing security type %s(%d)",secTypeName(secType),secType);
     }
   }
 
diff --git a/common/rfb/CSecurityVeNCrypt.cxx b/common/rfb/CSecurityVeNCrypt.cxx
index 77eeef9..a15da4a 100644
--- a/common/rfb/CSecurityVeNCrypt.cxx
+++ b/common/rfb/CSecurityVeNCrypt.cxx
@@ -164,7 +164,7 @@
 	  break;
       }
 
-      vlog.debug("Choosing security type %s (%d)", secTypeName(chosenType),
+      vlog.info("Choosing security type %s (%d)", secTypeName(chosenType),
 		 chosenType);
 
       /* Set up the stack according to the chosen type: */
diff --git a/common/rfb/SSecurityVeNCrypt.cxx b/common/rfb/SSecurityVeNCrypt.cxx
index 9e4260f..39647f6 100644
--- a/common/rfb/SSecurityVeNCrypt.cxx
+++ b/common/rfb/SSecurityVeNCrypt.cxx
@@ -157,7 +157,7 @@
     if (!haveChosenType)
       chosenType = secTypeInvalid;
 
-    vlog.debug("Choosing security type %s (%d)", secTypeName(chosenType),
+    vlog.info("Client requests security type %s (%d)", secTypeName(chosenType),
 	       chosenType);
 
     /* Set up the stack according to the chosen type */
diff --git a/common/rfb/SecurityServer.cxx b/common/rfb/SecurityServer.cxx
index 5bd7b2c..e0aee13 100644
--- a/common/rfb/SecurityServer.cxx
+++ b/common/rfb/SecurityServer.cxx
@@ -43,7 +43,7 @@
 #endif
  ")",
 #ifdef HAVE_GNUTLS
- "VncAuth,TLSVnc",
+ "TLSVnc,VncAuth",
 #else
  "VncAuth",
 #endif
diff --git a/config.h.in b/config.h.in
index a50e723..490d7f6 100644
--- a/config.h.in
+++ b/config.h.in
@@ -2,6 +2,7 @@
 #define PACKAGE_VERSION "@VERSION@"
 
 #cmakedefine HAVE_INET_ATON
+#cmakedefine HAVE_INET_PTON
 #cmakedefine HAVE_GETADDRINFO
 #cmakedefine HAVE_GNUTLS_SET_GLOBAL_ERRNO
 #cmakedefine HAVE_GNUTLS_SET_ERRNO
diff --git a/contrib/packages/rpm/el5/SOURCES/25-no-hint-fedora.conf b/contrib/packages/rpm/el5/SOURCES/25-no-hint-fedora.conf
new file mode 100644
index 0000000..9c71eb0
--- /dev/null
+++ b/contrib/packages/rpm/el5/SOURCES/25-no-hint-fedora.conf
@@ -0,0 +1,243 @@
+<?xml version="1.0"?>
+<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
+
+<fontconfig>
+
+<!-- We can't hint CJK fonts well, so turn off hinting for CJK fonts. -->
+
+	<match target="font">
+		<test name="family" compare="eq">
+			<string>Kochi Mincho</string>
+		</test>
+		<edit name="hinting" mode="assign">
+			<bool>false</bool>
+		</edit>
+		<edit name="embeddedbitmap" mode="assign">
+			<bool>false</bool>
+		</edit>
+	</match>
+	<match target="font">
+		<test name="family" compare="eq">
+			<string>Kochi Gothic</string>
+		</test>
+		<edit name="hinting" mode="assign">
+			<bool>false</bool>
+		</edit>
+		<edit name="embeddedbitmap" mode="assign">
+			<bool>false</bool>
+		</edit>
+	</match>
+	<match target="font">
+		<test name="family" compare="eq">
+			<string>Sazanami Mincho</string>
+		</test>
+		<edit name="hinting" mode="assign">
+			<bool>false</bool>
+		</edit>
+		<edit name="embeddedbitmap" mode="assign">
+			<bool>false</bool>
+		</edit>
+	</match>
+	<match target="font">
+		<test name="family" compare="eq">
+			<string>Sazanami Gothic</string>
+		</test>
+		<edit name="hinting" mode="assign">
+			<bool>false</bool>
+		</edit>
+		<edit name="embeddedbitmap" mode="assign">
+			<bool>false</bool>
+		</edit>
+	</match>
+	<match target="font">
+		<test name="family" compare="eq">
+			<string>Baekmuk Batang</string>
+		</test>
+		<edit name="hinting" mode="assign">
+			<bool>false</bool>
+		</edit>
+	</match>
+	<match target="font">
+		<test name="family" compare="eq">
+			<string>Baekmuk Dotum</string>
+		</test>
+		<edit name="hinting" mode="assign">
+			<bool>false</bool>
+		</edit>
+	</match>
+	<match target="font">
+		<test name="family" compare="eq">
+			<string>Baekmuk Gulim</string>
+		</test>
+		<edit name="hinting" mode="assign">
+			<bool>false</bool>
+		</edit>
+	</match>
+	<match target="font">
+		<test name="family" compare="eq">
+			<string>Baekmuk Headline</string>
+		</test>
+		<edit name="hinting" mode="assign">
+			<bool>false</bool>
+		</edit>
+	</match>
+	<match target="font">
+		<test name="family" compare="eq">
+			<string>AR PL Mingti2L Big5</string>
+		</test>
+		<edit name="hinting" mode="assign">
+			<bool>false</bool>
+		</edit>
+	</match>
+        <match target="font">
+                <test name="family" compare="eq">
+                        <string>AR PL ShanHeiSun Uni</string>
+                </test>
+                <edit name="hinting" mode="assign">
+                        <bool>false</bool>
+                </edit>
+                <edit name="embeddedbitmap" mode="assign">
+                        <bool>true</bool>
+                </edit>
+        </match>
+        <match target="font">
+                <test name="family" compare="eq">
+                        <string>AR PL KaitiM Big5</string>
+                </test>
+                <edit name="hinting" mode="assign">
+                        <bool>false</bool>
+                </edit>
+        </match>
+	<match target="font">
+		<test name="family" compare="eq">
+			<string>AR PL ZenKai Uni</string>
+		</test>
+		<edit name="hinting" mode="assign">
+			<bool>false</bool>
+		</edit>
+	</match>
+	<match target="font">
+		<test name="family" compare="eq">
+			<string>AR PL SungtiL GB</string>
+		</test>
+		<edit name="hinting" mode="assign">
+			<bool>false</bool>
+		</edit>
+	</match>
+	<match target="font">
+		<test name="family" compare="eq">
+			<string>AR PL KaitiM GB</string>
+		</test>
+		<edit name="hinting" mode="assign">
+			<bool>false</bool>
+		</edit>
+	</match>
+	<match target="font">
+		<test name="family" compare="eq">
+			<string>ZYSong18030</string>
+		</test>
+		<edit name="hinting" mode="assign">
+			<bool>false</bool>
+		</edit>
+	</match>
+
+ <!-- 
+ We also need to turn off hinting for Indic fonts with a joined baseline.
+ -->
+	<match target="font">
+		<test name="family" compare="eq">
+			<string>Mukti Narrow</string>
+		</test>
+		<edit name="hinting" mode="assign">
+			<bool>false</bool>
+		</edit>
+	</match>
+	<match target="font">
+		<test name="family" compare="eq">
+			<string>Lohit Hindi</string>
+		</test>
+		<edit name="hinting" mode="assign">
+			<bool>false</bool>
+		</edit>
+	</match>
+	<match target="font">
+		<test name="family" compare="eq">
+			<string>Lohit Bengali</string>
+		</test>
+		<edit name="hinting" mode="assign">
+			<bool>false</bool>
+		</edit>
+	</match>
+	<match target="font">
+		<test name="family" compare="eq">
+			<string>Lohit Punjabi</string>
+		</test>
+		<edit name="hinting" mode="assign">
+			<bool>false</bool>
+		</edit>
+	</match>
+
+<!--
+Gujarti fonts are distorted when hinting is enabled. Turn it off.
+-->
+	<match target="font">
+		<test name="family" compare="eq">
+			<string>Lohit Gujarati</string>
+		</test>
+		<edit name="hinting" mode="assign">
+			<bool>false</bool>
+		</edit>
+	</match>
+
+<!--
+Disabling hinting for newly added Indic fonts (kn/or/ml/te)
+-->
+        <match target="font">
+                <test name="family" compare="eq">
+                        <string>Lohit Kannada</string>
+                </test>
+                <edit name="hinting" mode="assign">
+                        <bool>false</bool>
+                </edit>
+        </match>
+
+        <match target="font">
+                <test name="family" compare="eq">
+                        <string>Lohit Oriya</string>
+                </test>
+                <edit name="hinting" mode="assign">
+                        <bool>false</bool>
+                </edit>
+        </match>
+
+        <match target="font">
+                <test name="family" compare="eq">
+                        <string>Lohit Malayalam</string>
+                </test>
+                <edit name="hinting" mode="assign">
+                        <bool>false</bool>
+                </edit>
+        </match>
+
+        <match target="font">
+                <test name="family" compare="eq">
+                        <string>Lohit Telugu</string>
+                </test>
+                <edit name="hinting" mode="assign">
+                        <bool>false</bool>
+                </edit>
+        </match>
+
+<!--
+And Sinhala
+-->
+	<match target="font">
+		<test name="family" compare="eq">
+			<string>LKLUG</string>
+		</test>
+		<edit name="hinting" mode="assign">
+			<bool>false</bool>
+		</edit>
+	</match>
+
+</fontconfig>
diff --git a/contrib/packages/rpm/el5/SOURCES/30-aliases-fedora.conf b/contrib/packages/rpm/el5/SOURCES/30-aliases-fedora.conf
new file mode 100644
index 0000000..28cd157
--- /dev/null
+++ b/contrib/packages/rpm/el5/SOURCES/30-aliases-fedora.conf
@@ -0,0 +1,180 @@
+<?xml version="1.0"?>
+<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
+<!-- conf.d/sub-pixel.conf -->
+<fontconfig>
+
+	<!-- Alias similar families from 5 sources:
+
+		PostScript fonts:
+			Helvetica
+			Times
+			Courier
+		Microsoft fonts:
+			Arial
+			Times New Roman
+			Courier New
+		URW fonts:
+			Nimbus Sans L
+			Nimbus Roman No9 L
+			Nimbus Mono L
+		StarOffice fonts:
+			Albany
+			Thorndale
+			Cumberland
+		AMT fonts:
+			Albany AMT
+			Thorndale AMT
+			Cumberland AMT
+
+	     Of these, URW fonts are metric compatible with PostScrict fonts
+	     and the StarOffice and AMT ones are compatible with Microsoft
+	     fonts.  We want for each of them to fallback to any of these
+	     available, but in an order preferring the metric-compatible ones
+	     first.  As an exception, we assume that URW fonts are always
+	     available and do not alias them.
+
+	     It seems to be really hard to do this with fontconfig.  The
+	     easiest way seems to be to list them all for each one.
+	-->
+
+	<!-- PostScript -->
+        <alias>
+	  <family>Helvetica</family>
+	  <accept>
+	  <family>Nimbus Sans L</family>
+          <family>Liberation Sans</family>
+	  <family>Arial</family>
+	  <family>Albany</family>
+	  <family>Albany AMT</family>
+	  </accept>
+	</alias>
+
+        <alias>
+	  <family>Times</family>
+	  <accept>
+	  <family>Nimbus Roman No9 L</family>
+          <family>Liberation Serif</family>
+	  <family>Times New Roman</family>
+	  <family>Thorndale</family>
+	  <family>Thorndale AMT</family>
+	  </accept>
+	</alias>
+
+        <alias>
+	  <family>Courier</family>
+	  <accept>
+	  <family>Nimbus Mono L</family>
+          <family>Liberation Mono</family>
+	  <family>Courier New</family>
+	  <family>Cumberland</family>
+	  <family>Cumberland AMT</family>
+	  </accept>
+	</alias>
+
+
+
+	<!-- Microsoft -->
+        <alias>
+	  <family>Arial</family>
+	  <accept>
+          <family>Liberation Sans</family>
+	  <family>Albany</family>
+	  <family>Albany AMT</family>
+	  <family>Helvetica</family>
+	  <family>Nimbus Sans L</family>
+	  </accept>
+	</alias>
+
+        <alias>
+	  <family>Times New Roman</family>
+	  <accept>
+          <family>Liberation Serif</family>
+	  <family>Thorndale</family>
+	  <family>Thorndale AMT</family>
+	  <family>Times</family>
+	  <family>Nimbus Roman No9 L</family>
+	  </accept>
+	</alias>
+
+        <alias>
+	  <family>Courier New</family>
+	  <accept>
+          <family>Liberation Mono</family>
+	  <family>Cumberland</family>
+	  <family>Cumberland AMT</family>
+	  <family>Courier</family>
+	  <family>Nimbus Mono L</family>
+	  </accept>
+	</alias>
+
+
+	<!-- StarOffice -->
+        <alias>
+	  <family>Albany</family>
+	  <accept>
+          <family>Liberation Sans</family>
+	  <family>Arial</family>
+	  <family>Albany AMT</family>
+	  <family>Helvetica</family>
+	  <family>Nimbus Sans L</family>
+	  </accept>
+	</alias>
+
+        <alias>
+	  <family>Thorndale</family>
+	  <accept>
+          <family>Liberation Serif</family>
+	  <family>Times New Roman</family>
+	  <family>Thorndale AMT</family>
+	  <family>Times</family>
+	  <family>Nimbus Roman No9 L</family>
+	  </accept>
+	</alias>
+
+        <alias>
+	  <family>Cumberland</family>
+	  <accept>
+          <family>Liberation Mono</family>
+	  <family>Courier New</family>
+	  <family>Cumberland AMT</family>
+	  <family>Courier</family>
+	  <family>Nimbus Mono L</family>
+	  </accept>
+	</alias>
+
+
+	<!-- AMT -->
+        <alias>
+	  <family>Albany AMT</family>
+	  <accept>
+          <family>Liberation Sans</family>
+	  <family>Arial</family>
+	  <family>Albany</family>
+	  <family>Helvetica</family>
+	  <family>Nimbus Sans L</family>
+	  </accept>
+	</alias>
+
+        <alias>
+	  <family>Thorndale AMT</family>
+	  <accept>
+          <family>Liberation Serif</family>
+	  <family>Times New Roman</family>
+	  <family>Thorndale</family>
+	  <family>Times</family>
+	  <family>Nimbus Roman No9 L</family>
+	  </accept>
+	</alias>
+
+        <alias>
+	  <family>Cumberland AMT</family>
+	  <accept>
+          <family>Liberation Mono</family>
+	  <family>Courier New</family>
+	  <family>Cumberland</family>
+	  <family>Courier</family>
+	  <family>Nimbus Mono L</family>
+	  </accept>
+	</alias>
+
+</fontconfig>
diff --git a/contrib/packages/rpm/el5/SOURCES/40-generic-fedora.conf b/contrib/packages/rpm/el5/SOURCES/40-generic-fedora.conf
new file mode 100644
index 0000000..c0e720b
--- /dev/null
+++ b/contrib/packages/rpm/el5/SOURCES/40-generic-fedora.conf
@@ -0,0 +1,35 @@
+<?xml version="1.0"?>
+<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
+<fontconfig>
+<!--
+  Mark families with their generics so we'll get
+  something reasonable
+-->
+
+<!--
+  Serif faces
+ -->
+	<alias>
+                <family>Sazanami Mincho</family>
+                <family>AR PL ZenKai Uni</family>
+		<family>ZYSong18030</family>
+		<default><family>serif</family></default>
+	</alias>
+<!--
+  Sans-serif faces
+ -->
+	<alias>
+                <family>Sazanami Gothic</family>
+                <family>AR PL ShanHeiSun Uni</family>
+		<family>ZYSong18030</family>
+		<default><family>sans-serif</family></default>
+	</alias>
+<!--
+  Monospace faces
+ -->
+ 	<alias>
+		<family>Cumberland</family>
+		<family>ZYSong18030</family>
+		<default><family>monospace</family></default>
+	</alias>
+</fontconfig>
diff --git a/contrib/packages/rpm/el5/SOURCES/64-nonlatin-fedora.conf b/contrib/packages/rpm/el5/SOURCES/64-nonlatin-fedora.conf
new file mode 100644
index 0000000..be29084
--- /dev/null
+++ b/contrib/packages/rpm/el5/SOURCES/64-nonlatin-fedora.conf
@@ -0,0 +1,67 @@
+<?xml version="1.0"?>
+<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
+<fontconfig>
+	<alias>
+		<family>serif</family>
+		<prefer>
+ 			<family>KacstQura</family>
+ 			<family>Frank Ruehl CLM</family>
+			<family>Lohit Bengali</family>
+ 			<family>Lohit Gujarati</family>
+ 			<family>Lohit Hindi</family>
+ 			<family>Lohit Punjabi</family>
+ 			<family>Lohit Tamil</family>
+ 			<family>Lohit Malayalam</family>
+ 			<family>Lohit Kannada</family>
+ 			<family>Lohit Telugu</family>
+ 			<family>Lohit Oriya</family>
+ 			<family>LKLUG</family>
+ 			<family>Sazanami Mincho</family>
+ 			<family>AR PL Zenkai Uni</family>
+ 			<family>ZYSong18030</family>
+		</prefer>
+	</alias>
+	<alias>
+		<family>sans-serif</family>
+		<prefer>
+ 			<family>KacstQura</family>
+			<family>Lohit Bengali</family>
+ 			<family>Lohit Gujarati</family>
+ 			<family>Lohit Hindi</family>
+ 			<family>Lohit Punjabi</family>
+ 			<family>Lohit Tamil</family>
+ 			<family>Lohit Malayalam</family>
+ 			<family>Lohit Kannada</family>
+ 			<family>Lohit Telugu</family>
+ 			<family>Lohit Oriya</family>
+ 			<family>LKLUG</family>
+ 			<family>Sazanami Gothic</family>
+ 			<family>AR PL ShanHeiSun Uni</family>
+ 			<family>AR PL SungtiL GB</family>
+ 			<family>AR PL Mingti2L Big5</family>
+			<family>ZYSong18030</family>
+ 			<family>Baekmuk Gulim</family>
+		</prefer>
+	</alias>
+	<alias>
+		<family>monospace</family>
+		<prefer>
+			<family>Lohit Bengali</family>
+			<family>Lohit Gujarati</family>
+			<family>Lohit Hindi</family>
+			<family>Lohit Punjabi</family>
+ 			<family>Lohit Tamil</family>
+ 			<family>Lohit Malayalam</family>
+ 			<family>Lohit Kannada</family>
+ 			<family>Lohit Telugu</family>
+ 			<family>Lohit Oriya</family>
+ 			<family>LKLUG</family>
+			<family>Sazanami Gothic</family>
+ 			<family>AR PL ShanHeiSun Uni</family>
+			<family>AR PL SungtiL GB</family>
+			<family>AR PL Mingti2L Big5</family>
+			<family>ZYSong18030</family>
+			<family>Baekmuk Gulim</family>
+		</prefer>
+	</alias>
+</fontconfig>
diff --git a/contrib/packages/rpm/el5/SOURCES/75-blacklist-fedora.conf b/contrib/packages/rpm/el5/SOURCES/75-blacklist-fedora.conf
new file mode 100644
index 0000000..996c17a
--- /dev/null
+++ b/contrib/packages/rpm/el5/SOURCES/75-blacklist-fedora.conf
@@ -0,0 +1,54 @@
+<?xml version="1.0"?>
+<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
+
+<!-- Blacklist certain fonts that freetype can't handle -->
+
+<fontconfig>
+  <selectfont>
+    <rejectfont>
+      <pattern>
+        <patelt name="family"><string>Hershey-Gothic-English</string></patelt>
+      </pattern>
+    </rejectfont>
+    <rejectfont>
+      <pattern>
+        <patelt name="family"><string>Hershey-Plain-Duplex-Italic</string></patelt>
+      </pattern>
+    </rejectfont>
+    <rejectfont>
+      <pattern>
+        <patelt name="family"><string>Hershey-Plain-Duplex</string></patelt>
+      </pattern>
+    </rejectfont>
+    <rejectfont>
+      <pattern>
+        <patelt name="family"><string>Hershey-Script-Simplex</string></patelt>
+      </pattern>
+    </rejectfont>
+    <rejectfont>
+      <pattern>
+        <patelt name="family"><string>Hershey-Plain-Triplex</string></patelt>
+      </pattern>
+    </rejectfont>
+    <rejectfont>
+      <pattern>
+        <patelt name="family"><string>Hershey-Plain-Triplex-Italic</string></patelt>
+      </pattern>
+    </rejectfont>
+    <rejectfont>
+      <pattern>
+        <patelt name="family"><string>Hershey-Script-Complex</string></patelt>
+      </pattern>
+    </rejectfont>
+    <rejectfont>
+      <pattern>
+        <patelt name="family"><string>Hershey-Gothic-Italian</string></patelt>
+      </pattern>
+    </rejectfont>
+    <rejectfont>
+      <pattern>
+        <patelt name="family"><string>Hershey-Gothic-German</string></patelt>
+      </pattern>
+    </rejectfont>
+  </selectfont>
+</fontconfig>
diff --git a/contrib/packages/rpm/el5/SOURCES/FindX11.cmake b/contrib/packages/rpm/el5/SOURCES/FindX11.cmake
new file mode 100644
index 0000000..86335fc
--- /dev/null
+++ b/contrib/packages/rpm/el5/SOURCES/FindX11.cmake
@@ -0,0 +1,514 @@
+# - Find X11 installation
+# Try to find X11 on UNIX systems. The following values are defined
+#  X11_FOUND        - True if X11 is available
+#  X11_INCLUDE_DIR  - include directories to use X11
+#  X11_LIBRARIES    - link against these to use X11
+#
+# and also the following more fine grained variables:
+# Include paths: X11_ICE_INCLUDE_PATH,          X11_ICE_LIB,        X11_ICE_FOUND
+#                X11_SM_INCLUDE_PATH,           X11_SM_LIB,         X11_SM_FOUND
+#                X11_X11_INCLUDE_PATH,          X11_X11_LIB
+#                X11_Xaccessrules_INCLUDE_PATH,                     X11_Xaccess_FOUND
+#                X11_Xaccessstr_INCLUDE_PATH,                       X11_Xaccess_FOUND
+#                X11_Xau_INCLUDE_PATH,          X11_Xau_LIB,        X11_Xau_FOUND
+#                X11_Xcomposite_INCLUDE_PATH,   X11_Xcomposite_LIB, X11_Xcomposite_FOUND
+#                X11_Xcursor_INCLUDE_PATH,      X11_Xcursor_LIB,    X11_Xcursor_FOUND
+#                X11_Xdamage_INCLUDE_PATH,      X11_Xdamage_LIB,    X11_Xdamage_FOUND
+#                X11_Xdmcp_INCLUDE_PATH,        X11_Xdmcp_LIB,      X11_Xdmcp_FOUND
+#                                               X11_Xext_LIB,       X11_Xext_FOUND
+#                X11_dpms_INCLUDE_PATH,         (in X11_Xext_LIB),  X11_dpms_FOUND
+#                X11_XShm_INCLUDE_PATH,         (in X11_Xext_LIB),  X11_XShm_FOUND
+#                X11_Xshape_INCLUDE_PATH,       (in X11_Xext_LIB),  X11_Xshape_FOUND
+#                X11_xf86misc_INCLUDE_PATH,     X11_Xxf86misc_LIB,  X11_xf86misc_FOUND
+#                X11_xf86vmode_INCLUDE_PATH,    X11_Xxf86vm_LIB     X11_xf86vmode_FOUND
+#                X11_Xfixes_INCLUDE_PATH,       X11_Xfixes_LIB,     X11_Xfixes_FOUND
+#                X11_Xft_INCLUDE_PATH,          X11_Xft_LIB,        X11_Xft_FOUND
+#                X11_Xi_INCLUDE_PATH,           X11_Xi_LIB,         X11_Xi_FOUND
+#                X11_Xinerama_INCLUDE_PATH,     X11_Xinerama_LIB,   X11_Xinerama_FOUND
+#                X11_Xinput_INCLUDE_PATH,       X11_Xinput_LIB,     X11_Xinput_FOUND
+#                X11_Xkb_INCLUDE_PATH,                              X11_Xkb_FOUND
+#                X11_Xkblib_INCLUDE_PATH,                           X11_Xkb_FOUND
+#                X11_Xkbfile_INCLUDE_PATH,      X11_Xkbfile_LIB,    X11_Xkbfile_FOUND
+#                X11_Xmu_INCLUDE_PATH,          X11_Xmu_LIB,        X11_Xmu_FOUND
+#                X11_Xpm_INCLUDE_PATH,          X11_Xpm_LIB,        X11_Xpm_FOUND
+#                X11_XTest_INCLUDE_PATH,        X11_XTest_LIB,      X11_XTest_FOUND
+#                X11_Xrandr_INCLUDE_PATH,       X11_Xrandr_LIB,     X11_Xrandr_FOUND
+#                X11_Xrender_INCLUDE_PATH,      X11_Xrender_LIB,    X11_Xrender_FOUND
+#                X11_Xscreensaver_INCLUDE_PATH, X11_Xscreensaver_LIB, X11_Xscreensaver_FOUND
+#                X11_Xt_INCLUDE_PATH,           X11_Xt_LIB,         X11_Xt_FOUND
+#                X11_Xutil_INCLUDE_PATH,                            X11_Xutil_FOUND
+#                X11_Xv_INCLUDE_PATH,           X11_Xv_LIB,         X11_Xv_FOUND
+#                X11_XSync_INCLUDE_PATH,        (in X11_Xext_LIB),  X11_XSync_FOUND
+
+
+#=============================================================================
+# Copyright 2001-2009 Kitware, Inc.
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+# (To distribute this file outside of CMake, substitute the full
+#  License text for the above reference.)
+
+if (UNIX)
+  set(X11_FOUND 0)
+  # X11 is never a framework and some header files may be
+  # found in tcl on the mac
+  set(CMAKE_FIND_FRAMEWORK_SAVE ${CMAKE_FIND_FRAMEWORK})
+  set(CMAKE_FIND_FRAMEWORK NEVER)
+  if(NOT X11_INC_SEARCH_PATH)
+    set(X11_INC_SEARCH_PATH
+      /usr/pkg/xorg/include
+      /usr/X11R6/include
+      /usr/X11R7/include
+      /usr/include/X11
+      /usr/openwin/include
+      /usr/openwin/share/include
+      /opt/graphics/OpenGL/include
+    )
+  endif()
+
+
+  if(NOT X11_LIB_SEARCH_PATH)
+    set(X11_LIB_SEARCH_PATH
+      /usr/pkg/xorg/lib
+      /usr/X11R6/lib
+      /usr/X11R7/lib
+      /usr/openwin/lib
+    )
+  endif()
+
+  find_path(X11_X11_INCLUDE_PATH X11/X.h                             ${X11_INC_SEARCH_PATH})
+  find_path(X11_Xlib_INCLUDE_PATH X11/Xlib.h                         ${X11_INC_SEARCH_PATH})
+
+  # Look for includes; keep the list sorted by name of the cmake *_INCLUDE_PATH
+  # variable (which doesn't need to match the include file name).
+
+  # Solaris lacks XKBrules.h, so we should skip kxkbd there.
+  find_path(X11_ICE_INCLUDE_PATH X11/ICE/ICE.h                       ${X11_INC_SEARCH_PATH})
+  find_path(X11_SM_INCLUDE_PATH X11/SM/SM.h                          ${X11_INC_SEARCH_PATH})
+  find_path(X11_Xaccessrules_INCLUDE_PATH X11/extensions/XKBrules.h  ${X11_INC_SEARCH_PATH})
+  find_path(X11_Xaccessstr_INCLUDE_PATH X11/extensions/XKBstr.h      ${X11_INC_SEARCH_PATH})
+  find_path(X11_Xau_INCLUDE_PATH X11/Xauth.h                         ${X11_INC_SEARCH_PATH})
+  find_path(X11_Xcomposite_INCLUDE_PATH X11/extensions/Xcomposite.h  ${X11_INC_SEARCH_PATH})
+  find_path(X11_Xcursor_INCLUDE_PATH X11/Xcursor/Xcursor.h           ${X11_INC_SEARCH_PATH})
+  find_path(X11_Xdamage_INCLUDE_PATH X11/extensions/Xdamage.h        ${X11_INC_SEARCH_PATH})
+  find_path(X11_Xdmcp_INCLUDE_PATH X11/Xdmcp.h                       ${X11_INC_SEARCH_PATH})
+  find_path(X11_dpms_INCLUDE_PATH X11/extensions/dpms.h              ${X11_INC_SEARCH_PATH})
+  find_path(X11_xf86misc_INCLUDE_PATH X11/extensions/xf86misc.h      ${X11_INC_SEARCH_PATH})
+  find_path(X11_xf86vmode_INCLUDE_PATH X11/extensions/xf86vmode.h    ${X11_INC_SEARCH_PATH})
+  find_path(X11_Xfixes_INCLUDE_PATH X11/extensions/Xfixes.h          ${X11_INC_SEARCH_PATH})
+  find_path(X11_Xft_INCLUDE_PATH X11/Xft/Xft.h                       ${X11_INC_SEARCH_PATH})
+  find_path(X11_Xi_INCLUDE_PATH X11/extensions/XInput.h              ${X11_INC_SEARCH_PATH})
+  find_path(X11_Xinerama_INCLUDE_PATH X11/extensions/Xinerama.h      ${X11_INC_SEARCH_PATH})
+  find_path(X11_Xinput_INCLUDE_PATH X11/extensions/XInput.h          ${X11_INC_SEARCH_PATH})
+  find_path(X11_Xkb_INCLUDE_PATH X11/extensions/XKB.h                ${X11_INC_SEARCH_PATH})
+  find_path(X11_Xkblib_INCLUDE_PATH X11/XKBlib.h                     ${X11_INC_SEARCH_PATH})
+  find_path(X11_Xkbfile_INCLUDE_PATH X11/extensions/XKBfile.h        ${X11_INC_SEARCH_PATH})
+  find_path(X11_Xmu_INCLUDE_PATH X11/Xmu/Xmu.h                       ${X11_INC_SEARCH_PATH})
+  find_path(X11_Xpm_INCLUDE_PATH X11/xpm.h                           ${X11_INC_SEARCH_PATH})
+  find_path(X11_XTest_INCLUDE_PATH X11/extensions/XTest.h            ${X11_INC_SEARCH_PATH})
+  find_path(X11_XShm_INCLUDE_PATH X11/extensions/XShm.h              ${X11_INC_SEARCH_PATH})
+  find_path(X11_Xrandr_INCLUDE_PATH X11/extensions/Xrandr.h          ${X11_INC_SEARCH_PATH})
+  find_path(X11_Xrender_INCLUDE_PATH X11/extensions/Xrender.h        ${X11_INC_SEARCH_PATH})
+  find_path(X11_XRes_INCLUDE_PATH X11/extensions/XRes.h              ${X11_INC_SEARCH_PATH})
+  find_path(X11_Xscreensaver_INCLUDE_PATH X11/extensions/scrnsaver.h ${X11_INC_SEARCH_PATH})
+  find_path(X11_Xshape_INCLUDE_PATH X11/extensions/shape.h           ${X11_INC_SEARCH_PATH})
+  find_path(X11_Xutil_INCLUDE_PATH X11/Xutil.h                       ${X11_INC_SEARCH_PATH})
+  find_path(X11_Xt_INCLUDE_PATH X11/Intrinsic.h                      ${X11_INC_SEARCH_PATH})
+  find_path(X11_Xv_INCLUDE_PATH X11/extensions/Xvlib.h               ${X11_INC_SEARCH_PATH})
+  find_path(X11_XSync_INCLUDE_PATH X11/extensions/sync.h             ${X11_INC_SEARCH_PATH})
+
+
+  find_library(X11_X11_LIB X11               ${X11_LIB_SEARCH_PATH})
+
+  # Find additional X libraries. Keep list sorted by library name.
+  find_library(X11_ICE_LIB ICE               ${X11_LIB_SEARCH_PATH})
+  find_library(X11_SM_LIB SM                 ${X11_LIB_SEARCH_PATH})
+  find_library(X11_Xau_LIB Xau               ${X11_LIB_SEARCH_PATH})
+  find_library(X11_Xcomposite_LIB Xcomposite ${X11_LIB_SEARCH_PATH})
+  find_library(X11_Xcursor_LIB Xcursor       ${X11_LIB_SEARCH_PATH})
+  find_library(X11_Xdamage_LIB Xdamage       ${X11_LIB_SEARCH_PATH})
+  find_library(X11_Xdmcp_LIB Xdmcp           ${X11_LIB_SEARCH_PATH})
+  find_library(X11_Xext_LIB Xext             ${X11_LIB_SEARCH_PATH})
+  find_library(X11_Xfixes_LIB Xfixes         ${X11_LIB_SEARCH_PATH})
+  find_library(X11_Xft_LIB Xft               ${X11_LIB_SEARCH_PATH})
+  find_library(X11_Xi_LIB Xi                 ${X11_LIB_SEARCH_PATH})
+  find_library(X11_Xinerama_LIB Xinerama     ${X11_LIB_SEARCH_PATH})
+  find_library(X11_Xinput_LIB Xi             ${X11_LIB_SEARCH_PATH})
+  find_library(X11_Xkbfile_LIB xkbfile       ${X11_LIB_SEARCH_PATH})
+  find_library(X11_Xmu_LIB Xmu               ${X11_LIB_SEARCH_PATH})
+  find_library(X11_Xpm_LIB Xpm               ${X11_LIB_SEARCH_PATH})
+  find_library(X11_Xrandr_LIB Xrandr         ${X11_LIB_SEARCH_PATH})
+  find_library(X11_Xrender_LIB Xrender       ${X11_LIB_SEARCH_PATH})
+  find_library(X11_XRes_LIB XRes             ${X11_LIB_SEARCH_PATH})
+  find_library(X11_Xscreensaver_LIB Xss      ${X11_LIB_SEARCH_PATH})
+  find_library(X11_Xt_LIB Xt                 ${X11_LIB_SEARCH_PATH})
+  find_library(X11_XTest_LIB Xtst            ${X11_LIB_SEARCH_PATH})
+  find_library(X11_Xv_LIB Xv                 ${X11_LIB_SEARCH_PATH})
+  find_library(X11_Xxf86misc_LIB Xxf86misc   ${X11_LIB_SEARCH_PATH})
+  find_library(X11_Xxf86vm_LIB Xxf86vm       ${X11_LIB_SEARCH_PATH})
+
+  set(X11_LIBRARY_DIR "")
+  if(X11_X11_LIB)
+    get_filename_component(X11_LIBRARY_DIR ${X11_X11_LIB} PATH)
+  endif()
+
+  set(X11_INCLUDE_DIR) # start with empty list
+  if(X11_X11_INCLUDE_PATH)
+    set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_X11_INCLUDE_PATH})
+  endif()
+
+  if(X11_Xlib_INCLUDE_PATH)
+    set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_Xlib_INCLUDE_PATH})
+  endif()
+
+  if(X11_Xutil_INCLUDE_PATH)
+    set(X11_Xutil_FOUND TRUE)
+    set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_Xutil_INCLUDE_PATH})
+  endif()
+
+  if(X11_Xshape_INCLUDE_PATH)
+    set(X11_Xshape_FOUND TRUE)
+    set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_Xshape_INCLUDE_PATH})
+  endif()
+
+  set(X11_LIBRARIES) # start with empty list
+  if(X11_X11_LIB)
+    set(X11_LIBRARIES ${X11_LIBRARIES} ${X11_X11_LIB})
+  endif()
+
+  if(X11_Xext_LIB)
+    set(X11_Xext_FOUND TRUE)
+    set(X11_LIBRARIES ${X11_LIBRARIES} ${X11_Xext_LIB})
+  endif()
+
+  if(X11_Xt_LIB AND X11_Xt_INCLUDE_PATH)
+    set(X11_Xt_FOUND TRUE)
+  endif()
+
+  if(X11_Xft_LIB AND X11_Xft_INCLUDE_PATH)
+    set(X11_Xft_FOUND TRUE)
+    set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_Xft_INCLUDE_PATH})
+  endif()
+
+  if(X11_Xv_LIB AND X11_Xv_INCLUDE_PATH)
+    set(X11_Xv_FOUND TRUE)
+    set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_Xv_INCLUDE_PATH})
+  endif()
+
+  if (X11_Xau_LIB AND X11_Xau_INCLUDE_PATH)
+    set(X11_Xau_FOUND TRUE)
+  endif ()
+
+  if (X11_Xdmcp_INCLUDE_PATH AND X11_Xdmcp_LIB)
+      set(X11_Xdmcp_FOUND TRUE)
+      set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_Xdmcp_INCLUDE_PATH})
+      set(X11_LIBRARIES ${X11_LIBRARIES} ${X11_Xdmcp_LIB})
+      if (X11_Xau_FOUND)
+      	set(X11_LIBRARIES ${X11_LIBRARIES} ${X11_Xau_LIB})
+      endif ()
+  endif ()
+
+  if (X11_Xaccessrules_INCLUDE_PATH AND X11_Xaccessstr_INCLUDE_PATH)
+      set(X11_Xaccess_FOUND TRUE)
+      set(X11_Xaccess_INCLUDE_PATH ${X11_Xaccessstr_INCLUDE_PATH})
+      set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_Xaccess_INCLUDE_PATH})
+  endif ()
+
+  if (X11_Xpm_INCLUDE_PATH AND X11_Xpm_LIB)
+      set(X11_Xpm_FOUND TRUE)
+      set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_Xpm_INCLUDE_PATH})
+  endif ()
+
+  if (X11_Xcomposite_INCLUDE_PATH AND X11_Xcomposite_LIB)
+     set(X11_Xcomposite_FOUND TRUE)
+     set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_Xcomposite_INCLUDE_PATH})
+  endif ()
+
+  if (X11_Xdamage_INCLUDE_PATH AND X11_Xdamage_LIB)
+     set(X11_Xdamage_FOUND TRUE)
+     set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_Xdamage_INCLUDE_PATH})
+  endif ()
+
+  if (X11_XShm_INCLUDE_PATH)
+     set(X11_XShm_FOUND TRUE)
+     set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_XShm_INCLUDE_PATH})
+  endif ()
+
+  if (X11_XTest_INCLUDE_PATH AND X11_XTest_LIB)
+      set(X11_XTest_FOUND TRUE)
+      set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_XTest_INCLUDE_PATH})
+  endif ()
+
+  if (X11_Xi_INCLUDE_PATH AND X11_Xi_LIB)
+     set(X11_Xi_FOUND TRUE)
+     set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_Xi_INCLUDE_PATH})
+  endif ()
+
+  if (X11_Xinerama_INCLUDE_PATH AND X11_Xinerama_LIB)
+     set(X11_Xinerama_FOUND TRUE)
+     set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_Xinerama_INCLUDE_PATH})
+  endif ()
+
+  if (X11_Xfixes_INCLUDE_PATH AND X11_Xfixes_LIB)
+     set(X11_Xfixes_FOUND TRUE)
+     set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_Xfixes_INCLUDE_PATH})
+  endif ()
+
+  if (X11_Xrender_INCLUDE_PATH AND X11_Xrender_LIB)
+     set(X11_Xrender_FOUND TRUE)
+     set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_Xrender_INCLUDE_PATH})
+  endif ()
+
+  if (X11_XRes_INCLUDE_PATH AND X11_XRes_LIB)
+     set(X11_XRes_FOUND TRUE)
+     set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_XRes_INCLUDE_PATH})
+  endif ()
+
+  if (X11_Xrandr_INCLUDE_PATH AND X11_Xrandr_LIB)
+     set(X11_Xrandr_FOUND TRUE)
+     set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_Xrandr_INCLUDE_PATH})
+  endif ()
+
+  if (X11_xf86misc_INCLUDE_PATH AND X11_Xxf86misc_LIB)
+     set(X11_xf86misc_FOUND TRUE)
+     set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_xf86misc_INCLUDE_PATH})
+  endif ()
+
+  if (X11_xf86vmode_INCLUDE_PATH AND X11_Xxf86vm_LIB)
+     set(X11_xf86vmode_FOUND TRUE)
+     set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_xf86vmode_INCLUDE_PATH})
+  endif ()
+
+  if (X11_Xcursor_INCLUDE_PATH AND X11_Xcursor_LIB)
+     set(X11_Xcursor_FOUND TRUE)
+     set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_Xcursor_INCLUDE_PATH})
+  endif ()
+
+  if (X11_Xscreensaver_INCLUDE_PATH AND X11_Xscreensaver_LIB)
+     set(X11_Xscreensaver_FOUND TRUE)
+     set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_Xscreensaver_INCLUDE_PATH})
+  endif ()
+
+  if (X11_dpms_INCLUDE_PATH)
+     set(X11_dpms_FOUND TRUE)
+     set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_dpms_INCLUDE_PATH})
+  endif ()
+
+  if (X11_Xkb_INCLUDE_PATH AND X11_Xkblib_INCLUDE_PATH AND X11_Xlib_INCLUDE_PATH)
+     set(X11_Xkb_FOUND TRUE)
+     set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_Xkb_INCLUDE_PATH} )
+  endif ()
+
+  if (X11_Xkbfile_INCLUDE_PATH AND X11_Xkbfile_LIB AND X11_Xlib_INCLUDE_PATH)
+     set(X11_Xkbfile_FOUND TRUE)
+     set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_Xkbfile_INCLUDE_PATH} )
+  endif ()
+
+  if (X11_Xmu_INCLUDE_PATH AND X11_Xmu_LIB)
+     set(X11_Xmu_FOUND TRUE)
+     set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_Xmu_INCLUDE_PATH})
+  endif ()
+
+  if (X11_Xinput_INCLUDE_PATH AND X11_Xinput_LIB)
+     set(X11_Xinput_FOUND TRUE)
+     set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_Xinput_INCLUDE_PATH})
+  endif ()
+
+  if (X11_XSync_INCLUDE_PATH)
+     set(X11_XSync_FOUND TRUE)
+     set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_XSync_INCLUDE_PATH})
+  endif ()
+
+  if(X11_ICE_LIB AND X11_ICE_INCLUDE_PATH)
+     set(X11_ICE_FOUND TRUE)
+  endif()
+
+  if(X11_SM_LIB AND X11_SM_INCLUDE_PATH)
+     set(X11_SM_FOUND TRUE)
+  endif()
+
+  # Most of the X11 headers will be in the same directories, avoid
+  # creating a huge list of duplicates.
+  if (X11_INCLUDE_DIR)
+     list(REMOVE_DUPLICATES X11_INCLUDE_DIR)
+  endif ()
+
+  # Deprecated variable for backwards compatibility with CMake 1.4
+  if (X11_X11_INCLUDE_PATH AND X11_LIBRARIES)
+    set(X11_FOUND 1)
+  endif ()
+
+  if(X11_FOUND)
+    include(/usr/share/cmake28/Modules/CheckFunctionExists.cmake)
+    include(/usr/share/cmake28/Modules/CheckLibraryExists.cmake)
+
+    # Translated from an autoconf-generated configure script.
+    # See libs.m4 in autoconf's m4 directory.
+    if($ENV{ISC} MATCHES "^yes$")
+      set(X11_X_EXTRA_LIBS -lnsl_s -linet)
+    else()
+      set(X11_X_EXTRA_LIBS "")
+
+      # See if XOpenDisplay in X11 works by itself.
+      CHECK_LIBRARY_EXISTS("${X11_LIBRARIES}" "XOpenDisplay" "${X11_LIBRARY_DIR}" X11_LIB_X11_SOLO)
+      if(NOT X11_LIB_X11_SOLO)
+        # Find library needed for dnet_ntoa.
+        CHECK_LIBRARY_EXISTS("dnet" "dnet_ntoa" "" X11_LIB_DNET_HAS_DNET_NTOA)
+        if (X11_LIB_DNET_HAS_DNET_NTOA)
+          set (X11_X_EXTRA_LIBS ${X11_X_EXTRA_LIBS} -ldnet)
+        else ()
+          CHECK_LIBRARY_EXISTS("dnet_stub" "dnet_ntoa" "" X11_LIB_DNET_STUB_HAS_DNET_NTOA)
+          if (X11_LIB_DNET_STUB_HAS_DNET_NTOA)
+            set (X11_X_EXTRA_LIBS ${X11_X_EXTRA_LIBS} -ldnet_stub)
+          endif ()
+        endif ()
+      endif()
+
+      # Find library needed for gethostbyname.
+      CHECK_FUNCTION_EXISTS("gethostbyname" CMAKE_HAVE_GETHOSTBYNAME)
+      if(NOT CMAKE_HAVE_GETHOSTBYNAME)
+        CHECK_LIBRARY_EXISTS("nsl" "gethostbyname" "" CMAKE_LIB_NSL_HAS_GETHOSTBYNAME)
+        if (CMAKE_LIB_NSL_HAS_GETHOSTBYNAME)
+          set (X11_X_EXTRA_LIBS ${X11_X_EXTRA_LIBS} -lnsl)
+        else ()
+          CHECK_LIBRARY_EXISTS("bsd" "gethostbyname" "" CMAKE_LIB_BSD_HAS_GETHOSTBYNAME)
+          if (CMAKE_LIB_BSD_HAS_GETHOSTBYNAME)
+            set (X11_X_EXTRA_LIBS ${X11_X_EXTRA_LIBS} -lbsd)
+          endif ()
+        endif ()
+      endif()
+
+      # Find library needed for connect.
+      CHECK_FUNCTION_EXISTS("connect" CMAKE_HAVE_CONNECT)
+      if(NOT CMAKE_HAVE_CONNECT)
+        CHECK_LIBRARY_EXISTS("socket" "connect" "" CMAKE_LIB_SOCKET_HAS_CONNECT)
+        if (CMAKE_LIB_SOCKET_HAS_CONNECT)
+          set (X11_X_EXTRA_LIBS -lsocket ${X11_X_EXTRA_LIBS})
+        endif ()
+      endif()
+
+      # Find library needed for remove.
+      CHECK_FUNCTION_EXISTS("remove" CMAKE_HAVE_REMOVE)
+      if(NOT CMAKE_HAVE_REMOVE)
+        CHECK_LIBRARY_EXISTS("posix" "remove" "" CMAKE_LIB_POSIX_HAS_REMOVE)
+        if (CMAKE_LIB_POSIX_HAS_REMOVE)
+          set (X11_X_EXTRA_LIBS ${X11_X_EXTRA_LIBS} -lposix)
+        endif ()
+      endif()
+
+      # Find library needed for shmat.
+      CHECK_FUNCTION_EXISTS("shmat" CMAKE_HAVE_SHMAT)
+      if(NOT CMAKE_HAVE_SHMAT)
+        CHECK_LIBRARY_EXISTS("ipc" "shmat" "" CMAKE_LIB_IPS_HAS_SHMAT)
+        if (CMAKE_LIB_IPS_HAS_SHMAT)
+          set (X11_X_EXTRA_LIBS ${X11_X_EXTRA_LIBS} -lipc)
+        endif ()
+      endif()
+    endif()
+
+    if (X11_ICE_FOUND)
+      CHECK_LIBRARY_EXISTS("ICE" "IceConnectionNumber" "${X11_LIBRARY_DIR}"
+                            CMAKE_LIB_ICE_HAS_ICECONNECTIONNUMBER)
+      if(CMAKE_LIB_ICE_HAS_ICECONNECTIONNUMBER)
+        set (X11_X_PRE_LIBS ${X11_ICE_LIB})
+        if(X11_SM_LIB)
+          set (X11_X_PRE_LIBS ${X11_SM_LIB} ${X11_X_PRE_LIBS})
+        endif()
+      endif()
+    endif ()
+
+    if (X11_Xdmcp_FOUND)
+      set (X11_X_EXTRA_LIBS ${X11_X_EXTRA_LIBS} ${X11_Xdmcp_LIB})
+    endif ()
+
+    if (X11_Xau_FOUND)
+      set (X11_X_EXTRA_LIBS ${X11_X_EXTRA_LIBS} ${X11_Xau_LIB})
+    endif ()
+
+    # Build the final list of libraries.
+    set(X11_LIBRARIES ${X11_X_PRE_LIBS} ${X11_LIBRARIES} ${X11_X_EXTRA_LIBS})
+
+    include(/usr/share/cmake28/Modules/FindPackageMessage.cmake)
+    FIND_PACKAGE_MESSAGE(X11 "Found X11: ${X11_X11_LIB}"
+      "[${X11_X11_LIB}][${X11_INCLUDE_DIR}]")
+  else ()
+    if (X11_FIND_REQUIRED)
+      message(FATAL_ERROR "Could not find X11")
+    endif ()
+  endif ()
+
+  mark_as_advanced(
+    X11_X11_INCLUDE_PATH
+    X11_X11_LIB
+    X11_Xext_LIB
+    X11_Xau_LIB
+    X11_Xau_INCLUDE_PATH
+    X11_Xlib_INCLUDE_PATH
+    X11_Xutil_INCLUDE_PATH
+    X11_Xcomposite_INCLUDE_PATH
+    X11_Xcomposite_LIB
+    X11_Xaccess_INCLUDE_PATH
+    X11_Xfixes_LIB
+    X11_Xfixes_INCLUDE_PATH
+    X11_Xrandr_LIB
+    X11_Xrandr_INCLUDE_PATH
+    X11_Xdamage_LIB
+    X11_Xdamage_INCLUDE_PATH
+    X11_Xrender_LIB
+    X11_Xrender_INCLUDE_PATH
+    X11_XRes_LIB
+    X11_XRes_INCLUDE_PATH
+    X11_Xxf86misc_LIB
+    X11_xf86misc_INCLUDE_PATH
+    X11_Xxf86vm_LIB
+    X11_xf86vmode_INCLUDE_PATH
+    X11_Xi_LIB
+    X11_Xi_INCLUDE_PATH
+    X11_Xinerama_LIB
+    X11_Xinerama_INCLUDE_PATH
+    X11_XTest_LIB
+    X11_XTest_INCLUDE_PATH
+    X11_Xcursor_LIB
+    X11_Xcursor_INCLUDE_PATH
+    X11_dpms_INCLUDE_PATH
+    X11_Xt_LIB
+    X11_Xt_INCLUDE_PATH
+    X11_Xdmcp_LIB
+    X11_LIBRARIES
+    X11_Xaccessrules_INCLUDE_PATH
+    X11_Xaccessstr_INCLUDE_PATH
+    X11_Xdmcp_INCLUDE_PATH
+    X11_Xkb_INCLUDE_PATH
+    X11_Xkblib_INCLUDE_PATH
+    X11_Xkbfile_INCLUDE_PATH
+    X11_Xkbfile_LIB
+    X11_Xmu_INCLUDE_PATH
+    X11_Xmu_LIB
+    X11_Xscreensaver_INCLUDE_PATH
+    X11_Xscreensaver_LIB
+    X11_Xpm_INCLUDE_PATH
+    X11_Xpm_LIB
+    X11_Xinput_LIB
+    X11_Xinput_INCLUDE_PATH
+    X11_Xft_LIB
+    X11_Xft_INCLUDE_PATH
+    X11_Xshape_INCLUDE_PATH
+    X11_Xv_LIB
+    X11_Xv_INCLUDE_PATH
+    X11_XShm_INCLUDE_PATH
+    X11_ICE_LIB
+    X11_ICE_INCLUDE_PATH
+    X11_SM_LIB
+    X11_SM_INCLUDE_PATH
+    X11_XSync_INCLUDE_PATH
+  )
+  set(CMAKE_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK_SAVE})
+endif ()
+
+# X11_FIND_REQUIRED_<component> could be checked too
diff --git a/contrib/packages/rpm/el5/SOURCES/fc-cache.1 b/contrib/packages/rpm/el5/SOURCES/fc-cache.1
new file mode 100644
index 0000000..3d4eebf
--- /dev/null
+++ b/contrib/packages/rpm/el5/SOURCES/fc-cache.1
@@ -0,0 +1,75 @@
+.\" This manpage has been automatically generated by docbook2man 
+.\" from a DocBook document.  This tool can be found at:
+.\" <http://shell.ipoline.com/~elmert/comp/docbook2X/> 
+.\" Please send any bug reports, improvements, comments, patches, 
+.\" etc. to Steve Cheng <steve@ggi-project.org>.
+.TH "FC-CACHE" "1" "16 January 2007" "" ""
+
+.SH NAME
+fc-cache \- build font information cache files
+.SH SYNOPSIS
+
+\fBfc-cache\fR [ \fB-fsvV?\fR ] [ \fB--force\fR ] [ \fB--system-only\fR ] [ \fB--verbose\fR ] [ \fB--version\fR ] [ \fB--help\fR ] [ \fB\fIdirs\fB\fR ]
+
+.SH "DESCRIPTION"
+.PP
+\fBfc-cache\fR scans the font directories on
+the system and builds font information cache files for
+applications using fontconfig for their font handling.
+.PP
+If directory arguments are not given,
+\fBfc-cache\fR uses each directory in the
+current font configuration. Each directory is scanned for
+font files readable by FreeType.  A cache is created which
+contains properties of each font and the associated filename.
+This cache is used to speed up application startup when using
+the fontconfig library.
+.PP
+Note that \fBfc-cache\fR must be executed
+once per architecture to generate font information customized
+for that architecture.  On a subsequent run,
+\fBfc-cache\fR will augment the cache
+information files with the information for the new
+architecture. 
+.SH "OPTIONS"
+.PP
+This program follows the usual GNU command line syntax,
+with long options starting with two dashes (`-').  A summary of
+options is included below.
+.TP
+\fB-f --force \fR
+Force re-generation of apparently up-to-date cache files,
+overriding the timestamp checking.
+.TP
+\fB-s --system-only \fR
+Only scan system-wide directories, omitting the places
+located in the user's home directory.
+.TP
+\fB-v --verbose \fR
+Display status information while busy.
+.TP
+\fB-? --help \fR
+Show summary of options.
+.TP
+\fB-V --version \fR
+Show version of the program and exit.
+.TP
+\fB\fIdirs\fB \fR
+A list of directories to scan for fonts.
+.SH "FILES"
+.TP
+\fB\fIfonts.cache-2\fB\fR
+These files are generated by \fBfc-cache\fR
+and contain maps from file names to font properties. They are
+read by the fontconfig library at application startup to locate
+appropriate fonts.
+.SH "SEE ALSO"
+.PP
+\fBfc-list\fR (1).
+.PP
+The fontconfig user's guide, in HTML format:
+\fI/usr/share/doc/fontconfig/fontconfig-user.html\fR\&.
+.SH "AUTHOR"
+.PP
+This manual page was written by Keith Packard
+<keithp@keithp.com> and Josselin Mouette <joss@debian.org>\&.
diff --git a/contrib/packages/rpm/el5/SOURCES/fc-cat.1 b/contrib/packages/rpm/el5/SOURCES/fc-cat.1
new file mode 100644
index 0000000..f87ef56
--- /dev/null
+++ b/contrib/packages/rpm/el5/SOURCES/fc-cat.1
@@ -0,0 +1,37 @@
+.\" This manpage has been automatically generated by docbook2man 
+.\" from a DocBook document.  This tool can be found at:
+.\" <http://shell.ipoline.com/~elmert/comp/docbook2X/> 
+.\" Please send any bug reports, improvements, comments, patches, 
+.\" etc. to Steve Cheng <steve@ggi-project.org>.
+.TH "FC-CAT" "1" "16 January 2007" "" ""
+
+.SH NAME
+fc-cat \- read font information cache files
+.SH SYNOPSIS
+
+\fBfc-cat < fonts-cache-2-file >\fR [ \fB-V?\fR ] [ \fB--version\fR ] [ \fB--help\fR ] [ \fB\fIdirs\fB\fR ]
+
+.SH "DESCRIPTION"
+.PP
+\fBfc-cat\fR reads a font information cache file
+and emits it in ASCII form.
+.SH "OPTIONS"
+.PP
+This program follows the usual GNU command line syntax,
+with long options starting with two dashes (`-').  A summary of
+options is included below.
+.TP
+\fB-? --help \fR
+Show summary of options.
+.TP
+\fB-V --version \fR
+Show version of the program and exit.
+.SH "SEE ALSO"
+.PP
+\fBfc-cache\fR (1).
+.PP
+The fontconfig user's guide, in HTML format:
+\fI/usr/share/doc/fontconfig/fontconfig-user.html\fR\&.
+.SH "AUTHOR"
+.PP
+This manual page was written by Patrick Lam <plam@mit.edu>\&.
diff --git a/contrib/packages/rpm/el5/SOURCES/fc-list.1 b/contrib/packages/rpm/el5/SOURCES/fc-list.1
new file mode 100644
index 0000000..8ccc850
--- /dev/null
+++ b/contrib/packages/rpm/el5/SOURCES/fc-list.1
@@ -0,0 +1,61 @@
+.\" This manpage has been automatically generated by docbook2man 
+.\" from a DocBook document.  This tool can be found at:
+.\" <http://shell.ipoline.com/~elmert/comp/docbook2X/> 
+.\" Please send any bug reports, improvements, comments, patches, 
+.\" etc. to Steve Cheng <steve@ggi-project.org>.
+.TH "FC-LIST" "1" "16 January 2007" "" ""
+
+.SH NAME
+fc-list \- list available fonts
+.SH SYNOPSIS
+
+\fBfc-list\fR [ \fB-vV?\fR ] [ \fB--verbose\fR ] [ \fB--version\fR ] [ \fB--help\fR ] [ \fB\fIpattern\fB\fR ] [ \fB\fIelement\fB\fR ]
+
+.SH "DESCRIPTION"
+.PP
+\fBfc-list\fR lists fonts and styles
+available on the system for applications using fontconfig.
+.SH "OPTIONS"
+.PP
+This program follows the usual GNU command line syntax,
+with long options starting with two dashes (`-').  A summary of
+options is included below.
+.TP
+\fB-v --verbose \fR
+Display status information while busy.
+.TP
+\fB-? --help \fR
+Show summary of options.
+.TP
+\fB-V --version \fR
+Show version of the program and exit.
+.TP
+\fB\fIpattern\fB \fR
+If this argument is set, only fonts matching
+\fIpattern\fR are displayed.
+.TP
+\fB\fIelement\fB \fR
+If set, the \fIelement\fR property
+is displayed for matching fonts.
+.SH "EXAMPLES"
+.TP
+\fBfc-list\fR
+Lists all font faces.
+.TP
+\fBfc-list :lang=hi\fR
+Lists font faces that cover Hindi.
+.TP
+\fBfc-list : family style file spacing \fR
+Lists the filename and spacing value for each font
+face.  ``:'' is an empty pattern that matches all
+fonts.
+.SH "SEE ALSO"
+.PP
+\fBfc-cache\fR (1).
+.PP
+The fontconfig user's guide, in HTML format:
+\fI/usr/share/doc/fontconfig/fontconfig-user.html\fR\&.
+.SH "AUTHOR"
+.PP
+This manual page was written by Keith Packard
+<keithp@keithp.com> and Josselin Mouette <joss@debian.org>\&.
diff --git a/contrib/packages/rpm/el5/SOURCES/fc-match.1 b/contrib/packages/rpm/el5/SOURCES/fc-match.1
new file mode 100644
index 0000000..5b8a7f9
--- /dev/null
+++ b/contrib/packages/rpm/el5/SOURCES/fc-match.1
@@ -0,0 +1,51 @@
+.\" This manpage has been automatically generated by docbook2man 
+.\" from a DocBook document.  This tool can be found at:
+.\" <http://shell.ipoline.com/~elmert/comp/docbook2X/> 
+.\" Please send any bug reports, improvements, comments, patches, 
+.\" etc. to Steve Cheng <steve@ggi-project.org>.
+.TH "FC-MATCH" "1" "16 January 2007" "" ""
+
+.SH NAME
+fc-match \- match available fonts
+.SH SYNOPSIS
+
+\fBfc-match\fR [ \fB-svV?\fR ] [ \fB--sort\fR ] [ \fB--verbose\fR ] [ \fB--version\fR ] [ \fB--help\fR ] [ \fB\fIfont-pattern\fB\fR ]
+
+.SH "DESCRIPTION"
+.PP
+\fBfc-match\fR matches font-pattern (empty
+pattern by default) using the normal fontconfig matching rules to find
+the best font available.  If --sort is given, the sorted list of best
+matching fonts is displayed.  With --verbose, the whole font pattern
+for each match is printed, otherwise only the file, family and style
+are printed..
+.SH "OPTIONS"
+.PP
+This program follows the usual GNU command line syntax,
+with long options starting with two dashes (`-').  A summary of
+options is included below.
+.TP
+\fB-v --verbose \fR
+Print whole font pattern for each match.
+.TP
+\fB-? --help \fR
+Show summary of options.
+.TP
+\fB-V --version \fR
+Show version of the program and exit.
+.TP
+\fB-s --sort \fR
+Displays sorted list of best matching fonts.
+.TP
+\fB\fIfont-pattern\fB \fR
+Displays fonts matching
+\fIfont-pattern\fR (uses empty pattern by default).
+.SH "SEE ALSO"
+.PP
+\fBfc-list\fR (1).
+.PP
+The fontconfig user's guide, in HTML format:
+\fI/usr/share/doc/fontconfig/fontconfig-user.html\fR\&.
+.SH "AUTHOR"
+.PP
+This manual page was updated by Patrick Lam <plam@csail.mit.edu>\&.
diff --git a/contrib/packages/rpm/el5/SOURCES/fltk-1.3.2-libdl.patch b/contrib/packages/rpm/el5/SOURCES/fltk-1.3.2-libdl.patch
new file mode 100644
index 0000000..78c8fd4
--- /dev/null
+++ b/contrib/packages/rpm/el5/SOURCES/fltk-1.3.2-libdl.patch
@@ -0,0 +1,100 @@
+Index: CMakeLists.txt
+===================================================================
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+--- a/CMakeLists.txt	(revision 9965)
++++ b/CMakeLists.txt	(working copy)
+@@ -138,6 +139,7 @@
+ #######################################################################
+ # libraries
+ find_library(LIB_CAIRO cairo)
++find_library(LIB_dl dl)
+ find_library(LIB_fontconfig fontconfig)
+ find_library(LIB_freetype freetype)
+ find_library(LIB_GL GL)
+@@ -146,7 +148,7 @@
+ find_library(LIB_png png)
+ find_library(LIB_zlib z)
+ 
+-mark_as_advanced(LIB_CAIRO LIB_fontconfig LIB_freetype)
++mark_as_advanced(LIB_CAIRO LIB_dl LIB_fontconfig LIB_freetype)
+ mark_as_advanced(LIB_GL LIB_MesaGL)
+ mark_as_advanced(LIB_jpeg LIB_png LIB_zlib)
+ 
+Index: src/CMakeLists.txt
+===================================================================
+diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
+--- a/src/CMakeLists.txt	(revision 9965)
++++ b/src/CMakeLists.txt	(working copy)
+@@ -220,7 +220,7 @@
+ endif(MSVC)
+ 
+ if(USE_THREADS)
+-   target_link_libraries(fltk ${CMAKE_THREAD_LIBS_INIT})
++   target_link_libraries(fltk ${CMAKE_THREAD_LIBS_INIT} ${LIB_dl})
+ endif(USE_THREADS)
+ 
+ if(USE_X11)
+@@ -334,7 +334,7 @@
+ endif(MSVC)
+ 
+ if(USE_THREADS)
+-   target_link_libraries(fltk_SHARED ${CMAKE_THREAD_LIBS_INIT})
++   target_link_libraries(fltk_SHARED ${CMAKE_THREAD_LIBS_INIT} ${LIB_dl})
+ endif(USE_THREADS)
+ 
+ if(USE_X11)
+@@ -384,11 +384,11 @@
+ endif(MSVC)
+ 
+ if(USE_THREADS)
+-   target_link_libraries(fltk_SHARED ${CMAKE_THREAD_LIBS_INIT})
++   target_link_libraries(fltk_forms_SHARED ${CMAKE_THREAD_LIBS_INIT} ${LIB_dl})
+ endif(USE_THREADS)
+ 
+ if(USE_X11)
+-   target_link_libraries(fltk_SHARED ${X11_LIBRARIES})
++   target_link_libraries(fltk_forms_SHARED ${X11_LIBRARIES})
+ endif(USE_X11)
+ 
+ #######################################################################
+diff -Naur a/CMake/FindDL.cmake b/CMake/FindDL.cmake
+--- a/CMake/FindDL.cmake	1969-12-31 19:00:00.000000000 -0500
++++ b/CMake/FindDL.cmake	2014-10-29 23:00:18.000000000 -0400
+@@ -0,0 +1,37 @@
++# - Find dl functions
++# This module finds dl libraries.
++#
++# It sets the following variables:
++#  DL_FOUND       - Set to false, or undefined, if dl libraries aren't found.
++#  DL_INCLUDE_DIR - The dl include directory.
++#  DL_LIBRARY     - The dl library to link against.
++
++INCLUDE(CheckFunctionExists)
++
++FIND_PATH(DL_INCLUDE_DIR NAMES dlfcn.h)
++FIND_LIBRARY(DL_LIBRARY NAMES dl)
++
++IF (DL_LIBRARY)
++   SET(DL_FOUND TRUE)
++ELSE (DL_LIBRARY)
++   # if dlopen can be found without linking in dl then,
++   # dlopen is part of libc, so don't need to link extra libs.
++   CHECK_FUNCTION_EXISTS(dlopen DL_FOUND)
++   SET(DL_LIBRARY "")
++ENDIF (DL_LIBRARY)
++
++IF (DL_FOUND)
++
++   # show which dl was found only if not quiet
++   IF (NOT DL_FIND_QUIETLY)
++      MESSAGE(STATUS "Found dl: ${DL_LIBRARY}")
++   ENDIF (NOT DL_FIND_QUIETLY)
++
++ELSE (DL_FOUND)
++
++   # fatal error if dl is required but not found
++   IF (DL_FIND_REQUIRED)
++      MESSAGE(FATAL_ERROR "Could not find dl")
++   ENDIF (DL_FIND_REQUIRED)
++
++ENDIF (DL_FOUND)
diff --git a/contrib/packages/rpm/el5/SOURCES/fltk-1.3.2-static-libs.patch b/contrib/packages/rpm/el5/SOURCES/fltk-1.3.2-static-libs.patch
new file mode 100644
index 0000000..0341612
--- /dev/null
+++ b/contrib/packages/rpm/el5/SOURCES/fltk-1.3.2-static-libs.patch
@@ -0,0 +1,74 @@
+--- fltk-1.3.2/src/CMakeLists.txt	2014-09-02 22:05:40.000000000 -0400
++++ fltk-1.3.2/src/CMakeLists.txt	2014-09-02 22:12:35.000000000 -0400
+@@ -223,10 +223,6 @@
+    target_link_libraries(fltk ${CMAKE_THREAD_LIBS_INIT} ${LIB_dl})
+ endif(USE_THREADS)
+ 
+-if(USE_X11)
+-   target_link_libraries(fltk ${X11_LIBRARIES})
+-endif(USE_X11)
+-
+ if(WIN32)
+    target_link_libraries(fltk comctl32)
+ endif(WIN32)
+@@ -239,10 +235,6 @@
+    target_link_libraries(fltk ${X11_Xinerama_LIB})
+ endif(HAVE_XINERAMA)
+ 
+-if(HAVE_XFIXES)
+-   target_link_libraries(fltk ${X11_Xfixes_LIB})
+-endif(HAVE_XFIXES)
+-
+ if(HAVE_XCURSOR)
+    target_link_libraries(fltk ${X11_Xcursor_LIB})
+ endif(HAVE_XCURSOR)
+@@ -251,10 +243,30 @@
+    target_link_libraries(fltk ${X11_Xft_LIB})
+ endif(USE_XFT)
+ 
++if(HAVE_XFIXES)
++   target_link_libraries(fltk ${X11_Xfixes_LIB})
++endif(HAVE_XFIXES)
++
++if(X11_Xrender_FOUND)
++   target_link_libraries(fltk ${X11_Xrender_LIB})
++endif(X11_Xrender_FOUND)
++
++if(USE_X11)
++   target_link_libraries(fltk ${X11_LIBRARIES})
++endif(USE_X11)
++
+ if(LIB_fontconfig)
+    target_link_libraries(fltk ${LIB_fontconfig})
+ endif(LIB_fontconfig)
+ 
++if(LIB_EXPAT)
++   target_link_libraries(fltk ${LIB_EXPAT})
++endif(LIB_EXPAT)
++
++if(LIB_freetype)
++   target_link_libraries(fltk ${LIB_freetype} ${LIB_dl})
++endif(LIB_freetype)
++
+ #######################################################################
+ add_library(fltk_forms STATIC ${FLCPPFILES})
+ target_link_libraries(fltk_forms fltk)
+--- fltk-1.3.2/CMakeLists.txt	2014-09-02 22:56:47.000000000 -0400
++++ fltk-1.3.2/CMakeLists.txt	2014-09-02 22:57:19.000000000 -0400
+@@ -147,6 +147,7 @@
+ find_library(LIB_jpeg jpeg)
+ find_library(LIB_png png)
+ find_library(LIB_zlib z)
++find_library(LIB_EXPAT expat)
+ 
+ mark_as_advanced(LIB_CAIRO LIB_dl LIB_fontconfig LIB_freetype)
+ mark_as_advanced(LIB_GL LIB_MesaGL)
+@@ -383,7 +383,7 @@
+ 
+ if(OPENGL_FOUND)
+    set(CMAKE_REQUIRED_INCLUDES ${OPENGL_INCLUDE_DIR}/GL)
+-   set(CMAKE_REQUIRED_LIBRARIES -lGLU -lGL)
++   set(CMAKE_REQUIRED_LIBRARIES -lGLU -lGL -lXdmcp -lXau)
+    CHECK_FUNCTION_EXISTS(glXGetProcAddressARB HAVE_GLXGETPROCADDRESSARB)
+    set(FLTK_GL_FOUND TRUE)
+ else()
diff --git a/contrib/packages/rpm/el5/SOURCES/tigervnc-static-fltk.patch b/contrib/packages/rpm/el5/SOURCES/tigervnc-static-fltk.patch
new file mode 100644
index 0000000..650da73
--- /dev/null
+++ b/contrib/packages/rpm/el5/SOURCES/tigervnc-static-fltk.patch
@@ -0,0 +1,22 @@
+--- a/cmake/StaticBuild.cmake	2014-10-29 20:23:24.000000000 -0400
++++ b/cmake/StaticBuild.cmake	2014-10-29 20:24:05.000000000 -0400
+@@ -68,7 +68,7 @@
+   endif()
+ 
+   if(FLTK_FOUND)
+-    set(FLTK_LIBRARIES "-Wl,-Bstatic -lfltk_images -lpng -ljpeg -lfltk -Wl,-Bdynamic")
++    set(FLTK_LIBRARIES "-Wl,-Bstatic -L${FLTK_LIBRARY_DIR} -lfltk_images -lpng -ljpeg -lfltk -Wl,-Bdynamic")
+ 
+     if(WIN32)
+       set(FLTK_LIBRARIES "${FLTK_LIBRARIES} -lcomctl32")
+--- a/vncviewer/CMakeLists.txt	2014-10-29 20:39:58.000000000 -0400
++++ b/vncviewer/CMakeLists.txt	2014-10-29 21:01:31.000000000 -0400
+@@ -46,7 +46,7 @@
+   add_executable(vncviewer ${VNCVIEWER_SOURCES})
+ endif()
+ 
+-target_link_libraries(vncviewer rfb network rdr os Xregion ${FLTK_LIBRARIES} ${GETTEXT_LIBRARIES})
++target_link_libraries(vncviewer ${FLTK_LIBRARIES} rfb network rdr os Xregion ${X11_Xdmcp_LIB} ${X11_Xau_LIB} ${GETTEXT_LIBRARIES})
+ 
+ if(APPLE)
+   target_link_libraries(vncviewer "-framework Cocoa" "-framework Carbon")
diff --git a/contrib/packages/rpm/el5/SOURCES/tigervnc-x0vncserver-static-libs-fix.patch b/contrib/packages/rpm/el5/SOURCES/tigervnc-x0vncserver-static-libs-fix.patch
new file mode 100644
index 0000000..9de3f85
--- /dev/null
+++ b/contrib/packages/rpm/el5/SOURCES/tigervnc-x0vncserver-static-libs-fix.patch
@@ -0,0 +1,22 @@
+--- a/unix/x0vncserver/CMakeLists.txt	2014-10-29 18:25:30.000000000 -0400
++++ b/unix/x0vncserver/CMakeLists.txt	2014-10-29 18:26:38.000000000 -0400
+@@ -31,7 +31,7 @@
+   message(WARNING "No DAMAGE extension.  x0vncserver will have to use the slower polling method.")
+ endif()
+ 
+-target_link_libraries(x0vncserver ${X11_LIBRARIES})
++target_link_libraries(x0vncserver ${X11_LIBRARIES} ${X11_Xdmcp_LIB} ${X11_Xau_LIB})
+ 
+ install(TARGETS x0vncserver DESTINATION ${BIN_DIR})
+ install(FILES x0vncserver.man DESTINATION ${MAN_DIR}/man1 RENAME x0vncserver.1)
+--- a/unix/vncconfig/CMakeLists.txt	2014-10-29 18:45:41.000000000 -0400
++++ b/unix/vncconfig/CMakeLists.txt	2014-10-29 18:46:17.000000000 -0400
+@@ -9,7 +9,7 @@
+   vncconfig.cxx
+   QueryConnectDialog.cxx)
+ 
+-target_link_libraries(vncconfig tx rfb network rdr ${X11_LIBRARIES})
++target_link_libraries(vncconfig tx rfb network rdr ${X11_LIBRARIES} ${X11_Xdmcp_LIB} ${X11_Xau_LIB})
+ 
+ install(TARGETS vncconfig DESTINATION ${BIN_DIR})
+ install(FILES vncconfig.man DESTINATION ${MAN_DIR}/man1 RENAME vncconfig.1)
diff --git a/contrib/packages/rpm/el5/SPECS/tigervnc.spec b/contrib/packages/rpm/el5/SPECS/tigervnc.spec
index c20076d..1b88670 100644
--- a/contrib/packages/rpm/el5/SPECS/tigervnc.spec
+++ b/contrib/packages/rpm/el5/SPECS/tigervnc.spec
@@ -1,10 +1,9 @@
 %define _default_patch_fuzz 2
-%define snap 20131128svn5139
 %define mesa_version 7.7.1
 
 Name: tigervnc
-Version: 1.3.80
-Release: 17%{?snap:.%{snap}}%{?dist}
+Version: @VERSION@
+Release: 18%{?snap:.%{snap}}%{?dist}
 Summary: A TigerVNC remote display system
 
 Group: User Interface/Desktops
@@ -16,11 +15,13 @@
 Source1: vncserver.service
 Source2: vncserver.sysconfig
 Source6: vncviewer.desktop
+Source9: FindX11.cmake
 Source11: http://fltk.org/pub/fltk/1.3.2/fltk-1.3.2-source.tar.gz
 Source12: http://downloads.sourceforge.net/project/libjpeg-turbo/1.3.0/libjpeg-turbo-1.3.0.tar.gz
 
 # http://ftp.redhat.com/pub/redhat/linux/enterprise/6Client/en/os/SRPMS/xorg-x11-proto-devel-7.6-13.el6.src.rpm
 # http://ftp.redhat.com/pub/redhat/linux/enterprise/6Client/en/os/SRPMS/
+Source98: http://www.x.org/releases/X11R7.5/src/util/makedepend-1.0.2.tar.bz2
 Source99: http://xcb.freedesktop.org/dist/libpthread-stubs-0.3.tar.bz2
 Source100: http://www.x.org/releases/X11R7.5/src/lib/libICE-1.0.6.tar.bz2
 Source101: http://www.x.org/releases/X11R7.5/src/lib/libSM-1.1.1.tar.bz2
@@ -113,13 +114,25 @@
 Source163: http://www.x.org/releases/X11R7.5/src/lib/libXres-1.0.4.tar.bz2
 Source164: http://www.x.org/releases/individual/lib/libXxf86misc-1.0.2.tar.bz2
 
+Source200: http://fontconfig.org/release/fontconfig-2.4.1.tar.gz
+Source201: 25-no-hint-fedora.conf
+Source202: 30-aliases-fedora.conf
+Source203: 40-generic-fedora.conf
+Source204: 64-nonlatin-fedora.conf
+Source205: 75-blacklist-fedora.conf
+
+Source210: fc-cache.1
+Source211: fc-cat.1
+Source212: fc-list.1
+Source213: fc-match.1
+
 # FIXME:
 # need to apply any patches in from the F12 srpms
-#http://dl.fedoraproject.org/pub/archive/fedora/linux/releases/12/Fedora/source/SRPMS/mesa-7.6-0.13.fc12.src.rpm
-#http://dl.fedoraproject.org/pub/archive/fedora/linux/releases/12/Fedora/source/SRPMS/pixman-0.16.2-1.fc12.src.rpm
-#http://vault.centos.org/6.3/os/Source/SPackages/pixman-0.18.4-1.el6_0.1.src.rpm
-#http://archive.fedoraproject.org/pub/archive/fedora/linux/releases/12/Everything/source/SRPMS/libdrm-2.4.15-4.fc12.src.rpm
-#http://dl.fedoraproject.org/pub/archive/fedora/linux/releases/12/Fedora/source/SRPMS/freetype-2.3.9-6.fc12.src.rpm
+# http://dl.fedoraproject.org/pub/archive/fedora/linux/releases/12/Fedora/source/SRPMS/mesa-7.6-0.13.fc12.src.rpm
+# http://dl.fedoraproject.org/pub/archive/fedora/linux/releases/12/Fedora/source/SRPMS/pixman-0.16.2-1.fc12.src.rpm
+# http://vault.centos.org/6.3/os/Source/SPackages/pixman-0.18.4-1.el6_0.1.src.rpm
+# http://archive.fedoraproject.org/pub/archive/fedora/linux/releases/12/Everything/source/SRPMS/libdrm-2.4.15-4.fc12.src.rpm
+# http://dl.fedoraproject.org/pub/archive/fedora/linux/releases/12/Fedora/source/SRPMS/freetype-2.3.9-6.fc12.src.rpm
 
 BuildRoot: %{_tmppath}/%{name}-%{version}%{?snap:-%{snap}}-%{release}-root-%(%{__id_u} -n)
 
@@ -131,6 +144,8 @@
 BuildRequires: pkgconfig >= 0.20
 BuildRequires: gcc44, gcc44-c++
 BuildRequires: glibc-devel, libstdc++-devel, libpng-devel
+BuildRequires: expat-devel
+BuildRequires: gperf, intltool, libtalloc-devel
 
 BuildRequires: openmotif-devel
 Requires: openmotif, openmotif22
@@ -147,9 +162,14 @@
 Patch4: tigervnc-cookie.patch
 Patch10: tigervnc11-ldnow.patch
 Patch11: tigervnc11-gethomedir.patch
+# https://bugzilla.redhat.com/show_bug.cgi?id=692048
+Patch14: tigervnc-x0vncserver-static-libs-fix.patch
+Patch15: tigervnc-static-fltk.patch
 
 Patch101: tigervnc-ac-compatibility.patch
 Patch102: tigervnc-xorg-1.7.5-remove-copyisolatin1lowered.patch
+Patch124: fltk-1.3.2-libdl.patch
+Patch125: fltk-1.3.2-static-libs.patch
 
 # Patches from libdrm-2.4.15-4.fc12.src.rpm
 # hardcode the 666 instead of 660 for device nodes
@@ -407,23 +427,6 @@
 of TigerVNC server, allowing others to access the desktop on your
 machine.
 
-%ifnarch s390 s390x
-%package server-module
-Summary: TigerVNC module to Xorg
-Group: User Interface/X
-Provides: vnc-server = 4.1.3-2, vnc-libs = 4.1.3-2
-Obsoletes: vnc-server < 4.1.3-2, vnc-libs < 4.1.3-2
-Provides: tightvnc-server-module = 1.5.0-0.15.20090204svn3586
-Obsoletes: tightvnc-server-module < 1.5.0-0.15.20090204svn3586
-Requires: xorg-x11-server-Xorg
-Requires: tigervnc-license
-BuildRequires: nasm >= 2.04
-
-%description server-module
-This package contains libvnc.so module to X server, allowing others
-to access the desktop on your machine.
-%endif
-
 %package server-applet
 Summary: Java TigerVNC viewer applet for TigerVNC server
 Group: User Interface/X
@@ -461,9 +464,12 @@
 %setup -q -n %{name}-%{version}%{?snap:-%{snap}}
 
 # sed -i -e 's/80/0/g' CMakeLists.txt
+cp %SOURCE9 cmake/Modules/
 %patch4 -p1 -b .cookie
 %patch10 -p1 -b .ldnow
 %patch11 -p1 -b .gethomedir
+%patch15 -p1 -b .static-fltk
+%patch14 -p1 -b .x0vncserver
 
 tar xzf %SOURCE11
 pushd fltk-*
@@ -471,12 +477,16 @@
 do
   patch -p1 -i $p
 done
+cp %SOURCE9 CMake/
+%patch124 -p1 -b .libdl
+%patch125 -p1 -b .static-libs
 popd
 
 tar xzf %SOURCE12
 
 mkdir xorg
 pushd xorg
+tar xjf %SOURCE98
 tar xjf %SOURCE99
 tar xjf %SOURCE100
 tar xjf %SOURCE101
@@ -535,8 +545,8 @@
 tar xjf %SOURCE154
 tar xjf %SOURCE155
 tar xjf %SOURCE156
-#tar xjf %SOURCE157
-#tar xjf %SOURCE158
+# tar xjf %SOURCE157
+# tar xjf %SOURCE158
 tar xjf %SOURCE159
 tar xjf %SOURCE160
 tar xjf %SOURCE161
@@ -544,8 +554,8 @@
 tar xjf %SOURCE163
 tar xjf %SOURCE164
 popd
-cp -a unix/xserver xorg/xserver
-cp -a xorg/xorg-server-1.*/* xorg/xserver
+tar xzf %SOURCE200
+cp -a xorg/xorg-server-1.*/* unix/xserver
 pushd xorg
 pushd libdrm-*
 %patch133 -p1 -b .forceperms
@@ -637,9 +647,10 @@
 %patch10400 -p1 -b .libsm-fix
 popd
 
-pushd xserver
-patch -p1 < %{_builddir}/%{name}-%{version}%{?snap:-%{snap}}/unix/xserver17.patch
+popd
 
+pushd unix/xserver
+patch -p1 < %{_builddir}/%{name}-%{version}%{?snap:-%{snap}}/unix/xserver17.patch
 for all in `find %{_builddir}/%{name}-%{version}%{?snap:-%{snap}}/unix/xorg-7.5-patches/ -type f |grep '.*\.patch$'`; do
 	echo Applying $all
 	patch -p1 < $all
@@ -762,7 +773,6 @@
 
 %patch8000 -p1 -b .cve-2011-4818
 %patch8001 -p1 -b .cve-2011-4818-extra
-popd
 
 popd
 
@@ -771,79 +781,47 @@
 %define static_lib_buildroot %{tigervnc_src_dir}/build
 export CC=gcc44
 export CXX=g++44
-export CFLAGS="$RPM_OPT_FLAGS"
-export CXXFLAGS="$CFLAGS"
-
-echo "*** Building fltk ***"
-pushd fltk-*
-export CFLAGS="$RPM_OPT_FLAGS"
+export CFLAGS="$RPM_OPT_FLAGS -fPIC"
 export CXXFLAGS="$CFLAGS -static-libgcc"
-%{cmake28} -G"Unix Makefiles" \
-  -DCMAKE_INSTALL_PREFIX=%{_prefix} \
-  -DCMAKE_BUILD_TYPE=Release \
-  -DOPTION_PREFIX_LIB=%{_libdir} \
-  -DOPTION_PREFIX_CONFIG=%{_libdir} \
-  -DOPTION_USE_THREADS=off \
-  -DOPTION_BUILD_EXAMPLES=off \
-  -DOPTION_USE_SYSTEM_LIBPNG=on
-make %{?_smp_mflags}
+
+%define xorg_buildroot %{tigervnc_src_dir}/xorg.build
+mkdir -p %{xorg_buildroot}%{_libdir}
+pushd %{xorg_buildroot}%{_libdir}
+ln -s `g++44 -print-file-name=libexpat.a`
+ln -s `g++44 -print-file-name=libgcrypt.a`
+ln -s `g++44 -print-file-name=libgpg-error.a`
+ln -s `g++44 -print-file-name=libgnutls.a`
+ln -s `g++44 -print-file-name=libstdc++.a`
+ln -s `g++44 -print-file-name=libcrypto.a`
+ln -s `g++44 -print-file-name=libz.a`
+ln -s `g++44 -print-file-name=libgcc.a`
+ln -s `g++44 -print-file-name=libpng.a`
 popd
 
 echo "*** Building libjpeg-turbo ***"
 pushd libjpeg-turbo-*
-export CFLAGS="$RPM_OPT_FLAGS -fPIC"
-export CXXFLAGS="$CFLAGS -static-libgcc"
 ./configure --prefix=%{_prefix} --libdir=%{_libdir} --disable-nls --enable-static --disable-shared
-make %{?_smp_mflags} DESTDIR=%{static_lib_buildroot} install
+make %{?_smp_mflags} DESTDIR=%{xorg_buildroot} install
 popd
 
-echo "*** Building VNC ***"
-export CFLAGS="$RPM_OPT_FLAGS -fPIC"
-export CXXFLAGS="$CFLAGS"
-%{cmake28} -G"Unix Makefiles" \
-  -DBUILD_STATIC=1 \
-  -DUSE_INCLUDED_ZLIB=1 \
-  -DCMAKE_INSTALL_PREFIX=%{_prefix} \
-  -DFLTK_LIBRARIES="%{tigervnc_src_dir}/fltk-1.3.2/lib/libfltk.a;%{tigervnc_src_dir}/fltk-1.3.2/lib/libfltk_images.a;`g++ -print-file-name=libpng.a`" \
-  -DFLTK_FLUID_EXECUTABLE=%{tigervnc_src_dir}/fltk-1.3.2/bin/fluid \
-  -DFLTK_INCLUDE_DIR=%{tigervnc_src_dir}/fltk-1.3.2 \
-  -DJPEG_INCLUDE_DIR=%{static_lib_buildroot}%{_includedir} \
-  -DJPEG_LIBRARY=%{static_lib_buildroot}%{_libdir}/libjpeg.a \
-  -DGNUTLS_LIBRARY='%{_libdir}/libgnutls.a;%{_libdir}/libgcrypt.a;%{_libdir}/libgpg-error.a'
-make %{?_smp_mflags}
-
-echo "*** Building Xorg ***"
-%define xorg_buildroot %{tigervnc_src_dir}/xorg.build
-mkdir -p %{xorg_buildroot}%{_libdir}
-pushd %{xorg_buildroot}%{_libdir}
-ln -s `g++ -print-file-name=libstdc++.a`
-ln -s `g++ -print-file-name=libcrypto.a`
-ln -s `g++ -print-file-name=libz.a`
-ln -s `g++ -print-file-name=libgcc.a`
-popd
 export CFLAGS="$RPM_OPT_FLAGS -fPIC -I%{xorg_buildroot}%{_includedir}"
 export CXXFLAGS="$RPM_OPT_FLAGS -fPIC -I%{xorg_buildroot}%{_includedir} -static-libgcc"
-export LDFLAGS="-L%{xorg_buildroot}%{_libdir} $LDFLAGS"
+export CPPFLAGS=$CXXFLAGS
+export LDFLAGS="$LDFLAGS -L%{xorg_buildroot}%{_libdir}"
 export ACLOCAL="aclocal -I %{xorg_buildroot}%{_datadir}/aclocal"
 export PKG_CONFIG_PATH="%{xorg_buildroot}%{_libdir}/pkgconfig:%{xorg_buildroot}%{_datadir}/pkgconfig"
+
+echo "*** Building Xorg ***"
 pushd xorg
-pushd util-macros-*
-echo "Building macros"
-./configure --prefix=/usr --libdir=%{_libdir} --disable-nls --enable-static --disable-shared
-make DESTDIR=%{xorg_buildroot} install
-find %{xorg_buildroot}%{_prefix} -type f -name "*.la" -exec sed -i -e "s|libdir='%{_libdir}'|libdir='%{xorg_buildroot}%{_libdir}'|" {} \;
-find %{xorg_buildroot}%{_prefix} -type f -name "*.pc" -exec sed -i -e "s|libdir=%{_libdir}|libdir=%{xorg_buildroot}%{_libdir}|" {} \;
-find %{xorg_buildroot}%{_prefix} -type f -name "*.pc" -exec sed -i -e "s|prefix=/usr|prefix=%{xorg_buildroot}%{_prefix}|" {} \;
-popd
 
 echo "*** Building freetype ***"
 pushd freetype-*
-./configure --prefix=/usr --libdir=%{_libdir} --enable-static --disable-shared --with-libtool=/usr/bin/libtool --disable-nls CFLAGS="$CFLAGS -fno-strict-aliasing"
+CFLAGS="$CFLAGS -fno-strict-aliasing" LDFLAGS="$LDFLAGS -static" ./configure --prefix=/usr --libdir=%{_libdir} --enable-static --disable-shared
 sed -i 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|g' builds/unix/libtool
 sed -i 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' builds/unix/libtool
 make DESTDIR=%{xorg_buildroot} install
 find %{xorg_buildroot}%{_prefix} -type f -name "*.la" -exec sed -i -e "s|libdir='%{_libdir}'|libdir='%{xorg_buildroot}%{_libdir}'|" {} \;
-find %{xorg_buildroot}%{_prefix} -type f -name "*.la" -exec sed -i -e "s|libdir=%{_libdir}|libdir=%{xorg_buildroot}%{_libdir}|" {} \;
+find %{xorg_buildroot}%{_prefix} -type f -name "*.pc" -exec sed -i -e "s|libdir=%{_libdir}|libdir=%{xorg_buildroot}%{_libdir}|" {} \;
 find %{xorg_buildroot}%{_prefix} -type f -name "*.pc" -exec sed -i -e "s|prefix=/usr|prefix=%{xorg_buildroot}%{_prefix}|" {} \;
 # fix multilib issues
 %ifarch x86_64 s390x ia64 ppc64 alpha sparc64
@@ -872,30 +850,41 @@
 EOF
 popd
 
+pushd util-macros-*
+echo "Building macros"
+./configure --prefix=/usr --libdir=%{_libdir} --disable-nls --enable-static --disable-shared
+make DESTDIR=%{xorg_buildroot} install
+find %{xorg_buildroot}%{_prefix} -type f -name "*.la" -exec sed -i -e "s|libdir='%{_libdir}'|libdir='%{xorg_buildroot}%{_libdir}'|" {} \;
+find %{xorg_buildroot}%{_prefix} -type f -name "*.pc" -exec sed -i -e "s|libdir=%{_libdir}|libdir=%{xorg_buildroot}%{_libdir}|" {} \;
+find %{xorg_buildroot}%{_prefix} -type f -name "*.pc" -exec sed -i -e "s|prefix=/usr|prefix=%{xorg_buildroot}%{_prefix}|" {} \;
+popd
+
 modules="\
-    dri2proto \
-    glproto \
-    xf86vidmodeproto \
-    xextproto \
-    xproto \
-    kbproto \
-    inputproto \
-    xcmiscproto \
     bigreqsproto \
-    xf86bigfontproto \
-    fixesproto \
-    damageproto \
-    xf86driproto \
-    randrproto \
-    renderproto \
-    scrnsaverproto \
-    resourceproto \
-    fontsproto \
-    videoproto \
     compositeproto \
-    xineramaproto \
-    xf86dgaproto \
+    damageproto \
+    dri2proto \
+    fixesproto \
+    fontsproto \
+    glproto \
+    inputproto \
+    kbproto \
+    randrproto \
     recordproto \
+    renderproto \
+    resourceproto \
+    scrnsaverproto \
+    videoproto \
+    xproto \
+    xcmiscproto \
+    xextproto \
+    xf86bigfontproto \
+    xf86dgaproto \
+    xf86driproto \
+    xf86vidmodeproto \
+    xf86miscproto \
+    xineramaproto \
+    makedepend \
     xtrans \
     libXau \
     libXdmcp \
@@ -921,6 +910,7 @@
     libxkbfile \
     libXrandr \
     libXres \
+    libXScrnSaver \
     libXtst \
     libXv \
     libXxf86dga \
@@ -938,17 +928,14 @@
   echo ======================
 %ifarch i386 i686
   if [ "${module}" = "libdrm" ]; then
-    export CFLAGS=`echo $CFLAGS | sed -e 's/-march=i*86/-march=native/'`
+    extraoptions="${extraoptions} --disable-intel"
   fi
 %endif
   if [ "${module}" = "libXaw" ]; then
     extraoptions="${extraoptions} --disable-xaw8 --disable-xaw6"
   fi
-  #if [ "${module}" = "randrproto" ]; then
-  #  ./autogen.sh
-  #fi
   if [ "${module}" = "libX11" ]; then
-    extraoptions="${extraoptions} --without-xcb --disable-specs --disable-dependency-tracking"
+    extraoptions="${extraoptions} --without-xcb --disable-specs"
   fi
   if [ "${module}" = "libSM" ]; then
     extraoptions="${extraoptions} --without-libuuid"
@@ -962,13 +949,21 @@
   if [ "${module}" = "libXfont" ]; then
     extraoptions="${extraoptions} --with-freetype-config=%{xorg_buildroot}%{_bindir}/freetype-config"
   fi
-  ./configure --prefix=/usr --libdir=%{_libdir} ${extraoptions} --enable-static --disable-shared
+  if [ "${module}" = "libpthread-stubs" ]; then
+    LDFLAGS="" ./configure --prefix=/usr --libdir=%{_libdir} ${extraoptions} --enable-static --disable-shared --with-pic
+  elif [ "${module}" = "libX11" ]; then
+    XDMCP_FLAGS="-L%{xorg_buildroot}%{_libdir} -Wl,-B,static -lXdmcp -lXau" ./configure --prefix=/usr --libdir=%{_libdir} ${extraoptions} --enable-static --disable-shared --with-pic
+  elif [ "${module}" = "libXtst" ]; then
+    XTST_FLAGS="-L%{xorg_buildroot}%{_libdir} -Wl,-B,static -lXext" ./configure --prefix=/usr --libdir=%{_libdir} ${extraoptions} --enable-static --disable-shared --with-pic
+  else
+    ./configure --prefix=/usr --libdir=%{_libdir} ${extraoptions} --enable-static --disable-shared --with-pic
+  fi
   echo ======================
   echo building ${module}
   echo ======================
   make DESTDIR=%{xorg_buildroot} install
   find %{xorg_buildroot}%{_prefix} -type f -name "*.la" -exec sed -i -e "s|libdir='%{_libdir}'|libdir='%{xorg_buildroot}%{_libdir}'|" {} \;
-  find %{xorg_buildroot}%{_prefix} -type f -name "*.la" -exec sed -i -e "s|libdir=%{_libdir}|libdir=%{xorg_buildroot}%{_libdir}|" {} \;
+  find %{xorg_buildroot}%{_prefix} -type f -name "*.pc" -exec sed -i -e "s|libdir=%{_libdir}|libdir=%{xorg_buildroot}%{_libdir}|" {} \;
   find %{xorg_buildroot}%{_prefix} -type f -name "*.pc" -exec sed -i -e "s|prefix=/usr|prefix=%{xorg_buildroot}%{_prefix}|" {} \;
   popd
 done
@@ -982,8 +977,6 @@
 %else
 %define _mesa_flags --enable-pic
 %endif
-export CFLAGS="$RPM_OPT_FLAGS -fvisibility=hidden -Os"
-export CXXFLAGS="$RPM_OPT_FLAGS -fvisibility=hidden -Os -static-libgcc"
 
 # Need to set cfghost?
 ./configure \
@@ -1009,18 +1002,58 @@
 make DESTDIR=%{xorg_buildroot}
 make DESTDIR=%{xorg_buildroot} install
 find %{xorg_buildroot}%{_prefix} -type f -name "*.la" -exec sed -i -e "s|libdir='%{_libdir}'|libdir='%{xorg_buildroot}%{_libdir}'|" {} \;
-find %{xorg_buildroot}%{_prefix} -type f -name "*.la" -exec sed -i -e "s|libdir=%{_libdir}|libdir=%{xorg_buildroot}%{_libdir}|" {} \;
+find %{xorg_buildroot}%{_prefix} -type f -name "*.pc" -exec sed -i -e "s|libdir=%{_libdir}|libdir=%{xorg_buildroot}%{_libdir}|" {} \;
 find %{xorg_buildroot}%{_prefix} -type f -name "*.pc" -exec sed -i -e "s|prefix=/usr|prefix=%{xorg_buildroot}%{_prefix}|" {} \;
-#rm %{xorg_buildroot}%{_libdir}/dri/libdricore.so
 popd
 
 popd
-pushd xorg/xserver
-export CFLAGS="$RPM_OPT_FLAGS -fPIC -I%{xorg_buildroot}%{_includedir}"
-export CXXFLAGS="$RPM_OPT_FLAGS -fPIC -I%{xorg_buildroot}%{_includedir} -static-libgcc"
+
+echo "*** Building fontconfig ***"
+pushd fontconfig-*
+HASDOCBOOK=no ./configure --prefix=%{_prefix} --libdir=%{_libdir} --with-add-fonts=/usr/share/X11/fonts/Type1,/usr/share/X11/fonts/OTF --enable-static --disable-shared
+make %{?_smp_mflags}
+make DESTDIR=%{xorg_buildroot} install
+find %{xorg_buildroot}%{_prefix} -type f -name "*.la" -exec sed -i -e "s|libdir='%{_libdir}'|libdir='%{xorg_buildroot}%{_libdir}'|" {} \;
+find %{xorg_buildroot}%{_prefix} -type f -name "*.pc" -exec sed -i -e "s|libdir=%{_libdir}|libdir=%{xorg_buildroot}%{_libdir}|" {} \;
+find %{xorg_buildroot}%{_prefix} -type f -name "*.pc" -exec sed -i -e "s|prefix=/usr|prefix=%{xorg_buildroot}%{_prefix}|" {} \;
+popd
+
+echo "*** Building fltk ***"
+pushd fltk-*
+export CMAKE_PREFIX_PATH="%{xorg_buildroot}%{_prefix}:%{_prefix}"
+export CMAKE_EXE_LINKER_FLAGS="-static-libgcc -L%{xorg_buildroot}%{_libdir}"
+%{cmake28} -G"Unix Makefiles" \
+  -DCMAKE_INSTALL_PREFIX=%{xorg_buildroot}%{_prefix} \
+  -DX11_INC_SEARCH_PATH=%{xorg_buildroot}%{_includedir} \
+  -DX11_LIB_SEARCH_PATH=%{xorg_buildroot}%{_libdir} \
+  -DCMAKE_BUILD_TYPE=Release \
+  -DOPTION_USE_THREADS=off \
+  -DOPTION_BUILD_EXAMPLES=off \
+  -DOPTION_USE_SYSTEM_LIBPNG=on
+make %{?_smp_mflags}
+popd
+
+echo "*** Building VNC ***"
+export CFLAGS="$CFLAGS -fPIC"
+export CXXFLAGS=`echo $CXXFLAGS | sed -e 's/ -c //g'`
+%{cmake28} -G"Unix Makefiles" \
+  -DX11_INC_SEARCH_PATH=%{xorg_buildroot}%{_includedir} \
+  -DX11_LIB_SEARCH_PATH=%{xorg_buildroot}%{_libdir} \
+  -DFLTK_LIBRARY_DIR=%{tigervnc_src_dir}/fltk-1.3.2/lib \
+  -DFLTK_LIBRARIES="%{tigervnc_src_dir}/fltk-1.3.2/lib/libfltk.a;%{tigervnc_src_dir}/fltk-1.3.2/lib/libfltk_images.a;-lpng" \
+  -DFLTK_FLUID_EXECUTABLE=%{tigervnc_src_dir}/fltk-1.3.2/bin/fluid \
+  -DFLTK_INCLUDE_DIR=%{tigervnc_src_dir}/fltk-1.3.2 \
+  -DBUILD_STATIC=1 \
+  -DCMAKE_BUILD_TYPE=Release \
+  -DUSE_INCLUDED_ZLIB=0 \
+  -DCMAKE_INSTALL_PREFIX=%{_prefix}
+
+make %{?_smp_mflags}
+
+pushd unix/xserver
+export LD=$CXX
 export PIXMANINCDIR=%{xorg_buildroot}%{_includedir}/pixman-1
 autoreconf -fiv 
-
 ./configure --prefix=/usr --libdir=%{_libdir} --mandir=%{_datadir}/man \
 	--disable-xorg --disable-xnest --disable-xvfb --disable-dmx \
 	--disable-xwin --disable-xephyr --disable-kdrive --with-pic \
@@ -1076,15 +1109,24 @@
 
 # Build Java applet
 pushd java
-%{cmake28} .
-make
+%{cmake28} \
+%if 0%{!?_self_signed:1}
+	-DJAVA_KEYSTORE=%{_keystore} \
+	-DJAVA_KEYSTORE_TYPE=%{_keystore_type} \
+	-DJAVA_KEY_ALIAS=%{_key_alias} \
+	-DJAVA_STOREPASS=":env STOREPASS" \
+	-DJAVA_KEYPASS=":env KEYPASS" \
+	-DJAVA_TSA_URL=https://timestamp.geotrust.com/tsa .
+%endif
+
+JAVA_TOOL_OPTIONS="-Dfile.encoding=UTF8" make
 popd
 
 %install
 rm -rf $RPM_BUILD_ROOT
 make install DESTDIR=$RPM_BUILD_ROOT
 
-pushd xorg/xserver/hw/vnc
+pushd unix/xserver/hw/vnc
 make install DESTDIR=$RPM_BUILD_ROOT
 popd
 
@@ -1118,12 +1160,9 @@
 %find_lang %{name} %{name}.lang
 
 # remove unwanted files
-rm -f  $RPM_BUILD_ROOT%{_libdir}/xorg/modules/extensions/libvnc.la
-rm -f  $RPM_BUILD_ROOT%{_libdir}/dri/libdricore.so
-
-%ifarch s390 s390x %{?rhel:ppc ppc64}
-rm -f $RPM_BUILD_ROOT%{_libdir}/xorg/modules/extensions/libvnc.so
-%endif
+rm -f $RPM_BUILD_ROOT%{_libdir}/xorg/modules/extensions/libvnc.la
+rm -f $RPM_BUILD_ROOT%{_libdir}/xorg/modules/extensions/libvnc.a
+rm -f $RPM_BUILD_ROOT%{_libdir}/dri/libdricore.so
 
 # move files to correct location
 mkdir -p $RPM_BUILD_ROOT%{_libdir}/dri
@@ -1182,12 +1221,6 @@
 %{_mandir}/man1/vncconfig.1*
 %{_libdir}/dri/swrast_dri.so
 
-%ifnarch s390 s390x
-%files server-module
-%defattr(-,root,root,-)
-%{_libdir}/xorg/modules/extensions/libvnc.a
-%endif
-
 %files server-applet
 %defattr(-,root,root,-)
 %doc java/com/tigervnc/vncviewer/README
@@ -1202,6 +1235,9 @@
 %{_datadir}/icons/hicolor/*/apps/*
 
 %changelog
+* Wed Nov 19 2014 Brian P. Hinz <bphinz@users.sourceforge.net> 1.3.80-18.20141119git59c5a55c
+- Removed server module sub-package
+
 * Thu Nov 28 2013 Brian P. Hinz <bphinz@users.sourceforge.net> 1.3.80-17.20131128svn5139
 - Bumped version to 1.3.80
 - Cleaned up linter warnings
diff --git a/contrib/packages/rpm/el6/SPECS/tigervnc.spec b/contrib/packages/rpm/el6/SPECS/tigervnc.spec
index 11b39f6..da8ce73 100644
--- a/contrib/packages/rpm/el6/SPECS/tigervnc.spec
+++ b/contrib/packages/rpm/el6/SPECS/tigervnc.spec
@@ -1,8 +1,6 @@
-%define		snap 20131128svn5139
-
 Name: tigervnc
-Version: 1.3.80
-Release: 17%{?snap:.%{snap}}%{?dist}
+Version: @VERSION@
+Release: 18%{?snap:.%{snap}}%{?dist}
 Summary: A TigerVNC remote display system
 
 Group: User Interface/Desktops
@@ -153,7 +151,7 @@
 for all in `find . -type f -perm -001`; do
 	chmod -x "$all"
 done
-patch -p1 -b --suffix .vnc < ../xserver113.patch
+patch -p1 -b --suffix .vnc < ../xserver115.patch
 popd
 
 %patch16 -p0 -b .man
@@ -218,8 +216,17 @@
 
 # Build Java applet
 pushd java
-%{cmake28} .
-make
+%{cmake28} \
+%if 0%{!?self_signed:1}
+	-DJAVA_KEYSTORE=%{_keystore} \
+	-DJAVA_KEYSTORE_TYPE=%{_keystore_type} \
+	-DJAVA_KEY_ALIAS=%{_key_alias} \
+	-DJAVA_STOREPASS=":env STOREPASS" \
+	-DJAVA_KEYPASS=":env KEYPASS" \
+	-DJAVA_TSA_URL=https://timestamp.geotrust.com/tsa .
+%endif
+
+JAVA_TOOL_OPTIONS="-Dfile.encoding=UTF8" make
 popd
 
 %install
@@ -332,6 +339,9 @@
 %{_datadir}/icons/hicolor/*/apps/*
 
 %changelog
+* Tue Nov 04 2014 Brian P. Hinz <bphinz@users.sourceforge.net> 1.3.80-18.20131128svn5139
+- Bumped xserver patch to keep pace with native version
+
 * Thu Nov 28 2013 Brian P. Hinz <bphinz@users.sourceforge.net> 1.3.80-17.20131128svn5139
 - Bumped version to 1.3.80
 - Cleaned up linter warnings
diff --git a/contrib/packages/rpm/sle11/SPECS/tigervnc.spec b/contrib/packages/rpm/sle11/SPECS/tigervnc.spec
index ddf9310..f98e8fb 100644
--- a/contrib/packages/rpm/sle11/SPECS/tigervnc.spec
+++ b/contrib/packages/rpm/sle11/SPECS/tigervnc.spec
@@ -14,12 +14,11 @@
 
 # Please submit bugfixes or comments via http://bugs.opensuse.org/
 #
-%define         snap 20131202svn5145
 %define         debug_package %{nil}
 
 
 Name:           tigervnc
-Version:        1.3.80
+Version:        @VERSION@
 Release:        1%{?snap:.%{snap}}%{?dist}
 Packager:       Brian P. Hinz <bphinz@users.sourceforge.net>
 License:        GPL-2.0 and MIT
@@ -70,9 +69,6 @@
 
 
 # Tiger vnc patches
-Patch3:         u_tigervnc-1.3.0-fix-use-after-free.patch
-#Patch4:         tigervnc-newfbsize.patch
-#Patch5:         tigervnc-clean-pressed-key-on-exit.patch
 
 # Xserver patches
 Patch1:         fpic.diff
@@ -155,10 +151,6 @@
 tar xjf %SOURCE2
 cp -r ./xorg-server-*/* unix/xserver/
 
-%patch3 -p1
-#%patch4 -p1
-#%patch5 -p1
-
 pushd unix/xserver
 for all in `find . -type f -perm -001`; do
   chmod -x "$all"
@@ -323,8 +315,17 @@
 
 # Build java client
 pushd java
-cmake -DCMAKE_INSTALL_PREFIX:PATH=%{_prefix}
-make %{?_smp_mflags}
+cmake -DCMAKE_INSTALL_PREFIX:PATH=%{_prefix} \
+%if 0%{!?_self_signed:1}
+  -DJAVA_KEYSTORE=%{_keystore} \
+  -DJAVA_KEYSTORE_TYPE=%{_keystore_type} \
+  -DJAVA_KEY_ALIAS=%{_key_alias} \
+  -DJAVA_STOREPASS=":env STOREPASS" \
+  -DJAVA_KEYPASS=":env KEYPASS" \
+  -DJAVA_TSA_URL=https://timestamp.geotrust.com/tsa
+%endif
+
+JAVA_TOOL_OPTIONS="-Dfile.encoding=UTF8" make %{?_smp_mflags}
 popd
 
 %install
diff --git a/java/CMakeLists.txt b/java/CMakeLists.txt
index c98c69c..bf1cffb 100644
--- a/java/CMakeLists.txt
+++ b/java/CMakeLists.txt
@@ -2,7 +2,7 @@
 
 project(tigervnc-java Java)
 if(NOT VERSION)
-  set(VERSION 1.3.80)
+  set(VERSION 1.4.80)
 endif()
 
 find_package(Java)
diff --git a/java/com/tigervnc/network/SSLEngineManager.java b/java/com/tigervnc/network/SSLEngineManager.java
index cb1f7c4..c011099 100644
--- a/java/com/tigervnc/network/SSLEngineManager.java
+++ b/java/com/tigervnc/network/SSLEngineManager.java
@@ -41,14 +41,14 @@
   private ByteBuffer peerNetData;
 
   private Executor executor;
-  private FdInStream inStream;
-  private FdOutStream outStream;
+  private FdInStream in;
+  private FdOutStream os;
 
-  public SSLEngineManager(SSLEngine sslEngine, FdInStream is,
-                          FdOutStream os) throws IOException {
+  public SSLEngineManager(SSLEngine sslEngine, FdInStream is_,
+                          FdOutStream os_) throws IOException {
 
-    inStream = is;
-    outStream = os;
+    in = is_;
+    os = os_;
     engine = sslEngine;
 
     executor = Executors.newSingleThreadExecutor();
@@ -56,7 +56,8 @@
     pktBufSize = engine.getSession().getPacketBufferSize();
     appBufSize = engine.getSession().getApplicationBufferSize();
 
-    myAppData = ByteBuffer.allocate(appBufSize);
+    myAppData =
+      ByteBuffer.allocate(Math.max(appBufSize, os.getBufSize()));
     myNetData = ByteBuffer.allocate(pktBufSize);
     peerAppData = ByteBuffer.allocate(appBufSize);
     peerNetData = ByteBuffer.allocate(pktBufSize);
@@ -80,13 +81,14 @@
         SSLEngineResult res = engine.unwrap(peerNetData, peerAppData);
         peerNetData.compact();
         hs = res.getHandshakeStatus();
+        // Check status
         switch (res.getStatus()) {
           case BUFFER_UNDERFLOW:
-            int len = Math.min(peerNetData.remaining(), inStream.getBufSize());
-            int m = inStream.check(1, len, false);
-            byte[] buf = new byte[m];
-            inStream.readBytes(buf, 0, m);
-            peerNetData.put(buf, 0, m);
+            int max = Math.min(peerNetData.remaining(), in.getBufSize());
+            int m = in.check(1, max, true);
+            int pos = peerNetData.position();
+            in.readBytes(peerNetData.array(), pos, m);
+            peerNetData.position(pos+m);
             peerNetData.flip();
             peerNetData.compact();
             break;
@@ -102,7 +104,7 @@
         }
         break;
     
-      case NEED_WRAP :
+      case NEED_WRAP:
         // Empty the local network packet buffer.
         myNetData.clear();
     
@@ -112,20 +114,17 @@
     
         // Check status
         switch (res.getStatus()) {
-          case OK :
+          case OK:
             myAppData.compact();
             myNetData.flip();
-            int n = myNetData.remaining();
-            byte[] b = new byte[n];
-            myNetData.get(b);
+            os.writeBytes(myNetData.array(), 0, myNetData.remaining());
+            os.flush();
             myNetData.clear();
-            outStream.writeBytes(b, 0, n);
-            outStream.flush();
             break;
     
           case BUFFER_OVERFLOW:
             // FIXME: How much larger should the buffer be?
-            // fallthrough
+            break;
     
           case CLOSED:
             engine.closeOutbound();
@@ -133,7 +132,8 @@
     
         }
         break;
-      case NEED_TASK :
+
+      case NEED_TASK:
         // Handle blocking tasks
         executeTasks();
         break;
@@ -151,29 +151,28 @@
 
   public int read(byte[] data, int dataPtr, int length) throws IOException {
     // Read SSL/TLS encoded data from peer
-    int len = Math.min(pktBufSize,inStream.getBufSize());
-    int bytesRead = inStream.check(1,len,false);
-    byte[] buf = new byte[bytesRead];
-    inStream.readBytes(buf, 0, bytesRead);
-    if (peerNetData.remaining() < bytesRead) {
-      peerNetData.flip();
-      ByteBuffer b = ByteBuffer.allocate(peerNetData.remaining() + bytesRead);
-      b.put(peerNetData);
-      peerNetData = b;
-    }
-    peerNetData.put(buf);
+    int bytesRead = 0;
     peerNetData.flip();
     SSLEngineResult res = engine.unwrap(peerNetData, peerAppData);
     peerNetData.compact();
     switch (res.getStatus()) {
       case OK :
+        bytesRead = Math.min(length, res.bytesProduced());
         peerAppData.flip();
-        peerAppData.get(data, dataPtr, res.bytesProduced());
+        peerAppData.get(data, dataPtr, bytesRead);
         peerAppData.compact();
         break;
 
       case BUFFER_UNDERFLOW:
-        // normal (need more net data)
+        // need more net data
+        int pos = peerNetData.position();
+        // attempt to drain the underlying buffer first
+        int need = peerNetData.remaining();
+        int avail = in.check(1, in.getBufSize(), false);
+        if (avail < need)
+          avail = in.check(1, Math.min(need, in.getBufSize()), true);
+        in.readBytes(peerNetData.array(), pos, Math.min(need, avail));
+        peerNetData.position(pos+Math.min(need, avail));
         break;
 
       case CLOSED:
@@ -181,24 +180,28 @@
         break;
 
     }
-    return res.bytesProduced();
+    return bytesRead;
   }
 
   public int write(byte[] data, int dataPtr, int length) throws IOException {
     int n = 0;
-    // FIXME: resize myAppData if necessary
     myAppData.put(data, dataPtr, length);
     myAppData.flip();
     while (myAppData.hasRemaining()) {
       SSLEngineResult res = engine.wrap(myAppData, myNetData);
       n += res.bytesConsumed();
       switch (res.getStatus()) {
-        case BUFFER_OVERFLOW:
-          ByteBuffer b = ByteBuffer.allocate(myNetData.capacity() + myAppData.remaining());
-          myNetData.flip();
-          b.put(myNetData);
-          myNetData = b;
+        case OK:
           break;
+
+        case BUFFER_OVERFLOW:
+          // Make room in the buffer by flushing the outstream
+          myNetData.flip();
+          os.writeBytes(myNetData.array(), 0, myNetData.remaining());
+          os.flush();
+          myNetData.clear();
+          break;
+
         case CLOSED:
           engine.closeOutbound();
           break;
@@ -206,12 +209,9 @@
     }
     myAppData.clear();
     myNetData.flip();
-    int len = myNetData.remaining();
-    byte[] buf = new byte[len];
-    myNetData.get(buf);
+    os.writeBytes(myNetData.array(), 0, myNetData.remaining());
+    os.flush();
     myNetData.clear();
-    outStream.writeBytes(buf, 0, len);
-    outStream.flush();
     return n;
   }
 
diff --git a/java/com/tigervnc/network/Socket.java b/java/com/tigervnc/network/Socket.java
index bcc920d..651dc05 100644
--- a/java/com/tigervnc/network/Socket.java
+++ b/java/com/tigervnc/network/Socket.java
@@ -58,7 +58,6 @@
   // Is the remote end on the same machine?
   abstract public boolean sameMachine();
 
-  // Was there a "?" in the ConnectionFilter used to accept this Socket?
   public void setRequiresQuery() {queryConnection = true;}
   public final boolean requiresQuery() {return queryConnection;}
 
@@ -78,29 +77,3 @@
   boolean isShutdown_;
   boolean queryConnection;
 }
-
-/*
-abstract class ConnectionFilter {
-  public abstract boolean verifyConnection(Socket s);
-};
-
-abstract class SocketListener {
-  public SocketListener() {
-    fd = null; filter = null;
-  }
-
-  // shutdown() stops the socket from accepting further connections
-  public abstract void shutdown();
-
-  // accept() returns a new Socket object if there is a connection
-  // attempt in progress AND if the connection passes the filter
-  // if one is installed.  Otherwise, returns 0.
-  public abstract Socket accept();
-
-  // setFilter() applies the specified filter to all new connections
-  public void setFilter(ConnectionFilter f) {filter = f;}
-  //public SocketDescriptor getFd() {return fd;}
-  protected FileDescriptor fd;
-  protected ConnectionFilter filter;
-};
-*/
diff --git a/java/com/tigervnc/network/SocketListener.java b/java/com/tigervnc/network/SocketListener.java
index a1b2c12..a1f5ea1 100644
--- a/java/com/tigervnc/network/SocketListener.java
+++ b/java/com/tigervnc/network/SocketListener.java
@@ -29,18 +29,15 @@
   public SocketListener() {}
 
   // shutdown() stops the socket from accepting further connections
-  abstract public void shutdown();
+  abstract public void shutdown() throws Exception;
 
   // accept() returns a new Socket object if there is a connection
   // attempt in progress AND if the connection passes the filter
   // if one is installed.  Otherwise, returns 0.
   abstract public Socket accept();
 
-  // setFilter() applies the specified filter to all new connections
-  //public void setFilter(ConnectionFilter* f) {filter = f;}
   public FileDescriptor getFd() {return fd;}
 
   protected FileDescriptor fd;
-  //protected ConnectionFilter* filter;
 
 }
diff --git a/java/com/tigervnc/network/TcpListener.java b/java/com/tigervnc/network/TcpListener.java
index bab9e4c..45ee8a4 100644
--- a/java/com/tigervnc/network/TcpListener.java
+++ b/java/com/tigervnc/network/TcpListener.java
@@ -84,12 +84,21 @@
     this(listenaddr, port, false, null, true);
   }
 
-//  TcpListener::~TcpListener() {
-//    if (closeFd) closesocket(fd);
-//  }
+  protected void finalize() throws Exception {
+    if (closeFd)
+      try {
+        ((SocketDescriptor)getFd()).close();
+      } catch (IOException e) {
+        throw new Exception(e.getMessage());
+      }
+  }
 
-  public void shutdown() {
-    //shutdown(getFd(), 2);
+  public void shutdown() throws Exception {
+    try {
+      ((SocketDescriptor)getFd()).shutdown();
+    } catch (IOException e) {
+      throw new Exception(e.getMessage());
+    }
   }
 
   public TcpSocket accept() {
@@ -132,32 +141,12 @@
     }
     fd.setChannel(new_sock);
     TcpSocket s = new TcpSocket(fd);
-    //if (filter && !filter->verifyConnection(s)) {
-    //  delete s;
-    //  return 0;
-    //}
     return s;
   }
 
-/*
-void TcpListener::getMyAddresses(std::list<char*>* result) {
-  const hostent* addrs = gethostbyname(0);
-  if (addrs == 0)
-    throw rdr::SystemException("gethostbyname", errorNumber);
-  if (addrs->h_addrtype != AF_INET)
-    throw rdr::Exception("getMyAddresses: bad family");
-  for (int i=0; addrs->h_addr_list[i] != 0; i++) {
-    const char* addrC = inet_ntoa(*((struct in_addr*)addrs->h_addr_list[i]));
-    char* addr = new char[strlen(addrC)+1];
-    strcpy(addr, addrC);
-    result->push_back(addr);
+  public int getMyPort() {
+    return ((SocketDescriptor)getFd()).socket().getLocalPort();
   }
-}
-  */
-
-  //public int getMyPort() {
-  //  return TcpSocket.getSockPort();
-  //}
 
   private boolean closeFd;
   private ServerSocketChannel channel;
diff --git a/java/com/tigervnc/network/TcpSocket.java b/java/com/tigervnc/network/TcpSocket.java
index 051a9d8..43787e4 100644
--- a/java/com/tigervnc/network/TcpSocket.java
+++ b/java/com/tigervnc/network/TcpSocket.java
@@ -113,8 +113,7 @@
   }
 
   public int getMyPort() {
-    SocketAddress address = ((SocketDescriptor)getFd()).socket().getLocalSocketAddress();
-    return ((InetSocketAddress)address).getPort();
+    return getSockPort();
   }
 
   public String getPeerAddress() {
@@ -184,7 +183,7 @@
   }
 
   public int getSockPort() {
-    return ((InetSocketAddress)((SocketDescriptor)getFd()).socket().getRemoteSocketAddress()).getPort();
+    return ((SocketDescriptor)getFd()).socket().getLocalPort();
   }
 
   /* Tunnelling support. */
diff --git a/java/com/tigervnc/vncviewer/ClipboardDialog.java b/java/com/tigervnc/vncviewer/ClipboardDialog.java
index d4cde6e..e7aa7e9 100644
--- a/java/com/tigervnc/vncviewer/ClipboardDialog.java
+++ b/java/com/tigervnc/vncviewer/ClipboardDialog.java
@@ -1,5 +1,5 @@
 /* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
- * Copyright (C) 2011 Brian P. Hinz
+ * Copyright (C) 2011-2014 Brian P. Hinz
  *
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -21,27 +21,91 @@
 
 import java.awt.*;
 import java.awt.event.*;
-import java.awt.datatransfer.Clipboard;
-import java.awt.datatransfer.StringSelection;
+import java.awt.datatransfer.*;
+import java.io.*;
+import java.nio.*;
 import javax.swing.*;
 import javax.swing.border.*;
+import javax.swing.text.*;
+
 import com.tigervnc.rfb.LogWriter;
 
 class ClipboardDialog extends Dialog implements ActionListener {
 
+  private class VncTransferHandler extends TransferHandler {
+    // Custom TransferHandler designed to limit the size of outbound
+    // clipboard transfers to VncViewer.maxCutText.getValue() bytes.
+    private LogWriter vlog = new LogWriter("VncTransferHandler");
+
+    public void exportToClipboard(JComponent c, Clipboard clip, int a)
+        throws IllegalStateException {
+      if (!(c instanceof JTextComponent)) return;
+      StringSelection selection =
+        new StringSelection(((JTextComponent)c).getText());
+      clip.setContents(selection, null);
+    }
+
+    public boolean importData(JComponent c, Transferable t) {
+      if (canImport(c, t.getTransferDataFlavors())) {
+        try {
+          DataFlavor VncFlavor = null;
+          for (DataFlavor f : t.getTransferDataFlavors())
+            if (f.isFlavorTextType() && f.isRepresentationClassInputStream())
+              VncFlavor = f;
+          if (VncFlavor == null) return false;
+          Reader reader = (Reader)VncFlavor.getReaderForText(t);
+          CharBuffer cbuf =
+            CharBuffer.allocate(VncViewer.maxCutText.getValue());
+          cbuf.limit(reader.read(cbuf.array(), 0, cbuf.length()));
+          reader.close();
+          if (c instanceof JTextComponent)
+            ((JTextComponent)c).setText(cbuf.toString());
+          return true;
+        } catch (OutOfMemoryError oome) {
+          vlog.error("ERROR: Too much data on local clipboard!");
+        } catch (UnsupportedFlavorException ufe) {
+          // Skip import
+          vlog.info(ufe.toString());
+        } catch (IOException ioe) {
+          // Skip import
+          vlog.info(ioe.toString());
+        }
+      }
+      return false;
+    }
+
+    public boolean canImport(JComponent c, DataFlavor[] flavors) {
+      for (DataFlavor f : flavors)
+        if (f.isFlavorTextType() && f.isRepresentationClassReader())
+          return true;
+      return false;
+    }
+  }
+
   public ClipboardDialog(CConn cc_) {
     super(false);
+    setTitle("VNC Clipboard Viewer");
+    setPreferredSize(new Dimension(640, 480));
+    addWindowFocusListener(new WindowAdapter() {
+      // Necessary to ensure that updates from the system clipboard
+      // still occur when the ClipboardDialog has the focus.
+      public void WindowGainedFocus(WindowEvent e) {
+        clientCutText();
+      }
+    });
     cc = cc_;
-    setTitle("VNC clipboard");
-    JPanel pt = new JPanel();
-    textArea = new JTextArea(5,50);
-    textArea.setBorder(BorderFactory.createLineBorder(Color.gray));
-    textArea.setLineWrap(true);
+    textArea = new JTextArea();
+    textArea.setTransferHandler(new VncTransferHandler());
+    // If the textArea can receive the focus, then text within the textArea
+    // can be selected.  On platforms that don't support separate selection
+    // and clipboard buffers, this triggers a replacement of the textAra's
+    // contents with the selected text.
+    textArea.setFocusable(false);
+    textArea.setLineWrap(false);
     textArea.setWrapStyleWord(true);
     JScrollPane sp = new JScrollPane(textArea);
-    pt.add(sp, BorderLayout.CENTER);
-    getContentPane().add("North", pt);
-
+    getContentPane().add(sp, BorderLayout.CENTER);
+    // button panel placed below the scrollpane
     JPanel pb = new JPanel();
     clearButton = new JButton("Clear");
     pb.add(clearButton);
@@ -53,40 +117,22 @@
     pb.add(cancelButton);
     cancelButton.addActionListener(this);
     getContentPane().add("South", pb);
-
     pack();
   }
 
-  public boolean compareContentsTo(String str) {
-    return str.equals(textArea.getText());
-
-  }
-
-  public void setContents(String str) {
-    textArea.setText(str);
-  }
-
-  public String getContents() {
-    return textArea.getText();
-  }
-
   public void serverCutText(String str, int len) {
-    setContents(str);
-    SecurityManager sm = System.getSecurityManager();
-    try {
-      if (sm != null) sm.checkSystemClipboardAccess();
-      Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
-      if (cb != null) {
-        StringSelection ss = new StringSelection(str);
-        try {
-          cb.setContents(ss, null);
-        } catch(Exception e) {
-          vlog.debug(e.getMessage());
-        }
-      }
-    } catch(SecurityException e) {
-      vlog.debug("Cannot access the system clipboard: "+e.getMessage());
-    }
+    textArea.setText(str);
+    textArea.copy();
+  }
+
+  public void clientCutText() {
+    int hc = textArea.getText().hashCode();
+    textArea.paste();
+    textArea.setCaretPosition(0);
+    String text = textArea.getText();
+    if (cc.viewer.sendClipboard.getValue())
+      if (hc != text.hashCode())
+        cc.writeClientCutText(text, text.length());
   }
 
   public void setSendingEnabled(boolean b) {
@@ -98,7 +144,8 @@
     if (s instanceof JButton && (JButton)s == clearButton) {
       serverCutText(new String(""), 0);
     } else if (s instanceof JButton && (JButton)s == sendButton) {
-      cc.writeClientCutText(textArea.getText(), textArea.getText().length());
+      String text = textArea.getText();
+      cc.writeClientCutText(text, text.length());
       endDialog();
     } else if (s instanceof JButton && (JButton)s == cancelButton) {
       endDialog();
diff --git a/java/com/tigervnc/vncviewer/DesktopWindow.java b/java/com/tigervnc/vncviewer/DesktopWindow.java
index e78ee27..10d158c 100644
--- a/java/com/tigervnc/vncviewer/DesktopWindow.java
+++ b/java/com/tigervnc/vncviewer/DesktopWindow.java
@@ -85,7 +85,7 @@
     addKeyListener(this);
     addFocusListener(new FocusAdapter() {
       public void focusGained(FocusEvent e) {
-        checkClipboard();
+        cc.clipboardDialog.clientCutText();
       }
       public void focusLost(FocusEvent e) {
         cc.releaseDownKeys();
@@ -359,36 +359,6 @@
     g2.dispose();
   }
 
-  public synchronized void checkClipboard() {
-    SecurityManager sm = System.getSecurityManager();
-    try {
-      if (sm != null) sm.checkSystemClipboardAccess();
-      Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
-      if (cb != null) {
-        Transferable t = cb.getContents(null);
-        if (t == null) return;
-        DataFlavor flavor = 
-          DataFlavor.selectBestTextFlavor(t.getTransferDataFlavors());
-        if (flavor == null) return;
-        BufferedReader br = new BufferedReader(flavor.getReaderForText(t));
-        CharBuffer cbuf =
-          CharBuffer.allocate(VncViewer.maxCutText.getValue());
-        br.read(cbuf);
-        cbuf.flip();
-        String newContents = cbuf.toString();
-        if (!cc.clipboardDialog.compareContentsTo(newContents)) {
-          cc.clipboardDialog.setContents(newContents);
-          if (cc.viewer.sendClipboard.getValue())
-            cc.writeClientCutText(newContents, newContents.length());
-        }
-        br.close();
-        System.gc();
-      }
-    } catch(java.lang.Exception e) {
-      vlog.debug("Exception getting clipboard data: " + e.getMessage());
-    }
-  }
-
   // Mouse-Motion callback function
   private void mouseMotionCB(MouseEvent e) {
     if (!cc.viewer.viewOnly.getValue() &&
diff --git a/java/com/tigervnc/vncviewer/VncViewer.java b/java/com/tigervnc/vncviewer/VncViewer.java
index 0df39c8..1e0f223 100644
--- a/java/com/tigervnc/vncviewer/VncViewer.java
+++ b/java/com/tigervnc/vncviewer/VncViewer.java
@@ -457,7 +457,7 @@
       while (true) {
         Socket new_sock = listener.accept();
         if (new_sock != null)
-          newViewer(this, new_sock);
+          newViewer(this, new_sock, true);
       }
     }
 
diff --git a/po/tigervnc.pot b/po/tigervnc.pot
index 5df3639..5a91804 100644
--- a/po/tigervnc.pot
+++ b/po/tigervnc.pot
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: tigervnc-devel@googlegroups.com\n"
-"POT-Creation-Date: 2014-09-22 11:15+0000\n"
+"POT-Creation-Date: 2014-11-19 12:46+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -30,7 +30,7 @@
 msgid "About TigerVNC Viewer"
 msgstr ""
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1086
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1097
 msgid "About TigerVNC viewer..."
 msgstr ""
 
@@ -50,7 +50,7 @@
 msgid "Allow JPEG compression:"
 msgstr ""
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1070
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1081
 msgid "Alt"
 msgstr ""
 
@@ -71,7 +71,7 @@
 msgid "Bad Name/Value pair on line: %d in file: %s"
 msgstr ""
 
-#: /home/ossman/devel/tigervnc/vncviewer/Win32PixelBuffer.cxx:92
+#: /home/ossman/devel/tigervnc/vncviewer/Win32PixelBuffer.cxx:91
 msgid "BitBlt failed"
 msgstr ""
 
@@ -101,7 +101,7 @@
 msgid "Connect"
 msgstr ""
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1085
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1096
 msgid "Connection info..."
 msgstr ""
 
@@ -144,6 +144,18 @@
 msgid "Could not create VNC home directory: can't obtain home directory path."
 msgstr ""
 
+#: /home/ossman/devel/tigervnc/vncviewer/OSXPixelBuffer.cxx:58
+msgid "Could not create framebuffer bitmap"
+msgstr ""
+
+#: /home/ossman/devel/tigervnc/vncviewer/OSXPixelBuffer.cxx:52
+msgid "Could not create framebuffer device"
+msgstr ""
+
+#: /home/ossman/devel/tigervnc/vncviewer/X11PixelBuffer.cxx:107
+msgid "Could not create framebuffer image"
+msgstr ""
+
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:310
 #, c-format
 msgid "Could not encode the parameter-value %s when writing to the Registry."
@@ -156,11 +168,15 @@
 "small."
 msgstr ""
 
-#: /home/ossman/devel/tigervnc/vncviewer/Win32PixelBuffer.cxx:80
+#: /home/ossman/devel/tigervnc/vncviewer/X11PixelBuffer.cxx:68
+msgid "Couldn't find suitable pixmap format"
+msgstr ""
+
+#: /home/ossman/devel/tigervnc/vncviewer/Win32PixelBuffer.cxx:79
 msgid "CreateCompatibleDC failed"
 msgstr ""
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1068
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1079
 msgid "Ctrl"
 msgstr ""
 
@@ -179,10 +195,14 @@
 msgid "Desktop name: %.80s"
 msgstr ""
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1088
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1099
 msgid "Dismiss menu"
 msgstr ""
 
+#: /home/ossman/devel/tigervnc/vncviewer/X11PixelBuffer.cxx:59
+msgid "Display lacks pixmap format for default depth"
+msgstr ""
+
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:778
 msgid "Enable full-screen mode over all monitors"
 msgstr ""
@@ -252,24 +272,7 @@
 msgid "Error(%d) writing %s(REG_SZ) to Registry."
 msgstr ""
 
-#: /home/ossman/devel/tigervnc/vncviewer/OSXPixelBuffer.cxx:50
-#: /home/ossman/devel/tigervnc/vncviewer/FLTKPixelBuffer.cxx:33
-msgid "Error: Not enough memory for framebuffer"
-msgstr ""
-
-#: /home/ossman/devel/tigervnc/vncviewer/X11PixelBuffer.cxx:69
-msgid "Error: couldn't find suitable pixmap format"
-msgstr ""
-
-#: /home/ossman/devel/tigervnc/vncviewer/X11PixelBuffer.cxx:60
-msgid "Error: display lacks pixmap format for default depth"
-msgstr ""
-
-#: /home/ossman/devel/tigervnc/vncviewer/X11PixelBuffer.cxx:78
-msgid "Error: only true colour displays supported"
-msgstr ""
-
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1056
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1067
 msgid "Exit viewer"
 msgstr ""
 
@@ -310,7 +313,7 @@
 msgid "Full (all available colors)"
 msgstr ""
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1059
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1070
 msgid "Full screen"
 msgstr ""
 
@@ -352,7 +355,7 @@
 msgid "Invalid parameter name on line: %d in file: %s"
 msgstr ""
 
-#: /home/ossman/devel/tigervnc/vncviewer/DesktopWindow.cxx:797
+#: /home/ossman/devel/tigervnc/vncviewer/DesktopWindow.cxx:805
 msgid "Invalid screen layout computed for resize request!"
 msgstr ""
 
@@ -399,7 +402,7 @@
 msgid "Misc."
 msgstr ""
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1026
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1037
 #, c-format
 msgid "Multiple characters given for key code %d (0x%04x): '%s'"
 msgstr ""
@@ -408,32 +411,32 @@
 msgid "No"
 msgstr ""
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:688
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:691
 #, c-format
 msgid "No scan code for extended virtual key 0x%02x"
 msgstr ""
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:690
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:693
 #, c-format
 msgid "No scan code for virtual key 0x%02x"
 msgstr ""
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:701
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:710
 #, c-format
 msgid "No symbol for extended virtual key 0x%02x"
 msgstr ""
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:765
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:776
 #, c-format
 msgid "No symbol for key code %d (in the current state)"
 msgstr ""
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:739
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:750
 #, c-format
 msgid "No symbol for key code 0x%02x (in the current state)"
 msgstr ""
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:703
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:712
 #, c-format
 msgid "No symbol for virtual key 0x%02x"
 msgstr ""
@@ -444,16 +447,26 @@
 msgid "None"
 msgstr ""
 
+#: /home/ossman/devel/tigervnc/vncviewer/OSXPixelBuffer.cxx:48
+#: /home/ossman/devel/tigervnc/vncviewer/FLTKPixelBuffer.cxx:33
+#: /home/ossman/devel/tigervnc/vncviewer/X11PixelBuffer.cxx:111
+msgid "Not enough memory for framebuffer"
+msgstr ""
+
 #: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:220
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:88
 msgid "OK"
 msgstr ""
 
+#: /home/ossman/devel/tigervnc/vncviewer/X11PixelBuffer.cxx:77
+msgid "Only true colour displays supported"
+msgstr ""
+
 #: /home/ossman/devel/tigervnc/vncviewer/UserDialog.cxx:74
 msgid "Opening password file failed"
 msgstr ""
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1084
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1095
 #: /home/ossman/devel/tigervnc/vncviewer/ServerDialog.cxx:64
 msgid "Options..."
 msgstr ""
@@ -498,7 +511,7 @@
 msgid "Quit"
 msgstr ""
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1082
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1093
 msgid "Refresh screen"
 msgstr ""
 
@@ -515,7 +528,7 @@
 msgid "Resize remote session to the local window"
 msgstr ""
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1062
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1073
 msgid "Resize window to session"
 msgstr ""
 
@@ -536,16 +549,16 @@
 msgid "Security method: %s"
 msgstr ""
 
-#: /home/ossman/devel/tigervnc/vncviewer/Win32PixelBuffer.cxx:83
+#: /home/ossman/devel/tigervnc/vncviewer/Win32PixelBuffer.cxx:82
 msgid "SelectObject failed"
 msgstr ""
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1075
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1086
 #, c-format
 msgid "Send %s"
 msgstr ""
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1080
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1091
 msgid "Send Ctrl-Alt-Del"
 msgstr ""
 
@@ -632,12 +645,17 @@
 "See http://www.tigervnc.org for information on TigerVNC."
 msgstr ""
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1004
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:456
+#, c-format
+msgid "Unable to create platform specific framebuffer: %s"
+msgstr ""
+
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1015
 #, c-format
 msgid "Unknown FLTK key code %d (0x%04x)"
 msgstr ""
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:878
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:889
 #, c-format
 msgid "Unknown decimal separator: '%s'"
 msgstr ""
@@ -671,7 +689,7 @@
 msgid "Using %s encoding"
 msgstr ""
 
-#: /home/ossman/devel/tigervnc/vncviewer/X11PixelBuffer.cxx:80
+#: /home/ossman/devel/tigervnc/vncviewer/X11PixelBuffer.cxx:79
 #, c-format
 msgid "Using default colormap and visual, %sdepth %d."
 msgstr ""
@@ -681,6 +699,10 @@
 msgid "Using pixel format %s"
 msgstr ""
 
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:457
+msgid "Using platform independent framebuffer"
+msgstr ""
+
 #: /home/ossman/devel/tigervnc/vncviewer/ServerDialog.cxx:42
 msgid "VNC Viewer: Connection Details"
 msgstr ""
@@ -694,7 +716,7 @@
 msgid "VNC authentication"
 msgstr ""
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1176
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1187
 msgid "VNC connection info"
 msgstr ""
 
@@ -736,6 +758,6 @@
 msgid "quality (0=poor, 9=best)"
 msgstr ""
 
-#: /home/ossman/devel/tigervnc/vncviewer/Win32PixelBuffer.cxx:63
+#: /home/ossman/devel/tigervnc/vncviewer/Win32PixelBuffer.cxx:62
 msgid "unable to create DIB section"
 msgstr ""
diff --git a/unix/xserver/hw/vnc/xvnc.cc b/unix/xserver/hw/vnc/xvnc.cc
index 2ef888d..0fd7b0c 100644
--- a/unix/xserver/hw/vnc/xvnc.cc
+++ b/unix/xserver/hw/vnc/xvnc.cc
@@ -98,7 +98,7 @@
 #define Xfree free
 #endif
 
-#define XVNCVERSION "TigerVNC 1.3.80"
+#define XVNCVERSION "TigerVNC 1.4.80"
 #define XVNCCOPYRIGHT ("Copyright (C) 1999-2013 TigerVNC Team and many others (see README.txt)\n" \
                        "See http://www.tigervnc.org for information on TigerVNC.\n")
 
diff --git a/vncviewer/DesktopWindow.cxx b/vncviewer/DesktopWindow.cxx
index 3579618..423d2df 100644
--- a/vncviewer/DesktopWindow.cxx
+++ b/vncviewer/DesktopWindow.cxx
@@ -658,12 +658,20 @@
 
 void DesktopWindow::handleDesktopSize()
 {
-  int width, height;
+  if (desktopSize.hasBeenSet()) {
+    int width, height;
 
-  if (sscanf(desktopSize.getValueStr(), "%dx%d", &width, &height) != 2)
-    return;
+    // An explicit size has been requested
 
-  remoteResize(width, height);
+    if (sscanf(desktopSize.getValueStr(), "%dx%d", &width, &height) != 2)
+      return;
+
+    remoteResize(width, height);
+  } else if (::remoteResize) {
+    // No explicit size, but remote resizing is on so make sure it
+    // matches whatever size the window ended up being
+    remoteResize(w(), h());
+  }
 }
 
 
diff --git a/vncviewer/FLTKPixelBuffer.cxx b/vncviewer/FLTKPixelBuffer.cxx
index 1eafe10..ab116d1 100644
--- a/vncviewer/FLTKPixelBuffer.cxx
+++ b/vncviewer/FLTKPixelBuffer.cxx
@@ -30,7 +30,7 @@
 {
   data = new rdr::U8[width * height * format.bpp/8];
   if (data == NULL)
-    throw rfb::Exception(_("Error: Not enough memory for framebuffer"));
+    throw rfb::Exception(_("Not enough memory for framebuffer"));
 }
 
 FLTKPixelBuffer::~FLTKPixelBuffer()