diff --git a/ChangeLog b/ChangeLog
index 6a19a4052ead42322ae266a2c0204f8e94c8c926..5f2144b09e7216d5955ff8b34207337391d7e657 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,7 @@
 
+2009-04-14 19:19 Ali aliov@xfce.org 
+	 * : Add option to inhibit backlight sleep in the context menu+updates on the battery code
+
 2009-04-14  9:49 Ali aliov@xfce.org 
 	 * : Commit all changes for beta2
 
diff --git a/configure.ac.in b/configure.ac.in
index 46cb8b1397dff6ae897a8edf935f1d70c078c04d..0e68fc9ab0e78d814a32896b186dae4a0cdc764d 100644
--- a/configure.ac.in
+++ b/configure.ac.in
@@ -3,7 +3,7 @@ m4_define([xfpm_version_major],  [0])
 m4_define([xfpm_version_minor],  [8])
 m4_define([xfpm_version_micro],  [0])
 m4_define([xfpm_version_build],  [])
-m4_define([xfpm_version_tag],[beta2])
+m4_define([xfpm_version_tag],[r@REVISION@])
 m4_define([xfpm_version], [xfpm_version_major().xfpm_version_minor().xfpm_version_micro()ifelse(xfpm_version_tag(), [svn], [xfpm_version_tag().xfpm_version_build()], [xfpm_version_tag()])])
 
 AC_INIT([xfce4-power-manager], [xfpm_version], [http://bugzilla.xfce.org/])
diff --git a/panel-plugins/inhibit/inhibit-plugin.c b/panel-plugins/inhibit/inhibit-plugin.c
index afc8ebb9383d3029c60c9b16bf2aa425f4ae0363..3009d5a3ef608e91a8a9742f5d27ffbd16b09d92 100644
--- a/panel-plugins/inhibit/inhibit-plugin.c
+++ b/panel-plugins/inhibit/inhibit-plugin.c
@@ -555,14 +555,14 @@ inhibit_plugin_set_inhibit_screen_saver (inhibit_t *inhibit)
 
     if ( inhibit_plugin_inhibit_screen_saver (inhibit, 
 					      "org.freedesktop.ScreenSaver",
-					      "/org/freedesktop/ScreenSaver/Inhibit",
+					      "/org/freedesktop/ScreenSaver",
 					      "org.freedesktop.ScreenSaver") )
     {
 	inhibit->saver_inhibited = TRUE;
     }
     else if ( inhibit_plugin_inhibit_screen_saver (inhibit, 
 						   "org.gnome.ScreenSaver",
-						   "/org/gnome/ScreenSaver/Inhibit",
+						   "/org/gnome/ScreenSaver",
 					           "org.gnome.ScreenSaver") )
     {
 	
diff --git a/src/xfpm-battery.c b/src/xfpm-battery.c
index ff36d10651c91bba778f8c522a41d409c165c887..cd5f2b1eae32963042e1d256a1566f3e16f469f1 100644
--- a/src/xfpm-battery.c
+++ b/src/xfpm-battery.c
@@ -155,15 +155,14 @@ xfpm_battery_refresh_visible_icon (XfpmBattery *battery)
     
 static void
 xfpm_battery_refresh_icon (XfpmBattery *battery, 
-			   gboolean is_present,
-			   guint percentage
-			   )
+			   XfpmBatteryState state,
+			   guint percentage)
 {
     gchar *icon;
 
     XFPM_DEBUG_ENUM ("battery state", battery->priv->state, XFPM_TYPE_BATTERY_STATE)
     
-    if ( !is_present )
+    if ( state == BATTERY_NOT_PRESENT )
     {
 	xfpm_tray_icon_set_icon (battery->priv->icon, 
 				 battery->priv->type == HAL_DEVICE_TYPE_UPS ? "gpm-ups-missing" : "gpm-primary-missing");
@@ -171,7 +170,7 @@ xfpm_battery_refresh_icon (XfpmBattery *battery,
     }
     
     /* Battery full */
-    if ( battery->priv->state == BATTERY_FULLY_CHARGED )
+    if ( state == BATTERY_FULLY_CHARGED )
     {
 	if ( battery->priv->type == HAL_DEVICE_TYPE_PRIMARY)
 	    xfpm_tray_icon_set_icon (battery->priv->icon, battery->priv->adapter_present ? "gpm-primary-charged" : "gpm-primary-100");
@@ -184,7 +183,7 @@ xfpm_battery_refresh_icon (XfpmBattery *battery,
 	    g_free(icon);
 	}
     }
-    else if ( battery->priv->state == BATTERY_NOT_FULLY_CHARGED )
+    else if ( state == BATTERY_NOT_FULLY_CHARGED )
     {
 	if ( battery->priv->adapter_present )
 	{
@@ -203,7 +202,7 @@ xfpm_battery_refresh_icon (XfpmBattery *battery,
 	g_free(icon);
 	
     }
-    else if ( battery->priv->state == BATTERY_IS_CHARGING )
+    else if ( state == BATTERY_IS_CHARGING )
     {
 	icon = g_strdup_printf("%s%s-%s",
 			      battery->priv->icon_prefix, 
@@ -213,8 +212,8 @@ xfpm_battery_refresh_icon (XfpmBattery *battery,
 	xfpm_tray_icon_set_icon (battery->priv->icon, icon);
 	g_free(icon);
     }
-    else if ( battery->priv->state == BATTERY_IS_DISCHARGING || battery->priv->state == BATTERY_CHARGE_CRITICAL ||
-	      battery->priv->state == BATTERY_CHARGE_LOW )
+    else if ( state == BATTERY_IS_DISCHARGING || state == BATTERY_CHARGE_CRITICAL ||
+	      state == BATTERY_CHARGE_LOW )
     {
 	icon = g_strdup_printf("%s%s",
 			      battery->priv->icon_prefix, 
@@ -227,23 +226,20 @@ xfpm_battery_refresh_icon (XfpmBattery *battery,
 }
 
 static void
-xfpm_battery_refresh_state (XfpmBattery *battery, XfpmBatteryState state)
+xfpm_battery_notify (XfpmBattery *battery)
 {
     const gchar *message;
     gboolean notify;
     
     notify = xfpm_xfconf_get_property_bool (battery->priv->conf, GENERAL_NOTIFICATION_CFG);
     
-    if ( battery->priv->state != state)
+    if ( notify )
     {
-	battery->priv->state = state;
-	if ( notify )
-	{
-	    message = xfpm_battery_get_message_from_battery_state (state, battery->priv->adapter_present );
-	    if ( !message )
-		goto signal;
+	message = xfpm_battery_get_message_from_battery_state (battery->priv->state, battery->priv->adapter_present);
+	if ( !message )
+	    return;
 	
-	    xfpm_notify_show_notification (battery->priv->notify, 
+	xfpm_notify_show_notification (battery->priv->notify, 
 				       _("Xfce power manager"), 
 				       message, 
 				       xfpm_tray_icon_get_icon_name (battery->priv->icon),
@@ -251,10 +247,6 @@ xfpm_battery_refresh_state (XfpmBattery *battery, XfpmBatteryState state)
 				       battery->priv->type == HAL_DEVICE_TYPE_PRIMARY ? FALSE : TRUE,
 				       XFPM_NOTIFY_NORMAL,
 				       xfpm_tray_icon_get_tray_icon(battery->priv->icon));
-	}
-signal:
-	g_signal_emit (G_OBJECT(battery), signals[BATTERY_STATE_CHANGED], 0, state);
-	TRACE("Emitting signal battery state changed");
     }
 }
 
@@ -324,10 +316,24 @@ xfpm_battery_get_battery_state (XfpmBatteryState *state,
 }
 
 static void
-xfpm_battery_refresh_tooltip_misc (XfpmBattery *battery, gboolean is_present, 
-				   gboolean is_charging, gboolean is_discharging,
-				   guint32 last_full, guint32 current_charge,
-				   guint percentage, guint time)
+xfpm_battery_refresh_common (XfpmBattery *battery, guint percentage, XfpmBatteryState state)
+{
+    xfpm_battery_refresh_icon (battery, state, percentage);
+    
+    if ( battery->priv->state != state)
+    {
+	battery->priv->state = state;
+	TRACE("Emitting signal battery state changed");
+	g_signal_emit (G_OBJECT(battery), signals[BATTERY_STATE_CHANGED], 0, state);
+	xfpm_battery_notify (battery);
+    }
+}
+
+static void
+xfpm_battery_refresh_misc (XfpmBattery *battery, gboolean is_present, 
+			   gboolean is_charging, gboolean is_discharging,
+			   guint32 last_full, guint32 current_charge,
+			   guint percentage, guint time)
 {
     gchar *tip;
     guint critical_level = xfpm_xfconf_get_property_int (battery->priv->conf, CRITICAL_POWER_LEVEL );
@@ -337,6 +343,7 @@ xfpm_battery_refresh_tooltip_misc (XfpmBattery *battery, gboolean is_present,
 	tip = g_strdup_printf ("%s %s", _get_battery_name(battery->priv->type), _("is not present"));
 	xfpm_tray_icon_set_tooltip (battery->priv->icon, tip);
 	g_free(tip);
+	battery->priv->state = BATTERY_NOT_PRESENT;
 	return;
     }
     
@@ -348,14 +355,15 @@ xfpm_battery_refresh_tooltip_misc (XfpmBattery *battery, gboolean is_present,
     //FIXME: Time for misc batteries
     xfpm_tray_icon_set_tooltip (battery->priv->icon, tip);
     g_free (tip);
-    xfpm_battery_refresh_state (battery, state);
+    
+    xfpm_battery_refresh_common (battery, percentage, state);
 }
 
 static void
-xfpm_battery_refresh_tooltip_primary (XfpmBattery *battery, gboolean is_present, 
-				      gboolean is_charging, gboolean is_discharging,
-				      guint32 last_full, guint32 current_charge,
-				      guint percentage, guint time)
+xfpm_battery_refresh_primary (XfpmBattery *battery, gboolean is_present, 
+			      gboolean is_charging, gboolean is_discharging,
+			      guint32 last_full, guint32 current_charge,
+			      guint percentage, guint time)
 {
     gchar *tip;
     const gchar *str;
@@ -366,6 +374,7 @@ xfpm_battery_refresh_tooltip_primary (XfpmBattery *battery, gboolean is_present,
     if ( !is_present )
     {
 	xfpm_tray_icon_set_tooltip(battery->priv->icon, _("Battery not present"));
+	battery->priv->state = BATTERY_NOT_PRESENT;
 	return;
     }
 
@@ -420,7 +429,8 @@ xfpm_battery_refresh_tooltip_primary (XfpmBattery *battery, gboolean is_present,
 
     xfpm_tray_icon_set_tooltip(battery->priv->icon, tip);
     g_free(tip);
-    xfpm_battery_refresh_state (battery, state);
+
+    xfpm_battery_refresh_common (battery, percentage, state);
 }
 
 static void
@@ -442,16 +452,15 @@ xfpm_battery_refresh (XfpmBattery *battery)
 		  NULL);
     
     battery->priv->type == HAL_DEVICE_TYPE_PRIMARY ?
-			   xfpm_battery_refresh_tooltip_primary (battery, is_present, 
-								 is_charging, is_discharging, 
-								 last_full, current_charge,
-								 percentage, time)
+			   xfpm_battery_refresh_primary (battery, is_present, 
+							 is_charging, is_discharging, 
+							 last_full, current_charge,
+							 percentage, time)
   					           :
-			    xfpm_battery_refresh_tooltip_misc   (battery, is_present, 
-								 is_charging, is_discharging, 
-								 last_full, current_charge,
-								 percentage, time);
-    xfpm_battery_refresh_icon (battery, is_present, percentage);
+			    xfpm_battery_refresh_misc   (battery, is_present, 
+							 is_charging, is_discharging, 
+							 last_full, current_charge,
+							 percentage, time);
     xfpm_battery_refresh_visible_icon (battery);
 }
 
@@ -625,10 +634,9 @@ xfpm_battery_get_device (XfpmBattery *battery)
     return battery->priv->device;
 }
 
-//FIXME: default g_return value
 XfpmBatteryState xfpm_battery_get_state (XfpmBattery *battery)
 {
-    g_return_val_if_fail (XFPM_IS_BATTERY(battery), 0);
+    g_return_val_if_fail (XFPM_IS_BATTERY(battery), BATTERY_NOT_PRESENT);
     
     return battery->priv->state;
 }
diff --git a/src/xfpm-engine.c b/src/xfpm-engine.c
index 45bf9ff702a613fbd3c83edadd873451ec73dbce..f9b941c3668a51cfb6d3bbd82b0b968d9ec0e524 100644
--- a/src/xfpm-engine.c
+++ b/src/xfpm-engine.c
@@ -47,6 +47,7 @@
 #include "xfpm-button.h"
 #include "xfpm-inhibit.h"
 #include "xfpm-backlight.h"
+#include "xfpm-screen-saver.h"
 #include "xfpm-shutdown.h"
 #include "xfpm-idle.h"
 #include "xfpm-errors.h"
@@ -78,6 +79,7 @@ struct XfpmEnginePrivate
     XfpmShutdown        *shutdown;
     XfpmButton          *button;
     XfpmIdle            *idle;
+    XfpmScreenSaver     *srv;
 #ifdef HAVE_DPMS
     XfpmDpms *dpms;
 #endif
@@ -352,6 +354,21 @@ xfpm_engine_alarm_timeout_cb (XfpmIdle *idle, guint id, XfpmEngine *engine)
 {
     TRACE ("Alarm inactivity timeout id %d", id);
     gboolean sleep_mode;
+    gboolean saver;
+    
+    if ( engine->priv->inhibited )
+    {
+	TRACE ("Power manager is currently inhibited");
+	return;
+    }
+    
+    saver = xfpm_screen_saver_get_inhibit (engine->priv->srv);
+    
+    if ( saver )
+    {
+	TRACE ("User disabled sleep on the context menu");
+	return;
+    }
     
     sleep_mode = xfpm_xfconf_get_property_bool (engine->priv->conf, INACTIVITY_SLEEP_MODE);
 
@@ -399,7 +416,7 @@ xfpm_engine_init (XfpmEngine * engine)
     engine->priv->shutdown = xfpm_shutdown_new ();
     engine->priv->adapter = xfpm_adapter_new ();
     engine->priv->notify = xfpm_notify_new ();
-
+    engine->priv->srv    = xfpm_screen_saver_new ();
     engine->priv->inhibit = xfpm_inhibit_new ();
     engine->priv->inhibited = FALSE;
 
@@ -466,6 +483,8 @@ xfpm_engine_finalize (GObject * object)
     g_object_unref (engine->priv->shutdown);
 
     g_object_unref (engine->priv->adapter);
+    
+    g_object_unref (engine->priv->srv);
 
     if (engine->priv->bk)
 	g_object_unref (engine->priv->bk);
diff --git a/src/xfpm-screen-saver.c b/src/xfpm-screen-saver.c
index 0ed11d0450904f153142589197246a7f620de58c..ea843a6d34bec5319b96fc0ad4f9237014c456e3 100644
--- a/src/xfpm-screen-saver.c
+++ b/src/xfpm-screen-saver.c
@@ -37,6 +37,7 @@
 #include "libxfpm/xfpm-dbus.h"
 
 #include "xfpm-screen-saver.h"
+#include "xfpm-inhibit.h"
 #include "xfpm-dbus-monitor.h"
 
 /* Init */
@@ -47,15 +48,12 @@ static void xfpm_screen_saver_finalize   (GObject *object);
 #define XFPM_SCREEN_SAVER_GET_PRIVATE(o) \
 (G_TYPE_INSTANCE_GET_PRIVATE((o), XFPM_TYPE_SCREEN_SAVER, XfpmScreenSaverPrivate))
 
-#define MAX_SCREEN_SAVER_INHIBITORS 10
-
 struct XfpmScreenSaverPrivate
 {
-    DBusConnection  *bus;
-    XfpmDBusMonitor *monitor;
-    GPtrArray       *array;
+    DBusGConnection *bus;
+    XfpmInhibit     *inhibit;
     
-    guint            inhibitors;
+    gboolean         inhibited;
 };
 
 enum
@@ -70,83 +68,10 @@ static gpointer xfpm_screen_saver_object = NULL;
 
 G_DEFINE_TYPE(XfpmScreenSaver, xfpm_screen_saver, G_TYPE_OBJECT)
 
-static gchar *
-xfpm_screen_saver_find_unique_name (XfpmScreenSaver *srv, const gchar *unique_name)
-{
-    gint i;
-    gchar *name;
-    
-    for ( i = 0; i<srv->priv->array->len; i++)
-    {
-	name = g_ptr_array_index (srv->priv->array, i);
-	if ( g_strcmp0 (name, unique_name) == 0 )
-	    return name;
-    }
-    return NULL;
-}
-
 static void
-xfpm_screen_saver_uninhibit_message (XfpmScreenSaver *srv, const gchar *unique_name)
+xfpm_screen_saver_inhibit_changed_cb (XfpmInhibit *inhbit, gboolean inhibited, XfpmScreenSaver *srv)
 {
-    gchar *name;
-    
-    name = xfpm_screen_saver_find_unique_name (srv, unique_name);
-    
-    if ( name )
-    {
-	TRACE ("%s", name);
-	xfpm_dbus_monitor_remove_match (srv->priv->monitor, name);
-	g_ptr_array_remove (srv->priv->array, name);
-	g_free (name);
-	
-	srv->priv->inhibitors--;
-
-	if ( srv->priv->inhibitors == 0 )
-	{
-	    g_signal_emit (G_OBJECT(srv), signals[SCREEN_SAVER_INHIBITED], 0, FALSE);
-	}
-    }
-}
-
-static void
-xfpm_screen_saver_inhibit_message (XfpmScreenSaver *srv, const gchar *unique_name)
-{
-    if (xfpm_screen_saver_find_unique_name (srv, unique_name) )
-	return /* We have it already!*/;
-	
-    TRACE ("%s", unique_name);
-    g_ptr_array_add (srv->priv->array, g_strdup (unique_name));
-    xfpm_dbus_monitor_add_match (srv->priv->monitor, unique_name);
-    
-    if ( srv->priv->inhibitors == 0 )
-    {
-	g_signal_emit (G_OBJECT(srv), signals[SCREEN_SAVER_INHIBITED], 0, TRUE);
-    }
-    
-    srv->priv->inhibitors++;
-}
-
-static DBusHandlerResult 
-xfpm_screen_saver_filter (DBusConnection *connection, DBusMessage *message, void *data)
-{
-    XfpmScreenSaver *srv = ( XfpmScreenSaver *)data;
-    
-    if ( dbus_message_is_method_call (message, "org.gnome.ScreenSaver", "Inhibit") )
-	xfpm_screen_saver_inhibit_message (srv, dbus_message_get_sender (message) );
-    else if ( dbus_message_is_method_call (message, "org.gnome.ScreenSaver", "UnInhibit") )
-	xfpm_screen_saver_uninhibit_message (srv, dbus_message_get_sender (message) );
-    else if ( dbus_message_is_method_call (message, "org.freedesktop.ScreenSaver", "Inhibit") )
-	xfpm_screen_saver_inhibit_message (srv, dbus_message_get_sender (message) );
-    else if ( dbus_message_is_method_call (message, "org.freedesktop.ScreenSaver", "UnInhibit") )
-	xfpm_screen_saver_uninhibit_message (srv, dbus_message_get_sender (message) );
-    
-    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; /* Keep on as we just want to spy */
-}
-
-static void
-xfpm_screen_saver_connection_lost (XfpmDBusMonitor *monitor, gchar *unique_name, XfpmScreenSaver *srv)
-{
-    xfpm_screen_saver_uninhibit_message (srv, unique_name);
+    g_signal_emit (G_OBJECT (srv), signals [SCREEN_SAVER_INHIBITED], 0, inhibited);
 }
 
 static void
@@ -171,87 +96,22 @@ xfpm_screen_saver_class_init(XfpmScreenSaverClass *klass)
 static void
 xfpm_screen_saver_init(XfpmScreenSaver *srv)
 {
-    DBusError error;
-    dbus_error_init (&error);
-    
     srv->priv = XFPM_SCREEN_SAVER_GET_PRIVATE(srv);
     
-    srv->priv->bus = dbus_bus_get (DBUS_BUS_SESSION, &error);
-    srv->priv->monitor = xfpm_dbus_monitor_new ();
-    g_signal_connect (srv->priv->monitor, "connection-lost",
-		      G_CALLBACK (xfpm_screen_saver_connection_lost), srv);
-		      
-    srv->priv->array   	  = g_ptr_array_new ();
-    srv->priv->inhibitors = 0;
-    
-    if ( dbus_error_is_set (&error) )
-    {
-	g_critical ("Unable to get session bus: %s", error.message);
-	dbus_error_free (&error);
-	goto out;
-    }
-    
-    dbus_bus_add_match (srv->priv->bus, 
-			"type='method_call',interface='org.gnome.ScreenSaver'",
-			&error);
-			
-    if ( dbus_error_is_set (&error) )
-    {
-	g_warning ("Failed to add match for interface org.gnome.ScreenSaver: %s", error.message);
-	dbus_error_free (&error);
-    }
-	
-    dbus_error_init (&error);
-    
-    dbus_bus_add_match (srv->priv->bus, 
-			"type='method_call',interface='org.freedesktop.ScreenSaver'",
-			&error);
-			
-    if ( dbus_error_is_set (&error) )
-    {
-	g_warning ("Failed to add match for interface org.freedesktop.ScreenSaver: %s", error.message);
-	dbus_error_free (&error);
-    }
-	
-    if (!dbus_connection_add_filter (srv->priv->bus, xfpm_screen_saver_filter, srv, NULL) )
-    {
-	g_warning ("Couldn't add filter");
-    }
-out:
-    ;
+    srv->priv->inhibit = xfpm_inhibit_new ();
+    g_signal_connect (srv->priv->inhibit, "has-inhibit-changed",
+		      G_CALLBACK (xfpm_screen_saver_inhibit_changed_cb), srv);
 }
 
 static void
 xfpm_screen_saver_finalize(GObject *object)
 {
     XfpmScreenSaver *srv;
-    gint i;
-    gchar *name;
 
     srv = XFPM_SCREEN_SAVER(object);
     
-    dbus_bus_remove_match (srv->priv->bus,
-			  "type='method_call',interface='org.gnome.ScreenSaver'", 
-			  NULL);
+    g_object_unref (srv->priv->inhibit);
     
-    dbus_bus_remove_match (srv->priv->bus,
-			  "type='method_call',interface='org.freedesktop.ScreenSaver'", 
-			  NULL);
-
-    dbus_connection_unref (srv->priv->bus);
-    
-    g_object_unref (srv->priv->monitor);
-
-    
-    for ( i = 0; i<srv->priv->array->len; i++)
-    {
-	name = g_ptr_array_index (srv->priv->array, i);
-	g_ptr_array_remove (srv->priv->array, name);
-	g_free (name);
-    }
-    
-    g_ptr_array_free (srv->priv->array, TRUE);
-
     G_OBJECT_CLASS(xfpm_screen_saver_parent_class)->finalize(object);
 }
 
@@ -269,3 +129,32 @@ xfpm_screen_saver_new(void)
     }
     return XFPM_SCREEN_SAVER (xfpm_screen_saver_object);
 }
+
+void xfpm_screen_saver_inhibit (XfpmScreenSaver *srv)
+{
+    g_return_if_fail (XFPM_IS_SCREEN_SAVER (srv));
+    
+    if ( srv->priv->inhibited == FALSE )
+    {
+	srv->priv->inhibited = TRUE;
+	g_signal_emit (G_OBJECT (srv), signals[SCREEN_SAVER_INHIBITED], 0, srv->priv->inhibited);
+    }
+}
+
+void xfpm_screen_saver_uninhibit (XfpmScreenSaver *srv)
+{
+    g_return_if_fail (XFPM_IS_SCREEN_SAVER (srv));
+    
+    if ( srv->priv->inhibited == TRUE )
+    {
+	srv->priv->inhibited = FALSE;
+	g_signal_emit (G_OBJECT (srv), signals[SCREEN_SAVER_INHIBITED], 0, srv->priv->inhibited);
+    }
+}
+
+gboolean xfpm_screen_saver_get_inhibit (XfpmScreenSaver *srv)
+{
+    g_return_val_if_fail (XFPM_IS_SCREEN_SAVER (srv), FALSE);
+    
+    return srv->priv->inhibited;
+}
diff --git a/src/xfpm-screen-saver.h b/src/xfpm-screen-saver.h
index b9a5b1b2c7f4d41d5b51e0f436342b0882982a0d..021f2285b476e9d8daa1180184adf4e78b17cb69 100644
--- a/src/xfpm-screen-saver.h
+++ b/src/xfpm-screen-saver.h
@@ -48,8 +48,15 @@ typedef struct
 } XfpmScreenSaverClass;
 
 GType        			  xfpm_screen_saver_get_type        (void) G_GNUC_CONST;
+
 XfpmScreenSaver       	 	 *xfpm_screen_saver_new             (void);
 
+void				  xfpm_screen_saver_inhibit         (XfpmScreenSaver *srv);
+
+void 				  xfpm_screen_saver_uninhibit       (XfpmScreenSaver *srv);
+
+gboolean                          xfpm_screen_saver_get_inhibit     (XfpmScreenSaver *srv);
+
 G_END_DECLS
 
 #endif /* __XFPM_SCREEN_SAVER_H */
diff --git a/src/xfpm-tray-icon.c b/src/xfpm-tray-icon.c
index 0726b83b8f208218250f3c1febeb72c83e74f1d5..af1a972eb540d7a7aaa79f9252da195885b75447 100644
--- a/src/xfpm-tray-icon.c
+++ b/src/xfpm-tray-icon.c
@@ -39,6 +39,7 @@
 #include "xfpm-tray-icon.h"
 #include "xfpm-shutdown.h"
 #include "xfpm-inhibit.h"
+#include "xfpm-screen-saver.h"
 #include "xfpm-xfconf.h"
 #include "xfpm-config.h"
 
@@ -52,10 +53,11 @@ static void xfpm_tray_icon_finalize   (GObject *object);
 
 struct XfpmTrayIconPrivate
 {
-    XfpmShutdown  *shutdown;
-    XfpmXfconf    *conf;
-    XfpmNotify    *notify;
-    XfpmInhibit   *inhibit;
+    XfpmShutdown    *shutdown;
+    XfpmXfconf      *conf;
+    XfpmNotify      *notify;
+    XfpmInhibit     *inhibit;
+    XfpmScreenSaver *srv;
     
     GtkStatusIcon *icon;
     GQuark         icon_quark;
@@ -228,6 +230,16 @@ xfpm_tray_icon_menu_selection_done (GtkMenuShell *menu, gpointer data)
     gtk_widget_destroy (GTK_WIDGET (menu));
 }
 
+static void
+xfpm_tray_icon_inhibit_active_cb (GtkWidget *mi, XfpmTrayIcon *tray)
+{
+    gboolean active;
+    active = xfpm_screen_saver_get_inhibit (tray->priv->srv);
+    
+    active == FALSE ? xfpm_screen_saver_inhibit   (tray->priv->srv) :
+		      xfpm_screen_saver_uninhibit (tray->priv->srv);
+}
+
 static void
 xfpm_tray_icon_popup_menu_cb (GtkStatusIcon *icon, guint button, 
 			      guint activate_time, XfpmTrayIcon *tray)
@@ -239,6 +251,8 @@ xfpm_tray_icon_popup_menu_cb (GtkStatusIcon *icon, guint button,
     gboolean can_hibernate = FALSE ;
     gboolean caller = FALSE;
 
+    gboolean saver_inhibited;
+
     g_object_get (G_OBJECT (tray->priv->shutdown),
 		  "caller-privilege", &caller,
 		  "can-suspend", &can_suspend,
@@ -274,6 +288,20 @@ xfpm_tray_icon_popup_menu_cb (GtkStatusIcon *icon, guint button,
     }
     gtk_widget_show(mi);
     gtk_menu_shell_append(GTK_MENU_SHELL(menu),mi);
+
+    saver_inhibited = xfpm_screen_saver_get_inhibit (tray->priv->srv);
+    mi = gtk_image_menu_item_new_with_label (saver_inhibited ? _("Clear inhibit") : _("Inhibit"));
+    
+    gtk_widget_set_tooltip_text (mi, _("Disable or enable automatic sleep, setting this will tell the power manager "\
+				       "to disable backlight sleep, for example you could active the inhibit if you are watching a movie."));
+    
+    img = gtk_image_new_from_stock (saver_inhibited ? GTK_STOCK_CANCEL : GTK_STOCK_APPLY, GTK_ICON_SIZE_MENU);
+    gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(mi),img);
+    g_signal_connect (G_OBJECT (mi), "activate",
+		      G_CALLBACK (xfpm_tray_icon_inhibit_active_cb), tray);
+    gtk_widget_set_sensitive (mi, TRUE);
+    gtk_widget_show(mi);
+    gtk_menu_shell_append(GTK_MENU_SHELL(menu),mi);
     
     if ( tray->priv->info_menu )
     {
@@ -378,6 +406,7 @@ xfpm_tray_icon_init(XfpmTrayIcon *tray)
     tray->priv->notify = xfpm_notify_new ();
     tray->priv->inhibited = FALSE;
     tray->priv->inhibit = xfpm_inhibit_new ();
+    tray->priv->srv     = xfpm_screen_saver_new ();
     
     tray->priv->info_menu = TRUE;
     tray->priv->icon_quark = 0;
@@ -411,6 +440,8 @@ xfpm_tray_icon_finalize(GObject *object)
     g_object_unref (tray->priv->notify);
     
     g_object_unref (tray->priv->inhibit);
+    
+    g_object_unref (tray->priv->srv);
 
     G_OBJECT_CLASS(xfpm_tray_icon_parent_class)->finalize(object);
 }