diff --git a/CHANGES b/CHANGES
index eb4bc3b8d6b38c998a064302f13ee89d0e1e114c..93b0f140dafa275e6dcff491915647713af43f92 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+SFLphone (0.4)
+	* Reorganisation of SFLphone architecture
+
 SFLphone (0.3.1) / 2005-04-21
 	* Handle error messages on screen
 	* Handle refused call
diff --git a/src/audio/audiodriversalsa.cpp b/src/audio/audiodriversalsa.cpp
index fffe5cf9aabb8c6f3c1420edc0f9363f6e29ac2d..9547420a143525eff3064392728423dced57ba4e 100644
--- a/src/audio/audiodriversalsa.cpp
+++ b/src/audio/audiodriversalsa.cpp
@@ -82,7 +82,7 @@ AudioDriversALSA::initDevice (DeviceMode mode) {
 	}
 
 	if (err < 0) {
-		printf ("ERROR: ALSA/snd_pcm_open: Cannot open audio device (%s)\n",
+		_debug ("ERROR: ALSA/snd_pcm_open: Cannot open audio device (%s)\n",
 						snd_strerror (err));
 		error->errorName(OPEN_FAILED_DEVICE, NULL);
 		return -1;
@@ -95,7 +95,7 @@ AudioDriversALSA::initDevice (DeviceMode mode) {
 
 	err = snd_pcm_hw_params_malloc (&hw_params);
 	if (err < 0) {
-		printf ("Cannot allocate hardware parameter structure (%s)\n",
+		_debug ("Cannot allocate hardware parameter structure (%s)\n",
 				 snd_strerror (err));
 		error->errorName(PARAMETER_STRUCT_ERROR_ALSA, (char*)snd_strerror(err));
 		return -1;
@@ -103,7 +103,7 @@ AudioDriversALSA::initDevice (DeviceMode mode) {
 
 	// Init hwparams with full configuration space 
 	if ((err = snd_pcm_hw_params_any (audio_hdl, hw_params)) < 0) {
-		printf ("Cannot initialize hardware parameter structure (%s)\n",
+		_debug ("Cannot initialize hardware parameter structure (%s)\n",
 				 snd_strerror (err));
 		error->errorName(PARAMETER_STRUCT_ERROR_ALSA, (char*)snd_strerror(err));
 		return -1;
@@ -112,7 +112,7 @@ AudioDriversALSA::initDevice (DeviceMode mode) {
 	err = snd_pcm_hw_params_set_access (audio_hdl, hw_params,
 					SND_PCM_ACCESS_RW_INTERLEAVED);
 	if (err < 0) {
-		printf ("Cannot set access type (%s)\n", snd_strerror (err));
+		_debug ("Cannot set access type (%s)\n", snd_strerror (err));
 		error->errorName(ACCESS_TYPE_ERROR_ALSA, (char*)snd_strerror(err));
 		return -1;
 	}
@@ -121,7 +121,7 @@ AudioDriversALSA::initDevice (DeviceMode mode) {
 	err = snd_pcm_hw_params_set_format (audio_hdl, hw_params,
 					SND_PCM_FORMAT_S16_LE);
 	if (err < 0) {
-		printf ("Cannot set sample format (%s)\n", snd_strerror (err));
+		_debug ("Cannot set sample format (%s)\n", snd_strerror (err));
 		error->errorName(SAMPLE_FORMAT_ERROR_ALSA, (char*)snd_strerror(err));
 		return -1;
 	} 
@@ -134,18 +134,18 @@ AudioDriversALSA::initDevice (DeviceMode mode) {
 	err = snd_pcm_hw_params_set_rate_near (audio_hdl, hw_params, 
 			&exact_rate, 0);
 	if (err < 0) {
-		printf ("Cannot set sample rate (%s)\n", snd_strerror (err));
+		_debug ("Cannot set sample rate (%s)\n", snd_strerror (err));
 		error->errorName(SAMPLE_RATE_ERROR_ALSA, (char*)snd_strerror(err));
 		return -1;
 	}
 	if (exact_rate != rate) {
-      fprintf(stderr, "The rate %d Hz is not supported by your hardware.\n ==> Using %d Hz instead.\n", rate, exact_rate);
+      _debug("The rate %d Hz is not supported by your hardware.\n ==> Using %d Hz instead.\n", rate, exact_rate);
     }
 	
 	// Set number of channels - Mono(1) or Stereo(2) 
 	err = snd_pcm_hw_params_set_channels (audio_hdl, hw_params, MONO);
 	if (err < 0) {
-		printf ("Cannot set channel count (%s)\n", snd_strerror (err));
+		_debug ("Cannot set channel count (%s)\n", snd_strerror (err));
 		error->errorName(CHANNEL_ERROR_ALSA, (char*)snd_strerror(err));
 		return -1;
 	}
@@ -153,7 +153,7 @@ AudioDriversALSA::initDevice (DeviceMode mode) {
 	// Apply previously setup parameters
 	err = snd_pcm_hw_params (audio_hdl, hw_params);
 	if (err < 0) {
-		printf ("Cannot set parameters (%s)\n", snd_strerror (err));
+		_debug ("Cannot set parameters (%s)\n", snd_strerror (err));
 		error->errorName(PARAM_SETUP_ALSA, (char*)snd_strerror(err));
 		return -1;
 	}
@@ -222,19 +222,18 @@ int
 AudioDriversALSA::resetDevice (void) {
 	int err;
 
-	printf("Resetting...\n");
+	_debug("Resetting...\n");
 	if ((err = snd_pcm_drop(audio_hdl)) < 0) {
-		printf ("ALSA: drop() error: %s\n", snd_strerror (err));				
+		_debug ("ALSA: drop() error: %s\n", snd_strerror (err));				
 		error->errorName(DROP_ERROR_ALSA, (char*)snd_strerror(err));
 		return -1;
 	}
 
 	if ((err = snd_pcm_prepare(audio_hdl)) < 0) {
-		printf ("ALSA: prepare() error: %s\n", snd_strerror (err));			
+		_debug ("ALSA: prepare() error: %s\n", snd_strerror (err));			
 		error->errorName(PREPARE_ERROR_ALSA, (char*)snd_strerror(err));
 		return -1;
 	}
-
 	return 0;
 }
 
diff --git a/src/audio/audiodriversoss.cpp b/src/audio/audiodriversoss.cpp
index c00b85cf6a2f0190028c40855509802f952d78d6..6f4f258e466f198dfdbf0f313b4dea5453df470f 100644
--- a/src/audio/audiodriversoss.cpp
+++ b/src/audio/audiodriversoss.cpp
@@ -50,12 +50,11 @@ AudioDriversOSS::~AudioDriversOSS (void) {
 
 int
 AudioDriversOSS::resetDevice (void) {
-	printf ("Resetting...");
+	_debug ("Resetting...\n");
 	if (ioctl(audio_fd, SNDCTL_DSP_RESET) < 0) {
 		perror("ioctl");
 		return -1;
 	}
-	printf ("done\n");
 	return 0;
 }
 
@@ -93,7 +92,7 @@ AudioDriversOSS::initDevice (DeviceMode mode) {
 	// Fragments : No limit (0x7FFF), 
 	int frag = ( ( 0x7FFF << 16 ) | 7 );
 	if (ioctl(audio_fd, SNDCTL_DSP_SETFRAGMENT, &frag)) {
-		printf ("ERROR: SETFRAG %s\n", strerror(errno));
+		_debug ("ERROR: SETFRAG %s\n", strerror(errno));
 		error->errorName(FRAGMENT_ERROR_OSS, strerror(errno));
 		return -1;
 	}
@@ -103,37 +102,37 @@ AudioDriversOSS::initDevice (DeviceMode mode) {
 	format = AFMT_S16_LE;
 
 	if (ioctl(audio_fd, SNDCTL_DSP_SETFMT, &format) == -1) {
-		printf("ERROR: SETFMT  %s\n", strerror(errno));
+		_debug("ERROR: SETFMT  %s\n", strerror(errno));
 		error->errorName(SAMPLE_FORMAT_ERROR_OSS, strerror(errno));
 		return -1;
 	}
 	if (format != AFMT_S16_LE) {
-		printf ("ERROR: Format not supported\n");
+		_debug ("ERROR: Format not supported\n");
 		return -1;
 	}
 
 	// Setup number of channels
 	int channels = MONO;
 	if (ioctl(audio_fd, SNDCTL_DSP_CHANNELS, &channels) == -1) {
-		printf ("ERROR: DSP_STEREO %s\n", strerror(errno));
+		_debug ("ERROR: DSP_STEREO %s\n", strerror(errno));
 		error->errorName(CHANNEL_ERROR_OSS, strerror(errno));
 		return -1;
 	}
 	if (channels != MONO) {
-		printf ("ERROR: Unsupported Number of Channels\n");
+		_debug ("ERROR: Unsupported Number of Channels\n");
 		return -1;
 	}
 
 	// Setup sampling rate 8KHz
 	int rate = SAMPLING_RATE;
 	if (ioctl(audio_fd, SNDCTL_DSP_SPEED, &rate ) == -1 ) {
-		printf ("ERROR: DSP_SPEED  %s\n", strerror(errno));
+		_debug ("ERROR: DSP_SPEED  %s\n", strerror(errno));
 		error->errorName(SAMPLE_RATE_ERROR_OSS, strerror(errno));
 		return -1;
 	}
 
 	if (rate != SAMPLING_RATE) {
-		printf ("WARNING: driver rounded %d Hz request to %d Hz, off by %f%%\n"
+		_debug ("WARNING: driver rounded %d Hz request to %d Hz, off by %f%%\n"
 				, 8000, rate, 100*((rate-8000)/8000.0));
 	}
 
@@ -141,13 +140,13 @@ AudioDriversOSS::initDevice (DeviceMode mode) {
 	audio_buf_info info;
 	if (mode == WriteOnly) {
 		if (ioctl(audio_fd, SNDCTL_DSP_GETOSPACE, &info) == -1) {
-			printf ("ERROR: GETISPACE %s\n", strerror(errno));
+			_debug ("ERROR: GETISPACE %s\n", strerror(errno));
 			error->errorName(GETISPACE_ERROR_OSS, strerror(errno));
 			return -1;
 		} 
 	} else {
 		if (ioctl(audio_fd, SNDCTL_DSP_GETISPACE, &info ) == -1) {
-			printf ("ERROR: GETOSPACE %s\n", strerror(errno));
+			_debug ("ERROR: GETOSPACE %s\n", strerror(errno));
 			error->errorName(GETOSPACE_ERROR_OSS, strerror(errno));
 			return -1;
 		}
@@ -169,13 +168,13 @@ bool
 AudioDriversOSS::openDevice (int exist_fd) {
 	audio_fd = exist_fd;
 	if (audio_fd == -1) {
-		printf ("ERROR: Open Failed\n");
+		_debug ("ERROR: Open Failed\n");
 		return false;
 	}
 
 	audio_buf_info info;
 	if (ioctl(audio_fd, SNDCTL_DSP_GETISPACE, &info) == -1) {
-		printf ("ERROR: GETISPACE  %s\n", strerror(errno));
+		_debug ("ERROR: GETISPACE  %s\n", strerror(errno));
 		return false;
 	}
 //	audio_buf.resize (info.fragsize * sizeof(short));
@@ -196,11 +195,11 @@ AudioDriversOSS::readBuffer (void *ptr, int bytes) {
  
 	rc = read (audio_fd, ptr, count);
 	if (rc < 0) {
-		printf ("rc < 0 read(): %s\n", strerror(errno));
+		_debug ("rc < 0 read(): %s\n", strerror(errno));
 	}
 	
 	else if (rc != count) {
-		printf ("WARNING: asked microphone for %d got %d\n", count, rc);
+		_debug ("WARNING: asked microphone for %d got %d\n", count, rc);
 	}
 
 	return rc;
@@ -221,11 +220,11 @@ AudioDriversOSS::readBuffer (int bytes) {
 
 	rc = read (audio_fd, buf, count);
 	if (rc < 0) {
-		printf ("rc < 0 read(): %s\n", strerror(errno));
+		_debug ("rc < 0 read(): %s\n", strerror(errno));
 	}
 	
 	else if (rc != count) {
-		printf ("WARNING: asked microphone for %d got %d\n", count, rc);
+		_debug ("WARNING: asked microphone for %d got %d\n", count, rc);
 	}
 
 	return rc;
@@ -251,7 +250,7 @@ AudioDriversOSS::writeBuffer (void *ptr, int len) {
 	for (;;) {
 		int a;
 		if ((a = write(audio_fd, ptr, len)) < 0) {
-			printf ("write(): %s\n", strerror(errno));
+			_debug ("write(): %s\n", strerror(errno));
 			break;
 		}
 		if (a > 0) { 
@@ -283,7 +282,7 @@ AudioDriversOSS::writeBuffer (void) {
 	for (;;) {
 		int a;
 		if ((a = write(audio_fd, buf, count)) < 0) {
-			printf ("write(): %s\n", strerror(errno));
+			_debug ("write(): %s\n", strerror(errno));
 			break;
 		}
 		if (a > 0) { 
@@ -317,7 +316,7 @@ AudioDriversOSS::readableBytes(void) {
 		return 0;
 	}
 	if (ioctl (audio_fd, SNDCTL_DSP_GETISPACE, &info) == -1) {
-		printf ("ERROR: readableBytes %s\n", strerror(errno));
+		_debug ("ERROR: readableBytes %s\n", strerror(errno));
 		return 0;
 	}
 
diff --git a/src/audio/audiortp.cpp b/src/audio/audiortp.cpp
index 896535a90fa8ecfdd6a3a88aaebdc9c9c7508f27..cd9e7a741604112d7a7f2f4b398b62df5746f70d 100644
--- a/src/audio/audiortp.cpp
+++ b/src/audio/audiortp.cpp
@@ -88,15 +88,16 @@ AudioRtp::createNewSession (SipCall *ca) {
 void
 AudioRtp::closeRtpSession (SipCall *ca) {
 	// This will make RTP threads finish.
-	ca->enable_audio = -1;
+	if (ca->enable_audio > 0) {
+		ca->enable_audio = -1;
 
-	if (_RTXThread != NULL) {
-		delete _RTXThread;
-		_RTXThread = NULL;
+		if (_RTXThread != NULL) {
+			delete _RTXThread;
+			_RTXThread = NULL;
+		}
+		// Flush audio read buffer
+		_manager->audiodriver->resetDevice();
 	}
-
-	// Flush audio read buffer
-	_manager->audiodriver->resetDevice();
 }
 
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/src/audio/tonegenerator.cpp b/src/audio/tonegenerator.cpp
index 7cb987d4d7966f1dbbe42de9271eb0c2e8aea079..d5d3a7dd5ca512681e2d141a550ce2e73d4622f8 100644
--- a/src/audio/tonegenerator.cpp
+++ b/src/audio/tonegenerator.cpp
@@ -208,19 +208,19 @@ ToneGenerator::buildTone (int idCountry, int idTones, int samplingRate,
  */
 int
 ToneGenerator::idZoneName (const string& name) {
-	if (name.compare("North America")) {
+	if (name.compare("North America") == 0) {
 		return ID_NORTH_AMERICA;
-	} else if (name.compare("France")) {
+	} else if (name.compare("France") == 0) {
 		return ID_FRANCE;
-	} else if (name.compare("Australia")) {
+	} else if (name.compare("Australia") == 0) {
 		return ID_AUSTRALIA;
-	} else if (name.compare("United Kingdom")) {
+	} else if (name.compare("United Kingdom") == 0) {
 		return ID_UNITED_KINGDOM;
-	} else if (name.compare("Spain")) {
+	} else if (name.compare("Spain") == 0) {
 		return ID_SPAIN;
-	} else if (name.compare("Italy")) {
+	} else if (name.compare("Italy") == 0) {
 		return ID_ITALY;
-	} else if (name.compare("Japan")) {
+	} else if (name.compare("Japan") == 0) {
 		return ID_JAPAN;
 	} else {
 		_debug("Zone no supported\n");
diff --git a/src/call.cpp b/src/call.cpp
index b7da704f1839a61ce7bfca9cd7051ac6c4c8cb00..68c057be15f524df5dafc30ff7cf8d2752d614a4 100644
--- a/src/call.cpp
+++ b/src/call.cpp
@@ -18,7 +18,7 @@
  */
 
 #include <iostream>
-#include "audio/audiocodec.h"
+//#include "audio/audiocodec.h"
 #include "call.h"
 #include "manager.h"
 #include "sipvoiplink.h"
@@ -104,12 +104,13 @@ Call::getVoIPLink (void)
 	return _voIPLink;
 }
 
+/*
 void
 Call::setAudioCodec (void)
 {
 	_audiocodec = _voIPLink->getAudioCodec(getId());
 }
-
+*/
 string 
 Call::getStatus (void)
 {
@@ -185,7 +186,7 @@ Call::setType (enum CallType type)
 bool
 Call::isBusy (void)
 {
-	if (isAnswered() or isOffHold() or isOnMute()) {
+	if (isAnswered() or isOffHold() or isOnMute() or isOffMute()) {
 		return true;
 	} else {
 		return false;
@@ -209,6 +210,12 @@ Call::isOnMute (void)
 	return (_state == MuteOn) ? true : false;
 }
 
+bool 
+Call::isOffMute (void)
+{
+	return (_state == MuteOff) ? true : false;
+}
+
 bool 
 Call::isTransfered (void)
 {
@@ -274,35 +281,35 @@ Call::hangup  (void)
 {
 	int i = _voIPLink->hangup(_id);
 	_voIPLink->deleteSipCall(_id);
-	return 1;
+	return i;
 }
 
 int 
 Call::answer  (void)
 {
 	int i = _voIPLink->answer(_id);
-	return 1;
+	return i;
 }
 
 int 
 Call::onHold  (void)
 {
 	int i = _voIPLink->onhold(_id);
-	return 1;
+	return i;
 }
 
 int 
 Call::offHold  (void)
 {
 	int i = _voIPLink->offhold(_id);
-	return 1;
+	return i;
 }
 
 int 
 Call::transfer  (const string& to)
 {
 	int i = _voIPLink->transfer(_id, to);
-	return 1;
+	return i;
 }
 
 int 
@@ -322,7 +329,7 @@ Call::refuse  (void)
 {
 	int i = _voIPLink->refuse(_id);
 	_voIPLink->deleteSipCall(_id);
-	return 1;
+	return i;
 }
 
 int 
@@ -330,7 +337,7 @@ Call::cancel  (void)
 {
 	int i = _voIPLink->cancel(_id);
 	_voIPLink->deleteSipCall(_id);
-	return 1;
+	return i;
 }
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -343,5 +350,5 @@ Call::initConstructor(void)
 	_state = NotExist;
 	_type = Null;
 	_voIPLinkId = 1;
-	_audiocodec = NULL;
+//	_audiocodec = NULL;
 }
diff --git a/src/call.h b/src/call.h
index b0c6259870793c7544743f0747e6069d232e2fdd..270c5e1e3bfb6381765396370e8184c06bebf497 100644
--- a/src/call.h
+++ b/src/call.h
@@ -52,7 +52,7 @@ enum CallType {
 
 #include "manager.h"
 
-class AudioCodec;
+//class AudioCodec;
 
 class Call {
 public:
@@ -71,7 +71,7 @@ public:
 	void setVoIPLinkId (short voIPLinkId);
 	void setVoIPLink (VoIPLink* voIPLink);
 	VoIPLink* getVoIPLink(void);
-	void setAudioCodec(void);
+//	void setAudioCodec(void);
 		
 	string getStatus (void);
 	void setStatus (const string& status);
@@ -93,6 +93,7 @@ public:
 	bool isOnHold (void);
 	bool isOffHold (void);
 	bool isOnMute (void);
+	bool isOffMute (void);
 	bool isTransfered (void);
 	bool isHungup (void);
 	bool isRinging (void);
@@ -120,7 +121,7 @@ private:
 	
 	Manager* _manager;
 	VoIPLink* _voIPLink;
-	AudioCodec* _audiocodec;
+//	AudioCodec* _audiocodec;
 	
 	short _id;
 	short _voIPLinkId;
diff --git a/src/gui/qt/configurationpanelui.cpp b/src/gui/qt/configurationpanelui.cpp
index c18dffdadf53773dcf8284b1570adbb454d34e73..da265c5f05bc6f7f992416601761063af796b11d 100644
--- a/src/gui/qt/configurationpanelui.cpp
+++ b/src/gui/qt/configurationpanelui.cpp
@@ -1,7 +1,7 @@
 /****************************************************************************
 ** Form implementation generated from reading ui file 'gui/qt/configurationpanel.ui'
 **
-** Created: Fri May 20 14:27:25 2005
+** Created: Tue May 24 16:49:53 2005
 **      by: The User Interface Compiler ($Id$)
 **
 ** WARNING! All changes made in this file will be lost!
diff --git a/src/gui/qt/configurationpanelui.h b/src/gui/qt/configurationpanelui.h
index 5b6774411ce70d377a0bbfd02319c67120e73449..1c2a3061a122c60ff0224232332452b3b2b0aa61 100644
--- a/src/gui/qt/configurationpanelui.h
+++ b/src/gui/qt/configurationpanelui.h
@@ -1,7 +1,7 @@
 /****************************************************************************
 ** Form interface generated from reading ui file 'gui/qt/configurationpanel.ui'
 **
-** Created: Fri May 20 14:27:25 2005
+** Created: Tue May 24 16:49:53 2005
 **      by: The User Interface Compiler ($Id$)
 **
 ** WARNING! All changes made in this file will be lost!
diff --git a/src/gui/qt/phonebookui.cpp b/src/gui/qt/phonebookui.cpp
index 50570c2965044ad8d0d9df060762321f3dae0e57..32083e80ab16907b8a40fb43ad62a120f06c795f 100644
--- a/src/gui/qt/phonebookui.cpp
+++ b/src/gui/qt/phonebookui.cpp
@@ -1,7 +1,7 @@
 /****************************************************************************
 ** Form implementation generated from reading ui file 'gui/qt/phonebook.ui'
 **
-** Created: Fri May 20 14:27:25 2005
+** Created: Tue May 24 16:49:52 2005
 **      by: The User Interface Compiler ($Id$)
 **
 ** WARNING! All changes made in this file will be lost!
diff --git a/src/gui/qt/phonebookui.h b/src/gui/qt/phonebookui.h
index b4944c4b63c62cbea0d1921b35d6d4b71dda430a..03e17b3e87973185babd0229e4c4e5ec0f85e87a 100644
--- a/src/gui/qt/phonebookui.h
+++ b/src/gui/qt/phonebookui.h
@@ -1,7 +1,7 @@
 /****************************************************************************
 ** Form interface generated from reading ui file 'gui/qt/phonebook.ui'
 **
-** Created: Fri May 20 14:27:25 2005
+** Created: Tue May 24 16:49:52 2005
 **      by: The User Interface Compiler ($Id$)
 **
 ** WARNING! All changes made in this file will be lost!
diff --git a/src/gui/qt/qtGUImainwindow.cpp b/src/gui/qt/qtGUImainwindow.cpp
index 565731d815e3a09e60d97f22f6cfc4ba7856659d..bcb74b4d6de6f3b2bc3f4eb86ab8deb31ffba809 100644
--- a/src/gui/qt/qtGUImainwindow.cpp
+++ b/src/gui/qt/qtGUImainwindow.cpp
@@ -130,7 +130,7 @@ QtGUIMainWindow::QtGUIMainWindow (QWidget *parent, const char *name, WFlags f,
                     					Qt::WStyle_NoBorder);
 	_currentLine = -1;
 	_chosenLine = -1;
-	_freeLine = -1;
+	_prevLine = -1;
  	_first = true;
 	_chooseLine = false;
 	_transfer = false;
@@ -590,7 +590,7 @@ QtGUIMainWindow::changeLineStatePixmap (int line, line_state state)
 	if (state == ONHOLD) {
 		// Because for the state of line pixmap there are just 2 states 
 		// (FREE and BUSY), so we associate ONHOLD to BUSY
-		state = state - 1;
+		state = BUSY;
 	}
    	phLines[line]->button()->setPixmap(TabLinePixmap[line][state]);
 }
@@ -612,6 +612,7 @@ QtGUIMainWindow::putOnHoldBusyLine (int line)
 {
 	if (line != -1 and !phLines[line]->getbRinging()) {
 		// Occurs when newly off-hook line replaces another one.
+		_debug("On hold line %d [id=%d]\n", line, line2id(line));
 		qt_onHoldCall(line2id(line));
 		changeLineStatePixmap(line, ONHOLD);
 		return 1;
@@ -749,15 +750,18 @@ QtGUIMainWindow::peerHungupCall (short id)
 {
 	int line = id2line(id);
 
+	if (line == getCurrentLine()) {
+		stopCallTimer(id);
+		_callmanager->displayStatus(HUNGUP_STATUS);
+		setCurrentLine(-1);
+	}
 	getPhoneLine(id)->setStatus(QString(getCall(id)->getStatus()));
 	changeLineStatePixmap(line, FREE);
-	stopCallTimer(id);
 	getPhoneLine(id)->setbRinging(false);
 	getPhoneLine(id)->setCallId(0);
 	setChooseLine(false);
-	setCurrentLine(-1);
 	_TabIncomingCalls[line] = -1;
-
+	
 	return 1;
 }
 
@@ -827,6 +831,7 @@ QtGUIMainWindow::qt_outgoingCall (void)
 	id = outgoingCall(to);
 	if (id > 0) {	
 		line = associateCall2Line(id);
+		_debug("Call %d -> line %d\n", id, line);
 
 		setCurrentLine(line);
 		displayStatus(TRYING_STATUS);
@@ -961,7 +966,6 @@ QtGUIMainWindow::toggleLine (int line)
 	busyLine = busyLineNumber();
 	
 	id = line2id(line);
-	_debug("line2id(line) = %d and busy line = %d\n", id, busyLine);
 	if (id > 0) {
 	// If the call-id already exists
 		call = getCall(id);
@@ -1007,11 +1011,13 @@ QtGUIMainWindow::toggleLine (int line)
 		setChosenLine(line);
 
 		putOnHoldBusyLine(busyLine);
-		if (getFreeLine() != -1 and getFreeLine() != line) {
-			changeLineStatePixmap(getFreeLine(), FREE);
+		if (getPrevLine() != -1 and getPrevLine() != line 
+				and phLines[getPrevLine()]->isFree()) {
+			changeLineStatePixmap(getPrevLine(), FREE);
 		}
 	
-		setFreeLine(line);			
+		setPrevLine(line);	
+		
 		_lcd->setInFunction(false);
 		_lcd->clearBuffer();
 		dialtone(true);
@@ -1136,6 +1142,7 @@ QtGUIMainWindow::volumeMicChanged (int val) {
 
 void
 QtGUIMainWindow::registerSlot (void) {
+	_panel->saveSlot();	
 	registerVoIPLink();
 }
 
@@ -1335,7 +1342,6 @@ QtGUIMainWindow::blinkRingSlot (void)
 {
     static bool isOn = false;
     int state = BUSY;
-    int line;
 	int i;
 
 	if (isThereIncomingCall() != -1) {
diff --git a/src/gui/qt/qtGUImainwindow.h b/src/gui/qt/qtGUImainwindow.h
index 8726377c0e748ba6fd231ed434ba4658afdac54a..332e7b3381affea1c5f70a15deffcdcbfa9b2168 100644
--- a/src/gui/qt/qtGUImainwindow.h
+++ b/src/gui/qt/qtGUImainwindow.h
@@ -277,9 +277,9 @@ private:
 	// line by the user
 	bool _chooseLine;
 	int _chosenLine;
-	int _freeLine;
-	inline void setFreeLine(int line) { _freeLine = line; }
-	inline int getFreeLine(void) { return _freeLine; }
+	int _prevLine;
+	inline void setPrevLine(int line) { _prevLine = line; }
+	inline int getPrevLine(void) { return _prevLine; }
 
 	// Array of incoming calls
 	int _TabIncomingCalls[NUMBER_OF_LINES];
diff --git a/src/gui/qt/url_inputui.cpp b/src/gui/qt/url_inputui.cpp
index 179f1048c6ed4ed06e089f4eacd5f18561fc0489..076e06fd8366ba2cf86fb66de7f13b8950a55edf 100644
--- a/src/gui/qt/url_inputui.cpp
+++ b/src/gui/qt/url_inputui.cpp
@@ -1,7 +1,7 @@
 /****************************************************************************
 ** Form implementation generated from reading ui file 'gui/qt/url_input.ui'
 **
-** Created: Fri May 20 14:27:25 2005
+** Created: Tue May 24 16:49:53 2005
 **      by: The User Interface Compiler ($Id$)
 **
 ** WARNING! All changes made in this file will be lost!
diff --git a/src/gui/qt/url_inputui.h b/src/gui/qt/url_inputui.h
index 26c7c91f2a780b9618744ef7ed71846fb958436b..1f0d81cb2815864b5ef115b516d30e6739c7c7bd 100644
--- a/src/gui/qt/url_inputui.h
+++ b/src/gui/qt/url_inputui.h
@@ -1,7 +1,7 @@
 /****************************************************************************
 ** Form interface generated from reading ui file 'gui/qt/url_input.ui'
 **
-** Created: Fri May 20 14:27:25 2005
+** Created: Tue May 24 16:49:52 2005
 **      by: The User Interface Compiler ($Id$)
 **
 ** WARNING! All changes made in this file will be lost!
diff --git a/src/manager.cpp b/src/manager.cpp
index 2d0cb3ded2eecc7cb3a5b7efd35b69f0ebae0489..dc564e44b11b40327c2ee8fd37860a87fbf624be 100644
--- a/src/manager.cpp
+++ b/src/manager.cpp
@@ -100,6 +100,11 @@ Manager::~Manager (void)
 	delete _voIPLinkVector;			
 	delete _error;
 	delete _tone;
+	delete _codecDescVector;
+	delete audiodriver;
+#ifdef ALSA
+	delete audiodriverReadAlsa;
+#endif
 } 
 
 void 
@@ -211,7 +216,6 @@ Manager::pushBackNewCall (short id, enum CallType type)
 {
 	Call* call = new Call(this, id, type, _voIPLinkVector->at(DFT_VOIP_LINK));
 	// Set the wanted voip-link (first of the list)
-	_debug("new Call @ 0X%d\n", call);
 	_callVector->push_back(call);
 }
 
@@ -242,7 +246,7 @@ Manager::outgoingCall (const string& to)
 	id = generateNewCallId();
 	pushBackNewCall(id, Outgoing);
 	
-	_debug("\nOutgoing Call with identifiant %d\n", id);
+	_debug("Outgoing Call with identifiant %d\n", id);
 	call = getCall(id);
 	
 	call->setStatus(string(TRYING_STATUS));
@@ -444,6 +448,7 @@ Manager::incomingCall (short id)
 	call->setState(Progressing);
 	ringtone(true);
 	_gui->incomingCall(id);
+	displayStatus(RINGING_STATUS);
 	return 1;
 }
 
@@ -458,6 +463,7 @@ Manager::peerAnsweredCall (short id)
 	call->setState(Answered);
 	_gui->peerAnsweredCall(id);
 	ringback(false);
+	displayStatus(CONNECTED_STATUS);
 	return 1;
 }
 
@@ -471,7 +477,7 @@ Manager::peerRingingCall (short id)
 	call->setState(Ringing);
 	_gui->peerRingingCall(id);
 	ringback(true);
-	
+	displayStatus(RINGING_STATUS);	
 	return 1;
 }
 
diff --git a/src/sipcall.cpp b/src/sipcall.cpp
index 69aaec0aa40720a58e277d6998c180a67ee52aa9..349ec07067d35e9a53adf2b19204f4e218c7d599 100644
--- a/src/sipcall.cpp
+++ b/src/sipcall.cpp
@@ -37,7 +37,7 @@ SipCall::SipCall (short id, CodecDescriptorVector* cdv)
 	_cdv = cdv;
 	_audiocodec = NULL;
 	_standby = false;
-	//this->usehold = false;
+	enable_audio = -1;
 }
 
 
diff --git a/src/sipcall.h b/src/sipcall.h
index ea7f9c3ac5b3d7c186003e639ce5df7652263c8f..3ebafe796bb5561751c49aab382a37caf5488deb 100644
--- a/src/sipcall.h
+++ b/src/sipcall.h
@@ -39,7 +39,6 @@ public:
 	SipCall (short id, CodecDescriptorVector* cdv);
 	~SipCall (void);
 
-	bool 	usehold;
  	int  	payload;
   	int  	enable_audio; /* 1 started, -1 stopped */
 	
diff --git a/src/sipvoiplink.cpp b/src/sipvoiplink.cpp
index b4e45e1b524e4885fd8844f355ef97d847e7238b..ba320ef2933bf49860bbc4d6ab1fa5938c8eadf0 100644
--- a/src/sipvoiplink.cpp
+++ b/src/sipvoiplink.cpp
@@ -404,7 +404,7 @@ SipVoIPLink::getEvent (void)
 			
 			id = _manager->generateNewCallId();
 			_manager->pushBackNewCall(id, Incoming);
-			_debug("\nIncoming Call with identifiant %d [cid = %d, did = %d]\n",
+			_debug("Incoming Call with identifiant %d [cid = %d, did = %d]\n",
 				   id, event->cid, event->did);
 			_debug("Local audio port: %d\n", _localPort);
 
@@ -424,7 +424,6 @@ SipVoIPLink::getEvent (void)
 			// Associate an audio port with a call
 			getSipCall(id)->setLocalAudioPort(_localPort);
 			
-			_manager->displayStatus(RINGING_STATUS);
 			break;
 
 		// The peer-user answers
@@ -439,6 +438,7 @@ SipVoIPLink::getEvent (void)
 			// Answer
 			if (id > 0 and !_manager->getCall(id)->isOnHold()
 					   and !_manager->getCall(id)->isOffHold()) {
+				getSipCall(id)->setStandBy(false);
 				getSipCall(id)->setLocalAudioPort(_localPort);
 				getSipCall(id)->answeredCall(event);
 				_manager->peerAnsweredCall(id);
@@ -449,7 +449,6 @@ SipVoIPLink::getEvent (void)
 							__FILE__, __LINE__);
 					exit(1);
 				}
-				_manager->displayStatus(CONNECTED_STATUS);
 			}
 			break;
 
@@ -463,13 +462,12 @@ SipVoIPLink::getEvent (void)
 				getSipCall(id)->ringingCall(event);
 				_manager->peerRingingCall(id);
 			} 
-			_manager->displayStatus(RINGING_STATUS);
 			break;
 
 		case EXOSIP_CALL_REDIRECTED:
 			break;
 
-		// The remote peer closed the phone call(we received BYE).
+		// The peer-user closed the phone call(we received BYE).
 		case EXOSIP_CALL_CLOSED:
 			id = findCallId(event);
 			_debug("Call is closed [id = %d, cid = %d, did = %d]\n", 
@@ -479,7 +477,6 @@ SipVoIPLink::getEvent (void)
 				_manager->peerHungupCall(id);
 				_audiortp->closeRtpSession(getSipCall(id));
 				deleteSipCall(id);
-				_manager->displayStatus(HUNGUP_STATUS);
 			}	
 			break;
 
@@ -654,7 +651,6 @@ void
 SipVoIPLink::newIncomingCall (short callid)
 {
 	SipCall* sipcall = new SipCall(callid, _manager->getCodecDescVector());
-	_debug("new SipCall @ 0X%d\n", sipcall);
 	_sipcallVector->push_back(sipcall);
 }
 
diff --git a/src/user_cfg.h b/src/user_cfg.h
index c0d6701cd77e738d44a25e7874e8ee61a4ffc89e..796af46d0e7796628fefe308915e5d0e3a7a611c 100644
--- a/src/user_cfg.h
+++ b/src/user_cfg.h
@@ -80,7 +80,7 @@
 #define CONFIRM_QUIT	"Options.confirmQuit"
 #define ZONE_TONE		"Options.zoneToneChoice"
 #define CHECKED_TRAY	"Options.checkedTray"
-#define VOICEMAIL_NUM	"Themes.voicemailNumber"
+#define VOICEMAIL_NUM	"Options.voicemailNumber"
 
 // Default values
 #define DFT_VOIP_LINK		0	// index of the first VoIP link by default