diff --git a/src/compositor.c b/src/compositor.c
index e6f172330ac130b9fa1e793e22fb6a167eaa1d4e..4e3c5d49b7d22a29944dcf84f583cc54e613c751 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -73,11 +73,14 @@ struct _CWindow
     Window id;
     XWindowAttributes attr;
 
-    Damage damage;
     gboolean damaged;
     gboolean viewable;
     gboolean shaped;
+    gboolean redirected;
+    gboolean argb;
+    gboolean skipped;
 
+    Damage damage;
 #if HAVE_NAME_WINDOW_PIXMAP
     Pixmap name_window_pixmap;
 #endif /* HAVE_NAME_WINDOW_PIXMAP */
@@ -86,16 +89,16 @@ struct _CWindow
     Picture alphaPict;
     Picture shadowPict;
     Picture alphaBorderPict;
+
     XserverRegion borderSize;
     XserverRegion borderClip;
     XserverRegion extents;
+
     gint shadow_dx;
     gint shadow_dy;
     gint shadow_width;
     gint shadow_height;
     guint opacity;
-    gboolean argb;
-    gboolean skipped;
 };
 
 static CWindow*
@@ -1655,6 +1658,7 @@ add_win (DisplayInfo *display_info, Window id, Client *c)
     new->screen_info = screen_info;
     new->id = id;
     new->damaged = FALSE;
+    new->redirected = TRUE;
     new->shaped = is_shaped (display_info, id);
     new->viewable = (new->attr.map_state == IsViewable);
     if ((new->attr.class != InputOnly) && (id != screen_info->xroot))
@@ -1695,7 +1699,7 @@ add_win (DisplayInfo *display_info, Window id, Client *c)
     myDisplayUngrabServer (display_info);
 }
 
-void
+static void
 restack_win (CWindow *cw, Window above)
 {
     ScreenInfo *screen_info;
@@ -1751,7 +1755,7 @@ restack_win (CWindow *cw, Window above)
     }
 }
 
-void
+static void
 resize_win (CWindow *cw, gint x, gint y, gint width, gint height, gint bw, gboolean shape_notify)
 {
     XserverRegion extents;
@@ -2359,9 +2363,6 @@ compositorInitDisplay (DisplayInfo *display_info)
 {
 #ifdef HAVE_COMPOSITOR
 
-    g_return_if_fail (display_info != NULL);
-    TRACE ("entering compositorInitDisplay");
-
     if (!XCompositeQueryExtension (display_info->dpy,
                                 &display_info->composite_event_base,
                                 &display_info->composite_error_base))
@@ -2427,6 +2428,9 @@ compositorInitDisplay (DisplayInfo *display_info)
     {
         g_warning ("Compositing manager disabled.");
     }
+
+    display_info->composite_mode = 0;
+
 #else /* HAVE_COMPOSITOR */
     display_info->enable_compositor = FALSE;
 #endif /* HAVE_COMPOSITOR */
@@ -2448,8 +2452,26 @@ compositorRepairDisplay (DisplayInfo *display_info)
 #endif /* HAVE_COMPOSITOR */
 }
 
+void
+compositorSetCompositeMode (DisplayInfo *display_info, gboolean use_manual_redirect)
+{
+#ifdef HAVE_COMPOSITOR
+    g_return_if_fail (display_info != NULL);
+    TRACE ("entering compositorSetCompositeMode");
+
+    if (use_manual_redirect)
+    {
+        display_info->composite_mode = CompositeRedirectManual;
+    }
+    else
+    {
+        display_info->composite_mode = CompositeRedirectAutomatic;
+    }
+#endif /* HAVE_COMPOSITOR */
+}
+
 gboolean
-compositorManageScreen (ScreenInfo *screen_info, gboolean manual_redirect)
+compositorManageScreen (ScreenInfo *screen_info)
 {
 #ifdef HAVE_COMPOSITOR
     DisplayInfo *display_info;
@@ -2461,7 +2483,6 @@ compositorManageScreen (ScreenInfo *screen_info, gboolean manual_redirect)
 
     display_info = screen_info->display_info;
     screen_info->compositor_active = FALSE;
-    screen_info->manual_redirect = manual_redirect;
 
     if (!(display_info->enable_compositor))
     {
@@ -2469,22 +2490,16 @@ compositorManageScreen (ScreenInfo *screen_info, gboolean manual_redirect)
     }
 
     gdk_error_trap_push ();
-    if (screen_info->manual_redirect)
-    {
-        XCompositeRedirectSubwindows (display_info->dpy, screen_info->xroot, CompositeRedirectManual);
-    }
-    else
-    {
-        XCompositeRedirectSubwindows (display_info->dpy, screen_info->xroot, CompositeRedirectAutomatic);
-    }
+    XCompositeRedirectSubwindows (display_info->dpy, screen_info->xroot, display_info->composite_mode);
     XSync (display_info->dpy, FALSE);
+
     if (gdk_error_trap_pop ())
     {
         g_warning ("Another compositing manager is running on screen %i", screen_info->screen);
         return FALSE;
     }
 
-    if (!manual_redirect)
+    if (display_info->composite_mode == CompositeRedirectAutomatic)
     {
         /* That's enough for automatic compositing */
         return TRUE;
@@ -2590,15 +2605,7 @@ compositorUnmanageScreen (ScreenInfo *screen_info)
     }
 
     screen_info->gsize = -1;
-
-    if (screen_info->manual_redirect)
-    {
-        XCompositeUnredirectSubwindows (display_info->dpy, screen_info->xroot, CompositeRedirectManual);
-    }
-    else
-    {
-        XCompositeUnredirectSubwindows (display_info->dpy, screen_info->xroot, CompositeRedirectAutomatic);
-    }
+    XCompositeUnredirectSubwindows (display_info->dpy, screen_info->xroot, display_info->composite_mode);
 #endif /* HAVE_COMPOSITOR */
 }
 
diff --git a/src/compositor.h b/src/compositor.h
index ee31b5e16d91da52bbfe91b2c7e412531895f896..bec0289181a3a51ef567028a88e5e96746f2bc3a 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -32,24 +32,35 @@
 #include "screen.h"
 #include "client.h"
 
-void     compositorMapWindow        (DisplayInfo *, Window);
-void     compositorUnmapWindow      (DisplayInfo *, Window);
-void     compositorAddWindow        (DisplayInfo *, Window, Client *);
-void     compositorRemoveWindow     (DisplayInfo *, Window);
+void     compositorMapWindow        (DisplayInfo *,
+                                     Window);
+void     compositorUnmapWindow      (DisplayInfo *,
+                                     Window);
+void     compositorAddWindow        (DisplayInfo *, 
+                                     Window, 
+                                     Client *);
+void     compositorRemoveWindow     (DisplayInfo *,
+                                     Window);
 
-void     compositorHandleEvent      (DisplayInfo *, XEvent *);
-gboolean compositorCheckDamageEvent (DisplayInfo *display_info);
+void     compositorHandleEvent      (DisplayInfo *,
+                                     XEvent *);
+gboolean compositorCheckDamageEvent (DisplayInfo *);
 void     compositorInitDisplay      (DisplayInfo *);
 void     compositorRepairDisplay    (DisplayInfo *);
+void     compositorSetCompositeMode (DisplayInfo *,
+                                     gboolean);
 
-gboolean compositorManageScreen     (ScreenInfo *, gboolean);
+gboolean compositorManageScreen     (ScreenInfo *);
 void     compositorUnmanageScreen   (ScreenInfo *);
 void     compositorRepairScreen     (ScreenInfo *);
 void     compositorRebuildScreen    (ScreenInfo *);
 void     compositorUpdateScreenSize (ScreenInfo *);
 
-void     compositorWindowSetOpacity (DisplayInfo *, Window, guint);
-void     compositorDamageWindow     (DisplayInfo *, Window);
+void     compositorWindowSetOpacity (DisplayInfo *,
+                                     Window,
+                                     guint);
+void     compositorDamageWindow     (DisplayInfo *,
+                                     Window);
 gboolean compositorTestServer       (DisplayInfo *);
 
 #endif /* INC_COMPOSITOR_H */
diff --git a/src/display.h b/src/display.h
index 26dfb76baa552f91b7791466f200fc7ff466505e..3d24993a758221d36b735c8e72f473b3c95e106e 100644
--- a/src/display.h
+++ b/src/display.h
@@ -217,6 +217,7 @@ struct _DisplayInfo
     gint damage_event_base;
     gint fixes_error_base;
     gint fixes_event_base;
+    gint composite_mode;
 
     gboolean have_composite;
     gboolean have_damage;
diff --git a/src/main.c b/src/main.c
index 2af6c6d154d86fafca6ec97fb05889319e48eabf..e498a17ac580464344ffaf84fda70d7cd3b69e2d 100644
--- a/src/main.c
+++ b/src/main.c
@@ -413,6 +413,7 @@ initialize (int argc, char **argv, gint compositor_mode)
     {
         display_info->enable_compositor = FALSE;
     }
+    compositorSetCompositeMode (display_info, (compositor_mode == 2));
 #else /* HAVE_COMPOSITOR */
     display_info->enable_compositor = FALSE;
 #endif /* HAVE_COMPOSITOR */
@@ -448,7 +449,7 @@ initialize (int argc, char **argv, gint compositor_mode)
         
         if (compositor_mode)
         {
-            if (compositorManageScreen (screen_info, (compositor_mode == 2)))
+            if (compositorManageScreen (screen_info))
             {
                 setCompositingManagerOwner (display_info,  screen_info->xroot, screen_info->xfwm4_win);
             }
diff --git a/src/screen.h b/src/screen.h
index c2d46ab69ddc673e6b29e726db66d3a6a2b205d0..4f4b72b71dc5bb3952aaa226af8e710bbe547301 100644
--- a/src/screen.h
+++ b/src/screen.h
@@ -132,7 +132,6 @@ struct _ScreenInfo
 
 #ifdef HAVE_COMPOSITOR
     gboolean compositor_active;
-    gboolean manual_redirect;
     
     GList *cwindows;