Merge pull request #88 from bphinz/buildfixes

Fixes for rpm-based distro builds
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/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/SConnection.cxx b/common/rfb/SConnection.cxx
index eeaeafe..99a4850 100644
--- a/common/rfb/SConnection.cxx
+++ b/common/rfb/SConnection.cxx
@@ -28,6 +28,7 @@
 #include <rfb/ServerCore.h>
 #include <rfb/encodings.h>
 #include <rfb/EncodeManager.h>
+#include <rfb/SSecurity.h>
 
 #include <rfb/LogWriter.h>
 
@@ -36,13 +37,15 @@
 static LogWriter vlog("SConnection");
 
 // AccessRights values
-const SConnection::AccessRights SConnection::AccessView       = 0x0001;
-const SConnection::AccessRights SConnection::AccessKeyEvents  = 0x0002;
-const SConnection::AccessRights SConnection::AccessPtrEvents  = 0x0004;
-const SConnection::AccessRights SConnection::AccessCutText    = 0x0008;
-const SConnection::AccessRights SConnection::AccessDefault    = 0x03ff;
-const SConnection::AccessRights SConnection::AccessNoQuery    = 0x0400;
-const SConnection::AccessRights SConnection::AccessFull       = 0xffff;
+const SConnection::AccessRights SConnection::AccessView           = 0x0001;
+const SConnection::AccessRights SConnection::AccessKeyEvents      = 0x0002;
+const SConnection::AccessRights SConnection::AccessPtrEvents      = 0x0004;
+const SConnection::AccessRights SConnection::AccessCutText        = 0x0008;
+const SConnection::AccessRights SConnection::AccessSetDesktopSize = 0x0010;
+const SConnection::AccessRights SConnection::AccessNonShared      = 0x0020;
+const SConnection::AccessRights SConnection::AccessDefault        = 0x03ff;
+const SConnection::AccessRights SConnection::AccessNoQuery        = 0x0400;
+const SConnection::AccessRights SConnection::AccessFull           = 0xffff;
 
 
 SConnection::SConnection(bool reverseConnection_)
@@ -223,6 +226,7 @@
     if (done) {
       state_ = RFBSTATE_QUERYING;
       queryConnection(ssecurity->getUserName());
+      setAccessRights(ssecurity->getAccessRights());
     }
   } catch (AuthFailureException& e) {
     vlog.error("AuthFailureException: %s", e.str());
diff --git a/common/rfb/SConnection.h b/common/rfb/SConnection.h
index 7718f4c..005a7a8 100644
--- a/common/rfb/SConnection.h
+++ b/common/rfb/SConnection.h
@@ -28,7 +28,6 @@
 #include <rdr/OutStream.h>
 #include <rfb/SMsgHandler.h>
 #include <rfb/SecurityServer.h>
-#include <rfb/SSecurity.h>
 
 namespace rfb {
 
@@ -123,13 +122,15 @@
     // is up to the derived class.
 
     typedef rdr::U16 AccessRights;
-    static const AccessRights AccessView;         // View display contents
-    static const AccessRights AccessKeyEvents;    // Send key events
-    static const AccessRights AccessPtrEvents;    // Send pointer events
-    static const AccessRights AccessCutText;      // Send/receive clipboard events
-    static const AccessRights AccessDefault;      // The default rights, INCLUDING FUTURE ONES
-    static const AccessRights AccessNoQuery;      // Connect without local user accepting
-    static const AccessRights AccessFull;         // All of the available AND FUTURE rights
+    static const AccessRights AccessView;           // View display contents
+    static const AccessRights AccessKeyEvents;      // Send key events
+    static const AccessRights AccessPtrEvents;      // Send pointer events
+    static const AccessRights AccessCutText;        // Send/receive clipboard events
+    static const AccessRights AccessSetDesktopSize; // Change desktop size
+    static const AccessRights AccessNonShared;      // Exclusive access to the server
+    static const AccessRights AccessDefault;        // The default rights, INCLUDING FUTURE ONES
+    static const AccessRights AccessNoQuery;        // Connect without local user accepting
+    static const AccessRights AccessFull;           // All of the available AND FUTURE rights
     virtual void setAccessRights(AccessRights ar) = 0;
 
     // Other methods
diff --git a/common/rfb/SSecurity.h b/common/rfb/SSecurity.h
index afc744e..6da63c3 100644
--- a/common/rfb/SSecurity.h
+++ b/common/rfb/SSecurity.h
@@ -44,13 +44,12 @@
 #define __RFB_SSECURITY_H__
 
 #include <rdr/types.h>
+#include <rfb/SConnection.h>
 #include <rfb/util.h>
 #include <list>
 
 namespace rfb {
 
-  class SConnection;
-
   class SSecurity {
   public:
     virtual ~SSecurity() {}
@@ -63,6 +62,8 @@
     // necessary.  Null may be returned to indicate that there is no user name
     // for this security type.
     virtual const char* getUserName() const = 0;
+
+    virtual SConnection::AccessRights getAccessRights() const { return SConnection::AccessDefault; }
   };
 
 }
diff --git a/common/rfb/SSecurityStack.cxx b/common/rfb/SSecurityStack.cxx
index 9ddc9f2..478ce4f 100644
--- a/common/rfb/SSecurityStack.cxx
+++ b/common/rfb/SSecurityStack.cxx
@@ -65,3 +65,20 @@
 
   return c;
 }
+
+SConnection::AccessRights SSecurityStack::getAccessRights() const
+{
+  SConnection::AccessRights accessRights;
+
+  if (!state0 && !state1)
+    return SSecurity::getAccessRights();
+
+  accessRights = SConnection::AccessFull;
+
+  if (state0)
+    accessRights &= state0->getAccessRights();
+  if (state1)
+    accessRights &= state1->getAccessRights();
+
+  return accessRights;
+}
diff --git a/common/rfb/SSecurityStack.h b/common/rfb/SSecurityStack.h
index c80a3b9..dd743d2 100644
--- a/common/rfb/SSecurityStack.h
+++ b/common/rfb/SSecurityStack.h
@@ -31,6 +31,7 @@
     virtual bool processMsg(SConnection* cc);
     virtual int getType() const { return type; };
     virtual const char* getUserName() const;
+    virtual SConnection::AccessRights getAccessRights() const;
   protected:
     short state;
     SSecurity* state0;
diff --git a/common/rfb/SSecurityVeNCrypt.cxx b/common/rfb/SSecurityVeNCrypt.cxx
index 9e4260f..7c13749 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 */
@@ -171,3 +171,16 @@
   return ssecurity->processMsg(sc);
 }
 
+const char* SSecurityVeNCrypt::getUserName() const
+{
+  if (ssecurity == NULL)
+    return NULL;
+  return ssecurity->getUserName();
+}
+
+SConnection::AccessRights SSecurityVeNCrypt::getAccessRights() const
+{
+  if (ssecurity == NULL)
+    return SSecurity::getAccessRights();
+  return ssecurity->getAccessRights();
+}
diff --git a/common/rfb/SSecurityVeNCrypt.h b/common/rfb/SSecurityVeNCrypt.h
index 849a702..f9c753f 100644
--- a/common/rfb/SSecurityVeNCrypt.h
+++ b/common/rfb/SSecurityVeNCrypt.h
@@ -39,8 +39,9 @@
     SSecurityVeNCrypt(SecurityServer *sec);
     ~SSecurityVeNCrypt();
     virtual bool processMsg(SConnection* sc);// { return true; }
-    virtual int getType() const { return secTypeVeNCrypt; }
-    virtual const char* getUserName() const { return NULL; }
+    virtual int getType() const { return chosenType; }
+    virtual const char* getUserName() const;
+    virtual SConnection::AccessRights getAccessRights() const;
 
   protected:
     SSecurity *ssecurity;
diff --git a/common/rfb/SSecurityVncAuth.cxx b/common/rfb/SSecurityVncAuth.cxx
index ca81bf3..05488f6 100644
--- a/common/rfb/SSecurityVncAuth.cxx
+++ b/common/rfb/SSecurityVncAuth.cxx
@@ -49,10 +49,27 @@
  "access the server", &SSecurityVncAuth::vncAuthPasswdFile);
 
 SSecurityVncAuth::SSecurityVncAuth(void)
-  : sentChallenge(false), responsePos(0), pg(&vncAuthPasswd)
+  : sentChallenge(false), responsePos(0), pg(&vncAuthPasswd), accessRights(0)
 {
 }
 
+bool SSecurityVncAuth::verifyResponse(const PlainPasswd &password)
+{
+  rdr::U8 expectedResponse[vncAuthChallengeSize];
+
+  // Calculate the expected response
+  rdr::U8 key[8];
+  int pwdLen = strlen(password.buf);
+  for (int i=0; i<8; i++)
+    key[i] = i<pwdLen ? password.buf[i] : 0;
+  deskey(key, EN0);
+  for (int j = 0; j < vncAuthChallengeSize; j += 8)
+    des(challenge+j, expectedResponse+j);
+
+  // Check the actual response
+  return memcmp(response, expectedResponse, vncAuthChallengeSize) == 0;
+}
+
 bool SSecurityVncAuth::processMsg(SConnection* sc)
 {
   rdr::InStream* is = sc->getInStream();
@@ -72,25 +89,23 @@
 
   if (responsePos < vncAuthChallengeSize) return false;
 
-  PlainPasswd passwd(pg->getVncAuthPasswd());
+  PlainPasswd passwd, passwdReadOnly;
+  pg->getVncAuthPasswd(&passwd, &passwdReadOnly);
 
   if (!passwd.buf)
     throw AuthFailureException("No password configured for VNC Auth");
 
-  // Calculate the expected response
-  rdr::U8 key[8];
-  int pwdLen = strlen(passwd.buf);
-  for (int i=0; i<8; i++)
-    key[i] = i<pwdLen ? passwd.buf[i] : 0;
-  deskey(key, EN0);
-  for (int j = 0; j < vncAuthChallengeSize; j += 8)
-    des(challenge+j, challenge+j);
+  if (verifyResponse(passwd)) {
+    accessRights = SConnection::AccessDefault;
+    return true;
+  }
 
-  // Check the actual response
-  if (memcmp(challenge, response, vncAuthChallengeSize) != 0)
-    throw AuthFailureException();
+  if (passwdReadOnly.buf && verifyResponse(passwdReadOnly)) {
+    accessRights = SConnection::AccessView;
+    return true;
+  }
 
-  return true;
+  throw AuthFailureException();
 }
 
 VncAuthPasswdParameter::VncAuthPasswdParameter(const char* name,
@@ -99,8 +114,8 @@
 : BinaryParameter(name, desc, 0, 0, ConfServer), passwdFile(passwdFile_) {
 }
 
-char* VncAuthPasswdParameter::getVncAuthPasswd() {
-  ObfuscatedPasswd obfuscated;
+void VncAuthPasswdParameter::getVncAuthPasswd(PlainPasswd *password, PlainPasswd *readOnlyPassword) {
+  ObfuscatedPasswd obfuscated, obfuscatedReadOnly;
   getData((void**)&obfuscated.buf, &obfuscated.length);
 
   if (obfuscated.length == 0) {
@@ -108,18 +123,20 @@
       CharArray fname(passwdFile->getData());
       if (!fname.buf[0]) {
         vlog.info("neither %s nor %s params set", getName(), passwdFile->getName());
-        return 0;
+        return;
       }
 
       FILE* fp = fopen(fname.buf, "r");
       if (!fp) {
         vlog.error("opening password file '%s' failed",fname.buf);
-        return 0;
+        return;
       }
 
       vlog.debug("reading password file");
-      obfuscated.buf = new char[128];
-      obfuscated.length = fread(obfuscated.buf, 1, 128, fp);
+      obfuscated.buf = new char[8];
+      obfuscated.length = fread(obfuscated.buf, 1, 8, fp);
+      obfuscatedReadOnly.buf = new char[8];
+      obfuscatedReadOnly.length = fread(obfuscatedReadOnly.buf, 1, 8, fp);
       fclose(fp);
     } else {
       vlog.info("%s parameter not set", getName());
@@ -127,10 +144,11 @@
   }
 
   try {
-    PlainPasswd password(obfuscated);
-    return password.takeBuf();
+    PlainPasswd plainPassword(obfuscated);
+    password->replaceBuf(plainPassword.takeBuf());
+    PlainPasswd plainPasswordReadOnly(obfuscatedReadOnly);
+    readOnlyPassword->replaceBuf(plainPasswordReadOnly.takeBuf());
   } catch (...) {
-    return 0;
   }
 }
 
diff --git a/common/rfb/SSecurityVncAuth.h b/common/rfb/SSecurityVncAuth.h
index 8a2d0f6..e9f379b 100644
--- a/common/rfb/SSecurityVncAuth.h
+++ b/common/rfb/SSecurityVncAuth.h
@@ -25,6 +25,7 @@
 #define __RFB_SSECURITYVNCAUTH_H__
 
 #include <rfb/Configuration.h>
+#include <rfb/Password.h>
 #include <rfb/SSecurity.h>
 #include <rfb/Security.h>
 #include <rdr/types.h>
@@ -33,15 +34,15 @@
 
   class VncAuthPasswdGetter {
   public:
-    // getPasswd() returns a string or null if unsuccessful.  The
-    // SSecurityVncAuth object delete[]s the string when done.
-    virtual char* getVncAuthPasswd()=0;
+    // getVncAuthPasswd() fills buffer of given password and readOnlyPassword.
+    // If there was no read only password in the file, readOnlyPassword buffer is null.
+    virtual void getVncAuthPasswd(PlainPasswd *password, PlainPasswd *readOnlyPassword)=0;
   };
 
   class VncAuthPasswdParameter : public VncAuthPasswdGetter, BinaryParameter {
   public:
     VncAuthPasswdParameter(const char* name, const char* desc, StringParameter* passwdFile_);
-    virtual char* getVncAuthPasswd();
+    virtual void getVncAuthPasswd(PlainPasswd *password, PlainPasswd *readOnlyPassword);
   protected:
     StringParameter* passwdFile;
   };
@@ -52,15 +53,18 @@
     virtual bool processMsg(SConnection* sc);
     virtual int getType() const {return secTypeVncAuth;}
     virtual const char* getUserName() const {return 0;}
+    virtual SConnection::AccessRights getAccessRights() const { return accessRights; }
     static StringParameter vncAuthPasswdFile;
     static VncAuthPasswdParameter vncAuthPasswd;
   private:
+    bool verifyResponse(const PlainPasswd &password);
     enum {vncAuthChallengeSize = 16};
     rdr::U8 challenge[vncAuthChallengeSize];
     rdr::U8 response[vncAuthChallengeSize];
     bool sentChallenge;
     int responsePos;
     VncAuthPasswdGetter* pg;
+    SConnection::AccessRights accessRights;
   };
 }
 #endif
diff --git a/common/rfb/Security.h b/common/rfb/Security.h
index 196eb42..85bc325 100644
--- a/common/rfb/Security.h
+++ b/common/rfb/Security.h
@@ -25,7 +25,6 @@
 #include <rdr/types.h>
 #include <rfb/Configuration.h>
 #include <rfb/CSecurity.h>
-#include <rfb/SSecurity.h>
 
 #include <list>
 
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/common/rfb/SecurityServer.h b/common/rfb/SecurityServer.h
index 0986619..019d67f 100644
--- a/common/rfb/SecurityServer.h
+++ b/common/rfb/SecurityServer.h
@@ -22,9 +22,10 @@
 
 #include <rfb/Configuration.h>
 #include <rfb/Security.h>
-#include <rfb/SSecurity.h>
 
 namespace rfb {
+  
+  class SSecurity;
 
   class SecurityServer : public Security {
   public:
diff --git a/common/rfb/ServerCore.cxx b/common/rfb/ServerCore.cxx
index ae2fd24..b11a352 100644
--- a/common/rfb/ServerCore.cxx
+++ b/common/rfb/ServerCore.cxx
@@ -89,6 +89,10 @@
 ("SendCutText",
  "Send clipboard changes to clients.",
  true);
+rfb::BoolParameter rfb::Server::acceptSetDesktopSize
+("AcceptSetDesktopSize",
+ "Accept set desktop size events from clients.",
+ true);
 rfb::BoolParameter rfb::Server::queryConnect
 ("QueryConnect",
  "Prompt the local user to accept or reject incoming connections.",
diff --git a/common/rfb/ServerCore.h b/common/rfb/ServerCore.h
index e12a8bc..5fc996f 100644
--- a/common/rfb/ServerCore.h
+++ b/common/rfb/ServerCore.h
@@ -46,6 +46,7 @@
     static BoolParameter acceptPointerEvents;
     static BoolParameter acceptCutText;
     static BoolParameter sendCutText;
+    static BoolParameter acceptSetDesktopSize;
     static BoolParameter queryConnect;
 
   };
diff --git a/common/rfb/VNCSConnectionST.cxx b/common/rfb/VNCSConnectionST.cxx
index 618048a..e30b4f4 100644
--- a/common/rfb/VNCSConnectionST.cxx
+++ b/common/rfb/VNCSConnectionST.cxx
@@ -445,9 +445,10 @@
 {
   lastEventTime = time(0);
   if (rfb::Server::alwaysShared || reverseConnection) shared = true;
+  if (!(accessRights & AccessNonShared)) shared = true;
   if (rfb::Server::neverShared) shared = false;
   if (!shared) {
-    if (rfb::Server::disconnectClients) {
+    if (rfb::Server::disconnectClients && (accessRights & AccessNonShared)) {
       // - Close all the other connected clients
       vlog.debug("non-shared connection - closing clients");
       server->closeClients("Non-shared connection requested", getSock());
@@ -584,6 +585,9 @@
 {
   unsigned int result;
 
+  if (!(accessRights & AccessSetDesktopSize)) return;
+  if (!rfb::Server::acceptSetDesktopSize) return;
+
   // Don't bother the desktop with an invalid configuration
   if (!layout.validate(fb_width, fb_height)) {
     writer()->writeExtendedDesktopSize(reasonClient, resultInvalid,
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/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/CMakeLists.txt b/po/CMakeLists.txt
index 793089c..513cfcc 100644
--- a/po/CMakeLists.txt
+++ b/po/CMakeLists.txt
@@ -1,7 +1,7 @@
 # Gettext support - mostly borrowed from the Licq project
 
 set(po_FILES
-    de es fr it nl pl pt_BR ru sk sv tr
+    de es fr it nl pl pt_BR ru sk sv tr uk
 )
 
 if (NOT GETTEXT_MSGMERGE_EXECUTABLE AND NOT GETTEXT_MSGFMT_EXECUTABLE)
@@ -25,8 +25,9 @@
       --keyword=N_
       "--copyright-holder=TigerVNC Team and many others \(see README.txt\)"
       --msgid-bugs-address=tigervnc-devel@googlegroups.com
-      --sort-output
+      --sort-by-file
       --add-location
+      --add-comments
       ${po_source}
     COMMENT "Updating tigervnc.pot"
     VERBATIM
@@ -40,7 +41,7 @@
   # Update po files after pot file
   add_custom_command(TARGET translations_update POST_BUILD
     COMMAND ${GETTEXT_MSGMERGE_EXECUTABLE} --quiet --update --backup=none
-      --sort-output ${po} ${CMAKE_CURRENT_SOURCE_DIR}/tigervnc.pot
+      --sort-by-file ${po} ${CMAKE_CURRENT_SOURCE_DIR}/tigervnc.pot
     COMMENT "Updating ${lang}.po"
   )
 
diff --git a/po/de.po b/po/de.po
index 5c53292..52e000f 100644
--- a/po/de.po
+++ b/po/de.po
@@ -1,52 +1,57 @@
-# Copyright (C) 2011 TigerVNC Team
+# German translation of tigervnc.
+# Copyright (C) 2014 the TigerVNC Team (msgids)
+# This file is distributed under the same license as the tigervnc package.
+# Klaus Franken <Klaus.Franken@StrukturPunkt.de>, 2005.
+# Mario Blättermann <mario.blaettermann@gmail.com>, 2014.
 msgid ""
 msgstr ""
-"Project-Id-Version: TigerVNC 0.0.91\n"
+"Project-Id-Version: tigervnc 1.3.90\n"
 "Report-Msgid-Bugs-To: tigervnc-devel@googlegroups.com\n"
-"POT-Creation-Date: 2014-09-22 11:15+0000\n"
-"PO-Revision-Date: 2005-03-01 20:41+0100\n"
-"Last-Translator: Klaus Franken <Klaus.Franken@StrukturPunkt.de>\n"
-"Language-Team: German\n"
-"Language: \n"
+"POT-Creation-Date: 2014-11-19 12:46+0000\n"
+"PO-Revision-Date: 2014-11-28 21:47+0100\n"
+"Last-Translator: Mario Blättermann <mario.blaettermann@gmail.com>\n"
+"Language-Team: German <translation-team-de@lists.sourceforge.net>\n"
+"Language: de\n"
 "MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
+"Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 1.5.4\n"
 
 #: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:194
 #, c-format
 msgid "(server default %s)"
-msgstr ""
+msgstr "(Server-Vorgabe %s)"
 
 #: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:227
 msgid "About"
-msgstr "Über"
+msgstr "Info"
 
 #: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:103
 msgid "About TigerVNC Viewer"
-msgstr "Über TigerVNC-Viewer"
+msgstr "Info zu TigerVNC-Betrachter"
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1086
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1097
 msgid "About TigerVNC viewer..."
-msgstr "Über TigerVNC-Viewer..."
+msgstr "Info zu TigerVNC-Betrachter …"
 
 #: /home/ossman/devel/tigervnc/vncviewer/ServerDialog.cxx:86
 msgid "About..."
-msgstr "Über..."
+msgstr "Info …"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:704
 msgid "Accept clipboard from server"
-msgstr "Akzeptiere Zwischenablage vom Server"
+msgstr "Zwischenablage vom Server akzeptieren"
 
 #: /home/ossman/devel/tigervnc/vncviewer/DesktopWindow.cxx:327
 msgid "Adjusting window size to avoid accidental full screen request"
-msgstr ""
+msgstr "Fenstergröße anpassen, um zufällige Vollbild-Anforderung zu vermeiden"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:563
 msgid "Allow JPEG compression:"
-msgstr "Erlaube JPEG-Kompression:"
+msgstr "JPEG-Kompression erlauben:"
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1070
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1081
 msgid "Alt"
 msgstr "Alt"
 
@@ -65,11 +70,11 @@
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:651
 #, c-format
 msgid "Bad Name/Value pair on line: %d in file: %s"
-msgstr ""
+msgstr "Falsches Name/Wert-Paar in Zeile: %d in Datei: %s"
 
-#: /home/ossman/devel/tigervnc/vncviewer/Win32PixelBuffer.cxx:92
+#: /home/ossman/devel/tigervnc/vncviewer/Win32PixelBuffer.cxx:91
 msgid "BitBlt failed"
-msgstr ""
+msgstr "BitBlt fehlgeschlagen"
 
 #: /home/ossman/devel/tigervnc/vncviewer/ServerDialog.cxx:91
 #: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:221
@@ -79,7 +84,7 @@
 
 #: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:116
 msgid "CleanupSignalHandler called"
-msgstr ""
+msgstr "CleanupSignalHandler aufgerufen"
 
 #: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:222
 msgid "Close"
@@ -87,103 +92,107 @@
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:499
 msgid "Color level"
-msgstr "Farblevel"
+msgstr "Farbstufe"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:421
-#, fuzzy
 msgid "Compression"
-msgstr "individueller Kompressionslevel:"
+msgstr "Kompression"
 
 #: /home/ossman/devel/tigervnc/vncviewer/ServerDialog.cxx:96
 msgid "Connect"
 msgstr "Verbinden"
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1085
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1096
 msgid "Connection info..."
-msgstr "Verbindungsinformationen..."
+msgstr "Verbindungsinformationen …"
 
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:362
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:404
 #, c-format
-msgid ""
-"Could not convert the parameter-name %s to wchar_t* when reading from the "
-"Registry, the buffersize is to small."
-msgstr ""
+msgid "Could not convert the parameter-name %s to wchar_t* when reading from the Registry, the buffersize is to small."
+msgstr "Der Parametername %s konnte beim Lesen der Registrierungsdatenbank nicht in wchar_t* umgewandelt werden, die Größe des Puffers ist zu gering."
 
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:302
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:340
 #, c-format
-msgid ""
-"Could not convert the parameter-name %s to wchar_t* when writing to the "
-"Registry, the buffersize is to small."
-msgstr ""
+msgid "Could not convert the parameter-name %s to wchar_t* when writing to the Registry, the buffersize is to small."
+msgstr "Der Parametername %s konnte beim Schreiben in die Registrierungsdatenbank nicht in wchar_t* umgewandelt werden, die Größe des Puffers ist zu gering."
 
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:318
 #, c-format
-msgid ""
-"Could not convert the parameter-value %s to wchar_t* when writing to the "
-"Registry, the buffersize is to small."
-msgstr ""
+msgid "Could not convert the parameter-value %s to wchar_t* when writing to the Registry, the buffersize is to small."
+msgstr "Der Parameterwert %s konnte beim Schreiben in die Registrierungsdatenbank nicht in wchar_t* umgewandelt werden, die Größe des Puffers ist zu gering."
 
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:381
 #, c-format
-msgid ""
-"Could not convert the parameter-value for %s to utf8 char* when reading from "
-"the Registry, the buffer dest is to small."
-msgstr ""
+msgid "Could not convert the parameter-value for %s to utf8 char* when reading from the Registry, the buffer dest is to small."
+msgstr "Der Parameterwert für %s konnte beim Lesen der Registrierungsdatenbank nicht in UTF-8 umgewandelt werden, die Größe des Puffers ist zu gering."
 
 #: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:256
 #, c-format
 msgid "Could not create VNC home directory: %s."
-msgstr "VNC-Benutzerverzeichnis %s konnte nicht erstellt werden"
+msgstr "VNC-Benutzerverzeichnis konnte nicht erstellt werden: %s."
 
 #: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:251
 msgid "Could not create VNC home directory: can't obtain home directory path."
-msgstr ""
-"VNC-Benutzerverzeichnis konnte nicht angelegt werden: auf "
-"Benutzerverzeichnispfad kann nicht zugegriffen werden."
+msgstr "VNC-Benutzerverzeichnis konnte nicht angelegt werden: auf Benutzerverzeichnispfad kann nicht zugegriffen werden."
+
+#: /home/ossman/devel/tigervnc/vncviewer/OSXPixelBuffer.cxx:58
+msgid "Could not create framebuffer bitmap"
+msgstr "Framebuffer-Bitmap konnte nicht erstellt werden"
+
+#: /home/ossman/devel/tigervnc/vncviewer/OSXPixelBuffer.cxx:52
+msgid "Could not create framebuffer device"
+msgstr "Framebuffer-Gerät konnte nicht erstellt werden"
+
+#: /home/ossman/devel/tigervnc/vncviewer/X11PixelBuffer.cxx:107
+msgid "Could not create framebuffer image"
+msgstr "Framebuffer-Image konnte nicht erstellt werden"
 
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:310
 #, c-format
 msgid "Could not encode the parameter-value %s when writing to the Registry."
-msgstr ""
+msgstr "Der Parameterwert %s konnte beim Schreiben in die Registrierungsdatenbank nicht kodiert werden."
 
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:613
 #, c-format
-msgid ""
-"Could not read the line(%d) in the configuration file,the buffersize is to "
-"small."
-msgstr ""
+msgid "Could not read the line(%d) in the configuration file,the buffersize is to small."
+msgstr "Die Zeile(%d) in der Konfigurationsdatei konnte nicht gelesen werden, die Puffergröße ist zu gering."
 
-#: /home/ossman/devel/tigervnc/vncviewer/Win32PixelBuffer.cxx:80
+#: /home/ossman/devel/tigervnc/vncviewer/X11PixelBuffer.cxx:68
+msgid "Couldn't find suitable pixmap format"
+msgstr "Es konnte kein geeignetes Pixmap-Format gefunden werden"
+
+#: /home/ossman/devel/tigervnc/vncviewer/Win32PixelBuffer.cxx:79
 msgid "CreateCompatibleDC failed"
-msgstr ""
+msgstr "CreateCompatibleDC fehlgeschlagen"
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1068
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1079
 msgid "Ctrl"
 msgstr "Strg"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:550
 msgid "Custom compression level:"
-msgstr "individueller Kompressionslevel:"
+msgstr "Individuelle Kompressionsstufe:"
 
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:283
-msgid ""
-"Decoding: The size of the buffer dest is to small, it needs to be 1 byte "
-"bigger."
-msgstr ""
+msgid "Decoding: The size of the buffer dest is to small, it needs to be 1 byte bigger."
+msgstr "Dekodierung: Das Puffer-Ziel ist zu klein, es muss 1 Byte größer sein."
 
 #: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:172
 #, c-format
 msgid "Desktop name: %.80s"
-msgstr ""
+msgstr "Desktop-Name: %.80s"
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1088
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1099
 msgid "Dismiss menu"
 msgstr "Menü verlassen"
 
+#: /home/ossman/devel/tigervnc/vncviewer/X11PixelBuffer.cxx:59
+msgid "Display lacks pixmap format for default depth"
+msgstr "Anzeige hat kein Pixmap-Format für die vorgegebene Tiefe"
+
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:778
-#, fuzzy
 msgid "Enable full-screen mode over all monitors"
 msgstr "Vollbildmodus für alle Monitore aktivieren"
 
@@ -193,24 +202,18 @@
 
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:200
 #, c-format
-msgid ""
-"Encoding backslash: The size of the buffer dest is to small, it needs to be "
-"more than %d bytes bigger."
-msgstr ""
+msgid "Encoding backslash: The size of the buffer dest is to small, it needs to be more than %d bytes bigger."
+msgstr "Kodierung des Rückschrägstrichs: Das Puffer-Ziel ist zu klein, es muss %d Bytes größer sein."
 
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:214
 #, c-format
-msgid ""
-"Encoding escape sequence: The size of the buffer dest is to small, it needs "
-"to be more than %d bytes bigger."
-msgstr ""
+msgid "Encoding escape sequence: The size of the buffer dest is to small, it needs to be more than %d bytes bigger."
+msgstr "Kodierung der Escape-Sequenz: Das Puffer-Ziel ist zu klein, es muss %d Bytes größer sein."
 
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:234
 #, c-format
-msgid ""
-"Encoding normal character: The size of the buffer dest is to small, it needs "
-"to be more than %d bytes bigger."
-msgstr ""
+msgid "Encoding normal character: The size of the buffer dest is to small, it needs to be more than %d bytes bigger."
+msgstr "Kodierung des gewöhnlichen Zeichens: Das Puffer-Ziel ist zu klein, es muss %d Bytes größer sein."
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:595
 msgid "Encryption"
@@ -219,88 +222,65 @@
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:503
 #, c-format
 msgid "Error(%d) closing key:  Software\\TigerVNC\\vncviewer"
-msgstr ""
+msgstr "Fehler(%d) beim Schließen des Schlüssels:  Software\\TigerVNC\\vncviewer"
 
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:455
 #, c-format
 msgid "Error(%d) closing key: Software\\TigerVNC\\vncviewer"
-msgstr ""
+msgstr "Fehler(%d) beim Schließen des Schlüssels: Software\\TigerVNC\\vncviewer"
 
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:434
 #, c-format
 msgid "Error(%d) creating key: Software\\TigerVNC\\vncviewer"
-msgstr ""
+msgstr "Fehler(%d) beim Erstellen des Schlüssels: Software\\TigerVNC\\vncviewer"
 
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:471
 #, c-format
 msgid "Error(%d) opening key: Software\\TigerVNC\\vncviewer"
-msgstr ""
+msgstr "Fehler(%d) beim Öffnen des Schlüssels: Software\\TigerVNC\\vncviewer"
 
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:373
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:415
 #, c-format
 msgid "Error(%d) reading %s from Registry."
-msgstr ""
+msgstr "Fehler(%d) beim Lesen von %s aus der Registrierungsdatenbank."
 
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:348
 #, c-format
 msgid "Error(%d) writing %d(REG_DWORD) to Registry."
-msgstr ""
+msgstr "Fehler(%d) beim Schreiben von %d(REG_DWORD) in die Registrierungsdatenbank."
 
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:326
 #, c-format
 msgid "Error(%d) writing %s(REG_SZ) to Registry."
-msgstr ""
+msgstr "Fehler(%d) beim Schreiben von %s(REG_SZ) in die Registrierungsdatenbank."
 
-#: /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 "Viewer beenden"
+msgstr "Betrachter beenden"
 
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:588
-#, fuzzy
 msgid "Failed to read configuration file, can't obtain home directory path."
-msgstr ""
-"VNC-Benutzerverzeichnis konnte nicht angelegt werden: auf "
-"Benutzerverzeichnispfad kann nicht zugegriffen werden."
+msgstr "Konfigurationsdatei konnte nicht gelesen werden, auf Benutzerverzeichnispfad kann nicht zugegriffen werden."
 
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:602
 #, c-format
 msgid "Failed to read configuration file, can't open %s"
-msgstr ""
+msgstr "Konfigurationsdatei kann nicht gelesen werden, %s lässt sich nicht öffnen"
 
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:621
 #, c-format
 msgid "Failed to read line %d in file %s"
-msgstr ""
+msgstr "Zeile %d in Datei %s konnte nicht gelesen werden"
 
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:528
-#, fuzzy
 msgid "Failed to write configuration file, can't obtain home directory path."
-msgstr ""
-"VNC-Benutzerverzeichnis konnte nicht angelegt werden: auf "
-"Benutzerverzeichnispfad kann nicht zugegriffen werden."
+msgstr "Konfigurationsdatei konnte nicht geschrieben werden, auf Benutzerverzeichnispfad kann nicht zugegriffen werden."
 
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:542
 #, c-format
 msgid "Failed to write configuration file, can't open %s"
-msgstr ""
+msgstr "Konfigurationsdatei kann nicht geschrieben werden, %s lässt sich nicht öffnen"
 
 #: /home/ossman/devel/tigervnc/vncviewer/DesktopWindow.cxx:526
 #: /home/ossman/devel/tigervnc/vncviewer/DesktopWindow.cxx:538
@@ -316,14 +296,13 @@
 msgid "Full (all available colors)"
 msgstr "Voll (alle verfügbaren Farben)"
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1059
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1070
 msgid "Full screen"
 msgstr "Vollbildmodus"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:770
-#, fuzzy
 msgid "Full-screen mode"
-msgstr "Vollbild-Modus"
+msgstr "Vollbildmodus"
 
 #: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:230
 msgid "Hide"
@@ -331,43 +310,42 @@
 
 #: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:238
 msgid "Hide Others"
-msgstr "Andere Verbergen"
+msgstr "Andere verbergen"
 
 #: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:177
 #, c-format
 msgid "Host: %.80s port: %d"
-msgstr ""
+msgstr "Rechner: %.80s Port: %d"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:690
-#, fuzzy
 msgid "Input"
-msgstr "Eingaben:"
+msgstr "Eingabe"
 
 #: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:510
 msgid "Internal FLTK error. Exiting."
-msgstr "Interner FLTK-Fehler. Beenden."
+msgstr "Interner FLTK-Fehler. Abbruch."
 
 #: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:384
 msgid "Invalid SetColourMapEntries from server!"
-msgstr ""
+msgstr "Ungültige SetColourMapEntries vom Server!"
 
 #: /home/ossman/devel/tigervnc/vncviewer/DesktopWindow.cxx:106
 msgid "Invalid geometry specified!"
-msgstr ""
+msgstr "Unzulässige Geometrie wurde angegeben!"
 
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:708
 #, c-format
 msgid "Invalid parameter name on line: %d in file: %s"
-msgstr ""
+msgstr "Ungültiger Parametername in Zeile: %d in Datei: %s"
 
-#: /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 ""
+msgstr "Ungültige Bildschirmanordnung wurde für die Größenänderungsanforderung ermittelt!"
 
 #: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:204
-#, fuzzy, c-format
+#, c-format
 msgid "Last used encoding: %s"
-msgstr "%s Verschlüsselung wird verwendet"
+msgstr "Zuletzt verwendete Zeichenkodierung: %s"
 
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:631
 #, c-format
@@ -376,16 +354,19 @@
 "must contain the TigerVNC configuration file identifier string:\n"
 "\"%s\""
 msgstr ""
+"Zeile 1 in Datei %s\n"
+"muss den Dateibezeichner der TigerVNC-Konfigurationsdatei enthalten:\n"
+"»%s«"
 
 #: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:209
 #, c-format
 msgid "Line speed estimate: %d kbit/s"
-msgstr ""
+msgstr "Geschätzte Verbindungsgeschwindigkeit: %d kbit/s"
 
 #: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:478
 #, c-format
 msgid "Listening on port %d\n"
-msgstr ""
+msgstr "Am Port %d wird gelauscht\n"
 
 #: /home/ossman/devel/tigervnc/vncviewer/ServerDialog.cxx:69
 msgid "Load..."
@@ -397,55 +378,54 @@
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:519
 msgid "Medium (256 colors)"
-msgstr "Medium (256 Farben)"
+msgstr "Mittel (256 Farben)"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:725
-#, fuzzy
 msgid "Menu key"
-msgstr "Taste für Kontextmenü"
+msgstr "Menü-Taste"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:791
 msgid "Misc."
 msgstr "Sonstiges"
 
-#: /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 "Mehrere Zeichen für Schlüsselcode %d (0x%04x) eingegeben: '%s'"
+msgstr "Mehrere Zeichen für Schlüsselcode %d (0x%04x) eingegeben: »%s«"
 
 #: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:218
 msgid "No"
 msgstr "Nein"
 
-#: /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 ""
+msgstr "Kein Scan-Code für erweiterte virtuelle Taste 0x%02x"
 
-#: /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 ""
+msgstr "Kein Scan-Code für virtuelle Taste 0x%02x"
 
-#: /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 ""
+msgstr "Kein Symbol für erweiterte virtuelle Taste 0x%02x"
 
-#: /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 ""
+msgstr "Kein Symbol für Tastencode %d (im aktuellen Zustand)"
 
-#: /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 ""
+msgstr "Kein Symbol für Tastencode 0x%02x (im aktuellen Zustand)"
 
-#: /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 ""
+msgstr "Kein Symbol für virtuelle Taste 0x%02x"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:606
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:659
@@ -453,28 +433,38 @@
 msgid "None"
 msgstr "Keine"
 
+#: /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 "Nicht genügend Speicher für Framebuffer"
+
 #: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:220
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:88
 msgid "OK"
-msgstr "Ok"
+msgstr "OK"
+
+#: /home/ossman/devel/tigervnc/vncviewer/X11PixelBuffer.cxx:77
+msgid "Only true colour displays supported"
+msgstr "Nur True-Color-Anzeigen werden unterstützt"
 
 #: /home/ossman/devel/tigervnc/vncviewer/UserDialog.cxx:74
 msgid "Opening password file failed"
 msgstr "Öffnen der Passwortdatei fehlgeschlagen"
 
-#: /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 "Optionen..."
+msgstr "Optionen …"
 
 #: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:463
 #: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:464
 msgid "Parameters -listen and -via are incompatible"
-msgstr ""
+msgstr "Die Parameter -listen und -via schließen sich gegenseitig aus"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:722
 msgid "Pass system keys directly to server (full screen)"
-msgstr ""
+msgstr "Systemtasten direkt an den Server übergeben (Vollbild)"
 
 #: /home/ossman/devel/tigervnc/vncviewer/UserDialog.cxx:87
 #: /home/ossman/devel/tigervnc/vncviewer/UserDialog.cxx:102
@@ -483,16 +473,16 @@
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:625
 msgid "Path to X509 CA certificate"
-msgstr "Pfad zum X509 CA Zertifikat"
+msgstr "Pfad zum X509-CA-Zertifikat"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:632
 msgid "Path to X509 CRL file"
-msgstr "Pfad zur X509 CRL Datei"
+msgstr "Pfad zur X509-CRL-Datei"
 
 #: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:188
-#, fuzzy, c-format
+#, c-format
 msgid "Pixel format: %s"
-msgstr "Pixelformat %s wird verwendet"
+msgstr "Pixelformat: %s"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:449
 msgid "Preferred encoding"
@@ -501,37 +491,36 @@
 #: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:214
 #, c-format
 msgid "Protocol version: %d.%d"
-msgstr ""
+msgstr "Protokollversion: %d.%d"
 
 #: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:233
 msgid "Quit"
 msgstr "Beenden"
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1082
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1093
 msgid "Refresh screen"
-msgstr "Bildschirm auffrischen"
+msgstr "Bildschirm aktualisieren"
 
 #: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:199
-#, fuzzy, c-format
+#, c-format
 msgid "Requested encoding: %s"
-msgstr "Bevorzugte Kodierung"
+msgstr "Angeforderte Zeichenkodierung: %s"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:749
-#, fuzzy
 msgid "Resize remote session on connect"
-msgstr "Remote-Session an das lokale Fenster anpassen"
+msgstr "Ferne Sitzung beim Verbinden an das lokale Fenster anpassen"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:762
 msgid "Resize remote session to the local window"
-msgstr "Remote-Session an das lokale Fenster anpassen"
+msgstr "Ferne Sitzung an das lokale Fenster anpassen"
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1062
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1073
 msgid "Resize window to session"
-msgstr "Fenster an Session anpassen"
+msgstr "Fenster an Sitzung anpassen"
 
 #: /home/ossman/devel/tigervnc/vncviewer/ServerDialog.cxx:74
 msgid "Save As..."
-msgstr "Speichern unter..."
+msgstr "Speichern unter …"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:741
 msgid "Screen"
@@ -544,29 +533,28 @@
 #: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:219
 #, c-format
 msgid "Security method: %s"
-msgstr ""
+msgstr "Sicherheitsmethode: %s"
 
-#: /home/ossman/devel/tigervnc/vncviewer/Win32PixelBuffer.cxx:83
+#: /home/ossman/devel/tigervnc/vncviewer/Win32PixelBuffer.cxx:82
 msgid "SelectObject failed"
-msgstr ""
+msgstr "SelectObject fehlgeschlagen"
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1075
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1086
 #, c-format
 msgid "Send %s"
-msgstr "Sende %s"
+msgstr "%s senden"
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1080
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1091
 msgid "Send Ctrl-Alt-Del"
-msgstr "Sende Strg-Alt-Del"
+msgstr "Strg-Alt-Del senden"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:710
 msgid "Send clipboard to server"
-msgstr "Sende Zwischenablage zum Server"
+msgstr "Zwischenablage zum Server senden"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:716
-#, fuzzy
 msgid "Send primary selection and cut buffer as clipboard"
-msgstr "Sende primary selection & cut buffer als Zwischenablage"
+msgstr "Primäre Auswahl und Ausschneidepuffer als Zwischenablage senden"
 
 #: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:237
 msgid "Services"
@@ -583,16 +571,16 @@
 
 #: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:239
 msgid "Show All"
-msgstr "Alle Zeigen"
+msgstr "Alle zeigen"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:805
 msgid "Show dot when no cursor"
-msgstr "Zeige Punkt wenn kein Cursor"
+msgstr "Punkt zeigen, wenn kein Cursor"
 
 #: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:182
 #, c-format
 msgid "Size: %d x %d"
-msgstr ""
+msgstr "Größe: %d x %d"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:665
 msgid "Standard VNC (insecure without encryption)"
@@ -612,72 +600,76 @@
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:701
 #, c-format
 msgid "The parameterArray contains a object of a invalid type at line %d."
-msgstr ""
+msgstr "Das ParameterArray enthält ein Objekt ungültigen Typs in Zeile %d."
 
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:664
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:680
 #, c-format
 msgid "The value of the parameter %s on line %d in file %s is invalid."
-msgstr ""
+msgstr "Der Wert des Parameters %s in Zeile %d in Datei %s ist ungültig."
 
 #: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:539
 #, c-format
 msgid "Throughput %d kbit/s - changing to quality %d"
-msgstr "Durchsatz %d kbit/s - Ändern der Qualität auf %d"
+msgstr "Durchsatz %d kbit/s - Qualität wird auf %d geändert"
 
 #: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:561
 #, c-format
 msgid "Throughput %d kbit/s - full color is now %s"
-msgstr "Durchsatz %d kbit/s - Full Color jetzt %s"
+msgstr "Durchsatz %d kbit/s - Vollfarbmodus ist jetzt %s"
 
 #: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:210
 msgid "TigerVNC Viewer"
-msgstr "TigerVNC-Viewer"
+msgstr "TigerVNC-Betrachter"
 
 #: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:80
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "TigerVNC Viewer %d-bit v%s\n"
 "Built on: %s\n"
 "Copyright (C) 1999-%d TigerVNC Team and many others (see README.txt)\n"
 "See http://www.tigervnc.org for information on TigerVNC."
 msgstr ""
-"TigerVNC-Viewer version %s (%s)\n"
-"%s\n"
-"Copyright (C) 1999-2011 TigerVNC Team and many others (see README.txt)\n"
+"TigerVNC-Betrachter (%d-bit) Version %s\n"
+"Erstellt auf: %s\n"
+"Copyright (C) 1999-%d TigerVNC Team und viele andere (siehe README.txt)\n"
 "Copyright (C) 2005 Klaus Franken, StrukturPunkt\n"
 "Siehe http://www.tigervnc.org für Informationen über TigerVNC."
 
-#: /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 "Plattformspezifischer Framebuffer konnte nicht erstellt werden: %s"
+
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1015
 #, c-format
 msgid "Unknown FLTK key code %d (0x%04x)"
 msgstr "Unbekannter FLTK-Tastencode %d (0x%04x)"
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:878
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:889
 #, c-format
 msgid "Unknown decimal separator: '%s'"
-msgstr "Unbekanntes Dezimaltrennzeichen:'%s'"
+msgstr "Unbekanntes Dezimaltrennzeichen: »%s«"
 
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:271
-#, fuzzy, c-format
+#, c-format
 msgid "Unknown escape sequence at character %d"
-msgstr "Unbekanntes Dezimaltrennzeichen:'%s'"
+msgstr "Unbekannte Escape-Sequenz bei Zeichen %d"
 
 #: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:430
 #: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:437
-#, fuzzy
 msgid "Unknown rect encoding"
-msgstr "%s Verschlüsselung wird verwendet"
+msgstr "Unbekannte rect-Kodierung"
 
 #: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:429
 #: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:436
 #, c-format
 msgid "Unknown rect encoding %d"
-msgstr ""
+msgstr "Unbekannte rect-Kodierung %d"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:671
 msgid "Username and password (insecure without encryption)"
-msgstr "Benutzername und Passwort (unsicher ohne VerschlÃŒsselung)"
+msgstr "Benutzername und Passwort (unsicher ohne Verschlüsselung)"
 
 #: /home/ossman/devel/tigervnc/vncviewer/UserDialog.cxx:99
 msgid "Username:"
@@ -686,34 +678,38 @@
 #: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:573
 #, c-format
 msgid "Using %s encoding"
-msgstr "%s Verschlüsselung wird verwendet"
+msgstr "%s-Verschlüsselung wird verwendet"
 
-#: /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 ""
+msgstr "Vorgegebene Farbzuweisung und Anzeige wird verwendet, %sTiefe %d."
 
 #: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:620
 #, c-format
 msgid "Using pixel format %s"
 msgstr "Pixelformat %s wird verwendet"
 
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:457
+msgid "Using platform independent framebuffer"
+msgstr "Plattformunabhängiger Framebuffer wird verwendet"
+
 #: /home/ossman/devel/tigervnc/vncviewer/ServerDialog.cxx:42
 msgid "VNC Viewer: Connection Details"
-msgstr "VNC-Viewer: Verbindungsdetails"
+msgstr "VNC-Betrachter: Verbindungsdetails"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:57
 msgid "VNC Viewer: Connection Options"
-msgstr "VNC-Viewer: Verbindungsoptionen"
+msgstr "VNC-Betrachter: Verbindungsoptionen"
 
 #: /home/ossman/devel/tigervnc/vncviewer/UserDialog.cxx:86
 #: /home/ossman/devel/tigervnc/vncviewer/UserDialog.cxx:96
 msgid "VNC authentication"
 msgstr "VNC-Autorisierung"
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1176
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1187
 msgid "VNC connection info"
-msgstr "VNC Verbindungsinformation"
+msgstr "VNC-Verbindungsinformation"
 
 #: /home/ossman/devel/tigervnc/vncviewer/ServerDialog.cxx:49
 #: /home/ossman/devel/tigervnc/vncviewer/ServerDialog.cxx:54
@@ -725,9 +721,8 @@
 msgstr "Sehr gering (8 Farben)"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:698
-#, fuzzy
 msgid "View only (ignore mouse and keyboard)"
-msgstr "nur Ansicht (ignoriere Maus und Tastatur)"
+msgstr "Nur Ansicht (Maus und Tastatur ignorieren)"
 
 #: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:219
 msgid "Yes"
@@ -736,7 +731,7 @@
 #: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:111
 #, c-format
 msgid "connected to host %s port %d"
-msgstr "verbunden mit Host %s Port %d"
+msgstr "verbunden mit Rechner %s, Port %d"
 
 #: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:563
 msgid "disabled"
@@ -748,35 +743,12 @@
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:556
 msgid "level (1=fast, 6=best [4-6 are rarely useful])"
-msgstr "Level (1=schnell, 9=beste) [4-6 sind selten sinnvoll]"
+msgstr "Stufe (1=schnell, 9=beste) [4-6 sind selten sinnvoll]"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:569
 msgid "quality (0=poor, 9=best)"
 msgstr "Qualität (0=schlechte, 9=beste)"
 
-#: /home/ossman/devel/tigervnc/vncviewer/Win32PixelBuffer.cxx:63
+#: /home/ossman/devel/tigervnc/vncviewer/Win32PixelBuffer.cxx:62
 msgid "unable to create DIB section"
-msgstr ""
-
-#~ msgid ""
-#~ "Desktop name: %.80s\n"
-#~ "Host: %.80s port: %d\n"
-#~ "Size: %d x %d\n"
-#~ "Pixel format: %s\n"
-#~ "(server default %s)\n"
-#~ "Requested encoding: %s\n"
-#~ "Last used encoding: %s\n"
-#~ "Line speed estimate: %d kbit/s\n"
-#~ "Protocol version: %d.%d\n"
-#~ "Security method: %s\n"
-#~ msgstr ""
-#~ "Desktopname: %.80s\n"
-#~ "Host: %.80s port: %d\n"
-#~ "Größe: %d x %d\n"
-#~ "Pixelformat: %s\n"
-#~ "(Server Standard %s)\n"
-#~ "gewünschte Kodierung: %s\n"
-#~ "letzte benutzte Kodierung: %s\n"
-#~ "Leitungsgeschwindigkeit (geschätzt): %d kbit/s\n"
-#~ "Protokollversion: %d.%d\n"
-#~ "Sicherheitsmethode: %s\n"
+msgstr "DIB-Abschnitt konnte nicht erstellt werden"
diff --git a/po/nl.po b/po/nl.po
index e13329c..9d90fa0 100644
--- a/po/nl.po
+++ b/po/nl.po
@@ -1,50 +1,59 @@
-# Copyright (C) TigerVNC Team
+# Dutch translations for TigerVNC.
+# Copyright (C) the TigerVNC Team (msgids)
+# This file is distributed under the same license as the tigervnc package.
+#
+# Benno Schulenberg <benno@vertaalt.nl>, 2014.
 msgid ""
 msgstr ""
-"Project-Id-Version: TigerVNC 1.3.80\n"
+"Project-Id-Version: tigervnc 1.3.90\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: 2014-11-22 12:02+0100\n"
+"Last-Translator: Benno Schulenberg <benno@vertaalt.nl>\n"
+"Language-Team: Dutch <vertaling@vrijschrift.org>\n"
 "Language: nl\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 1.0\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:194
 #, c-format
 msgid "(server default %s)"
-msgstr ""
+msgstr "(serverstandaard is %s)"
 
 #: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:227
 msgid "About"
-msgstr "Over"
+msgstr "Info"
 
 #: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:103
 msgid "About TigerVNC Viewer"
-msgstr ""
+msgstr "Info over TigerVNC-viewer"
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1086
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1097
 msgid "About TigerVNC viewer..."
-msgstr ""
+msgstr "Info over TigerVNC-viewer..."
 
 #: /home/ossman/devel/tigervnc/vncviewer/ServerDialog.cxx:86
 msgid "About..."
-msgstr "Over..."
+msgstr "Info..."
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:704
 msgid "Accept clipboard from server"
-msgstr ""
+msgstr "Klembord van server accepteren"
 
 #: /home/ossman/devel/tigervnc/vncviewer/DesktopWindow.cxx:327
 msgid "Adjusting window size to avoid accidental full screen request"
-msgstr ""
+msgstr "Venstergrootte wordt aangepast om onbedoeld volledigschermverzoek te vermijden"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:563
 msgid "Allow JPEG compression:"
-msgstr "JPEG compressie toestaan:"
+msgstr "JPEG-compressie toestaan:"
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1070
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1081
 msgid "Alt"
-msgstr ""
+msgstr "Alt"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:648
 msgid "Authentication"
@@ -52,7 +61,7 @@
 
 #: /home/ossman/devel/tigervnc/vncviewer/UserDialog.cxx:89
 msgid "Authentication cancelled"
-msgstr "Authenticatie geannuleerd"
+msgstr "Authenticatie is geannuleerd"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:437
 msgid "Auto select"
@@ -61,11 +70,11 @@
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:651
 #, c-format
 msgid "Bad Name/Value pair on line: %d in file: %s"
-msgstr ""
+msgstr "Ongeldig naam-waardepaar op regel %d in bestand %s"
 
-#: /home/ossman/devel/tigervnc/vncviewer/Win32PixelBuffer.cxx:92
+#: /home/ossman/devel/tigervnc/vncviewer/Win32PixelBuffer.cxx:91
 msgid "BitBlt failed"
-msgstr ""
+msgstr "### BitBlt is mislukt"
 
 #: /home/ossman/devel/tigervnc/vncviewer/ServerDialog.cxx:91
 #: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:221
@@ -75,7 +84,7 @@
 
 #: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:116
 msgid "CleanupSignalHandler called"
-msgstr ""
+msgstr "### CleanupSignalHandler is aangeroepen"
 
 #: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:222
 msgid "Close"
@@ -83,105 +92,109 @@
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:499
 msgid "Color level"
-msgstr "Kleur diepte"
+msgstr "Kleurdiepte"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:421
-#, fuzzy
 msgid "Compression"
-msgstr "SSH compressie"
+msgstr "Compressie"
 
 #: /home/ossman/devel/tigervnc/vncviewer/ServerDialog.cxx:96
 msgid "Connect"
 msgstr "Verbinden"
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1085
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1096
 msgid "Connection info..."
-msgstr "Connectie info..."
+msgstr "Verbindingsinfo..."
 
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:362
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:404
 #, c-format
-msgid ""
-"Could not convert the parameter-name %s to wchar_t* when reading from the "
-"Registry, the buffersize is to small."
+msgid "Could not convert the parameter-name %s to wchar_t* when reading from the Registry, the buffersize is to small."
 msgstr ""
 
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:302
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:340
 #, c-format
-msgid ""
-"Could not convert the parameter-name %s to wchar_t* when writing to the "
-"Registry, the buffersize is to small."
+msgid "Could not convert the parameter-name %s to wchar_t* when writing to the Registry, the buffersize is to small."
 msgstr ""
 
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:318
 #, c-format
-msgid ""
-"Could not convert the parameter-value %s to wchar_t* when writing to the "
-"Registry, the buffersize is to small."
+msgid "Could not convert the parameter-value %s to wchar_t* when writing to the Registry, the buffersize is to small."
 msgstr ""
 
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:381
 #, c-format
-msgid ""
-"Could not convert the parameter-value for %s to utf8 char* when reading from "
-"the Registry, the buffer dest is to small."
+msgid "Could not convert the parameter-value for %s to utf8 char* when reading from the Registry, the buffer dest is to small."
 msgstr ""
 
 #: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:256
 #, c-format
 msgid "Could not create VNC home directory: %s."
-msgstr "Kon de directory VNC home: %s niet aanmaken"
+msgstr "Kan de VNC-thuismap niet aanmaken: %s."
 
 #: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:251
 msgid "Could not create VNC home directory: can't obtain home directory path."
-msgstr ""
-"Kon de directory VNC home niet aanmaken: kan geen informatie vinden over "
-"home directory pad."
+msgstr "Kan de VNC-thuismap niet aanmaken: kan pad van thuismap niet verkrijgen."
+
+#: /home/ossman/devel/tigervnc/vncviewer/OSXPixelBuffer.cxx:58
+msgid "Could not create framebuffer bitmap"
+msgstr "Kan framebuffer-bitkaart niet aanmaken"
+
+#: /home/ossman/devel/tigervnc/vncviewer/OSXPixelBuffer.cxx:52
+msgid "Could not create framebuffer device"
+msgstr "Kan framebuffer-apparaat niet aanmaken"
+
+#: /home/ossman/devel/tigervnc/vncviewer/X11PixelBuffer.cxx:107
+msgid "Could not create framebuffer image"
+msgstr "Kan framebuffer-afbeelding niet aanmaken"
 
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:310
 #, c-format
 msgid "Could not encode the parameter-value %s when writing to the Registry."
-msgstr ""
+msgstr "Kan parameterwaarde %s niet coderen tijdens schrijven naar de Registry."
 
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:613
 #, c-format
-msgid ""
-"Could not read the line(%d) in the configuration file,the buffersize is to "
-"small."
+msgid "Could not read the line(%d) in the configuration file,the buffersize is to 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 ""
+msgstr "### CreateCompatibleDC is mislukt"
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1068
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1079
 msgid "Ctrl"
-msgstr ""
+msgstr "Ctrl"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:550
 msgid "Custom compression level:"
-msgstr "Handmatige compressie niveau's:"
+msgstr "Aangepast compressieniveau:"
 
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:283
-msgid ""
-"Decoding: The size of the buffer dest is to small, it needs to be 1 byte "
-"bigger."
+msgid "Decoding: The size of the buffer dest is to small, it needs to be 1 byte bigger."
 msgstr ""
 
 #: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:172
 #, c-format
 msgid "Desktop name: %.80s"
-msgstr ""
+msgstr "Bureaubladnaam: %.80s"
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1088
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1099
 msgid "Dismiss menu"
 msgstr "Menu verlaten"
 
+#: /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
-#, fuzzy
 msgid "Enable full-screen mode over all monitors"
-msgstr "Activeer volledige full screen modus voor alle beeldschermen"
+msgstr "Volledigscherm-modus over alle beeldschermen inschakelen"
 
 #: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:469
 msgid "Enabling continuous updates"
@@ -189,28 +202,22 @@
 
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:200
 #, c-format
-msgid ""
-"Encoding backslash: The size of the buffer dest is to small, it needs to be "
-"more than %d bytes bigger."
+msgid "Encoding backslash: The size of the buffer dest is to small, it needs to be more than %d bytes bigger."
 msgstr ""
 
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:214
 #, c-format
-msgid ""
-"Encoding escape sequence: The size of the buffer dest is to small, it needs "
-"to be more than %d bytes bigger."
+msgid "Encoding escape sequence: The size of the buffer dest is to small, it needs to be more than %d bytes bigger."
 msgstr ""
 
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:234
 #, c-format
-msgid ""
-"Encoding normal character: The size of the buffer dest is to small, it needs "
-"to be more than %d bytes bigger."
+msgid "Encoding normal character: The size of the buffer dest is to small, it needs to be more than %d bytes bigger."
 msgstr ""
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:595
 msgid "Encryption"
-msgstr "Encryptie"
+msgstr "Versleuteling"
 
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:503
 #, c-format
@@ -248,78 +255,54 @@
 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 ""
+msgstr "Viewer verlaten"
 
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:588
-#, fuzzy
 msgid "Failed to read configuration file, can't obtain home directory path."
-msgstr ""
-"Kon de directory VNC home niet aanmaken: kan geen informatie vinden over "
-"home directory pad."
+msgstr "Lezen van configuratiebestand is mislukt; kan pad van thuismap niet verkrijgen."
 
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:602
 #, c-format
 msgid "Failed to read configuration file, can't open %s"
-msgstr ""
+msgstr "Lezen van configuratiebestand is mislukt; kan %s niet openen"
 
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:621
 #, c-format
 msgid "Failed to read line %d in file %s"
-msgstr ""
+msgstr "Lezen van regel %d in bestand %s is mislukt"
 
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:528
-#, fuzzy
 msgid "Failed to write configuration file, can't obtain home directory path."
-msgstr ""
-"Kon de directory VNC home niet aanmaken: kan geen informatie vinden over "
-"home directory pad."
+msgstr "Schrijven van configuratiebestand is mislukt; kan pad van thuismap niet verkrijgen."
 
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:542
 #, c-format
 msgid "Failed to write configuration file, can't open %s"
-msgstr ""
+msgstr "Schrijven van configuratiebestand is mislukt; kan %s niet openen"
 
 #: /home/ossman/devel/tigervnc/vncviewer/DesktopWindow.cxx:526
 #: /home/ossman/devel/tigervnc/vncviewer/DesktopWindow.cxx:538
 #: /home/ossman/devel/tigervnc/vncviewer/DesktopWindow.cxx:551
 msgid "Failure grabbing keyboard"
-msgstr "Mislukt toetsenbord te pakken"
+msgstr "Het pakken van het toetsenbord is mislukt"
 
 #: /home/ossman/devel/tigervnc/vncviewer/DesktopWindow.cxx:563
 msgid "Failure grabbing mouse"
-msgstr "Fout bij muis ophalen"
+msgstr "Het pakken van de muis is mislukt"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:512
 msgid "Full (all available colors)"
 msgstr "Alles (alle beschikbare kleuren)"
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1059
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1070
 msgid "Full screen"
 msgstr "Volledig scherm"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:770
-#, fuzzy
 msgid "Full-screen mode"
-msgstr "Volledig scherm modus"
+msgstr "Volledigscherm-modus"
 
 #: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:230
 msgid "Hide"
@@ -332,15 +315,15 @@
 #: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:177
 #, c-format
 msgid "Host: %.80s port: %d"
-msgstr ""
+msgstr "Host: %.80s poort: %d"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:690
 msgid "Input"
-msgstr ""
+msgstr "Invoer"
 
 #: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:510
 msgid "Internal FLTK error. Exiting."
-msgstr "Interne FLTK fout. Bezig met afsluiten"
+msgstr "Interne FLTK-fout.  Bezig met afsluiten."
 
 #: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:384
 msgid "Invalid SetColourMapEntries from server!"
@@ -353,16 +336,16 @@
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:708
 #, c-format
 msgid "Invalid parameter name on line: %d in file: %s"
-msgstr ""
+msgstr "Ongeldige parameternaam op regel %d in bestand %s"
 
-#: /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 ""
 
 #: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:204
-#, fuzzy, c-format
+#, c-format
 msgid "Last used encoding: %s"
-msgstr "encoding %s wordt nu gebruikt"
+msgstr "Laatst gebruikte codering: %s"
 
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:631
 #, c-format
@@ -388,59 +371,58 @@
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:526
 msgid "Low (64 colors)"
-msgstr "Laag (64 kleuren)"
+msgstr "laag (64 kleuren)"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:519
 msgid "Medium (256 colors)"
-msgstr "Medium (256 kleuren)"
+msgstr "medium (256 kleuren)"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:725
-#, fuzzy
 msgid "Menu key"
-msgstr "Popup menutoets"
+msgstr "Menutoets"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:791
 msgid "Misc."
 msgstr "Overige"
 
-#: /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 "Meerdere karakters opgegeven voor toetscode %d (0x%04x): '%s'"
+msgstr "Meerdere tekens opgegeven voor toetscode %d (0x%04x): '%s'"
 
 #: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:218
 msgid "No"
 msgstr "Nee"
 
-#: /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 ""
+msgstr "Geen scancode voor uitgebreide virtuele toets 0x%02x"
 
-#: /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 ""
+msgstr "Geen scancode voor virtuele toets 0x%02x"
 
-#: /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 ""
+msgstr "Geen symbool voor uitgebreide virtuele toets 0x%02x"
 
-#: /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 ""
+msgstr "Geen symbool voor toetscode %d (in de huidige toestand)"
 
-#: /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 ""
+msgstr "Geen symbool voor toetscode 0x%02x (in de huidige toestand)"
 
-#: /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 ""
+msgstr "Geen symbool voor virtuele toets 0x%02x"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:606
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:659
@@ -448,24 +430,35 @@
 msgid "None"
 msgstr "Geen"
 
+#: /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 "Onvoldoende geheugen beschikbaar voor framebuffer"
+
 #: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:220
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:88
 msgid "OK"
 msgstr "OK"
 
+#: /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 "Openen van het wachtwoord bestand mislukt"
+msgstr "Openen van wachtwoordbestand is mislukt"
 
-#: /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 "Opties..."
 
 #: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:463
 #: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:464
+#, fuzzy
 msgid "Parameters -listen and -via are incompatible"
-msgstr ""
+msgstr "de opties '-listen' en '-via' gaan niet samen"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:722
 msgid "Pass system keys directly to server (full screen)"
@@ -478,51 +471,50 @@
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:625
 msgid "Path to X509 CA certificate"
-msgstr "Pad naar X509 CA certificaat"
+msgstr "Pad naar X509 CA-certificaat"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:632
 msgid "Path to X509 CRL file"
-msgstr "Pad naar X509 CRL bestand"
+msgstr "Pad naar X509 CRL-bestand"
 
 #: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:188
-#, fuzzy, c-format
+#, c-format
 msgid "Pixel format: %s"
-msgstr "Pixel formaat %s wordt nu gebruikt"
+msgstr "Pixel-indeling: %s"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:449
 msgid "Preferred encoding"
-msgstr "Aanbevolen codering"
+msgstr "Voorkeurscodering"
 
 #: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:214
 #, c-format
 msgid "Protocol version: %d.%d"
-msgstr ""
+msgstr "Protocolversie: %d.%d"
 
 #: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:233
 msgid "Quit"
 msgstr "Afsluiten"
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1082
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1093
 msgid "Refresh screen"
-msgstr ""
+msgstr "Scherm verversen"
 
 #: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:199
-#, fuzzy, c-format
+#, c-format
 msgid "Requested encoding: %s"
-msgstr "Aanbevolen codering"
+msgstr "Gevraagde codering: %s"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:749
-#, fuzzy
 msgid "Resize remote session on connect"
-msgstr "Wijzig externe sessie naar het lokale venster"
+msgstr "Grootte van gindse sessie aanpassen bij verbinden"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:762
 msgid "Resize remote session to the local window"
-msgstr "Wijzig externe sessie naar het lokale venster"
+msgstr "Gindse sessie aan het lokale venster aanpassen"
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1062
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1073
 msgid "Resize window to session"
-msgstr "Wijzig venster naar sessie"
+msgstr "Venster aan sessie aanpassen"
 
 #: /home/ossman/devel/tigervnc/vncviewer/ServerDialog.cxx:74
 msgid "Save As..."
@@ -539,37 +531,37 @@
 #: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:219
 #, c-format
 msgid "Security method: %s"
-msgstr ""
+msgstr "Beveiligingsmethode: %s"
 
-#: /home/ossman/devel/tigervnc/vncviewer/Win32PixelBuffer.cxx:83
+#: /home/ossman/devel/tigervnc/vncviewer/Win32PixelBuffer.cxx:82
 msgid "SelectObject failed"
-msgstr ""
+msgstr "### SelectObject is mislukt"
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1075
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1086
 #, c-format
 msgid "Send %s"
-msgstr "Stuur %s"
+msgstr "%s zenden"
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1080
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1091
 msgid "Send Ctrl-Alt-Del"
-msgstr "Stuur Ctrl-Alt-Del"
+msgstr "Ctrl-Alt-Del zenden"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:710
 msgid "Send clipboard to server"
-msgstr ""
+msgstr "Klembord naar server zenden"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:716
 msgid "Send primary selection and cut buffer as clipboard"
-msgstr ""
+msgstr "Hoofdselectie en knipbuffer als klembord verzenden"
 
 #: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:237
 msgid "Services"
-msgstr "Services"
+msgstr "Diensten"
 
 #: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:319
 #, c-format
 msgid "SetDesktopSize failed: %d"
-msgstr "SetDesktopSize mislukt: %d"
+msgstr "### SetDesktopSize is mislukt: %d"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:799
 msgid "Shared (don't disconnect other viewers)"
@@ -577,24 +569,24 @@
 
 #: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:239
 msgid "Show All"
-msgstr "Alles alten zien"
+msgstr "Alles tonen"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:805
 msgid "Show dot when no cursor"
-msgstr ""
+msgstr "Punt tonen als er geen cursor is"
 
 #: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:182
 #, c-format
 msgid "Size: %d x %d"
-msgstr ""
+msgstr "Grootte: %d x %d"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:665
 msgid "Standard VNC (insecure without encryption)"
-msgstr "Standaard VNC (onveilig zonder encryptie)"
+msgstr "Standaard VNC (onveilig zonder versleuteling)"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:618
 msgid "TLS with X509 certificates"
-msgstr "TLS met X509 certificaten"
+msgstr "TLS met X509-certificaten"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:612
 msgid "TLS with anonymous certificates"
@@ -626,7 +618,7 @@
 
 #: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:210
 msgid "TigerVNC Viewer"
-msgstr ""
+msgstr "TigerVNC-viewer"
 
 #: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:80
 #, c-format
@@ -637,36 +629,40 @@
 "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 "Onbekende FLTK toetscode %d (0x%04x)"
+msgstr "Onbekende FLTK-toetscode %d (0x%04x)"
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:878
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:889
 #, c-format
 msgid "Unknown decimal separator: '%s'"
 msgstr "Onbekend decimaal scheidingsteken: '%s'"
 
 #: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:271
-#, fuzzy, c-format
+#, c-format
 msgid "Unknown escape sequence at character %d"
-msgstr "Onbekend decimaal scheidingsteken: '%s'"
+msgstr "Onbekende stuurcodereeks bij teken %d"
 
 #: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:430
 #: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:437
-#, fuzzy
 msgid "Unknown rect encoding"
-msgstr "encoding %s wordt nu gebruikt"
+msgstr "Onbekende rect-codering"
 
 #: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:429
 #: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:436
 #, c-format
 msgid "Unknown rect encoding %d"
-msgstr ""
+msgstr "Onbekende rect-codering %d"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:671
 msgid "Username and password (insecure without encryption)"
-msgstr "Gebruikersnaam en wachtwoord (onveilig zonder encryptie)"
+msgstr "Gebruikersnaam en wachtwoord (onveilig zonder versleuteling)"
 
 #: /home/ossman/devel/tigervnc/vncviewer/UserDialog.cxx:99
 msgid "Username:"
@@ -675,9 +671,10 @@
 #: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:573
 #, c-format
 msgid "Using %s encoding"
-msgstr "encoding %s wordt nu gebruikt"
+msgstr "Codering %s wordt gebruikt"
 
-#: /home/ossman/devel/tigervnc/vncviewer/X11PixelBuffer.cxx:80
+# FIXME: what is filled in for %s?
+#: /home/ossman/devel/tigervnc/vncviewer/X11PixelBuffer.cxx:79
 #, c-format
 msgid "Using default colormap and visual, %sdepth %d."
 msgstr ""
@@ -685,39 +682,41 @@
 #: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:620
 #, c-format
 msgid "Using pixel format %s"
-msgstr "Pixel formaat %s wordt nu gebruikt"
+msgstr "Pixel-indeling %s wordt gebruikt"
+
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:457
+msgid "Using platform independent framebuffer"
+msgstr "Platform-onafhankelijk framebuffer wordt gebruikt"
 
 #: /home/ossman/devel/tigervnc/vncviewer/ServerDialog.cxx:42
 msgid "VNC Viewer: Connection Details"
-msgstr "VNC Viewer: Connectie Details"
+msgstr "VNC-viewer: Verbindingsdetails"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:57
-#, fuzzy
 msgid "VNC Viewer: Connection Options"
-msgstr "VNC Viewer: Connectie Details"
+msgstr "VNC-viewer: Verbindingsopties"
 
 #: /home/ossman/devel/tigervnc/vncviewer/UserDialog.cxx:86
 #: /home/ossman/devel/tigervnc/vncviewer/UserDialog.cxx:96
 msgid "VNC authentication"
-msgstr "VNC authenticatie"
+msgstr "VNC-authenticatie"
 
-#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1176
-#, fuzzy
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1187
 msgid "VNC connection info"
-msgstr "Connectie info..."
+msgstr "VNC-verbindingsinfo"
 
 #: /home/ossman/devel/tigervnc/vncviewer/ServerDialog.cxx:49
 #: /home/ossman/devel/tigervnc/vncviewer/ServerDialog.cxx:54
 msgid "VNC server:"
-msgstr "VNC server:"
+msgstr "VNC-server:"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:533
 msgid "Very low (8 colors)"
-msgstr "Heel laag (8 kleuren)"
+msgstr "heel laag (8 kleuren)"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:698
 msgid "View only (ignore mouse and keyboard)"
-msgstr ""
+msgstr "Alleen kijken (muis en toetsenbord negeren)"
 
 #: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:219
 msgid "Yes"
@@ -726,7 +725,7 @@
 #: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:111
 #, c-format
 msgid "connected to host %s port %d"
-msgstr "Verbinden met host %s poort %d"
+msgstr "verbonden met host %s poort %d"
 
 #: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:563
 msgid "disabled"
@@ -738,15 +737,15 @@
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:556
 msgid "level (1=fast, 6=best [4-6 are rarely useful])"
-msgstr "level (1=snel, 6=best [4-6 zijn zelden bruikbaar])"
+msgstr "niveau (1=snel, 6=best [4-6 zijn zelden nuttig])"
 
 #: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:569
 msgid "quality (0=poor, 9=best)"
 msgstr "kwaliteit (0=slecht, 9=best)"
 
-#: /home/ossman/devel/tigervnc/vncviewer/Win32PixelBuffer.cxx:63
+#: /home/ossman/devel/tigervnc/vncviewer/Win32PixelBuffer.cxx:62
 msgid "unable to create DIB section"
-msgstr ""
+msgstr "kan geen DIB-sectie aanmaken"
 
 #, fuzzy
 #~ msgid ""
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/po/uk.po b/po/uk.po
new file mode 100644
index 0000000..731859f
--- /dev/null
+++ b/po/uk.po
@@ -0,0 +1,753 @@
+# Ukrainian translation of tigervnc
+# Copyright (C) 2014 the TigerVNC Team (msgids)
+# This file is distributed under the same license as the tigervnc package.
+#
+# Yuri Chornoivan <yurchor@ukr.net>, 2014.
+msgid ""
+msgstr ""
+"Project-Id-Version: tigervnc 1.3.90\n"
+"Report-Msgid-Bugs-To: tigervnc-devel@googlegroups.com\n"
+"POT-Creation-Date: 2014-11-19 12:46+0000\n"
+"PO-Revision-Date: 2014-11-22 10:05+0200\n"
+"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
+"Language-Team: Ukrainian <translation-team-uk@lists.sourceforge.net>\n"
+"Language: uk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"X-Generator: Lokalize 1.5\n"
+
+#: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:194
+#, c-format
+msgid "(server default %s)"
+msgstr "(типовий для сервера %s)"
+
+#: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:227
+msgid "About"
+msgstr "Про програму"
+
+#: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:103
+msgid "About TigerVNC Viewer"
+msgstr "Про засіб перегляду TigerVNC"
+
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1097
+msgid "About TigerVNC viewer..."
+msgstr "Про засіб перегляду TigerVNC…"
+
+#: /home/ossman/devel/tigervnc/vncviewer/ServerDialog.cxx:86
+msgid "About..."
+msgstr "Про програму…"
+
+#: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:704
+msgid "Accept clipboard from server"
+msgstr "Приймати вміст буфера з сервера"
+
+#: /home/ossman/devel/tigervnc/vncviewer/DesktopWindow.cxx:327
+msgid "Adjusting window size to avoid accidental full screen request"
+msgstr "Коригувати розміри вікна, щоб уникнути випадкового запиту щодо переходу у повноекранний режим"
+
+#: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:563
+msgid "Allow JPEG compression:"
+msgstr "Дозволити стискання JPEG:"
+
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1081
+msgid "Alt"
+msgstr "Alt"
+
+#: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:648
+msgid "Authentication"
+msgstr "Розпізнавання"
+
+#: /home/ossman/devel/tigervnc/vncviewer/UserDialog.cxx:89
+msgid "Authentication cancelled"
+msgstr "Розпізнавання скасовано"
+
+#: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:437
+msgid "Auto select"
+msgstr "Автовибір"
+
+#: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:651
+#, c-format
+msgid "Bad Name/Value pair on line: %d in file: %s"
+msgstr "Помилкова пара назва/значення у рядку %d файла %s"
+
+#: /home/ossman/devel/tigervnc/vncviewer/Win32PixelBuffer.cxx:91
+msgid "BitBlt failed"
+msgstr "Помилка BitBlt"
+
+#: /home/ossman/devel/tigervnc/vncviewer/ServerDialog.cxx:91
+#: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:221
+#: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:83
+msgid "Cancel"
+msgstr "Скасувати"
+
+#: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:116
+msgid "CleanupSignalHandler called"
+msgstr "Викликано CleanupSignalHandler"
+
+#: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:222
+msgid "Close"
+msgstr "Закрити"
+
+#: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:499
+msgid "Color level"
+msgstr "Рівень відтворення кольору"
+
+#: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:421
+msgid "Compression"
+msgstr "Стискання"
+
+#: /home/ossman/devel/tigervnc/vncviewer/ServerDialog.cxx:96
+msgid "Connect"
+msgstr "З'єднатися"
+
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1096
+msgid "Connection info..."
+msgstr "Дані щодо з’єднання…"
+
+#: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:362
+#: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:404
+#, c-format
+msgid "Could not convert the parameter-name %s to wchar_t* when reading from the Registry, the buffersize is to small."
+msgstr "Не вдалося перетворити назву параметра %s на wchar_t* під час читання даних з реєстру. Розмір буфера є надто малим."
+
+#: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:302
+#: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:340
+#, c-format
+msgid "Could not convert the parameter-name %s to wchar_t* when writing to the Registry, the buffersize is to small."
+msgstr "Не вдалося перетворити назву параметра %s на wchar_t* під час запису даних до реєстру. Розмір буфера є надто малим."
+
+#: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:318
+#, c-format
+msgid "Could not convert the parameter-value %s to wchar_t* when writing to the Registry, the buffersize is to small."
+msgstr "Не вдалося перетворити значення параметра %s на wchar_t* під час запису даних до реєстру. Розмір буфера є надто малим."
+
+#: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:381
+#, c-format
+msgid "Could not convert the parameter-value for %s to utf8 char* when reading from the Registry, the buffer dest is to small."
+msgstr "Не вдалося перетворити значення параметра %s на utf8 char* під час читання з реєстру. Буфер призначення є надто малим."
+
+#: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:256
+#, c-format
+msgid "Could not create VNC home directory: %s."
+msgstr "Не вдалося створити домашній каталог VNC: %s."
+
+#: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:251
+msgid "Could not create VNC home directory: can't obtain home directory path."
+msgstr "Не вдалося створити домашній каталог VNC: не вдалося отримати шлях до домашнього каталогу."
+
+#: /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."
+msgstr "Не вдалося виконати кодування значення параметра %s під час запису до реєстру."
+
+#: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:613
+#, c-format
+msgid "Could not read the line(%d) in the configuration file,the buffersize is to small."
+msgstr "Не вдалося прочитати рядок %d у файлі налаштувань. Розмір буфера є надто малим."
+
+#: /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 "Помилка CreateCompatibleDC"
+
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1079
+msgid "Ctrl"
+msgstr "Ctrl"
+
+#: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:550
+msgid "Custom compression level:"
+msgstr "Нетиповий рівень стискання:"
+
+#: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:283
+msgid "Decoding: The size of the buffer dest is to small, it needs to be 1 byte bigger."
+msgstr "Декодування: розмір буфера призначення є надто малим. Його слід збільшити на 1 байт."
+
+#: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:172
+#, c-format
+msgid "Desktop name: %.80s"
+msgstr "Назва робочої станції: %.80s"
+
+#: /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 "Увімкнути повноекранний режим на усіх моніторах"
+
+#: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:469
+msgid "Enabling continuous updates"
+msgstr "Увімкнути неперервне оновлення"
+
+#: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:200
+#, c-format
+msgid "Encoding backslash: The size of the buffer dest is to small, it needs to be more than %d bytes bigger."
+msgstr "Кодування зворотної похилої риски: розмір буфера призначення є надто малим. Його слід збільшити на понад %d байтів."
+
+#: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:214
+#, c-format
+msgid "Encoding escape sequence: The size of the buffer dest is to small, it needs to be more than %d bytes bigger."
+msgstr "Кодування екранованої послідовності: розмір буфера призначення є надто малим. Його слід збільшити на понад %d байтів."
+
+#: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:234
+#, c-format
+msgid "Encoding normal character: The size of the buffer dest is to small, it needs to be more than %d bytes bigger."
+msgstr "Кодування звичайного символу: розмір буфера призначення є надто малим. Його слід збільшити на понад %d байтів."
+
+#: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:595
+msgid "Encryption"
+msgstr "Шифрування"
+
+#: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:503
+#, c-format
+msgid "Error(%d) closing key:  Software\\TigerVNC\\vncviewer"
+msgstr "Помилка (%d) закриття ключа:  Software\\TigerVNC\\vncviewer"
+
+#: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:455
+#, c-format
+msgid "Error(%d) closing key: Software\\TigerVNC\\vncviewer"
+msgstr "Помилка (%d) закриття ключа: Software\\TigerVNC\\vncviewer"
+
+#: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:434
+#, c-format
+msgid "Error(%d) creating key: Software\\TigerVNC\\vncviewer"
+msgstr "Помилка (%d) під час створення ключа: Software\\TigerVNC\\vncviewer"
+
+#: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:471
+#, c-format
+msgid "Error(%d) opening key: Software\\TigerVNC\\vncviewer"
+msgstr "Помилка (%d) під час відкриття ключа: Software\\TigerVNC\\vncviewer"
+
+#: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:373
+#: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:415
+#, c-format
+msgid "Error(%d) reading %s from Registry."
+msgstr "Помилка (%d) під час читання %s з реєстру."
+
+#: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:348
+#, c-format
+msgid "Error(%d) writing %d(REG_DWORD) to Registry."
+msgstr "Помилка (%d) під час запису %d(REG_DWORD) до реєстру."
+
+#: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:326
+#, c-format
+msgid "Error(%d) writing %s(REG_SZ) to Registry."
+msgstr "Помилка (%d) під час запису %s(REG_SZ) до реєстру."
+
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1067
+msgid "Exit viewer"
+msgstr "Вийти із засобу перегляду"
+
+#: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:588
+msgid "Failed to read configuration file, can't obtain home directory path."
+msgstr "Не вдалося прочитати файл налаштувань, оскільки не вдалося визначити шлях до домашнього каталогу."
+
+#: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:602
+#, c-format
+msgid "Failed to read configuration file, can't open %s"
+msgstr "Не вдалося прочитати файл налаштувань, оскільки не вдалося відкрити %s"
+
+#: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:621
+#, c-format
+msgid "Failed to read line %d in file %s"
+msgstr "Не вдалося прочитати рядок %d у файлі %s"
+
+#: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:528
+msgid "Failed to write configuration file, can't obtain home directory path."
+msgstr "Не вдалося записати файл налаштувань, оскільки не вдалося визначити шлях до домашнього каталогу."
+
+#: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:542
+#, c-format
+msgid "Failed to write configuration file, can't open %s"
+msgstr "Не вдалося записати файл налаштувань, оскільки не вдалося відкрити %s"
+
+#: /home/ossman/devel/tigervnc/vncviewer/DesktopWindow.cxx:526
+#: /home/ossman/devel/tigervnc/vncviewer/DesktopWindow.cxx:538
+#: /home/ossman/devel/tigervnc/vncviewer/DesktopWindow.cxx:551
+msgid "Failure grabbing keyboard"
+msgstr "Помилка під час спроби перехопити клавіатуру"
+
+#: /home/ossman/devel/tigervnc/vncviewer/DesktopWindow.cxx:563
+msgid "Failure grabbing mouse"
+msgstr "Помилка під час спроби перехопити мишу"
+
+#: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:512
+msgid "Full (all available colors)"
+msgstr "Повністю (усі доступні кольори)"
+
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1070
+msgid "Full screen"
+msgstr "На весь екран"
+
+#: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:770
+msgid "Full-screen mode"
+msgstr "Повноекранний режим"
+
+#: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:230
+msgid "Hide"
+msgstr "Сховати"
+
+#: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:238
+msgid "Hide Others"
+msgstr "Сховати решту"
+
+#: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:177
+#, c-format
+msgid "Host: %.80s port: %d"
+msgstr "Вузол: %.80s порт: %d"
+
+#: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:690
+msgid "Input"
+msgstr "Введення"
+
+#: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:510
+msgid "Internal FLTK error. Exiting."
+msgstr "Внутрішня помилка FLTK. Завершуємо роботу."
+
+#: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:384
+msgid "Invalid SetColourMapEntries from server!"
+msgstr "Некоректне значення SetColourMapEntries від сервера!"
+
+#: /home/ossman/devel/tigervnc/vncviewer/DesktopWindow.cxx:106
+msgid "Invalid geometry specified!"
+msgstr "Вказано некоректні геометричні параметри!"
+
+#: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:708
+#, c-format
+msgid "Invalid parameter name on line: %d in file: %s"
+msgstr "Некоректна назва параметра у рядку %d файла %s"
+
+#: /home/ossman/devel/tigervnc/vncviewer/DesktopWindow.cxx:805
+msgid "Invalid screen layout computed for resize request!"
+msgstr "Результати обчислення компонування вікна для запиту щодо зміни розмірів є некоректними!"
+
+#: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:204
+#, c-format
+msgid "Last used encoding: %s"
+msgstr "Останнє використане кодування: %s"
+
+#: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:631
+#, c-format
+msgid ""
+"Line 1 in file %s\n"
+"must contain the TigerVNC configuration file identifier string:\n"
+"\"%s\""
+msgstr ""
+"Рядок 1 у файлі %s\n"
+"має містити рядок ідентифікатор файла налаштувань TigerVNC:\n"
+"«%s»"
+
+#: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:209
+#, c-format
+msgid "Line speed estimate: %d kbit/s"
+msgstr "Оцінка швидкості лінії: %d кбіт/с"
+
+#: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:478
+#, c-format
+msgid "Listening on port %d\n"
+msgstr "Очікуємо на дані на порту %d\n"
+
+#: /home/ossman/devel/tigervnc/vncviewer/ServerDialog.cxx:69
+msgid "Load..."
+msgstr "Завантажити…"
+
+#: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:526
+msgid "Low (64 colors)"
+msgstr "Низький (64 кольори)"
+
+#: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:519
+msgid "Medium (256 colors)"
+msgstr "Середній (256 кольори)"
+
+#: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:725
+msgid "Menu key"
+msgstr "Клавіша меню"
+
+#: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:791
+msgid "Misc."
+msgstr "Інше"
+
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1037
+#, c-format
+msgid "Multiple characters given for key code %d (0x%04x): '%s'"
+msgstr "З клавішею з кодом %d (0x%04x) пов’язано декілька символів: «%s»"
+
+#: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:218
+msgid "No"
+msgstr "Ні"
+
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:691
+#, c-format
+msgid "No scan code for extended virtual key 0x%02x"
+msgstr "Немає коду сканування для віртуальної клавіші розширення 0x%02x"
+
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:693
+#, c-format
+msgid "No scan code for virtual key 0x%02x"
+msgstr "Немає коду сканування для віртуальної клавіші 0x%02x"
+
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:710
+#, c-format
+msgid "No symbol for extended virtual key 0x%02x"
+msgstr "Немає символу для віртуальної клавіші розширення 0x%02x"
+
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:776
+#, c-format
+msgid "No symbol for key code %d (in the current state)"
+msgstr "Немає символу для клавіші з кодом %d (у поточному стані)"
+
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:750
+#, c-format
+msgid "No symbol for key code 0x%02x (in the current state)"
+msgstr "Немає символу для клавіші з кодом 0x%02x (у поточному стані)"
+
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:712
+#, c-format
+msgid "No symbol for virtual key 0x%02x"
+msgstr "Немає символу для віртуальної клавіші 0x%02x"
+
+#: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:606
+#: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:659
+#: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:727
+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 "Передбачено підтримку лише дисплеїв з True Color"
+
+#: /home/ossman/devel/tigervnc/vncviewer/UserDialog.cxx:74
+msgid "Opening password file failed"
+msgstr "Спроба відкриття файла паролів зазнала невдачі"
+
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1095
+#: /home/ossman/devel/tigervnc/vncviewer/ServerDialog.cxx:64
+msgid "Options..."
+msgstr "Параметри…"
+
+#: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:463
+#: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:464
+msgid "Parameters -listen and -via are incompatible"
+msgstr "Параметри -listen і -via є несумісними"
+
+#: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:722
+msgid "Pass system keys directly to server (full screen)"
+msgstr "Передавати натискання системних клавіш безпосередньо до сервера (повноекранний режим)"
+
+#: /home/ossman/devel/tigervnc/vncviewer/UserDialog.cxx:87
+#: /home/ossman/devel/tigervnc/vncviewer/UserDialog.cxx:102
+msgid "Password:"
+msgstr "Пароль:"
+
+#: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:625
+msgid "Path to X509 CA certificate"
+msgstr "Шлях до сертифіката CA X509"
+
+#: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:632
+msgid "Path to X509 CRL file"
+msgstr "Шлях до файла CRL X509"
+
+#: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:188
+#, c-format
+msgid "Pixel format: %s"
+msgstr "Формат у пікселях: %s"
+
+#: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:449
+msgid "Preferred encoding"
+msgstr "Бажане кодування"
+
+#: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:214
+#, c-format
+msgid "Protocol version: %d.%d"
+msgstr "Версія протоколу: %d.%d"
+
+#: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:233
+msgid "Quit"
+msgstr "Вийти"
+
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1093
+msgid "Refresh screen"
+msgstr "Оновити вміст екрана"
+
+#: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:199
+#, c-format
+msgid "Requested encoding: %s"
+msgstr "Запит щодо кодування: %s"
+
+#: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:749
+msgid "Resize remote session on connect"
+msgstr "Змінювати розміри віддаленого сеансу під час з’єднання"
+
+#: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:762
+msgid "Resize remote session to the local window"
+msgstr "Змінювати розміри віддаленого сеансу відповідно до локального вікна"
+
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1073
+msgid "Resize window to session"
+msgstr "Змінити розміри вікна відповідно до сеансу"
+
+#: /home/ossman/devel/tigervnc/vncviewer/ServerDialog.cxx:74
+msgid "Save As..."
+msgstr "Зберегти як…"
+
+#: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:741
+msgid "Screen"
+msgstr "Екран"
+
+#: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:580
+msgid "Security"
+msgstr "Захист"
+
+#: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:219
+#, c-format
+msgid "Security method: %s"
+msgstr "Метод захисту: %s"
+
+#: /home/ossman/devel/tigervnc/vncviewer/Win32PixelBuffer.cxx:82
+msgid "SelectObject failed"
+msgstr "Помилка SelectObject"
+
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1086
+#, c-format
+msgid "Send %s"
+msgstr "Надіслати %s"
+
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1091
+msgid "Send Ctrl-Alt-Del"
+msgstr "Надіслати Ctrl-Alt-Del"
+
+#: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:710
+msgid "Send clipboard to server"
+msgstr "Надіслати вміст буфера обміну до сервера"
+
+#: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:716
+msgid "Send primary selection and cut buffer as clipboard"
+msgstr "Надіслати основне позначене і вирізати буфер до буфера обміну"
+
+#: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:237
+msgid "Services"
+msgstr "Служби"
+
+#: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:319
+#, c-format
+msgid "SetDesktopSize failed: %d"
+msgstr "Помилка SetDesktopSize: %d"
+
+#: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:799
+msgid "Shared (don't disconnect other viewers)"
+msgstr "Спільний (не від’єднувати інші засоби перегляду)"
+
+#: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:239
+msgid "Show All"
+msgstr "Показати всі"
+
+#: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:805
+msgid "Show dot when no cursor"
+msgstr "Показувати крапку, якщо немає курсора"
+
+#: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:182
+#, c-format
+msgid "Size: %d x %d"
+msgstr "Розмір: %d x %d"
+
+#: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:665
+msgid "Standard VNC (insecure without encryption)"
+msgstr "Стандартний VNC (без захисту і шифрування)"
+
+#: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:618
+msgid "TLS with X509 certificates"
+msgstr "TLS з сертифікатами X509"
+
+#: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:612
+msgid "TLS with anonymous certificates"
+msgstr "TLS із анонімними сертифікатами"
+
+#: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:448
+#: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:497
+#: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:561
+#: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:701
+#, c-format
+msgid "The parameterArray contains a object of a invalid type at line %d."
+msgstr "Змінна parameterArray містить об’єкт некоректного типу у рядку %d."
+
+#: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:664
+#: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:680
+#, c-format
+msgid "The value of the parameter %s on line %d in file %s is invalid."
+msgstr "Значення параметра %s у рядку %d файла %s є некоректним."
+
+#: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:539
+#, c-format
+msgid "Throughput %d kbit/s - changing to quality %d"
+msgstr "Пропускна здатність %d кбіт/с — змінюємо якість на %d"
+
+#: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:561
+#, c-format
+msgid "Throughput %d kbit/s - full color is now %s"
+msgstr "Пропускна здатність %d кбіт/с — змінюємо колірність на %s"
+
+#: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:210
+msgid "TigerVNC Viewer"
+msgstr "Засіб перегляду TigerVNC"
+
+#: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:80
+#, c-format
+msgid ""
+"TigerVNC Viewer %d-bit v%s\n"
+"Built on: %s\n"
+"Copyright (C) 1999-%d TigerVNC Team and many others (see README.txt)\n"
+"See http://www.tigervnc.org for information on TigerVNC."
+msgstr ""
+"Засіб перегляду TigerVNC, %d-бітовий, v%s\n"
+"Зібрано: %s\n"
+"Авторські права належать команді TigerVNC та багатьом іншим (див. файл README.txt), 1999–%d\n"
+"Докладніший опис TigerVNC можна знайти на http://www.tigervnc.org."
+
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:456
+#, c-format
+msgid "Unable to create platform specific framebuffer: %s"
+msgstr "Не вдалося створити специфічний для платформи буфер кадрів: %s"
+
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1015
+#, c-format
+msgid "Unknown FLTK key code %d (0x%04x)"
+msgstr "Невідомий код клавіші FLTK, %d (0x%04x)"
+
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:889
+#, c-format
+msgid "Unknown decimal separator: '%s'"
+msgstr "Невідомий десятковий роздільник: «%s»"
+
+#: /home/ossman/devel/tigervnc/vncviewer/parameters.cxx:271
+#, c-format
+msgid "Unknown escape sequence at character %d"
+msgstr "Невідома послідовність екранування на позиції %d"
+
+#: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:430
+#: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:437
+msgid "Unknown rect encoding"
+msgstr "Невідоме кодування rect"
+
+#: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:429
+#: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:436
+#, c-format
+msgid "Unknown rect encoding %d"
+msgstr "Невідоме кодування rect, %d"
+
+#: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:671
+msgid "Username and password (insecure without encryption)"
+msgstr "Ім’я користувача і пароль (без захисту і шифрування)"
+
+#: /home/ossman/devel/tigervnc/vncviewer/UserDialog.cxx:99
+msgid "Username:"
+msgstr "Користувач:"
+
+#: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:573
+#, c-format
+msgid "Using %s encoding"
+msgstr "Використовуємо кодування %s"
+
+#: /home/ossman/devel/tigervnc/vncviewer/X11PixelBuffer.cxx:79
+#, c-format
+msgid "Using default colormap and visual, %sdepth %d."
+msgstr "Використовуємо типову карту кольорів і відтворення, %sглибина %d."
+
+#: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:620
+#, c-format
+msgid "Using pixel format %s"
+msgstr "Використовуємо формат у пікселях %s"
+
+#: /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 "Засіб перегляду VNC: подробиці з’єднання"
+
+#: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:57
+msgid "VNC Viewer: Connection Options"
+msgstr "Засіб перегляду VNC: параметри з’єднання"
+
+#: /home/ossman/devel/tigervnc/vncviewer/UserDialog.cxx:86
+#: /home/ossman/devel/tigervnc/vncviewer/UserDialog.cxx:96
+msgid "VNC authentication"
+msgstr "Розпізнавання VNC"
+
+#: /home/ossman/devel/tigervnc/vncviewer/Viewport.cxx:1187
+msgid "VNC connection info"
+msgstr "Дані щодо з’єднання VNC"
+
+#: /home/ossman/devel/tigervnc/vncviewer/ServerDialog.cxx:49
+#: /home/ossman/devel/tigervnc/vncviewer/ServerDialog.cxx:54
+msgid "VNC server:"
+msgstr "Сервер VNC:"
+
+#: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:533
+msgid "Very low (8 colors)"
+msgstr "Дуже низький (8 кольорів)"
+
+#: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:698
+msgid "View only (ignore mouse and keyboard)"
+msgstr "Лише перегляд (ігнорувати сигнали від миші і клавіатури)"
+
+#: /home/ossman/devel/tigervnc/vncviewer/vncviewer.cxx:219
+msgid "Yes"
+msgstr "Так"
+
+#: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:111
+#, c-format
+msgid "connected to host %s port %d"
+msgstr "з’єднано з вузлом %s, порт %d"
+
+#: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:563
+msgid "disabled"
+msgstr "вимкнено"
+
+#: /home/ossman/devel/tigervnc/vncviewer/CConn.cxx:563
+msgid "enabled"
+msgstr "увімкнено"
+
+#: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:556
+msgid "level (1=fast, 6=best [4-6 are rarely useful])"
+msgstr "рівень (1=швидко, 6=найякісніше [4-6 використовувати не варто])"
+
+#: /home/ossman/devel/tigervnc/vncviewer/OptionsDialog.cxx:569
+msgid "quality (0=poor, 9=best)"
+msgstr "якість (0=найгірша, 9=найкраща)"
+
+#: /home/ossman/devel/tigervnc/vncviewer/Win32PixelBuffer.cxx:62
+msgid "unable to create DIB section"
+msgstr "не вдалося створити розділ DIB"
diff --git a/unix/vncpasswd/vncpasswd.cxx b/unix/vncpasswd/vncpasswd.cxx
index 7ba0b22..16c925e 100644
--- a/unix/vncpasswd/vncpasswd.cxx
+++ b/unix/vncpasswd/vncpasswd.cxx
@@ -81,6 +81,36 @@
   else return 1;
 }
 
+static ObfuscatedPasswd* readpassword() {
+  while (true) {
+    PlainPasswd passwd(getpassword("Password:"));
+    if (!passwd.buf) {
+      perror("getpassword error");
+      exit(1);
+    }
+    if (strlen(passwd.buf) < 6) {
+      if (strlen(passwd.buf) == 0) {
+        fprintf(stderr,"Password not changed\n");
+        exit(1);
+      }
+      fprintf(stderr,"Password must be at least 6 characters - try again\n");
+      continue;
+    }
+
+    PlainPasswd passwd2(getpassword("Verify:"));
+    if (!passwd2.buf) {
+      perror("getpass error");
+      exit(1);
+    }
+    if (strcmp(passwd.buf, passwd2.buf) != 0) {
+      fprintf(stderr,"Passwords don't match - try again\n");
+      continue;
+    }
+
+    return new ObfuscatedPasswd(passwd);
+  }
+}
+
 int main(int argc, char** argv)
 {
   prog = argv[0];
@@ -113,28 +143,13 @@
   }
 
   while (true) {
-    PlainPasswd passwd(getpassword("Password:"));
-    if (!passwd.buf) {
-      perror("getpassword error");
-      exit(1);
-    }   
-    if (strlen(passwd.buf) < 6) {
-      if (strlen(passwd.buf) == 0) {
-        fprintf(stderr,"Password not changed\n");
-        exit(1);
-      }
-      fprintf(stderr,"Password must be at least 6 characters - try again\n");
-      continue;
-    }
+    ObfuscatedPasswd* obfuscated = readpassword();
+    ObfuscatedPasswd* obfuscatedReadOnly = 0;
 
-    PlainPasswd passwd2(getpassword("Verify:"));
-    if (!passwd2.buf) {
-      perror("getpass error");
-      exit(1);
-    }   
-    if (strcmp(passwd.buf, passwd2.buf) != 0) {
-      fprintf(stderr,"Passwords don't match - try again\n");
-      continue;
+    fprintf(stderr, "Would you like to enter a view-only password (y/n)? ");
+    char yesno[3];
+    if (fgets(yesno, 3, stdin) != NULL && (yesno[0] == 'y' || yesno[0] == 'Y')) {
+      obfuscatedReadOnly = readpassword();
     }
 
     FILE* fp = fopen(fname,"w");
@@ -144,13 +159,18 @@
     }
     chmod(fname, S_IRUSR|S_IWUSR);
 
-    ObfuscatedPasswd obfuscated(passwd);
-
-    if (fwrite(obfuscated.buf, obfuscated.length, 1, fp) != 1) {
+    if (fwrite(obfuscated->buf, obfuscated->length, 1, fp) != 1) {
       fprintf(stderr,"Writing to %s failed\n",fname);
       exit(1);
     }
 
+    if (obfuscatedReadOnly) {
+      if (fwrite(obfuscatedReadOnly->buf, obfuscatedReadOnly->length, 1, fp) != 1) {
+        fprintf(stderr,"Writing to %s failed\n",fname);
+        exit(1);
+      }
+    }
+
     fclose(fp);
 
     return 0;
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/CConn.cxx b/vncviewer/CConn.cxx
index 23f07b4..cf4f31b 100644
--- a/vncviewer/CConn.cxx
+++ b/vncviewer/CConn.cxx
@@ -183,12 +183,15 @@
   strcat(infoText, scratch);
   strcat(infoText, "\n");
 
+  // TRANSLATORS: Will be filled in with a string describing the
+  // protocol pixel format in a fairly language neutral way
   cp.pf().print(pfStr, 100);
   snprintf(scratch, sizeof(scratch),
            _("Pixel format: %s"), pfStr);
   strcat(infoText, scratch);
   strcat(infoText, "\n");
 
+  // TRANSLATORS: Similar to the earlier "Pixel format" string
   serverPF.print(pfStr, 100);
   snprintf(scratch, sizeof(scratch),
            _("(server default %s)"), pfStr);
@@ -426,15 +429,16 @@
     lastServerEncoding = encoding;
 
   if (!Decoder::supported(encoding)) {
-    vlog.error(_("Unknown rect encoding %d"), encoding);
-    throw Exception(_("Unknown rect encoding"));
+    // TRANSLATORS: Refers to a VNC protocol encoding type
+    vlog.error(_("Unknown encoding %d"), encoding);
+    throw Exception(_("Unknown encoding"));
   }
 
   if (!decoders[encoding]) {
     decoders[encoding] = Decoder::createDecoder(encoding, this);
     if (!decoders[encoding]) {
-      vlog.error(_("Unknown rect encoding %d"), encoding);
-      throw Exception(_("Unknown rect encoding"));
+      vlog.error(_("Unknown encoding %d"), encoding);
+      throw Exception(_("Unknown encoding"));
     }
   }
   decoders[encoding]->readRect(r, desktop->getFramebuffer());
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()
diff --git a/vncviewer/X11PixelBuffer.cxx b/vncviewer/X11PixelBuffer.cxx
index a779427..7e89a60 100644
--- a/vncviewer/X11PixelBuffer.cxx
+++ b/vncviewer/X11PixelBuffer.cxx
@@ -56,6 +56,8 @@
     if (format[i].depth == fl_visual->depth) break;
 
   if (i == nformats)
+    // TRANSLATORS: "pixmap" is an X11 concept and may not be suitable
+    // to translate.
     throw rfb::Exception(_("Display lacks pixmap format for default depth"));
 
   switch (format[i].bits_per_pixel) {
@@ -65,6 +67,8 @@
     bpp = format[i].bits_per_pixel;
     break;
   default:
+    // TRANSLATORS: "pixmap" is an X11 concept and may not be suitable
+    // to translate.
     throw rfb::Exception(_("Couldn't find suitable pixmap format"));
   }
 
@@ -76,9 +80,7 @@
   if (!trueColour)
     throw rfb::Exception(_("Only true colour displays supported"));
 
-  vlog.info(_("Using default colormap and visual, %sdepth %d."),
-            (fl_visual->c_class == TrueColor) ? "TrueColor, " :
-            ((fl_visual->c_class == PseudoColor) ? "PseudoColor, " : ""),
+  vlog.info(_("Using default colormap and visual, TrueColor, depth %d."),
             fl_visual->depth);
 
   redShift   = ffs(fl_visual->red_mask)   - 1;
diff --git a/vncviewer/parameters.cxx b/vncviewer/parameters.cxx
index 9a16481..c975e99 100644
--- a/vncviewer/parameters.cxx
+++ b/vncviewer/parameters.cxx
@@ -43,6 +43,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <limits.h>
+#include <errno.h>
 
 #include "i18n.h"
 
@@ -142,9 +143,9 @@
 StringParameter via("via", "Gateway to tunnel via", "");
 #endif
 
-const char* IDENTIFIER_STRING = "TigerVNC Configuration file Version 1.0";
+static const char* IDENTIFIER_STRING = "TigerVNC Configuration file Version 1.0";
 
-VoidParameter* parameterArray[] = {
+static VoidParameter* parameterArray[] = {
 #ifdef HAVE_GNUTLS
   &CSecurityTLS::X509CA,
   &CSecurityTLS::X509CRL,
@@ -184,7 +185,7 @@
 } replaceMap[] = {'\n', 'n',
                   '\r', 'r'};
 
-bool encodeValue(const char* val, char* dest, size_t destSize) {
+static bool encodeValue(const char* val, char* dest, size_t destSize) {
 
   bool normalCharacter = true;
   size_t pos = 0;
@@ -196,12 +197,8 @@
 
       strncpy(dest+pos, "\\\\", 2);
       pos++;
-      if (pos >= destSize) {
-        vlog.error(_("Encoding backslash: The size of the buffer dest "
-                     "is to small, it needs to be more than %d bytes bigger."),
-                     (destSize - 1 - i));
+      if (pos >= destSize)
         return false;
-      }
 
     } else {
 
@@ -210,12 +207,8 @@
         if (val[i] == replaceMap[j].first) {
           dest[pos] = '\\';
           pos++;
-          if (pos >= destSize) {
-            vlog.error(_("Encoding escape sequence: The size of the buffer "
-                         "dest is to small, it needs to be more than %d bytes "
-                         "bigger."), (destSize - 1 - i));
+          if (pos >= destSize)
             return false;
-          }
 
           dest[pos] = replaceMap[j].second;
           normalCharacter = false;
@@ -230,13 +223,8 @@
     normalCharacter = true; // Reset for next loop
 
     pos++;
-    if (pos >= destSize) {
-      vlog.error(_("Encoding normal character: The size of the buffer dest "
-                   "is to small, it needs to be more than %d bytes bigger."),
-                   (destSize - 1 - i));
+    if (pos >= destSize)
       return false;
-    }
-
   }
 
   dest[pos] = '\0';
@@ -244,7 +232,7 @@
 }
 
 
-bool decodeValue(const char* val, char* dest, size_t destSize) {
+static bool decodeValue(const char* val, char* dest, size_t destSize) {
 
   size_t pos = 0;
   bool escapedCharacter = false;
@@ -268,7 +256,6 @@
           dest[pos] = val[i];
           i++;
         } else {
-          vlog.error(_("Unknown escape sequence at character %d"), i);
           return false;
         }
       }
@@ -280,8 +267,6 @@
     escapedCharacter = false; // Reset for next loop
     pos++;
     if (pos >= destSize) {
-      vlog.error(_("Decoding: The size of the buffer dest is to small, "
-                   "it needs to be 1 byte bigger."));
       return false;
     }
   }
@@ -292,44 +277,40 @@
 
 
 #ifdef _WIN32
-void setKeyString(const char *_name, const char *_value, HKEY* hKey) {
+static void setKeyString(const char *_name, const char *_value, HKEY* hKey) {
   
   const DWORD buffersize = 256;
 
   wchar_t name[buffersize];
   unsigned size = fl_utf8towc(_name, strlen(_name)+1, name, buffersize);
   if (size >= buffersize) {
-    vlog.error(_("Could not convert the parameter-name %s to wchar_t* when "
-                 "writing to the Registry, the buffersize is to small."),
-                 _name);
+    vlog.error(_("The name of the parameter %s was too large to write to the registry"), _name);
     return;
   }
 
   char encodingBuffer[buffersize];
   if (!encodeValue(_value, encodingBuffer, buffersize)) {
-    vlog.error(_("Could not encode the parameter-value %s when "
-                 "writing to the Registry."), _value);
+    vlog.error(_("The parameter %s was too large to write to the registry"), _name);
     return;
   }
 
   wchar_t value[buffersize];
   size = fl_utf8towc(encodingBuffer, strlen(encodingBuffer)+1, value, buffersize);
   if (size >= buffersize) {
-    vlog.error(_("Could not convert the parameter-value %s to wchar_t* when "
-                 "writing to the Registry, the buffersize is to small."),
-                 _value);
+    vlog.error(_("The parameter %s was too large to write to the registry"), _name);
     return;
   }
 
   LONG res = RegSetValueExW(*hKey, name, 0, REG_SZ, (BYTE*)&value, (wcslen(value)+1)*2);
   if (res != ERROR_SUCCESS) {
-    vlog.error(_("Error(%d) writing %s(REG_SZ) to Registry."), res, _value);
+    vlog.error(_("Failed to write parameter %s of type %s to the registry: %d"),
+               _name, "REG_SZ", res);
     return;
   }
 }
 
 
-void setKeyInt(const char *_name, const int _value, HKEY* hKey) {
+static void setKeyInt(const char *_name, const int _value, HKEY* hKey) {
 
   const DWORD buffersize = 256;
   wchar_t name[buffersize];
@@ -337,21 +318,20 @@
 
   unsigned size = fl_utf8towc(_name, strlen(_name)+1, name, buffersize);
   if (size >= buffersize) {
-    vlog.error(_("Could not convert the parameter-name %s to wchar_t* when "
-                 "writing to the Registry, the buffersize is to small."),
-                 _name);
+    vlog.error(_("The name of the parameter %s was too large to write to the registry"), _name);
     return;
   }
   
   LONG res = RegSetValueExW(*hKey, name, 0, REG_DWORD, (BYTE*)&value, sizeof(DWORD));
   if (res != ERROR_SUCCESS) {
-    vlog.error(_("Error(%d) writing %d(REG_DWORD) to Registry."), res, _value);
+    vlog.error(_("Failed to write parameter %s of type %s to the registry: %d"),
+               _name, "REG_DWORD", res);
     return;
   }
 }
 
 
-bool getKeyString(const char* _name, char* dest, size_t destSize, HKEY* hKey) {
+static bool getKeyString(const char* _name, char* dest, size_t destSize, HKEY* hKey) {
   
   DWORD buffersize = 256;
   WCHAR value[destSize];
@@ -359,9 +339,7 @@
 
   unsigned size = fl_utf8towc(_name, strlen(_name)+1, name, buffersize);
   if (size >= buffersize) {
-    vlog.error(_("Could not convert the parameter-name %s to wchar_t* when "
-                 "reading from the Registry, the buffersize is to small."),
-                 _name);
+    vlog.error(_("The name of the parameter %s was too large to read from the registry"), _name);
     return false;
   }
 
@@ -370,7 +348,8 @@
     if (res == ERROR_FILE_NOT_FOUND) {
       // The value does not exist, defaults will be used.
     } else {
-      vlog.error(_("Error(%d) reading %s from Registry."), res, _name);
+      vlog.error(_("Failed to read parameter %s from the registry: %d"),
+                 _name, res);
     }
     return false;
   }
@@ -378,9 +357,7 @@
   char utf8val[destSize];
   size = fl_utf8fromwc(utf8val, sizeof(utf8val), value, wcslen(value)+1);
   if (size >= sizeof(utf8val)) {
-    vlog.error(_("Could not convert the parameter-value for %s to utf8 "
-                 "char* when reading from the Registry, the buffer dest is "
-                 "to small."), _name);
+    vlog.error(_("The parameter %s was too large to read from the registry"), _name);
     return false;
   }
   const char *ret = utf8val;
@@ -392,7 +369,7 @@
 }
 
 
-bool getKeyInt(const char* _name, int* dest, HKEY* hKey) {
+static bool getKeyInt(const char* _name, int* dest, HKEY* hKey) {
   
   const DWORD buffersize = 256;
   DWORD dwordsize = sizeof(DWORD);
@@ -401,9 +378,7 @@
 
   unsigned size = fl_utf8towc(_name, strlen(_name)+1, name, buffersize);
   if (size >= buffersize) {
-    vlog.error(_("Could not convert the parameter-name %s to wchar_t* when "
-                 "reading from the Registry, the buffersize is to small."),
-                 _name);
+    vlog.error(_("The name of the parameter %s was too large to read from the registry"), _name);
     return false;
   }
 
@@ -412,7 +387,8 @@
     if (res == ERROR_FILE_NOT_FOUND) {
       // The value does not exist, defaults will be used.
     } else {
-      vlog.error(_("Error(%d) reading %s from Registry."), res, _name);
+      vlog.error(_("Failed to read parameter %s from the registry: %d"),
+                 _name, res);
     }
     return false;
   }
@@ -422,7 +398,7 @@
 }
 
 
-void saveToReg(const char* servername) {
+static void saveToReg(const char* servername) {
   
   HKEY hKey;
     
@@ -431,7 +407,7 @@
                              REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
                              &hKey, NULL);
   if (res != ERROR_SUCCESS) {
-    vlog.error(_("Error(%d) creating key: Software\\TigerVNC\\vncviewer"), res);
+    vlog.error(_("Failed to create registry key: %d"), res);
     return;
   }
 
@@ -445,19 +421,19 @@
     } else if (dynamic_cast<BoolParameter*>(parameterArray[i]) != NULL) {
       setKeyInt(parameterArray[i]->getName(), (int)*(BoolParameter*)parameterArray[i], &hKey);
     } else {      
-      vlog.info(_("The parameterArray contains a object of a invalid type "
-                  "at line %d."), i);
+      vlog.error(_("Unknown parameter type for parameter %s"),
+                 parameterArray[i]->getName());
     }
   }
 
   res = RegCloseKey(hKey);
   if (res != ERROR_SUCCESS) {
-    vlog.error(_("Error(%d) closing key: Software\\TigerVNC\\vncviewer"), res);
+    vlog.error(_("Failed to close registry key: %d"), res);
   }
 }
 
 
-char* loadFromReg() {
+static char* loadFromReg() {
 
   HKEY hKey;
 
@@ -468,7 +444,7 @@
     if (res == ERROR_FILE_NOT_FOUND) {
       // The key does not exist, defaults will be used.
     } else {
-      vlog.error(_("Error(%d) opening key: Software\\TigerVNC\\vncviewer"), res);
+      vlog.error(_("Failed to open registry key: %d"), res);
     }
     return NULL;
   }
@@ -494,13 +470,14 @@
       if (getKeyInt(parameterArray[i]->getName(), &intValue, &hKey))
         ((BoolParameter*)parameterArray[i])->setParam(intValue);
     } else {      
-      vlog.info(_("The parameterArray contains a object of a invalid type at line %d."), i);
+      vlog.error(_("Unknown parameter type for parameter %s"),
+                 parameterArray[i]->getName());
     }
   }
 
   res = RegCloseKey(hKey);
   if (res != ERROR_SUCCESS){
-    vlog.error(_("Error(%d) closing key:  Software\\TigerVNC\\vncviewer"), res);
+    vlog.error(_("Failed to close registry key: %d"), res);
   }
   
   return servername;
@@ -539,7 +516,8 @@
   FILE* f = fopen(filepath, "w+");
   if (!f) {
     snprintf(write_error, sizeof(write_error),
-             _("Failed to write configuration file, can't open %s"), filepath);
+             _("Failed to write configuration file, can't open %s: %s"),
+             filepath, strerror(errno));
     throw Exception(write_error);
   }
   
@@ -558,8 +536,8 @@
     } else if (dynamic_cast<BoolParameter*>(parameterArray[i]) != NULL) {
       fprintf(f, "%s=%d\n", ((BoolParameter*)parameterArray[i])->getName(), (int)*(BoolParameter*)parameterArray[i]);
     } else {      
-      vlog.info(_("The parameterArray contains a object of a invalid type "
-                  "at line %d."), i);
+      vlog.error(_("Unknown parameter type for parameter %s"),
+                 parameterArray[i]->getName());
     }
   }
   fclose(f);
@@ -599,7 +577,8 @@
     if (!filename)
       return NULL; // Use defaults.
     snprintf(readError, sizeof(readError),
-             _("Failed to read configuration file, can't open %s"), filepath);
+             _("Failed to read configuration file, can't open %s: %s"),
+             filepath, strerror(errno));
     throw Exception(readError);
   }
   
@@ -610,15 +589,17 @@
     lineNr++;
     if (!fgets(line, sizeof(line), f)) {
       if (line[sizeof(line) -1] != '\0') {
-        vlog.error(_("Could not read the line(%d) in the configuration file,"
-                     "the buffersize is to small."), lineNr);
-        return NULL;
+        snprintf(readError, sizeof(readError),
+                 _("Failed to read line %d in file %s: %s"),
+                 lineNr, filepath, _("Line too long"));
+        throw Exception(readError);
       }
       if (feof(f))
         break;
 
       snprintf(readError, sizeof(readError),
-               _("Failed to read line %d in file %s"), lineNr, filepath);
+               _("Failed to read line %d in file %s: %s"),
+               lineNr, filepath, strerror(errno));
       throw Exception(readError);
     }
     
@@ -628,9 +609,8 @@
         continue;
       } else {
         snprintf(readError, sizeof(readError),
-                 _("Line 1 in file %s\nmust contain the TigerVNC "
-                   "configuration file identifier string:\n"
-                   "\"%s\""), filepath, IDENTIFIER_STRING);
+                 _("Configuration file %s is in an invalid format"),
+                 filepath);
         throw Exception(readError);
       }
     }
@@ -648,8 +628,8 @@
     // Find the parameter value
     char *value = strchr(line, '=');
     if (value == NULL) {
-      vlog.info(_("Bad Name/Value pair on line: %d in file: %s"),
-                lineNr, filepath);
+      vlog.error(_("Failed to read line %d in file %s: %s"),
+                 lineNr, filepath, _("Invalid format"));
       continue;
     }
     *value = '\0'; // line only contains the parameter name below.
@@ -661,8 +641,8 @@
     if (strcasecmp(line, "ServerName") == 0) {
 
       if(!decodeValue(value, decodingBuffer, sizeof(decodingBuffer))) {
-        vlog.info(_("The value of the parameter %s on line %d in file %s "
-                    "is invalid."), line, lineNr, filepath);
+        vlog.error(_("Failed to read line %d in file %s: %s"),
+                   lineNr, filepath, _("Invalid format or too large value"));
         continue;
       }
       snprintf(servername, sizeof(decodingBuffer), "%s", decodingBuffer);
@@ -677,8 +657,8 @@
           if (strcasecmp(line, ((StringParameter*)parameterArray[i])->getName()) == 0) {
 
             if(!decodeValue(value, decodingBuffer, sizeof(decodingBuffer))) {
-              vlog.info(_("The value of the parameter %s on line %d in file %s "
-                          "is invalid."), line, lineNr, filepath);
+              vlog.error(_("Failed to read line %d in file %s: %s"),
+                         lineNr, filepath, _("Invalid format or too large value"));
               continue;
             }
             ((StringParameter*)parameterArray[i])->setParam(decodingBuffer);
@@ -698,15 +678,15 @@
           }
 
         } else {
-          vlog.info(_("The parameterArray contains a object of a invalid type "
-                      "at line %d."), lineNr);
+          vlog.error(_("Unknown parameter type for parameter %s"),
+                     parameterArray[i]->getName());
         }
       }
     }
 
     if (invalidParameterName)
-      vlog.info(_("Invalid parameter name on line: %d in file: %s"),
-                lineNr, filepath);
+      vlog.info(_("Unknown parameter %s on line %d in file %s"),
+                line, lineNr, filepath);
   }
   fclose(f); f=0;
   
diff --git a/vncviewer/vncviewer.cxx b/vncviewer/vncviewer.cxx
index cf52de5..7fb712a 100644
--- a/vncviewer/vncviewer.cxx
+++ b/vncviewer/vncviewer.cxx
@@ -113,7 +113,7 @@
 {
   // CleanupSignalHandler allows C++ object cleanup to happen because it calls
   // exit() rather than the default which is to abort.
-  vlog.info(_("CleanupSignalHandler called"));
+  vlog.info(_("Termination signal %d has been received. TigerVNC Viewer will now exit."), sig);
   exit(1);
 }
 
@@ -460,6 +460,8 @@
 #ifndef WIN32
   /* Specifying -via and -listen together is nonsense */
   if (listenMode && strlen(via.getValueStr()) > 0) {
+    // TRANSLATORS: "Parameters" are command line arguments, or settings
+    // from a file or the Windows registry.
     vlog.error(_("Parameters -listen and -via are incompatible"));
     fl_alert(_("Parameters -listen and -via are incompatible"));
     exit_vncviewer();
diff --git a/win/vncconfig/Authentication.h b/win/vncconfig/Authentication.h
index 534646c..c2aba91 100644
--- a/win/vncconfig/Authentication.h
+++ b/win/vncconfig/Authentication.h
@@ -92,7 +92,8 @@
 
 
       static bool haveVncPassword() {
-        PlainPasswd password(SSecurityVncAuth::vncAuthPasswd.getVncAuthPasswd());
+        PlainPasswd password, passwordReadOnly;
+        SSecurityVncAuth::vncAuthPasswd.getVncAuthPasswd(&password, &passwordReadOnly);
         return password.buf && strlen(password.buf) != 0;
       }