diff -ur vnc-3.3.7-unixsrc/Xvnc/programs/Xserver/Xvnc.man vnc-3.3.7-unixsrc-patch/Xvnc/programs/Xserver/Xvnc.man
--- vnc-3.3.7-unixsrc/Xvnc/programs/Xserver/Xvnc.man	2003-02-28 19:47:10.000000000 +0100
+++ vnc-3.3.7-unixsrc-patch/Xvnc/programs/Xserver/Xvnc.man	2003-10-10 13:23:18.000000000 +0200
@@ -140,6 +140,12 @@
 allowed in the normal way.
 
 .TP
+.B \-master
+The first connection (master) to the server requires authentication while 
+subsequent connections (pupils) don't require a password but are in view only 
+mode. This option also enables the -alwaysshared option. [manu-patch]
+
+.TP
 .B \-localhost
 Only allow connections from the same machine. Useful if you use SSH and want to
 stop non-SSH connections from any other hosts. See the guide to using VNC with
Only in vnc-3.3.7-unixsrc-patch/Xvnc/programs/Xserver: Xvnc.man~
diff -ur vnc-3.3.7-unixsrc/Xvnc/programs/Xserver/hw/vnc/auth.c vnc-3.3.7-unixsrc-patch/Xvnc/programs/Xserver/hw/vnc/auth.c
--- vnc-3.3.7-unixsrc/Xvnc/programs/Xserver/hw/vnc/auth.c	2002-09-01 17:58:21.000000000 +0200
+++ vnc-3.3.7-unixsrc-patch/Xvnc/programs/Xserver/hw/vnc/auth.c	2003-10-10 13:14:23.000000000 +0200
@@ -38,6 +38,7 @@
 static int rfbAuthFailure();
 static CARD32 rfbAuthReenable(OsTimerPtr timer, CARD32 now, pointer arg);
 
+Bool rfbAuthDidaMode = FALSE;
 char *rfbAuthPasswdFile = NULL;
 int rfbAuthTries = 0;
 Bool rfbAuthTooManyTries = FALSE;
@@ -59,7 +60,8 @@
 
     cl->state = RFB_AUTHENTICATION;
 
-    if (rfbAuthPasswdFile && !cl->reverseConnection) {
+    if (rfbAuthPasswdFile && (!rfbAuthDidaMode || !cl->viewOnly) 
+	&& !cl->reverseConnection) {
 
 	if (rfbAuthTooManyTries) {
 	    rfbClientConnFailed(cl, "Too many authentication failures");
diff -ur vnc-3.3.7-unixsrc/Xvnc/programs/Xserver/hw/vnc/init.c vnc-3.3.7-unixsrc-patch/Xvnc/programs/Xserver/hw/vnc/init.c
--- vnc-3.3.7-unixsrc/Xvnc/programs/Xserver/hw/vnc/init.c	2003-02-28 19:47:10.000000000 +0100
+++ vnc-3.3.7-unixsrc-patch/Xvnc/programs/Xserver/hw/vnc/init.c	2003-10-10 13:14:23.000000000 +0200
@@ -322,6 +322,12 @@
 	return 1;
     }
 
+    if (strcmp(argv[i], "-master") == 0) {
+	rfbAuthDidaMode = TRUE;
+	rfbAlwaysShared = TRUE;
+	return 1;
+    }
+
     if (inetdSock != -1 && argv[i][0] == ':') {
 	FatalError("can't specify both -inetd and :displaynumber");
     }
diff -ur vnc-3.3.7-unixsrc/Xvnc/programs/Xserver/hw/vnc/rfb.h vnc-3.3.7-unixsrc-patch/Xvnc/programs/Xserver/hw/vnc/rfb.h
--- vnc-3.3.7-unixsrc/Xvnc/programs/Xserver/hw/vnc/rfb.h	2003-02-28 19:47:10.000000000 +0100
+++ vnc-3.3.7-unixsrc-patch/Xvnc/programs/Xserver/hw/vnc/rfb.h	2003-10-10 13:14:23.000000000 +0200
@@ -133,6 +133,8 @@
 	RFB_NORMAL		/* normal protocol messages */
     } state;
 
+    Bool viewOnly;
+
     Bool reverseConnection;
 
     Bool readyForSetColourMapEntries;
@@ -417,6 +419,7 @@
 
 /* auth.c */
 
+extern Bool rfbAuthDidaMode;
 extern char *rfbAuthPasswdFile;
 extern Bool rfbAuthenticating;
 
diff -ur vnc-3.3.7-unixsrc/Xvnc/programs/Xserver/hw/vnc/rfbserver.c vnc-3.3.7-unixsrc-patch/Xvnc/programs/Xserver/hw/vnc/rfbserver.c
--- vnc-3.3.7-unixsrc/Xvnc/programs/Xserver/hw/vnc/rfbserver.c	2003-02-28 19:47:10.000000000 +0100
+++ vnc-3.3.7-unixsrc-patch/Xvnc/programs/Xserver/hw/vnc/rfbserver.c	2003-10-10 13:14:23.000000000 +0200
@@ -134,6 +134,16 @@
 
     cl = (rfbClientPtr)xalloc(sizeof(rfbClientRec));
 
+    /* didactics mode*/
+    cl->viewOnly=FALSE;
+
+    if (rfbAuthDidaMode) {
+      rfbClientPtr p;
+      for (p=rfbClientHead; p && p->viewOnly;p=p->next);
+      if (p) /* master already present*/
+	cl->viewOnly=TRUE;
+    }
+
     cl->sock = sock;
     getpeername(sock, (struct sockaddr *)&addr, &addrlen);
     cl->host = strdup(inet_ntoa(addr.sin_addr));
@@ -633,7 +643,6 @@
     }
 
     case rfbKeyEvent:
-
 	cl->rfbKeyEventsRcvd++;
 
 	if ((n = ReadExact(cl->sock, ((char *)&msg) + 1,
@@ -644,12 +653,17 @@
 	    return;
 	}
 
+
 #ifdef CORBA
 	addCapability(cl, KEYBOARD_DEVICE);
 
 	if (!isKeyboardEnabled(cl))
 	    return;
 #endif
+
+       	if (cl->viewOnly) /*refuse input*/
+	   return;
+
 	KbdAddEvent(msg.ke.down, (KeySym)Swap32IfLE(msg.ke.key), cl);
 	return;
 
@@ -681,6 +695,9 @@
 	else
 	    pointerClient = cl;
 
+	if (cl->viewOnly) /* refuse input */
+	  return;
+
 	PtrAddEvent(msg.pe.buttonMask,
 		    Swap16IfLE(msg.pe.x), Swap16IfLE(msg.pe.y), cl);
 	return;
