diff --git a/sflphone-common/src/audio/audiortp/AudioRtpFactory.cpp b/sflphone-common/src/audio/audiortp/AudioRtpFactory.cpp
index 09756c4adff42163459b71e15d7f3cec7fc80c21..f7ef1ffe5d2c18935f83d50c6daf637885ec9b5c 100644
--- a/sflphone-common/src/audio/audiortp/AudioRtpFactory.cpp
+++ b/sflphone-common/src/audio/audiortp/AudioRtpFactory.cpp
@@ -167,8 +167,8 @@ void AudioRtpFactory::stop (void)
         switch (_rtpSessionType) {
 
             case Sdes:
-	        delete static_cast<AudioSrtpSession *> (_rtpSession);
-		break;
+            	delete static_cast<AudioSrtpSession *> (_rtpSession);
+            	break;
 
             case Symmetric:
                 delete static_cast<AudioSymmetricRtpSession *> (_rtpSession);
diff --git a/sflphone-common/src/audio/audiortp/AudioRtpSession.h b/sflphone-common/src/audio/audiortp/AudioRtpSession.h
index d2497d5a4386b02df54792fe718cdc8c8edbb538..bfb5a72c22d12b08c04e4ec292704504bb047ca5 100644
--- a/sflphone-common/src/audio/audiortp/AudioRtpSession.h
+++ b/sflphone-common/src/audio/audiortp/AudioRtpSession.h
@@ -267,6 +267,10 @@ namespace sfl {
         delete [] _spkrDataConverted;
         delete _time;
         delete _converter;
+
+        if (_audiocodec) {
+        	delete _audiocodec; _audiocodec = NULL;
+        }
     }
     
     template <typename D>
@@ -615,7 +619,7 @@ namespace sfl {
         _debug("RTP: Starting main thread");
         setSessionTimeouts();
         setSessionMedia(audiocodec);
-	initBuffers();
+        initBuffers();
         return start(_mainloopSemaphore);
     }
     
diff --git a/sflphone-common/src/audio/codecs/codecDescriptor.cpp b/sflphone-common/src/audio/codecs/codecDescriptor.cpp
index 29355764f1f8a5e96a13fc8ee2b6c8a1d6dbba62..0ca263763ecca44841f9d5f174e74df7aa5f2fc7 100644
--- a/sflphone-common/src/audio/codecs/codecDescriptor.cpp
+++ b/sflphone-common/src/audio/codecs/codecDescriptor.cpp
@@ -31,17 +31,19 @@ CodecDescriptor::CodecDescriptor() : _CodecsMap(), _defaultCodecOrder(), _Cache(
 
 CodecDescriptor::~CodecDescriptor()
 {
+
 }
 
 void
 CodecDescriptor::deleteHandlePointer (void)
 {
-    int i;
+	_debug("CodecDesccriptor: Delete codec handle pointers");
 
-    for (i = 0 ; (unsigned int) i < _CodecInMemory.size() ; i++) {
+    for (int i = 0 ; (unsigned int) i < _CodecInMemory.size() ; i++) {
         unloadCodec (_CodecInMemory[i]);
     }
 
+    _CodecInMemory.clear();
 }
 
 void
@@ -51,7 +53,7 @@ CodecDescriptor::init()
     _nbCodecs = CodecDynamicList.size();
 
     if (_nbCodecs <= 0) {
-        _debug (" Error - No codecs available in directory %s" , CODECS_DIR);
+        _error ("CodecDescriptro: Error - No codecs available in directory %s" , CODECS_DIR);
     }
 
     int i;
@@ -97,7 +99,7 @@ CodecDescriptor::getCodec (AudioCodecType payload)
         return (iter->second);
     }
 
-    _debug ("Error cannont found codec %i in _CodecsMap from codec descriptor", payload);
+    _error ("CodecDescriptor: Error cannont found codec %i in _CodecsMap from codec descriptor", payload);
 
     return NULL;
 }
@@ -167,7 +169,7 @@ std::vector<AudioCodec*> CodecDescriptor::scanCodecDirectory (void) {
 
     for (i = 0 ; (unsigned int) i < dirToScan.size() ; i++) {
         std::string dirStr = dirToScan[i];
-        _debug ("Scanning %s to find audio codecs....",  dirStr.c_str());
+        _debug ("CodecDescriptor: Scanning %s to find audio codecs....",  dirStr.c_str());
         DIR *dir = opendir (dirStr.c_str());
         AudioCodec* audioCodec;
 
@@ -248,15 +250,15 @@ AudioCodec* CodecDescriptor::instantiateCodec (AudioCodecType payload) {
             AudioCodec* a = createCodec();
 
             return a;
-
         }
-
         iter++;
     }
 
     return NULL;
 }
 
+
+
 AudioCodec* CodecDescriptor::getFirstCodecAvailable (void) {
 
     CodecsMap::iterator iter = _CodecsMap.begin();
@@ -349,7 +351,7 @@ bool CodecDescriptor::isCodecLoaded (int payload) {
 
 std::vector <std::string> CodecDescriptor::getCodecSpecifications (const int32_t& payload) {
 
-	_warn ("Gathering codec specifications for payload %i", payload);
+	_debug ("CodecDescriptor: Gathering codec specifications for payload %i", payload);
 
 	std::vector<std::string> v;
     std::stringstream ss;
diff --git a/sflphone-common/src/audio/codecs/speexcodec_nb.cpp b/sflphone-common/src/audio/codecs/speexcodec_nb.cpp
index 9099dca71fbc7a69d71982394794c59f1d95492e..f06f5e43f899246f358b6129a981b95874126001 100644
--- a/sflphone-common/src/audio/codecs/speexcodec_nb.cpp
+++ b/sflphone-common/src/audio/codecs/speexcodec_nb.cpp
@@ -107,6 +107,9 @@ class Speex : public AudioCodec
             speex_bits_destroy (&_speex_enc_bits);
             speex_encoder_destroy (_speex_enc_state);
             _speex_enc_state = 0;
+
+            speex_preprocess_state_destroy( _preprocess_state);
+            _preprocess_state = NULL;
         }
 
         virtual int codecDecode (short *dst, unsigned char *src, unsigned int size) {
diff --git a/sflphone-common/src/audio/codecs/speexcodec_ub.cpp b/sflphone-common/src/audio/codecs/speexcodec_ub.cpp
index 4a9fec31c88b8ac3197a148b368eeb3e460d7dcc..01fb49b242f37fd94fff738ba27f0080348039be 100644
--- a/sflphone-common/src/audio/codecs/speexcodec_ub.cpp
+++ b/sflphone-common/src/audio/codecs/speexcodec_ub.cpp
@@ -106,6 +106,9 @@ class Speex : public AudioCodec
             speex_bits_destroy (&_speex_enc_bits);
             speex_encoder_destroy (_speex_enc_state);
             _speex_enc_state = 0;
+
+            speex_preprocess_state_destroy( _preprocess_state);
+            _preprocess_state = NULL;
         }
 
         virtual int codecDecode (short *dst, unsigned char *src, unsigned int size) {
diff --git a/sflphone-common/src/audio/codecs/speexcodec_wb.cpp b/sflphone-common/src/audio/codecs/speexcodec_wb.cpp
index 28e099791f511dd838fdedc5c37dd4e4f20d4265..f3ff803ff0a7e4dc4dc766567adc9a07eafaa6e0 100644
--- a/sflphone-common/src/audio/codecs/speexcodec_wb.cpp
+++ b/sflphone-common/src/audio/codecs/speexcodec_wb.cpp
@@ -105,6 +105,9 @@ class Speex : public AudioCodec
             speex_bits_destroy (&_speex_enc_bits);
             speex_encoder_destroy (_speex_enc_state);
             _speex_enc_state = 0;
+
+            speex_preprocess_state_destroy( _preprocess_state);
+            _preprocess_state = NULL;
         }
 
         virtual int codecDecode (short *dst, unsigned char *src, unsigned int size) {
diff --git a/sflphone-common/src/audio/mainbuffer.cpp b/sflphone-common/src/audio/mainbuffer.cpp
index f0da142792d6a6e428a5f7d3d0659af570765c1f..bad0b7a3b9aacff1a28f574978bb8f50df1fba36 100644
--- a/sflphone-common/src/audio/mainbuffer.cpp
+++ b/sflphone-common/src/audio/mainbuffer.cpp
@@ -65,7 +65,6 @@ bool MainBuffer::createCallIDSet (CallID set_id)
     CallIDSet* newCallIDSet = new CallIDSet;
 
     _callIDMap.insert (pair<CallID, CallIDSet*> (set_id, newCallIDSet));
-    // _callIDMap[set_id] = new CallIDSet;
 
     return true;
 
@@ -79,6 +78,7 @@ bool MainBuffer::removeCallIDSet (CallID set_id)
 
     if (callid_set != NULL) {
         if (_callIDMap.erase (set_id) != 0) {
+        	delete callid_set; callid_set = NULL;
             return true;
         } else {
             _debug ("removeCallIDSet error while removing callid set %s!", set_id.c_str());
@@ -146,13 +146,14 @@ bool MainBuffer::removeRingBuffer (CallID call_id)
 
     if (ring_buffer != NULL) {
         if (_ringBufferMap.erase (call_id) != 0) {
+        	delete ring_buffer;
             return true;
         } else {
-            _debug ("removeRingBuffer error while deleting ringbuffer %s!", call_id.c_str());
+            _error ("BufferManager: Error: Fail to delete ringbuffer %s!", call_id.c_str());
             return false;
         }
     } else {
-        _debug ("removeRingBuffer error ringbuffer %s does not exist!", call_id.c_str());
+        _debug ("BufferManager: Error: Ringbuffer %s does not exist!", call_id.c_str());
         return true;
     }
 }
diff --git a/sflphone-common/src/dbus/callmanager.h b/sflphone-common/src/dbus/callmanager.h
index c49f9c9c284fdbd33ce19ff253b19bffb106ddc4..8232b765a9def8e0cd10c5c0a93ff804573b3470 100644
--- a/sflphone-common/src/dbus/callmanager.h
+++ b/sflphone-common/src/dbus/callmanager.h
@@ -51,9 +51,9 @@ class CallManager
          * you will have to implement them in your ObjectAdaptor
          */
 
-	/* Call related methods */
+        /* Call related methods */
         void placeCall( const std::string& accountID, const std::string& callID, const std::string& to );
-	void placeCallFirstAccount( const std::string& callID, const std::string& to );
+        void placeCallFirstAccount( const std::string& callID, const std::string& to );
 
         void refuse( const std::string& callID );
         void accept( const std::string& callID );
@@ -61,12 +61,12 @@ class CallManager
         void hold( const std::string& callID );
         void unhold( const std::string& callID );
         void transfert( const std::string& callID, const std::string& to );
-	std::map< std::string, std::string > getCallDetails( const std::string& callID );
+        std::map< std::string, std::string > getCallDetails( const std::string& callID );
         std::vector< std::string > getCallList (void);
-	std::string getCurrentCallID(  );
+        std::string getCurrentCallID(  );
 
-	/* Conference related methods */
-	void joinParticipant( const std::string& sel_callID, const std::string& drag_callID );
+        /* Conference related methods */
+        void joinParticipant( const std::string& sel_callID, const std::string& drag_callID );
 	void addParticipant( const std::string& callID, const std::string& confID );
 	void addMainParticipant( const std::string& confID );
 	void detachParticipant( const std::string& callID );
diff --git a/sflphone-common/src/dbus/configurationmanager-introspec.xml b/sflphone-common/src/dbus/configurationmanager-introspec.xml
index df9c94f3ebc13d5dfc41377f70c4e3be17a326e5..481dfe6934968da6ae7b934963b4ff9fab64877e 100644
--- a/sflphone-common/src/dbus/configurationmanager-introspec.xml
+++ b/sflphone-common/src/dbus/configurationmanager-introspec.xml
@@ -423,9 +423,13 @@
 
 	   <method name="getCodecDetails" tp:name-for-bindings="getCodecDetails">
 		   <tp:docstring>
+		              Get specification details provided
+		              codec's RTP payload.
 		   </tp:docstring>
 		   <arg type="i" name="payload" direction="in">
 			   <tp:docstring>
+			       A list of codec specification details:
+			       Name, Samplerate, Bit rate, Bandwidth. 
 			   </tp:docstring>
 		   </arg>
 		   <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorString"/>
@@ -441,10 +445,14 @@
 		   <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorString"/>
 		   <arg type="s" name="accountID" direction="in">
 			   <tp:docstring>
+			     Currently activated codec listed as there
+			     preference. This is the list used for
+			     codec negotiation. 
 			   </tp:docstring>
 		   </arg>
 		   <arg type="as" name="list" direction="out">
 			   <tp:docstring>
+			      A list of codecs, identified by their RTP payload, delimited by '/'
 			   </tp:docstring>
 		   </arg>
 	   </method>
@@ -455,23 +463,25 @@
 		   <annotation name="com.trolltech.QtDBus.QtTypeName.In0" value="VectorString"/>
 		   <arg type="as" name="list" direction="in">
 			   <tp:docstring>
+			     Set the active codec list used for codec negotiation.
 			   </tp:docstring>
 		   </arg>
 		   <arg type="s" name="accountID" direction="in">
 			   <tp:docstring>
+			     A list of codecs, identified by their RTP payload, delimited by '/'
 			   </tp:docstring>
 		   </arg>
 	   </method>
 
 
 	   <!-- Audio devices methods -->
-
 	   <method name="getInputAudioPluginList" tp:name-for-bindings="getInputAudioPluginList">
 		   <tp:docstring>
 		   </tp:docstring>
 		   <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorString"/>
 		   <arg type="as" name="list" direction="out">
 			   <tp:docstring>
+			     
 			   </tp:docstring>
 		   </arg>
 	   </method>
diff --git a/sflphone-common/src/dbus/configurationmanager.cpp b/sflphone-common/src/dbus/configurationmanager.cpp
index b243157e772af3b07b793a7a13138b17dc846f51..a9a36eb8995bb69bdef2238cd19cf6b919aa20bf 100644
--- a/sflphone-common/src/dbus/configurationmanager.cpp
+++ b/sflphone-common/src/dbus/configurationmanager.cpp
@@ -493,7 +493,7 @@ std::vector<std::string> ConfigurationManager::getActiveCodecList(
 void ConfigurationManager::setActiveCodecList(
 		const std::vector<std::string>& list, const std::string& accountID) {
 
-	_debug ("ConfigurationManager::setActiveCodecList received");
+	_debug ("ConfigurationManager: Active codec list received");
 
 	Account *acc;
 
@@ -504,9 +504,12 @@ void ConfigurationManager::setActiveCodecList(
 	}
 }
 
+
 // Audio devices related methods
 std::vector<std::string> ConfigurationManager::getInputAudioPluginList() {
 
+	_debug("ConfigurationManager: Active codec list received");
+
 	std::vector<std::string> v;
 
 	v.push_back("default");
@@ -516,6 +519,8 @@ std::vector<std::string> ConfigurationManager::getInputAudioPluginList() {
 	return v;
 }
 
+
+
 std::vector<std::string> ConfigurationManager::getOutputAudioPluginList() {
 
 	std::vector<std::string> v;
@@ -526,6 +531,7 @@ std::vector<std::string> ConfigurationManager::getOutputAudioPluginList() {
 	return v;
 }
 
+
 void ConfigurationManager::setInputAudioPlugin(const std::string& audioPlugin) {
 	return Manager::instance().setInputAudioPlugin(audioPlugin);
 }
diff --git a/sflphone-common/src/dbus/dbusmanagerimpl.cpp b/sflphone-common/src/dbus/dbusmanagerimpl.cpp
index bfcc237ca369d02225fefb68023f0a62bc2877cc..ef0b342aac91584610dbc9fcb5710517dbc290a4 100644
--- a/sflphone-common/src/dbus/dbusmanagerimpl.cpp
+++ b/sflphone-common/src/dbus/dbusmanagerimpl.cpp
@@ -60,5 +60,13 @@ DBusManagerImpl::exit()
 
     _dispatcher.leave();
 
+    delete _callManager;
+    delete _configurationManager;
+    delete _instanceManager;
+
+#ifdef USE_NETWORKMANAGER
+    delete _networkManager;
+#endif
+
 }
 
diff --git a/sflphone-common/src/history/historymanager.cpp b/sflphone-common/src/history/historymanager.cpp
index 1fb5b991547caf37acb6bafa18753e2789090cdb..ac5188c30b6e876ca35acc8ee7d788df204c7e60 100644
--- a/sflphone-common/src/history/historymanager.cpp
+++ b/sflphone-common/src/history/historymanager.cpp
@@ -32,9 +32,18 @@ HistoryManager::HistoryManager ()
 
 HistoryManager::~HistoryManager ()
 {
+	 HistoryItemMap::iterator iter = _history_items.begin();
+
+	 HistoryItem * item;
+	 while(iter != _history_items.end()){
+		 item = iter->second;
+		 delete item;
+		 iter++;
+	 }
 
     // Clear the history map
     _history_items.clear ();
+
 }
 
 int HistoryManager::load_history (int limit, std::string path)
diff --git a/sflphone-common/src/managerimpl.cpp b/sflphone-common/src/managerimpl.cpp
index f0ba7bd4516d46e9cebcb028b27178fb9db4df81..9b28e568e16ed6f97a26417a017e5d47a1b97bc6 100644
--- a/sflphone-common/src/managerimpl.cpp
+++ b/sflphone-common/src/managerimpl.cpp
@@ -91,9 +91,10 @@ ManagerImpl::ManagerImpl (void) :
 // never call if we use only the singleton...
 ManagerImpl::~ManagerImpl (void) {
 	// terminate();
-	delete _cleaner;
-	_cleaner = 0;
-	_debug ("%s stop correctly.", PROGNAME);
+	delete _cleaner; _cleaner = NULL;
+	delete _history; _history = NULL;
+
+	_debug ("Manager: %s stop correctly.", PROGNAME);
 }
 
 void ManagerImpl::init () {
@@ -104,7 +105,7 @@ void ManagerImpl::init () {
 	initVolume();
 
 	if (_exist == 0) {
-		_debug ("Cannot create config file in your home directory");
+		_warn ("Manager: Cannot create config file in your home directory");
 	}
 
 	initAudioDriver();
@@ -119,11 +120,11 @@ void ManagerImpl::init () {
 	if (audiolayer != 0) {
 		unsigned int sampleRate = audiolayer->getSampleRate();
 
-		_debugInit ("Load Telephone Tone");
+		_debugInit ("Manager: Load telephone tone");
 		std::string country = getConfigString(PREFERENCES, ZONE_TONE);
 		_telephoneTone = new TelephoneTone(country, sampleRate);
 
-		_debugInit ("Loading DTMF key");
+		_debugInit ("Manager: Loading DTMF key");
 		_dtmfKey = new DTMF(sampleRate);
 	}
 
@@ -135,23 +136,25 @@ void ManagerImpl::init () {
 }
 
 void ManagerImpl::terminate () {
-	_debug ("ManagerImpl::terminate ");
+
+	_debug ("Manager: Terminate ");
 	saveConfig();
 
 	unloadAccountMap();
 
-	_debug ("Unload DTMF Key ");
+	_debug ("Manager: Unload DTMF key");
 	delete _dtmfKey;
 
-	_debug ("Unload Audio Driver ");
-	delete _audiodriver;
-	_audiodriver = NULL;
+	_debug("Manager: Unload telephone tone");
+	delete _telephoneTone; _telephoneTone = NULL;
+
+	_debug ("Manager: Unload audio driver");
+	delete _audiodriver; _audiodriver = NULL;
 
-	_debug ("Unload Telephone Tone ");
-	delete _telephoneTone;
-	_telephoneTone = NULL;
+	_debug ("Manager: Unload telephone tone");
+	delete _telephoneTone; _telephoneTone = NULL;
 
-	_debug ("Unload Audio Codecs ");
+	_debug ("Manager: Unload audio codecs ");
 	_codecDescriptorMap.deleteHandlePointer();
 
 }
@@ -179,38 +182,6 @@ void ManagerImpl::switchCall (const CallID& id) {
 	ost::MutexLock m(_currentCallMutex);
 	_debug ("----- Switch current call id to %s -----", id.c_str());
 	_currentCallId2 = id;
-
-	/*
-	 AudioLayer *al = getAudioDriver();
-
-	 if (id != "") {
-
-	 if(isConference(id)) {
-
-	 Conference *conf;
-
-	 ConferenceMap::iterator iter = _conferencemap.find(id);
-	 if(iter != _conferencemap.end())
-	 {
-	 _debug("    set call recordable in audio layer");
-	 conf = iter->second;
-	 al->setRecorderInstance((Recordable*)conf);
-	 }
-	 }
-	 else {
-
-	 // set the recordable instance in audiolayer
-	 AccountID account_id = getAccountFromCall(id);
-
-
-	 Call *call = NULL;
-	 call = getAccountLink (account_id)->getCall(id);
-
-	 _debug("    set call recordable in audio layer");
-	 al->setRecorderInstance((Recordable*)call);
-	 }
-	 }
-	 */
 }
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -220,11 +191,12 @@ void ManagerImpl::switchCall (const CallID& id) {
 
 bool ManagerImpl::outgoingCall (const std::string& account_id,
 		const CallID& call_id, const std::string& to) {
+
 	std::string pattern, to_cleaned;
 	Call::CallConfiguration callConfig;
 	SIPVoIPLink *siplink;
 
-	_debug ("ManagerImpl::outgoingCall(%s)", call_id.c_str());
+	_debug ("Manager: New outgoing call %s", call_id.c_str());
 
 	CallID current_call_id = getCurrentCallId();
 
@@ -258,7 +230,7 @@ bool ManagerImpl::outgoingCall (const std::string& account_id,
 	}
 
 	if (callConfig == Call::IPtoIP) {
-		_debug ("    outgoingCall: Start IP to IP call");
+		_debug ("Manager: Start IP to IP call");
 		/* We need to retrieve the sip voiplink instance */
 		siplink = SIPVoIPLink::instance("");
 
@@ -273,16 +245,16 @@ bool ManagerImpl::outgoingCall (const std::string& account_id,
 	}
 
 	if (!accountExists(account_id)) {
-		_debug ("! Manager Error: Outgoing Call: account doesn't exist");
+		_error ("Manager: Error: Account doesn't exist in new outgoing call");
 		return false;
 	}
 
 	if (getAccountFromCall(call_id) != AccountNULL) {
-		_debug ("! Manager Error: Outgoing Call: call id already exists");
+		_error ("Manager: Error: Call id already exists in outgoing call");
 		return false;
 	}
 
-	_debug ("- Manager Action: Adding Outgoing Call %s on account %s", call_id.data(), account_id.data());
+	_debug ("Manager: Action: Adding Outgoing Call %s on account %s", call_id.data(), account_id.data());
 
 	associateCallToAccount(call_id, account_id);
 
@@ -291,7 +263,7 @@ bool ManagerImpl::outgoingCall (const std::string& account_id,
 		return true;
 	} else {
 		callFailure(call_id);
-		_debug ("! Manager Error: An error occur, the call was not created");
+		_debug ("Manager: Error: An error occur, the call was not created");
 	}
 
 	return false;
@@ -419,12 +391,11 @@ bool ManagerImpl::hangupCall (const CallID& call_id) {
 	else {
 		account_id = getAccountFromCall(call_id);
 
+		// Account may be NULL if call have not been sent yet
 		if (account_id == AccountNULL) {
-
 			_error ("Manager: Error: account id is NULL in hangup");
 			returnValue = false;
 		} else {
-
 			returnValue = getAccountLink(account_id)->hangup(call_id);
 			removeCallAccount(call_id);
 		}
@@ -1066,11 +1037,26 @@ void ManagerImpl::joinParticipant (const CallID& call_id1, const CallID& call_id
 
 	_debug ("Manager: Join participants %s, %s", call_id1.c_str(), call_id2.c_str());
 
+
+
 	std::map<std::string, std::string> call1_details = getCallDetails(call_id1);
 	std::map<std::string, std::string> call2_details = getCallDetails(call_id2);
 
 	std::map<std::string, std::string>::iterator iter_details;
 
+	// Test if we have valid call ids
+	iter_details = call1_details.find("PEER_NUMBER");
+	if(iter_details->second == "Unknown") {
+		_error("Manager: Error: Id %s is not a valid call", call_id1.c_str());
+		return;
+	}
+
+	iter_details = call2_details.find("PEER_NUMBER");
+	if(iter_details->second == "Unknown") {
+		_error("Manager: Error: Id %s is not a valid call", call_id2.c_str());
+		return;
+	}
+
 	AccountID currentAccountId;
 	Call* call = NULL;
 
@@ -1206,7 +1192,7 @@ void ManagerImpl::detachParticipant (const CallID& call_id,
 }
 
 void ManagerImpl::removeParticipant (const CallID& call_id) {
-	_debug ("ManagerImpl::removeParticipant(%s)", call_id.c_str());
+	_debug ("Manager: Remove participant %s", call_id.c_str());
 
 	// TODO: add conference_id as a second parameter
 	Conference* conf;
@@ -1295,7 +1281,7 @@ void ManagerImpl::processRemainingParticipant (CallID current_call_id,
 
 void ManagerImpl::joinConference (const CallID& conf_id1,
 		const CallID& conf_id2) {
-	_debug ("ManagerImpl::joinConference(%s, %s)", conf_id1.c_str(), conf_id2.c_str());
+	_debug ("Manager: Join conference %s, %s", conf_id1.c_str(), conf_id2.c_str());
 
 	ConferenceMap::iterator iter;
 
@@ -1304,13 +1290,23 @@ void ManagerImpl::joinConference (const CallID& conf_id1,
 
 	iter = _conferencemap.find(conf_id1);
 
-	if (iter != _conferencemap.end())
+	if (iter != _conferencemap.end()) {
 		conf1 = iter->second;
+	}
+	else {
+		_error("Manager: Error: Not a valid conference ID");
+		return;
+	}
 
 	iter = _conferencemap.find(conf_id2);
 
-	if (iter != _conferencemap.end())
+	if (iter != _conferencemap.end()) {
 		conf2 = iter->second;
+	}
+	else {
+		_error("Manager: Error: Not a valid conference ID");
+		return;
+	}
 
 	ParticipantSet participants = conf1->getParticipantList();
 
@@ -1769,12 +1765,11 @@ void ManagerImpl::connectionStatusNotification () {
  * Multi Thread
  */
 bool ManagerImpl::playATone (Tone::TONEID toneId) {
+
 	bool hasToPlayTone;
-	// AudioLoop *audioloop;
 	AudioLayer *audiolayer;
-	// unsigned int nbSamples;
 
-	_debug ("ManagerImpl::playATone");
+	// _debug ("Manager: Play tone %d", toneId);
 
 	hasToPlayTone = getConfigBool(SIGNALISATION, PLAY_TONES);
 
@@ -1793,17 +1788,6 @@ bool ManagerImpl::playATone (Tone::TONEID toneId) {
 		_toneMutex.enterMutex();
 		_telephoneTone->setCurrentTone(toneId);
 		_toneMutex.leaveMutex();
-		/*
-		 audioloop = getTelephoneTone();
-		 nbSamples = audioloop->getSize();
-		 SFLDataFormat buf[nbSamples];
-
-
-		 if (audiolayer) {
-		 audiolayer->putUrgent (buf, nbSamples);
-		 } else
-		 return false;
-		 */
 	}
 
 	return true;
@@ -1826,10 +1810,6 @@ void ManagerImpl::stopTone () {
 		_telephoneTone->setCurrentTone(Tone::TONE_NULL);
 	}
 
-	_toneMutex.leaveMutex();
-
-	// for ringing tone..
-	_toneMutex.enterMutex();
 	_audiofile.stop();
 	_toneMutex.leaveMutex();
 }
@@ -1861,8 +1841,6 @@ void ManagerImpl::congestion () {
  * Multi Thread
  */
 void ManagerImpl::ringback () {
-	_debug ("ManagerImpl::ringback");
-
 	playATone(Tone::TONE_RINGTONE);
 }
 
@@ -1870,14 +1848,14 @@ void ManagerImpl::ringback () {
  * Multi Thread
  */
 void ManagerImpl::ringtone () {
-
-	_debug ("Manager: Start ringtone");
 	std::string ringchoice;
 	AudioLayer *audiolayer;
 	AudioCodec *codecForTone;
 	int layer, samplerate;
 	bool loadFile;
 
+	_debug("Manager: Ringtone");
+
 	if (isRingtoneEnabled()) {
 
 		_debug ("Manager: Tone is enabled");
@@ -2342,7 +2320,7 @@ void ManagerImpl::setOutputAudioPlugin (const std::string& audioPlugin) {
 
 	int res;
 
-	_debug ("Set output audio plugin");
+	_debug ("Manager: Set output audio plugin");
 	_audiodriver -> setErrorMessage(-1);
 	res = _audiodriver -> openDevice(_audiodriver -> getIndexIn(),
 			_audiodriver -> getIndexOut(), _audiodriver -> getSampleRate(),
@@ -2360,7 +2338,7 @@ void ManagerImpl::setOutputAudioPlugin (const std::string& audioPlugin) {
  * Get list of supported audio output device
  */
 std::vector<std::string> ManagerImpl::getAudioOutputDeviceList (void) {
-	_debug ("Get audio output device list");
+	_debug ("Manager: Get audio output device list");
 	AlsaLayer *layer;
 	std::vector<std::string> devices;
 
@@ -3208,7 +3186,7 @@ std::map<std::string, std::string> ManagerImpl::getAccountDetails (
 	a.insert(std::pair<std::string, std::string>(ACCOUNT_DTMF_TYPE, getConfigString(
 				accountID, ACCOUNT_DTMF_TYPE)));
 
-	RegistrationState state;
+	RegistrationState state = Unregistered;
 	std::string registrationStateCode;
 	std::string registrationStateDescription;
 
@@ -3225,8 +3203,6 @@ std::map<std::string, std::string> ManagerImpl::getAccountDetails (
 			registrationStateDescription
 					= account->getRegistrationStateDetailed().second;
 		}
-	} else {
-		state = Unregistered;
 	}
 
 	(accountID == IP2IP_PROFILE) ? a.insert(
diff --git a/sflphone-common/src/sip/sdp.cpp b/sflphone-common/src/sip/sdp.cpp
index 5b3066212a5cb1696816960df034e126ab5b7ac4..c71ee5ab4095f5e85bccdc324d2f1a052554fe6e 100644
--- a/sflphone-common/src/sip/sdp.cpp
+++ b/sflphone-common/src/sip/sdp.cpp
@@ -50,7 +50,11 @@ Sdp::Sdp (pj_pool_t *pool)
     _pool = pool;
 }
 
-Sdp::~Sdp() { }
+Sdp::~Sdp()
+{
+	clean_session_media();
+	clean_local_media_capabilities();
+}
 
 void Sdp::set_media_descriptor_line (sdpMedia *media, pjmedia_sdp_media** p_med) {
 
@@ -457,7 +461,39 @@ std::string Sdp::media_to_string (void)
 
 void Sdp::clean_session_media()
 {
-    _session_media.clear();
+	_info("SDP: Clean session media");
+
+	if(_session_media.size() > 0) {
+
+		std::vector<sdpMedia *>::iterator iter = _session_media.begin();
+	    sdpMedia *media;
+
+		while(iter != _session_media.end()) {
+			media = *iter;
+			delete media;
+			iter++;
+		}
+		_session_media.clear();
+	}
+}
+
+
+void Sdp::clean_local_media_capabilities()
+{
+	_info("SDP: Clean local media capabilities");
+
+	if(_local_media_cap.size() > 0) {
+
+		std::vector<sdpMedia *>::iterator iter = _local_media_cap.begin();
+			sdpMedia *media;
+
+			while(iter != _local_media_cap.end()) {
+				media = *iter;
+				delete media;
+				iter++;
+			}
+			_local_media_cap.clear();
+	}
 }
 
 void Sdp::set_negotiated_sdp (const pjmedia_sdp_session *sdp)
@@ -518,7 +554,7 @@ AudioCodec* Sdp::get_session_media (void)
     AudioCodec *codec = NULL;
     std::vector<sdpMedia*> media_list;
 
-    _debug ("Executing sdp line %d - get_session_media ()", __LINE__);
+    _debug ("SDP: Executing sdp line %d - get_session_media()", __LINE__);
 
     media_list = get_session_media_list ();
     nb_media = media_list.size();
@@ -596,7 +632,7 @@ void Sdp::set_local_media_capabilities (CodecOrder selectedCodecs) {
     // Clean it first
     _local_media_cap.clear();
 
-    _debug ("Fetch local media capabilities. Local extern audio port: %i" , get_local_extern_audio_port());
+    _debug ("SDP: Fetch local media capabilities. Local extern audio port: %i" , get_local_extern_audio_port());
 
     /* Only one audio media used right now */
     audio = new sdpMedia (MIME_TYPE_AUDIO);
@@ -612,7 +648,7 @@ void Sdp::set_local_media_capabilities (CodecOrder selectedCodecs) {
             audio->add_codec (iter->second);
         }
 		else {
-			_warn ("Couldn't find audio codec");
+			_warn ("SDP: Couldn't find audio codec");
 		}
 	}
 
diff --git a/sflphone-common/src/sip/sdp.h b/sflphone-common/src/sip/sdp.h
index 8c81168adfd7d4ad76befbf5b10450b58f8e9459..b823609f4522457aaadbbab8a5763d42b530a1e3 100644
--- a/sflphone-common/src/sip/sdp.h
+++ b/sflphone-common/src/sip/sdp.h
@@ -135,10 +135,15 @@ class Sdp {
         
         pj_status_t check_sdp_answer(pjsip_inv_session *inv, pjsip_rx_data *rdata);
         
-        /*
+        /**
          * Remove all media in the session media vector.
          */
-        void clean_session_media();
+        void clean_session_media(void);
+
+        /**
+         * Remove all media in local media capability vector
+         */
+		void clean_local_media_capabilities(void);
 
         /*
          * Return a string description of the media added to the session,
diff --git a/sflphone-common/src/sip/sdpmedia.cpp b/sflphone-common/src/sip/sdpmedia.cpp
index 4cd5a8b99c7f9b3e99a3134ab3f0b470f660b9e4..eaed9dfda3ee80ca55912baa958bfe9b3d294ce4 100644
--- a/sflphone-common/src/sip/sdpmedia.cpp
+++ b/sflphone-common/src/sip/sdpmedia.cpp
@@ -75,10 +75,7 @@ sdpMedia::sdpMedia (std::string type, int port, std::string dir)
 
 sdpMedia::~sdpMedia()
 {
-    int i;
-
-    for (i=0; i< (int) _codec_list.size(); i++)
-        delete _codec_list[i];
+	clear_codec_list();
 }
 
 
@@ -99,7 +96,6 @@ std::string sdpMedia::get_media_type_str (void)
 
 void sdpMedia::add_codec (AudioCodec* codec)
 {
-
     _codec_list.push_back (codec);
 }
 
diff --git a/sflphone-common/src/sip/sipvoiplink.cpp b/sflphone-common/src/sip/sipvoiplink.cpp
index c1e298a957663f82796b51941d7f47d0bb641a90..069e26cb419498f537802eb58534c9311b33c79c 100644
--- a/sflphone-common/src/sip/sipvoiplink.cpp
+++ b/sflphone-common/src/sip/sipvoiplink.cpp
@@ -289,8 +289,8 @@ void SIPVoIPLink::decrementClients (void)
     if (_clients == 0) {
 
         _debug("UserAgent: No SIP account anymore, terminate SIPVoIPLink");
-        terminate();
-        SIPVoIPLink::_instance=NULL;
+        // terminate();
+        delete SIPVoIPLink::_instance;
     }
 }
 
@@ -321,8 +321,7 @@ SIPVoIPLink::terminate()
 
     if (_evThread) {
         _debug ("UserAgent: Deleting sip eventThread");
-        delete _evThread;
-        _evThread = NULL;
+        delete _evThread; _evThread = NULL;
     }
 
 
@@ -420,6 +419,8 @@ std::string SIPVoIPLink::getInterfaceAddrFromName(std::string ifaceName) {
 
     std::string addr(pj_inet_ntoa(*((pj_in_addr*)addr_in)));
 
+    close(fd);
+
     return addr;
 }
 
@@ -2975,7 +2976,6 @@ void call_on_state_changed (pjsip_inv_session *inv, pjsip_event *e)
     _debug ("UserAgent: Call state changed to %s", invitationStateMap[inv->state]);
 
     pjsip_rx_data *rdata;
-    pj_status_t status = PJ_SUCCESS;
 
     /* Retrieve the call information */
     SIPCall * call = NULL;
@@ -3274,14 +3274,14 @@ void call_on_media_update (pjsip_inv_session *inv, pj_status_t status)
 	AudioCodec* audiocodec = Manager::instance().getCodecDescriptorMap().instantiateCodec(pl);
 
 	if (audiocodec == NULL)
-		_error ("SIP: No audiocodec found");
+		_error ("UserAgent: No audiocodec found");
 
 
     try {
         call->setAudioStart (true);
         call->getAudioRtp()->start(audiocodec);
     } catch (exception& rtpException) {
-        _debug ("%s", rtpException.what());
+        _error ("UserAgent: Error: %s", rtpException.what());
     }
 
 }
diff --git a/sippxml/ip2ip_uas_recv_peer_hungup.xml b/sippxml/ip2ip_uas_recv_peer_hungup.xml
index 9f2721f5dc71742819d4d39003fc1279b0cd18db..04a964cd1c6900b66af0e563f95054df66b0aff8 100644
--- a/sippxml/ip2ip_uas_recv_peer_hungup.xml
+++ b/sippxml/ip2ip_uas_recv_peer_hungup.xml
@@ -49,6 +49,9 @@
  <recv request="ACK" optional="true" rtd="true" crlf="true">
  </recv>
 
+ <recv request="INVITE" optional="true">
+ </recv>
+
  <recv request="BYE">
  </recv>
 
@@ -67,8 +70,6 @@
    ]]>
  </send>
 
- <pause milliseconds="4000"/>
-
 
  <ResponseTimeRepartition value="10, 20, 30, 40, 50, 100, 150, 200"/>
 
diff --git a/sippxml/testsuiteuac.sh b/sippxml/testsuiteuac.sh
index fb6359edf83a3be5a71492adc86d351abd02fdcc..93975593688f3d7d2242bdf7dfe0abb732abe7a5 100644
--- a/sippxml/testsuiteuac.sh
+++ b/sippxml/testsuiteuac.sh
@@ -251,6 +251,52 @@ function test_ip2ip_send_refused {
 }
 
 
+# SCENARIO 6 Test 1
+function test_mult_ip2ip_send_hangup {
+
+    # start sflphoned
+    # /usr/lib/sflphone/sflphoned& 
+
+    # start sipp server to receive calls from sflphone
+    sipp -sf ip2ip_uac_send_hangup.xml 127.0.0.1:5060 -i 127.0.0.1 -p 5062 -l 1 -m 10 
+    sipp -sf ip2ip_uac_send_hangup.xml 127.0.0.1:5060 -i 127.0.0.1 -p 5064 -l 1 -m 10
+    sipp -sf ip2ip_uac_send_hangup.xml 127.0.0.1:5060 -i 127.0.0.1 -p 5066 -l 1 -m 10
+    # sipp -sf ip2ip_uac_send_hangup.xml ${REMOTEADDR_lo} -i ${LOCALIP_lo} -p ${LOCALPORT} -l 1 -m 10
+
+    # wait some time to make sure sflphoned is started
+    # sleep 1;
+
+    # run python client and script to make calls
+    # python ../tools/pysflphone/pysflphone_testdbus.py &
+
+    # kill every one
+    # bashtrap
+}
+
+
+# SCENARIO 6 Test 2
+function test_mult_ip2ip_recv_peer_hangup {
+
+    # start sflphoned
+    # /usr/lib/sflphone/sflphoned& 
+
+    # start sipp server to receive calls from sflphone
+    sipp -sf ip2ip_uac_send_hangup.xml 127.0.0.1 -i 127.0.0.1:5060 -p 5062
+    sipp -sf ip2ip_uac_send_hangup.xml 127.0.0.1 -i 127.0.0.1:5060 -p 5064
+    sipp -sf ip2ip_uac_send_hangup.xml 127.0.0.1 -i 127.0.0.1:5060 -p 5066
+    # sipp -sf ip2ip_uas_recv_peer_hungup.xml ${REMOTEADDR_lo} -i ${LOCALIP_lo} -p ${LOCALPORT}
+
+    # wait some time to make sure sflphoned is started
+    # sleep 1;
+
+    # run python client and script to make calls
+    # python ../tools/pysflphone/pysflphone_testdbus.py &
+
+    # kill every one
+    # bashtrap
+}
+
+
 # function called if CTRL-C detected 
 bashtrap()
 {
@@ -267,7 +313,7 @@ bashtrap()
 
 # Test 1: - Send an IP2IP call
 #         - Hangup
-# test_ip2ip_send_hangup
+test_ip2ip_send_hangup
 
 # Test 2: - Send an IP2IP call
 #         - Peer Hangup
@@ -299,7 +345,7 @@ bashtrap()
 
 # Test 4: - Receive an ACCOUNT call
 #         - Peer Hangup
-test_account_recv_peer_hungup
+# test_account_recv_peer_hungup
 
 
 
@@ -313,7 +359,7 @@ test_account_recv_peer_hungup
 
 
 
-# SCENARIO 4:  Transfer calls (Account)
+# SCENARIO 4: Transfer calls (Account)
 
 # Test 1: - Send an IP2IP call
 #         - Transfer this call to another sipp instance
@@ -325,4 +371,13 @@ test_account_recv_peer_hungup
 
 # Test 1: - Receive a call
 #         - Refuse (hangup without answer)
-# test_ip2ip_send_refused
\ No newline at end of file
+# test_ip2ip_send_refused
+
+
+#SCENARIO 6: Multiple simultaneous Call
+
+# Test 1: -
+# test_mult_ip2ip_send_hangup
+
+# Test 2: -
+# test_mult_ip2ip_recv_peer_hangup
\ No newline at end of file
diff --git a/tools/pysflphone/pysflphone_testdbus.py b/tools/pysflphone/pysflphone_testdbus.py
index 035b20a27fbe71639aabe999fe4abf59f00eea8f..991435e1ad484cb436c6c42d7bdc40ecae20a5eb 100644
--- a/tools/pysflphone/pysflphone_testdbus.py
+++ b/tools/pysflphone/pysflphone_testdbus.py
@@ -15,6 +15,8 @@ from sflphonectrlsimple import SflPhoneCtrlSimple
 
 # Define remote IP address constant
 REMOTEADDR_lo="127.0.0.1:5062"
+REMOTEADDR_lo2="127.0.0.1:5064"
+REMOTEADDR_lo3="127.0.0.1:5066"
 
 # Defines phone numbers
 PHONE1="27182"
@@ -95,7 +97,7 @@ class SflPhoneTests():
     def test_ip2ip_send_hangup(self):
         """Make a call to a server (sipp) on port 5062"""
         i = 0
-        while(i < 10):
+        while(i < 200):
 
             callid = self.sflphone.Call("sip:test@" + REMOTEADDR_lo)
             time.sleep(0.5)
@@ -105,6 +107,7 @@ class SflPhoneTests():
 
             i = i+1
 
+        self.sflphone.unregister()
         del self.sflphone
 
 
@@ -249,6 +252,48 @@ class SflPhoneTests():
         self.sflphone.start()
 
 
+    # SCENARIO 6 Test 1
+    def test_mult_ip2ip_send_hangup(self):
+        """Make a first call to a sipp server (5062) and a second to sipp server (5064)"""
+        i = 0
+        while(i < 500):
+
+            callid1 = self.sflphone.Call("sip:test@" + REMOTEADDR_lo)
+            time.sleep(0.1)
+
+            callid2 = self.sflphone.Call("sip:test@" + REMOTEADDR_lo2)
+            time.sleep(0.1)
+
+            callid3 = self.sflphone.Call("sip:test@" + REMOTEADDR_lo3)
+            time.sleep(0.1)
+            
+            self.sflphone.HangUp(callid1)            
+            time.sleep(0.1)
+
+            self.sflphone.HangUp(callid2)            
+            time.sleep(0.1)
+
+            self.sflphone.HangUp(callid3)            
+            time.sleep(0.1)
+
+            i = i+1
+
+        del self.sflphone
+
+
+    # SCENARIO 6 Test 2
+    def test_mult_ip2ip_send_hangup(self):
+        """Receive multiple calls peer hangup"""
+
+        # Add callback for this test
+        self.sflphone.onIncomingCall_cb = acceptOnIncomingCall
+
+        # Start Glib mainloop
+        self.sflphone.start()
+
+        del self.sflphone
+
+
 
 # Open sflphone and connect to sflphoned through dbus
 sflphone = SflPhoneCtrlSimple(True)
@@ -268,7 +313,7 @@ sflphone.setFirstRegisteredAccount();
 
 # Test 1: - Send an IP2IP call
 #         - Hangup
-# testsuite.test_ip2ip_send_hangup()
+testsuite.test_ip2ip_send_hangup()
 
 # Test 2: - Send an IP2IP call
 #         - Peer Hangup
@@ -300,7 +345,7 @@ sflphone.setFirstRegisteredAccount();
 
 # Test 4: - Receive an ACCOUNT call
 #         - Peer Hangup
-testsuite.test_account_recv_peer_hungup()
+# testsuite.test_account_recv_peer_hungup()
 
 
 
@@ -328,3 +373,15 @@ testsuite.test_account_recv_peer_hungup()
 # Test 1: - Receive an incoming call
 #         - Hangup without answer
 # testsuite.test_ip2ip_recv_refuse()
+
+
+
+# SCENARIO 6: Multiple simultaneous calls
+
+# Test 1: - Send multiple simultaneous IP2IP call
+#         - Hangup
+# testsuite.test_mult_ip2ip_send_hangup()
+
+# Test 2: - Receive simultaneous IP2IP call
+#         - Hangup
+# testsuite.test_mult_ip2ip_send_hangup()
diff --git a/tools/pysflphone/sflphonectrlsimple.py b/tools/pysflphone/sflphonectrlsimple.py
index 491e105e8256fb6314c80b95b081fb0d5c7f75fc..fdf6772e3ff010258eee72dd7f2ac3200ef60fbd 100755
--- a/tools/pysflphone/sflphonectrlsimple.py
+++ b/tools/pysflphone/sflphonectrlsimple.py
@@ -136,6 +136,8 @@ class SflPhoneCtrlSimple(Thread):
 
     def unregister(self):
 
+        print "Unregister"
+
         if not self.registered:
             return
             #raise SflPhoneError("Not registered !")