diff -u -r xorg-server-X11R7.1-1.1.0.orig/dix/window.c xorg-server-X11R7.1-1.1.0/dix/window.c
--- xorg-server-X11R7.1-1.1.0.orig/dix/window.c	2007-01-08 14:30:38.000000000 +0000
+++ xorg-server-X11R7.1-1.1.0/dix/window.c	2007-01-16 17:16:19.000000000 +0000
@@ -185,6 +185,8 @@
 _X_EXPORT int numSaveUndersViewable = 0;
 _X_EXPORT int deltaSaveUndersViewable = 0;
 
+char* RootPPM = NULL;
+
 #ifdef DEBUG
 /******
  * PrintWindowTree
@@ -311,6 +313,115 @@
 #endif
 }
 
+static int
+get_int(FILE *fp)
+{
+  int c = 0;
+
+  while ((c = getc(fp)) != EOF)
+    {
+      if (isspace(c))
+	continue;
+
+      if (c == '#')
+	while (c = getc(fp))
+	  if (c == EOF)
+	    return 0;
+	  else if (c == '\n')
+	    break;
+
+      if (isdigit(c)) 
+	{
+	  int val = c - '0';
+	  while ((c = getc(fp)) && isdigit(c))
+	    val = (val * 10) + (c - '0');
+	  return val;
+	}
+    }
+
+  return 0;
+}
+
+static unsigned char*
+ppm_load (const char* path, int depth, int *width, int *height)
+{
+  FILE *fp;
+  int   max, n = 0, w, h, i, j, bytes_per_line;
+  unsigned char *data, *res, h1, h2;
+
+  if (depth < 16 || depth > 32)
+    return NULL;
+
+  if (depth > 16)
+    depth = 32;
+
+  fp = fopen (path, "r");
+  if (fp == NULL)
+    return FALSE;
+
+  h1 = getc(fp);
+  h2 = getc(fp);
+
+  /* magic is 'P6' for raw ppm */
+  if (h1 != 'P' && h2 != '6')
+      goto fail;
+
+  w = get_int(fp);
+  h = get_int(fp);
+
+  if (w == 0 || h == 0)
+    goto fail;
+
+  max = get_int(fp);
+
+  if (max != 255)
+      goto fail;
+
+  bytes_per_line = ((w * depth + 31) >> 5) << 2;
+
+  res = data = malloc(bytes_per_line * h);
+
+  for (i=0; i<h; i++)
+    {
+      for (j=0; j<w; j++)
+	{
+	  unsigned char buf[3];
+	  fread(buf, 1, 3, fp);
+	  
+	  switch (depth)
+	    {
+	    case 24:
+	    case 32:
+	      *data     = buf[2];
+	      *(data+1) = buf[1];
+	      *(data+2) = buf[0];
+	      data += 4;
+	      break;
+	    case 16:
+	    default:
+	      *(unsigned short*)data
+		= ((buf[0] >> 3) << 11) | ((buf[1] >> 2) << 5) | (buf[2] >> 3);
+	      data += 2;
+	      break;
+	    }
+	}
+      data += (bytes_per_line - (w*(depth>>3)));
+    }
+
+  data = res;
+
+  *width  = w;
+  *height = h;
+
+  fclose(fp);
+
+  return res;
+
+ fail:
+  fclose(fp);
+  return NULL;
+}
+
 static void
 MakeRootTile(WindowPtr pWin)
 {
@@ -321,6 +432,36 @@
     register unsigned char *from, *to;
     register int i, j;
 
+    if (RootPPM != NULL)
+      {
+	int            w, h;
+	unsigned char *data;
+
+	if ((data = ppm_load (RootPPM, pScreen->rootDepth, &w, &h)) != NULL)
+	  {
+	    pWin->background.pixmap 
+	      = (*pScreen->CreatePixmap)(pScreen, w, h, pScreen->rootDepth);
+
+	    pWin->backgroundState = BackgroundPixmap;
+	    pGC = GetScratchGC(pScreen->rootDepth, pScreen);
+	    if (!pWin->background.pixmap || !pGC)
+	      FatalError("could not create root tile");
+
+	    ValidateGC((DrawablePtr)pWin->background.pixmap, pGC);
+
+	    (*pGC->ops->PutImage)((DrawablePtr)pWin->background.pixmap, 
+				  pGC, 
+				  pScreen->rootDepth,
+				  0, 0, w, h, 0, ZPixmap, (char *)data);
+	    FreeScratchGC(pGC);
+	    
+	    free(data);
+	    return;
+	  }
+	else
+	  ErrorF("Unable to load root window image.");
+      }
+
     pWin->background.pixmap = (*pScreen->CreatePixmap)(pScreen, 4, 4,
 						    pScreen->rootDepth);
 
@@ -357,6 +498,7 @@
 
 }
 
+
 WindowPtr
 AllocateWindow(ScreenPtr pScreen)
 {
diff -u -r xorg-server-X11R7.1-1.1.0.orig/hw/kdrive/src/kdrive.c xorg-server-X11R7.1-1.1.0/hw/kdrive/src/kdrive.c
--- xorg-server-X11R7.1-1.1.0.orig/hw/kdrive/src/kdrive.c	2007-01-08 14:30:38.000000000 +0000
+++ xorg-server-X11R7.1-1.1.0/hw/kdrive/src/kdrive.c	2007-01-15 17:53:06.000000000 +0000
@@ -58,6 +58,9 @@
     { 32, 32 }
 };
 
+int 
+ProcXFixesHideCursor (ClientPtr client) ;
+
 #define NUM_KD_DEPTHS (sizeof (kdDepths) / sizeof (kdDepths[0]))
 
 int                 kdScreenPrivateIndex;
@@ -84,6 +87,9 @@
 KdOsFuncs	*kdOsFuncs;
 extern WindowPtr *WindowTable;
 
+extern Bool CursorInitiallyHidden; /* See Xfixes cursor.c */
+extern char* RootPPM;		   /* dix/window.c */
+
 void
 KdSetRootClip (ScreenPtr pScreen, BOOL enable)
 {
@@ -312,6 +318,7 @@
     KdSetRootClip (pScreen, TRUE);
     if (pScreenPriv->card->cfuncs->dpms)
 	(*pScreenPriv->card->cfuncs->dpms) (pScreen, pScreenPriv->dpmsState);
+
     return TRUE;
 }
 
@@ -686,10 +693,14 @@
     ErrorF("-mouse path[,n]  Filename of mouse device, n is number of buttons\n");
     ErrorF("-switchCmd       Command to execute on vt switch\n");
     ErrorF("-nozap           Don't terminate server on Ctrl+Alt+Backspace\n");
+    ErrorF("-hide-cursor     Start with cursor hidden\n");
+    ErrorF("-root-ppm [path] Specify ppm file to use as root window background.\n");
     ErrorF("vtxx             Use virtual terminal xx instead of the next available\n");
 #ifdef PSEUDO8
     p8UseMsg ();
 #endif
+
+
 }
 
 int
@@ -761,6 +772,19 @@
 	kdSoftCursor = TRUE;
 	return 1;
     }
+    if (!strcmp (argv[i], "-hide-cursor"))
+    {
+      CursorInitiallyHidden = TRUE;
+      return 1;
+    }
+    if (!strcmp (argv[i], "-root-ppm"))
+    {
+      if ((i+1) < argc)
+	RootPPM =  argv[i+1];
+      else
+	UseMsg ();
+      return 2;
+    }
     if (!strcmp (argv[i], "-videoTest"))
     {
 	kdVideoTest = TRUE;
diff -u -r xorg-server-X11R7.1-1.1.0.orig/xfixes/cursor.c xorg-server-X11R7.1-1.1.0/xfixes/cursor.c
--- xorg-server-X11R7.1-1.1.0.orig/xfixes/cursor.c	2007-01-08 14:30:38.000000000 +0000
+++ xorg-server-X11R7.1-1.1.0/xfixes/cursor.c	2007-01-11 16:33:00.000000000 +0000
@@ -59,9 +59,12 @@
 static RESTYPE		CursorWindowType;
 static int		CursorScreenPrivateIndex = -1;
 static int		CursorGeneration;
+static Bool             CursorGloballyHidden; 
 static CursorPtr	CursorCurrent;
 static CursorPtr        pInvisibleCursor = NULL;
 
+Bool CursorInitiallyHidden = FALSE;
+
 static void deleteCursorHideCountsForScreen (ScreenPtr pScreen);
 
 #define VERIFY_CURSOR(pCursor, cursor, client, access) { \
@@ -130,7 +133,7 @@
 
     Unwrap (cs, pScreen, DisplayCursor);
 
-    if (cs->pCursorHideCounts != NULL) {
+    if (cs->pCursorHideCounts != NULL || CursorGloballyHidden) {
 	ret = (*pScreen->DisplayCursor) (pScreen, pInvisibleCursor);
     } else {
 	ret = (*pScreen->DisplayCursor) (pScreen, pCursor);
@@ -848,6 +851,12 @@
 	return BadWindow;
     }
 
+    /* Is cursor set to be initially hidden ?, if so reset this 
+     * flag as now visibility assumed under control of client.
+    */
+    if (CursorGloballyHidden)
+      CursorGloballyHidden = FALSE;
+
     /* 
      * Has client hidden the cursor before on this screen? 
      * If so, just increment the count. 
@@ -899,9 +908,19 @@
 	return BadWindow;
     }
 
+    /* X was started with cursor hidden, therefore just reset our flag
+     * (returning to normal client control) and cause cursor to now be
+     * shown.
+    */
+    if (CursorGloballyHidden == TRUE)
+      {
+	CursorGloballyHidden = FALSE;
+	return (client->noClientException);
+      }
+
     /* 
      * Has client hidden the cursor on this screen?
-     * If not, generate an error.
+     * If so, generate an error.
      */
     pChc = findCursorHideCount(client, pWin->drawable.pScreen);
     if (pChc == NULL) {
@@ -1009,6 +1028,8 @@
 XFixesCursorInit (void)
 {
     int	i;
+
+    CursorGloballyHidden = CursorInitiallyHidden;
     
     if (CursorGeneration != serverGeneration)
     {
