diff --git a/sflphone-client-gnome/src/dbus/callmanager-introspec.xml b/sflphone-client-gnome/src/dbus/callmanager-introspec.xml
index f627cd73ddeb292360637af8f7408d269dad1c7e..b42b3c3e8146cf24bd58751fd189349dd628443d 100644
--- a/sflphone-client-gnome/src/dbus/callmanager-introspec.xml
+++ b/sflphone-client-gnome/src/dbus/callmanager-introspec.xml
@@ -52,10 +52,6 @@
       <arg type="d" name="value" direction="out"/>
     </method>
 
-    <method name="addParticipant">
-      <arg type="s" name="callID" direction="in"/>
-    </method>
-
     <method name="joinParticipant">
       <arg type="s" name="sel_callID" direction="in"/>
       <arg type="s" name="drag_callID" direction="in"/>
diff --git a/sflphone-common/src/dbus/callmanager-introspec.xml b/sflphone-common/src/dbus/callmanager-introspec.xml
index 8777adce856d1a9b7168abcc45fb79b2aea83164..26e8d03e92af7c49ef96b6e6fa47c6e1237fbc3d 100644
--- a/sflphone-common/src/dbus/callmanager-introspec.xml
+++ b/sflphone-common/src/dbus/callmanager-introspec.xml
@@ -52,10 +52,6 @@
       <arg type="d" name="value" direction="out"/>
     </method>
 
-    <method name="addParticipant">
-      <arg type="s" name="callID" direction="in"/>
-    </method>
-
     <method name="joinParticipant">
       <arg type="s" name="sel_callID" direction="in"/>
       <arg type="s" name="drag_callID" direction="in"/>
diff --git a/sflphone-common/src/dbus/callmanager.cpp b/sflphone-common/src/dbus/callmanager.cpp
index f8d7593fb09a3d5c77e03c420da70c3d37342e8d..a07256f3ae21a8d7493a60f861bdf4a46ce9347a 100644
--- a/sflphone-common/src/dbus/callmanager.cpp
+++ b/sflphone-common/src/dbus/callmanager.cpp
@@ -117,13 +117,6 @@ CallManager::getVolume (const std::string& device)
     return 0;
 }
 
-void
-CallManager::addParticipant (const std::string& callID)
-{
-    _debug ("CallManager::addParticipant received %s\n", callID.c_str());
-    Manager::instance().addParticipant(callID);
-}
-
 void
 CallManager::joinParticipant (const std::string& sel_callID, const std::string& drag_callID)
 {
@@ -135,7 +128,7 @@ void
 CallManager::detachParticipant (const std::string& callID)
 {
     _debug ("CallManager::detachParticipant received %s\n", callID.c_str());
-    // Manager::instance().detachParticipant(callID);
+    Manager::instance().detachParticipant(callID);
 }
 
 
diff --git a/sflphone-common/src/dbus/callmanager.h b/sflphone-common/src/dbus/callmanager.h
index ea54252e14c552515bc4fb4c0e72b7bf5bbe1bff..9f231d99cd862c072c1b7f193fd0932f6f3ef6a1 100644
--- a/sflphone-common/src/dbus/callmanager.h
+++ b/sflphone-common/src/dbus/callmanager.h
@@ -48,7 +48,6 @@ public:
     void transfert( const std::string& callID, const std::string& to );
     void setVolume( const std::string& device, const double& value );
     double getVolume( const std::string& device );
-    void addParticipant( const std::string& callID );
     void joinParticipant( const std::string& sel_callID, const std::string& drag_callID );
     void detachParticipant( const std::string& callID );
     void setRecording( const std::string& callID );
diff --git a/sflphone-common/src/managerimpl.cpp b/sflphone-common/src/managerimpl.cpp
index 828bff1c2f44ae7142c4d7818bdf9d2d69ad1c77..096b1110d36351e1a81945508b661abe3722ef43 100644
--- a/sflphone-common/src/managerimpl.cpp
+++ b/sflphone-common/src/managerimpl.cpp
@@ -716,7 +716,7 @@ ManagerImpl::participToConference(const CallID& call_id)
 	return true;
     }
 }
-
+/*
 void
 ManagerImpl::addParticipant(const CallID& call_id)
 {
@@ -747,6 +747,7 @@ ManagerImpl::addParticipant(const CallID& call_id)
     }
     
 }
+*/
 
 void
 ManagerImpl::joinParticipant(const CallID& call_id1, const CallID& call_id2)
@@ -755,39 +756,38 @@ ManagerImpl::joinParticipant(const CallID& call_id1, const CallID& call_id2)
     // _debug("    Current call ID %s\n", getCurrentCallId().c_str());
 
     // TODO: add conference_id as a second parameter
-    std::map<std::string, std::string> call_details;
+    std::map<std::string, std::string> call1_details = getCallDetails(call_id1);
+    std::map<std::string, std::string> call2_details = getCallDetails(call_id2);
+
     ConferenceMap::iterator iter = _conferencemap.find(default_conf);
+    std::map<std::string, std::string>::iterator iter_details;
 
     if(iter == _conferencemap.end())
     {
 	_debug("NO CONFERENCE YET, CREATE ONE\n");
 	createConference(call_id1, call_id2);
-	
 
-	// answerCall(call_id);
-	call_details = getCallDetails(call_id1);
-	std::map<std::string, std::string>::iterator iter = call_details.find("CALL_STATE");
-	_debug("    call %s state: %s\n", call_id1.c_str(), iter->second.c_str());
-	if (iter->second == "HOLD")
+	iter_details = call1_details.find("CALL_STATE");
+	_debug("    call %s state: %s\n", call_id1.c_str(), iter_details->second.c_str());
+	if (iter_details->second == "HOLD")
 	{
 	    _debug("    OFFHOLD %s\n", call_id1.c_str());
 	    offHoldCall(call_id1);
 	}
-	else if(iter->second == "INCOMING")
+	else if(iter_details->second == "INCOMING")
 	{
 	    _debug("    ANSWER %s\n", call_id1.c_str());
 	    answerCall(call_id1);
 	}
 
-	call_details = getCallDetails(call_id2);
-	iter = call_details.find("CALL_STATE");
-	_debug("    call %s state: %s\n", call_id2.c_str(), iter->second.c_str());
-	if (iter->second == "HOLD")
+	iter_details = call2_details.find("CALL_STATE");
+	_debug("    call %s state: %s\n", call_id2.c_str(), iter_details->second.c_str());
+	if (iter_details->second == "HOLD")
 	{
 	    _debug("    OFFHOLD %s\n", call_id2.c_str());
 	    offHoldCall (call_id2);
 	}
-	else if(iter->second == "INCOMING")
+	else if(iter_details->second == "INCOMING")
 	{
 	    _debug("    ANSWER %s\n", call_id2.c_str());
 	    answerCall(call_id2);
@@ -799,8 +799,27 @@ ManagerImpl::joinParticipant(const CallID& call_id1, const CallID& call_id2)
     else
     {
 	_debug("ALREADY A CONFERENCE CREATED, ADD PARTICIPANT TO IT\n");
-	// Conference* conf = iter->second;
+	Conference* conf = iter->second;
+
+	iter_details = call1_details.find("CALL_STATE");
+	if(iter_details->second == "HOLD")
+	{
+
+	}
+	else if(iter_details->second == "INCOMING")
+	{
+
+	}
 
+	iter_details = call2_details.find("CALL_STATE");
+	if(iter_details->second == "HOLD")
+	{
+
+	}
+	else if(iter_details->second == "INCOMING")
+	{
+
+	}
 	// conf->add(call_id);
 	// _conferencecall.insert(pair<CallID, Conference*>(call_id, conf));
 
@@ -809,6 +828,36 @@ ManagerImpl::joinParticipant(const CallID& call_id1, const CallID& call_id2)
     
 }
 
+
+void
+ManagerImpl::detachParticipant(const CallID& call_id)
+{
+    _debug("ManagerImpl::detachParticipant(%s)\n", call_id.c_str());
+
+    // TODO: add conference_id as a second parameter
+    ConferenceMap::iterator iter = _conferencemap.find(default_conf);
+
+    if(iter == _conferencemap.end())
+    {
+	_debug("Error there is no conference, call is not conferencing\n");
+
+    }
+    else
+    {
+	_debug("ALREADY A CONFERENCE CREATED, ADD PARTICIPANT TO IT\n");
+	Conference* conf = iter->second;
+
+	// conf->remove(call_id);
+	
+	// _conferencecall.erase(call_id);
+	removeParticipant(call_id);
+
+	onHoldCall(call_id);
+    }
+    
+}
+
+
 void
 ManagerImpl::removeParticipant(const CallID& call_id)
 {
diff --git a/sflphone-common/src/managerimpl.h b/sflphone-common/src/managerimpl.h
index 586f71d6c07755fe17911ff575e6e6e79614cd68..ef0e27274882bda37bbd77047e167d72bcb8ccac 100644
--- a/sflphone-common/src/managerimpl.h
+++ b/sflphone-common/src/managerimpl.h
@@ -192,10 +192,14 @@ class ManagerImpl {
 
     bool participToConference(const CallID& call_id);
 
+/*
     void addParticipant(const CallID& call_id);
+*/
 
     void joinParticipant(const CallID& call_id1, const CallID& call_id2);
 
+    void detachParticipant(const CallID& call_id);
+
     void removeParticipant(const CallID& call_id);
 
     void addStream(const CallID& call_id);