diff --git a/sflphone-common/libs/dbus-c++/include/dbus-c++/eventloop.h b/sflphone-common/libs/dbus-c++/include/dbus-c++/eventloop.h
index f7d0f6d8c654033ababf55bdddc57e9a45b2d8e5..cb3382beaa1cf0356dc8798a10c035c02b4e1004 100644
--- a/sflphone-common/libs/dbus-c++/include/dbus-c++/eventloop.h
+++ b/sflphone-common/libs/dbus-c++/include/dbus-c++/eventloop.h
@@ -30,6 +30,7 @@
 
 #include "api.h"
 #include "util.h"
+#include "error.h"
 
 namespace DBus {
 
@@ -149,6 +150,8 @@ public:
 
 	virtual void dispatch();
 
+    virtual void terminate();
+    
 private:
 
 	DefaultMutex _mutex_t;
@@ -156,6 +159,8 @@ private:
 
 	DefaultMutex _mutex_w;
 	DefaultWatches _watches;
+	
+	int _terminateFd[2];
 
 friend class DefaultTimeout;
 friend class DefaultWatch;
diff --git a/sflphone-common/libs/dbus-c++/src/eventloop-integration.cpp b/sflphone-common/libs/dbus-c++/src/eventloop-integration.cpp
index ec82dd22bd2ea97e34cfe55c0c2f25f083c5bb73..6947f28130fa5d27e4b83038246626c0a1b1ba9a 100644
--- a/sflphone-common/libs/dbus-c++/src/eventloop-integration.cpp
+++ b/sflphone-common/libs/dbus-c++/src/eventloop-integration.cpp
@@ -86,6 +86,7 @@ void BusDispatcher::enter()
 void BusDispatcher::leave()
 {
     _running = false;
+    terminate();
 }
 
 void BusDispatcher::do_iteration()
diff --git a/sflphone-common/libs/dbus-c++/src/eventloop.cpp b/sflphone-common/libs/dbus-c++/src/eventloop.cpp
index 656885aa1059595043af199bcf1adb103b6623d2..b1ce7af689fc85b6e2afd430247acc5aa668c516 100644
--- a/sflphone-common/libs/dbus-c++/src/eventloop.cpp
+++ b/sflphone-common/libs/dbus-c++/src/eventloop.cpp
@@ -30,6 +30,8 @@
 
 #include <sys/poll.h>
 #include <sys/time.h>
+#include <unistd.h> 
+#include <cstdio>
 
 #include <dbus/dbus.h>
 
@@ -97,6 +99,9 @@ void DefaultMutex::unlock()
 
 DefaultMainLoop::DefaultMainLoop()
 {
+    if(pipe(_terminateFd) < 0) {
+        throw ErrorFailed ("unable to create unamed pipe");
+    }  
 }
 
 DefaultMainLoop::~DefaultMainLoop()
@@ -129,15 +134,23 @@ DefaultMainLoop::~DefaultMainLoop()
         ti = tmp;
     }
 
+    close(_terminateFd[0]);
+    close(_terminateFd[1]);
+    
     _mutex_t.unlock();
 }
 
-void DefaultMainLoop::dispatch()
+void DefaultMainLoop::terminate() 
 {
-    _mutex_w.lock();
+    write(_terminateFd[1], " ", 1);
+}
 
-    int nfd = _watches.size();
+void DefaultMainLoop::dispatch()
+{    
+    _mutex_w.lock();
 
+    int nfd = _watches.size() + 1;
+    
     pollfd fds[nfd];
 
     DefaultWatches::iterator wi = _watches.begin();
@@ -152,6 +165,10 @@ void DefaultMainLoop::dispatch()
         }
     }
 
+    fds[nfd].fd = _terminateFd[0];
+    fds[nfd].events = POLLIN;
+    fds[nfd].revents = 0;
+        
     _mutex_w.unlock();
 
     int wait_min = 10000;
@@ -167,7 +184,7 @@ void DefaultMainLoop::dispatch()
 
     _mutex_t.unlock();
 
-    poll (fds, nfd, wait_min);
+    poll (fds, nfd+1, wait_min);
 
     timeval now;
     gettimeofday (&now, NULL);