[nanny: 1/13] Fix for Ubuntu and add chores system



commit 30eccb4aeafee9fd07354535e0a67e3fe5d2a46a
Author: Guido Tabbernuk <boamaod gmail com>
Date:   Mon Jan 23 04:29:37 2012 +0200

    Fix for Ubuntu and add chores system
    
    * Made it run on Ubuntu Oneiric
    * Created chores system
    * Implemented admin button for adding "extra time for today"
    * Enhanced the session/desktop blocking routines
    * Enhanced some data entry dialogs
    * Did some Debian packaging fixes
    * Added Estonian translation

 client/common/src/DBusClient.py                    |   67 ++
 client/common/src/Utils.py                         |    3 +-
 .../admin/data/nanny-admin-console.desktop.in      |    1 -
 client/gnome/admin/data/ui/Makefile.am             |    2 +
 client/gnome/admin/data/ui/nac_chores_dialog.ui    |  509 ++++++++
 .../gnome/admin/data/ui/nac_chores_edit_dialog.ui  |  189 +++
 client/gnome/admin/data/ui/nac_wcf_dialog.ui       |  600 ++++++----
 client/gnome/admin/data/ui/nac_wcf_edit_dialog.ui  |   87 +-
 client/gnome/admin/data/ui/nanny_admin_console.ui  |  770 ++++++++++--
 .../gnome/admin/data/ui/nanny_desktop_blocker.ui   |  159 +++-
 client/gnome/admin/src/AdminConsole.py             |  256 ++++-
 client/gnome/admin/src/BlacklistManager.py         |    6 +-
 client/gnome/admin/src/ConfigureChoresDialog.py    |  531 +++++++++
 client/gnome/admin/src/ConfigureProxyDialog.py     |  145 ++-
 client/gnome/admin/src/DesktopBlocker.py           |  219 ++++-
 client/gnome/admin/src/Makefile.am                 |    1 +
 client/gnome/admin/src/__init__.py.in              |    3 +
 daemon/data/init.d/debian/nanny                    |   18 +-
 daemon/src/ChoreManager.py                         |  271 +++++
 daemon/src/LinuxSessionFiltering.py                |   31 +-
 daemon/src/Makefile.am                             |    1 +
 daemon/src/NannyDBus.py                            |  147 +++-
 daemon/src/QuarterBack.py                          |  164 +++-
 debian/compat                                      |    2 +-
 debian/control                                     |    9 +-
 debian/copyright                                   |   41 +-
 debian/init.d                                      |   18 +-
 debian/postinst                                    |   12 +-
 debian/postrm                                      |   40 -
 debian/prerm                                       |   14 -
 debian/rules                                       |    5 +-
 debian/source/format                               |    1 +
 po/LINGUAS                                         |    1 +
 po/POTFILES.in                                     |    3 +
 po/et.po                                           | 1235 ++++++++++++++++++++
 35 files changed, 4870 insertions(+), 691 deletions(-)
---
diff --git a/client/common/src/DBusClient.py b/client/common/src/DBusClient.py
old mode 100644
new mode 100755
index ab04598..11ff332
--- a/client/common/src/DBusClient.py
+++ b/client/common/src/DBusClient.py
@@ -1,6 +1,7 @@
 #!/usr/bin/env python
 
 # Copyright (C) 2009,2010 Junta de Andalucia
+# Copyright (C) 2012 Guido Tabbernuk
 # 
 # Authors:
 #   Roberto Majadas <roberto.majadas at openshine.com>
@@ -136,6 +137,21 @@ class DBusClient(gobject.GObject):
     def get_blocks (self, user_id, app_id):
         return self.nanny_admin.GetBlocks (user_id, app_id)
 
+    def is_forced_to_close (self, user_id, app_id):
+        return self.nanny_admin.IsForcedToClose(user_id, app_id)
+
+    def set_forced_to_close (self, user_id, app_id, state):
+        return self.nanny_admin.SetForcedToClose(user_id, app_id, state)
+
+    def is_allowed_to_use (self, user_id, app_id):
+        return self.nanny_admin.IsAllowedToUse(user_id, app_id)
+
+    def is_blocked (self, user_id, app_id):
+        return self.nanny_admin.IsBlocked(user_id, app_id)
+
+    def get_block_status_by_uid (self, user_id):
+        return self.nanny_admin.GetBlockStatusByUID (user_id)
+
     def set_blocks (self, user_id, app_id, blocks):
         return self.nanny_admin.SetBlocks (user_id, app_id, blocks)
 
@@ -145,6 +161,57 @@ class DBusClient(gobject.GObject):
     def set_max_use_time (self, user_id, app_id, minutes):
         return self.nanny_admin.SetMaxUseTime (user_id, app_id, int(minutes))
 
+    def get_use_time (self, user_id, app_id):
+        return self.nanny_admin.GetUseTime (user_id, app_id)
+
+    def get_activated_chore_reward (self, chore_id):
+        return self.nanny_admin.GetActivatedChoreReward (chore_id)
+
+    def add_use_time (self, user_id, app_id, minutes):
+        return self.nanny_admin.AddUseTime (user_id, app_id, int(minutes))
+
+    def list_chore_descriptions (self, desc_id=-1):
+        return self.nanny_admin.ListChoreDescriptions (desc_id)
+
+    def add_chore_description (self, title, description, reward):
+        return self.nanny_admin.AddChoreDescription (title, description, reward)
+
+    def update_chore_description (self, list_id, title, description, reward):
+        return self.nanny_admin.UpdateChoreDescription (list_id, title, description, reward)
+
+    def remove_chore_description (self, list_id, reply_handler, error_handler):
+        return self.nanny_admin.RemoveChoreDescription (list_id, reply_handler=reply_handler, error_handler=error_handler, timeout=2000000)
+
+    def list_chores (self, uid, available=False, contracted=False, finished=False):
+        return self.nanny_admin.ListChores (uid, available, contracted, finished)
+
+    def add_chore (self, chore_id, uid):
+        return self.nanny_admin.AddChore (chore_id, uid)
+
+    def update_chore (self, list_id, chore_id, uid, contracted, finished):
+        return self.nanny_admin.UpdateChore (list_id, chore_id, uid, contracted, finished)
+
+    def contract_chore (self, list_id, contracted, uid):
+        return self.nanny_admin.ContractChore (list_id, contracted, uid)
+
+    def take_mercy (self, user_id, app_id):
+        self.nanny_admin.TakeMercy (user_id, app_id)
+
+    def finish_chore (self, list_id, finished):
+        return self.nanny_admin.FinishChore (list_id, finished)
+
+    def remove_chore (self, list_id, reply_handler, error_handler):
+        return self.nanny_admin.RemoveChore (list_id, reply_handler=reply_handler, error_handler=error_handler, timeout=2000000)
+
+    def set_chore_settings (self, user_id, active, limit):
+        return self.nanny_admin.SetChoreSettings (user_id, active, limit)
+
+    def get_chore_settings (self, user_id):
+        return self.nanny_admin.GetChoreSettings (user_id)
+
+    def is_chore_available (self, user_id):
+        return self.nanny_admin.IsChoreAvailable(user_id)
+
     def set_active_WCF (self, user_id, active):
         return self.nanny_admin.SetActiveWCF (active, user_id)
 
diff --git a/client/common/src/Utils.py b/client/common/src/Utils.py
index 35ef0c4..20864fd 100644
--- a/client/common/src/Utils.py
+++ b/client/common/src/Utils.py
@@ -1,6 +1,7 @@
 #!/usr/bin/env python
 
 # Copyright (C) 2009,2010 Junta de Andalucia
+# Copyright (C) 2012 Guido Tabbernuk
 # 
 # Authors:
 #   Roberto Majadas <roberto.majadas at openshine.com>
@@ -51,7 +52,7 @@ def ui_magic(object, ui_file, prefix):
      from xml.etree.ElementTree import ElementTree 
      xml = ElementTree()
      xml.parse(main_ui_filename)
-     for obj in xml.findall ('//object'):
+     for obj in xml.findall ('.//object'):
           try:
                if obj.attrib["id"].startswith(prefix) :
                     widget = object.xml.get_object(obj.attrib["id"])
diff --git a/client/gnome/admin/data/nanny-admin-console.desktop.in b/client/gnome/admin/data/nanny-admin-console.desktop.in
index 5994925..06a3a37 100644
--- a/client/gnome/admin/data/nanny-admin-console.desktop.in
+++ b/client/gnome/admin/data/nanny-admin-console.desktop.in
@@ -7,4 +7,3 @@ Terminal=false
 Type=Application
 Categories=GNOME;GTK;System;Settings;
 StartupNotify=true
-Encoding=UTF-8
diff --git a/client/gnome/admin/data/ui/Makefile.am b/client/gnome/admin/data/ui/Makefile.am
index 500adbe..c6612b0 100644
--- a/client/gnome/admin/data/ui/Makefile.am
+++ b/client/gnome/admin/data/ui/Makefile.am
@@ -2,6 +2,8 @@ uidir = $(datadir)/nanny/client/gnome/admin/ui
 ui_DATA = nanny_admin_console.ui \
 	     nac_wcf_edit_dialog.ui \
 	     nac_wcf_dialog.ui \
+	     nac_chores_edit_dialog.ui \
+	     nac_chores_dialog.ui \
 	     nbm_pbl_dialog.ui \
 	     nbm_pbl_edit_dialog.ui	\
 	     nanny_desktop_blocker.ui
diff --git a/client/gnome/admin/data/ui/nac_chores_dialog.ui b/client/gnome/admin/data/ui/nac_chores_dialog.ui
new file mode 100644
index 0000000..18963fc
--- /dev/null
+++ b/client/gnome/admin/data/ui/nac_chores_dialog.ui
@@ -0,0 +1,509 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <!-- interface-requires gtk+ 3.0 -->
+  <object class="GtkAdjustment" id="adjustment1">
+    <property name="lower">1</property>
+    <property name="upper">99</property>
+    <property name="value">5</property>
+    <property name="step_increment">1</property>
+    <property name="page_increment">10</property>
+  </object>
+  <object class="GtkImage" id="image1">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="stock">gtk-go-forward</property>
+  </object>
+  <object class="GtkWindow" id="window1">
+    <property name="can_focus">False</property>
+    <property name="has_resize_grip">False</property>
+    <child>
+      <object class="GtkVBox" id="chd_main_vbox">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="spacing">5</property>
+        <child>
+          <object class="GtkAlignment" id="alignment1">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <child>
+              <object class="GtkNotebook" id="chd_main_notebook">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <child>
+                  <object class="GtkAlignment" id="alignment3">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="top_padding">5</property>
+                    <property name="bottom_padding">5</property>
+                    <property name="left_padding">5</property>
+                    <property name="right_padding">5</property>
+                    <child>
+                      <object class="GtkHPaned" id="hpaned1">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="position">300</property>
+                        <property name="position_set">True</property>
+                        <child>
+                          <object class="GtkVBox" id="vbox1">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <child>
+                              <object class="GtkScrolledWindow" id="scrolledwindow3">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="hscrollbar_policy">never</property>
+                                <property name="shadow_type">etched-in</property>
+                                <child>
+                                  <object class="GtkTreeView" id="chd_chore_assign_treeview">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="headers_visible">False</property>
+                                    <child internal-child="selection">
+                                      <object class="GtkTreeSelection" id="treeview-selection30"/>
+                                    </child>
+                                  </object>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkHBox" id="hbox3">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <child>
+                                  <object class="GtkAlignment" id="alignment4">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <property name="xalign">0</property>
+                                    <property name="yalign">1</property>
+                                    <property name="xscale">0</property>
+                                    <property name="yscale">0</property>
+                                    <child>
+                                      <object class="GtkHButtonBox" id="hbuttonbox1">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">False</property>
+                                        <property name="spacing">6</property>
+                                        <property name="layout_style">start</property>
+                                        <child>
+                                          <object class="GtkButton" id="chd_add_lst_button">
+                                            <property name="label">gtk-add</property>
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">True</property>
+                                            <property name="receives_default">True</property>
+                                            <property name="use_action_appearance">False</property>
+                                            <property name="use_stock">True</property>
+                                          </object>
+                                          <packing>
+                                            <property name="expand">False</property>
+                                            <property name="fill">False</property>
+                                            <property name="position">0</property>
+                                          </packing>
+                                        </child>
+                                        <child>
+                                          <object class="GtkButton" id="chd_edit_lst_button">
+                                            <property name="label">gtk-edit</property>
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">True</property>
+                                            <property name="receives_default">True</property>
+                                            <property name="use_action_appearance">False</property>
+                                            <property name="use_underline">True</property>
+                                            <property name="use_stock">True</property>
+                                          </object>
+                                          <packing>
+                                            <property name="expand">False</property>
+                                            <property name="fill">False</property>
+                                            <property name="position">1</property>
+                                          </packing>
+                                        </child>
+                                        <child>
+                                          <object class="GtkButton" id="chd_del_lst_button">
+                                            <property name="label">gtk-remove</property>
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">True</property>
+                                            <property name="receives_default">True</property>
+                                            <property name="use_action_appearance">False</property>
+                                            <property name="use_stock">True</property>
+                                          </object>
+                                          <packing>
+                                            <property name="expand">False</property>
+                                            <property name="fill">False</property>
+                                            <property name="position">2</property>
+                                          </packing>
+                                        </child>
+                                      </object>
+                                    </child>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">True</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkAlignment" id="alignment5">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <property name="xalign">1</property>
+                                    <property name="xscale">0</property>
+                                    <property name="yscale">0</property>
+                                    <child>
+                                      <object class="GtkButton" id="chd_assign_button">
+                                        <property name="visible">True</property>
+                                        <property name="sensitive">False</property>
+                                        <property name="can_focus">True</property>
+                                        <property name="receives_default">False</property>
+                                        <property name="has_tooltip">True</property>
+                                        <property name="tooltip_markup" translatable="yes">Select an entry and press this button to add or remove chores to or from user&amp;apos;s enabled chores list</property>
+                                        <property name="tooltip_text" translatable="yes">Select an entry and press this button to add or remove chores to or from user's enabled chores list</property>
+                                        <property name="use_action_appearance">False</property>
+                                        <property name="image">image1</property>
+                                        <property name="focus_on_click">False</property>
+                                      </object>
+                                    </child>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">True</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">True</property>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="resize">False</property>
+                            <property name="shrink">True</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkScrolledWindow" id="scrolledwindow4">
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="hscrollbar_policy">never</property>
+                            <property name="shadow_type">etched-in</property>
+                            <child>
+                              <object class="GtkTreeView" id="chd_enabled_chores_treeview">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="headers_visible">False</property>
+                                <child internal-child="selection">
+                                  <object class="GtkTreeSelection" id="treeview-selection31"/>
+                                </child>
+                              </object>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="resize">True</property>
+                            <property name="shrink">True</property>
+                          </packing>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+                <child type="tab">
+                  <object class="GtkLabel" id="label3">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="label" translatable="yes">Assign chores</property>
+                  </object>
+                  <packing>
+                    <property name="tab_fill">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkAlignment" id="alignment2">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="top_padding">5</property>
+                    <property name="bottom_padding">5</property>
+                    <property name="left_padding">5</property>
+                    <property name="right_padding">5</property>
+                    <child>
+                      <object class="GtkHBox" id="hbox2">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="spacing">5</property>
+                        <child>
+                          <object class="GtkScrolledWindow" id="scrolledwindow2">
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="hscrollbar_policy">never</property>
+                            <property name="shadow_type">etched-in</property>
+                            <child>
+                              <object class="GtkTreeView" id="chd_chore_progress_treeview">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="headers_visible">False</property>
+                                <child internal-child="selection">
+                                  <object class="GtkTreeSelection" id="treeview-selection32"/>
+                                </child>
+                              </object>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="expand">True</property>
+                            <property name="fill">True</property>
+                            <property name="position">0</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkVButtonBox" id="vbuttonbox2">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="spacing">5</property>
+                            <property name="layout_style">start</property>
+                            <child>
+                              <object class="GtkButton" id="chd_chore_progress_done_button">
+                                <property name="label" translatable="yes">_Finish</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">True</property>
+                                <property name="use_action_appearance">False</property>
+                                <property name="use_underline">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkButton" id="chd_chore_progress_cancel_button">
+                                <property name="label">gtk-cancel</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">True</property>
+                                <property name="use_action_appearance">False</property>
+                                <property name="use_stock">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child type="tab">
+                  <object class="GtkLabel" id="label1">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="label" translatable="yes">Chores in progress</property>
+                  </object>
+                  <packing>
+                    <property name="position">1</property>
+                    <property name="tab_fill">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkAlignment" id="alignment6">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="top_padding">5</property>
+                    <property name="bottom_padding">5</property>
+                    <property name="left_padding">5</property>
+                    <property name="right_padding">5</property>
+                    <child>
+                      <object class="GtkHBox" id="hbox1">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="spacing">5</property>
+                        <child>
+                          <object class="GtkScrolledWindow" id="scrolledwindow1">
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="hscrollbar_policy">never</property>
+                            <property name="shadow_type">etched-in</property>
+                            <child>
+                              <object class="GtkTreeView" id="chd_finished_chores_treeview">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="headers_visible">False</property>
+                                <child internal-child="selection">
+                                  <object class="GtkTreeSelection" id="treeview-selection33"/>
+                                </child>
+                              </object>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="expand">True</property>
+                            <property name="fill">True</property>
+                            <property name="position">0</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkVButtonBox" id="vbuttonbox1">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="spacing">5</property>
+                            <property name="layout_style">start</property>
+                            <child>
+                              <object class="GtkButton" id="chd_finished_chores_remove_button">
+                                <property name="label">gtk-remove</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">True</property>
+                                <property name="use_action_appearance">False</property>
+                                <property name="use_stock">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">2</property>
+                              </packing>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+                <child type="tab">
+                  <object class="GtkLabel" id="label2">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="label" translatable="yes">Finished chores</property>
+                  </object>
+                  <packing>
+                    <property name="position">2</property>
+                    <property name="tab_fill">False</property>
+                  </packing>
+                </child>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkAlignment" id="alignment7">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <child>
+              <object class="GtkVBox" id="vbox2">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <child>
+                  <object class="GtkHBox" id="hbox9">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="spacing">5</property>
+                    <child>
+                      <object class="GtkCheckButton" id="chd_session_use_chores_checkbutton">
+                        <property name="label" translatable="yes">Enable rewarding time for _contracting chores</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="use_action_appearance">False</property>
+                        <property name="use_underline">True</property>
+                        <property name="xalign">0</property>
+                        <property name="image_position">right</property>
+                        <property name="draw_indicator">True</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">True</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="expand">True</property>
+                    <property name="fill">True</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkHBox" id="hbox4">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="spacing">5</property>
+                    <child>
+                      <object class="GtkLabel" id="label4">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Amount of contracted but unfinished chores allowed</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">True</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkSpinButton" id="chd_session_max_chores_to_contract_spinbutton">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="tooltip_text" translatable="yes">If the amount happens to exceed this value, user cannot contract more chores</property>
+                        <property name="invisible_char">â</property>
+                        <property name="width_chars">2</property>
+                        <property name="adjustment">adjustment1</property>
+                        <property name="numeric">True</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">True</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="expand">True</property>
+                    <property name="fill">True</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">2</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+  </object>
+</interface>
diff --git a/client/gnome/admin/data/ui/nac_chores_edit_dialog.ui b/client/gnome/admin/data/ui/nac_chores_edit_dialog.ui
new file mode 100644
index 0000000..c3dddb3
--- /dev/null
+++ b/client/gnome/admin/data/ui/nac_chores_edit_dialog.ui
@@ -0,0 +1,189 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <requires lib="gtk+" version="2.16"/>
+  <object class="GtkAdjustment" id="adjustment1">
+    <property name="upper">24</property>
+    <property name="value">0.5</property>
+    <property name="step_increment">0.10000000000000001</property>
+    <property name="page_increment">1</property>
+  </object>
+  <object class="GtkDialog" id="chd_edit_dialog">
+    <property name="can_focus">False</property>
+    <property name="border_width">5</property>
+    <property name="icon_name">nanny</property>
+    <property name="type_hint">normal</property>
+    <child internal-child="vbox">
+      <object class="GtkBox" id="dialog-vbox1">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">2</property>
+        <child internal-child="action_area">
+          <object class="GtkButtonBox" id="dialog-action_area1">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="layout_style">end</property>
+            <child>
+              <object class="GtkButton" id="chd_cancel_button">
+                <property name="label">gtk-cancel</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_action_appearance">False</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="chd_ok_button">
+                <property name="label">gtk-ok</property>
+                <property name="visible">True</property>
+                <property name="sensitive">False</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_action_appearance">False</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkTable" id="table2">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="n_rows">3</property>
+            <property name="n_columns">2</property>
+            <property name="column_spacing">12</property>
+            <property name="row_spacing">5</property>
+            <child>
+              <object class="GtkLabel" id="label4">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="xalign">0</property>
+                <property name="label" translatable="yes" comments="The time given for contracting the chore">Reward:</property>
+              </object>
+              <packing>
+                <property name="top_attach">2</property>
+                <property name="bottom_attach">3</property>
+                <property name="x_options">GTK_FILL</property>
+                <property name="y_options"></property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkLabel" id="label3">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="xalign">0</property>
+                <property name="label" translatable="yes">Description:</property>
+              </object>
+              <packing>
+                <property name="top_attach">1</property>
+                <property name="bottom_attach">2</property>
+                <property name="x_options">GTK_FILL</property>
+                <property name="y_options"></property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkEntry" id="chd_description_entry">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="invisible_char">â</property>
+              </object>
+              <packing>
+                <property name="left_attach">1</property>
+                <property name="right_attach">2</property>
+                <property name="top_attach">1</property>
+                <property name="bottom_attach">2</property>
+                <property name="y_options"></property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkLabel" id="label1">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="xalign">0</property>
+                <property name="label" translatable="yes">Title:</property>
+              </object>
+              <packing>
+                <property name="x_options">GTK_FILL</property>
+                <property name="y_options"></property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkEntry" id="chd_title_entry">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="invisible_char">â</property>
+              </object>
+              <packing>
+                <property name="left_attach">1</property>
+                <property name="right_attach">2</property>
+                <property name="y_options"></property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkSpinButton" id="chd_reward_spinbutton">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="invisible_char">â</property>
+                <property name="invisible_char_set">True</property>
+                <property name="adjustment">adjustment1</property>
+                <property name="digits">1</property>
+                <property name="snap_to_ticks">True</property>
+                <property name="numeric">True</property>
+              </object>
+              <packing>
+                <property name="left_attach">1</property>
+                <property name="right_attach">2</property>
+                <property name="top_attach">2</property>
+                <property name="bottom_attach">3</property>
+                <property name="y_options"></property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkLabel" id="chd_information_label">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="xalign">0</property>
+            <property name="yalign">0</property>
+            <property name="ypad">12</property>
+            <property name="label" translatable="yes">The chores with time rewards will be displayed as an option to obtain more usage time to user when the session time limit has been reached and blocking the session is initiated. User can contract the chore to get extra usage time immediately.</property>
+            <property name="use_markup">True</property>
+            <property name="wrap">True</property>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">2</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+    <action-widgets>
+      <action-widget response="1">chd_cancel_button</action-widget>
+      <action-widget response="2">chd_ok_button</action-widget>
+    </action-widgets>
+  </object>
+</interface>
diff --git a/client/gnome/admin/data/ui/nac_wcf_dialog.ui b/client/gnome/admin/data/ui/nac_wcf_dialog.ui
index ebc6f8b..d602d08 100644
--- a/client/gnome/admin/data/ui/nac_wcf_dialog.ui
+++ b/client/gnome/admin/data/ui/nac_wcf_dialog.ui
@@ -1,334 +1,428 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
-  <requires lib="gtk+" version="2.16"/>
-  <!-- interface-naming-policy project-wide -->
+  <!-- interface-requires gtk+ 3.0 -->
   <object class="GtkWindow" id="window1">
-    <property name="icon_name">nanny</property>
+    <property name="can_focus">False</property>
+    <property name="has_resize_grip">False</property>
     <child>
-      <object class="GtkNotebook" id="wcfd_main_notebook">
+      <object class="GtkVBox" id="wcfd_main_vbox">
         <property name="visible">True</property>
-        <property name="can_focus">True</property>
+        <property name="can_focus">False</property>
+        <property name="spacing">5</property>
         <child>
           <object class="GtkAlignment" id="alignment1">
             <property name="visible">True</property>
-            <property name="top_padding">5</property>
-            <property name="bottom_padding">5</property>
-            <property name="left_padding">5</property>
-            <property name="right_padding">5</property>
+            <property name="can_focus">False</property>
             <child>
-              <object class="GtkHBox" id="hbox1">
+              <object class="GtkNotebook" id="wcfd_main_notebook">
                 <property name="visible">True</property>
-                <property name="spacing">5</property>
+                <property name="can_focus">True</property>
                 <child>
-                  <object class="GtkScrolledWindow" id="scrolledwindow1">
+                  <object class="GtkAlignment" id="alignment2">
                     <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="hscrollbar_policy">never</property>
-                    <property name="vscrollbar_policy">automatic</property>
-                    <property name="shadow_type">etched-in</property>
+                    <property name="can_focus">False</property>
+                    <property name="top_padding">5</property>
+                    <property name="bottom_padding">5</property>
+                    <property name="left_padding">5</property>
+                    <property name="right_padding">5</property>
                     <child>
-                      <object class="GtkTreeView" id="wcfd_custom_blacklist_treeview">
+                      <object class="GtkHBox" id="hbox1">
                         <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="headers_visible">False</property>
+                        <property name="can_focus">False</property>
+                        <property name="spacing">5</property>
+                        <child>
+                          <object class="GtkScrolledWindow" id="scrolledwindow1">
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="hscrollbar_policy">never</property>
+                            <property name="shadow_type">etched-in</property>
+                            <child>
+                              <object class="GtkTreeView" id="wcfd_custom_blacklist_treeview">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="headers_visible">False</property>
+                                <child internal-child="selection">
+                                  <object class="GtkTreeSelection" id="treeview-selection9"/>
+                                </child>
+                              </object>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="expand">True</property>
+                            <property name="fill">True</property>
+                            <property name="position">0</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkVButtonBox" id="vbuttonbox1">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="spacing">5</property>
+                            <property name="layout_style">start</property>
+                            <child>
+                              <object class="GtkButton" id="wcfd_custom_blacklist_add_button">
+                                <property name="label">gtk-add</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">True</property>
+                                <property name="use_action_appearance">False</property>
+                                <property name="use_stock">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkButton" id="wcfd_custom_blacklist_edit_button">
+                                <property name="label">gtk-edit</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">True</property>
+                                <property name="use_action_appearance">False</property>
+                                <property name="use_stock">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkButton" id="wcfd_custom_blacklist_remove_button">
+                                <property name="label">gtk-remove</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">True</property>
+                                <property name="use_action_appearance">False</property>
+                                <property name="use_stock">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">2</property>
+                              </packing>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
                       </object>
                     </child>
                   </object>
-                  <packing>
-                    <property name="position">0</property>
-                  </packing>
                 </child>
-                <child>
-                  <object class="GtkVButtonBox" id="vbuttonbox1">
+                <child type="tab">
+                  <object class="GtkLabel" id="label1">
                     <property name="visible">True</property>
-                    <property name="spacing">5</property>
-                    <property name="layout_style">start</property>
-                    <child>
-                      <object class="GtkButton" id="wcfd_custom_blacklist_add_button">
-                        <property name="label">gtk-add</property>
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="receives_default">True</property>
-                        <property name="use_stock">True</property>
-                      </object>
-                      <packing>
-                        <property name="expand">False</property>
-                        <property name="fill">False</property>
-                        <property name="position">0</property>
-                      </packing>
-                    </child>
-                    <child>
-                      <object class="GtkButton" id="wcfd_custom_blacklist_edit_button">
-                        <property name="label">gtk-edit</property>
-                        <property name="can_focus">True</property>
-                        <property name="receives_default">True</property>
-                        <property name="use_stock">True</property>
-                      </object>
-                      <packing>
-                        <property name="expand">False</property>
-                        <property name="fill">False</property>
-                        <property name="position">1</property>
-                      </packing>
-                    </child>
-                    <child>
-                      <object class="GtkButton" id="wcfd_custom_blacklist_remove_button">
-                        <property name="label">gtk-remove</property>
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="receives_default">True</property>
-                        <property name="use_stock">True</property>
-                      </object>
-                      <packing>
-                        <property name="expand">False</property>
-                        <property name="fill">False</property>
-                        <property name="position">2</property>
-                      </packing>
-                    </child>
+                    <property name="can_focus">False</property>
+                    <property name="label" translatable="yes">Forbidden sites</property>
                   </object>
                   <packing>
-                    <property name="expand">False</property>
-                    <property name="position">1</property>
+                    <property name="tab_fill">False</property>
                   </packing>
                 </child>
-              </object>
-            </child>
-          </object>
-        </child>
-        <child type="tab">
-          <object class="GtkLabel" id="label1">
-            <property name="visible">True</property>
-            <property name="label" translatable="yes">Forbidden sites</property>
-          </object>
-          <packing>
-            <property name="tab_fill">False</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkAlignment" id="alignment2">
-            <property name="visible">True</property>
-            <property name="top_padding">5</property>
-            <property name="bottom_padding">5</property>
-            <property name="left_padding">5</property>
-            <property name="right_padding">5</property>
-            <child>
-              <object class="GtkHBox" id="hbox2">
-                <property name="visible">True</property>
-                <property name="spacing">5</property>
                 <child>
-                  <object class="GtkScrolledWindow" id="scrolledwindow2">
+                  <object class="GtkAlignment" id="alignment3">
                     <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="hscrollbar_policy">never</property>
-                    <property name="vscrollbar_policy">automatic</property>
-                    <property name="shadow_type">etched-in</property>
+                    <property name="can_focus">False</property>
+                    <property name="top_padding">5</property>
+                    <property name="bottom_padding">5</property>
+                    <property name="left_padding">5</property>
+                    <property name="right_padding">5</property>
                     <child>
-                      <object class="GtkTreeView" id="wcfd_custom_whitelist_treeview">
+                      <object class="GtkHBox" id="hbox2">
                         <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="headers_visible">False</property>
+                        <property name="can_focus">False</property>
+                        <property name="spacing">5</property>
+                        <child>
+                          <object class="GtkScrolledWindow" id="scrolledwindow2">
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="hscrollbar_policy">never</property>
+                            <property name="shadow_type">etched-in</property>
+                            <child>
+                              <object class="GtkTreeView" id="wcfd_custom_whitelist_treeview">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="headers_visible">False</property>
+                                <child internal-child="selection">
+                                  <object class="GtkTreeSelection" id="treeview-selection10"/>
+                                </child>
+                              </object>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="expand">True</property>
+                            <property name="fill">True</property>
+                            <property name="position">0</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkVButtonBox" id="vbuttonbox2">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="spacing">5</property>
+                            <property name="layout_style">start</property>
+                            <child>
+                              <object class="GtkButton" id="wcfd_custom_whitelist_add_button">
+                                <property name="label">gtk-add</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">True</property>
+                                <property name="use_action_appearance">False</property>
+                                <property name="use_stock">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkButton" id="wcfd_custom_whitelist_edit_button">
+                                <property name="label">gtk-edit</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">True</property>
+                                <property name="use_action_appearance">False</property>
+                                <property name="use_stock">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkButton" id="wcfd_custom_whitelist_remove_button">
+                                <property name="label">gtk-remove</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">True</property>
+                                <property name="use_action_appearance">False</property>
+                                <property name="use_stock">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">2</property>
+                              </packing>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
                       </object>
                     </child>
                   </object>
                   <packing>
-                    <property name="position">0</property>
+                    <property name="position">1</property>
                   </packing>
                 </child>
-                <child>
-                  <object class="GtkVButtonBox" id="vbuttonbox2">
+                <child type="tab">
+                  <object class="GtkLabel" id="label2">
                     <property name="visible">True</property>
-                    <property name="spacing">5</property>
-                    <property name="layout_style">start</property>
-                    <child>
-                      <object class="GtkButton" id="wcfd_custom_whitelist_add_button">
-                        <property name="label">gtk-add</property>
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="receives_default">True</property>
-                        <property name="use_stock">True</property>
-                      </object>
-                      <packing>
-                        <property name="expand">False</property>
-                        <property name="fill">False</property>
-                        <property name="position">0</property>
-                      </packing>
-                    </child>
-                    <child>
-                      <object class="GtkButton" id="wcfd_custom_whitelist_edit_button">
-                        <property name="label">gtk-edit</property>
-                        <property name="can_focus">True</property>
-                        <property name="receives_default">True</property>
-                        <property name="use_stock">True</property>
-                      </object>
-                      <packing>
-                        <property name="expand">False</property>
-                        <property name="fill">False</property>
-                        <property name="position">1</property>
-                      </packing>
-                    </child>
-                    <child>
-                      <object class="GtkButton" id="wcfd_custom_whitelist_remove_button">
-                        <property name="label">gtk-remove</property>
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="receives_default">True</property>
-                        <property name="use_stock">True</property>
-                      </object>
-                      <packing>
-                        <property name="expand">False</property>
-                        <property name="fill">False</property>
-                        <property name="position">2</property>
-                      </packing>
-                    </child>
+                    <property name="can_focus">False</property>
+                    <property name="label" translatable="yes">Allowed sites</property>
                   </object>
                   <packing>
-                    <property name="expand">False</property>
                     <property name="position">1</property>
+                    <property name="tab_fill">False</property>
                   </packing>
                 </child>
-              </object>
-            </child>
-          </object>
-          <packing>
-            <property name="position">1</property>
-          </packing>
-        </child>
-        <child type="tab">
-          <object class="GtkLabel" id="label2">
-            <property name="visible">True</property>
-            <property name="label" translatable="yes">Allowed sites</property>
-          </object>
-          <packing>
-            <property name="position">1</property>
-            <property name="tab_fill">False</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkAlignment" id="alignment3">
-            <property name="visible">True</property>
-            <property name="top_padding">5</property>
-            <property name="bottom_padding">5</property>
-            <property name="left_padding">5</property>
-            <property name="right_padding">5</property>
-            <child>
-              <object class="GtkHPaned" id="hpaned1">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="position">300</property>
-                <property name="position_set">True</property>
                 <child>
-                  <object class="GtkVBox" id="vbox1">
+                  <object class="GtkAlignment" id="alignment4">
                     <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="top_padding">5</property>
+                    <property name="bottom_padding">5</property>
+                    <property name="left_padding">5</property>
+                    <property name="right_padding">5</property>
                     <child>
-                      <object class="GtkScrolledWindow" id="scrolledwindow3">
+                      <object class="GtkHPaned" id="hpaned1">
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
-                        <property name="hscrollbar_policy">never</property>
-                        <property name="vscrollbar_policy">automatic</property>
-                        <property name="shadow_type">etched-in</property>
-                        <child>
-                          <object class="GtkTreeView" id="wcfd_packaged_blacklist_treeview">
-                            <property name="visible">True</property>
-                            <property name="can_focus">True</property>
-                            <property name="headers_visible">False</property>
-                          </object>
-                        </child>
-                      </object>
-                      <packing>
-                        <property name="position">0</property>
-                      </packing>
-                    </child>
-                    <child>
-                      <object class="GtkHButtonBox" id="hbuttonbox1">
-                        <property name="visible">True</property>
+                        <property name="position">300</property>
+                        <property name="position_set">True</property>
                         <child>
-                          <object class="GtkButton" id="wcfd_add_bl_button">
-                            <property name="label">gtk-add</property>
+                          <object class="GtkVBox" id="vbox1">
                             <property name="visible">True</property>
-                            <property name="can_focus">True</property>
-                            <property name="receives_default">True</property>
-                            <property name="use_stock">True</property>
-                          </object>
-                          <packing>
-                            <property name="expand">False</property>
-                            <property name="fill">False</property>
-                            <property name="position">0</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <object class="GtkButton" id="wcfd_del_bl_button">
-                            <property name="label">gtk-remove</property>
-                            <property name="visible">True</property>
-                            <property name="can_focus">True</property>
-                            <property name="receives_default">True</property>
-                            <property name="use_stock">True</property>
+                            <property name="can_focus">False</property>
+                            <child>
+                              <object class="GtkScrolledWindow" id="scrolledwindow3">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="hscrollbar_policy">never</property>
+                                <property name="shadow_type">etched-in</property>
+                                <child>
+                                  <object class="GtkTreeView" id="wcfd_packaged_blacklist_treeview">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="headers_visible">False</property>
+                                    <child internal-child="selection">
+                                      <object class="GtkTreeSelection" id="treeview-selection11"/>
+                                    </child>
+                                  </object>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkHButtonBox" id="hbuttonbox1">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <child>
+                                  <object class="GtkButton" id="wcfd_add_bl_button">
+                                    <property name="label">gtk-add</property>
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="receives_default">True</property>
+                                    <property name="use_action_appearance">False</property>
+                                    <property name="use_stock">True</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">False</property>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkButton" id="wcfd_del_bl_button">
+                                    <property name="label">gtk-remove</property>
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="receives_default">True</property>
+                                    <property name="use_action_appearance">False</property>
+                                    <property name="use_stock">True</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">False</property>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkButton" id="wcfd_update_bl_button">
+                                    <property name="label" translatable="yes">_Update</property>
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="receives_default">True</property>
+                                    <property name="use_action_appearance">False</property>
+                                    <property name="use_underline">True</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">False</property>
+                                    <property name="position">2</property>
+                                  </packing>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">True</property>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
                           </object>
                           <packing>
-                            <property name="expand">False</property>
-                            <property name="fill">False</property>
-                            <property name="position">1</property>
+                            <property name="resize">False</property>
+                            <property name="shrink">True</property>
                           </packing>
                         </child>
                         <child>
-                          <object class="GtkButton" id="wcfd_update_bl_button">
-                            <property name="label" translatable="yes">_Update</property>
+                          <object class="GtkScrolledWindow" id="scrolledwindow4">
                             <property name="visible">True</property>
                             <property name="can_focus">True</property>
-                            <property name="receives_default">True</property>
-                            <property name="use_underline">True</property>
+                            <property name="hscrollbar_policy">never</property>
+                            <property name="shadow_type">etched-in</property>
+                            <child>
+                              <object class="GtkTreeView" id="wcfd_packaged_blacklist_categories_treeview">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="headers_visible">False</property>
+                                <child internal-child="selection">
+                                  <object class="GtkTreeSelection" id="treeview-selection12"/>
+                                </child>
+                              </object>
+                            </child>
                           </object>
                           <packing>
-                            <property name="expand">False</property>
-                            <property name="fill">False</property>
-                            <property name="position">2</property>
+                            <property name="resize">True</property>
+                            <property name="shrink">True</property>
                           </packing>
                         </child>
                       </object>
-                      <packing>
-                        <property name="expand">False</property>
-                        <property name="position">1</property>
-                      </packing>
                     </child>
                   </object>
                   <packing>
-                    <property name="resize">False</property>
-                    <property name="shrink">True</property>
+                    <property name="position">2</property>
                   </packing>
                 </child>
-                <child>
-                  <object class="GtkScrolledWindow" id="scrolledwindow4">
+                <child type="tab">
+                  <object class="GtkLabel" id="label3">
                     <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="hscrollbar_policy">never</property>
-                    <property name="vscrollbar_policy">automatic</property>
-                    <property name="shadow_type">etched-in</property>
-                    <child>
-                      <object class="GtkTreeView" id="wcfd_packaged_blacklist_categories_treeview">
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="headers_visible">False</property>
-                      </object>
-                    </child>
+                    <property name="can_focus">False</property>
+                    <property name="label" translatable="yes">Blacklists</property>
                   </object>
                   <packing>
-                    <property name="resize">True</property>
-                    <property name="shrink">True</property>
+                    <property name="position">2</property>
+                    <property name="tab_fill">False</property>
                   </packing>
                 </child>
               </object>
             </child>
           </object>
           <packing>
-            <property name="position">2</property>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
           </packing>
         </child>
-        <child type="tab">
-          <object class="GtkLabel" id="label3">
+        <child>
+          <object class="GtkAlignment" id="alignment7">
             <property name="visible">True</property>
-            <property name="label" translatable="yes">Blacklists</property>
+            <property name="can_focus">False</property>
+            <child>
+              <object class="GtkHBox" id="hbox9">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="spacing">5</property>
+                <child>
+                  <object class="GtkCheckButton" id="wcfd_browser_use_proxy_checkbutton">
+                    <property name="label" translatable="yes">Enable _web content filtering</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="use_action_appearance">False</property>
+                    <property name="use_underline">True</property>
+                    <property name="xalign">0</property>
+                    <property name="draw_indicator">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">True</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+              </object>
+            </child>
           </object>
           <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
             <property name="position">2</property>
-            <property name="tab_fill">False</property>
           </packing>
         </child>
       </object>
diff --git a/client/gnome/admin/data/ui/nac_wcf_edit_dialog.ui b/client/gnome/admin/data/ui/nac_wcf_edit_dialog.ui
index 5b2ff38..1141138 100644
--- a/client/gnome/admin/data/ui/nac_wcf_edit_dialog.ui
+++ b/client/gnome/admin/data/ui/nac_wcf_edit_dialog.ui
@@ -1,53 +1,29 @@
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <requires lib="gtk+" version="2.16"/>
-  <!-- interface-naming-policy project-wide -->
   <object class="GtkDialog" id="wcfed_dialog">
+    <property name="can_focus">False</property>
     <property name="border_width">5</property>
     <property name="icon_name">nanny</property>
     <property name="type_hint">normal</property>
-    <property name="has_separator">False</property>
     <child internal-child="vbox">
-      <object class="GtkVBox" id="dialog-vbox1">
+      <object class="GtkBox" id="dialog-vbox1">
         <property name="visible">True</property>
+        <property name="can_focus">False</property>
         <property name="orientation">vertical</property>
         <property name="spacing">2</property>
         <child>
-          <object class="GtkLabel" id="wcfed_warning_label">
-            <property name="visible">True</property>
-            <property name="xalign">0</property>
-            <property name="yalign">0</property>
-            <property name="label" translatable="yes">&lt;span color="red"&gt;All the fields are mandatory. Please fill all of them.&lt;/span&gt;</property>
-            <property name="use_markup">True</property>
-          </object>
-          <packing>
-            <property name="position">1</property>
-          </packing>
-        </child>
-        <child>
           <object class="GtkTable" id="table2">
             <property name="visible">True</property>
+            <property name="can_focus">False</property>
             <property name="n_rows">3</property>
             <property name="n_columns">2</property>
             <property name="column_spacing">12</property>
             <property name="row_spacing">5</property>
             <child>
-              <object class="GtkEntry" id="wcfed_url_entry">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="invisible_char">&#x25CF;</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">2</property>
-                <property name="bottom_attach">3</property>
-                <property name="y_options"></property>
-              </packing>
-            </child>
-            <child>
               <object class="GtkLabel" id="label4">
                 <property name="visible">True</property>
+                <property name="can_focus">False</property>
                 <property name="xalign">0</property>
                 <property name="label" translatable="yes">URL:</property>
               </object>
@@ -61,6 +37,7 @@
             <child>
               <object class="GtkLabel" id="label3">
                 <property name="visible">True</property>
+                <property name="can_focus">False</property>
                 <property name="xalign">0</property>
                 <property name="label" translatable="yes">Description:</property>
               </object>
@@ -75,7 +52,7 @@
               <object class="GtkEntry" id="wcfed_description_entry">
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
-                <property name="invisible_char">&#x25CF;</property>
+                <property name="invisible_char">â</property>
               </object>
               <packing>
                 <property name="left_attach">1</property>
@@ -88,10 +65,12 @@
             <child>
               <object class="GtkLabel" id="label1">
                 <property name="visible">True</property>
+                <property name="can_focus">False</property>
                 <property name="xalign">0</property>
                 <property name="label" translatable="yes">Name:</property>
               </object>
               <packing>
+                <property name="x_options">GTK_FILL</property>
                 <property name="y_options"></property>
               </packing>
             </child>
@@ -99,22 +78,39 @@
               <object class="GtkEntry" id="wcfed_name_entry">
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
-                <property name="invisible_char">&#x25CF;</property>
+                <property name="invisible_char">â</property>
+              </object>
+              <packing>
+                <property name="left_attach">1</property>
+                <property name="right_attach">2</property>
+                <property name="y_options"></property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkEntry" id="wcfed_url_entry">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="invisible_char">â</property>
               </object>
               <packing>
                 <property name="left_attach">1</property>
                 <property name="right_attach">2</property>
+                <property name="top_attach">2</property>
+                <property name="bottom_attach">3</property>
                 <property name="y_options"></property>
               </packing>
             </child>
           </object>
           <packing>
-            <property name="position">2</property>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">0</property>
           </packing>
         </child>
         <child internal-child="action_area">
-          <object class="GtkHButtonBox" id="dialog-action_area1">
+          <object class="GtkButtonBox" id="dialog-action_area1">
             <property name="visible">True</property>
+            <property name="can_focus">False</property>
             <property name="layout_style">end</property>
             <child>
               <object class="GtkButton" id="wcfed_cancel_button">
@@ -122,6 +118,7 @@
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="receives_default">True</property>
+                <property name="use_action_appearance">False</property>
                 <property name="use_stock">True</property>
               </object>
               <packing>
@@ -134,8 +131,10 @@
               <object class="GtkButton" id="wcfed_ok_button">
                 <property name="label">gtk-ok</property>
                 <property name="visible">True</property>
+                <property name="sensitive">False</property>
                 <property name="can_focus">True</property>
                 <property name="receives_default">True</property>
+                <property name="use_action_appearance">False</property>
                 <property name="use_stock">True</property>
               </object>
               <packing>
@@ -147,8 +146,26 @@
           </object>
           <packing>
             <property name="expand">False</property>
+            <property name="fill">True</property>
             <property name="pack_type">end</property>
-            <property name="position">0</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkLabel" id="wcfed_warning_label">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="xalign">0</property>
+            <property name="yalign">0</property>
+            <property name="ypad">12</property>
+            <property name="label" translatable="yes">All the fields are mandatory, so please fill all of them.	</property>
+            <property name="use_markup">True</property>
+            <property name="wrap">True</property>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">3</property>
           </packing>
         </child>
       </object>
diff --git a/client/gnome/admin/data/ui/nanny_admin_console.ui b/client/gnome/admin/data/ui/nanny_admin_console.ui
index a98d079..90357df 100644
--- a/client/gnome/admin/data/ui/nanny_admin_console.ui
+++ b/client/gnome/admin/data/ui/nanny_admin_console.ui
@@ -1,13 +1,57 @@
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <requires lib="gtk+" version="2.16"/>
-  <!-- interface-naming-policy project-wide -->
   <object class="GtkAction" id="action1"/>
+  <object class="GtkAdjustment" id="adjustment1">
+    <property name="upper">24</property>
+    <property name="step_increment">0.10000000000000001</property>
+  </object>
+  <object class="GtkAdjustment" id="adjustment2">
+    <property name="upper">24</property>
+    <property name="step_increment">0.10000000000000001</property>
+    <property name="page_increment">1</property>
+  </object>
+  <object class="GtkAdjustment" id="adjustment3">
+    <property name="upper">24</property>
+    <property name="step_increment">0.10000000000000001</property>
+    <property name="page_increment">1</property>
+  </object>
+  <object class="GtkAdjustment" id="adjustment4">
+    <property name="upper">24</property>
+    <property name="step_increment">0.10000000000000001</property>
+    <property name="page_increment">1</property>
+  </object>
+  <object class="GtkAdjustment" id="adjustment5">
+    <property name="lower">-24</property>
+    <property name="upper">24</property>
+    <property name="step_increment">0.10000000000000001</property>
+    <property name="page_increment">1</property>
+  </object>
+  <object class="GtkAdjustment" id="adjustment6">
+    <property name="lower">-24</property>
+    <property name="upper">24</property>
+    <property name="step_increment">0.10000000000000001</property>
+    <property name="page_increment">1</property>
+  </object>
+  <object class="GtkAdjustment" id="adjustment7">
+    <property name="lower">-24</property>
+    <property name="upper">24</property>
+    <property name="step_increment">0.10000000000000001</property>
+    <property name="page_increment">1</property>
+  </object>
+  <object class="GtkAdjustment" id="adjustment8">
+    <property name="lower">-24</property>
+    <property name="upper">24</property>
+    <property name="step_increment">0.10000000000000001</property>
+    <property name="page_increment">1</property>
+  </object>
   <object class="GtkWindow" id="nac_window">
+    <property name="can_focus">False</property>
     <property name="icon_name">nanny</property>
     <child>
       <object class="GtkAlignment" id="alignment1">
         <property name="visible">True</property>
+        <property name="can_focus">False</property>
         <property name="top_padding">5</property>
         <property name="bottom_padding">5</property>
         <property name="left_padding">5</property>
@@ -15,19 +59,83 @@
         <child>
           <object class="GtkVBox" id="vbox1">
             <property name="visible">True</property>
-            <property name="orientation">vertical</property>
+            <property name="can_focus">False</property>
             <property name="spacing">5</property>
             <child>
+              <object class="GtkHButtonBox" id="hbuttonbox1">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="spacing">6</property>
+                <property name="layout_style">end</property>
+                <child>
+                  <object class="GtkButton" id="nac_help_button">
+                    <property name="label">gtk-help</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="use_action_appearance">False</property>
+                    <property name="use_stock">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">0</property>
+                    <property name="secondary">True</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkButton" id="nac_apply_button">
+                    <property name="label">gtk-apply</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="use_action_appearance">False</property>
+                    <property name="use_stock">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="pack_type">end</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkButton" id="nac_close_button">
+                    <property name="label">gtk-close</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="use_action_appearance">False</property>
+                    <property name="use_stock">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="pack_type">end</property>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="pack_type">end</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
               <object class="GtkHPaned" id="hpaned1">
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="position">200</property>
-                <property name="position_set">True</property>
                 <child>
                   <object class="GtkTreeView" id="nac_users_treeview">
                     <property name="visible">True</property>
                     <property name="can_focus">True</property>
                     <property name="search_column">0</property>
+                    <child internal-child="selection">
+                      <object class="GtkTreeSelection" id="treeview-selection1"/>
+                    </child>
                   </object>
                   <packing>
                     <property name="resize">True</property>
@@ -37,7 +145,7 @@
                 <child>
                   <object class="GtkVBox" id="vbox2">
                     <property name="visible">True</property>
-                    <property name="orientation">vertical</property>
+                    <property name="can_focus">False</property>
                     <property name="spacing">6</property>
                     <child>
                       <object class="GtkNotebook" id="nac_main_notebook">
@@ -46,6 +154,7 @@
                         <child>
                           <object class="GtkAlignment" id="alignment2">
                             <property name="visible">True</property>
+                            <property name="can_focus">False</property>
                             <property name="top_padding">5</property>
                             <property name="bottom_padding">5</property>
                             <property name="left_padding">5</property>
@@ -53,65 +162,236 @@
                             <child>
                               <object class="GtkVBox" id="vbox3">
                                 <property name="visible">True</property>
-                                <property name="orientation">vertical</property>
+                                <property name="can_focus">False</property>
                                 <property name="spacing">5</property>
                                 <child>
                                   <object class="GtkHBox" id="hbox5">
                                     <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <property name="spacing">5</property>
+                                    <child>
+                                      <object class="GtkAlignment" id="alignment6">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">False</property>
+                                        <child>
+                                          <object class="GtkHBox" id="hbox9">
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">False</property>
+                                            <property name="spacing">5</property>
+                                            <child>
+                                              <object class="GtkCheckButton" id="nac_session_hoursday_checkbutton">
+                                                <property name="label" translatable="yes">Use the computer</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="receives_default">False</property>
+                                                <property name="use_action_appearance">False</property>
+                                                <property name="xalign">0</property>
+                                                <property name="draw_indicator">True</property>
+                                              </object>
+                                              <packing>
+                                                <property name="expand">False</property>
+                                                <property name="fill">True</property>
+                                                <property name="position">0</property>
+                                              </packing>
+                                            </child>
+                                            <child>
+                                              <object class="GtkSpinButton" id="nac_session_hoursday_spinbutton">
+                                                <property name="visible">True</property>
+                                                <property name="sensitive">False</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="invisible_char">â</property>
+                                                <property name="invisible_char_set">True</property>
+                                                <property name="adjustment">adjustment1</property>
+                                                <property name="digits">1</property>
+                                                <property name="snap_to_ticks">True</property>
+                                                <property name="numeric">True</property>
+                                              </object>
+                                              <packing>
+                                                <property name="expand">False</property>
+                                                <property name="fill">True</property>
+                                                <property name="position">1</property>
+                                              </packing>
+                                            </child>
+                                            <child>
+                                              <object class="GtkLabel" id="label5">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="xalign">0</property>
+                                                <property name="label" translatable="yes">hours a day</property>
+                                              </object>
+                                              <packing>
+                                                <property name="expand">False</property>
+                                                <property name="fill">True</property>
+                                                <property name="position">2</property>
+                                              </packing>
+                                            </child>
+                                          </object>
+                                        </child>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">True</property>
+                                        <property name="fill">True</property>
+                                        <property name="position">0</property>
+                                      </packing>
+                                    </child>
+                                    <child>
+                                      <object class="GtkAlignment" id="alignment7">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">False</property>
+                                        <property name="xalign">1</property>
+                                        <child>
+                                          <object class="GtkHBox" id="hbox14">
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">False</property>
+                                            <property name="spacing">5</property>
+                                            <child>
+                                              <object class="GtkCheckButton" id="nac_session_force_logoff_checkbutton">
+                                                <property name="label" translatable="yes">Force logoff</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="receives_default">False</property>
+                                                <property name="tooltip_text" translatable="yes">Force user either to log off or buy extra time after desktop is blocked</property>
+                                                <property name="use_action_appearance">False</property>
+                                                <property name="xalign">0</property>
+                                                <property name="draw_indicator">True</property>
+                                              </object>
+                                              <packing>
+                                                <property name="expand">False</property>
+                                                <property name="fill">True</property>
+                                                <property name="position">0</property>
+                                              </packing>
+                                            </child>
+                                          </object>
+                                        </child>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="fill">True</property>
+                                        <property name="position">1</property>
+                                      </packing>
+                                    </child>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkHBox" id="hbox10">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
                                     <property name="spacing">5</property>
                                     <child>
-                                      <object class="GtkCheckButton" id="nac_session_hoursday_checkbutton">
-                                        <property name="label" translatable="yes">Use the computer</property>
+                                      <object class="GtkButton" id="nac_session_grant_time_button">
+                                        <property name="label">gtk-add</property>
                                         <property name="visible">True</property>
+                                        <property name="sensitive">False</property>
                                         <property name="can_focus">True</property>
-                                        <property name="receives_default">False</property>
-                                        <property name="draw_indicator">True</property>
+                                        <property name="receives_default">True</property>
+                                        <property name="use_action_appearance">False</property>
+                                        <property name="use_stock">True</property>
                                       </object>
                                       <packing>
                                         <property name="expand">False</property>
+                                        <property name="fill">True</property>
                                         <property name="position">0</property>
                                       </packing>
                                     </child>
                                     <child>
-                                      <object class="GtkSpinButton" id="nac_session_hoursday_spinbutton">
+                                      <object class="GtkSpinButton" id="nac_session_extrahours_spinbutton">
                                         <property name="visible">True</property>
+                                        <property name="sensitive">False</property>
                                         <property name="can_focus">True</property>
-                                        <property name="invisible_char">&#x25CF;</property>
-                                        <property name="adjustment">adjustment1</property>
+                                        <property name="invisible_char">â</property>
+                                        <property name="invisible_char_set">True</property>
+                                        <property name="adjustment">adjustment5</property>
                                         <property name="digits">1</property>
                                         <property name="snap_to_ticks">True</property>
                                         <property name="numeric">True</property>
                                       </object>
                                       <packing>
                                         <property name="expand">False</property>
+                                        <property name="fill">True</property>
                                         <property name="position">1</property>
                                       </packing>
                                     </child>
                                     <child>
-                                      <object class="GtkLabel" id="label5">
+                                      <object class="GtkLabel" id="label10">
                                         <property name="visible">True</property>
+                                        <property name="can_focus">False</property>
                                         <property name="xalign">0</property>
-                                        <property name="label" translatable="yes">hours a day</property>
+                                        <property name="label" translatable="yes">hours to</property>
                                       </object>
                                       <packing>
+                                        <property name="expand">False</property>
+                                        <property name="fill">True</property>
                                         <property name="position">2</property>
                                       </packing>
                                     </child>
+                                    <child>
+                                      <object class="GtkEntry" id="nac_session_extrahours_entry">
+                                        <property name="visible">True</property>
+                                        <property name="sensitive">False</property>
+                                        <property name="can_focus">True</property>
+                                        <property name="editable">False</property>
+                                        <property name="invisible_char">â</property>
+                                        <property name="width_chars">4</property>
+                                        <property name="text" translatable="yes">0</property>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="fill">True</property>
+                                        <property name="position">3</property>
+                                      </packing>
+                                    </child>
+                                    <child>
+                                      <object class="GtkLabel" id="label11">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">False</property>
+                                        <property name="xalign">0</property>
+                                        <property name="label" translatable="yes">that's left today</property>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="fill">True</property>
+                                        <property name="position">4</property>
+                                      </packing>
+                                    </child>
+                                    <child>
+                                      <object class="GtkButton" id="nac_session_configure_chores_button">
+                                        <property name="label" translatable="yes">Configure _chores &amp; rewards</property>
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">True</property>
+                                        <property name="receives_default">True</property>
+                                        <property name="use_action_appearance">False</property>
+                                        <property name="use_underline">True</property>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="fill">True</property>
+                                        <property name="position">5</property>
+                                      </packing>
+                                    </child>
                                   </object>
                                   <packing>
                                     <property name="expand">False</property>
-                                    <property name="position">0</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">1</property>
                                   </packing>
                                 </child>
                                 <child>
                                   <object class="GtkAlignment" id="nac_session_schedule_alignment">
                                     <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
                                     <child>
                                       <placeholder/>
                                     </child>
                                   </object>
                                   <packing>
-                                    <property name="position">1</property>
+                                    <property name="expand">True</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">2</property>
                                   </packing>
                                 </child>
                               </object>
@@ -121,21 +401,28 @@
                         <child type="tab">
                           <object class="GtkHBox" id="hbox1">
                             <property name="visible">True</property>
+                            <property name="can_focus">False</property>
                             <child>
                               <object class="GtkImage" id="image1">
                                 <property name="visible">True</property>
+                                <property name="can_focus">False</property>
                                 <property name="icon_name">computer</property>
                               </object>
                               <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
                                 <property name="position">0</property>
                               </packing>
                             </child>
                             <child>
                               <object class="GtkLabel" id="label1">
                                 <property name="visible">True</property>
+                                <property name="can_focus">False</property>
                                 <property name="label" translatable="yes">PC use time</property>
                               </object>
                               <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
                                 <property name="position">1</property>
                               </packing>
                             </child>
@@ -147,6 +434,7 @@
                         <child>
                           <object class="GtkAlignment" id="alignment3">
                             <property name="visible">True</property>
+                            <property name="can_focus">False</property>
                             <property name="top_padding">5</property>
                             <property name="bottom_padding">5</property>
                             <property name="left_padding">5</property>
@@ -154,99 +442,179 @@
                             <child>
                               <object class="GtkVBox" id="vbox4">
                                 <property name="visible">True</property>
-                                <property name="orientation">vertical</property>
+                                <property name="can_focus">False</property>
                                 <property name="spacing">5</property>
                                 <child>
-                                  <object class="GtkHBox" id="hbox9">
+                                  <object class="GtkHBox" id="hbox6">
                                     <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
                                     <property name="spacing">5</property>
                                     <child>
-                                      <object class="GtkCheckButton" id="nac_browser_use_proxy_checkbutton">
-                                        <property name="label" translatable="yes">Use web content filtering</property>
+                                      <object class="GtkCheckButton" id="nac_browser_hoursday_checkbutton">
+                                        <property name="label" translatable="yes">Use the web browser</property>
                                         <property name="visible">True</property>
                                         <property name="can_focus">True</property>
                                         <property name="receives_default">False</property>
+                                        <property name="use_action_appearance">False</property>
                                         <property name="draw_indicator">True</property>
                                       </object>
                                       <packing>
                                         <property name="expand">False</property>
+                                        <property name="fill">True</property>
                                         <property name="position">0</property>
                                       </packing>
                                     </child>
                                     <child>
-                                      <object class="GtkButton" id="nac_browser_configure_proxy_button">
-                                        <property name="label" translatable="yes">Configure</property>
+                                      <object class="GtkSpinButton" id="nac_browser_hoursday_spinbutton">
                                         <property name="visible">True</property>
                                         <property name="can_focus">True</property>
-                                        <property name="receives_default">True</property>
+                                        <property name="invisible_char">â</property>
+                                        <property name="adjustment">adjustment2</property>
+                                        <property name="digits">1</property>
+                                        <property name="snap_to_ticks">True</property>
+                                        <property name="numeric">True</property>
                                       </object>
                                       <packing>
                                         <property name="expand">False</property>
+                                        <property name="fill">True</property>
                                         <property name="position">1</property>
                                       </packing>
                                     </child>
+                                    <child>
+                                      <object class="GtkLabel" id="label6">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">False</property>
+                                        <property name="xalign">0</property>
+                                        <property name="label" translatable="yes">hours a day</property>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">True</property>
+                                        <property name="fill">True</property>
+                                        <property name="position">2</property>
+                                      </packing>
+                                    </child>
                                   </object>
                                   <packing>
                                     <property name="expand">False</property>
+                                    <property name="fill">True</property>
                                     <property name="position">0</property>
                                   </packing>
                                 </child>
                                 <child>
-                                  <object class="GtkHBox" id="hbox6">
+                                  <object class="GtkHBox" id="hbox11">
                                     <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
                                     <property name="spacing">5</property>
                                     <child>
-                                      <object class="GtkCheckButton" id="nac_browser_hoursday_checkbutton">
-                                        <property name="label" translatable="yes">Use the web browser</property>
+                                      <object class="GtkButton" id="nac_browser_grant_time_button">
+                                        <property name="label">gtk-add</property>
                                         <property name="visible">True</property>
+                                        <property name="sensitive">False</property>
                                         <property name="can_focus">True</property>
-                                        <property name="receives_default">False</property>
-                                        <property name="draw_indicator">True</property>
+                                        <property name="receives_default">True</property>
+                                        <property name="use_action_appearance">False</property>
+                                        <property name="use_stock">True</property>
                                       </object>
                                       <packing>
                                         <property name="expand">False</property>
+                                        <property name="fill">True</property>
                                         <property name="position">0</property>
                                       </packing>
                                     </child>
                                     <child>
-                                      <object class="GtkSpinButton" id="nac_browser_hoursday_spinbutton">
+                                      <object class="GtkSpinButton" id="nac_browser_extrahours_spinbutton">
                                         <property name="visible">True</property>
+                                        <property name="sensitive">False</property>
                                         <property name="can_focus">True</property>
-                                        <property name="invisible_char">&#x25CF;</property>
-                                        <property name="adjustment">adjustment2</property>
+                                        <property name="invisible_char">â</property>
+                                        <property name="invisible_char_set">True</property>
+                                        <property name="adjustment">adjustment6</property>
                                         <property name="digits">1</property>
                                         <property name="snap_to_ticks">True</property>
                                         <property name="numeric">True</property>
                                       </object>
                                       <packing>
                                         <property name="expand">False</property>
+                                        <property name="fill">True</property>
                                         <property name="position">1</property>
                                       </packing>
                                     </child>
                                     <child>
-                                      <object class="GtkLabel" id="label6">
+                                      <object class="GtkLabel" id="label12">
                                         <property name="visible">True</property>
+                                        <property name="can_focus">False</property>
                                         <property name="xalign">0</property>
-                                        <property name="label" translatable="yes">hours a day</property>
+                                        <property name="label" translatable="yes">hours to</property>
                                       </object>
                                       <packing>
+                                        <property name="expand">False</property>
+                                        <property name="fill">True</property>
                                         <property name="position">2</property>
                                       </packing>
                                     </child>
+                                    <child>
+                                      <object class="GtkEntry" id="nac_browser_extrahours_entry">
+                                        <property name="visible">True</property>
+                                        <property name="sensitive">False</property>
+                                        <property name="can_focus">True</property>
+                                        <property name="editable">False</property>
+                                        <property name="invisible_char">â</property>
+                                        <property name="width_chars">4</property>
+                                        <property name="text" translatable="yes">0</property>
+                                        <property name="invisible_char_set">True</property>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="fill">True</property>
+                                        <property name="position">3</property>
+                                      </packing>
+                                    </child>
+                                    <child>
+                                      <object class="GtkLabel" id="label13">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">False</property>
+                                        <property name="xalign">0</property>
+                                        <property name="label" translatable="yes">that's left today</property>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="fill">True</property>
+                                        <property name="position">4</property>
+                                      </packing>
+                                    </child>
+                                    <child>
+                                      <object class="GtkButton" id="nac_browser_configure_proxy_button">
+                                        <property name="label" translatable="yes">Configure web filtering</property>
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">True</property>
+                                        <property name="receives_default">True</property>
+                                        <property name="use_action_appearance">False</property>
+                                        <property name="use_underline">True</property>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="fill">True</property>
+                                        <property name="position">5</property>
+                                      </packing>
+                                    </child>
                                   </object>
                                   <packing>
                                     <property name="expand">False</property>
+                                    <property name="fill">True</property>
                                     <property name="position">1</property>
                                   </packing>
                                 </child>
                                 <child>
                                   <object class="GtkAlignment" id="nac_browser_schedule_alignment">
                                     <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
                                     <child>
                                       <placeholder/>
                                     </child>
                                   </object>
                                   <packing>
+                                    <property name="expand">True</property>
+                                    <property name="fill">True</property>
                                     <property name="position">2</property>
                                   </packing>
                                 </child>
@@ -260,21 +628,28 @@
                         <child type="tab">
                           <object class="GtkHBox" id="hbox2">
                             <property name="visible">True</property>
+                            <property name="can_focus">False</property>
                             <child>
                               <object class="GtkImage" id="image2">
                                 <property name="visible">True</property>
+                                <property name="can_focus">False</property>
                                 <property name="icon_name">applications-internet</property>
                               </object>
                               <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
                                 <property name="position">0</property>
                               </packing>
                             </child>
                             <child>
                               <object class="GtkLabel" id="label2">
                                 <property name="visible">True</property>
+                                <property name="can_focus">False</property>
                                 <property name="label" translatable="yes">Web browser</property>
                               </object>
                               <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
                                 <property name="position">1</property>
                               </packing>
                             </child>
@@ -287,6 +662,7 @@
                         <child>
                           <object class="GtkAlignment" id="alignment4">
                             <property name="visible">True</property>
+                            <property name="can_focus">False</property>
                             <property name="top_padding">5</property>
                             <property name="bottom_padding">5</property>
                             <property name="left_padding">5</property>
@@ -294,11 +670,12 @@
                             <child>
                               <object class="GtkVBox" id="vbox5">
                                 <property name="visible">True</property>
-                                <property name="orientation">vertical</property>
+                                <property name="can_focus">False</property>
                                 <property name="spacing">5</property>
                                 <child>
                                   <object class="GtkHBox" id="hbox7">
                                     <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
                                     <property name="spacing">5</property>
                                     <child>
                                       <object class="GtkCheckButton" id="nac_mail_hoursday_checkbutton">
@@ -306,10 +683,12 @@
                                         <property name="visible">True</property>
                                         <property name="can_focus">True</property>
                                         <property name="receives_default">False</property>
+                                        <property name="use_action_appearance">False</property>
                                         <property name="draw_indicator">True</property>
                                       </object>
                                       <packing>
                                         <property name="expand">False</property>
+                                        <property name="fill">True</property>
                                         <property name="position">0</property>
                                       </packing>
                                     </child>
@@ -317,7 +696,7 @@
                                       <object class="GtkSpinButton" id="nac_mail_hoursday_spinbutton">
                                         <property name="visible">True</property>
                                         <property name="can_focus">True</property>
-                                        <property name="invisible_char">&#x25CF;</property>
+                                        <property name="invisible_char">â</property>
                                         <property name="adjustment">adjustment3</property>
                                         <property name="digits">1</property>
                                         <property name="snap_to_ticks">True</property>
@@ -325,36 +704,136 @@
                                       </object>
                                       <packing>
                                         <property name="expand">False</property>
+                                        <property name="fill">True</property>
                                         <property name="position">1</property>
                                       </packing>
                                     </child>
                                     <child>
                                       <object class="GtkLabel" id="label7">
                                         <property name="visible">True</property>
+                                        <property name="can_focus">False</property>
                                         <property name="xalign">0</property>
                                         <property name="label" translatable="yes">hours a day</property>
                                       </object>
                                       <packing>
+                                        <property name="expand">True</property>
+                                        <property name="fill">True</property>
                                         <property name="position">2</property>
                                       </packing>
                                     </child>
                                   </object>
                                   <packing>
                                     <property name="expand">False</property>
+                                    <property name="fill">True</property>
                                     <property name="position">0</property>
                                   </packing>
                                 </child>
                                 <child>
-                                  <object class="GtkAlignment" id="nac_mail_schedule_alignment">
+                                  <object class="GtkHBox" id="hbox12">
                                     <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <property name="spacing">5</property>
+                                    <child>
+                                      <object class="GtkButton" id="nac_mail_grant_time_button">
+                                        <property name="label">gtk-add</property>
+                                        <property name="visible">True</property>
+                                        <property name="sensitive">False</property>
+                                        <property name="can_focus">True</property>
+                                        <property name="receives_default">True</property>
+                                        <property name="use_action_appearance">False</property>
+                                        <property name="use_stock">True</property>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="fill">True</property>
+                                        <property name="position">0</property>
+                                      </packing>
+                                    </child>
+                                    <child>
+                                      <object class="GtkSpinButton" id="nac_mail_extrahours_spinbutton">
+                                        <property name="visible">True</property>
+                                        <property name="sensitive">False</property>
+                                        <property name="can_focus">True</property>
+                                        <property name="invisible_char">â</property>
+                                        <property name="invisible_char_set">True</property>
+                                        <property name="adjustment">adjustment7</property>
+                                        <property name="digits">1</property>
+                                        <property name="snap_to_ticks">True</property>
+                                        <property name="numeric">True</property>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="fill">True</property>
+                                        <property name="position">1</property>
+                                      </packing>
+                                    </child>
+                                    <child>
+                                      <object class="GtkLabel" id="label14">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">False</property>
+                                        <property name="xalign">0</property>
+                                        <property name="label" translatable="yes">hours to</property>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="fill">True</property>
+                                        <property name="position">2</property>
+                                      </packing>
+                                    </child>
+                                    <child>
+                                      <object class="GtkEntry" id="nac_mail_extrahours_entry">
+                                        <property name="visible">True</property>
+                                        <property name="sensitive">False</property>
+                                        <property name="can_focus">True</property>
+                                        <property name="editable">False</property>
+                                        <property name="invisible_char">â</property>
+                                        <property name="width_chars">4</property>
+                                        <property name="text" translatable="yes">0</property>
+                                        <property name="invisible_char_set">True</property>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="fill">True</property>
+                                        <property name="position">3</property>
+                                      </packing>
+                                    </child>
+                                    <child>
+                                      <object class="GtkLabel" id="label15">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">False</property>
+                                        <property name="xalign">0</property>
+                                        <property name="label" translatable="yes">that's left today</property>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="fill">True</property>
+                                        <property name="position">4</property>
+                                      </packing>
+                                    </child>
                                     <child>
                                       <placeholder/>
                                     </child>
                                   </object>
                                   <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">True</property>
                                     <property name="position">1</property>
                                   </packing>
                                 </child>
+                                <child>
+                                  <object class="GtkAlignment" id="nac_mail_schedule_alignment">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <child>
+                                      <placeholder/>
+                                    </child>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">True</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">2</property>
+                                  </packing>
+                                </child>
                               </object>
                             </child>
                           </object>
@@ -365,21 +844,28 @@
                         <child type="tab">
                           <object class="GtkHBox" id="hbox3">
                             <property name="visible">True</property>
+                            <property name="can_focus">False</property>
                             <child>
                               <object class="GtkImage" id="image3">
                                 <property name="visible">True</property>
+                                <property name="can_focus">False</property>
                                 <property name="icon_name">emblem-mail</property>
                               </object>
                               <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
                                 <property name="position">0</property>
                               </packing>
                             </child>
                             <child>
                               <object class="GtkLabel" id="label3">
                                 <property name="visible">True</property>
+                                <property name="can_focus">False</property>
                                 <property name="label" translatable="yes">Mail client</property>
                               </object>
                               <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
                                 <property name="position">1</property>
                               </packing>
                             </child>
@@ -392,6 +878,7 @@
                         <child>
                           <object class="GtkAlignment" id="alignment5">
                             <property name="visible">True</property>
+                            <property name="can_focus">False</property>
                             <property name="top_padding">5</property>
                             <property name="bottom_padding">5</property>
                             <property name="left_padding">5</property>
@@ -399,11 +886,12 @@
                             <child>
                               <object class="GtkVBox" id="vbox6">
                                 <property name="visible">True</property>
-                                <property name="orientation">vertical</property>
+                                <property name="can_focus">False</property>
                                 <property name="spacing">5</property>
                                 <child>
                                   <object class="GtkHBox" id="hbox8">
                                     <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
                                     <property name="spacing">5</property>
                                     <child>
                                       <object class="GtkCheckButton" id="nac_im_hoursday_checkbutton">
@@ -411,10 +899,12 @@
                                         <property name="visible">True</property>
                                         <property name="can_focus">True</property>
                                         <property name="receives_default">False</property>
+                                        <property name="use_action_appearance">False</property>
                                         <property name="draw_indicator">True</property>
                                       </object>
                                       <packing>
                                         <property name="expand">False</property>
+                                        <property name="fill">True</property>
                                         <property name="position">0</property>
                                       </packing>
                                     </child>
@@ -422,7 +912,7 @@
                                       <object class="GtkSpinButton" id="nac_im_hoursday_spinbutton">
                                         <property name="visible">True</property>
                                         <property name="can_focus">True</property>
-                                        <property name="invisible_char">&#x25CF;</property>
+                                        <property name="invisible_char">â</property>
                                         <property name="adjustment">adjustment4</property>
                                         <property name="digits">1</property>
                                         <property name="snap_to_ticks">True</property>
@@ -430,36 +920,136 @@
                                       </object>
                                       <packing>
                                         <property name="expand">False</property>
+                                        <property name="fill">True</property>
                                         <property name="position">1</property>
                                       </packing>
                                     </child>
                                     <child>
                                       <object class="GtkLabel" id="label8">
                                         <property name="visible">True</property>
+                                        <property name="can_focus">False</property>
                                         <property name="xalign">0</property>
                                         <property name="label" translatable="yes">hours a day</property>
                                       </object>
                                       <packing>
+                                        <property name="expand">True</property>
+                                        <property name="fill">True</property>
                                         <property name="position">2</property>
                                       </packing>
                                     </child>
                                   </object>
                                   <packing>
                                     <property name="expand">False</property>
+                                    <property name="fill">True</property>
                                     <property name="position">0</property>
                                   </packing>
                                 </child>
                                 <child>
-                                  <object class="GtkAlignment" id="nac_im_schedule_alignment">
+                                  <object class="GtkHBox" id="hbox13">
                                     <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <property name="spacing">5</property>
+                                    <child>
+                                      <object class="GtkButton" id="nac_im_grant_time_button">
+                                        <property name="label">gtk-add</property>
+                                        <property name="visible">True</property>
+                                        <property name="sensitive">False</property>
+                                        <property name="can_focus">True</property>
+                                        <property name="receives_default">True</property>
+                                        <property name="use_action_appearance">False</property>
+                                        <property name="use_stock">True</property>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="fill">True</property>
+                                        <property name="position">0</property>
+                                      </packing>
+                                    </child>
+                                    <child>
+                                      <object class="GtkSpinButton" id="nac_im_extrahours_spinbutton">
+                                        <property name="visible">True</property>
+                                        <property name="sensitive">False</property>
+                                        <property name="can_focus">True</property>
+                                        <property name="invisible_char">â</property>
+                                        <property name="invisible_char_set">True</property>
+                                        <property name="adjustment">adjustment8</property>
+                                        <property name="digits">1</property>
+                                        <property name="snap_to_ticks">True</property>
+                                        <property name="numeric">True</property>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="fill">True</property>
+                                        <property name="position">1</property>
+                                      </packing>
+                                    </child>
+                                    <child>
+                                      <object class="GtkLabel" id="label16">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">False</property>
+                                        <property name="xalign">0</property>
+                                        <property name="label" translatable="yes">hours to</property>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="fill">True</property>
+                                        <property name="position">2</property>
+                                      </packing>
+                                    </child>
+                                    <child>
+                                      <object class="GtkEntry" id="nac_im_extrahours_entry">
+                                        <property name="visible">True</property>
+                                        <property name="sensitive">False</property>
+                                        <property name="can_focus">True</property>
+                                        <property name="editable">False</property>
+                                        <property name="invisible_char">â</property>
+                                        <property name="width_chars">4</property>
+                                        <property name="text" translatable="yes">0</property>
+                                        <property name="invisible_char_set">True</property>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="fill">True</property>
+                                        <property name="position">3</property>
+                                      </packing>
+                                    </child>
+                                    <child>
+                                      <object class="GtkLabel" id="label17">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">False</property>
+                                        <property name="xalign">0</property>
+                                        <property name="label" translatable="yes">that's left today</property>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="fill">True</property>
+                                        <property name="position">4</property>
+                                      </packing>
+                                    </child>
                                     <child>
                                       <placeholder/>
                                     </child>
                                   </object>
                                   <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">True</property>
                                     <property name="position">1</property>
                                   </packing>
                                 </child>
+                                <child>
+                                  <object class="GtkAlignment" id="nac_im_schedule_alignment">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <child>
+                                      <placeholder/>
+                                    </child>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">True</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">2</property>
+                                  </packing>
+                                </child>
                               </object>
                             </child>
                           </object>
@@ -470,21 +1060,28 @@
                         <child type="tab">
                           <object class="GtkHBox" id="hbox4">
                             <property name="visible">True</property>
+                            <property name="can_focus">False</property>
                             <child>
                               <object class="GtkImage" id="image4">
                                 <property name="visible">True</property>
+                                <property name="can_focus">False</property>
                                 <property name="icon_name">face-smile</property>
                               </object>
                               <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
                                 <property name="position">0</property>
                               </packing>
                             </child>
                             <child>
                               <object class="GtkLabel" id="label4">
                                 <property name="visible">True</property>
+                                <property name="can_focus">False</property>
                                 <property name="label" translatable="yes">Instant messaging</property>
                               </object>
                               <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
                                 <property name="position">1</property>
                               </packing>
                             </child>
@@ -496,20 +1093,25 @@
                         </child>
                       </object>
                       <packing>
+                        <property name="expand">True</property>
+                        <property name="fill">True</property>
                         <property name="position">0</property>
                       </packing>
                     </child>
                     <child>
                       <object class="GtkHBox" id="nac_unlock_area">
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                         <child>
                           <object class="GtkButton" id="nac_unlock_button">
                             <property name="visible">True</property>
                             <property name="can_focus">True</property>
                             <property name="receives_default">True</property>
+                            <property name="use_action_appearance">False</property>
                             <child>
                               <object class="GtkImage" id="image5">
                                 <property name="visible">True</property>
+                                <property name="can_focus">False</property>
                                 <property name="pixel_size">32</property>
                                 <property name="icon_name">gtk-dialog-authentication</property>
                               </object>
@@ -517,12 +1119,14 @@
                           </object>
                           <packing>
                             <property name="expand">False</property>
+                            <property name="fill">True</property>
                             <property name="position">0</property>
                           </packing>
                         </child>
                         <child>
                           <object class="GtkLabel" id="label9">
                             <property name="visible">True</property>
+                            <property name="can_focus">False</property>
                             <property name="xalign">0</property>
                             <property name="xpad">6</property>
                             <property name="label" translatable="yes">&lt;b&gt;You don't have admin privileges&lt;/b&gt;
@@ -530,12 +1134,15 @@ Click this button if you want to make changes.</property>
                             <property name="use_markup">True</property>
                           </object>
                           <packing>
+                            <property name="expand">True</property>
+                            <property name="fill">True</property>
                             <property name="position">1</property>
                           </packing>
                         </child>
                       </object>
                       <packing>
                         <property name="expand">False</property>
+                        <property name="fill">True</property>
                         <property name="position">1</property>
                       </packing>
                     </child>
@@ -547,93 +1154,14 @@ Click this button if you want to make changes.</property>
                 </child>
               </object>
               <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
                 <property name="position">200</property>
               </packing>
             </child>
-            <child>
-              <object class="GtkHButtonBox" id="hbuttonbox1">
-                <property name="visible">True</property>
-                <property name="layout_style">end</property>
-                <child>
-                  <object class="GtkButton" id="nac_help_button">
-                    <property name="label">gtk-help</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">True</property>
-                    <property name="use_stock">True</property>
-                  </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">False</property>
-                    <property name="position">0</property>
-                    <property name="secondary">True</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkButton" id="nac_close_button">
-                    <property name="label">gtk-close</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">True</property>
-                    <property name="use_stock">True</property>
-                  </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">False</property>
-                    <property name="pack_type">end</property>
-                    <property name="position">2</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkButton" id="nac_apply_button">
-                    <property name="label">gtk-apply</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">True</property>
-                    <property name="use_stock">True</property>
-                  </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">False</property>
-                    <property name="pack_type">end</property>
-                    <property name="position">1</property>
-                  </packing>
-                </child>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">False</property>
-                <property name="pack_type">end</property>
-                <property name="position">1</property>
-              </packing>
-            </child>
           </object>
         </child>
       </object>
     </child>
   </object>
-  <object class="GtkAdjustment" id="adjustment1">
-    <property name="upper">24</property>
-    <property name="step_increment">0.5</property>
-    <property name="page_increment">10</property>
-    <property name="page_size">10</property>
-  </object>
-  <object class="GtkAdjustment" id="adjustment2">
-    <property name="upper">24</property>
-    <property name="step_increment">0.5</property>
-    <property name="page_increment">10</property>
-    <property name="page_size">10</property>
-  </object>
-  <object class="GtkAdjustment" id="adjustment3">
-    <property name="upper">24</property>
-    <property name="step_increment">0.5</property>
-    <property name="page_increment">10</property>
-    <property name="page_size">10</property>
-  </object>
-  <object class="GtkAdjustment" id="adjustment4">
-    <property name="upper">24</property>
-    <property name="step_increment">0.5</property>
-    <property name="page_increment">10</property>
-    <property name="page_size">10</property>
-  </object>
 </interface>
diff --git a/client/gnome/admin/data/ui/nanny_desktop_blocker.ui b/client/gnome/admin/data/ui/nanny_desktop_blocker.ui
index 4e2bf76..6e8d452 100644
--- a/client/gnome/admin/data/ui/nanny_desktop_blocker.ui
+++ b/client/gnome/admin/data/ui/nanny_desktop_blocker.ui
@@ -1,57 +1,74 @@
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <requires lib="gtk+" version="2.16"/>
-  <!-- interface-naming-policy project-wide -->
   <object class="GtkWindow" id="window1">
+    <property name="can_focus">False</property>
     <property name="modal">True</property>
     <property name="decorated">False</property>
     <child>
       <object class="GtkVBox" id="db_main_vbox">
         <property name="visible">True</property>
+        <property name="can_focus">False</property>
         <child>
           <object class="GtkAlignment" id="alignment1">
             <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="yalign">0.80000001192092896</property>
             <property name="xscale">0</property>
             <property name="yscale">0</property>
             <child>
               <object class="GtkHBox" id="hbox1">
                 <property name="visible">True</property>
+                <property name="can_focus">False</property>
                 <child>
                   <object class="GtkImage" id="image1">
                     <property name="visible">True</property>
-                    <property name="stock">gtk-dialog-warning</property>
+                    <property name="can_focus">False</property>
+                    <property name="xpad">24</property>
+                    <property name="stock">gtk-apply</property>
                     <property name="icon-size">6</property>
                   </object>
                   <packing>
+                    <property name="expand">True</property>
+                    <property name="fill">True</property>
                     <property name="position">0</property>
                   </packing>
                 </child>
                 <child>
                   <object class="GtkVBox" id="vbox2">
                     <property name="visible">True</property>
+                    <property name="can_focus">False</property>
                     <child>
                       <object class="GtkLabel" id="label1">
                         <property name="visible">True</property>
-                        <property name="xpad">9</property>
-                        <property name="label" translatable="yes">&lt;span size="25000" foreground="white"&gt;&lt;b&gt;You've used your computer use time&lt;/b&gt;&lt;/span&gt;</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">&lt;span size="25000" foreground="white"&gt;&lt;b&gt;Your computer usage time is up now&lt;/b&gt;&lt;/span&gt;</property>
                         <property name="use_markup">True</property>
                       </object>
                       <packing>
+                        <property name="expand">True</property>
+                        <property name="fill">True</property>
                         <property name="position">0</property>
                       </packing>
                     </child>
                     <child>
                       <object class="GtkLabel" id="db_info_label">
                         <property name="visible">True</property>
-                        <property name="label" translatable="yes">&lt;span foreground="white"&gt;&lt;big&gt;You've time available if you need to close documents or aplications.&lt;/big&gt;&lt;/span&gt;</property>
+                        <property name="can_focus">False</property>
+                        <property name="ypad">6</property>
+                        <property name="label" translatable="yes">&lt;span foreground="white"&gt;&lt;big&gt;You can still have a moment for closing the documents or applications&lt;/big&gt;&lt;/span&gt;</property>
                         <property name="use_markup">True</property>
                       </object>
                       <packing>
+                        <property name="expand">True</property>
+                        <property name="fill">True</property>
                         <property name="position">1</property>
                       </packing>
                     </child>
                   </object>
                   <packing>
+                    <property name="expand">True</property>
+                    <property name="fill">True</property>
                     <property name="position">1</property>
                   </packing>
                 </child>
@@ -59,50 +76,150 @@
             </child>
           </object>
           <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
             <property name="position">0</property>
           </packing>
         </child>
         <child>
-          <object class="GtkAlignment" id="alignment2">
+          <object class="GtkAlignment" id="db_inventory">
+            <property name="can_focus">False</property>
+            <property name="xalign">0</property>
+            <property name="yalign">1</property>
+            <property name="xscale">0</property>
+            <property name="yscale">0</property>
+            <property name="left_padding">48</property>
+            <property name="right_padding">48</property>
+            <child>
+              <placeholder/>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">2</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkAlignment" id="alignment3">
             <property name="visible">True</property>
+            <property name="can_focus">False</property>
             <property name="xalign">1</property>
-            <property name="xscale">0</property>
             <property name="yscale">0</property>
-            <property name="top_padding">12</property>
-            <property name="bottom_padding">12</property>
-            <property name="right_padding">12</property>
+            <property name="top_padding">48</property>
+            <property name="bottom_padding">48</property>
             <child>
               <object class="GtkHBox" id="hbox2">
                 <property name="visible">True</property>
-                <property name="spacing">6</property>
+                <property name="can_focus">False</property>
                 <child>
-                  <object class="GtkButton" id="db_time_button">
-                    <property name="label" translatable="yes">5 minutes, please</property>
+                  <object class="GtkAlignment" id="alignment4">
                     <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="xalign">0</property>
+                    <child>
+                      <object class="GtkHBox" id="hbox4">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <child>
+                          <object class="GtkButton" id="db_buy_time_button">
+                            <property name="label" translatable="yes">Give me more time</property>
+                            <property name="width_request">200</property>
+                            <property name="visible">True</property>
+                            <property name="sensitive">False</property>
+                            <property name="can_focus">False</property>
+                            <property name="receives_default">False</property>
+                            <property name="use_action_appearance">False</property>
+                          </object>
+                          <packing>
+                            <property name="expand">True</property>
+                            <property name="fill">False</property>
+                            <property name="position">0</property>
+                          </packing>
+                        </child>
+                      </object>
+                    </child>
                   </object>
                   <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="padding">48</property>
                     <property name="position">0</property>
                   </packing>
                 </child>
                 <child>
-                  <object class="GtkButton" id="db_close_button">
-                    <property name="label" translatable="yes">close session</property>
+                  <object class="GtkAlignment" id="alignment5">
                     <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">True</property>
+                    <property name="can_focus">False</property>
+                    <child>
+                      <placeholder/>
+                    </child>
                   </object>
                   <packing>
+                    <property name="expand">True</property>
+                    <property name="fill">True</property>
                     <property name="position">1</property>
                   </packing>
                 </child>
+                <child>
+                  <object class="GtkAlignment" id="alignment6">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="xalign">1</property>
+                    <child>
+                      <object class="GtkHBox" id="hbox3">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="spacing">12</property>
+                        <child>
+                          <object class="GtkButton" id="db_time_button">
+                            <property name="label" translatable="yes">Five minutes, please</property>
+                            <property name="width_request">200</property>
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="is_focus">True</property>
+                            <property name="receives_default">False</property>
+                            <property name="use_action_appearance">False</property>
+                          </object>
+                          <packing>
+                            <property name="expand">True</property>
+                            <property name="fill">False</property>
+                            <property name="position">2</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkButton" id="db_close_button">
+                            <property name="label" translatable="yes">Close session now</property>
+                            <property name="width_request">200</property>
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="is_focus">True</property>
+                            <property name="receives_default">False</property>
+                            <property name="use_action_appearance">False</property>
+                          </object>
+                          <packing>
+                            <property name="expand">True</property>
+                            <property name="fill">False</property>
+                            <property name="position">3</property>
+                          </packing>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="padding">48</property>
+                    <property name="position">3</property>
+                  </packing>
+                </child>
               </object>
             </child>
           </object>
           <packing>
             <property name="expand">False</property>
-            <property name="position">1</property>
+            <property name="fill">True</property>
+            <property name="position">3</property>
           </packing>
         </child>
       </object>
diff --git a/client/gnome/admin/src/AdminConsole.py b/client/gnome/admin/src/AdminConsole.py
old mode 100644
new mode 100755
index 57b7dd0..07f5aac
--- a/client/gnome/admin/src/AdminConsole.py
+++ b/client/gnome/admin/src/AdminConsole.py
@@ -1,12 +1,14 @@
 #!/usr/bin/env python
 
 # Copyright (C) 2009,2010 Junta de Andalucia
+# Copyright (C) 2012 Guido Tabbernuk
 #
 # Authors:
 #   Roberto Majadas <roberto.majadas at openshine.com>
 #   Cesar Garcia Tapia <cesar.garcia.tapia at openshine.com>
 #   Luis de Bethencourt <luibg at openshine.com>
 #   Pablo Vieytes <pvieytes at openshine.com>
+#   Guido Tabbernuk <boamaod at gmail.com>
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -58,22 +60,36 @@ class AdminConsole(gobject.GObject):
                                     prefix = "nac")
 
         self.window.connect ('delete-event', self.__on_close_event)
+        self.close_button.connect ('clicked', self.__on_close_event)
         self.help_button.connect ('clicked', self.__on_help_button_clicked)
-        self.close_button.connect ('clicked', self.__on_close_button_clicked)
         self.apply_button.connect ('clicked', self.__on_apply_button_clicked)
         self.unlock_button.connect('clicked', self.__on_unlock_button_clicked)
 
         self.session_hoursday_checkbutton.connect ('toggled', self.__on_session_hoursday_checkbutton_toggled)
         self.session_hoursday_spinbutton.connect ('value-changed', self.__on_session_hoursday_spinbutton_changed)
+        self.session_force_logoff_checkbutton.connect ('toggled', self.__on_session_force_logoff_checkbutton_toggled)
+        self.session_grant_time_button.connect ('clicked', self.__on_session_grant_time_button_clicked)
+        self.session_extrahours_spinbutton.connect ('value-changed', self.__on_session_extrahours_spinbutton_changed)
+        self.session_configure_chores_button.connect ('clicked', self.__on_session_configure_chores_button_clicked)
+        self.session_use_chores_indicator = None
+        self.session_max_contracted_chores = None
+        
         self.browser_configure_proxy_button.connect ('clicked', self.__on_browser_configure_proxy_button_clicked)
-        self.browser_use_proxy_checkbutton.connect ('toggled', self.__on_browser_use_proxy_checkbutton_toggled)
         self.browser_hoursday_checkbutton.connect ('toggled', self.__on_browser_hoursday_checkbutton_toggled)
         self.browser_hoursday_spinbutton.connect ('value-changed', self.__on_browser_hoursday_spinbutton_changed)
+        self.browser_grant_time_button.connect ('clicked', self.__on_browser_grant_time_button_clicked)
+        self.browser_extrahours_spinbutton.connect ('value-changed', self.__on_browser_extrahours_spinbutton_changed)
+        self.browser_use_proxy_indicator = None
+
         self.mail_hoursday_checkbutton.connect ('toggled', self.__on_mail_hoursday_checkbutton_toggled)
         self.mail_hoursday_spinbutton.connect ('value-changed', self.__on_mail_hoursday_spinbutton_changed)
+        self.mail_grant_time_button.connect ('clicked', self.__on_mail_grant_time_button_clicked)
+        self.mail_extrahours_spinbutton.connect ('value-changed', self.__on_mail_extrahours_spinbutton_changed)
+
         self.im_hoursday_checkbutton.connect ('toggled', self.__on_im_hoursday_checkbutton_toggled)
         self.im_hoursday_spinbutton.connect ('value-changed', self.__on_im_hoursday_spinbutton_changed)
-
+        self.im_grant_time_button.connect ('clicked', self.__on_im_grant_time_button_clicked)
+        self.im_extrahours_spinbutton.connect ('value-changed', self.__on_im_extrahours_spinbutton_changed)
 
 
         self.session_schedule_widget = nanny.client.gnome.admin.ScheduleCalendar()
@@ -103,6 +119,12 @@ class AdminConsole(gobject.GObject):
         else:
             self.__on_users_treeview_selection_changed (None)
 
+        # for updating available time
+        gobject.timeout_add(1000, self.__session_timeout_cb)
+        gobject.timeout_add(1000, self.__browser_timeout_cb)
+        gobject.timeout_add(1000, self.__mail_timeout_cb)
+        gobject.timeout_add(1000, self.__im_timeout_cb)
+
         self.window.resize (800, 460)
         self.window.set_position (gtk.WIN_POS_CENTER)
         self.window.show_all ()
@@ -118,32 +140,47 @@ class AdminConsole(gobject.GObject):
 
         self.apply_button.set_sensitive(lock_status)
 
+        self.session_configure_chores_button.set_sensitive(lock_status)
         self.session_hoursday_checkbutton.set_sensitive(lock_status)
+        self.session_extrahours_entry.set_sensitive(lock_status)
         if lock_status == True:
             self.session_hoursday_spinbutton.set_sensitive(self.session_hoursday_checkbutton.get_active())
+            self.session_extrahours_spinbutton.set_sensitive(self.session_hoursday_checkbutton.get_active())
+            self.session_force_logoff_checkbutton.set_sensitive(self.session_hoursday_checkbutton.get_active())
         else:
             self.session_hoursday_spinbutton.set_sensitive(lock_status)
+            self.session_extrahours_spinbutton.set_sensitive(lock_status)
+            self.session_force_logoff_checkbutton.set_sensitive(lock_status)
 
         self.browser_configure_proxy_button.set_sensitive(lock_status)
-        self.browser_use_proxy_checkbutton.set_sensitive(lock_status)
         self.browser_hoursday_checkbutton.set_sensitive(lock_status)
+        self.browser_extrahours_entry.set_sensitive(lock_status)
         if lock_status == True:
             self.browser_hoursday_spinbutton.set_sensitive(self.browser_hoursday_checkbutton.get_active())
+            self.browser_extrahours_spinbutton.set_sensitive(self.browser_hoursday_checkbutton.get_active())
         else:
             self.browser_hoursday_spinbutton.set_sensitive(lock_status)
+            self.browser_extrahours_spinbutton.set_sensitive(lock_status)
 
         self.mail_hoursday_checkbutton.set_sensitive(lock_status)
         self.mail_hoursday_spinbutton.set_sensitive(lock_status)
+        self.mail_extrahours_entry.set_sensitive(lock_status)
         if lock_status == True:
             self.mail_hoursday_spinbutton.set_sensitive(self.mail_hoursday_checkbutton.get_active())
+            self.mail_extrahours_spinbutton.set_sensitive(self.mail_hoursday_checkbutton.get_active())
         else:
             self.mail_hoursday_spinbutton.set_sensitive(lock_status)
+            self.mail_extrahours_spinbutton.set_sensitive(lock_status)
 
         self.im_hoursday_checkbutton.set_sensitive(lock_status)
+        self.im_hoursday_spinbutton.set_sensitive(lock_status)
+        self.im_extrahours_entry.set_sensitive(lock_status)
         if lock_status == True:
             self.im_hoursday_spinbutton.set_sensitive(self.im_hoursday_checkbutton.get_active())
+            self.im_extrahours_spinbutton.set_sensitive(self.im_hoursday_checkbutton.get_active())
         else:
             self.im_hoursday_spinbutton.set_sensitive(lock_status)
+            self.im_extrahours_spinbutton.set_sensitive(lock_status)
 
         self.session_schedule_widget.set_sensitive(lock_status)
         self.browser_schedule_widget.set_sensitive(lock_status)
@@ -203,8 +240,8 @@ class AdminConsole(gobject.GObject):
                 pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(face_file, 50, 50)
             else:
                 if os.name == "posix" :
-                    icon_theme = gtk.IconTheme ()
-                    pixbuf = icon_theme.load_icon ('nobody', 50, gtk.ICON_LOOKUP_USE_BUILTIN)
+                    icon_theme = gtk.icon_theme_get_default()
+                    pixbuf = icon_theme.load_icon ('stock_person', 50, gtk.ICON_LOOKUP_USE_BUILTIN)
                 elif os.name == "nt" :
                     pixbuf = None
 
@@ -225,11 +262,15 @@ class AdminConsole(gobject.GObject):
             self.session_hoursday_checkbutton.set_active (False)
         if self.session_hoursday_checkbutton.get_active ():
             self.session_hoursday_spinbutton.set_sensitive (True)
-            print value
             self.session_hoursday_spinbutton.set_value (value/60.0)
+            self.session_force_logoff_checkbutton.set_sensitive (True)
+            self.session_force_logoff_checkbutton.set_active (self.dbus_client.is_forced_to_close (self.__selected_user_id, 0))
         else:
             self.session_hoursday_spinbutton.set_sensitive (False)
             self.session_hoursday_spinbutton.set_value (0)
+            self.session_force_logoff_checkbutton.set_active (False)
+            self.session_force_logoff_checkbutton.set_sensitive (False)
+        self.session_use_chores_indicator, self.session_max_contracted_chores = self.dbus_client.get_chore_settings (self.__selected_user_id)
 
         # BROWSER
         self.browser_schedule_widget.set_block_data (self.dbus_client.get_blocks (self.__selected_user_id, 1))
@@ -246,11 +287,9 @@ class AdminConsole(gobject.GObject):
             self.browser_hoursday_spinbutton.set_value (0)
 
         if self.__selected_user_id in self.dbus_client.list_WCF ():
-            self.browser_use_proxy_checkbutton.set_active (True)
-            self.browser_configure_proxy_button.set_sensitive (True)
+            self.browser_use_proxy_indicator = True
         else:
-            self.browser_use_proxy_checkbutton.set_active (False)
-            self.browser_configure_proxy_button.set_sensitive (False)
+            self.browser_use_proxy_indicator = False
 
         # MAIL
         self.mail_schedule_widget.set_block_data (self.dbus_client.get_blocks (self.__selected_user_id, 2))
@@ -283,32 +322,41 @@ class AdminConsole(gobject.GObject):
         self.__config_changed = False
 
     def __on_browser_configure_proxy_button_clicked (self, widget, data=None):
-        configure_proxy_dialog = nanny.client.gnome.admin.ConfigureProxyDialog(self.__selected_user_id)
+        configure_proxy_dialog = nanny.client.gnome.admin.ConfigureProxyDialog(self.__selected_user_id, self.browser_use_proxy_indicator)
         configure_proxy_dialog.set_transient_for(self.window)
-        configure_proxy_dialog.run()
+        ret = configure_proxy_dialog.run()
+        if ret != self.browser_use_proxy_indicator:
+            self.browser_use_proxy_indicator = ret
+            self.__config_changed = True
+            
         configure_proxy_dialog.destroy()
 
-    def __on_browser_use_proxy_checkbutton_toggled (self, widget, data=None):
-        if self.browser_use_proxy_checkbutton.get_active():
-            self.browser_configure_proxy_button.set_sensitive (True)
-        else:
-            self.browser_configure_proxy_button.set_sensitive (False)
-        self.__config_changed = True
+    def __on_session_configure_chores_button_clicked (self, widget, data=None):
+        configure_chores_dialog = nanny.client.gnome.admin.ConfigureChoresDialog(self.__selected_user_id, self.session_use_chores_indicator, self.session_max_contracted_chores)
+        configure_chores_dialog.set_transient_for(self.window)
+        ret = configure_chores_dialog.run()
+        if ret[0] != self.session_use_chores_indicator or ret[1] != self.session_max_contracted_chores:
+            self.session_use_chores_indicator = ret[0]
+            self.session_max_contracted_chores = ret[1]
+            self.__config_changed = True
+        configure_chores_dialog.destroy()
 
     def __on_apply_button_clicked (self, widget, data=None):
         # SESSION
         schedule_data = self.session_schedule_widget.get_block_data()
         self.dbus_client.set_blocks (self.__selected_user_id, 0, schedule_data)
+        self.dbus_client.set_chore_settings (self.__selected_user_id, self.session_use_chores_indicator, self.session_max_contracted_chores)
         if self.session_hoursday_checkbutton.get_active ():
             value = self.session_hoursday_spinbutton.get_value()
             self.dbus_client.set_max_use_time(self.__selected_user_id, 0, value*60.0)
+            self.dbus_client.set_forced_to_close (self.__selected_user_id, 0, self.session_force_logoff_checkbutton.get_active ())
         else:
             self.dbus_client.set_max_use_time(self.__selected_user_id, 0, 0)
 
         # BROWSER
         schedule_data = self.browser_schedule_widget.get_block_data()
         self.dbus_client.set_blocks (self.__selected_user_id, 1, schedule_data)
-        if self.browser_use_proxy_checkbutton.get_active ():
+        if self.browser_use_proxy_indicator:
             self.dbus_client.set_active_WCF (self.__selected_user_id, True)
         else:
             self.dbus_client.set_active_WCF (self.__selected_user_id, False)
@@ -336,8 +384,9 @@ class AdminConsole(gobject.GObject):
         else:
             self.dbus_client.set_max_use_time(self.__selected_user_id, 3, 0)
 
+        self.__config_changed = False
         dialog = gtk.MessageDialog(None, 0, gtk.MESSAGE_INFO, gtk.BUTTONS_CLOSE,
-                                   _("Your configuration has been saved") )
+                                   _("User's configuration has been saved") )
         dialog.set_property("icon-name", "nanny")
         dialog.set_transient_for(self.window)
         dialog.set_default_response(gtk.RESPONSE_CLOSE)
@@ -346,29 +395,9 @@ class AdminConsole(gobject.GObject):
 
 
     def __on_users_treeview_selection_changed (self, widget):
-        if self.__selected_user_id is not None:
-            if self.__config_changed:
-                dialog = gtk.MessageDialog(None, 0, gtk.MESSAGE_INFO, gtk.BUTTONS_YES_NO)
-                dialog.set_property("icon-name", "nanny")
-                dialog.set_markup ("<b>%s</b>" % _('You have made changes'))
-                dialog.format_secondary_markup (_("If you don't press the 'Apply' button, your changes will be lost.\nAre you sure?") )
-                dialog.set_default_response(gtk.RESPONSE_YES)
-                ret = dialog.run()
-                if ret == gtk.RESPONSE_NO:
-                    dialog.destroy()
-
-                    selection = self.users_treeview.get_selection()
-                    selection.disconnect (self.users_selection_change_cb_id)
-                    model = self.users_treeview.get_model ()
-                    for row in model:
-                        if row[0] == self.__selected_user_id:
-                            selection.select_iter (row.iter)
-                            break
-                    self.users_selection_change_cb_id = selection.connect ('changed', self.__on_users_treeview_selection_changed)
-                    return
-
-                dialog.destroy()
-
+        if not self.ignore_changes_made():
+            return
+        
         selection = self.users_treeview.get_selection()
 
         selected_rows =  selection.count_selected_rows()
@@ -379,7 +408,10 @@ class AdminConsole(gobject.GObject):
         if selected_rows > 0:
             model, itera = selection.get_selected ()
             self.__selected_user_id = model.get_value (itera, 0)
-            self.__load_config ()
+
+            if self.dbus_client.is_unlocked():    
+                self.__load_config ()
+            
             self.window.set_title (_('Nanny Admin Console - %s') % self.users_treeview.get_model().get_value (itera, 2))
         else:
             self.__selected_user_id = None
@@ -393,17 +425,49 @@ class AdminConsole(gobject.GObject):
         self.__config_changed = True
         if self.session_hoursday_checkbutton.get_active():
             self.session_hoursday_spinbutton.set_sensitive (True)
+            self.session_extrahours_spinbutton.set_sensitive (True)
+            self.session_extrahours_entry.set_sensitive (True)
+            self.session_force_logoff_checkbutton.set_sensitive(True)
         else:
             self.session_hoursday_spinbutton.set_sensitive (False)
+            self.session_grant_time_button.set_sensitive (False)
+            self.session_extrahours_spinbutton.set_sensitive (False)
+            self.session_extrahours_entry.set_sensitive (False)
+            self.session_force_logoff_checkbutton.set_sensitive(False)
+    def __on_session_force_logoff_checkbutton_toggled (self, widget, data=None):
+        self.__config_changed = True
 
+    def __on_session_extrahours_spinbutton_changed (self, widget, data=None):
+        if self.session_extrahours_spinbutton.get_value() != 0:
+            self.session_grant_time_button.set_sensitive (True)
+        else:
+            self.session_grant_time_button.set_sensitive (False)
+    def __on_session_grant_time_button_clicked (self, widget, data=None):
+        value = self.session_extrahours_spinbutton.get_value()
+        self.dbus_client.add_use_time(self.__selected_user_id, 0, value*60.0)
+        
     def __on_browser_hoursday_spinbutton_changed (self, widget, data=None):
         self.__config_changed = True
     def __on_browser_hoursday_checkbutton_toggled (self, widget, data=None):
         self.__config_changed = True
         if self.browser_hoursday_checkbutton.get_active():
             self.browser_hoursday_spinbutton.set_sensitive (True)
+            self.browser_extrahours_spinbutton.set_sensitive (True)
+            self.browser_extrahours_entry.set_sensitive (True)
         else:
             self.browser_hoursday_spinbutton.set_sensitive (False)
+            self.browser_grant_time_button.set_sensitive (False)
+            self.browser_extrahours_spinbutton.set_sensitive (False)
+            self.browser_extrahours_entry.set_sensitive (False)
+
+    def __on_browser_extrahours_spinbutton_changed (self, widget, data=None):
+        if self.browser_extrahours_spinbutton.get_value() != 0:
+            self.browser_grant_time_button.set_sensitive (True)
+        else:
+            self.browser_grant_time_button.set_sensitive (False)
+    def __on_browser_grant_time_button_clicked (self, widget, data=None):
+        value = self.browser_extrahours_spinbutton.get_value()
+        self.dbus_client.add_use_time(self.__selected_user_id, 1, value*60.0)
 
     def __on_mail_hoursday_spinbutton_changed (self, widget, data=None):
         self.__config_changed = True
@@ -411,8 +475,22 @@ class AdminConsole(gobject.GObject):
         self.__config_changed = True
         if self.mail_hoursday_checkbutton.get_active():
             self.mail_hoursday_spinbutton.set_sensitive (True)
+            self.mail_extrahours_spinbutton.set_sensitive (True)
+            self.mail_extrahours_entry.set_sensitive (True)
         else:
             self.mail_hoursday_spinbutton.set_sensitive (False)
+            self.mail_grant_time_button.set_sensitive (False)
+            self.mail_extrahours_spinbutton.set_sensitive (False)
+            self.mail_extrahours_entry.set_sensitive (False)
+
+    def __on_mail_extrahours_spinbutton_changed (self, widget, data=None):
+        if self.mail_extrahours_spinbutton.get_value() != 0:
+            self.mail_grant_time_button.set_sensitive (True)
+        else:
+            self.mail_grant_time_button.set_sensitive (False)
+    def __on_mail_grant_time_button_clicked (self, widget, data=None):
+        value = self.mail_extrahours_spinbutton.get_value()
+        self.dbus_client.add_use_time(self.__selected_user_id, 2, value*60.0)
 
     def __on_im_hoursday_spinbutton_changed (self, widget, data=None):
         self.__config_changed = True
@@ -420,8 +498,22 @@ class AdminConsole(gobject.GObject):
         self.__config_changed = True
         if self.im_hoursday_checkbutton.get_active():
             self.im_hoursday_spinbutton.set_sensitive (True)
+            self.im_extrahours_spinbutton.set_sensitive (True)
+            self.im_extrahours_entry.set_sensitive (True)
         else:
             self.im_hoursday_spinbutton.set_sensitive (False)
+            self.im_grant_time_button.set_sensitive (False)
+            self.im_extrahours_spinbutton.set_sensitive (False)
+            self.im_extrahours_entry.set_sensitive (False)
+
+    def __on_im_extrahours_spinbutton_changed (self, widget, data=None):
+        if self.im_extrahours_spinbutton.get_value() != 0:
+            self.im_grant_time_button.set_sensitive (True)
+        else:
+            self.im_grant_time_button.set_sensitive (False)
+    def __on_im_grant_time_button_clicked (self, widget, data=None):
+        value = self.im_extrahours_spinbutton.get_value()
+        self.dbus_client.add_use_time(self.__selected_user_id, 3, value*60.0)
 
     def __on_help_button_clicked (self, widget, data=None):
         if os.name == "posix":
@@ -436,10 +528,78 @@ class AdminConsole(gobject.GObject):
 
     def __on_unlock_button_clicked (self, widget, data=None):
         self.dbus_client.unlock()
+        self.__on_users_treeview_selection_changed(None)
         self.__lock_widgets()
 
-    def __on_close_button_clicked (self, widget, data=None):
-        gtk.main_quit()
-
     def __on_close_event (self, widget, data=None):
+        if not self.ignore_changes_made():
+            return True
         gtk.main_quit()
+
+    def __session_timeout_cb(self):
+        if self.__selected_user_id is not None:
+            if self.dbus_client.is_unlocked():
+                value = self.dbus_client.get_use_time (self.__selected_user_id, 0)
+                if value >= 0:
+                    self.session_extrahours_entry.set_text("{0:.1f}".format(value/60.0))
+                else:
+                    self.session_extrahours_entry.set_text("{0:.1f}".format(0))
+            gobject.timeout_add(1000, self.__session_timeout_cb)
+
+    def __browser_timeout_cb(self):
+        if self.__selected_user_id is not None:
+            if self.dbus_client.is_unlocked():
+                value = self.dbus_client.get_use_time (self.__selected_user_id, 1)
+                if value >= 0:
+                    self.browser_extrahours_entry.set_text("{0:.1f}".format(value/60.0))
+                else:
+                    self.browser_extrahours_entry.set_text("{0:.1f}".format(0))
+            gobject.timeout_add(1000, self.__browser_timeout_cb)
+
+    def __mail_timeout_cb(self):
+        if self.__selected_user_id is not None:
+            if self.dbus_client.is_unlocked():
+                value = self.dbus_client.get_use_time (self.__selected_user_id, 2)
+                if value >= 0:
+                    self.mail_extrahours_entry.set_text("{0:.1f}".format(value/60.0))
+                else:
+                    self.mail_extrahours_entry.set_text("{0:.1f}".format(0))
+            gobject.timeout_add(1000, self.__mail_timeout_cb)
+
+    def __im_timeout_cb(self):
+        if self.__selected_user_id is not None:
+            if self.dbus_client.is_unlocked():
+                value = self.dbus_client.get_use_time (self.__selected_user_id, 3)
+                if value >= 0:
+                    self.im_extrahours_entry.set_text("{0:.1f}".format(value/60.0))
+                else:
+                    self.im_extrahours_entry.set_text("{0:.1f}".format(0))
+            gobject.timeout_add(1000, self.__im_timeout_cb)
+                
+    def ignore_changes_made (self):
+        """Asks confirmation if user doesn't want to save changes. No changes made is equal to ignoring changes."""
+        if self.__config_changed:
+            dialog = gtk.MessageDialog(None, 0, gtk.MESSAGE_INFO, gtk.BUTTONS_YES_NO)
+            dialog.set_property("icon-name", "nanny")
+            dialog.set_markup ("<b>%s</b>" % _('You have made changes'))
+            dialog.format_secondary_markup (_("If you don't press the 'Apply' button, your changes will be lost.\nAre you sure?") )
+            dialog.set_default_response(gtk.RESPONSE_YES)
+            ret = dialog.run()
+            if ret == gtk.RESPONSE_NO:
+                dialog.destroy()
+
+                selection = self.users_treeview.get_selection()
+                selection.disconnect (self.users_selection_change_cb_id)
+                model = self.users_treeview.get_model ()
+                for row in model:
+                    if row[0] == self.__selected_user_id:
+                        selection.select_iter (row.iter)
+                        break
+                self.users_selection_change_cb_id = selection.connect ('changed', self.__on_users_treeview_selection_changed)
+                return False
+            else:
+                dialog.destroy()
+                return True
+            
+        return True
+        
diff --git a/client/gnome/admin/src/BlacklistManager.py b/client/gnome/admin/src/BlacklistManager.py
old mode 100644
new mode 100755
index 63411e9..fd8159b
--- a/client/gnome/admin/src/BlacklistManager.py
+++ b/client/gnome/admin/src/BlacklistManager.py
@@ -2,12 +2,14 @@
 # -*- coding: utf-8 -*-
 
 # Copyright (C) 2009 Junta de Andalucia
+# Copyright (C) 2012 Guido Tabbernuk
 # 
 # Authors:
 #   Roberto Majadas <roberto.majadas at openshine.com>
 #   Cesar Garcia Tapia <cesar.garcia.tapia at openshine.com>
 #   Luis de Bethencourt <luibg at openshine.com>
 #   Pablo Vieytes <pvieytes at openshine.com>
+#   Guido Tabbernuk <boamaod at gmail.com>
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -124,13 +126,13 @@ class BlacklistManager:
         def responseToDialog(entry, dialog, response):
             dialog.response(response)
 
-	dialog.set_markup('Introduce the nannycentral repository url')
+	dialog.set_markup('Enter blacklist repository URL')
 	entry = gtk.Entry()
 	entry.connect("activate", responseToDialog, dialog, gtk.RESPONSE_OK)
 	hbox = gtk.HBox()
 	hbox.pack_start(gtk.Label("Url:"), False, 5, 5)
 	hbox.pack_end(entry)
-	dialog.format_secondary_markup("It's something like http://www.nannycentral.info/blacklist/blacklist.json ...")
+	dialog.format_secondary_markup("It's something like http://static.nannycentral.org/v/nannycentral/blacklists/blacklist.json";)
 	dialog.vbox.pack_end(hbox, True, True, 0)
 	dialog.show_all()
 	dialog.run()
diff --git a/client/gnome/admin/src/ConfigureChoresDialog.py b/client/gnome/admin/src/ConfigureChoresDialog.py
new file mode 100755
index 0000000..285a389
--- /dev/null
+++ b/client/gnome/admin/src/ConfigureChoresDialog.py
@@ -0,0 +1,531 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (C) 2009,2010 Junta de Andalucia
+# Copyright (C) 2012 Guido Tabbernuk
+# 
+# Authors:
+#   Roberto Majadas <roberto.majadas at openshine.com>
+#   Cesar Garcia Tapia <cesar.garcia.tapia at openshine.com>
+#   Luis de Bethencourt <luibg at openshine.com>
+#   Pablo Vieytes <pvieytes at openshine.com>
+#   Guido Tabbernuk <boamaod at gmail.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301
+# USA
+
+import os
+
+import gtk
+import pango
+import gobject
+
+import datetime
+import time
+
+import nanny
+
+class ConfigureChoresDialog (gtk.Dialog):
+    def __init__ (self, selected_user_id, chores_enabled, max_chores_to_contract):
+        gtk.Dialog.__init__ (self, title=_("Chores & Rewards Configuration"), buttons=(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE))
+
+        self.chores_enabled = chores_enabled
+        self.max_chores_to_contract = max_chores_to_contract
+
+        nanny.client.common.Utils.ui_magic (self,
+                ui_file = os.path.join (nanny.client.gnome.admin.ui_files_dir, "nac_chores_dialog.ui"),
+                prefix = "chd")
+
+        self.set_property("icon-name", "nanny")
+        self.dbus_client = nanny.client.common.DBusClient ()
+        self.__selected_user_id = selected_user_id
+
+        self.main_vbox.unparent()
+        self.get_content_area().add (self.main_vbox)
+
+        self.session_use_chores_checkbutton.set_active(self.chores_enabled)
+        self.session_use_chores_checkbutton.connect('toggled', self.__on_session_use_chores_checkbutton_toggled)
+        
+        self.session_max_chores_to_contract_spinbutton.set_value(self.max_chores_to_contract)
+        self.session_max_chores_to_contract_spinbutton.connect('value-changed', self.__on_session_max_chores_to_contract_spinbutton_changed)
+
+        self.finished_chores_remove_button.connect ('clicked', self.__on_finished_chores_remove_button_clicked)
+        self.chore_progress_cancel_button.connect ('clicked', self.__on_chore_progress_cancel_button_clicked)
+        self.chore_progress_done_button.connect ('clicked', self.__on_chore_progress_done_button_clicked)
+
+        self.add_lst_button.connect("clicked", self.__on_add_lst_button_cb)
+        self.del_lst_button.connect("clicked", self.__on_del_lst_button_cb)
+        self.edit_lst_button.connect("clicked", self.__on_edit_lst_button_cb)
+
+        self.assign_button.connect("clicked", self.__on_assign_button_cb)
+        
+        self.__init_chore_assign_treeview (self.chore_assign_treeview)
+        self.__init_enabled_chores_treeview (self.enabled_chores_treeview)
+        self.__init_chore_progress_treeview (self.chore_progress_treeview)
+        self.__init_finished_chores_treeview (self.finished_chores_treeview)
+        self.__fill_treeviews ()
+
+        selection = self.chore_assign_treeview.get_selection()
+        selection.connect ('changed', self.__on_chore_assign_selection_changed)
+        self.chore_assign_treeview.connect ('focus-in-event', self.__on_chore_assign_focus_received)
+        self.__on_chore_assign_selection_changed (selection)
+
+        selection = self.enabled_chores_treeview.get_selection()
+        selection.connect ('changed', self.__on_enabled_chores_selection_changed)
+        self.enabled_chores_treeview.connect ('focus-in-event', self.__on_enabled_chores_focus_received)
+        self.__on_enabled_chores_selection_changed (selection)
+
+        selection = self.chore_progress_treeview.get_selection()
+        selection.connect ('changed', self.__on_chore_progress_selection_changed)
+        self.__on_chore_progress_selection_changed (selection)
+
+        selection = self.finished_chores_treeview.get_selection()
+        selection.connect ('changed', self.__on_finished_chores_selection_changed)
+        self.__on_finished_chores_selection_changed (selection)
+
+        self.fw_image = gtk.Image()
+        self.bw_image = gtk.Image()
+        self.fw_image.set_from_stock (gtk.STOCK_GO_FORWARD, gtk.ICON_SIZE_BUTTON)
+        self.bw_image.set_from_stock (gtk.STOCK_GO_BACK, gtk.ICON_SIZE_BUTTON)
+
+        self.resize (700, 460)
+
+        self.show_all ()
+
+    def run(self):
+        super(ConfigureChoresDialog, self).run()
+        
+        return [self.chores_enabled, self.max_chores_to_contract]
+
+    def __init_chore_assign_treeview (self, treeview):
+        base_id = 0
+        for field in ["id", "title", "description", "reward"]:
+            col = gtk.TreeViewColumn(field)
+            treeview.append_column(col)
+            cell = gtk.CellRendererText()
+            cell.set_property("ellipsize", pango.ELLIPSIZE_END)
+            col.pack_start(cell, True)
+            col.add_attribute(cell, 'text', base_id)
+            if field in ("id", "description"):
+                col.set_visible (False)
+            else:
+                col.set_visible (True)
+            if field == "title":
+                col.set_expand(True)
+                col.set_resizable(True)
+                col.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE)
+            if field == "description":
+                col.set_expand(True)
+                col.set_resizable(True)
+                col.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE)
+            if field == "reward":
+                col.set_alignment(1.0)
+                col.set_min_width(50)
+                col.set_resizable(True)
+                cell.set_property("alignment", pango.ALIGN_RIGHT)
+                col.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE)
+            base_id = base_id + 1
+
+        store = gtk.ListStore (gobject.TYPE_INT,
+                               gobject.TYPE_STRING,
+                               gobject.TYPE_STRING,
+                               gobject.TYPE_STRING)
+
+        treeview.set_model (store)
+
+    def __init_enabled_chores_treeview (self, treeview):
+        base_id = 0
+        for field in ["id", "title", "description"]:
+            col = gtk.TreeViewColumn(field)
+            treeview.append_column(col)
+            cell = gtk.CellRendererText()
+            cell.set_property("ellipsize", pango.ELLIPSIZE_END)
+            col.pack_start(cell, True)
+            col.add_attribute(cell, 'text', base_id)
+            if field in ("id", "description"):
+                col.set_visible (False)
+            else:
+                col.set_visible (True)
+            if field == "title":
+                col.set_expand(True)
+                col.set_resizable(True)
+                col.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE)
+            base_id = base_id + 1
+
+        store = gtk.ListStore (gobject.TYPE_INT,
+                               gobject.TYPE_STRING,
+                               gobject.TYPE_STRING)
+
+        treeview.set_model (store)
+
+    def __init_chore_progress_treeview (self, treeview):
+        base_id = 0
+        for field in ["id", "title", "description", "contracted"]:
+            col = gtk.TreeViewColumn(field)
+            treeview.append_column(col)
+            cell = gtk.CellRendererText()
+            cell.set_property("ellipsize", pango.ELLIPSIZE_END)
+            col.pack_start(cell, True)
+            col.add_attribute(cell, 'text', base_id)
+            if field in ("id", "description"):
+                col.set_visible (False)
+            else:
+                col.set_visible (True)
+            if field == "title":
+                col.set_expand(True)
+                col.set_resizable(True)
+                col.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE)
+            if field == "description":
+                col.set_expand(True)
+                col.set_resizable(True)
+                col.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE)
+            if field == "contracted":
+                col.set_alignment(1.0)
+                col.set_min_width(100)
+                col.set_resizable(True)
+                cell.set_property("alignment", pango.ALIGN_RIGHT)
+                col.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE)
+            base_id = base_id + 1
+
+        store = gtk.ListStore (gobject.TYPE_INT,
+                               gobject.TYPE_STRING,
+                               gobject.TYPE_STRING,
+                               gobject.TYPE_STRING)
+
+        treeview.set_model (store)
+        
+    def __init_finished_chores_treeview (self, treeview):
+        base_id = 0
+        for field in ["id", "title", "description", "contracted", "finished"]:
+            col = gtk.TreeViewColumn(field)
+            treeview.append_column(col)
+            cell = gtk.CellRendererText()
+            cell.set_property("ellipsize", pango.ELLIPSIZE_END)
+            col.pack_start(cell, True)
+            col.add_attribute(cell, 'text', base_id)
+            if field in ("id", "description"):
+                col.set_visible (False)
+            else:
+                col.set_visible (True)
+            if field == "title":
+                col.set_expand(True)
+                col.set_resizable(True)
+                col.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE)
+            if field == "description":
+                col.set_expand(True)
+                col.set_resizable(True)
+                col.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE)
+            if field in ("contracted", "finished"):
+                col.set_alignment(1.0)
+                col.set_min_width(100)
+                col.set_resizable(True)
+                cell.set_property("alignment", pango.ALIGN_RIGHT)
+                col.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE)
+            base_id = base_id + 1
+
+        store = gtk.ListStore (gobject.TYPE_INT,
+                               gobject.TYPE_STRING,
+                               gobject.TYPE_STRING,
+                               gobject.TYPE_STRING,
+                               gobject.TYPE_STRING)
+
+        treeview.set_model (store)
+        
+
+    def tooltip_callback(self, widget, x, y, keyboard_mode, tooltip, tooltip_column):
+        if widget.get_path_at_pos(x,y) is None:
+            return False
+        m = widget.get_model()
+        i = m.get_iter_from_string(str(widget.get_path_at_pos(x,y)[0][0]))
+        v = m.get_value(i, tooltip_column)
+        if len(v) > 0:
+            tooltip.set_text(v)
+            return True
+        else:
+            return False
+
+    def __fill_treeviews (self, skip_assign_tree=False):
+        if not skip_assign_tree:
+            chore_assign_model = self.chore_assign_treeview.get_model()
+            chore_assign_model.clear()
+            self.chore_assign_treeview.set_property("has-tooltip", True)
+            self.chore_assign_treeview.connect("query-tooltip", self.tooltip_callback, 2)
+
+            chore_descriptions = self.dbus_client.list_chore_descriptions ()
+            for desc_id, title, description, reward in chore_descriptions:
+                row_path = chore_assign_model.append ((desc_id, title, description, "{0:.1f}".format(int(reward)/60.0)))
+
+        enabled_chores_model = self.enabled_chores_treeview.get_model()
+        enabled_chores_model.clear()
+        self.enabled_chores_treeview.set_property("has-tooltip", True)
+        self.enabled_chores_treeview.connect("query-tooltip", self.tooltip_callback, 2)
+
+        chores = self.dbus_client.list_chores (self.__selected_user_id, available=True)
+        for assign_id, chore_id, uid, reward, contracted, finished, title, description in chores:
+            row_path = enabled_chores_model.append ((assign_id, title, description))
+
+        chore_progress_model = self.chore_progress_treeview.get_model()
+        chore_progress_model.clear()
+        self.chore_progress_treeview.set_property("has-tooltip", True)
+        self.chore_progress_treeview.connect("query-tooltip", self.tooltip_callback, 2)
+
+        chores = self.dbus_client.list_chores (self.__selected_user_id, contracted=True)
+        for assign_id, chore_id, uid, reward, contracted, finished, title, description in chores:
+            row_path = chore_progress_model.append ((assign_id, title, description, datetime.datetime.fromtimestamp(int(contracted)).strftime("%x")))
+
+        finished_chores_model = self.finished_chores_treeview.get_model()
+        finished_chores_model.clear()
+        self.finished_chores_treeview.set_property("has-tooltip", True)
+        self.finished_chores_treeview.connect("query-tooltip", self.tooltip_callback, 2)
+
+        chores = self.dbus_client.list_chores (self.__selected_user_id, finished=True)
+        for assign_id, chore_id, uid, reward, contracted, finished, title, description in chores:
+            row_path = finished_chores_model.append ((assign_id, title, description, datetime.datetime.fromtimestamp(int(contracted)).strftime("%x"), datetime.datetime.fromtimestamp(int(contracted)).strftime("%x")))
+
+    def __on_chore_progress_done_button_clicked (self, widget, data=None):
+        try:
+            selection = self.chore_progress_treeview.get_selection()
+            model, iter = selection.get_selected()
+            desc_id = model.get_value(iter, 0)
+        except:
+            return
+            
+        self.dbus_client.finish_chore (desc_id, int(time.time()))
+            
+        self.__fill_treeviews ()
+
+    def __on_finished_chores_remove_button_clicked (self, widget, data=None):
+        try:
+            selection = self.finished_chores_treeview.get_selection()
+            model, iter = selection.get_selected()
+            desc_id = model.get_value(iter, 0)
+        except:
+            return
+            
+        self.dbus_client.remove_chore (desc_id, self.__on_remove_reply, self.__on_remove_error)
+            
+        self.__fill_treeviews ()
+        
+
+    def __on_chore_progress_cancel_button_clicked (self, widget, data=None):
+        try:
+            selection = self.chore_progress_treeview.get_selection()
+            model, iter = selection.get_selected()
+            desc_id = model.get_value(iter, 0)
+        except:
+            return
+            
+        self.dbus_client.remove_chore (desc_id, self.__on_remove_reply, self.__on_remove_error)
+            
+        self.__fill_treeviews ()
+        
+
+    def __on_chore_assign_selection_changed (self, selection, data=None):
+        if selection.count_selected_rows () > 0:
+            self.edit_lst_button.set_sensitive (True)
+            self.del_lst_button.set_sensitive (True)
+            self.assign_button.set_sensitive (True)
+        else:
+            self.edit_lst_button.set_sensitive (False)
+            self.del_lst_button.set_sensitive (False)
+
+    def __on_enabled_chores_selection_changed (self, selection, data=None):
+        if selection.count_selected_rows () > 0:
+            self.edit_lst_button.set_sensitive (False)
+            self.del_lst_button.set_sensitive (False)
+            self.assign_button.set_sensitive (True)
+        else:
+            self.edit_lst_button.set_sensitive (False)
+            self.del_lst_button.set_sensitive (False)
+        
+    def __on_chore_assign_focus_received (self, widget, direction, data=None):
+            self.assign_button.set_sensitive (True)
+            self.assign_button.set_image(self.fw_image)
+    
+    def __on_enabled_chores_focus_received (self, widget, direction, data=None):
+            self.assign_button.set_sensitive (True)
+            self.assign_button.set_image(self.bw_image)
+
+    def __on_chore_progress_selection_changed (self, selection, data=None):
+        if selection.count_selected_rows () > 0:
+            self.chore_progress_cancel_button.set_sensitive (True)
+            self.chore_progress_done_button.set_sensitive (True)
+        else:
+            self.chore_progress_cancel_button.set_sensitive (False)
+            self.chore_progress_done_button.set_sensitive (False)
+        
+
+    def __on_finished_chores_selection_changed (self, selection, data=None):
+        if selection.count_selected_rows () > 0:
+            self.finished_chores_remove_button.set_sensitive (True)
+        else:
+            self.finished_chores_remove_button.set_sensitive (False)
+        
+    def __on_entry_dialog_essential_values_changed(self, widget, ok_button, title_entry, reward_spinbutton):
+        title = title_entry.get_text().strip()
+        reward = reward_spinbutton.get_value()
+        
+        if title == "": # or reward == 0.0:
+            ok_button.set_sensitive (False)
+        else:
+            ok_button.set_sensitive (True)
+
+    def __on_add_lst_button_cb(self, widget):
+        xml = self.__load_dialog ()
+        self.chore_edit_dialog = xml.get_object ('chd_edit_dialog')
+        self.chore_edit_dialog.set_title(_("Add chore description"))
+        self.chore_edit_dialog.set_transient_for(self)
+        
+        information_label = xml.get_object ("chd_information_label")
+        ok_button = xml.get_object ('chd_ok_button')
+        title_entry = xml.get_object ('chd_title_entry')
+        description_entry = xml.get_object ('chd_description_entry')
+        reward_spinbutton = xml.get_object ('chd_reward_spinbutton')
+
+        title_entry.connect ('changed', self.__on_entry_dialog_essential_values_changed, ok_button, title_entry, reward_spinbutton)
+        reward_spinbutton.connect ('value-changed', self.__on_entry_dialog_essential_values_changed, ok_button, title_entry, reward_spinbutton)
+
+        ret = self.chore_edit_dialog.run()
+        if ret == 2:
+            title = title_entry.get_text().strip()
+            description = description_entry.get_text().strip()
+            reward = reward_spinbutton.get_value()
+            self.dbus_client.add_chore_description (title, description, int(reward*60.0))
+            self.__fill_treeviews ()
+            
+        self.chore_edit_dialog.destroy()
+                
+    def __on_edit_lst_button_cb(self, widget):
+        try:
+            selection = self.chore_assign_treeview.get_selection()
+            model, iter = selection.get_selected()
+            desc_id = model.get_value(iter, 0)
+        except:
+            return
+
+        xml = self.__load_dialog ()
+        self.chore_edit_dialog = xml.get_object ('chd_edit_dialog')
+        self.chore_edit_dialog.set_title(_("Edit chore description"))
+        self.chore_edit_dialog.set_transient_for(self)
+        
+        information_label = xml.get_object ("chd_information_label")
+        ok_button = xml.get_object ('chd_ok_button')
+        title_entry = xml.get_object ('chd_title_entry')
+        description_entry = xml.get_object ('chd_description_entry')
+        reward_spinbutton = xml.get_object ('chd_reward_spinbutton')
+
+        chore_descriptions = self.dbus_client.list_chore_descriptions (int(desc_id))
+        for desc_id, title, description, reward in chore_descriptions:
+            title_entry.set_text(title)
+            description = description_entry.set_text(description)
+            reward = reward_spinbutton.set_value(reward/60.0)
+            break
+
+        title_entry.connect ('changed', self.__on_entry_dialog_essential_values_changed, ok_button, title_entry, reward_spinbutton)
+        reward_spinbutton.connect ('value-changed', self.__on_entry_dialog_essential_values_changed, ok_button, title_entry, reward_spinbutton)
+
+        ret = self.chore_edit_dialog.run()
+        if ret == 2:
+            title = title_entry.get_text().strip()
+            description = description_entry.get_text().strip()
+            reward = reward_spinbutton.get_value()
+            self.dbus_client.update_chore_description (int(desc_id), title, description, int(reward*60.0))
+            self.__fill_treeviews ()
+            
+        self.chore_edit_dialog.destroy()
+        
+    def __on_del_lst_button_cb(self, widget):
+        try:
+            selection = self.chore_assign_treeview.get_selection()
+            model, iter = selection.get_selected()
+            desc_id = model.get_value(iter, 0)
+        except:
+            return
+
+        d = gtk.MessageDialog(None, gtk.DIALOG_MODAL, type=gtk.MESSAGE_QUESTION, buttons=gtk.BUTTONS_OK_CANCEL)
+        d.set_property("icon-name", "nanny")
+        d.set_markup(_("<b>Are you sure you want to delete this chore description entry?</b>"))
+        d.format_secondary_markup(_("This action will remove all the user chores linked to the description."))
+        response = d.run()
+        if response == gtk.RESPONSE_OK:
+            self.dbus_client.remove_chore_description (desc_id, self.__on_remove_reply, self.__on_remove_error)
+
+        d.destroy()
+
+    def __on_assign_button_cb(self, widget):
+        desc_id = None
+        
+        if self.enabled_chores_treeview.has_focus():
+            try:
+                selection = self.enabled_chores_treeview.get_selection()
+                model, iter = selection.get_selected()
+                desc_id = model.get_value(iter, 0)
+                
+                self.dbus_client.remove_chore (desc_id, self.__on_remove_reply, self.__on_remove_error)
+
+            except:
+                return
+            
+            
+        elif self.chore_assign_treeview.has_focus():
+            try:
+                selection = self.chore_assign_treeview.get_selection()
+                model, iter = selection.get_selected()
+                desc_id = model.get_value(iter, 0)
+                
+                self.dbus_client.add_chore (desc_id, self.__selected_user_id)
+
+                self.__fill_treeviews (skip_assign_tree=True)
+                self.chore_assign_treeview.grab_focus()
+            except:
+                return
+
+
+
+    def __on_session_use_chores_checkbutton_toggled (self, widget, data=None):
+        self.chores_enabled = self.session_use_chores_checkbutton.get_active()
+
+    def __on_session_max_chores_to_contract_spinbutton_changed (self, widget, data=None):
+        self.max_chores_to_contract = self.session_max_chores_to_contract_spinbutton.get_value()
+    
+    def __load_dialog (self):
+        ui_file = os.path.join (nanny.client.gnome.admin.ui_files_dir, "nac_chores_edit_dialog.ui")
+        xml = gtk.Builder ()
+        xml.add_from_file (ui_file)
+
+        return xml
+        
+    def __on_remove_reply (self, value):
+
+        if value:
+            self.__fill_treeviews ()
+        else:
+            dlg = gtk.MessageDialog(type=gtk.MESSAGE_ERROR, buttons=gtk.BUTTONS_OK)
+            dlg.set_property("icon-name", "nanny")
+            dlg.set_markup("<b>%s</b>" % _("Error while deleting the chore entry"))
+            dlg.format_secondary_markup(_("Some error has occured while deleting the chore entry.\nPlease try again."))
+            dlg.run()
+            dlg.destroy()
+
+    def __on_remove_error (self, exception):
+
+        dlg = gtk.MessageDialog(type=gtk.MESSAGE_ERROR, buttons=gtk.BUTTONS_OK)
+        dlg.set_property("icon-name", "nanny")
+        dlg.set_markup("<b>%s</b>" % _("Error while deleting the chore entry"))
+        dlg.format_secondary_markup(_("Some error has occured while deleting the chore entry.\nPlease try again."))
+        dlg.run()
+        dlg.destroy()
+
+
diff --git a/client/gnome/admin/src/ConfigureProxyDialog.py b/client/gnome/admin/src/ConfigureProxyDialog.py
old mode 100644
new mode 100755
index 8665482..37f81db
--- a/client/gnome/admin/src/ConfigureProxyDialog.py
+++ b/client/gnome/admin/src/ConfigureProxyDialog.py
@@ -2,12 +2,14 @@
 # -*- coding: utf-8 -*-
 
 # Copyright (C) 2009,2010 Junta de Andalucia
+# Copyright (C) 2012 Guido Tabbernuk
 # 
 # Authors:
 #   Roberto Majadas <roberto.majadas at openshine.com>
 #   Cesar Garcia Tapia <cesar.garcia.tapia at openshine.com>
 #   Luis de Bethencourt <luibg at openshine.com>
 #   Pablo Vieytes <pvieytes at openshine.com>
+#   Guido Tabbernuk <boamaod at gmail.com>
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -33,9 +35,11 @@ import gobject
 import nanny
 
 class ConfigureProxyDialog (gtk.Dialog):
-    def __init__ (self, selected_user_id):
+    def __init__ (self, selected_user_id, proxies_enabled):
         gtk.Dialog.__init__ (self, title=_("Web Content Filter Configuration"), buttons=(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE))
 
+        self.proxies_enabled = proxies_enabled
+
         nanny.client.common.Utils.ui_magic (self,
                 ui_file = os.path.join (nanny.client.gnome.admin.ui_files_dir, "nac_wcf_dialog.ui"),
                 prefix = "wcfd")
@@ -44,8 +48,11 @@ class ConfigureProxyDialog (gtk.Dialog):
         self.dbus_client = nanny.client.common.DBusClient ()
         self.__selected_user_id = selected_user_id
 
-        self.main_notebook.unparent()
-        self.get_content_area().add (self.main_notebook)
+        self.main_vbox.unparent()
+        self.get_content_area().add (self.main_vbox)
+
+        self.browser_use_proxy_checkbutton.set_active(self.proxies_enabled)
+        self.browser_use_proxy_checkbutton.connect('toggled', self.__on_browser_use_proxy_checkbutton_toggled)
 
         self.custom_blacklist_add_button.connect ('clicked', self.__on_custom_blacklist_add_button_clicked)
         self.custom_blacklist_edit_button.connect ('clicked', self.__on_custom_blacklist_edit_button_clicked)
@@ -80,6 +87,11 @@ class ConfigureProxyDialog (gtk.Dialog):
 
         self.show_all ()
 
+    def run(self):
+        super(ConfigureProxyDialog, self).run()
+        
+        return self.proxies_enabled
+
     def __init_custom_treeview (self, treeview):
         base_id = 0
         for field in ["id", "description"]:
@@ -252,65 +264,71 @@ class ConfigureProxyDialog (gtk.Dialog):
         except:
             return False
 
+    def __on_entry_dialog_essential_values_changed(self, widget, ok_button, name_entry, description_entry, url_entry):
+        """Used for entry dialog value checking, disables "Ok" button when values are not acceptable"""
+        
+        name = name_entry.get_text().strip()
+        description = description_entry.get_text().strip()
+        url = url_entry.get_text().strip()
+        
+        if name == "" or description == "" or url == "":
+            ok_button.set_sensitive (False)
+        else:
+            ok_button.set_sensitive (True)
 
     def __on_custom_blacklist_add_button_clicked (self, widget, data=None):
         xml = self.__load_dialog ()
         self.proxy_rule_dialog = xml.get_object ('wcfed_dialog')
+        self.proxy_rule_dialog.set_title(_("Add blacklist entry"))
         self.proxy_rule_dialog.set_transient_for(self)
         warning_label = xml.get_object ("wcfed_warning_label")
-        warning_label.hide ()
-        while True:
-            ret = self.proxy_rule_dialog.run()
-            if ret == 2:
-                name_entry = xml.get_object ('wcfed_name_entry')
-                description_entry = xml.get_object ('wcfed_description_entry')
-                url_entry = xml.get_object ('wcfed_url_entry')
-
-                name = name_entry.get_text().strip()
-                description = description_entry.get_text().strip()
-                url = url_entry.get_text().strip()
+        ok_button = xml.get_object ('wcfed_ok_button')
+        name_entry = xml.get_object ('wcfed_name_entry')
+        description_entry = xml.get_object ('wcfed_description_entry')
+        url_entry = xml.get_object ('wcfed_url_entry')
+        
+        name_entry.connect ('changed', self.__on_entry_dialog_essential_values_changed, ok_button, name_entry, description_entry, url_entry)
+        description_entry.connect ('changed', self.__on_entry_dialog_essential_values_changed, ok_button, name_entry, description_entry, url_entry)
+        url_entry.connect ('changed', self.__on_entry_dialog_essential_values_changed, ok_button, name_entry, description_entry, url_entry)
+        
+        ret = self.proxy_rule_dialog.run()
+        if ret == 2:
 
-                if name == "" or description == "" or url == "":
-                    warning_label.show()
-                    continue
+            name = name_entry.get_text().strip()
+            description = description_entry.get_text().strip()
+            url = url_entry.get_text().strip()
 
-                self.dbus_client.add_custom_filter (self.__selected_user_id, True, name, description, url)
-                self.__fill_treeviews ()
-                self.proxy_rule_dialog.destroy()
-                break
-            else:
-                self.proxy_rule_dialog.destroy()
-                break
+            self.dbus_client.add_custom_filter (self.__selected_user_id, True, name, description, url)
+            self.__fill_treeviews ()
+            
+        self.proxy_rule_dialog.destroy()
         
     def __on_custom_whitelist_add_button_clicked (self, widget, data=None):
         xml = self.__load_dialog ()
         dialog = xml.get_object ('wcfed_dialog')
+        dialog.set_title(_("Add whitelist entry"))        
         dialog.set_transient_for(self)
+        ok_button = xml.get_object ('wcfed_ok_button')
         warning_label = xml.get_object ("wcfed_warning_label")
-        warning_label.hide ()
-
-        while True:
-            ret = dialog.run()
-            if ret == 2:
-                name_entry = xml.get_object ('wcfed_name_entry')
-                description_entry = xml.get_object ('wcfed_description_entry')
-                url_entry = xml.get_object ('wcfed_url_entry')
+        name_entry = xml.get_object ('wcfed_name_entry')
+        description_entry = xml.get_object ('wcfed_description_entry')
+        url_entry = xml.get_object ('wcfed_url_entry')
 
-                name = name_entry.get_text().strip()
-                description = description_entry.get_text().strip()
-                url = url_entry.get_text().strip()
+        name_entry.connect ('changed', self.__on_entry_dialog_essential_values_changed, ok_button, name_entry, description_entry, url_entry)
+        description_entry.connect ('changed', self.__on_entry_dialog_essential_values_changed, ok_button, name_entry, description_entry, url_entry)
+        url_entry.connect ('changed', self.__on_entry_dialog_essential_values_changed, ok_button, name_entry, description_entry, url_entry)
+        
+        ret = dialog.run()
+        if ret == 2:
 
-                if name == "" or description == "" or url == "":
-                    warning_label.show()
-                    continue
+            name = name_entry.get_text().strip()
+            description = description_entry.get_text().strip()
+            url = url_entry.get_text().strip()
 
-                self.dbus_client.add_custom_filter (self.__selected_user_id, False, name, description, url)
-                self.__fill_treeviews ()
-                dialog.destroy()
-                break
-            else:
-                dialog.destroy()
-                break
+            self.dbus_client.add_custom_filter (self.__selected_user_id, False, name, description, url)
+            self.__fill_treeviews ()
+                
+        dialog.destroy()
 
     def __on_add_dansguardian_list_reply (self, value):
         self.progress_dialog.destroy()
@@ -343,14 +361,18 @@ class ConfigureProxyDialog (gtk.Dialog):
     def __on_custom_blacklist_edit_button_clicked (self, widget, data=None):
         xml = self.__load_dialog ()
         self.proxy_rule_dialog = xml.get_object ('wcfed_dialog')
+        self.proxy_rule_dialog.set_title(_("Edit custom blacklist entry"))
         self.proxy_rule_dialog.set_transient_for(self)
+        ok_button = xml.get_object ('wcfed_ok_button')
         warning_label = xml.get_object ("wcfed_warning_label")
-        warning_label.hide ()
-
         name_entry = xml.get_object ('wcfed_name_entry')
         description_entry = xml.get_object ('wcfed_description_entry')
         url_entry = xml.get_object ('wcfed_url_entry')
 
+        name_entry.connect ('changed', self.__on_entry_dialog_essential_values_changed, ok_button, name_entry, description_entry, url_entry)
+        description_entry.connect ('changed', self.__on_entry_dialog_essential_values_changed, ok_button, name_entry, description_entry, url_entry)
+        url_entry.connect ('changed', self.__on_entry_dialog_essential_values_changed, ok_button, name_entry, description_entry, url_entry)
+
         selection = self.custom_blacklist_treeview.get_selection()
         if selection.count_selected_rows () > 0:
             model, iter = selection.get_selected()
@@ -364,24 +386,16 @@ class ConfigureProxyDialog (gtk.Dialog):
                 description_entry.set_text (filter_description)
                 url_entry.set_text (filter_regex)
 
-        while True:
-            ret = self.proxy_rule_dialog.run()
-            if ret == 2:
-                filter_name = name_entry.get_text().strip()
-                filter_description = description_entry.get_text().strip()
-                filter_url = url_entry.get_text().strip()
-
-                if filter_name == "" or filter_description == "" or filter_url == "":
-                    warning_label.show()
-                    continue
+        ret = self.proxy_rule_dialog.run()
+        if ret == 2:
+            filter_name = name_entry.get_text().strip()
+            filter_description = description_entry.get_text().strip()
+            filter_url = url_entry.get_text().strip()
 
-                self.dbus_client.update_custom_filter (filter_id, filter_name, filter_description, filter_url)
-                self.__fill_treeviews ()
-                self.proxy_rule_dialog.destroy()
-                break
-            else:
-                self.proxy_rule_dialog.destroy()
-                break
+            self.dbus_client.update_custom_filter (filter_id, filter_name, filter_description, filter_url)
+            self.__fill_treeviews ()
+            
+        self.proxy_rule_dialog.destroy()
 
     def __on_custom_whitelist_edit_button_clicked (self, widget, data=None):
         xml = self.__load_dialog ()
@@ -631,6 +645,9 @@ class ConfigureProxyDialog (gtk.Dialog):
         self.dbus_client.update_pkg_filter (pkg_id)
         widget.set_sensitive(False)
 
+    def __on_browser_use_proxy_checkbutton_toggled (self, widget, data=None):
+        self.proxies_enabled = self.browser_use_proxy_checkbutton.get_active()
+
     def __load_dialog (self):
         ui_file = os.path.join (nanny.client.gnome.admin.ui_files_dir, "nac_wcf_edit_dialog.ui")
         xml = gtk.Builder ()
diff --git a/client/gnome/admin/src/DesktopBlocker.py b/client/gnome/admin/src/DesktopBlocker.py
old mode 100644
new mode 100755
index 8d276e8..9a40c6e
--- a/client/gnome/admin/src/DesktopBlocker.py
+++ b/client/gnome/admin/src/DesktopBlocker.py
@@ -1,9 +1,12 @@
 #!/usr/bin/env python
+# -*- coding: utf-8 -*-
 
 # Copyright (C) 2009,2010 Junta de Andalucia
+# Copyright (C) 2012 Guido Tabbernuk
 # 
 # Authors:
 #   Roberto Majadas <roberto.majadas at openshine.com>
+#   Guido Tabbernuk <boamaod at gmail.com>
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -27,7 +30,6 @@ if os.name == "posix":
 elif os.name == "nt" :
     from ctypes import *
 
-
 import gtk
 import gtk.gdk
 import cairo
@@ -38,10 +40,30 @@ import nanny.client.common
 import nanny.client.gnome.admin
 import time
 
+import gtop
+
+from subprocess import Popen, PIPE
+
+import traceback # for debugging
+
+import nanny.client.common.DBusClient
+dbus_client = nanny.client.common.DBusClient ()
 
 class DesktopBlocker(gtk.Window):
+
     def __init__(self):
+
+        print "***", time.asctime(), "Initializing desktop blocker... ***"
+
+        try:
+            self.dbus_client = nanny.client.common.DBusClient ()
+        except:
+            print "Nanny daemon not found"
+        
+        self.uid = str(os.getuid())
+            
         gtk.Window.__init__(self, type=gtk.WINDOW_POPUP)
+        
         self.set_property("skip-taskbar-hint", True)
         self.set_property("skip-pager-hint", True)
         self.set_property("focus-on-map", True)
@@ -58,22 +80,105 @@ class DesktopBlocker(gtk.Window):
         self.set_decorated(False)
         self.set_app_paintable(True)
 
-
         nanny.client.common.Utils.ui_magic (self,
                                             ui_file = os.path.join (nanny.client.gnome.admin.ui_files_dir, "nanny_desktop_blocker.ui"),
                                             prefix = "db")
+
         self.main_vbox.unparent()
-        self.add(self.main_vbox)
-        self.main_vbox.show_all()
 
         self.__setup_background()
         self.stick()
 
-        #Signals 
+        self.add(self.main_vbox)
+        self.main_vbox.show_all()
+
+        self.__setup_ui()
+
         self.close_button.connect("clicked", self.__close_button_clicked_cb, None)
         self.time_button.connect("clicked", self.__time_button_clicked_cb, None)
+        self.buy_time_button.connect("clicked", self.__buy_time_button_clicked_cb, None)
+
+        self.close_button_text = self.close_button.get_label()
+
+    def __setup_ui(self, mercy_button=True):
+
+        print "Setting up UI"
+
+        no_chores = (not self.dbus_client.is_chore_available(self.uid)) or self.dbus_client.is_blocked(self.uid, 0)[0]
+
+        print "Chores list:", not no_chores
+
+        if no_chores:
+        
+            for c in self.inventory.get_children():
+                self.inventory.remove(c)
+        	
+            self.inventory.show_all()
+
+            self.buy_time_button.hide()
+        
+        else:
+        
+            chores_list = self.dbus_client.list_chores(self.uid, available=True)
+
+            vb = gtk.VBox()
+            rb = None
+
+            for line in chores_list:
+            
+                # it could be nice to use 1:06 style layout instead of 1,1
+                # maybe switch to minutes after all
+                # time.strftime(_('%H:%M'), time.gmtime(int(line[3])*60))
+
+                rb = gtk.RadioButton(rb, line[6] + _(" (%s min)") % (line[3]))
+                rb.set_tooltip_text(line[7])
+                rb.connect("toggled", self.__inventory_toggle, [line[0], line[3]])
+                rb.set_can_focus(False) # otherwise badboys can hack by pressing enter on selected radiobutton
+                l = rb.get_children()[0] # gtk.Label
+                l.modify_fg(gtk.STATE_ACTIVE, gtk.gdk.color_parse("white"))
+                l.modify_fg(gtk.STATE_NORMAL, gtk.gdk.color_parse("white"))
+                vb.add(rb)
+
+            rb = gtk.RadioButton(rb)
+            rb.connect("toggled", self.__inventory_toggle)
+            vb.add(rb)
+      
+            self.inv_none_button =  rb
+            self.inv_none_button.set_active(True)
+                
+            hb = gtk.HBox()
+            hb.pack_start(vb, expand=True, fill=True, padding=20)
+
+            for c in self.inventory.get_children():
+                self.inventory.remove(c)
+
+            self.inventory.add(hb)
+            self.inventory.show_all()
+
+            # to make none of radio buttons selected
+            self.inv_none_button.hide()
+
+        print "Mercy button:", mercy_button
+
+        if not mercy_button:
+            self.time_button.hide()
+            self.info_label.hide()
+
+        delay = 0
+        if self.window is not None:
+            while gtk.gdk.keyboard_grab (self.window) != gtk.gdk.GRAB_SUCCESS:
+                print "Grab delaying..."
+                delay += 0.05
+                time.sleep (0.05)
+            if delay > 0:
+                print "... ", delay, "sec"
+                
+        self.already_closed = False
+        self.close_button_countdown = 99
+        
+        if self.dbus_client.is_forced_to_close(self.uid, 0):
+            gobject.timeout_add(1000*15, self.__close_the_dialog_by_timeout)
 
-    
     def __setup_background(self):
         screen = self.get_screen()
         colormap = screen.get_rgba_colormap()
@@ -99,28 +204,98 @@ class DesktopBlocker(gtk.Window):
 
         return False
         
-    def __close_button_clicked_cb(self, widget, data):
-        if os.name == "nt" :
-            windll.user32.ExitWindowsEx(0)
-        elif os.name == "posix" :
-            d = dbus.SessionBus()
-            session_manager = dbus.Interface(d.get_object("org.gnome.SessionManager",
-                                                          "/org/gnome/SessionManager"),
-                                             "org.gnome.SessionManager")
-            session_manager.Logout(1)
-            
-        sys.exit(0)
-        
+    def __inventory_toggle(self, widget, data=None):
+        if widget.get_active() and data is not None:
+            self.buy_time_button.set_sensitive(True)
+            self.selected_chore = data
+
+    def __buy_time_button_clicked_cb(self, widget, data):
+        if self.dbus_client.contract_chore(int(self.selected_chore[0]), self.uid, int(time.time())):
+            print "CONTRACTED A CHORE"
+            sys.exit(0)
+        else:
+            print "Contracting failed"
+            self.__close_button_clicked_cb(widget, data)
+
     def __time_button_clicked_cb(self, widget, data):
+        print "TIME BUTTON"
+
+        self.already_closed = True
+
+        self.dbus_client.take_mercy(self.uid, 0)
         gtk.gdk.keyboard_ungrab()
         self.hide()
+        
+        print "..."
+        
         gobject.timeout_add(1000*60*5, self.__timeout_cb)
-
+        
     def __timeout_cb(self):
+        print "BACK IN BLOCKER"
+        if self.dbus_client.is_allowed_to_use(self.uid, 0):
+            sys.exit(0)
+
         self.show()
-        self.time_button.hide()
-        self.info_label.hide()
-        gtk.gdk.keyboard_grab(self.window)
+        self.__setup_ui(mercy_button=False)
+        
         return False
 
+    def __close_button_clicked_cb(self, widget, data):
+        """Universal method to close session"""
+
+        self.already_closed = True
+
+        print "CLOSING..."
+        if os.name == "nt" :
+            windll.user32.ExitWindowsEx(0)
+        elif os.name == "posix" :
+            try:
+                d = dbus.SessionBus()
+                smgr_obj = d.get_object("org.gnome.SessionManager", "/org/gnome/SessionManager")
+                session_manager = dbus.Interface(smgr_obj, "org.gnome.SessionManager")
+                session_manager.Logout(1)
+            except:
+                # The following occasionally happens:
+                #   DBusException: org.freedesktop.DBus.Error.ServiceUnknown: The name
+                #   org.gnome.SessionManager was not provided by any .service files
+                
+                #print traceback.format_exc()
+
+                self.__close_session_fallback()
+
+        sys.exit(0)
+
+    def __close_the_dialog_by_timeout(self):
+        if self.already_closed:
+            return False
+            
+        if self.close_button_countdown >= 0:
         
+            if self.close_button_countdown < 30:
+                b = self.close_button
+                b.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("indianred"))
+                l = b.get_children()[0]
+                l.modify_fg(gtk.STATE_NORMAL, gtk.gdk.color_parse("white"))                                                                                             
+                l.modify_fg(gtk.STATE_PRELIGHT, gtk.gdk.color_parse("black"))
+
+            self.close_button.set_label(self.close_button_text + " (%s)" % self.close_button_countdown)
+            self.close_button_countdown -= 1
+            gobject.timeout_add(1000, self.__close_the_dialog_by_timeout)
+            return False
+        else:
+            self.close_button.set_label(self.close_button_text)
+            print "TIMEOUT"
+            self.__close_button_clicked_cb(None, None)
+            
+    def __close_session_fallback(self):
+        """Fallback for the moments org.gnome.SessionManager doesn't connect"""
+        proclist = gtop.proclist(gtop.PROCLIST_KERN_PROC_UID, int(self.uid))
+        for proc in proclist:
+            if len(gtop.proc_args(proc))==0:
+                continue
+            if gtop.proc_args(proc)[0] == "x-session-manager" or gtop.proc_args(proc)[0] == "/usr/bin/x-session-manager" or gtop.proc_args(proc)[0] == "/usr/bin/gnome-session" or gtop.proc_args(proc)[0] == "gnome-session":
+                cmd = "kill -9 %s" % (proc)
+                print "Executing fallback:", cmd
+                Popen(cmd, shell=True, stdout=PIPE)
+
+
diff --git a/client/gnome/admin/src/Makefile.am b/client/gnome/admin/src/Makefile.am
index ed6350d..8b4f0a7 100644
--- a/client/gnome/admin/src/Makefile.am
+++ b/client/gnome/admin/src/Makefile.am
@@ -2,6 +2,7 @@ uilibdir = $(pythondir)/nanny/client/gnome/admin
 uilib_PYTHON = __init__.py \
 	       AdminConsole.py \
 	       ConfigureProxyDialog.py \
+	       ConfigureChoresDialog.py \
 	       BlacklistManager.py \
 	       ScheduleCalendar.py \
 	       DesktopBlocker.py
diff --git a/client/gnome/admin/src/__init__.py.in b/client/gnome/admin/src/__init__.py.in
index d5e9aad..bbbcd48 100644
--- a/client/gnome/admin/src/__init__.py.in
+++ b/client/gnome/admin/src/__init__.py.in
@@ -1,12 +1,14 @@
 #!/usr/bin/env python
 
 # Copyright (C) 2009,2010 Junta de Andalucia
+# Copyright (C) 2012 Guido Tabbernuk
 # 
 # Authors:
 #   Roberto Majadas <roberto.majadas at openshine.com>
 #   Cesar Garcia Tapia <cesar.garcia.tapia at openshine.com>
 #   Luis de Bethencourt <luibg at openshine.com>
 #   Pablo Vieytes <pvieytes at openshine.com>
+#   Guido Tabbernuk <boamaod at gmail.com>
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -47,6 +49,7 @@ icons_files_dir= os.path.join(share_files_dir,"icons")
 
 from AdminConsole import AdminConsole
 from ConfigureProxyDialog import ConfigureProxyDialog
+from ConfigureChoresDialog import ConfigureChoresDialog
 from ScheduleCalendar import ScheduleCalendar
 from BlacklistManager import BlacklistManager
 from DesktopBlocker import DesktopBlocker
diff --git a/daemon/data/init.d/debian/nanny b/daemon/data/init.d/debian/nanny
index c5eb24d..fbe6bf5 100644
--- a/daemon/data/init.d/debian/nanny
+++ b/daemon/data/init.d/debian/nanny
@@ -1,8 +1,16 @@
 #! /bin/sh
-#
-# skeleton	example file to build /etc/init.d/ scripts.
-#		This file should be used to construct scripts for /etc/init.d.
-#
+### BEGIN INIT INFO
+# Provides:          nanny
+# Required-Start:    $local_fs $remote_fs $syslog $time
+# Required-Stop:     $local_fs $remote_fs $syslog $time
+# Default-Start:     2 3 4 5
+# Default-Stop:      0 1 6
+# Short-Description: Nanny daemon
+# Description:       This is a daemon for maintaining information
+#                    about parental control.
+#                    See http://projects.gnome.org/nanny/
+### END INIT INFO
+
 #		Written by Miquel van Smoorenburg <miquels cistron nl>.
 #		Modified for Debian 
 #		by Ian Murdock <imurdock gnu ai mit edu>.
@@ -21,7 +29,7 @@ fi
 
 
 NAME="nanny"
-DESC="nanny (Parental Control Daemon)"
+DESC="parental control daemon"
 PID_FILE="/var/run/$NAME.pid"
 LOG_FILE="/var/log/nanny.log"
 
diff --git a/daemon/nanny.tap b/daemon/nanny.tap
old mode 100644
new mode 100755
diff --git a/daemon/src/ChoreManager.py b/daemon/src/ChoreManager.py
new file mode 100755
index 0000000..671bf64
--- /dev/null
+++ b/daemon/src/ChoreManager.py
@@ -0,0 +1,271 @@
+#!/usr/bin/env python
+
+# Copyright (C) 2009,2010 Junta de Andalucia
+# Copyright (C) 2012 Guido Tabbernuk
+# 
+# Authors:
+#   Roberto Majadas <roberto.majadas at openshine.com>
+#   Cesar Garcia Tapia <cesar.garcia.tapia at openshine.com>
+#   Luis de Bethencourt <luibg at openshine.com>
+#   Pablo Vieytes <pvieytes at openshine.com>
+#   Guido Tabbernuk <boamaod at gmail.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301
+# USA
+
+import os
+import sqlite3
+
+from twisted.enterprise import adbapi
+
+from BlockingDeferred import BlockingDeferred
+
+def on_db_connect(conn):
+    conn.execute('PRAGMA foreign_keys=ON')
+
+if os.name == "posix" :
+    NANNY_DAEMON_DATA = "/var/lib/nanny/"
+elif os.name == "nt" :
+    if not hasattr(sys, "frozen") :
+        file_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+        for x in range(6):
+            file_dir = os.path.dirname(file_dir)
+        root_path = file_dir
+        
+        NANNY_DAEMON_DATA = os.path.join(root_path, "var", "lib", "nanny")
+    else:        
+        NANNY_DAEMON_DATA = os.path.join(os.environ["ALLUSERSPROFILE"], "Gnome", "nanny")
+
+CHORES_DB = os.path.join(NANNY_DAEMON_DATA, "chores.db")
+   
+class ChoreManager:
+    def __init__(self, quarterback):
+        self.chores_db = self.__get_chores_db()
+        self.quarterback = quarterback
+
+    def __get_chores_db(self):
+        path = CHORES_DB
+        if os.path.exists(path):
+            db = adbapi.ConnectionPool('sqlite3', path,
+                                       check_same_thread=False,
+                                       cp_openfun=on_db_connect)
+        else:
+            db = adbapi.ConnectionPool('sqlite3', path,
+                                       check_same_thread=False,
+                                       cp_openfun=on_db_connect)
+            db.runOperation('CREATE TABLE chore_descriptions (id INTEGER PRIMARY KEY, title TEXT, description TEXT, reward INTEGER)')
+            db.runOperation('CREATE TABLE chore_status (id INTEGER PRIMARY KEY, chore_id INTEGER, uid TEXT, contracted INTEGER, \
+                            finished INTEGER, FOREIGN KEY(chore_id) REFERENCES chore_descriptions(id) ON DELETE CASCADE ON UPDATE CASCADE)')
+            print "Created chores db"
+
+        return db
+
+    # Chore descriptions to be used assigning chores to users
+
+    def add_chore_description(self, title, description, reward):
+        sql_query = 'INSERT INTO chore_descriptions ("title", "description", "reward") VALUES ("%s", "%s", "%s")' % (title, description, reward)
+        query = self.chores_db.runQuery(sql_query)
+        block_d = BlockingDeferred(query)
+        try:
+            qr = block_d.blockOn()
+            return True
+        except:
+            print "Something goes wrong Adding Chore Description"
+            return False
+
+    def list_chore_descriptions(self, desc_id):
+        qstr = "SELECT * FROM chore_descriptions"
+        if desc_id != -1:
+            qstr = qstr + ' WHERE id = "%s"' % (desc_id)
+        qstr = qstr + ' ORDER BY title ASC'
+        query = self.chores_db.runQuery(qstr)
+        block_d = BlockingDeferred(query)
+        ret = []
+        
+        try:
+            qr = block_d.blockOn()
+            
+            for f in qr :
+                ret.append([ int(f[0]), unicode(f[1]), unicode(f[2]), int(f[3]) ])
+
+            return ret
+        except:
+            print "Something goes wrong Listing Chore Description"
+            return ret
+
+    def remove_chore_description(self, list_id):
+        query = self.chores_db.runQuery('DELETE FROM chore_descriptions WHERE id="%s"' % int(list_id))
+        block_d = BlockingDeferred(query)
+        try:
+            qr = block_d.blockOn()
+            
+            return True
+        except:
+            print "Something goes wrong Removing Chore Description"
+            return False
+
+    def update_chore_description(self, list_id, title, description, reward):
+        sql_query = 'UPDATE chore_descriptions SET title="%s", description="%s", reward="%s" WHERE id=%s' % (title,
+                                                                                                      description,
+                                                                                                      reward,
+                                                                                                      int(list_id))
+        query = self.chores_db.runQuery(sql_query)
+        block_d = BlockingDeferred(query)
+        try:
+            qr = block_d.blockOn()
+            return True
+        except:
+            print "Something goes wrong Updating Chore Description"
+            return False
+            
+    # Real chores for real users
+
+    def add_chore(self, chore_id, uid):
+        sql_query = 'INSERT INTO chore_status ("uid", "chore_id", "contracted", "finished") VALUES ("%s", "%s", "-1", "-1")' % (uid, chore_id)
+        query = self.chores_db.runQuery(sql_query)
+        block_d = BlockingDeferred(query)
+        try:
+            qr = block_d.blockOn()
+            return True
+        except:
+            print "Something goes wrong Adding Chore"
+            return False
+
+    def get_contracted_chores_count(self, uid):
+        qstr = 'SELECT COUNT(*) FROM chore_status JOIN chore_descriptions ON chore_id=chore_descriptions.id WHERE uid="%s" AND contracted != "-1" AND finished == "-1"' % (str(uid))
+        query = self.chores_db.runQuery(qstr)
+        block_d = BlockingDeferred(query)
+       
+        try:
+            qr = block_d.blockOn()
+            
+            return qr[0][0]
+        except:
+            print "Something goes wrong getting Contracted Chores count"
+            return -1
+    
+        
+    def list_chores(self, uid, available, contracted, finished):
+        """Available chores are the chores not yet contracted."""
+        
+        qstr = 'SELECT chore_status.id, chore_id, uid, reward, contracted, finished, title, description FROM chore_status JOIN chore_descriptions ON chore_id=chore_descriptions.id WHERE uid="%s"' % (str(uid))
+        if available:
+            qstr = qstr + ' AND contracted = "-1"'
+        if contracted:
+            qstr = qstr + ' AND contracted != "-1" AND finished == "-1"'
+        if finished:
+            qstr = qstr + ' AND finished != "-1"'
+        if available:
+            qstr = qstr + ' ORDER BY title ASC'
+        if contracted:
+            qstr = qstr + ' ORDER BY contracted ASC'
+        if finished:
+            qstr = qstr + ' ORDER BY finished DESC'
+        query = self.chores_db.runQuery(qstr)
+        block_d = BlockingDeferred(query)
+        ret = []
+        
+        try:
+            qr = block_d.blockOn()
+            
+            for f in qr :
+                ret.append([ int(f[0]), int(f[1]), unicode(f[2]), int(f[3]), int(f[4]), int(f[5]), unicode(f[6]), unicode(f[7]) ])
+
+            return ret
+        except:
+            print "Something goes wrong Listing Chore"
+            return ret
+
+    def remove_chore(self, list_id):
+        query = self.chores_db.runQuery('DELETE FROM chore_status WHERE id=%s' % int(list_id))
+        block_d = BlockingDeferred(query)
+        try:
+            qr = block_d.blockOn()
+            return True
+        except:
+            print "Something goes wrong Removing Chore"
+            return False
+
+    def update_chore(self, list_id, chore_id, uid, contracted, finished):
+        sql_query = 'UPDATE chore_status SET chore_id="%s", uid="%s", contracted="%s", finished="%s" WHERE id=%s' % (
+                                                                                                      chore_id,
+                                                                                                      uid,
+                                                                                                      contracted,
+                                                                                                      finished,
+                                                                                                      int(list_id))
+
+        query = self.chores_db.runQuery(sql_query)
+        block_d = BlockingDeferred(query)
+        try:
+            qr = block_d.blockOn()
+            return True
+        except:
+            print "Something goes wrong Updating Chore"
+            return False
+
+    def get_activated_chore_reward(self, list_id):
+        sql_query = 'SELECT reward FROM chore_status JOIN chore_descriptions on chore_descriptions.id=chore_status.chore_id WHERE chore_status.id="%s"' % (
+                                                                          int(list_id))
+
+        query = self.chores_db.runQuery(sql_query)
+        block_d = BlockingDeferred(query)
+        
+        try:
+            qr = block_d.blockOn()
+            
+            for f in qr :
+                return int(f[0])
+
+            print "Something goes wrong finding our reward for the chore (broken database?)"
+            return -1
+        except:
+            print "Something goes wrong finding our reward for the chore"
+            return -1
+
+
+    def contract_chore(self, list_id, uid, contracted):
+        sql_query = 'UPDATE chore_status SET contracted="%s" WHERE id="%s"' % (
+                                                                          contracted,
+                                                                          int(list_id))
+        query = self.chores_db.runQuery(sql_query)
+        block_d = BlockingDeferred(query)
+        try:
+            qr = block_d.blockOn()
+        except:
+            print "Something goes wrong Contracting Chore"
+            return False
+
+        print "Chore contracted"
+
+        self.quarterback.add_available_time(uid, 0, self.get_activated_chore_reward(int(list_id)))
+        
+        return True
+
+    def finish_chore(self, list_id, finished):
+        sql_query = 'UPDATE chore_status SET finished="%s" WHERE id="%s"' % (
+                                                                          finished,
+                                                                          int(list_id))
+        query = self.chores_db.runQuery(sql_query)
+        block_d = BlockingDeferred(query)
+        try:
+            qr = block_d.blockOn()
+            return True
+        except:
+            print "Something goes wrong Updating Chore"
+            return False
+
+
+
+
diff --git a/daemon/src/LinuxSessionFiltering.py b/daemon/src/LinuxSessionFiltering.py
old mode 100644
new mode 100755
index e08ea2c..0b24c16
--- a/daemon/src/LinuxSessionFiltering.py
+++ b/daemon/src/LinuxSessionFiltering.py
@@ -1,9 +1,11 @@
 #!/usr/bin/env python
 #
 # Copyright (C) 2009,2010,2011 Junta de Andalucia
+# Copyright (C) 2012 Guido Tabbernuk
 # 
 # Authors:
 #   Roberto Majadas <roberto.majadas at openshine.com>
+#   Guido Tabbernuk <boamaod at gmail.com>
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -105,11 +107,34 @@ class LinuxSessionBlocker(gobject.GObject) :
                     if len(lang_var) > 0 :
                         env_lang_var = lang_var.replace("LANG=","")
                         break
-            
             cmd = ['su', user_name, '-c', 
-                   'LANG=%s DISPLAY=%s nanny-desktop-blocker' % (env_lang_var, 
-                                                                 x11_display)]
+                   'LANG=%s DISPLAY=%s %s &>> /var/tmp/desktop-blocker-%s.log' % (env_lang_var, x11_display, self.sb, user_id)]
+                   
             print cmd
+
+            # hack to start after unity panel has actually been loaded
+            # see https://bugs.launchpad.net/nanny/+bug/916788
+            #
+            # BOH
+            env_session_type = None
+            if len(proclist) > 0 :
+                for proc in proclist :
+                    session_type = Popen('cat /proc/%s/environ | tr "\\000" "\\n" | grep ^DESKTOP_SESSION= ' % proc , 
+                                     shell=True, stdout=PIPE).stdout.readline().strip("\n")
+                    if len(session_type) > 0 :
+                        env_session_type = session_type.replace("DESKTOP_SESSION=","")
+                        break
+            
+            if env_session_type == "ubuntu":
+                SLEEP_INTERVAL = 2
+                intervals_to_wait = 22
+                while os.system("pgrep -fl unity-panel-service | grep -v pgrep") != 0 and intervals_to_wait > 0: 
+                    intervals_to_wait = intervals_to_wait - 1
+                    print "Waiting for the desktop to start", intervals_to_wait
+                    time.sleep(SLEEP_INTERVAL)
+
+            time.sleep(SLEEP_INTERVAL)
+            # EOH
             
             p = Popen(cmd)
             print "[LinuxSessionFiltering] launching blocker (pid : %s)" % p.pid
diff --git a/daemon/src/Makefile.am b/daemon/src/Makefile.am
index 1057137..a97b419 100644
--- a/daemon/src/Makefile.am
+++ b/daemon/src/Makefile.am
@@ -8,6 +8,7 @@ corelib_PYTHON =	 __init__.py 			\
 			QuarterBack.py			\
 			BlockingDeferred.py		\
 			FilterManager.py		\
+			ChoreManager.py			\
 			LinuxFiltering.py		\
 			LinuxWebContentFiltering.py 	\
 			LinuxUsersManager.py		\
diff --git a/daemon/src/NannyDBus.py b/daemon/src/NannyDBus.py
old mode 100644
new mode 100755
index 1b5b8ea..0fe0710
--- a/daemon/src/NannyDBus.py
+++ b/daemon/src/NannyDBus.py
@@ -1,12 +1,14 @@
 #!/usr/bin/env python
 
 # Copyright (C) 2009,2010 Junta de Andalucia
+# Copyright (C) 2012 Guido Tabbernuk
 # 
 # Authors:
 #   Roberto Majadas <roberto.majadas at openshine.com>
 #   Cesar Garcia Tapia <cesar.garcia.tapia at openshine.com>
 #   Luis de Bethencourt <luibg at openshine.com>
 #   Pablo Vieytes <pvieytes at openshine.com>
+#   Guido Tabbernuk <boamaod at gmail.com>
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -157,8 +159,32 @@ class NannyDBus(dbus.service.Object):
     @dbus.service.method("org.gnome.Nanny",
                          in_signature='si', out_signature='a{sa(ss)}')
     def GetBlocks(self, user_id, app_id) :
-        ret = self.quarterback.get_blocks(user_id, app_id)
-        return ret
+        return self.quarterback.get_blocks(user_id, app_id)
+
+    @dbus.service.method("org.gnome.Nanny",
+                         in_signature='s', out_signature='a{i(bii)}')
+    def GetBlockStatusByUID(self, user_id) :
+        return self.quarterback.get_block_status_by_uid(str(user_id))
+
+    @dbus.service.method("org.gnome.Nanny",
+                         in_signature='si', out_signature='b')
+    def IsAllowedToUse(self, user_id, app_id) :
+        return self.quarterback.is_allowed_to_use(user_id, app_id)
+
+    @dbus.service.method("org.gnome.Nanny",
+                         in_signature='si', out_signature='b')
+    def IsForcedToClose(self, user_id, app_id) :
+        return self.quarterback.is_forced_to_close(user_id, app_id)
+
+    @dbus.service.method("org.gnome.Nanny",
+                         in_signature='sib', out_signature='')
+    def SetForcedToClose(self, user_id, app_id, state) :
+        self.quarterback.set_forced_to_close(user_id, app_id, state)
+
+    @dbus.service.method("org.gnome.Nanny",
+                         in_signature='si', out_signature='bi')
+    def IsBlocked(self, user_id, app_id) :
+        return self.quarterback.is_blocked(user_id, app_id)
 
     @dbus.service.method("org.gnome.Nanny",
                          in_signature='bs', out_signature='',
@@ -180,10 +206,22 @@ class NannyDBus(dbus.service.Object):
         self.quarterback.set_max_use_time(str(user_id), int(app_id), int(mins))
 
     @dbus.service.method("org.gnome.Nanny",
+                         in_signature='sii', out_signature='',
+                         sender_keyword='sender', connection_keyword='conn')
+    def AddUseTime(self, user_id, app_id, mins, sender=None, conn=None):
+        self._check_polkit_privilege(sender, conn, 'org.gnome.nanny.admin')
+        self.quarterback.add_available_time(str(user_id), int(app_id), int(mins))
+
+    @dbus.service.method("org.gnome.Nanny",
                          in_signature='si', out_signature='i')
     def GetMaxUseTime(self, user_id, app_id):
         return self.quarterback.get_max_use_time(user_id, app_id)
 
+    @dbus.service.method("org.gnome.Nanny",
+                         in_signature='si', out_signature='i')
+    def GetUseTime(self, user_id, app_id):
+        return self.quarterback.get_available_time(user_id, app_id)
+
     @dbus.service.signal("org.gnome.Nanny",
                          signature='')
     def UpdateUsersInfo(self):
@@ -192,6 +230,109 @@ class NannyDBus(dbus.service.Object):
     def __UpdateUsersInfo_cb(self, quarterback):
         self.UpdateUsersInfo()
 
+    @dbus.service.method("org.gnome.Nanny",
+                         in_signature='sbi', out_signature='',
+                         sender_keyword='sender', connection_keyword='conn')
+    def SetChoreSettings(self, uid, active, limit, sender=None, conn=None):
+        self._check_polkit_privilege(sender, conn, 'org.gnome.nanny.admin')
+        self.quarterback.set_chore_settings(str(uid), bool(active), int(limit))
+
+    @dbus.service.method("org.gnome.Nanny",
+                         in_signature='s', out_signature='bi')
+    def GetChoreSettings(self, uid):
+        return self.quarterback.get_chore_settings(str(uid))
+
+    @dbus.service.method("org.gnome.Nanny",
+                         in_signature='s', out_signature='b')
+    def IsChoreAvailable(self, user_id) :
+        return self.quarterback.is_chore_available(user_id)
+
+    @dbus.service.method("org.gnome.Nanny",
+                         in_signature='i', out_signature='i')
+    def GetActivatedChoreReward(self, chore_id):
+        return self.quarterback.chore_manager.get_activated_chore_reward(chore_id)
+
+
+    @dbus.service.method("org.gnome.Nanny",
+                         in_signature='ssi', out_signature='b',
+                         sender_keyword='sender', connection_keyword='conn')
+    def AddChoreDescription(self, title, description, reward, sender=None, conn=None):
+        self._check_polkit_privilege(sender, conn, 'org.gnome.nanny.admin')
+        return self.quarterback.chore_manager.add_chore_description(unicode(title), unicode(description), int(reward))
+
+    @dbus.service.method("org.gnome.Nanny",
+                         in_signature='i', out_signature='a(issi)')
+    def ListChoreDescriptions(self, desc_id):
+        return self.quarterback.chore_manager.list_chore_descriptions(int(desc_id))
+
+    @dbus.service.method("org.gnome.Nanny",
+                         in_signature='i', out_signature='b',
+                         sender_keyword='sender', connection_keyword='conn')
+    def RemoveChoreDescription(self, list_id, sender=None, conn=None):
+        self._check_polkit_privilege(sender, conn, 'org.gnome.nanny.admin')
+        return self.quarterback.chore_manager.remove_chore_description(int(list_id))
+    
+    @dbus.service.method("org.gnome.Nanny",
+                         in_signature='issi', out_signature='b',
+                         sender_keyword='sender', connection_keyword='conn')
+    def UpdateChoreDescription(self, list_id, title, description, reward, sender=None, conn=None):
+        self._check_polkit_privilege(sender, conn, 'org.gnome.nanny.admin')
+        return self.quarterback.chore_manager.update_chore_description(int(list_id),
+                                                                    unicode(title),
+                                                                    unicode(description),
+                                                                    int(reward))
+
+    @dbus.service.method("org.gnome.Nanny",
+                         in_signature='is', out_signature='b',
+                         sender_keyword='sender', connection_keyword='conn')
+    def AddChore(self, chore_id, uid, sender=None, conn=None):
+        self._check_polkit_privilege(sender, conn, 'org.gnome.nanny.admin')
+        return self.quarterback.chore_manager.add_chore(int(chore_id), str(uid))
+
+    @dbus.service.method("org.gnome.Nanny",
+                         in_signature='sbbb', out_signature='a(iisiiiss)',
+                         sender_keyword='sender', connection_keyword='conn')
+    def ListChores(self, uid, available, contracted, finished, sender=None, conn=None):
+        return self.quarterback.chore_manager.list_chores(str(uid), bool(available), bool(contracted), bool(finished))
+
+    @dbus.service.method("org.gnome.Nanny",
+                         in_signature='i', out_signature='b',
+                         sender_keyword='sender', connection_keyword='conn')
+    def RemoveChore(self, list_id, sender=None, conn=None):
+        self._check_polkit_privilege(sender, conn, 'org.gnome.nanny.admin')
+        return self.quarterback.chore_manager.remove_chore(int(list_id))
+    
+    @dbus.service.method("org.gnome.Nanny",
+                         in_signature='iisii', out_signature='b',
+                         sender_keyword='sender', connection_keyword='conn')
+    def UpdateChore(self, list_id, chore_id, uid, contracted, finished, sender=None, conn=None):
+        self._check_polkit_privilege(sender, conn, 'org.gnome.nanny.admin')
+        return self.quarterback.chore_manager.update_chore(int(list_id),
+                                                            int(chore_id),
+                                                            str(uid),
+                                                            int(contracted),
+                                                            int(finished))
+
+    @dbus.service.method("org.gnome.Nanny",
+                         in_signature='isi', out_signature='b')
+    def ContractChore(self, list_id, uid, contracted):
+        return self.quarterback.chore_manager.contract_chore(int(list_id),
+                                                            str(uid),
+                                                            int(contracted))
+
+    @dbus.service.method("org.gnome.Nanny",
+                         in_signature='si', out_signature='')
+    def TakeMercy(self, user_id, app_id):
+        self.quarterback.take_mercy(str(user_id), int(app_id))
+
+    @dbus.service.method("org.gnome.Nanny",
+                         in_signature='ii', out_signature='b',
+                         sender_keyword='sender', connection_keyword='conn')
+    def FinishChore(self, list_id, finished, sender=None, conn=None):
+        self._check_polkit_privilege(sender, conn, 'org.gnome.nanny.admin')
+        return self.quarterback.chore_manager.finish_chore(int(list_id),
+                                                            int(finished))
+
     # org.gnome.Nanny.Notification
     # --------------------------------------------------------------
 
@@ -310,3 +451,5 @@ class NannyDBus(dbus.service.Object):
                                                                                unicode(name),
                                                                                unicode(description),
                                                                                unicode(list_url))
+                                                                               
+
diff --git a/daemon/src/QuarterBack.py b/daemon/src/QuarterBack.py
old mode 100644
new mode 100755
index 42a0029..0e2c79f
--- a/daemon/src/QuarterBack.py
+++ b/daemon/src/QuarterBack.py
@@ -1,12 +1,14 @@
 #!/usr/bin/env python
 
 # Copyright (C) 2009,2010 Junta de Andalucia
+# Copyright (C) 2012 Guido Tabbernuk
 # 
 # Authors:
 #   Roberto Majadas <roberto.majadas at openshine.com>
 #   Cesar Garcia Tapia <cesar.garcia.tapia at openshine.com>
 #   Luis de Bethencourt <luibg at openshine.com>
 #   Pablo Vieytes <pvieytes at openshine.com>
+#   Guido Tabbernuk <boamaod at gmail.com>
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -28,7 +30,7 @@ import os
 import sys
 
 import copy
-import pickle
+import pickle, csv
 import time
 from datetime import datetime, timedelta
 
@@ -38,6 +40,7 @@ if os.name == "posix" :
     from LinuxUsersManager import LinuxUsersManager as UsersManager
     from LinuxSessionFiltering import LinuxSessionFiltering as SessionFilter
     from FilterManager import FilterManager as FilterManager
+    from ChoreManager import ChoreManager as ChoreManager
     from Chrono import Chrono
 elif os.name == "nt" :
     from Win32Filtering import Win32Filtering as FirewallFilter
@@ -45,6 +48,7 @@ elif os.name == "nt" :
     from Win32UsersManager import Win32UsersManager as UsersManager
     from Win32SessionFiltering import Win32SessionFiltering as SessionFilter
     from FilterManager import FilterManager as FilterManager
+    from ChoreManager import ChoreManager as ChoreManager
     from Win32Chrono import Win32Chrono as Chrono
     from Win32Top import Win32Top
 
@@ -59,6 +63,7 @@ def GetInHM(m):
 
 if os.name == "posix" :
     BLOCK_DB = "/var/lib/nanny/nanny-block.db"
+    ARCHIVE_DB = "/var/lib/nanny/nanny-archive.db"
 elif os.name == "nt" :
     if not hasattr(sys, "frozen") :
         file_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
@@ -67,8 +72,10 @@ elif os.name == "nt" :
         root_path = file_dir
         
         BLOCK_DB = os.path.join(root_path, "var", "lib", "nanny", "nanny-block.db")
+        ARCHIVE_DB = os.path.join(root_path, "var", "lib", "nanny", "nanny-archive.db")
     else:
         BLOCK_DB = os.path.join(os.environ["ALLUSERSPROFILE"], "Gnome", "nanny", "nanny-block.db")
+        ARCHIVE_DB = os.path.join(os.environ["ALLUSERSPROFILE"], "Gnome", "nanny", "nanny-archive.db")
 
 
 WEEKDAYS = ["sun", "mon", "tue", "wed", "thu", "fri", "sat"]
@@ -92,8 +99,9 @@ class QuarterBack(gobject.GObject) :
         self.app = app
         self.blocks = {}
         self.wcf_uid_list = []
+        self.chore_settings = {}
         self.chrono_times = {}
-        self.chrono_day = time.localtime().tm_wday
+        self.chrono_day = (datetime.today() - datetime.utcfromtimestamp(0)).days
         
         if not os.path.exists(BLOCK_DB) :
             try:
@@ -105,13 +113,39 @@ class QuarterBack(gobject.GObject) :
                 db = open(BLOCK_DB, 'rb')
                 p = pickle.load(db)
                 self.blocks = p[0]
-                self.wcf_uid_list = p[1]
-                self.chrono_times = p[2]
-                self.chrono_day = p[3]
+                self.chore_settings = p[1]
+                self.wcf_uid_list = p[2]
+                self.chrono_times = p[3]
+                self.chrono_day = p[4]
                 
                 db.close()
             except:
-                print "Something wrong unpickling"
+                print "Something wrong unpickling, trying older format (2.31.1)..."
+                
+                # old format (2.31.1) support
+                try:
+                    db = open(BLOCK_DB, 'rb')
+                    p = pickle.load(db)
+                    self.blocks = p[0]
+                    self.wcf_uid_list = p[1]
+                    self.chrono_times = p[2]
+                    self.chrono_day = p[3]
+                    
+                    db.close()
+                except:
+                    print "No success, something just went wrong unpickling"
+
+            # more old format (2.31.1) support
+            for t in self.chrono_times:
+                announced = False
+                for c in self.chrono_times[t]:
+                    if len(self.chrono_times[t][c].items()) == 2: # 2.31.1 had 2 fields
+                        if not announced:
+                            print 'Old format (2.31.1) support: adding extra fields to user', t
+                            announced = True
+                        self.chrono_times[t][c]["extra_time"] = 0
+                        self.chrono_times[t][c]["mercy_count"] = 0
+                        self.chrono_times[t][c]["force_close"] = 0
 
         self.__next_update_info = None
         self.usersmanager = UsersManager()
@@ -121,14 +155,32 @@ class QuarterBack(gobject.GObject) :
         
         self.firewall_filter = FirewallFilter(self)
         self.filter_manager = FilterManager(self)
+        self.chore_manager = ChoreManager(self)
         self.webcontent_filter = WebContentFilter(self, app)
         self.session_filter = SessionFilter(self)
         
         gobject.timeout_add(1000, self.__polling_cb)
 
+    def __add_to_archive(self):
+        """Appends usage data of the (previous) day to archive"""
+        
+        output = open(ARCHIVE_DB, 'a')
+        writer = csv.writer(output, quoting=csv.QUOTE_NONNUMERIC)
+
+        v=[]
+        for t in self.chrono_times:
+            z=[self.chrono_day, t]
+            for c in self.chrono_times[t]:
+                for s in self.chrono_times[t][c]:
+                    z.append(self.chrono_times[t][c][s])
+            v.append(z)
+
+        writer.writerows(v)
+        output.close()
+
     def __save(self):        
         output = open(BLOCK_DB, 'wb')
-        p = [self.blocks, self.wcf_uid_list,
+        p = [self.blocks, self.chore_settings, self.wcf_uid_list,
              self.chrono_times, self.chrono_day]
         pickle.dump(p, output)
         output.close()
@@ -140,7 +192,8 @@ class QuarterBack(gobject.GObject) :
             if self.__next_update_info != time.localtime().tm_min :
                 return True
 
-            if self.chrono_day != time.localtime().tm_wday:
+            if self.chrono_day != (datetime.today() - datetime.utcfromtimestamp(0)).days:
+                self.__add_to_archive()
                 self.new_chrono_day()
 
         self.__refresh_info()
@@ -163,7 +216,7 @@ class QuarterBack(gobject.GObject) :
             block_status, next_change = self.is_blocked(user_id, app_id)
             available_time = self.get_available_time(user_id, app_id)
             ret[app_id] = [block_status, next_change, available_time]
-        
+            
         return ret
 
     def __check_users_info(self):
@@ -177,12 +230,18 @@ class QuarterBack(gobject.GObject) :
                 self.blocks[user_id] = {0: [], 1: [], 2: [], 3: []}
                 some_users_info_changed = True
             if not self.chrono_times.has_key(user_id) :
-                self.chrono_times[user_id] = {0: {"max_use": 0, "used_time": 0},
-                                              1: {"max_use": 0, "used_time": 0},
-                                              2: {"max_use": 0, "used_time": 0},
-                                              3: {"max_use": 0, "used_time": 0}}
+                self.chrono_times[user_id] = {0: {"max_use": 0, "used_time": 0, "extra_time": 0, "mercy_count": 0, "force_close": 0},
+                                              1: {"max_use": 0, "used_time": 0, "extra_time": 0, "mercy_count": 0, "force_close": 0},
+                                              2: {"max_use": 0, "used_time": 0, "extra_time": 0, "mercy_count": 0, "force_close": 0},
+                                              3: {"max_use": 0, "used_time": 0, "extra_time": 0, "mercy_count": 0, "force_close": 0}}
+                some_users_info_changed = True
+            if not self.chore_settings.has_key(user_id) :
+                self.chore_settings[user_id] = [True, 5]
                 some_users_info_changed = True
 
+        # remove deleted users from lists
+        #
+        
         blocks_uids = self.blocks.keys()
         for user_id, user_name, user_fullname in users :
             if self.blocks.has_key(user_id) :
@@ -199,6 +258,14 @@ class QuarterBack(gobject.GObject) :
             self.chrono_times.pop(uid)
             some_users_info_changed = True
 
+        chore_uids = self.chore_settings.keys()
+        for user_id, user_name, user_fullname in users :
+            if self.chore_settings.has_key(user_id) :
+                chore_uids.pop(chore_uids.index(user_id))
+        for uid in chore_uids :
+            self.chore_settings.pop(uid)
+            some_users_info_changed = True
+
         wcf_uids = copy.copy(self.wcf_uid_list)
         for user_id, user_name, user_fullname in users :
             if user_id in self.wcf_uid_list :
@@ -215,6 +282,29 @@ class QuarterBack(gobject.GObject) :
             self.emit("update-users-info")
             self.__refresh_info()
 
+    def is_allowed_to_use(self, user_id, app_id):
+        available_time = self.get_available_time(user_id, app_id)
+        is_blocked = self.is_blocked(user_id, app_id)[0]
+        
+        return not is_blocked and available_time != 0
+
+    def is_forced_to_close(self, userid, appid):
+        if not self.chrono_times.has_key(userid):
+            return False
+        if not self.chrono_times[userid].has_key(appid):
+            return False
+
+        return bool(self.chrono_times[userid][appid]["force_close"])
+
+    def set_forced_to_close(self, userid, appid, state):
+        self.chrono_times[userid][appid]["force_close"] = int(state)
+        self.__save()
+
+    def is_chore_available(self, user_id):
+        count = self.chore_manager.get_contracted_chores_count(user_id)
+        limit = self.chore_settings[user_id][1]
+        return count < limit
+
     def is_blocked(self, user_id, app_id, date_time=None):
         block_status = False
         next_block = -1
@@ -367,6 +457,13 @@ class QuarterBack(gobject.GObject) :
     def list_wcf_uids (self):
         return self.wcf_uid_list
 
+    def set_chore_settings (self, uid, active, limit):
+            self.chore_settings[uid] = [active, limit]
+            self.__save()
+
+    def get_chore_settings (self, uid):
+        return self.chore_settings[uid]
+
     def get_max_use_time(self, userid, appid):
         if not self.chrono_times.has_key(userid):
             return 0
@@ -381,12 +478,18 @@ class QuarterBack(gobject.GObject) :
             self.chrono_times[userid] = new_user
 
         if not self.chrono_times[userid].has_key(appid):
-            new_app = {"max_use": 0, "used_time": 0}
+            new_app = {"max_use": 0, "used_time": 0, "extra_time": 0, "mercy_count": 0, "force_close": 0}
             self.chrono_times[userid][appid] = new_app
 
         self.chrono_times[userid][appid]["max_use"] = mins
         self.__save()
 
+    def add_available_time(self, userid, appid, mins):
+        if self.chrono_times.has_key(userid):
+            if self.chrono_times[userid].has_key(appid):
+                    self.chrono_times[userid][appid]["extra_time"] += mins
+        self.__save()
+
     def get_available_time(self, userid, appid):
         if not self.chrono_times.has_key(userid):
             return -1
@@ -394,37 +497,46 @@ class QuarterBack(gobject.GObject) :
             return -1
 
         used_time = self.chrono_times[userid][appid]["used_time"]
+        extra_time = self.chrono_times[userid][appid]["extra_time"]
         max_use = self.chrono_times[userid][appid]["max_use"]
         
         if max_use == 0:
             return -1
 
-        if max_use - used_time < 0 :
+        if max_use + extra_time - used_time < 0 :
             return 0
         
-        return max_use - used_time
+        return max_use + extra_time - used_time 
 
-    def subtract_time(self, userid, appid, time=1):
+    def take_mercy(self, userid, appid):
+        self.chrono_times[userid][appid]["mercy_count"] += 1
+        self.__save()
+        
+    def subtract_time(self, userid, appid, mins=1):
         if self.chrono_times.has_key(userid):
             if self.chrono_times[userid].has_key(appid):
-                if self.get_available_time(userid, appid) > 0:
-                    self.chrono_times[userid][appid]["used_time"] += time
-                    print "Substract time (%s, %s) = %s" % (userid, appid, 
+                if self.get_available_time(userid, appid) != 0:
+                        self.chrono_times[userid][appid]["used_time"] += mins
+                        print "Substract time (%s, %s) = %s" % (userid, appid, 
                                                             self.chrono_times[userid][appid]["used_time"])
-        self.__save()
+                        self.__save()
 
     def new_chrono_day(self):
-        self.chrono_day = time.localtime().tm_wday
+        self.chrono_day = (datetime.today() - datetime.utcfromtimestamp(0)).days
 
         for user_id in self.chrono_times.keys():
             for app_id in self.chrono_times[user_id]:
                 self.chrono_times[user_id][app_id]["used_time"] = 0
+                self.chrono_times[user_id][app_id]["extra_time"] = 0
+                self.chrono_times[user_id][app_id]["mercy_count"] = 0
+                
+        self.__save()
 
     def __new_user_chrono_times(self):
-        user ={0: {"max_use": 0, "used_time": 0},
-               1: {"max_use": 0, "used_time": 0},
-               2: {"max_use": 0, "used_time": 0},
-               3: {"max_use": 0, "used_time": 0}}
+        user ={0: {"max_use": 0, "used_time": 0, "extra_time": 0, "mercy_count": 0, "force_close": 0},
+               1: {"max_use": 0, "used_time": 0, "extra_time": 0, "mercy_count": 0, "force_close": 0},
+               2: {"max_use": 0, "used_time": 0, "extra_time": 0, "mercy_count": 0, "force_close": 0},
+               3: {"max_use": 0, "used_time": 0, "extra_time": 0, "mercy_count": 0, "force_close": 0}}
         return user
 
 gobject.type_register(QuarterBack)
diff --git a/debian/compat b/debian/compat
index 7ed6ff8..7f8f011 100644
--- a/debian/compat
+++ b/debian/compat
@@ -1 +1 @@
-5
+7
diff --git a/debian/control b/debian/control
index 126a95e..dc81a5f 100644
--- a/debian/control
+++ b/debian/control
@@ -2,14 +2,17 @@ Source: nanny
 Section: net 
 Priority: optional
 Maintainer: Roberto Majadas <roberto majadas openshine com>
-Build-Depends: debhelper (>= 5), cdbs, python-gtk2-dev, python-dbus , python-gnome2-dev, python-sqlite, libdbus-1-dev, gnome-doc-utils, libsqlite3-dev, python-twisted-core, python-twisted-web, python-imaging, intltool (>= 0.35), python-dev (>= 2.5), python-central (>= 0.5.10)
-Standards-Version: 3.8.3
+Build-Depends: cdbs, debhelper (>= 7), gnome-common, gnome-doc-utils, intltool (>= 0.35), libdbus-1-dev, libsqlite3-dev, python-central (>= 0.5.10), python-dbus , python-dev (>= 2.5), python-gnome2-dev, python-gtk2-dev, python-gtop, python-hachoir-regex, python-imaging, python-sqlite, python-twisted-core, python-twisted-web, scrollkeeper
+Standards-Version: 3.9.2
 XS-Python-Version: current
+Homepage: http://projects.gnome.org/nanny
+Vcs-Browser: http://codebrowse.launchpad.net/~guadalinex-members/nanny/trunk/changes
+Vcs-Bzr: http://bazaar.launchpad.net/~guadalinex-members/nanny/trunk
 
 Package: nanny
 Architecture: any
 XB-Python-Version: ${python:Versions}
-Depends: ${python:Depends}, python-gtk2, python-gnome2, python-glade2, gnome-icon-theme, libgtk2.0-bin, libgnome2-0, python-dbus, python-sqlite, python-twisted-core, python-twisted-web, python-imaging, ${shlibs:Depends}, ${misc:Depends}
+Depends: ${python:Depends}, python-gtk2, python-gnome2, python-glade2, gnome-icon-theme, libgtk2.0-bin, libgnome2-0, python-dbus, python-sqlite, python-twisted-core, python-twisted-web, python-imaging, python-hachoir-regex, python-gtop, ${shlibs:Depends}, ${misc:Depends}
 Description: Parental Control System
  An easy way to control what your kids are doing in the computer.
  You can limit how much time a day each one of them is browsing the web, 
diff --git a/debian/copyright b/debian/copyright
index 6518473..bfae7d2 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -1,33 +1,40 @@
 This package was debianized by Roberto Majadas <roberto majadas openshine com> on
 Sat, 28 Nov 2009 19:24:51 +0100.
 
-Upstream Author:
+It was downloaded from http://projects.gnome.org/nanny/download
 
-    Junta de Andalucia (www.juntadeandalucia.es)
-    Openshine S.L. (www.openshine.com)
+Upstream Authors:
+
+    Roberto Majadas <roberto majadas openshine com>
+    Cesar Garcia Tapia <cesar garcia tapia openshine com> 
+    Luis de Bethencourt <luibg openshine com>
+    Pablo Vieytes <pvieytes openshine com>
+    Guido Tabbernuk <boamaod gmail com>
 
 Copyright:
 
     Copyright (C) 2009-2010 Junta de Andalucia
+	Copyright (C) 2012 Guido Tabbernuk
 
 License:
 
-    This package is free software; you can redistribute it and/or
-    modify it under the terms of the GNU Lesser General Public
-    License as published by the Free Software Foundation; either
-    version 2 of the License, or (at your option) any later version.
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
 
-    This package is distributed in the hope that it will be useful,
+    This program is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-    Lesser General Public License for more details.
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
 
-    You should have received a copy of the GNU Lesser General Public
-    License along with this package; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 
-On Debian systems, the complete text of the GNU Lesser General
-Public License can be found in `/usr/share/common-licenses/LGPL'.
+On Debian systems, the complete text of the GNU General
+Public License can be found in `/usr/share/common-licenses/GPL-2'.
 
-The Debian packaging is (C) 2008, Roberto Majadas <roberto majadas openshine com> and
-is licensed under the GPL, see `/usr/share/common-licenses/GPL'.
+The Debian packaging is Copyright (C) 2009, Roberto Majadas 
+<roberto majadas openshine com> and Juanje Ojeda <jojeda emergya es> and
+is licensed under the GPL-2, see `/usr/share/common-licenses/GPL-2'.
diff --git a/debian/init.d b/debian/init.d
index c5eb24d..fbe6bf5 100644
--- a/debian/init.d
+++ b/debian/init.d
@@ -1,8 +1,16 @@
 #! /bin/sh
-#
-# skeleton	example file to build /etc/init.d/ scripts.
-#		This file should be used to construct scripts for /etc/init.d.
-#
+### BEGIN INIT INFO
+# Provides:          nanny
+# Required-Start:    $local_fs $remote_fs $syslog $time
+# Required-Stop:     $local_fs $remote_fs $syslog $time
+# Default-Start:     2 3 4 5
+# Default-Stop:      0 1 6
+# Short-Description: Nanny daemon
+# Description:       This is a daemon for maintaining information
+#                    about parental control.
+#                    See http://projects.gnome.org/nanny/
+### END INIT INFO
+
 #		Written by Miquel van Smoorenburg <miquels cistron nl>.
 #		Modified for Debian 
 #		by Ian Murdock <imurdock gnu ai mit edu>.
@@ -21,7 +29,7 @@ fi
 
 
 NAME="nanny"
-DESC="nanny (Parental Control Daemon)"
+DESC="parental control daemon"
 PID_FILE="/var/run/$NAME.pid"
 LOG_FILE="/var/log/nanny.log"
 
diff --git a/debian/postinst b/debian/postinst
index 536fb5c..b1ba948 100644
--- a/debian/postinst
+++ b/debian/postinst
@@ -20,11 +20,13 @@ set -e
 
 case "$1" in
     configure)
-	/etc/init.d/udev reload
-	if [ -e /var/run/dbus/system_bus_socket ];
-	then
-		/etc/init.d/dbus reload
-	fi
+        set +e
+        /etc/init.d/udev reload
+        if [ -e /var/run/dbus/system_bus_socket ];
+        then
+            /etc/init.d/dbus reload
+        fi
+        set -e
     ;;
 
     abort-upgrade|abort-remove|abort-deconfigure)
diff --git a/debian/rules b/debian/rules
index e052da5..492885d 100755
--- a/debian/rules
+++ b/debian/rules
@@ -1,6 +1,5 @@
 #!/usr/bin/make -f
 
-include /usr/share/cdbs/1/rules/simple-patchsys.mk
 include /usr/share/cdbs/1/rules/utils.mk
 include /usr/share/cdbs/1/rules/debhelper.mk
 include /usr/share/cdbs/1/class/autotools.mk
@@ -11,6 +10,7 @@ DEB_UPDATE_RCD_PARAMS := "start 99 2 3 4 5 . stop 40 0 1 6 ."
 
 ifeq (autogen.sh,$(wildcard autogen.sh))
         # Found autogen.sh, which probably means we're building from CVS.
+        DEB_CONFIGURE_SCRIPT := ./autogen.sh
         DEB_CONFIGURE_INVOKE := ./autogen.sh --prefix=/usr --sysconfdir=/etc
 endif
 
@@ -20,8 +20,9 @@ clean::
 	find . -name \*pyc -exec rm '{}' \;
 
 binary-post-install/nanny::
+	find debian/nanny/usr/ -name *.la -exec rm -f {} \;
 	egrep -rlZ '^#!(.*)python' debian/nanny/usr/lib/ | xargs -0 chmod a+x --
 	mv debian/nanny.postinst.debhelper debian/nanny.postinst.debhelper.bak
-	dh_pycentral
+	dh_python2
 	cat debian/nanny.postinst.debhelper.bak >> debian/nanny.postinst.debhelper
 	rm debian/nanny.postinst.debhelper.bak
diff --git a/debian/source/format b/debian/source/format
new file mode 100644
index 0000000..89ae9db
--- /dev/null
+++ b/debian/source/format
@@ -0,0 +1 @@
+3.0 (native)
diff --git a/po/LINGUAS b/po/LINGUAS
index 4c658c9..b77e1a6 100644
--- a/po/LINGUAS
+++ b/po/LINGUAS
@@ -5,6 +5,7 @@ de
 el
 eo
 es
+et
 fr
 gl
 he
diff --git a/po/POTFILES.in b/po/POTFILES.in
index aada730..af3880d 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -8,12 +8,15 @@ client/gnome/admin/data/nanny-admin-console.desktop.in
 [type: gettext/glade]client/gnome/admin/data/ui/nanny_admin_console.ui
 [type: gettext/glade]client/gnome/admin/data/ui/nac_wcf_edit_dialog.ui
 [type: gettext/glade]client/gnome/admin/data/ui/nac_wcf_dialog.ui
+[type: gettext/glade]client/gnome/admin/data/ui/nac_chores_dialog.ui
+[type: gettext/glade]client/gnome/admin/data/ui/nac_chores_edit_dialog.ui
 [type: gettext/glade]client/gnome/admin/data/ui/nbm_pbl_dialog.ui
 [type: gettext/glade]client/gnome/admin/data/ui/nbm_pbl_edit_dialog.ui
 [type: gettext/glade]client/gnome/admin/data/ui/nanny_desktop_blocker.ui
 client/gnome/admin/src/__init__.py.in
 client/gnome/admin/src/ScheduleCalendar.py
 client/gnome/admin/src/ConfigureProxyDialog.py
+client/gnome/admin/src/ConfigureChoresDialog.py
 client/gnome/admin/src/AdminConsole.py
 client/gnome/admin/src/BlacklistManager.py
 client/gnome/nanny-firefox-win32/nanny-firefox-blocker
diff --git a/po/et.po b/po/et.po
new file mode 100644
index 0000000..3f53980
--- /dev/null
+++ b/po/et.po
@@ -0,0 +1,1235 @@
+# Estonian translation for nanny
+# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
+# This file is distributed under the same license as the nanny package.
+# FIRST AUTHOR <EMAIL ADDRESS>, 2012.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: nanny\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2012-01-23 03:07+0200\n"
+"PO-Revision-Date: 2012-01-16 14:18+0000\n"
+"Last-Translator: tabbernuk <boamaod gmail com>\n"
+"Language-Team: Estonian <et li org>\n"
+"Language: et\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Launchpad-Export-Date: 2012-01-18 03:52+0000\n"
+"X-Generator: Launchpad (build 14681)\n"
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:32
+msgid "abortion"
+msgstr ""
+
+#: ../client/common/src/Categories.py:32
+msgid "Abortion information excluding when related to religion"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:34
+msgid "ads"
+msgstr ""
+
+#: ../client/common/src/Categories.py:34
+msgid "Advert servers and banned URLs"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:36
+msgid "adult"
+msgstr ""
+
+#: ../client/common/src/Categories.py:36
+msgid "Sites containing adult material such as swearing but not porn"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:38
+msgid "aggressive"
+msgstr ""
+
+#: ../client/common/src/Categories.py:38
+msgid "Similar to violence but more promoting than depicting"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:40
+msgid "antispyware"
+msgstr ""
+
+#: ../client/common/src/Categories.py:40
+msgid "Sites that remove spyware"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:42
+msgid "artnudes"
+msgstr ""
+
+#: ../client/common/src/Categories.py:42
+msgid "Art sites containing artistic nudity"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:44
+msgid "astrology"
+msgstr ""
+
+#: ../client/common/src/Categories.py:44
+msgid "Astrology websites"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:46
+msgid "audio-video"
+msgstr ""
+
+#: ../client/common/src/Categories.py:46
+msgid "Sites with audio or video downloads"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:48
+msgid "banking"
+msgstr ""
+
+#: ../client/common/src/Categories.py:48
+msgid "Banking websites"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:50
+msgid "beerliquorinfo"
+msgstr ""
+
+#: ../client/common/src/Categories.py:50
+msgid "Sites with information only on beer or liquors"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:52
+msgid "beerliquorsale"
+msgstr ""
+
+#: ../client/common/src/Categories.py:52
+msgid "Sites with beer or liquors for sale"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:54
+msgid "blog"
+msgstr ""
+
+#: ../client/common/src/Categories.py:54
+msgid "Journal/Diary websites"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:56
+msgid "cellphones"
+msgstr ""
+
+#: ../client/common/src/Categories.py:56
+msgid "stuff for mobile/cell phones"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:58
+msgid "chat"
+msgstr ""
+
+#: ../client/common/src/Categories.py:58
+msgid "Sites with chat rooms etc"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:60
+msgid "childcare"
+msgstr ""
+
+#: ../client/common/src/Categories.py:60
+msgid "Sites to do with childcare"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:62
+msgid "cleaning"
+msgstr ""
+
+#: ../client/common/src/Categories.py:62
+msgid "Sites to do with cleaning"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:64
+msgid "clothing"
+msgstr ""
+
+#: ../client/common/src/Categories.py:64
+msgid "Sites about and selling clothing"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:66
+msgid "contraception"
+msgstr ""
+
+#: ../client/common/src/Categories.py:66
+msgid "Information about contraception"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:68
+msgid "culnary"
+msgstr ""
+
+#: ../client/common/src/Categories.py:68
+msgid "Sites about cooking et al"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:70
+msgid "dating"
+msgstr ""
+
+#: ../client/common/src/Categories.py:70
+msgid "Sites about dating"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:72
+msgid "desktopsillies"
+msgstr ""
+
+#: ../client/common/src/Categories.py:72
+msgid ""
+"Sites containing screen savers, backgrounds, cursers, pointers. desktop "
+"themes and similar timewasting and potentially dangerous content"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:74
+msgid "dialers"
+msgstr ""
+
+#: ../client/common/src/Categories.py:74
+msgid "Sites with dialers such as those for pornography or trojans"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:76
+msgid "drugs"
+msgstr ""
+
+#: ../client/common/src/Categories.py:76
+msgid "Drug related sites"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:78
+msgid "ecommerce"
+msgstr ""
+
+#: ../client/common/src/Categories.py:78
+msgid "Sites that provide online shopping"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:80
+msgid "entertainment"
+msgstr ""
+
+#: ../client/common/src/Categories.py:80
+msgid "Sites that promote movies, books, magazine, humor"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:82
+msgid "filehosting"
+msgstr ""
+
+#: ../client/common/src/Categories.py:82
+msgid "Sites to do with filehosting"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:84
+msgid "frencheducation"
+msgstr ""
+
+#: ../client/common/src/Categories.py:84
+msgid "Sites to do with french education"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:86
+msgid "gambling"
+msgstr ""
+
+#: ../client/common/src/Categories.py:86
+msgid "Gambling sites including stocks and shares"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:88
+msgid "games"
+msgstr ""
+
+#: ../client/common/src/Categories.py:88
+msgid "Game related sites"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:90
+msgid "gardening"
+msgstr ""
+
+#: ../client/common/src/Categories.py:90
+msgid "Gardening sites"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:92
+msgid "government"
+msgstr ""
+
+#: ../client/common/src/Categories.py:92
+msgid "Military and schools etc"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:94
+msgid "guns"
+msgstr ""
+
+#: ../client/common/src/Categories.py:94
+msgid "Sites with guns"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:96
+msgid "hacking"
+msgstr ""
+
+#: ../client/common/src/Categories.py:96
+msgid "Hacking/cracking information"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:98
+msgid "homerepair"
+msgstr ""
+
+#: ../client/common/src/Categories.py:98
+msgid "Sites about home repair"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:100
+msgid "hygiene"
+msgstr ""
+
+#: ../client/common/src/Categories.py:100
+msgid "Sites about hygiene and other personal grooming related stuff"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:102
+msgid "instantmessaging"
+msgstr ""
+
+#: ../client/common/src/Categories.py:102
+msgid ""
+"Sites that contain messenger client download and web-based messaging sites"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:104
+msgid "jewelry"
+msgstr ""
+
+#: ../client/common/src/Categories.py:104
+msgid "Sites about and selling jewelry"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:106
+msgid "jobsearch"
+msgstr ""
+
+#: ../client/common/src/Categories.py:106
+msgid "Sites for finding jobs"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:108
+msgid "kidstimewasting"
+msgstr ""
+
+#: ../client/common/src/Categories.py:108
+msgid "Sites kids often waste time on"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:110
+msgid "mail"
+msgstr ""
+
+#: ../client/common/src/Categories.py:110
+msgid "Webmail and email sites"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:112
+msgid "marketingware"
+msgstr ""
+
+#: ../client/common/src/Categories.py:112
+msgid "Sites about marketing products"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:114
+msgid "medical"
+msgstr ""
+
+#: ../client/common/src/Categories.py:114
+msgid "Medical websites"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:116
+msgid "mixed_adult"
+msgstr ""
+
+#: ../client/common/src/Categories.py:116
+msgid "Mixed adult content sites"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:118
+msgid "mobile-phone"
+msgstr ""
+
+#: ../client/common/src/Categories.py:118
+msgid "Sites to do with mobile phones"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:120
+msgid "naturism"
+msgstr ""
+
+#: ../client/common/src/Categories.py:120
+msgid "Sites that contain nude pictures and/or promote a nude lifestyle"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:122
+msgid "news"
+msgstr ""
+
+#: ../client/common/src/Categories.py:122
+msgid "News sites"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:124
+msgid "onlineauctions"
+msgstr ""
+
+#: ../client/common/src/Categories.py:124
+msgid "Online auctions"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:126
+msgid "onlinegames"
+msgstr ""
+
+#: ../client/common/src/Categories.py:126
+msgid "Online gaming sites"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:128
+msgid "onlinepayment"
+msgstr ""
+
+#: ../client/common/src/Categories.py:128
+msgid "Online payment sites"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:130
+msgid "personalfinance"
+msgstr ""
+
+#: ../client/common/src/Categories.py:130
+msgid "Personal finance sites"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:132
+msgid "pets"
+msgstr ""
+
+#: ../client/common/src/Categories.py:132
+msgid "Pet sites"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:134
+msgid "phishing"
+msgstr ""
+
+#: ../client/common/src/Categories.py:134
+msgid "Sites attempting to trick people into giving out private information."
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:136
+msgid "porn"
+msgstr ""
+
+#: ../client/common/src/Categories.py:136
+msgid "Pornography"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:138
+msgid "proxy"
+msgstr ""
+
+#: ../client/common/src/Categories.py:138
+msgid "Sites with proxies to bypass filters"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:140
+msgid "radio"
+msgstr ""
+
+#: ../client/common/src/Categories.py:140
+msgid "non-news related radio and television"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:142
+msgid "religion"
+msgstr ""
+
+#: ../client/common/src/Categories.py:142
+msgid "Sites promoting religion"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:144
+msgid "ringtones"
+msgstr ""
+
+#: ../client/common/src/Categories.py:144
+msgid "Sites containing ring tones, games, pictures and other"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:146
+msgid "searchengines"
+msgstr ""
+
+#: ../client/common/src/Categories.py:146
+msgid "Search engines such as google"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:148
+msgid "sect"
+msgstr ""
+
+#: ../client/common/src/Categories.py:148
+msgid "Sites about eligious groups"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:150
+msgid "sexuality"
+msgstr ""
+
+#: ../client/common/src/Categories.py:150
+msgid "Sites dedicated to sexuality, possibly including adult material"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:152
+msgid "shopping"
+msgstr ""
+
+#: ../client/common/src/Categories.py:152
+msgid "Shopping sites"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:154
+msgid "socialnetworking"
+msgstr ""
+
+#: ../client/common/src/Categories.py:154
+msgid "Social networking websites"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:156
+msgid "sportnews"
+msgstr ""
+
+#: ../client/common/src/Categories.py:156
+msgid "Sport news sites"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:158
+msgid "sports"
+msgstr ""
+
+#: ../client/common/src/Categories.py:158
+msgid "All sport sites"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:160
+msgid "spyware"
+msgstr ""
+
+#: ../client/common/src/Categories.py:160
+msgid "Sites who run or have spyware software to download"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:162
+msgid "updatesites"
+msgstr ""
+
+#: ../client/common/src/Categories.py:162
+msgid "Sites where software updates are downloaded from including virus sigs"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:164
+msgid "vacation"
+msgstr ""
+
+#: ../client/common/src/Categories.py:164
+msgid "Sites about going on holiday"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:166
+msgid "violence"
+msgstr ""
+
+#: ../client/common/src/Categories.py:166
+msgid "Sites containing violence"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:168
+msgid "virusinfected"
+msgstr ""
+
+#: ../client/common/src/Categories.py:168
+msgid "Sites who host virus infected files"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:170
+msgid "warez"
+msgstr ""
+
+#: ../client/common/src/Categories.py:170
+msgid "Sites with illegal pirate software"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:172
+msgid "weather"
+msgstr ""
+
+#: ../client/common/src/Categories.py:172
+msgid "Weather news sites and weather related"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:174
+msgid "weapons"
+msgstr ""
+
+#: ../client/common/src/Categories.py:174
+msgid "Sites detailing or selling weapons"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:176
+msgid "webmail"
+msgstr ""
+
+#: ../client/common/src/Categories.py:176
+msgid "Just webmail sites"
+msgstr ""
+
+#. To translators : This string is a category name or a category description
+#: ../client/common/src/Categories.py:178
+msgid "whitelist"
+msgstr ""
+
+#: ../client/common/src/Categories.py:180
+#, no-python-format
+msgid "Contains site specifically 100% suitable for kids"
+msgstr ""
+
+#: ../client/common/src/Utils.py:94
+msgid "Nanny Admin Tools requires Admin user"
+msgstr ""
+
+#: ../client/common/src/Utils.py:95
+msgid "To run any Nanny Admin Tool you must to be admin of the system."
+msgstr ""
+
+#: ../client/common/src/DBusClient.py:81
+msgid "NannyDaemon unavailable"
+msgstr ""
+
+#: ../client/common/src/DBusClient.py:82
+msgid ""
+"NannyDaemon is not activated or does not work properly.\n"
+"Please try to reactivate it."
+msgstr ""
+
+#: ../client/gnome/admin/data/nanny-admin-console.desktop.in.h:1
+msgid "Nanny parental control admin console"
+msgstr "Nanny lapseluku halduspult"
+
+#: ../client/gnome/admin/data/nanny-admin-console.desktop.in.h:2
+msgid "Parental Control"
+msgstr "Nanny lapselukk"
+
+#: ../client/gnome/admin/data/ui/nanny_admin_console.ui.h:1
+msgid "0"
+msgstr ""
+
+#: ../client/gnome/admin/data/ui/nanny_admin_console.ui.h:2
+#: ../client/gnome/admin/data/ui/nbm_pbl_dialog.ui.h:1
+msgid ""
+"<b>You don't have admin privileges</b>\n"
+"Click this button if you want to make changes."
+msgstr ""
+"<b>HaldusÃigused pole hetkel tarvitusel</b>\n"
+"Muudatuste tegemiseks vajuta sellele nupule."
+
+#: ../client/gnome/admin/data/ui/nanny_admin_console.ui.h:4
+msgid "Configure _chores & rewards"
+msgstr "_Tegevuste ja tasude seadistamine"
+
+#: ../client/gnome/admin/data/ui/nanny_admin_console.ui.h:5
+msgid "Configure web filtering"
+msgstr "Veebifiltri seadistamine"
+
+#: ../client/gnome/admin/data/ui/nanny_admin_console.ui.h:6
+msgid "Force logoff"
+msgstr "Sunnitud vÃljalogimine"
+
+#: ../client/gnome/admin/data/ui/nanny_admin_console.ui.h:7
+msgid "Force user either to log off or buy extra time after desktop is blocked"
+msgstr ""
+"Sunnib kasutaja peale tÃÃlaua tÃkestamist hankima lisaaega vÃi vÃlja logima"
+
+#: ../client/gnome/admin/data/ui/nanny_admin_console.ui.h:8
+msgid "Instant messaging"
+msgstr "Vestluskontod"
+
+#: ../client/gnome/admin/data/ui/nanny_admin_console.ui.h:9
+msgid "Mail client"
+msgstr "Meiliklient"
+
+#: ../client/gnome/admin/data/ui/nanny_admin_console.ui.h:10
+msgid "PC use time"
+msgstr "Arvutikasutus"
+
+#: ../client/gnome/admin/data/ui/nanny_admin_console.ui.h:11
+msgid "Use the computer"
+msgstr "Kasutab arvutit"
+
+#: ../client/gnome/admin/data/ui/nanny_admin_console.ui.h:12
+msgid "Use the instant messaging"
+msgstr "Kasutab vestluskontosid"
+
+#: ../client/gnome/admin/data/ui/nanny_admin_console.ui.h:13
+msgid "Use the mail client"
+msgstr "Kasutab meiliklienti"
+
+#: ../client/gnome/admin/data/ui/nanny_admin_console.ui.h:14
+msgid "Use the web browser"
+msgstr "Kasutab veebilehitsejat"
+
+#: ../client/gnome/admin/data/ui/nanny_admin_console.ui.h:15
+#: ../client/gnome/systray/src/SystrayNanny.py:53
+msgid "Web browser"
+msgstr "Veebilehitseja"
+
+#: ../client/gnome/admin/data/ui/nanny_admin_console.ui.h:16
+msgid "hours a day"
+msgstr "tundi pÃevas"
+
+#: ../client/gnome/admin/data/ui/nanny_admin_console.ui.h:17
+msgid "hours to"
+msgstr "tundi"
+
+#: ../client/gnome/admin/data/ui/nanny_admin_console.ui.h:18
+msgid "that's left today"
+msgstr " allesolevale"
+
+#: ../client/gnome/admin/data/ui/nac_wcf_edit_dialog.ui.h:1
+msgid "All the fields are mandatory, so please fill all of them.\t"
+msgstr ""
+
+#: ../client/gnome/admin/data/ui/nac_wcf_edit_dialog.ui.h:2
+#: ../client/gnome/admin/data/ui/nac_chores_edit_dialog.ui.h:1
+#: ../client/gnome/admin/data/ui/nbm_pbl_edit_dialog.ui.h:1
+msgid "Description:"
+msgstr "Kirjeldus:"
+
+#: ../client/gnome/admin/data/ui/nac_wcf_edit_dialog.ui.h:3
+#: ../client/gnome/admin/data/ui/nbm_pbl_edit_dialog.ui.h:2
+msgid "Name:"
+msgstr "Nimi:"
+
+#: ../client/gnome/admin/data/ui/nac_wcf_edit_dialog.ui.h:4
+msgid "URL:"
+msgstr ""
+
+#: ../client/gnome/admin/data/ui/nac_wcf_dialog.ui.h:1
+msgid "Allowed sites"
+msgstr ""
+
+#: ../client/gnome/admin/data/ui/nac_wcf_dialog.ui.h:2
+msgid "Blacklists"
+msgstr ""
+
+#: ../client/gnome/admin/data/ui/nac_wcf_dialog.ui.h:3
+msgid "Enable _web content filtering"
+msgstr ""
+
+#: ../client/gnome/admin/data/ui/nac_wcf_dialog.ui.h:4
+msgid "Forbidden sites"
+msgstr ""
+
+#: ../client/gnome/admin/data/ui/nac_wcf_dialog.ui.h:5
+msgid "_Update"
+msgstr ""
+
+#: ../client/gnome/admin/data/ui/nac_chores_dialog.ui.h:1
+msgid "Amount of contracted but unfinished chores allowed"
+msgstr "Kohustuseks vÃetud, kuid lÃpetamata tegevuste piirarv"
+
+#: ../client/gnome/admin/data/ui/nac_chores_dialog.ui.h:2
+msgid "Assign chores"
+msgstr "Tegevuste lubamine"
+
+#: ../client/gnome/admin/data/ui/nac_chores_dialog.ui.h:3
+msgid "Chores in progress"
+msgstr "TÃÃs olevad tegevused"
+
+#: ../client/gnome/admin/data/ui/nac_chores_dialog.ui.h:4
+msgid "Enable rewarding time for _contracting chores"
+msgstr "Tegevuste ettevÃtmise eest ajaga tasumine on sisse lÃlitatud"
+
+#: ../client/gnome/admin/data/ui/nac_chores_dialog.ui.h:5
+msgid "Finished chores"
+msgstr "LÃpetatud tegevused"
+
+#: ../client/gnome/admin/data/ui/nac_chores_dialog.ui.h:6
+msgid ""
+"If the amount happens to exceed this value, user cannot contract more chores"
+msgstr ""
+"Kui ettevÃtmiste arv Ãletab mÃÃratud arvu, siis ei saa kasutaja rohkem "
+"tegevusi ette vÃtta"
+
+#: ../client/gnome/admin/data/ui/nac_chores_dialog.ui.h:7
+msgid ""
+"Select an entry and press this button to add or remove chores to or from "
+"user&apos;s enabled chores list"
+msgstr ""
+
+#: ../client/gnome/admin/data/ui/nac_chores_dialog.ui.h:8
+msgid ""
+"Select an entry and press this button to add or remove chores to or from "
+"user's enabled chores list"
+msgstr ""
+
+#: ../client/gnome/admin/data/ui/nac_chores_dialog.ui.h:9
+msgid "_Finish"
+msgstr "_LÃpeta"
+
+#. The time given for contracting the chore
+#: ../client/gnome/admin/data/ui/nac_chores_edit_dialog.ui.h:3
+msgid "Reward:"
+msgstr "Tasu:"
+
+#: ../client/gnome/admin/data/ui/nac_chores_edit_dialog.ui.h:4
+msgid ""
+"The chores with time rewards will be displayed as an option to obtain more "
+"usage time to user when the session time limit has been reached and blocking "
+"the session is initiated. User can contract the chore to get extra usage "
+"time immediately."
+msgstr ""
+"Tegevusi koos nendega seotud ajatasudega nÃidatakse kasutajale valikuna "
+"arvutikasutamise ajalimiidi tÃissaamisel, kui sessiooni lukustama hakatakse. "
+"Kasutaja vÃib saadavad lisaaja nimel tegevuse endale kohustuseks vÃtta."
+
+#: ../client/gnome/admin/data/ui/nac_chores_edit_dialog.ui.h:5
+msgid "Title:"
+msgstr "Pealkiri:"
+
+#: ../client/gnome/admin/data/ui/nbm_pbl_dialog.ui.h:3
+msgid "Import..."
+msgstr ""
+
+#: ../client/gnome/admin/data/ui/nanny_desktop_blocker.ui.h:1
+msgid ""
+"<span foreground=\"white\"><big>You can still have a moment for closing the "
+"documents or applications</big></span>"
+msgstr ""
+"<span foreground=\"white\"><big>Soovi korral vÃid vÃtta veel viivu "
+"dokumentide vÃi rakenduste sulgemiseks</big></span>"
+
+#: ../client/gnome/admin/data/ui/nanny_desktop_blocker.ui.h:2
+msgid ""
+"<span size=\"25000\" foreground=\"white\"><b>Your computer usage time is up "
+"now</b></span>"
+msgstr ""
+"<span size=\"25000\" foreground=\"white\"><b>Arvuti kasutamiseks mÃÃratud "
+"aeg on lÃbi</b></span>"
+
+#: ../client/gnome/admin/data/ui/nanny_desktop_blocker.ui.h:3
+msgid "Close session now"
+msgstr "LÃpeta sessioon"
+
+#: ../client/gnome/admin/data/ui/nanny_desktop_blocker.ui.h:4
+msgid "Five minutes, please"
+msgstr "Viis minutit, palun!"
+
+#: ../client/gnome/admin/data/ui/nanny_desktop_blocker.ui.h:5
+msgid "Give me more time"
+msgstr "Anna aega juurde"
+
+#: ../client/gnome/admin/src/ScheduleCalendar.py:310
+msgid "Monday"
+msgstr "EsmaspÃev"
+
+#: ../client/gnome/admin/src/ScheduleCalendar.py:310
+msgid "Tuesday"
+msgstr "TeisipÃev"
+
+#: ../client/gnome/admin/src/ScheduleCalendar.py:310
+msgid "Wednesday"
+msgstr "KolmapÃev"
+
+#: ../client/gnome/admin/src/ScheduleCalendar.py:310
+msgid "Thursday"
+msgstr "NeljapÃev"
+
+#: ../client/gnome/admin/src/ScheduleCalendar.py:310
+msgid "Friday"
+msgstr "Reede"
+
+#: ../client/gnome/admin/src/ScheduleCalendar.py:310
+msgid "Saturday"
+msgstr "LaupÃev"
+
+#: ../client/gnome/admin/src/ScheduleCalendar.py:310
+msgid "Sunday"
+msgstr "PÃhapÃev"
+
+#: ../client/gnome/admin/src/ConfigureProxyDialog.py:39
+msgid "Web Content Filter Configuration"
+msgstr ""
+
+#: ../client/gnome/admin/src/ConfigureProxyDialog.py:187
+#: ../client/gnome/admin/src/ConfigureProxyDialog.py:204
+#: ../client/gnome/admin/src/ConfigureProxyDialog.py:225
+msgid "Unknown Blacklist Name"
+msgstr ""
+
+#: ../client/gnome/admin/src/ConfigureProxyDialog.py:206
+#, python-format
+msgid "(version : %s)"
+msgstr ""
+
+#: ../client/gnome/admin/src/ConfigureProxyDialog.py:209
+msgid "There is an update available"
+msgstr ""
+
+#: ../client/gnome/admin/src/ConfigureProxyDialog.py:211
+#, python-format
+msgid "Downloading information (%s%%)"
+msgstr ""
+
+#: ../client/gnome/admin/src/ConfigureProxyDialog.py:213
+#, python-format
+msgid "Installing blacklist (%s%%)"
+msgstr ""
+
+#: ../client/gnome/admin/src/ConfigureProxyDialog.py:215
+#, python-format
+msgid "Updating blacklist (%s%%)"
+msgstr ""
+
+#: ../client/gnome/admin/src/ConfigureProxyDialog.py:282
+msgid "Add blacklist entry"
+msgstr ""
+
+#: ../client/gnome/admin/src/ConfigureProxyDialog.py:309
+msgid "Add whitelist entry"
+msgstr ""
+
+#: ../client/gnome/admin/src/ConfigureProxyDialog.py:345
+#: ../client/gnome/admin/src/ConfigureProxyDialog.py:356
+msgid "Error while importing list from the Internet"
+msgstr ""
+
+#: ../client/gnome/admin/src/ConfigureProxyDialog.py:346
+#: ../client/gnome/admin/src/ConfigureProxyDialog.py:357
+msgid ""
+"Some error has occured while downloading the list.\n"
+"Please verify the URL and try again."
+msgstr ""
+
+#: ../client/gnome/admin/src/ConfigureProxyDialog.py:364
+msgid "Edit custom blacklist entry"
+msgstr ""
+
+#: ../client/gnome/admin/src/ConfigureProxyDialog.py:447
+#: ../client/gnome/admin/src/ConfigureProxyDialog.py:469
+msgid "Are you sure you want to delete this filter?"
+msgstr ""
+
+#: ../client/gnome/admin/src/ConfigureProxyDialog.py:448
+#: ../client/gnome/admin/src/ConfigureProxyDialog.py:470
+msgid "You will not be able to undo this action."
+msgstr ""
+
+#: ../client/gnome/admin/src/ConfigureProxyDialog.py:455
+#: ../client/gnome/admin/src/ConfigureProxyDialog.py:477
+msgid "Removing filter. Please, wait..."
+msgstr ""
+
+#: ../client/gnome/admin/src/ConfigureProxyDialog.py:496
+#: ../client/gnome/admin/src/ConfigureProxyDialog.py:507
+msgid "Error while deleting filters"
+msgstr ""
+
+#: ../client/gnome/admin/src/ConfigureProxyDialog.py:497
+#: ../client/gnome/admin/src/ConfigureProxyDialog.py:508
+msgid ""
+"Some error has occured while deleting filters.\n"
+"Please try again."
+msgstr ""
+
+#: ../client/gnome/admin/src/ConfigureProxyDialog.py:547
+msgid "<b>Select all the categories</b>"
+msgstr ""
+
+#: ../client/gnome/admin/src/ConfigureProxyDialog.py:599
+msgid "Introduce the nannycentral repository url"
+msgstr ""
+
+#: ../client/gnome/admin/src/ConfigureProxyDialog.py:607
+msgid ""
+"It's something like http://www.nannycentral.info/blacklist/blacklist.json ..."
+msgstr ""
+
+#: ../client/gnome/admin/src/ConfigureProxyDialog.py:629
+#: ../client/gnome/admin/src/BlacklistManager.py:156
+msgid "<b>Are you sure you want to delete this blacklist?</b>"
+msgstr ""
+
+#: ../client/gnome/admin/src/ConfigureProxyDialog.py:630
+#: ../client/gnome/admin/src/BlacklistManager.py:157
+msgid ""
+"This action will remove all the user configuration linked to the blacklist."
+msgstr ""
+
+#: ../client/gnome/admin/src/ConfigureChoresDialog.py:42
+msgid "Chores & Rewards Configuration"
+msgstr "Tegevuste ja tasude seadistamine"
+
+#: ../client/gnome/admin/src/ConfigureChoresDialog.py:388
+msgid "Add chore description"
+msgstr "Tegevuse kirjelduse lisamine"
+
+#: ../client/gnome/admin/src/ConfigureChoresDialog.py:420
+msgid "Edit chore description"
+msgstr "Tegevuse kirjelduse muutmine"
+
+#: ../client/gnome/admin/src/ConfigureChoresDialog.py:459
+msgid "<b>Are you sure you want to delete this chore description entry?</b>"
+msgstr "<b>Oled sa kindel, et tahad selle tegevuse kirjelduse kustutada?</b>"
+
+#: ../client/gnome/admin/src/ConfigureChoresDialog.py:460
+msgid "This action will remove all the user chores linked to the description."
+msgstr ""
+"Sellega kustutatakse ka kÃik selle kirjeldusega seotud tehtud ja tegemata "
+"tÃÃd."
+
+#: ../client/gnome/admin/src/ConfigureChoresDialog.py:517
+#: ../client/gnome/admin/src/ConfigureChoresDialog.py:526
+msgid "Error while deleting the chore entry"
+msgstr ""
+
+#: ../client/gnome/admin/src/ConfigureChoresDialog.py:518
+#: ../client/gnome/admin/src/ConfigureChoresDialog.py:527
+msgid ""
+"Some error has occured while deleting the chore entry.\n"
+"Please try again."
+msgstr ""
+
+#: ../client/gnome/admin/src/AdminConsole.py:52
+msgid "Nanny daemon is not started"
+msgstr ""
+
+#: ../client/gnome/admin/src/AdminConsole.py:53
+msgid "To use the parental control, please start up the daemon."
+msgstr ""
+
+#. FACE
+#: ../client/gnome/admin/src/AdminConsole.py:200
+msgid "Users"
+msgstr "Kasutajad"
+
+#: ../client/gnome/admin/src/AdminConsole.py:389
+msgid "User's configuration has been saved"
+msgstr "Kasutaja seadistused on salvestatud"
+
+#: ../client/gnome/admin/src/AdminConsole.py:415
+#, python-format
+msgid "Nanny Admin Console - %s"
+msgstr "Nanny halduspult - %s"
+
+#: ../client/gnome/admin/src/AdminConsole.py:418
+msgid "Nanny Admin Console"
+msgstr "Nanny halduspult"
+
+#: ../client/gnome/admin/src/AdminConsole.py:584
+msgid "You have made changes"
+msgstr "Oled teinud muudatusi"
+
+#: ../client/gnome/admin/src/AdminConsole.py:585
+msgid ""
+"If you don't press the 'Apply' button, your changes will be lost.\n"
+"Are you sure?"
+msgstr ""
+"Kui sa ei vajuta nupule 'Rakenda', siis lÃhevad muudatused kaotsi.\n"
+"Oled sa sellega rahul?"
+
+#: ../client/gnome/admin/src/BlacklistManager.py:39
+msgid "Blacklist Filter Configuration"
+msgstr ""
+
+#: ../client/gnome/admin/src/BlacklistManager.py:114
+#, python-format
+msgid ""
+"<b>%s (Read only)</b>\n"
+"   %s"
+msgstr ""
+
+#: ../client/gnome/nanny-firefox-win32/nanny-firefox-blocker:97
+msgid "Firefox proxy settings change detected"
+msgstr ""
+
+#: ../client/gnome/nanny-firefox-win32/nanny-firefox-blocker:98
+msgid ""
+"You can't change the proxy settings because you are under parental control."
+msgstr ""
+
+#: ../client/gnome/systray/src/SystrayNanny.py:52
+msgid "Session"
+msgstr "Sessioon"
+
+#: ../client/gnome/systray/src/SystrayNanny.py:54
+msgid "e-Mail"
+msgstr "Meil"
+
+#: ../client/gnome/systray/src/SystrayNanny.py:55
+msgid "Instant messanger"
+msgstr "Vestluskontod"
+
+#. To translators: In x-minutes the access to <app> will be granted
+#: ../client/gnome/systray/src/SystrayNanny.py:134
+#, python-format
+msgid "In %(time)s the access to %(app)s will be granted."
+msgstr ""
+
+#. To translators: In x-minutes the access to <app> will be denied
+#: ../client/gnome/systray/src/SystrayNanny.py:137
+#, python-format
+msgid "In %(time)s the access to %(app)s will be denied."
+msgstr ""
+
+#: ../client/gnome/systray/src/SystrayNanny.py:160
+#, python-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../client/gnome/systray/src/SystrayNanny.py:162
+#, python-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../client/gnome/systray/src/SystrayNanny.py:164
+#, python-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#. Translators: This is the separator between time strings, like '1 day, 2 hours, 3 minutes'
+#: ../client/gnome/systray/src/SystrayNanny.py:166
+msgid ", "
+msgstr ""
+
+#: ../daemon/data/org.gnome.nanny.policy.in.h:1
+msgid "Manage your parental control settings"
+msgstr ""
+
+#: ../daemon/data/org.gnome.nanny.policy.in.h:2
+msgid "You need to authenticate to modify the parental control configuration"
+msgstr "Lapseluku seadistamiseks pead end autentima"
+
+#: ../daemon/src/DansGuardianImporter.py:63
+msgid "Blacklist imported"
+msgstr ""
+
+#: ../daemon/src/DansGuardianImporter.py:76
+msgid "Nanny file created"
+msgstr ""
+
+#: ../daemon/src/DansGuardianImporter.py:79
+#, python-format
+msgid "Downloading file (%s%%)"
+msgstr ""
+
+#: ../daemon/src/DansGuardianImporter.py:271
+#, python-format
+msgid "Importing domains [category: %s] (%s%%)"
+msgstr ""
+
+#: ../daemon/src/DansGuardianImporter.py:287
+#, python-format
+msgid "Importing urls [category: %s] (%s%%)"
+msgstr ""



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]