diff --git a/TODO b/TODO
index 92ee7a2..30a9b8d 100644
--- a/TODO
+++ b/TODO
@@ -22,41 +22,56 @@ add libudev, libusb-1.0 to builddependencies
 
 $ cd ../debian/
 $ git checkout master
-$ git-import-orig -u 0.7.1 ~/projects/xboxdrv/htdocs/xboxdrv-linux-0.7.1.tar.bz2 
-$ dch -v "0.7.1-1" "xboxdrv 0.7.1 release"
+$ git-import-orig -u 0.7.2 ~/projects/xboxdrv/htdocs/xboxdrv-linux-0.7.2.tar.bz2 
+$ dch -v "0.7.2-1" "xboxdrv 0.7.2 release"
 $ git-buildpackage --git-no-create-orig --git-tag --git-builder="debuild -S"
-$ sudo pbuilder --build ../xboxdrv_0.7.1-1.dsc
-$ dput my-ppa ../xboxdrv_0.7.1-1_source.changes
+$ sudo pbuilder --build --basetgz /var/cache/pbuilder/base-maverick.tgz ../xboxdrv_0.7.2-1.dsc
+$ dput my-ppa ../xboxdrv_0.7.2-1_source.changes
 
 # Ubuntu 10.04 (LTS)
 
 $ cd ../debian/
 $ git checkout master-lts
 $ git merge master
-$ dch -b -v "0.7.1-1~lucid1" --distribution lucid "xboxdrv 0.7.1 backport"
+$ dch -b -v "0.7.2-1~lucid1" --distribution lucid "xboxdrv 0.7.2 backport"
 $ git-buildpackage --git-no-create-orig --git-debian-branch=master-lts --git-tag --git-builder="debuild -S"
-$ sudo pbuilder --build ../xboxdrv_0.7.1-1~lucid1.dsc
-$ dput my-ppa ../xboxdrv_0.7.1-1~lucid1_source.changes
-
-
-Stuff to do before 0.7.1 release:
-=================================
-
-Documentation
-=============
-
-* update debian package description
-
-* copy examples to documentation dir in the Ubuntu packages
+$ sudo pbuilder --build --basetgz /var/cache/pbuilder/base-lucid.tgz ../xboxdrv_0.7.2-1~lucid1.dsc
+$ dput my-ppa ../xboxdrv_0.7.2-1~lucid1_source.changes
 
 
 Stuff to do before 0.7.2 release:
 =================================
 
+* factory must create four wireless controllers for each wireless USB device
+
+* add match rule for wireless id
+
+* add --exclued, --exclude-group as ControllerMatchRules
+
+* XboxdrvThread or XboxGenericController must hold information on
+  their: bus:dev, vendor:product and other potentially useful
+  information, match rule must match against controller, not
+  udev_device
+   -> doesn't work, as we don't have a controller at that point
+   -> match against abstract ControllerInfo object?
+   -> get_busnum()
+   -> get_devnum()
+
+   -> figure out potential matches early and save the valid slots?
+      -> ugly but could work
+
+* turn ControllerSlot into ControllerSlotPtr (careful with loop in the refcount)
+
+* allow setting a --default-name from which all other controller names
+  are derived
+
 * add [controller0/config0] support for ControllerOptions
 
 * add [controller0] support for ControllerSlotOptions
 
+* sort options a bit more between global ones, slot local ones and
+  config local ones
+
 * BTN_A@joystick.1 doesn't work for a single joystick, why?
 
 * write relaxation modifier/filter
@@ -66,13 +81,29 @@ Stuff to do before 0.7.2 release:
   identify the device as joystick, also document exactly which
   buttons/axis combinations are valid.
 
+* allow something like:
+
+  void = BTN_A
+
+  to create empty events on uinput
+
 Daemon
 ======
 
 * improve output in daemon mode, when --quiet is not given print the
   number of allocated controller slots
 
-* how exactly does daemon interact with wireless pads?! allow --wid --id for daemon
+* how exactly does daemon interact with wireless pads?! 
+  -> it doesn't, only used the first gamepad or the one given by --wid
+  -> either use all, allow an option to say how many to use
+  -> launch listener threads on each port, but only 'activate' the
+     slot when the controller is connected
+
+* after every thread cleanup, to an enumeration over all USB devices,
+  find those not currently used by a Slot and recreate them, this
+  should fix resume issues, this would also fix the issue with
+  ignoring controllers when all slots are full
+
 
 Other Stuff
 ===========
@@ -96,6 +127,9 @@ disable LT and RT
 * check how daemon reacts on suspend
   - suspending the computer leads to LIBUSB_ERROR_IO, unplugging the
     controller leads to LIBUSB_ERROR_OTHER
+  - errno is set to EBUSY
+  - the device handle can't be reused, device has to be reallocated
+  - integrate this with the "keep backlog of devices currently in use"
 
 * remember controllers that couldn't be used when all slots where full
   and use them when a slot got free
@@ -182,43 +216,6 @@ Stuff to do before 0.7.x release:
 
 * add ABS support to macros events (need to deal with min/max)
 
-* Playstation 3 controller support
-  - http://www.pabr.org/sixlinux/sixlinux.en.html
-  - http://www.motioninjoy.com/
-
-  - figure out what the remaining unknown bits mean:
-
-     data from just pluging the controller in and out a few times
-     without much pause inbetween:
-
-     Dualshock3:
-     // leaving controller plugged in for a longer time settles to this:
-      00 00 03 ef 16 00 00 00 00 33 fc 77 01 de
-
-     00 00 03 ef 16 00 00 00 00 33 fc 77 01 de 
-     00 00 03 ef 16 00 00 00 00 33 fc 77 01 c0
-     00 00 02 ee 12 00 00 00 00 12 fc 77 01 de
-           ^^^^^                         ^^^^^
-     00 00 01 ee 12 00 00 00 00 12 fc 77 01 de 
-     00 00 03 ef 16 00 00 00 00 11 fc 77 01 de 
-     00 00 03 ef 16 00 00 00 00 33 fc 77 01 de 
-     00 00 02 ee 12 00 00 00 00 12 fc 77 01 de 
-     wrong ideas: bluetooth master id
-
-     00 00 01 ef 16 00 00 00 00 11 fc 77 01 c0
-     00 00 03 ef 16 00 00 00 00 11 fc 77 01 c0
-
-     SIXAXIS:
-     00 00 06 ee 10 00 00 00 00 06 83 77 01 81 
-     00 00 06 ee 10 00 00 00 00 06 83 77 01
-     00 00 06 ee 10 00 00 00 00 06 83 77 
-
-     // taken from: http://www.pabr.org/sixlinux/sixlinux.en.html
-     00 00 02 ee 10 00 00 00 00 02 b2 77 01 81
-     
-     random guesses: bluetooth id, serial number, calibration data,
-     battery status
-
 * add support for pairing the controller to the PC (or zero)
 
   --ps3-pair 00:00:00:00:00:00
@@ -369,10 +366,52 @@ Orange	LB1	+32767
 
 * add support for LED messages (can this be used by anything?)
 
-* include id/wid in device name (would be cleaner, since it makes the
-  device unique, but would make Xorg trouble worse)
+
+Stuff to do before 0.8.0 release:
+=================================
+
+* Playstation 3 controller bluetooth support
+  - http://www.pabr.org/sixlinux/sixlinux.en.html
+  - http://www.motioninjoy.com/
+
+  - figure out what the remaining unknown bits mean:
+
+     data from just pluging the controller in and out a few times
+     without much pause inbetween:
+
+     Dualshock3:
+     // leaving controller plugged in for a longer time settles to this:
+      00 00 03 ef 16 00 00 00 00 33 fc 77 01 de
+
+     00 00 03 ef 16 00 00 00 00 33 fc 77 01 de 
+     00 00 03 ef 16 00 00 00 00 33 fc 77 01 c0
+     00 00 02 ee 12 00 00 00 00 12 fc 77 01 de
+           ^^^^^                         ^^^^^
+     00 00 01 ee 12 00 00 00 00 12 fc 77 01 de 
+     00 00 03 ef 16 00 00 00 00 11 fc 77 01 de 
+     00 00 03 ef 16 00 00 00 00 33 fc 77 01 de 
+     00 00 02 ee 12 00 00 00 00 12 fc 77 01 de 
+     wrong ideas: bluetooth master id
+
+     00 00 01 ef 16 00 00 00 00 11 fc 77 01 c0
+     00 00 03 ef 16 00 00 00 00 11 fc 77 01 c0
+
+     SIXAXIS:
+     00 00 06 ee 10 00 00 00 00 06 83 77 01 81 
+     00 00 06 ee 10 00 00 00 00 06 83 77 01
+     00 00 06 ee 10 00 00 00 00 06 83 77 
+
+     // taken from: http://www.pabr.org/sixlinux/sixlinux.en.html
+     00 00 02 ee 10 00 00 00 00 02 b2 77 01 81
+     
+     random guesses: bluetooth id, serial number, calibration data,
+     battery status
+
+* Wiimote support (either native or via libcwiid
 
 
+Random Stuff
+============
 http://lists.libsdl.org/pipermail/sdl-libsdl.org/2007-March/060263.html
 
 - fix http://userweb.kernel.org/~dtor/eviocgbit-bug.html in evtest
@@ -382,6 +421,5 @@ http://lists.libsdl.org/pipermail/sdl-libsdl.org/2007-March/060263.html
 - read from stdin on the main thread
 - send output to file or so
 usb -d 005:006 -c 5:in,5:out,6:in,7:in,8:out -o /tmp/out, else stdin
-
 
 # EOF #
diff --git a/src/xbox360_wireless_controller.cpp b/src/xbox360_wireless_controller.cpp
index ddfbfdb..fca1970 100644
--- a/src/xbox360_wireless_controller.cpp
+++ b/src/xbox360_wireless_controller.cpp
@@ -35,7 +35,8 @@ Xbox360WirelessController::Xbox360WirelessController(libusb_device* dev_, int co
   interface(),
   battery_status(),
   serial(),
-  led_status(0)
+  led_status(0),
+  m_activation_cb()
 {
   assert(controller_id >= 0 && controller_id < 4);
   
@@ -201,8 +202,17 @@ Xbox360WirelessController::set_active(bool v)
   if (m_active != v)
   {
     m_active = v;
-    // FIXME: insert code to signal the daemon, probablly best done with a boost::function<>
+    if (m_activation_cb)
+    {
+      m_activation_cb();
+    }
   }
 }
 
+void
+Xbox360WirelessController::set_activation_cb(const boost::function<void ()> callback)
+{
+  m_activation_cb = callback;
+}
+
 /* EOF */
diff --git a/src/xbox360_wireless_controller.hpp b/src/xbox360_wireless_controller.hpp
index cafd7ca..8335c88 100644
--- a/src/xbox360_wireless_controller.hpp
+++ b/src/xbox360_wireless_controller.hpp
@@ -40,6 +40,8 @@ private:
   std::string serial;
   int led_status;
 
+  boost::function<void ()> m_activation_cb;
+
 public:
   Xbox360WirelessController(libusb_device* dev, int controller_id, bool try_detach);
   virtual ~Xbox360WirelessController();
@@ -49,6 +51,7 @@ public:
   bool read(XboxGenericMsg& msg, int timeout);
   uint8_t get_battery_status() const;
   bool is_active() const { return m_active; }
+  void set_activation_cb(const boost::function<void ()> callback);
   
 private:
   void set_active(bool v);
diff --git a/src/xbox_generic_controller.hpp b/src/xbox_generic_controller.hpp
index 171446c..2df4284 100644
--- a/src/xbox_generic_controller.hpp
+++ b/src/xbox_generic_controller.hpp
@@ -21,11 +21,12 @@
 
 #include <stdint.h>
 
+#include <boost/function.hpp>
+
 struct XboxGenericMsg;
 
 class XboxGenericController
 {
-private:
 public:
   XboxGenericController() {}
   virtual ~XboxGenericController() {}
@@ -40,6 +41,7 @@ public:
   virtual bool read(XboxGenericMsg& msg, int timeout) =0;
 
   virtual bool is_active() const { return true; }
+  virtual void set_activation_cb(const boost::function<void ()> callback) {}
 
 private:
   XboxGenericController (const XboxGenericController&);
diff --git a/src/xboxdrv_daemon.cpp b/src/xboxdrv_daemon.cpp
index 7f32a5a..c176e18 100644
--- a/src/xboxdrv_daemon.cpp
+++ b/src/xboxdrv_daemon.cpp
@@ -595,6 +595,7 @@ XboxdrvDaemon::launch_xboxdrv(udev_device* udev_dev,
   }
   else
   {
+    // FIXME: wireless controllers need to create 4 controllers out of a single USB device
     std::auto_ptr<XboxGenericController> controller = XboxControllerFactory::create(dev_type, dev, opts);
 
     if (slot->get_led_status() == -1)
@@ -616,21 +617,23 @@ XboxdrvDaemon::launch_xboxdrv(udev_device* udev_dev,
       message_proc.reset(new DummyMessageProcessor());
     }
 
-    XboxdrvThreadPtr thread(new XboxdrvThread(message_proc, controller, opts));
-
     if (controller->is_active())
     {
       // active controllers get directly connected to a slot
+      XboxdrvThreadPtr thread(new XboxdrvThread(message_proc, controller, opts));
+      thread->start_thread(opts);
       connect(slot, thread);
     }
     else
     {
       // inactive ones, such as wireless controllers that aren't yet
       // synced get put on hold and only get connected once activated
-      thread->set_compatible_slots(find_compatible_slots(udev_dev));
-    }
+      controller->set_activation_cb(boost::bind(&XboxdrvDaemon::wakeup, this));
 
-    thread->start_thread(opts);
+      XboxdrvThreadPtr thread(new XboxdrvThread(message_proc, controller, opts));
+      thread->set_compatible_slots(find_compatible_slots(udev_dev));
+      thread->start_thread(opts);
+    }
   }
 }
 
@@ -717,4 +720,10 @@ XboxdrvDaemon::on_disconnect(ControllerSlotPtr slot)
   }
 }
 
+void
+XboxdrvDaemon::wakeup()
+{
+  m_wakeup_pipe.send_wakeup();
+}
+
 /* EOF */
diff --git a/src/xboxdrv_daemon.hpp b/src/xboxdrv_daemon.hpp
index 084d0ba..ea0b084 100644
--- a/src/xboxdrv_daemon.hpp
+++ b/src/xboxdrv_daemon.hpp
@@ -82,6 +82,8 @@ private:
   void on_connect(ControllerSlotPtr slot);
   void on_disconnect(ControllerSlotPtr slot);
 
+  void wakeup();
+  
 private:
   XboxdrvDaemon(const XboxdrvDaemon&);
   XboxdrvDaemon& operator=(const XboxdrvDaemon&);