diff --git a/gdk/x11/gdkcolor-x11.c b/gdk/x11/gdkcolor-x11.c
index 35c18b8..104d8e9 100644
--- a/gdk/x11/gdkcolor-x11.c
+++ b/gdk/x11/gdkcolor-x11.c
@@ -365,47 +365,11 @@ gdk_screen_get_system_colormap (GdkScreen *screen)
   g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
   screen_x11 = GDK_SCREEN_X11 (screen);
 
-  if (screen_x11->system_colormap)
-    return screen_x11->system_colormap;
+  if (!screen_x11->system_colormap)
+    screen_x11->system_colormap = gdk_colormap_new (screen_x11->system_visual,
+						  FALSE);
 
-  colormap = g_object_new (GDK_TYPE_COLORMAP, NULL);
-  private = GDK_COLORMAP_PRIVATE_DATA (colormap);
-
-  private->screen = screen;
-  colormap->visual = gdk_screen_get_system_visual (screen);
-  
-  private->xcolormap = DefaultColormapOfScreen (screen_x11->xscreen);
-  private->private_val = FALSE;
-
-  private->hash = NULL;
-  private->last_sync_time = 0;
-  private->info = NULL;
-
-  colormap->colors = NULL;
-  colormap->size = colormap->visual->colormap_size;
-
-  switch (colormap->visual->type)
-    {
-    case GDK_VISUAL_GRAYSCALE:
-    case GDK_VISUAL_PSEUDO_COLOR:
-      private->info = g_new0 (GdkColorInfo, colormap->size);
-      private->hash = g_hash_table_new ((GHashFunc) gdk_color_hash,
-					(GEqualFunc) gdk_color_equal);
-      /* Fall through */
-    case GDK_VISUAL_STATIC_GRAY:
-    case GDK_VISUAL_STATIC_COLOR:
-    case GDK_VISUAL_DIRECT_COLOR:
-      colormap->colors = g_new (GdkColor, colormap->size);
-      gdk_colormap_sync (colormap, TRUE);
-      
-    case GDK_VISUAL_TRUE_COLOR:
-      break;
-    }
-  
-  gdk_colormap_add (colormap);
-  screen_x11->system_colormap = colormap;
-  
-  return colormap;
+  return screen_x11->system_colormap;
 }
 
 /**
diff --git a/gdk/x11/gdkvisual-x11.c b/gdk/x11/gdkvisual-x11.c
index e06c356..6539532 100644
--- a/gdk/x11/gdkvisual-x11.c
+++ b/gdk/x11/gdkvisual-x11.c
@@ -115,6 +115,7 @@ _gdk_visual_init (GdkScreen *screen)
   int nxvisuals;
   int nvisuals;
   int i, j;
+  gboolean rgba_system_visual;
   
   g_return_if_fail (GDK_IS_SCREEN (screen));
   screen_x11 = GDK_SCREEN_X11 (screen);
@@ -244,6 +245,9 @@ _gdk_visual_init (GdkScreen *screen)
 	}
     }
 
+  /* If requested override the x11 provided system visual with an rgba visual */
+  rgba_system_visual = g_getenv ("GTK_RGBA_VISUAL") != NULL;
+
   for (i = 0; i < nvisuals; i++)
     {
       if (default_xvisual->visualid == visuals[i]->xvisual->visualid)
@@ -259,6 +263,12 @@ _gdk_visual_init (GdkScreen *screen)
 	   visuals[i]->visual.blue_mask  == 0x0000ff))
 	{
 	  screen_x11->rgba_visual = GDK_VISUAL (visuals[i]);
+
+	  if (rgba_system_visual)
+	    {
+	      screen_x11->system_visual = visuals[i];
+	      break;
+	    }
 	}
     }
 
