diff --git a/configure.ac b/configure.ac
index 6737f24..66d7354 100644
--- a/configure.ac
+++ b/configure.ac
@@ -24,6 +24,7 @@ PKG_CHECK_MODULES(BIG, clutter-cairo-0.8 gtk+-2.0 librsvg-2.0)
 PKG_CHECK_MODULES(GDMUSER, dbus-glib-1 gtk+-2.0)
 PKG_CHECK_MODULES(TRAY, gtk+-2.0)
 PKG_CHECK_MODULES(TASKPANEL, libwnck-1.0 dbus-glib-1)
+PKG_CHECK_MODULES(WNCK, libwnck-1.0)
 # We require libgnomeui for generating thumbnails for recent files with GnomeThumbnailFactory.
 # We'll switch to using GnomeDesktopThumbnailFactory once the branch of gnome-desktop that contains
 # it becomes stable.
diff --git a/js/ui/panel.js b/js/ui/panel.js
index 3380cb6..6a31046 100644
--- a/js/ui/panel.js
+++ b/js/ui/panel.js
@@ -57,6 +57,12 @@ Panel.prototype = {
         this._statusmenu.connect('deactivated', function (sm) {
             statusbutton.release();
         });
+        global.connect('panel-state-change', function (sm, st) {
+            if (st == 1)
+                me._box.hide ();
+            else
+                me._box.show ();
+        });
 
         this._clock = new Clutter.Label({ font_name: "Sans Bold 16px",
                                           text: "" });
diff --git a/src/Makefile.am b/src/Makefile.am
index a6cd65a..5297bf6 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -12,6 +12,7 @@ include Makefile-tray.am
 include Makefile-taskpanel.am
 
 gnome_shell_cflags =				\
+	$(WNCK_CFLAGS)			        \
 	$(MUTTER_PLUGIN_CFLAGS)			\
         $(LIBGNOMEUI_CFLAGS)                    \
 	-Itray					\
@@ -79,6 +80,7 @@ libgnome_shell_la_LDFLAGS = -avoid-version -module
 libgnome_shell_la_LIBADD =	\
 	$(MUTTER_PLUGIN_LIBS)	\
         $(LIBGNOMEUI_LIBS)      \
+	$(WNCK_LIBS)	        \
 	libbig-1.0.la		\
 	libgdmuser-1.0.la	\
 	libtidy-1.0.la		\
diff --git a/src/big/box.c b/src/big/box.c
index 8587a36..221b064 100644
--- a/src/big/box.c
+++ b/src/big/box.c
@@ -115,6 +115,7 @@ struct _BigBoxPrivate
   BigBoxAlignment          background_y_align;
   ClutterActor            *background_rectangle;
 
+  gboolean                 draw;
   guint                    draw_rounded_corner : 1;
   guint                    debug               : 1;
 };
@@ -2199,7 +2200,8 @@ big_box_paint (ClutterActor *actor)
   ClutterGeometry bg_rect;
   int border_top, border_bottom, border_left, border_right;
   int padding_top, padding_bottom, padding_left, padding_right;
-
+  if (!self->priv->draw)
+        return;
   /* First, convert everything to pixels */
   border_top = CLUTTER_UNITS_TO_DEVICE (self->priv->border_top);
   border_bottom = CLUTTER_UNITS_TO_DEVICE (self->priv->border_bottom);
@@ -2747,7 +2749,7 @@ big_box_init (BigBox *box)
 
   box->priv->background_rectangle = NULL;
   box->priv->draw_rounded_corner = FALSE;
-
+  box->priv->draw = TRUE;
   /* both bg and border colors default to black and transparent (all bits 0) */
 }
 
@@ -3048,3 +3050,15 @@ big_box_set_border_width (BigBox *box, int border_width)
       big_box_update_draw_rounded_corner (box);
     }
 }
+
+void
+big_box_show (BigBox              *box)
+{
+        box->priv->draw = TRUE;
+}
+
+void
+big_box_hide (BigBox              *box)
+{
+        box->priv->draw = FALSE;
+}
diff --git a/src/big/box.h b/src/big/box.h
index 1d4878f..e6fb418 100644
--- a/src/big/box.h
+++ b/src/big/box.h
@@ -124,6 +124,10 @@ void           big_box_set_padding       (BigBox              *box,
 void           big_box_set_border_width  (BigBox              *box,
                                           int                  border_width);
 
+void           big_box_show              (BigBox              *box);
+
+void           big_box_hide              (BigBox              *box);
+
 G_END_DECLS
 
 #endif /* __BIG_BOX_H__ */
diff --git a/src/shell-global.c b/src/shell-global.c
index fdffaa7..28270fe 100644
--- a/src/shell-global.c
+++ b/src/shell-global.c
@@ -11,6 +11,9 @@
 #include <string.h>
 #include <dbus/dbus-glib.h>
 #include <libgnomeui/gnome-thumbnail.h>
+#define WNCK_I_KNOW_THIS_IS_UNSTABLE
+#include <libwnck/libwnck.h>
+
 
 #define SHELL_DBUS_SERVICE "org.gnome.Shell"
 
@@ -32,6 +35,7 @@ struct _ShellGlobal {
   int input_y;
   int input_width;
   int input_height;
+  DBusGProxy *proxy;
   
   MutterPlugin *plugin;
   ShellWM *wm;
@@ -57,6 +61,7 @@ enum
 {
   PANEL_RUN_DIALOG,
   PANEL_MAIN_MENU,
+  PANEL_STATE_CHANGE,
   LAST_SIGNAL
 };
 
@@ -129,10 +134,43 @@ shell_global_get_property(GObject         *object,
 }
 
 static void
+on_window_state_changed (WnckWindow     *window, WnckWindowState changed_mask,
+               WnckWindowState new_state, ShellGlobal *global)
+{
+        if (wnck_window_is_fullscreen (window))
+          g_signal_emit_by_name (global, "panel-state-change", 1, G_TYPE_NONE);
+        else 
+          g_signal_emit_by_name (global, "panel-state-change", 0, G_TYPE_NONE);
+}
+
+static void
+on_active_window_changed (WnckScreen *screen, WnckWindow *pactive, ShellGlobal *global)
+{
+  WnckWindow* active = wnck_screen_get_active_window (screen);
+  if (pactive != NULL)
+    g_signal_handlers_disconnect_by_func (pactive, on_window_state_changed, global);
+  if (active != NULL)
+    g_signal_connect (active, "state-changed", on_window_state_changed, global);
+  g_signal_emit_by_name (active, "state-changed", global, G_TYPE_NONE);
+}
+
+static void
+on_screensaver_change_state (DBusGProxy *object, gboolean state, ShellGlobal *global)
+{
+  if (state)
+    g_signal_emit_by_name (global, "panel-state-change", 1, G_TYPE_NONE);
+  else 
+    g_signal_emit_by_name (global, "panel-state-change", 0, G_TYPE_NONE);
+}
+
+static void
 shell_global_init (ShellGlobal *global)
 {
   const char *datadir = g_getenv ("GNOME_SHELL_DATADIR");
   char *imagedir;
+  DBusGConnection *connection;
+  WnckScreen* screen = wnck_screen_get_default ();
+  GError *error = NULL;
 
   if (!datadir)
     datadir = GNOME_SHELL_DATADIR;
@@ -153,6 +191,21 @@ shell_global_init (ShellGlobal *global)
   global->grab_notifier = GTK_WINDOW (gtk_window_new (GTK_WINDOW_TOPLEVEL));
   g_signal_connect (global->grab_notifier, "grab-notify", G_CALLBACK (grab_notify), global);
   global->grab_active = FALSE;
+
+  g_signal_connect (screen, "active-window-changed", on_active_window_changed, global);
+
+  connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
+  if (connection == NULL) {
+    g_printerr ("Failed to open connection to bus: %s\n",
+                error->message);
+    g_error_free (error);
+    exit (1);
+  }
+  global->proxy = dbus_g_proxy_new_for_name_owner (connection, "org.gnome.ScreenSaver",
+                                                         "/org/gnome/ScreenSaver", "org.gnome.ScreenSaver", NULL);
+  dbus_g_proxy_add_signal (global->proxy, "ActiveChanged", G_TYPE_BOOLEAN, G_TYPE_INVALID);
+  dbus_g_proxy_connect_signal (global->proxy, "ActiveChanged",
+                               G_CALLBACK (on_screensaver_change_state), global, NULL);
 }
 
 static void
@@ -181,6 +234,15 @@ shell_global_class_init (ShellGlobalClass *klass)
 		  g_cclosure_marshal_VOID__INT,
 		  G_TYPE_NONE, 1, G_TYPE_INT);
 
+  shell_global_signals[PANEL_STATE_CHANGE] =
+    g_signal_new ("panel-state-change",
+		  G_TYPE_FROM_CLASS (klass),
+		  G_SIGNAL_RUN_LAST,
+		  G_STRUCT_OFFSET (ShellGlobalClass, panel_state_change),
+		  NULL, NULL,
+		  g_cclosure_marshal_VOID__INT,
+		  G_TYPE_NONE, 1, G_TYPE_INT);
+
   g_object_class_install_property (gobject_class,
                                    PROP_OVERLAY_GROUP,
                                    g_param_spec_object ("overlay-group",
diff --git a/src/shell-global.h b/src/shell-global.h
index 8d07b47..0020f48 100644
--- a/src/shell-global.h
+++ b/src/shell-global.h
@@ -27,6 +27,8 @@ struct _ShellGlobalClass
 			    int      timestamp);
   void (*panel_main_menu) (ShellGlobal *global,
 			   int      timestamp);
+  void (*panel_state_change) (ShellGlobal *global,
+			   int      timestamp);
 };
 
 GType            shell_global_get_type            (void) G_GNUC_CONST;
