diff --git a/unix/vncconfig/vncExt.c b/unix/vncconfig/vncExt.c
index ff6b4d6..f93b6ee 100644
--- a/unix/vncconfig/vncExt.c
+++ b/unix/vncconfig/vncExt.c
@@ -24,10 +24,6 @@
 #define _VNCEXT_PROTO_
 #include "vncExt.h"
 
-static Bool XVncExtClientCutTextNotifyWireToEvent(Display* dpy, XEvent* e,
-                                                  xEvent* w);
-static Bool XVncExtSelectionChangeNotifyWireToEvent(Display* dpy, XEvent* e,
-                                                    xEvent* w);
 static Bool XVncExtQueryConnectNotifyWireToEvent(Display* dpy, XEvent* e,
                                                  xEvent* w);
 
@@ -40,10 +36,6 @@
     extensionInited = True;
     codes = XInitExtension(dpy, VNCEXTNAME);
     if (!codes) return False;
-    XESetWireToEvent(dpy, codes->first_event + VncExtClientCutTextNotify,
-                     XVncExtClientCutTextNotifyWireToEvent);
-    XESetWireToEvent(dpy, codes->first_event + VncExtSelectionChangeNotify,
-                     XVncExtSelectionChangeNotifyWireToEvent);
     XESetWireToEvent(dpy, codes->first_event + VncExtQueryConnectNotify,
                      XVncExtQueryConnectNotifyWireToEvent);
   }
@@ -214,53 +206,6 @@
   }
 }
 
-Bool XVncExtSetServerCutText(Display* dpy, const char* str, int len)
-{
-  xVncExtSetServerCutTextReq* req;
-
-  if (!checkExtension(dpy)) return False;
-
-  LockDisplay(dpy);
-  GetReq(VncExtSetServerCutText, req);
-  req->reqType = codes->major_opcode;
-  req->vncExtReqType = X_VncExtSetServerCutText;
-  req->length += (len + 3) >> 2;
-  req->textLen = len;
-  Data(dpy, str, len);
-  UnlockDisplay(dpy);
-  SyncHandle();
-  return True;
-}
-
-Bool XVncExtGetClientCutText(Display* dpy, char** str, int* len)
-{
-  xVncExtGetClientCutTextReq* req;
-  xVncExtGetClientCutTextReply rep;
-
-  if (!checkExtension(dpy)) return False;
-
-  LockDisplay(dpy);
-  GetReq(VncExtGetClientCutText, req);
-  req->reqType = codes->major_opcode;
-  req->vncExtReqType = X_VncExtGetClientCutText;
-  if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
-    UnlockDisplay(dpy);
-    SyncHandle();
-    return False;
-  }
-  UnlockDisplay(dpy);
-  SyncHandle();
-  *len = rep.textLen;
-  *str = (char*) Xmalloc (*len+1);
-  if (!*str) {
-    _XEatData(dpy, (*len+1)&~1);
-    return False;
-  }
-  _XReadPad(dpy, *str, *len);
-  (*str)[*len] = 0;
-  return True;
-}
-
 Bool XVncExtSelectInput(Display* dpy, Window w, int mask)
 {
   xVncExtSelectInputReq* req;
@@ -359,35 +304,6 @@
 }
 
 
-static Bool XVncExtClientCutTextNotifyWireToEvent(Display* dpy, XEvent* e,
-                                                  xEvent* w)
-{
-  XVncExtClientCutTextEvent* ev = (XVncExtClientCutTextEvent*)e;
-  xVncExtClientCutTextNotifyEvent* wire = (xVncExtClientCutTextNotifyEvent*)w;
-  ev->type = wire->type & 0x7f;
-  ev->serial = _XSetLastRequestRead(dpy,(xGenericReply*)wire);
-  ev->send_event = (wire->type & 0x80) != 0;
-  ev->display = dpy;
-  ev->window = wire->window;
-  ev->time = wire->time;
-  return True;
-}
-
-static Bool XVncExtSelectionChangeNotifyWireToEvent(Display* dpy, XEvent* e,
-                                                    xEvent* w)
-{
-  XVncExtSelectionChangeEvent* ev = (XVncExtSelectionChangeEvent*)e;
-  xVncExtSelectionChangeNotifyEvent* wire
-    = (xVncExtSelectionChangeNotifyEvent*)w;
-  ev->type = wire->type & 0x7f;
-  ev->serial = _XSetLastRequestRead(dpy,(xGenericReply*)wire);
-  ev->send_event = (wire->type & 0x80) != 0;
-  ev->display = dpy;
-  ev->window = wire->window;
-  ev->selection = wire->selection;
-  return True;
-}
-
 static Bool XVncExtQueryConnectNotifyWireToEvent(Display* dpy, XEvent* e,
                                                     xEvent* w)
 {
diff --git a/unix/vncconfig/vncExt.h b/unix/vncconfig/vncExt.h
index e41e2e5..2b24469 100644
--- a/unix/vncconfig/vncExt.h
+++ b/unix/vncconfig/vncExt.h
@@ -26,18 +26,12 @@
 #define X_VncExtGetParam 1
 #define X_VncExtGetParamDesc 2
 #define X_VncExtListParams 3
-#define X_VncExtSetServerCutText 4
-#define X_VncExtGetClientCutText 5
 #define X_VncExtSelectInput 6
 #define X_VncExtConnect 7
 #define X_VncExtGetQueryConnect 8
 #define X_VncExtApproveConnect 9
 
-#define VncExtClientCutTextNotify 0
-#define VncExtSelectionChangeNotify 1
 #define VncExtQueryConnectNotify 2
-#define VncExtClientCutTextMask (1 << VncExtClientCutTextNotify)
-#define VncExtSelectionChangeMask (1 << VncExtSelectionChangeNotify)
 #define VncExtQueryConnectMask (1 << VncExtQueryConnectNotify)
 
 #define VncExtNumberEvents 3
@@ -51,8 +45,6 @@
 char* XVncExtGetParamDesc(Display* dpy, const char* param);
 char** XVncExtListParams(Display* dpy, int* nParams);
 void XVncExtFreeParamList(char** list);
-Bool XVncExtSetServerCutText(Display* dpy, const char* str, int len);
-Bool XVncExtGetClientCutText(Display* dpy, char** str, int* len);
 Bool XVncExtSelectInput(Display* dpy, Window w, int mask);
 Bool XVncExtConnect(Display* dpy, const char* hostAndPort);
 Bool XVncExtGetQueryConnect(Display* dpy, char** addr,
@@ -66,24 +58,6 @@
   Bool send_event;
   Display *display;
   Window window;
-  Time time;
-} XVncExtClientCutTextEvent;
-
-typedef struct {
-  int type;
-  unsigned long serial;
-  Bool send_event;
-  Display *display;
-  Window window;
-  Atom selection;
-} XVncExtSelectionChangeEvent;
-
-typedef struct {
-  int type;
-  unsigned long serial;
-  Bool send_event;
-  Display *display;
-  Window window;
 } XVncExtQueryConnectEvent;
 
 #endif
@@ -194,37 +168,6 @@
 
 typedef struct {
   CARD8 reqType;       /* always VncExtReqCode */
-  CARD8 vncExtReqType; /* always VncExtSetServerCutText */
-  CARD16 length B16;
-  CARD32 textLen B32;
-} xVncExtSetServerCutTextReq;
-#define sz_xVncExtSetServerCutTextReq 8
-
-
-typedef struct {
-  CARD8 reqType;       /* always VncExtReqCode */
-  CARD8 vncExtReqType; /* always VncExtGetClientCutText */
-  CARD16 length B16;
-} xVncExtGetClientCutTextReq;
-#define sz_xVncExtGetClientCutTextReq 4
-
-typedef struct {
- BYTE type; /* X_Reply */
- BYTE pad0;
- CARD16 sequenceNumber B16;
- CARD32 length B32;
- CARD32 textLen B32;
- CARD32 pad1 B32;
- CARD32 pad2 B32;
- CARD32 pad3 B32;
- CARD32 pad4 B32;
- CARD32 pad5 B32;
-} xVncExtGetClientCutTextReply;
-#define sz_xVncExtGetClientCutTextReply 32
-
-
-typedef struct {
-  CARD8 reqType;       /* always VncExtReqCode */
   CARD8 vncExtReqType; /* always VncExtSelectInput */
   CARD16 length B16;
   CARD32 window B32;
@@ -293,34 +236,6 @@
 
 
 typedef struct {
-  BYTE type;    /* always eventBase + VncExtClientCutTextNotify */
-  BYTE pad0;
-  CARD16 sequenceNumber B16;
-  CARD32 window B32;
-  CARD32 time B32;
-  CARD32 pad1 B32;
-  CARD32 pad2 B32;
-  CARD32 pad3 B32;
-  CARD32 pad4 B32;
-  CARD32 pad5 B32;
-} xVncExtClientCutTextNotifyEvent;
-#define sz_xVncExtClientCutTextNotifyEvent 32
-
-typedef struct {
-  BYTE type;    /* always eventBase + VncExtSelectionChangeNotify */
-  BYTE pad0;
-  CARD16 sequenceNumber B16;
-  CARD32 window B32;
-  CARD32 selection B32;
-  CARD32 pad1 B32;
-  CARD32 pad2 B32;
-  CARD32 pad3 B32;
-  CARD32 pad4 B32;
-  CARD32 pad5 B32;
-} xVncExtSelectionChangeNotifyEvent;
-#define sz_xVncExtSelectionChangeNotifyEvent 32
-
-typedef struct {
   BYTE type;    /* always eventBase + VncExtQueryConnectNotify */
   BYTE pad0;
   CARD16 sequenceNumber B16;
diff --git a/unix/vncconfig/vncconfig.cxx b/unix/vncconfig/vncconfig.cxx
index bffdfbe..188ebfb 100644
--- a/unix/vncconfig/vncconfig.cxx
+++ b/unix/vncconfig/vncconfig.cxx
@@ -38,7 +38,6 @@
 #include <rfb/Configuration.h>
 #include <rfb/Logger_stdio.h>
 #include <rfb/LogWriter.h>
-#include <rfb/Timer.h>
 #include "TXWindow.h"
 #include "TXCheckbox.h"
 #include "TXLabel.h"
@@ -51,16 +50,6 @@
 StringParameter displayname("display", "The X display", "");
 BoolParameter noWindow("nowin", "Don't display a window", 0);
 BoolParameter iconic("iconic", "Start with window iconified", 0);
-BoolParameter sendPrimary("SendPrimary", "Send the PRIMARY as well as the "
-                          "CLIPBOARD selection", true);
-IntParameter pollTime("poll",
-                      "How often to poll for clipboard changes in ms", 0);
-
-inline const char* selectionName(Atom sel) {
-  if (sel == xaCLIPBOARD) return "CLIPBOARD";
-  if (sel == XA_PRIMARY) return "PRIMARY";
-  return "unknown";
-}
 
 #define ACCEPT_CUT_TEXT "AcceptCutText"
 #define SEND_CUT_TEXT "SendCutText"
@@ -81,19 +70,14 @@
 class VncConfigWindow : public TXWindow, public TXEventHandler,
                         public TXDeleteWindowCallback,
                         public TXCheckboxCallback,
-                        public rfb::Timer::Callback,
                         public QueryResultCallback {
 public:
   VncConfigWindow(Display* dpy)
-    : TXWindow(dpy, 300, 100), cutText(0), cutTextLen(0),
+    : TXWindow(dpy, 300, 100),
       acceptClipboard(dpy, "Accept clipboard from viewers", this, false, this),
       sendClipboard(dpy, "Send clipboard to viewers", this, false, this),
-      sendPrimaryCB(dpy, "Send primary selection to viewers", this,false,this),
-      pollTimer(this),
       queryConnectDialog(0)
   {
-    selection[0] = selection[1] = 0;
-    selectionLen[0] = selectionLen[1] = 0;
     int y = yPad;
     acceptClipboard.move(xPad, y);
     acceptClipboard.checked(getBoolParam(dpy, ACCEPT_CUT_TEXT));
@@ -101,62 +85,14 @@
     sendClipboard.move(xPad, y);
     sendClipboard.checked(getBoolParam(dpy, SEND_CUT_TEXT));
     y += sendClipboard.height();
-    sendPrimaryCB.move(xPad, y);
-    sendPrimaryCB.checked(sendPrimary);
-    sendPrimaryCB.disabled(!sendClipboard.checked());
-    y += sendPrimaryCB.height();
     setEventHandler(this);
     toplevel("VNC config", this, 0, 0, 0, iconic);
-    XVncExtSelectInput(dpy, win(),
-                       VncExtClientCutTextMask|
-                       VncExtSelectionChangeMask|
-                       VncExtQueryConnectMask);
-    XConvertSelection(dpy, XA_PRIMARY, XA_STRING,
-                      XA_PRIMARY, win(), CurrentTime);
-    XConvertSelection(dpy, xaCLIPBOARD, XA_STRING,
-                      xaCLIPBOARD, win(), CurrentTime);
-    if (pollTime != 0)
-      pollTimer.start(pollTime);
+    XVncExtSelectInput(dpy, win(), VncExtQueryConnectMask);
   }
 
-  // handleEvent(). If we get a ClientCutTextNotify event from Xvnc, set the
-  // primary and clipboard selections to the clientCutText. If we get a
-  // SelectionChangeNotify event from Xvnc, set the serverCutText to the value
-  // of the new selection.
+  // handleEvent()
 
   virtual void handleEvent(TXWindow* w, XEvent* ev) {
-    if (acceptClipboard.checked()) {
-      if (ev->type == vncExtEventBase + VncExtClientCutTextNotify) {
-        XVncExtClientCutTextEvent* cutEv = (XVncExtClientCutTextEvent*)ev;
-        if (cutText)
-          XFree(cutText);
-        cutText = 0;
-        if (XVncExtGetClientCutText(dpy, &cutText, &cutTextLen)) {
-          vlog.debug("Got client cut text: '%.*s%s'",
-                     cutTextLen<9?cutTextLen:8, cutText,
-                     cutTextLen<9?"":"...");
-          XStoreBytes(dpy, cutText, cutTextLen);
-          ownSelection(XA_PRIMARY, cutEv->time);
-          ownSelection(xaCLIPBOARD, cutEv->time);
-          delete [] selection[0];
-          delete [] selection[1];
-          selection[0] = selection[1] = 0;
-          selectionLen[0] = selectionLen[1] = 0;
-        }
-      }
-    }
-    if (sendClipboard.checked()) {
-      if (ev->type == vncExtEventBase + VncExtSelectionChangeNotify) {
-        vlog.debug("selection change event");
-        XVncExtSelectionChangeEvent* selEv = (XVncExtSelectionChangeEvent*)ev;
-        if (selEv->selection == xaCLIPBOARD ||
-            (selEv->selection == XA_PRIMARY && sendPrimaryCB.checked())) {
-          if (!selectionOwner(selEv->selection))
-            XConvertSelection(dpy, selEv->selection, XA_STRING,
-                              selEv->selection, win(), CurrentTime);
-        }
-      }
-    }
     if (ev->type == vncExtEventBase + VncExtQueryConnectNotify) {
        vlog.debug("query connection event");
        if (queryConnectDialog)
@@ -178,55 +114,6 @@
        }
     }
   }
-  
-
-  // selectionRequest() is called when we are the selection owner and another X
-  // client has requested the selection.  We simply put the server's cut text
-  // into the requested property.  TXWindow will handle the rest.
-  bool selectionRequest(Window requestor, Atom selection, Atom property)
-  {
-    if (cutText)
-      XChangeProperty(dpy, requestor, property, XA_STRING, 8,
-                      PropModeReplace, (unsigned char*)cutText,
-                      cutTextLen);
-    return cutText;
-  }
-
-  // selectionNotify() is called when we have requested the selection from the
-  // selection owner.
-  void selectionNotify(XSelectionEvent* ev, Atom type, int format,
-                       int nitems, void* data)
-  {
-    if (ev->requestor != win() || ev->target != XA_STRING)
-      return;
-
-    if (data && format == 8) {
-      int i = (ev->selection == XA_PRIMARY ? 0 : 1);
-      if (selectionLen[i] == nitems && memcmp(selection[i], data, nitems) == 0)
-        return;
-      delete [] selection[i];
-      selection[i] = new char[nitems];
-      memcpy(selection[i], data, nitems);
-      selectionLen[i] = nitems;
-      if (cutTextLen == nitems && memcmp(cutText, data, nitems) == 0) {
-        vlog.debug("ignoring duplicate cut text");
-        return;
-      }
-      if (cutText)
-        XFree(cutText);
-      cutText = (char*)malloc(nitems); // assuming XFree() same as free()
-      if (!cutText) {
-        vlog.error("unable to allocate selection buffer");
-        return;
-      }
-      memcpy(cutText, data, nitems);
-      cutTextLen = nitems;
-      vlog.debug("sending %s selection as server cut text: '%.*s%s'",
-                 selectionName(ev->selection),cutTextLen<9?cutTextLen:8,
-                 cutText, cutTextLen<9?"":"...");
-      XVncExtSetServerCutText(dpy, cutText, cutTextLen);
-    }
-  }
 
   // TXDeleteWindowCallback method
   virtual void deleteWindow(TXWindow* w) {
@@ -241,21 +128,9 @@
     } else if (checkbox == &sendClipboard) {
       XVncExtSetParam(dpy, (sendClipboard.checked()
                             ? SEND_CUT_TEXT "=1" : SEND_CUT_TEXT "=0"));
-      sendPrimaryCB.disabled(!sendClipboard.checked());
     }
   }
 
-  // rfb::Timer::Callback interface
-  virtual bool handleTimeout(rfb::Timer* timer) {
-    if (sendPrimaryCB.checked() && !selectionOwner(XA_PRIMARY))
-      XConvertSelection(dpy, XA_PRIMARY, XA_STRING,
-                        XA_PRIMARY, win(), CurrentTime);
-    if (!selectionOwner(xaCLIPBOARD))
-      XConvertSelection(dpy, xaCLIPBOARD, XA_STRING,
-                        xaCLIPBOARD, win(), CurrentTime);
-    return true;
-  }
-
   // QueryResultCallback interface
   virtual void queryApproved() {
     XVncExtApproveConnect(dpy, queryConnectId, 1);
@@ -265,12 +140,7 @@
   }
 
 private:
-  char* cutText;
-  int cutTextLen;
-  char* selection[2];
-  int selectionLen[2];
-  TXCheckbox acceptClipboard, sendClipboard, sendPrimaryCB;
-  rfb::Timer pollTimer;
+  TXCheckbox acceptClipboard, sendClipboard;
 
   QueryConnectDialog* queryConnectDialog;
   void* queryConnectId;
diff --git a/unix/vncconfig/vncconfig.man b/unix/vncconfig/vncconfig.man
index 6695be3..06f9ca9 100644
--- a/unix/vncconfig/vncconfig.man
+++ b/unix/vncconfig/vncconfig.man
@@ -37,14 +37,11 @@
 servers prior to version 4.
 
 When run with no options, it runs as a kind of "helper" application for Xvnc.
-Its main purpose when run in this mode is to support clipboard transfer to and
-from the VNC viewer(s).  Note that without a running instance of
-\fBvncconfig\fP there will be no clipboard support.  It puts up a window with
-some checkboxes which can be used to disable clipboard transfers if required
-(in the future there may be more functions available from this window).  The
-\fB-nowin\fP flag can be used if you always want clipboard support but don't
-wish to clutter the desktop with this window - alternatively the \fB-iconic\fP
-option can be used to make it iconified by default.
+Its main purpose when run in this mode is to query the user how new
+connections should be handled (provided this feature is enabled). The
+\fB-nowin\fP flag can be used if you always want the query support but don't
+wish to clutter the desktop with the settings window - alternatively the
+\fB-iconic\fP option can be used to make it iconified by default.
 
 When run in any other mode, \fBvncconfig\fP is a one-shot program used to
 configure or control Xvnc as appropriate.  It can be used to tell Xvnc to
