diff --git a/src/audio/audiolayer.cpp b/src/audio/audiolayer.cpp
index 6fb0cedae8c74d780661778c6719a153541ba0be..ae613f7d5425c693ac904b60316051ec2e922ae9 100644
--- a/src/audio/audiolayer.cpp
+++ b/src/audio/audiolayer.cpp
@@ -53,8 +53,7 @@ AudioLayer::closeStream (void)
   ost::MutexLock guard(_mutex);
   if(_stream) {
     _stream->close();
-    delete _stream;
-    _stream = 0;
+    delete _stream; _stream = NULL;
   }
 }
 
diff --git a/src/audio/audiortp.cpp b/src/audio/audiortp.cpp
index 11d43660030331acb5496eaa1507e7a9f22ed47f..2fb35fd7ae94872d947cf54065488763da9b2c01 100644
--- a/src/audio/audiortp.cpp
+++ b/src/audio/audiortp.cpp
@@ -48,8 +48,7 @@ AudioRtp::AudioRtp () {
 }
 
 AudioRtp::~AudioRtp (void) {
-	delete _RTXThread;
-  _RTXThread = NULL;
+	delete _RTXThread; _RTXThread = NULL;
 }
 
 int 
@@ -86,8 +85,7 @@ AudioRtp::closeRtpSession (SipCall *ca) {
 
 		if (_RTXThread != NULL) {
       _debug("Thread: stop AudioRTP for sipcall: %d\n", ca->getId());
-			delete _RTXThread;
-			_RTXThread = NULL;
+			delete _RTXThread; _RTXThread = NULL;
 		}
 	}
 }
@@ -289,12 +287,9 @@ AudioRtpRTX::receiveSessionForSpkr (int16* data_for_speakers,
 
 	Manager::instance().getAudioDriver()->startStream();
 	
-  delete ac;
-  ac = NULL;
-	delete cd;
-  cd = NULL;
-	delete adu;
-  adu = NULL;
+  delete ac;  ac = NULL;
+	delete cd;  cd = NULL;
+	delete adu; adu = NULL;
 }
 
 void
diff --git a/src/audio/dtmfgenerator.cpp b/src/audio/dtmfgenerator.cpp
index 84abbf717e57c927a985ca5a62e1d2ae1ecd89af..ffe7b7121bf8393cae46c14266c950751fce71f2 100644
--- a/src/audio/dtmfgenerator.cpp
+++ b/src/audio/dtmfgenerator.cpp
@@ -85,8 +85,7 @@ DTMFGenerator::DTMFGenerator(): ToneGenerator ()
 
 DTMFGenerator::~DTMFGenerator() {
 	for(int i = 0; i < NUM_TONES; i++) {
-		delete[] samples[i];
-    samples[i] = NULL;
+		delete[] samples[i]; samples[i] = NULL;
 	}
 }
 
diff --git a/src/audio/pacpp/example/sine.cxx b/src/audio/pacpp/example/sine.cxx
index 577a24724f76fccf0a420e85df4535b5b446eee2..d13f765f935f0c3c63bfac21d54919c9b7c28bc2 100644
--- a/src/audio/pacpp/example/sine.cxx
+++ b/src/audio/pacpp/example/sine.cxx
@@ -32,7 +32,7 @@ public:
 
 	~SineGenerator()
 	{
-		delete[] table_;
+		delete[] table_; table_ = NULL;
 	}
 
 	int generate(const void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer, 
diff --git a/src/audio/ringbuffer.cpp b/src/audio/ringbuffer.cpp
index 138ae2f24c2e03157e3114507f156827b8ec770a..54168f31dce3783f25e9ced2738a75f4d596a225 100644
--- a/src/audio/ringbuffer.cpp
+++ b/src/audio/ringbuffer.cpp
@@ -44,8 +44,8 @@ RingBuffer::RingBuffer(int size) {
 
 // Free memory on object deletion
 RingBuffer::~RingBuffer() {
-   delete[] mBlank;   mBlank  = 0;
-   delete[] mBuffer;  mBuffer = 0;
+   delete[] mBlank;   mBlank  = NULL;
+   delete[] mBuffer;  mBuffer = NULL;
 }
  
 void
diff --git a/src/audio/tonegenerator.cpp b/src/audio/tonegenerator.cpp
index fc01b16d511230d1da1858b0b814e74adbd9dfe8..aeead88ce7f224c36974f25086e3f2194f5bcdd4 100644
--- a/src/audio/tonegenerator.cpp
+++ b/src/audio/tonegenerator.cpp
@@ -47,7 +47,7 @@ ToneThread::ToneThread (int16 *buf, int size) : Thread () {
 }
 
 ToneThread::~ToneThread (void) {
-	delete[] buf_ctrl_vol;
+	delete[] buf_ctrl_vol; buf_ctrl_vol=NULL;
 }
 
 void
@@ -102,14 +102,10 @@ ToneGenerator::ToneGenerator () {
 }
 
 ToneGenerator::~ToneGenerator (void) {
-	delete tonethread;
-  tonethread = 0;
-  delete [] _dst;
-  _dst = 0;
-  delete [] _src;
-  _src = 0;
-  delete _ulaw;
-  _ulaw = 0;
+	delete tonethread; tonethread = 0;
+  delete [] _dst;    _dst = 0;
+  delete [] _src;    _src = 0;
+  delete _ulaw;      _ulaw = 0;
 }
 
 /**
@@ -264,7 +260,7 @@ ToneGenerator::buildTone (unsigned int idCountry, unsigned int idTones, int16* t
 		totalbytes = byte;
 	}
 */
-	delete[] buffer;
+	delete[] buffer; buffer=NULL;
 }
 
 /**
@@ -333,8 +329,7 @@ ToneGenerator::stopTone() {
 
   // we end the last thread
   _debug("Thread: stop tonethread\n");
-  delete tonethread;
-  tonethread = NULL;
+  delete tonethread; tonethread = NULL;
 
   // we flush the main buffer (with blank)
   Manager::instance().getAudioDriver()->mainSndRingBuffer().flush();
@@ -348,8 +343,8 @@ ToneGenerator::playRingtone (const char *fileName) {
   if (tonethread != NULL) {
     stopTone();
   }
-  delete [] _dst;
-  delete [] _src;
+  delete [] _dst; _dst = NULL;
+  delete [] _src; _src = NULL;
 
 	int expandedsize, length;
 
diff --git a/src/config/config.cpp b/src/config/config.cpp
index 8a52ab83d544d23506df0efffc08d57bd385b87a..a1e748cfa4ab972b971b37b0bb3aec9fa67cc475 100644
--- a/src/config/config.cpp
+++ b/src/config/config.cpp
@@ -33,8 +33,7 @@ ConfigTree::~ConfigTree()
   // erase every new ItemMap (by CreateSection)
   SectionMap::iterator iter = _sections.begin();
   while(iter != _sections.end()) {
-    delete iter->second;
-    iter->second = NULL;
+    delete iter->second; iter->second = NULL;
     iter++;
   }
 }
diff --git a/src/global.h b/src/global.h
index 6eb5bf10050e1254f3064cf4591e6c39337e28b4..225b14a87da82f02b4c62ea484ebb8784f4d4977 100644
--- a/src/global.h
+++ b/src/global.h
@@ -36,25 +36,14 @@ typedef short int16;
 	#define _debug(...)
 #endif
 
-#define VERSION "0.4.1-pre1"
-#define VERSIONNUM 0x000400
+#define VERSION "0.5"
+#define VERSIONNUM 0x000500
 
 
-#define PROGNAME				"sflphone"
-//#define SKINDIR					"skins"
-//#define PIXDIR					"icons"
+#define PROGNAME				"sflphoned"
 #define RINGDIR					"ringtones"
 #define CODECDIR				"codecs"
 
-//#define SFLPHONE_LOGO			"logo_ico.png"
-//#define TRAY_ICON				"tray-icon.png"
-//#define PIXMAP_SIGNALISATIONS	"signalisations.png" 
-//#define PIXMAP_AUDIO			"audio.png" 
-//#define PIXMAP_VIDEO			"video.png" 
-//#define PIXMAP_NETWORK			"network.png" 
-//#define PIXMAP_PREFERENCES		"preferences.png" 
-//#define PIXMAP_ABOUT			"about.png" 
-
 #define MONO					1
 #define CHANNELS				2
 #define	SAMPLING_RATE 			8000
diff --git a/src/gui/guiframework.cpp b/src/gui/guiframework.cpp
index 323e23dbda1ed5c008e6a9340ebaf249c94dbb73..63e5f5cdabe07421e34151104889ff55f4cee8ad 100644
--- a/src/gui/guiframework.cpp
+++ b/src/gui/guiframework.cpp
@@ -176,10 +176,11 @@ GuiFramework::playTone ()
 	return Manager::instance().playTone();
 }
 
-int 
-GuiFramework::quitApplication (void)
+bool 
+GuiFramework::stopTone ()
 {
-	return (Manager::instance().quitApplication() ? 1 : 0);
+  Manager::instance().stopTone();
+  return true;
 }
 
 int 
diff --git a/src/gui/guiframework.h b/src/gui/guiframework.h
index acd3e8769b826ca577f3ce6a46656148a27f2201..0568de6e784b27d53df397af6508342db4431571 100644
--- a/src/gui/guiframework.h
+++ b/src/gui/guiframework.h
@@ -74,12 +74,12 @@ public:
 	int saveConfig (void);
 	int registerVoIPLink (void);
 	int unregisterVoIPLink (void);
-	int quitApplication (void);
 	int sendTextMessage (short id, const std::string& message);
 	int accessToDirectory (void);
 	bool sendDtmf (short id, char code);
   bool playDtmf (char code);
   bool playTone ();
+  bool stopTone ();
 
   // config
   bool getZeroconf(const std::string& sequenceId);
diff --git a/src/gui/server/argtokenizer.cpp b/src/gui/server/argtokenizer.cpp
index babee3b4a245e3fe6e4ca600bd501f0375f07e90..2d5ca5fb9af12d97aaaf5748173b9419156c2661 100644
--- a/src/gui/server/argtokenizer.cpp
+++ b/src/gui/server/argtokenizer.cpp
@@ -34,7 +34,7 @@ ArgTokenizer::tokenize(const std::string& str) {
     strcpy(tmp, output.c_str());
     ost::urlDecode(tmp, NULL);
     args.push_back(tmp);
-    delete[] tmp;
+    delete[] tmp; tmp = NULL;
   }
   return args;
 }
diff --git a/src/gui/server/factory.cpp b/src/gui/server/factory.cpp
index fef3d6c6a9a5deb6762baa00cf1352f46735701d..3915f7d2f67ddef34ec8b609a5d5e33db8e6220f 100644
--- a/src/gui/server/factory.cpp
+++ b/src/gui/server/factory.cpp
@@ -65,7 +65,7 @@ public:
     std::map< std::string, RequestCreatorBase * >::iterator pos = 
       mRequests.find(requestname);
     if(pos != mRequests.end()) {
-      delete pos->second;
+      delete pos->second; pos->second = NULL;
       mRequests.erase(pos);
     }
     
diff --git a/src/gui/server/guiserver.cpp b/src/gui/server/guiserver.cpp
index ea46a2249626fb81900b4802bc7a972c3315e77f..098f009ec8e32e5f0bfd2e2a130956e7188c44a8 100644
--- a/src/gui/server/guiserver.cpp
+++ b/src/gui/server/guiserver.cpp
@@ -54,11 +54,10 @@ GUIServer::~GUIServer()
   // Waiting Requests cleanup
   std::map<std::string, Request*>::iterator iter = _waitingRequests.begin();
   while (iter != _waitingRequests.end()) {
-    _waitingRequests.erase(iter);
-    delete (iter->second);
+    delete iter->second; iter->second = NULL;
     iter++;
   }
-  
+ _waitingRequests.clear();
 }
 
 int
@@ -122,8 +121,8 @@ GUIServer::pushResponseMessage(const ResponseMessage &response)
   if (response.isFinal()) {
     std::map<std::string, Request*>::iterator iter = _waitingRequests.find(response.sequenceId());
     if (iter != _waitingRequests.end()) {
+      delete iter->second; iter->second = NULL;
       _waitingRequests.erase(iter);
-      delete (iter->second);
     }
   }
 }
@@ -136,13 +135,13 @@ void
 GUIServer::handleExecutedRequest(Request * const request, const ResponseMessage& response) 
 {
   if (response.isFinal()) {
-    delete request;
+    delete request; request = NULL;
   } else {
     if (_waitingRequests.find(request->sequenceId()) == _waitingRequests.end()) {
       _waitingRequests[response.sequenceId()] = request;
     } else {
       // we don't deal with requests with a sequenceId already send...
-      delete request;
+      delete request; request = NULL;
     }
   }
   if (_sessionIO) {
diff --git a/src/gui/server/guiserverimpl.cpp b/src/gui/server/guiserverimpl.cpp
index d4a0b36e9bce73455dbd869638b322c1bc89e0f4..aaecadd041df95fd39a7ed76a680b187ab04f25e 100644
--- a/src/gui/server/guiserverimpl.cpp
+++ b/src/gui/server/guiserverimpl.cpp
@@ -41,7 +41,6 @@ GUIServerImpl::exec() {
   return _requestManager.exec();
 }
 
-
 /** 
  * SubCall operations
  *  insert
@@ -247,11 +246,10 @@ GUIServerImpl::hangupAll()
     id = iter->first;
     if (!GuiFramework::hangupCall(id)) {
       result = false;
-    } else {
-      _callMap.erase(id);
     }
     iter++;
   }
+  _callMap.clear();
   return result;
 }
 
diff --git a/src/gui/server/guiserverimpl.h b/src/gui/server/guiserverimpl.h
index 2795a5a47432d4e0e923a138d8e689bf9dbf1ef0..35f1e26b72508802f382c1cf288a60b707b64a3f 100644
--- a/src/gui/server/guiserverimpl.h
+++ b/src/gui/server/guiserverimpl.h
@@ -82,6 +82,7 @@ arg);
 
   std::string version();
   void quit() { _requestManager.quit(); }
+  void stop() { _requestManager.stop(); }
 
   // observer methods
   void update();
diff --git a/src/gui/server/request.cpp b/src/gui/server/request.cpp
index 4f43d1686cbfe83e6b96138ff3291e10f11f28d3..b4fe6c7166441818b052d5db5a95c556c6191e09 100644
--- a/src/gui/server/request.cpp
+++ b/src/gui/server/request.cpp
@@ -172,6 +172,15 @@ RequestPlayTone::execute()
   return message("500", "Tone Error");
 }
 
+ResponseMessage
+RequestStopTone::execute()
+{
+  if ( GUIServer::instance().stopTone() ) {
+    return message("200", "OK");
+  }
+  return message("500", "Tone Error");
+}
+
 ResponseMessage
 RequestMute::execute()
 {
@@ -199,3 +208,9 @@ RequestQuit::execute()
   return message("200", "Quitting");
 }
 
+ResponseMessage
+RequestStop::execute()
+{
+  GUIServer::instance().stop();
+  return message("200", "Stopping server");
+}
diff --git a/src/gui/server/request.h b/src/gui/server/request.h
index cf4d0c209cc9fafaac8d8b38f884b8ec235eb9dd..89fc97ad24344dc7ab147fb0e877ce924a7f07ce 100644
--- a/src/gui/server/request.h
+++ b/src/gui/server/request.h
@@ -184,6 +184,11 @@ public:
   RequestQuit(const std::string &sequenceId, const TokenList& argList) : RequestGlobal(sequenceId,argList) {}
   ResponseMessage execute();
 };
+class RequestStop : public RequestGlobal {
+public:
+  RequestStop(const std::string &sequenceId, const TokenList& argList) : RequestGlobal(sequenceId,argList) {}
+  ResponseMessage execute();
+};
 class RequestHangupAll : public RequestGlobal {
 public:
   RequestHangupAll(const std::string &sequenceId, const TokenList& argList) : RequestGlobal(sequenceId,argList) {}
@@ -206,6 +211,13 @@ public:
   ResponseMessage execute();
 };
 
+class RequestStopTone : public RequestGlobal {
+public:
+  RequestStopTone(const std::string &sequenceId, 
+    const TokenList& argList) : RequestGlobal(sequenceId,argList) {}
+  ResponseMessage execute();
+};
+
 
 
 
diff --git a/src/gui/server/requestfactory.cpp b/src/gui/server/requestfactory.cpp
index a03b9a4ddeedd284580dcb7774fe1d7a6bf756c9..8a978c503060d9cfa592e64a9258c34f31927916 100644
--- a/src/gui/server/requestfactory.cpp
+++ b/src/gui/server/requestfactory.cpp
@@ -75,9 +75,10 @@ RequestFactory::~RequestFactory()
   std::map< std::string, RequestCreatorBase * >::iterator iter = mRequests.begin();
   while ( iter != mRequests.end() ) {
     // delete RequestCreator< T >
-    delete iter->second;
+    delete iter->second; iter->second = NULL;
     iter++;
   }
+  mRequests.clear();
 }
 
 template< typename T >
@@ -87,7 +88,7 @@ RequestFactory::registerRequest(const std::string &requestname)
   std::map< std::string, RequestCreatorBase * >::iterator pos = 
     mRequests.find(requestname);
   if(pos != mRequests.end()) {
-    delete pos->second;
+    delete pos->second; pos->second = NULL;
     mRequests.erase(pos);
   }
   
@@ -107,11 +108,13 @@ RequestFactory::registerAll() {
   registerRequest<RequestDTMF>        ("senddtmf");
   registerRequest<RequestPlayDtmf>    ("playdtmf");
   registerRequest<RequestPlayTone>    ("playtone");
+  registerRequest<RequestStopTone>    ("stoptone");
   registerRequest<RequestTransfer>    ("transfer");
   registerRequest<RequestMute>        ("mute");
   registerRequest<RequestUnmute>      ("unmute");
   registerRequest<RequestVersion>     ("version");
   registerRequest<RequestQuit>        ("quit");
+  registerRequest<RequestStop>        ("stop");
 
   // request config
   registerRequest<RequestGetEvents>   ("getevents");
@@ -124,5 +127,5 @@ RequestFactory::registerAll() {
   registerRequest<RequestConfigSave>  ("configsave");
   registerRequest<RequestList>        ("list");
   registerRequest<RequestVolumeSpkr>  ("setspkrvolume");
-  registerRequest<RequestVolumeMic>  ("setmicvolume");
+  registerRequest<RequestVolumeMic>   ("setmicvolume");
 }
diff --git a/src/gui/server/requestmanager.cpp b/src/gui/server/requestmanager.cpp
index d3391117bb956aa6738945cde9187035c5111b58..83a9b86dee2901853de34830abf5dc81be788a30 100644
--- a/src/gui/server/requestmanager.cpp
+++ b/src/gui/server/requestmanager.cpp
@@ -31,7 +31,7 @@ RequestManager::RequestManager() : _sessionIO(0)
 
 RequestManager::~RequestManager()
 {
-  delete _sessionIO;
+  delete _sessionIO; _sessionIO = NULL;
   flushWaitingRequest();
 }
 
@@ -39,7 +39,8 @@ int
 RequestManager::exec() 
 {
   try {
-    while(std::cin.good()) {
+    _stop = false;
+    while(std::cin.good() && !_stop) {
 
       // TCPSessionIO start a thread for the stream socket
       {
@@ -73,8 +74,7 @@ RequestManager::exec()
 
       { // session mutex block
         _sessionMutex.enterMutex(); 
-        delete _sessionIO;
-        _sessionIO = 0;
+        delete _sessionIO; _sessionIO = NULL;
         _sessionMutex.leaveMutex();
       }
 
@@ -91,10 +91,10 @@ RequestManager::exec()
  * or send it into the waitingRequest map
  */
 void 
-RequestManager::handleExecutedRequest(Request * const request, const ResponseMessage& response) 
+RequestManager::handleExecutedRequest(Request * request, const ResponseMessage& response) 
 {
   if (response.isFinal()) {
-    delete request;
+    delete request; request = NULL;
   } else {
     ost::MutexLock lock(_waitingRequestsMutex);
     if (_waitingRequests.find(request->sequenceId()) == _waitingRequests.end()) {
@@ -102,7 +102,7 @@ RequestManager::handleExecutedRequest(Request * const request, const ResponseMes
       _waitingRequests[response.sequenceId()] = request;
     } else {
       // we don't deal with requests with a sequenceId already send...
-      delete request;
+      delete request; request = NULL;
     }
   }
 }
@@ -117,10 +117,10 @@ RequestManager::flushWaitingRequest()
   // Waiting Requests cleanup
   std::map<std::string, Request*>::iterator iter = _waitingRequests.begin();
   while (iter != _waitingRequests.end()) {
-    _waitingRequests.erase(iter);
-    delete (iter->second);
+    delete iter->second; iter->second = NULL;
     iter++;
   }
+  _waitingRequests.clear();
 }
 
 /**
@@ -141,8 +141,8 @@ RequestManager::sendResponse(const ResponseMessage& response) {
     std::map<std::string, Request*>::iterator iter = _waitingRequests.find(response.sequenceId());
 
     if (iter != _waitingRequests.end()) {
+      delete iter->second; iter->second = NULL;
       _waitingRequests.erase(iter);
-      delete (iter->second);
     }
   }
 }
diff --git a/src/gui/server/requestmanager.h b/src/gui/server/requestmanager.h
index c20a4db63d856a79c83665dd6cdff67d363d6d5f..055c63ff412fd26446b03c42aacc3924d9522982 100644
--- a/src/gui/server/requestmanager.h
+++ b/src/gui/server/requestmanager.h
@@ -37,10 +37,11 @@ public:
     int exec(void);
     void sendResponse(const ResponseMessage& response);
     void quit() { _quit = true; }
+    void stop() { _stop = true; quit(); }
 
 private:
   void flushWaitingRequest();
-  void handleExecutedRequest(Request * const request, const ResponseMessage& response);
+  void handleExecutedRequest(Request * request, const ResponseMessage& response);
 
   RequestFactory _factory;
   SessionIO*  _sessionIO;
@@ -50,7 +51,8 @@ private:
   ost::Mutex _waitingRequestsMutex;
   std::map<std::string, Request*> _waitingRequests;
 
-  bool _quit; // tell to quit and end the exec loop
+  bool _quit; // tell to quit and end the exec loop for one client
+  bool _stop; // tell to stop the exec loop
 };
 
 #endif
diff --git a/src/gui/server/responsemessage.cpp b/src/gui/server/responsemessage.cpp
index 4ae25b7718eb96cf622f169cb301938b1607b513..74a122a4df93850b3ece07879adc16ae314bc9b2 100644
--- a/src/gui/server/responsemessage.cpp
+++ b/src/gui/server/responsemessage.cpp
@@ -53,7 +53,7 @@ ResponseMessage::ResponseMessage(const std::string& code,
       ost::urlEncode(iter->c_str(), tmp, len*3+2);
       // we don't have to put a '\0' right?
       _message.append(tmp);
-      delete [] tmp;
+      delete [] tmp; tmp = NULL;
     }
     iter++;
   }
diff --git a/src/gui/server/tcpsessionio.cpp b/src/gui/server/tcpsessionio.cpp
index b1faef4bcc8eb7036cdc066b01d79da4fe903c1c..8382587bb1a8c81ecb9664514eb52f50c368dc1f 100644
--- a/src/gui/server/tcpsessionio.cpp
+++ b/src/gui/server/tcpsessionio.cpp
@@ -37,8 +37,8 @@ TCPSessionIO::TCPSessionIO() : SessionIO()
 
 TCPSessionIO::~TCPSessionIO()
 {
-  delete _clientStream;
-  delete _serverSocket;
+  delete _clientStream; _clientStream = NULL;
+  delete _serverSocket; _serverSocket = NULL;
 }
 
 bool
diff --git a/src/main.cpp b/src/main.cpp
index 718c2621caf29452397c12a7160b2e1650708adf..bf1f260fc2a1023434f3a0548b1d679fa9cdf806 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -29,7 +29,7 @@ int
 main (int argc, char **argv) {
   int exit_code = 0;
 
-  if (argc == 1 && strcmp(argv[0], "--help") == 0) {
+  if (argc == 2 && strcmp(argv[1], "--help") == 0) {
 
     std::cout << PROGNAME << " Deamon " << VERSION << ", by Savoir-Faire Linux 2004-2005" << std::endl << std::endl;
     std::cout << "USAGE: sflphoned [--help]" << std::endl;
@@ -38,7 +38,6 @@ main (int argc, char **argv) {
     std::cout << "See http://www.sflphone.org/ for more information" << std::endl;
 
   } else {
-
     GuiFramework *GUI;
     bool initOK = false;
     try {
@@ -56,8 +55,6 @@ main (int argc, char **argv) {
       GUI = &(GUIServer::instance());
       Manager::instance().setGui(GUI);
       exit_code = GUIServer::instance().exec();
-      Manager::instance().terminate();
-      delete GUI;
     }
   }
 
diff --git a/src/managerimpl.cpp b/src/managerimpl.cpp
index b5fca468a944903a9f303678076cc6205d49b7ff..a6e875e11469ab7a56635fab2ee1c36e2bc2f4fc 100644
--- a/src/managerimpl.cpp
+++ b/src/managerimpl.cpp
@@ -103,7 +103,15 @@ ManagerImpl::ManagerImpl (void)
 ManagerImpl::~ManagerImpl (void) 
 {
   terminate();
-} 
+#ifdef USE_ZEROCONF
+  delete _DNSService; _DNSService = NULL;
+#endif
+
+  delete _tone;  _tone = NULL;
+  delete _error; _error = NULL;
+
+  _debug("%s stop correctly\n", PROGNAME);
+}
 
 void 
 ManagerImpl::init (void) 
@@ -158,40 +166,24 @@ ManagerImpl::init (void)
 
 void ManagerImpl::terminate()
 {
-  for(VoIPLinkVector::iterator pos = _voIPLinkVector.begin();
-      pos != _voIPLinkVector.end();
-      pos++) {
-    (*pos)->terminate();
-  }
-
-  _voIPLinkVector.clear();
-
   for(VoIPLinkVector::iterator pos = _voIPLinkVector.begin();
       pos != _voIPLinkVector.end();
       pos++) {
     delete *pos;
+    *pos = NULL;
   }
+  _voIPLinkVector.clear();
 
   for(CallVector::iterator pos = _callVector.begin();
       pos != _callVector.end();
       pos++) {
-    delete *pos;
+    delete *pos;   *pos = NULL;
   }
+  _callVector.clear();
 
   unloadAudioCodec();
 
-  delete _audiodriverPA;
-  _audiodriverPA = 0;
-  delete _tone;
-  _tone = 0;
-  delete _error;
-  _error = 0;
-
-#ifdef USE_ZEROCONF
-  delete _DNSService;
-  _DNSService = 0;
-#endif
-  _debug("ManagerImpl::terminate() was called");
+  delete _audiodriverPA; _audiodriverPA = NULL;
 }
 
 void
@@ -313,7 +305,7 @@ ManagerImpl::deleteCall (short id)
 
   while(iter!=_callVector.end()) {
     if ((*iter)->getId() == id) {
-      delete (*iter);
+      delete (*iter); *iter = NULL;
       _callVector.erase(iter);
       return;
     }
@@ -602,17 +594,6 @@ ManagerImpl::unregisterVoIPLink (void)
 	}
 }
 
-/**
- * Terminate action (main thread)
- */
-int 
-ManagerImpl::quitApplication (void)
-{
-  // Quit VoIP-link library
-  terminate();
-  return 0;
-}
-
 /**
  * ??? action
  */
@@ -710,12 +691,10 @@ ManagerImpl::playDtmf(char code)
     }
     _mutex.leaveMutex();
     //setZonetone(false);
-    delete[] buf_ctrl_vol;
-    buf_ctrl_vol = 0;
+    delete[] buf_ctrl_vol; buf_ctrl_vol = 0;
     returnValue = true;
   }
-  delete[] _buf;
-  _buf = 0;
+  delete[] _buf; _buf = 0;
   return returnValue;
 }
 
@@ -789,7 +768,7 @@ ManagerImpl::peerAnsweredCall (short id)
 
   // switch current call
   switchCall(id);
-  _gui->peerAnsweredCall(id);
+  if (_gui) _gui->peerAnsweredCall(id);
 }
 
 /**
@@ -805,7 +784,7 @@ ManagerImpl::peerRingingCall (short id)
 
   // ring
   ringback();
-  _gui->peerRingingCall(id);
+  if (_gui) _gui->peerRingingCall(id);
   return 1;
 }
 
@@ -827,7 +806,7 @@ ManagerImpl::peerHungupCall (short id)
   call->setStatus(string(HANGUP_STATUS));
   call->setState(Call::Hungup);
 
-  _gui->peerHungupCall(id);
+  if (_gui) _gui->peerHungupCall(id);
 
   // end up call
   _mutex.enterMutex();
@@ -848,9 +827,6 @@ ManagerImpl::displayTextMessage (short id, const string& message)
   if(_gui) {
     _gui->displayTextMessage(id, message);
   }
-  else {
-    std::cout << message << std::endl;
-  }
 }
 
 /**
@@ -863,9 +839,6 @@ ManagerImpl::displayErrorText (short id, const string& message)
   if(_gui) {
     _gui->displayErrorText(id, message);
   }
-  else {
-    std::cerr << message << std::endl;
-  }
 }
 
 /**
@@ -878,9 +851,6 @@ ManagerImpl::displayError (const string& error)
   if(_gui) {
     _gui->displayStatus(error);
   }
-  else {
-    std::cerr << error << std::endl;
-  }
 }
 
 /**
@@ -893,9 +863,6 @@ ManagerImpl::displayStatus (const string& status)
   if(_gui) {
     _gui->displayStatus(status);
   }
-  else {
-    std::cout<< status << std::endl;
-  }
 }
 
 /**
@@ -906,7 +873,7 @@ void
 ManagerImpl::startVoiceMessageNotification (const std::string& nb_msg)
 {
   //_gui->startVoiceMessageNotification();
-  _gui->sendVoiceNbMessage(nb_msg);
+  if (_gui) _gui->sendVoiceNbMessage(nb_msg);
 }
 
 /**
@@ -917,7 +884,7 @@ void
 ManagerImpl::stopVoiceMessageNotification (void)
 {
 	//_gui->stopVoiceMessageNotification();
-  _gui->sendVoiceNbMessage(std::string("0"));
+  if (_gui) _gui->sendVoiceNbMessage(std::string("0"));
 }
 
 /**
@@ -1036,10 +1003,8 @@ ManagerImpl::notificationIncomingCall (void) {
   }
   getAudioDriver()->putUrgent(buf_ctrl_vol, SAMPLES_SIZE(FRAME_PER_BUFFER));
 
-  delete[] buf_ctrl_vol;
-  buf_ctrl_vol = 0;
-  delete[] buffer;
-  buffer = 0;
+  delete[] buf_ctrl_vol;  buf_ctrl_vol = NULL;
+  delete[] buffer;        buffer = NULL;
 }
 
 /**
@@ -1254,11 +1219,10 @@ ManagerImpl::unloadAudioCodec()
 {
   CodecDescriptorVector::iterator iter = _codecDescVector.begin();
   while(iter!=_codecDescVector.end()) {
-    delete *iter;
-    *iter = NULL;
-    _codecDescVector.erase(iter);
+    delete *iter; *iter = NULL;
     iter++;
   }
+  _codecDescVector.clear();
 }
 
 
@@ -1356,7 +1320,7 @@ ManagerImpl::getZeroconf(const std::string& sequenceId)
  * Main Thread
  */
 bool 
-ManagerImpl::attachZeroconfEvents(const std::string& sequenceId, Pattern::Observer& observer)
+ManagerImpl::attachZeroconfEvents(const std::string& , Pattern::Observer& observer)
 {
   bool returnValue = false;
   // don't need the _gui like getZeroconf function
diff --git a/src/managerimpl.h b/src/managerimpl.h
index b9d7159af0927e92ebce389d801bc32850192f1f..ed3254d2fded15784b81318958cbfa8e565d6ce9 100644
--- a/src/managerimpl.h
+++ b/src/managerimpl.h
@@ -161,7 +161,6 @@ public:
 	int saveConfig (void);
 	int registerVoIPLink (void);
 	int unregisterVoIPLink (void);
-	int quitApplication (void);
 	int sendTextMessage (short id, const std::string& message);
 	int accessToDirectory (void);
 	
@@ -174,7 +173,7 @@ public:
 	bool sendDtmf (short id, char code);
 	bool playDtmf (char code);
 	bool playTone ();
-	
+  void stopTone();
 
 	int incomingCall (short id);
 	void peerAnsweredCall (short id);
@@ -331,7 +330,6 @@ private:
    * @return false if the driver is uninitialize
    */
   bool playATone(unsigned int tone);
-  void stopTone();
   
 	/////////////////////
 	// Private variables
diff --git a/src/phonegi-bin.h b/src/phonegi-bin.h
deleted file mode 100644
index 4081ff3a8d2b775054dcf334d06fe0ffa63d359c..0000000000000000000000000000000000000000
--- a/src/phonegi-bin.h
+++ /dev/null
@@ -1,18 +0,0 @@
-// Those are the headers for the pgi-bin stuff.
-//
-// (c) 2004 Savoir-faire Linux inc.
-// Author: Jerome Oufella <jerome.oufella@savoirfairelinux.com>
-//
-#ifndef __PHONEGI_BIN_H__
-#define __PHONEGI_BIN_H__
-
-#include "global.h"
-
-class phonegibin {
-public:
-	int exec (const char *scriptName);
-protected:
-private:
-};
-
-#endif	// __PHONEGI_BIN_H__
diff --git a/src/sipcall.cpp b/src/sipcall.cpp
index 45cc65dcc311cbeb430baa3a5936e3fa4ea82b2f..f3e73d03f4405f5375774a1e6d8134dcc9f2148c 100644
--- a/src/sipcall.cpp
+++ b/src/sipcall.cpp
@@ -61,8 +61,7 @@ SipCall::SipCall (short id, CodecDescriptorVector* cdv) : _localIp("127.0.0.1")
 SipCall::~SipCall (void) 
 {
 	dealloc();
-  delete _audiocodec;
-  _audiocodec = NULL;
+  delete _audiocodec; _audiocodec = NULL;
 }
 
 void
@@ -147,8 +146,7 @@ void
 SipCall::setAudioCodec (AudioCodec* ac)
 {
   // it use a new!
-  delete _audiocodec;
-	_audiocodec = ac;
+  delete _audiocodec; _audiocodec = ac;
 }
 
 // newIncomingCall is called when the IP-Phone user receives a new call.
@@ -791,10 +789,10 @@ SipCall::alloc(void) {
 
 void
 SipCall::dealloc(void) {
-  delete [] _reason_phrase;
-  delete [] _textinfo;
-  delete [] _remote_uri;
-  delete [] _remote_sdp_audio_ip;
+  delete [] _reason_phrase;       _reason_phrase = NULL;
+  delete [] _textinfo;            _textinfo      = NULL;
+  delete [] _remote_uri;          _remote_uri    = NULL;
+  delete [] _remote_sdp_audio_ip; _remote_sdp_audio_ip = NULL;
 }
 
 void
diff --git a/src/sipvoiplink.cpp b/src/sipvoiplink.cpp
index 386b15980618d3dd8243f91fd35ac7e7f0c589b4..f3ca217d1ec84b2deaf783cad6d27793c0c71d2d 100644
--- a/src/sipvoiplink.cpp
+++ b/src/sipvoiplink.cpp
@@ -58,7 +58,13 @@ SipVoIPLink::SipVoIPLink (short id)
 }
 
 SipVoIPLink::~SipVoIPLink(void) {
-  delete _evThread;
+  eXosip_quit();
+  delete _evThread; _evThread = NULL;
+}
+
+void
+SipVoIPLink::terminate(void) 
+{
 }
 
 bool 
@@ -171,14 +177,6 @@ SipVoIPLink::isInRtpmap (int index, int payload, CodecDescriptorVector* cdv) {
   return false;
 }
 
-void
-SipVoIPLink::terminate(void) 
-{
-  _debug("Thread: stop event thread\n");
-  delete _evThread;
-  eXosip_quit();
-}
-
 int
 SipVoIPLink::setRegister (void) 
 {
@@ -411,7 +409,7 @@ SipVoIPLink::hangup (short id)
   } else {
     _debug("The call was in error state, so delete it");
   }
-				
+
   deleteSipCall(id);
   return i;
 }
@@ -999,7 +997,7 @@ SipVoIPLink::carryingDTMFdigits (short id, char code) {
   }
   eXosip_unlock();
 	
-  delete[] dtmf_body;
+  delete[] dtmf_body; dtmf_body = NULL;
 }
  
 void
@@ -1028,7 +1026,7 @@ SipVoIPLink::deleteSipCall (short callid)
 
   while(iter != _sipcallVector.end()) {
     if ((*iter)->getId() == callid) {
-      delete *iter;
+      delete *iter; *iter = NULL;
       _sipcallVector.erase(iter);
       return;
     }
@@ -1263,7 +1261,7 @@ SipVoIPLink::getLocalIp (void)
   char* myIPAddress = new char[65];
   ret = eXosip_guess_localip (AF_INET, myIPAddress, 64);
   setLocalIpAddress(std::string(myIPAddress));
-  delete [] myIPAddress;
+  delete [] myIPAddress; myIPAddress = NULL;
   return ret;
 }
 
diff --git a/src/zeroconf/DNSService.cpp b/src/zeroconf/DNSService.cpp
index 63df7c517afb4113c1e3a29b095575f387a32035..5b7dd758a22124eb7217045275720cfe6ac9a82b 100644
--- a/src/zeroconf/DNSService.cpp
+++ b/src/zeroconf/DNSService.cpp
@@ -54,8 +54,7 @@ DNSService::~DNSService()
 {
   int cntThread = _queryThread.size();
   for (int iThread=0;iThread<cntThread;iThread++) {
-    delete _queryThread[iThread];
-    _queryThread[iThread] = NULL;
+    delete _queryThread[iThread]; _queryThread[iThread] = NULL;
   }
 }