diff --git a/xc.patch b/xc.patch
new file mode 100644
index 0000000..fb9baf6
--- /dev/null
+++ b/xc.patch
@@ -0,0 +1,191 @@
+*** xc/programs/Xserver/Imakefile.orig	Fri Jun  6 11:02:36 2003
+--- xc/programs/Xserver/Imakefile	Fri Jun  6 11:14:39 2003
+***************
+*** 409,412 ****
+--- 409,429 ----
+  #endif
+  #endif /* XsunServer */
++ XCOMM
++ XCOMM X VNC server
++ XCOMM
++ MFBDIR = mfb
++ CFB8DIR = cfb
++ CFB16DIR = cfb16
++ CFB24DIR = cfb24
++ CFB32DIR = cfb32
++ XVNCDDXDIR = vnc/Xvnc
++ XVNCDIRS = $(STDDIRS) $(MFBDIR) \
++ 	    $(CFB8DIR) $(CFB16DIR) $(CFB24DIR) $(CFB32DIR) \
++ 	    $(XVNCDDXDIR) $(DEPDIRS)
++ XVNCOBJS = $(XVNCDDXDIR)/stubs.o $(XVNCDDXDIR)/miinitext.o
++ XVNCLIBS = PreFbLibs vnc/Xvnc/LibraryTargetName(xvnc) CFBLibs PostFbLibs
++ XVNCSYSLIBS = $(FONTLIBS) $(SYSLIBS)
++ ServerTarget(Xvnc,$(XVNCDIRS),$(XVNCOBJS), \
++ 	$(XVNCLIBS) $(LOADABLEEXTS) $(LIBCWRAPPER),$(XVNCSYSLIBS))
+  
+  
+*** xc/programs/Xserver/mi/miinitext.c.orig	Fri Jun  6 11:02:59 2003
+--- xc/programs/Xserver/mi/miinitext.c	Fri Jun  6 11:17:15 2003
+***************
+*** 150,153 ****
+--- 150,156 ----
+  extern void MITMiscExtensionInit(INITARGS);
+  #endif
++ #ifdef VNCEXT
++ extern void vncExtensionInit(INITARGS);
++ #endif
+  #ifdef XIDLE
+  extern void XIdleExtensionInit(INITARGS);
+***************
+*** 285,288 ****
+--- 288,294 ----
+      MITMiscExtensionInit();
+  #endif
++ #ifdef VNCEXT
++     vncExtensionInit();
++ #endif
+  #ifdef XIDLE
+      XIdleExtensionInit();
+*** xc/programs/Xserver/cfb/cfb8line.c.orig	Wed Sep 18 18:11:47 2002
+--- xc/programs/Xserver/cfb/cfb8line.c	Thu Jun  5 18:32:04 2003
+***************
+*** 688,707 ****
+  	    y1_or_e1 = xOffset & 3;
+  # else
+! #  if PGSZ == 64 /* PIM value from <cfbmskbits.h> is not it! (for 16/32 PSZ)*/
+! 	    y1_or_e1 = ((long) addrp) & 0x7;
+! 	    addrp = (PixelType *) (((unsigned char *) addrp) - y1_or_e1);
+! #  else
+! 	    y1_or_e1 = ((long) addrp) & PIM;
+! 	    addrp = (PixelType *) (((unsigned char *) addrp) - y1_or_e1);
+! #  endif
+! #if PGSZ == 32
+! #  if PWSH != 2
+! 	    y1_or_e1 >>= (2 - PWSH);
+! #  endif
+! #else /* PGSZ == 64 */
+! #  if PWSH != 3
+! 	    y1_or_e1 >>= (3 - PWSH);
+! #  endif
+! #endif /* PGSZ */
+  # endif /* PSZ == 24 */
+  #if PSZ == 24
+--- 688,696 ----
+  	    y1_or_e1 = xOffset & 3;
+  # else
+! 	    /* Round addrp down to the next PixelGroup boundary, and
+! 	     * set y1_or_e1 to the excess (in pixels)
+! 	     * (assumes PGSZB is a power of 2). */
+! 	    y1_or_e1 = (((unsigned long) addrp) & (PGSZB - 1)) / (PSZ / 8);
+! 	    addrp -= y1_or_e1;
+  # endif /* PSZ == 24 */
+  #if PSZ == 24
+*** xc/programs/Xserver/cfb/cfbtile32.c.orig	Fri Dec 14 19:59:25 2001
+--- xc/programs/Xserver/cfb/cfbtile32.c	Thu Jun  5 18:16:48 2003
+***************
+*** 73,77 ****
+                        (p)++,(*(p) = MROP_PREBUILT_SOLID(((srcpix<<8)|(srcpix>>16)),*(p))))
+  
+! #if (MROP == Mcopy) && defined(FAST_CONSTANT_OFFSET_MODE) && defined(SHARED_IDCACHE)
+  # define Expand(left,right) {\
+      int part = nlwMiddle & ((PGSZB*2)-1); \
+--- 73,83 ----
+                        (p)++,(*(p) = MROP_PREBUILT_SOLID(((srcpix<<8)|(srcpix>>16)),*(p))))
+  
+! 
+! 
+! /* XXX TJR: I doubt that this optimised case works (because the non-24 bit case
+!    was broken), so I've added the #if 0 below.  Someone who knows what they're
+!    doing can re-enable it if they fix it */
+! 
+! #if (MROP == Mcopy) && defined(FAST_CONSTANT_OFFSET_MODE) && defined(SHARED_IDCACHE) && 0
+  # define Expand(left,right) {\
+      int part = nlwMiddle & ((PGSZB*2)-1); \
+***************
+*** 145,150 ****
+  #if (MROP == Mcopy) && defined(FAST_CONSTANT_OFFSET_MODE) && defined(SHARED_IDCACHE)
+  # define Expand(left,right) {\
+!     int part = nlwMiddle & ((PGSZB*2)-1); \
+!     nlwMiddle >>= PWSH + 1; \
+      while (h--) { \
+  	srcpix = psrc[srcy]; \
+--- 151,156 ----
+  #if (MROP == Mcopy) && defined(FAST_CONSTANT_OFFSET_MODE) && defined(SHARED_IDCACHE)
+  # define Expand(left,right) {\
+!     int part = nlwMiddle & 7; \
+!     nlwMiddle >>= 3; \
+      while (h--) { \
+  	srcpix = psrc[srcy]; \
+*** xc/programs/Xserver/cfb/cfbglblt8.c.orig	Fri Dec 14 19:59:23 2001
+--- xc/programs/Xserver/cfb/cfbglblt8.c	Tue Aug 12 10:05:57 2003
+***************
+*** 284,288 ****
+      register glyphPointer   glyphBits;
+      register int	xoff;
+! #if defined(USE_LEFT_BITS) || (!defined(STIPPLE) && !defined(USE_STIPPLE_CODE))
+      register CfbBits	*dst;
+  #endif
+--- 284,288 ----
+      register glyphPointer   glyphBits;
+      register int	xoff;
+! #if defined(USE_LEFTBITS) || (!defined(STIPPLE) && !defined(USE_STIPPLE_CODE))
+      register CfbBits	*dst;
+  #endif
+***************
+*** 292,296 ****
+      CfbBits		*dstLine;
+      CfbBits		*pdstBase;
+! #ifdef USE_LEFT_BITS
+      CARD32		*cTmp;
+  #endif
+--- 292,296 ----
+      CfbBits		*dstLine;
+      CfbBits		*pdstBase;
+! #ifdef USE_LEFTBITS
+      CARD32		*cTmp;
+  #endif
+***************
+*** 399,403 ****
+  	    	} while (--hTmp);
+  	    	break;
+! #else /* !USE_LEFT_BITS */
+  	    	{
+  		    int h;
+--- 399,403 ----
+  	    	} while (--hTmp);
+  	    	break;
+! #else /* !USE_LEFTBITS */
+  	    	{
+  		    int h;
+***************
+*** 412,416 ****
+  	    	glyphBits = clips;
+  	    	/* fall through */
+! #endif /* USE_LEFT_BITS */
+  	    case rgnIN:
+  #ifdef STIPPLE
+--- 412,416 ----
+  	    	glyphBits = clips;
+  	    	/* fall through */
+! #endif /* USE_LEFTBITS */
+  	    case rgnIN:
+  #ifdef STIPPLE
+*** xc/programs/Xserver/cfb/cfbcppl.c.orig	Fri Dec 14 19:59:22 2001
+--- xc/programs/Xserver/cfb/cfbcppl.c	Sun Apr 18 12:53:36 2004
+***************
+*** 383,389 ****
+  	psrcLine = (unsigned int *)psrcBase + srcy * widthSrc + srcx;
+  #endif
+  	pdstLine = (unsigned int *)pdstBase + dsty * widthDst + (dstx >> 5);
+! 	if (dstx + width <= 32)
+  	{
+  	    mfbmaskpartialbits(dstx, width, startmask);
+  	    nlMiddle = 0;
+--- 383,389 ----
+  	psrcLine = (unsigned int *)psrcBase + srcy * widthSrc + srcx;
+  #endif
+  	pdstLine = (unsigned int *)pdstBase + dsty * widthDst + (dstx >> 5);
+! 	if ((dstx & 0x1f) + width <= 32)
+  	{
+  	    mfbmaskpartialbits(dstx, width, startmask);
+  	    nlMiddle = 0;
