Index: data/prefs-dialog.glade
===================================================================
--- data/prefs-dialog.glade	(revision 1819)
+++ data/prefs-dialog.glade	(working copy)
@@ -459,6 +459,86 @@
 				  <property name="pack_type">GTK_PACK_END</property>
 				</packing>
 			      </child>
+
+			      <child>
+				<widget class="GtkButton" id="restart">
+				  <property name="visible">True</property>
+				  <property name="tooltip" translatable="yes">Restart all loaded extensions</property>
+				  <property name="can_focus">True</property>
+				  <property name="relief">GTK_RELIEF_NORMAL</property>
+				  <property name="focus_on_click">True</property>
+
+				  <child>
+				    <widget class="GtkAlignment" id="alignment30">
+				      <property name="visible">True</property>
+				      <property name="xalign">0.5</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xscale">0</property>
+				      <property name="yscale">0</property>
+				      <property name="top_padding">0</property>
+				      <property name="bottom_padding">0</property>
+				      <property name="left_padding">0</property>
+				      <property name="right_padding">0</property>
+
+				      <child>
+					<widget class="GtkHBox" id="hbox199">
+					  <property name="visible">True</property>
+					  <property name="homogeneous">False</property>
+					  <property name="spacing">2</property>
+
+					  <child>
+					    <widget class="GtkImage" id="image8">
+					      <property name="visible">True</property>
+					      <property name="stock">gtk-clear</property>
+					      <property name="icon_size">4</property>
+					      <property name="xalign">0.5</property>
+					      <property name="yalign">0.5</property>
+					      <property name="xpad">0</property>
+					      <property name="ypad">0</property>
+					    </widget>
+					    <packing>
+					      <property name="padding">0</property>
+					      <property name="expand">False</property>
+					      <property name="fill">False</property>
+					    </packing>
+					  </child>
+
+					  <child>
+					    <widget class="GtkLabel" id="label1332">
+					      <property name="visible">True</property>
+					      <property name="label" translatable="yes">_Restart all</property>
+					      <property name="use_underline">True</property>
+					      <property name="use_markup">False</property>
+					      <property name="justify">GTK_JUSTIFY_LEFT</property>
+					      <property name="wrap">False</property>
+					      <property name="selectable">False</property>
+					      <property name="xalign">0.5</property>
+					      <property name="yalign">0.5</property>
+					      <property name="xpad">0</property>
+					      <property name="ypad">0</property>
+					      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+					      <property name="width_chars">-1</property>
+					      <property name="single_line_mode">False</property>
+					      <property name="angle">0</property>
+					    </widget>
+					    <packing>
+					      <property name="padding">0</property>
+					      <property name="expand">False</property>
+					      <property name="fill">False</property>
+					    </packing>
+					  </child>
+					</widget>
+				      </child>
+				    </widget>
+				  </child>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				  <property name="pack_type">GTK_PACK_END</property>
+				</packing>
+			      </child>
 			    </widget>
 			    <packing>
 			      <property name="padding">0</property>
Index: deskbar/core/CoreImpl.py
===================================================================
--- deskbar/core/CoreImpl.py	(revision 1819)
+++ deskbar/core/CoreImpl.py	(working copy)
@@ -59,6 +59,7 @@
         self._module_loader.connect ("module-loaded", self._module_list.update_row_cb)
         self._module_loader.connect ("module-initialized", self._module_list.module_toggled_cb)
         self._module_loader.connect ("module-stopped", self._module_list.module_toggled_cb)
+        self._module_loader.connect ("modules-reloading", self._module_list.modules_reloading_cb)
         
     def _setup_keybinder(self):
         self._keybinder = Keybinder()
@@ -241,6 +242,9 @@
     def stop_queries(self):
         self._stop_queries = True
         self._threadpool.stop()
+        
+    def reload_all_modules(self):
+        self._module_loader.reload_all()
     
     def query(self, text):
         """
Index: deskbar/core/ModuleLoader.py
===================================================================
--- deskbar/core/ModuleLoader.py	(revision 1819)
+++ deskbar/core/ModuleLoader.py	(working copy)
@@ -1,4 +1,4 @@
-import os, pydoc
+import os, pydoc, sys
 from os.path import abspath, expanduser, join, basename
 import traceback
 import gtk, gobject
@@ -34,6 +34,8 @@
         "module-not-initialized" : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, [gobject.TYPE_PYOBJECT]),
         # Fired when the passed module module has run the stop() method successfully. The module is not usable anymore
         "module-stopped" : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, [gobject.TYPE_PYOBJECT]),
+         #Fired when reload_all gets called, but before any reloading actually gets done
+         "modules-reloading" : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, []),
     }
     
     def __init__ (self, dirs, extension=".py"):
@@ -160,6 +162,11 @@
             self.load (f)
         
         self.emit('modules-loaded')
+        
+    def reload_all (self):
+        logging.info("Reloading all modules")
+        self.emit("modules-reloading")
+        self.load_all()
                     
     def initialize_module (self, module):
         """
Index: deskbar/core/ModuleList.py
===================================================================
--- deskbar/core/ModuleList.py	(revision 1819)
+++ deskbar/core/ModuleList.py	(working copy)
@@ -138,6 +138,12 @@
         """
         self[self.get_position_from_context(module)[0]][self.ENABLED_COL] = module.is_enabled()
         
+    def modules_reloading_cb(self, sender):
+        """
+        Callback fired when modules start reloading.
+        """
+        self.clear()
+        
     def is_module_enabled(self, iter):
         return self[iter][self.ENABLED_COL]
     
Index: deskbar/ui/preferences/DeskbarPreferences.py
===================================================================
--- deskbar/ui/preferences/DeskbarPreferences.py	(revision 1819)
+++ deskbar/ui/preferences/DeskbarPreferences.py	(working copy)
@@ -74,6 +74,8 @@
         self.more_button.set_sensitive(False)
         self.more_button.connect("clicked", self.on_more_button_clicked)
         self.more_button_callback = None
+        self.restart_button = self.glade.get_widget("restart")
+        self.restart_button.connect("clicked", self.on_restart_button_clicked)
 
         # Info are at the bottom
         self.info_area = self.glade.get_widget("info_area")
@@ -220,6 +222,9 @@
     def on_more_button_clicked(self, button):
         if self.more_button_callback != None:
             self.more_button_callback(self.dialog)
+            
+    def on_restart_button_clicked(self, button):
+        self._model.reload_all_modules()
     
     def on_module_selected(self, selection):
         module_context = self.moduleview.get_selected_module()
