From eba29f5fc8c31e03fab8a97458ffe4a58c7c698f Mon Sep 17 00:00:00 2001
From: llea <llea>
Date: Fri, 20 May 2005 19:14:52 +0000
Subject: [PATCH] New orgnisation of SFLphone

---
 Makefile                                      |    4 +-
 src/Makefile                                  |  126 +-
 src/audio/alaw.cpp                            |   44 +
 src/audio/alaw.h                              |   38 +
 src/{ => audio}/audiobuffer.cpp               |    4 +-
 src/{ => audio}/audiobuffer.h                 |    2 +-
 src/audio/audiocodec.cpp                      |   54 +
 src/audio/audiocodec.h                        |   46 +
 src/{ => audio}/audiodrivers.cpp              |    2 +-
 src/{ => audio}/audiodrivers.h                |    2 +-
 src/{ => audio}/audiodriversalsa.cpp          |    4 +-
 src/{ => audio}/audiodriversalsa.h            |    4 +-
 src/{ => audio}/audiodriversoss.cpp           |    4 +-
 src/{ => audio}/audiodriversoss.h             |    4 +-
 src/audio/audiortp.cpp                        |  338 ++++
 src/{ => audio}/audiortp.h                    |   32 +-
 src/audio/codecDescriptor.cpp                 |  131 ++
 src/{audiocodec.h => audio/codecDescriptor.h} |   51 +-
 src/audio/common.h                            |   56 +
 src/{ => audio}/dtmf.cpp                      |    1 -
 src/{ => audio}/dtmf.h                        |    0
 src/{ => audio}/dtmfgenerator.cpp             |    4 +-
 src/{ => audio}/dtmfgenerator.h               |    0
 src/{ => audio}/g711.cpp                      |    0
 src/{ => audio}/g711.h                        |    0
 {gsm => src/audio/gsm}/COPYRIGHT              |    0
 {gsm => src/audio/gsm}/ChangeLog              |    0
 {gsm => src/audio/gsm}/INSTALL                |    0
 {gsm => src/audio/gsm}/MACHINES               |    0
 {gsm => src/audio/gsm}/MANIFEST               |    0
 {gsm => src/audio/gsm}/Makefile               |    0
 {gsm => src/audio/gsm}/README                 |    0
 {gsm => src/audio/gsm}/add.c                  |    0
 {gsm => src/audio/gsm}/code.c                 |    0
 {gsm => src/audio/gsm}/config.h               |    0
 {gsm => src/audio/gsm}/debug.c                |    0
 {gsm => src/audio/gsm}/decode.c               |    0
 {gsm => src/audio/gsm}/gsm.h                  |    0
 {gsm => src/audio/gsm}/gsm_create.c           |    0
 {gsm => src/audio/gsm}/gsm_decode.c           |    0
 {gsm => src/audio/gsm}/gsm_destroy.c          |    0
 {gsm => src/audio/gsm}/gsm_encode.c           |    0
 {gsm => src/audio/gsm}/gsm_explode.c          |    0
 {gsm => src/audio/gsm}/gsm_implode.c          |    0
 {gsm => src/audio/gsm}/gsm_option.c           |    0
 {gsm => src/audio/gsm}/gsm_print.c            |    0
 {gsm => src/audio/gsm}/long_term.c            |    0
 {gsm => src/audio/gsm}/lpc.c                  |    0
 {gsm => src/audio/gsm}/preprocess.c           |    0
 {gsm => src/audio/gsm}/private.h              |    0
 {gsm => src/audio/gsm}/proto.h                |    0
 {gsm => src/audio/gsm}/rpe.c                  |    0
 {gsm => src/audio/gsm}/short_term.c           |    0
 {gsm => src/audio/gsm}/table.c                |    0
 {gsm => src/audio/gsm}/toast.c                |    0
 {gsm => src/audio/gsm}/toast.h                |    0
 {gsm => src/audio/gsm}/toast_alaw.c           |    0
 {gsm => src/audio/gsm}/toast_audio.c          |    0
 {gsm => src/audio/gsm}/toast_lin.c            |    0
 {gsm => src/audio/gsm}/toast_ulaw.c           |    0
 {gsm => src/audio/gsm}/unproto.h              |    0
 src/audio/gsmcodec.cpp                        |   59 +
 src/audio/gsmcodec.h                          |   42 +
 src/{ => audio}/tonegenerator.cpp             |   90 +-
 src/{ => audio}/tonegenerator.h               |   25 +-
 src/audio/ulaw.cpp                            |   44 +
 src/audio/ulaw.h                              |   38 +
 src/audiocodec.cpp                            |  192 --
 src/audiortp.cpp                              |  358 ----
 src/call.cpp                                  |  347 ++++
 src/call.h                                    |  136 ++
 src/configitem.cpp                            |   24 +-
 src/configitem.h                              |   23 +-
 src/configuration.cpp                         |   73 +-
 src/configuration.h                           |   31 +-
 src/configurationtree.cpp                     |   80 +-
 src/configurationtree.h                       |   12 +-
 src/error.cpp                                 |   59 +-
 src/error.h                                   |    7 +-
 src/eventthread.cpp                           |   48 +
 src/eventthread.h                             |   38 +
 src/global.h                                  |   15 +-
 src/gui/guiframework.cpp                      |  174 ++
 src/gui/guiframework.h                        |   74 +
 src/{ => gui/qt}/configurationpanel.ui        |   59 +-
 src/{ => gui/qt}/configurationpanel.ui.h      |  116 +-
 src/{ => gui/qt}/configurationpanelui.cpp     | 1010 +++++-----
 src/{ => gui/qt}/configurationpanelui.h       |    8 +-
 src/{ => gui/qt}/jpushbutton.cpp              |    2 +-
 src/{ => gui/qt}/jpushbutton.h                |    0
 src/{ => gui/qt}/mydisplay.cpp                |  134 +-
 src/{ => gui/qt}/mydisplay.h                  |   27 +-
 src/{ => gui/qt}/numerickeypad.cpp            |    7 +-
 src/{ => gui/qt}/numerickeypad.h              |    0
 src/{ => gui/qt}/numerickeypadtools.cpp       |    0
 src/{ => gui/qt}/numerickeypadtools.h         |    0
 src/{ => gui/qt}/phonebook.ui                 |    0
 src/{ => gui/qt}/phonebookui.cpp              |    6 +-
 src/{ => gui/qt}/phonebookui.h                |    4 +-
 src/{ => gui/qt}/phoneline.cpp                |    1 +
 src/{ => gui/qt}/phoneline.h                  |   20 +-
 src/{ => gui/qt}/point.cpp                    |   18 +-
 src/{ => gui/qt}/point.h                      |    2 +-
 src/{ => gui/qt}/qjlistboxpixmap.cpp          |    0
 src/{ => gui/qt}/qjlistboxpixmap.h            |    0
 src/gui/qt/qtGUImainwindow.cpp                | 1688 +++++++++++++++++
 src/gui/qt/qtGUImainwindow.h                  |  364 ++++
 src/{ => gui/qt}/transqwidget.cpp             |    0
 src/{ => gui/qt}/transqwidget.h               |    0
 src/{ => gui/qt}/trayicon.cpp                 |    0
 src/{ => gui/qt}/trayicon.h                   |    0
 src/gui/qt/trayicon_x11.cpp                   |  407 ++++
 src/{ => gui/qt}/url_input.ui                 |    0
 src/{ => gui/qt}/url_input.ui.h               |    0
 src/{ => gui/qt}/url_inputui.cpp              |    6 +-
 src/{ => gui/qt}/url_inputui.h                |    4 +-
 src/{ => gui/qt}/vector.cpp                   |    0
 src/{ => gui/qt}/vector.h                     |    0
 src/{ => gui/qt}/volumecontrol.cpp            |    2 +-
 src/{ => gui/qt}/volumecontrol.h              |    1 +
 src/main.cpp                                  |  152 +-
 src/manager.cpp                               | 1116 ++++++-----
 src/manager.h                                 |  327 +++-
 src/qtGUImainwindow.cpp                       | 1449 --------------
 src/qtGUImainwindow.h                         |  243 ---
 src/sip.cpp                                   | 1098 -----------
 src/sip.h                                     |  122 --
 src/sipcall.cpp                               |  306 +--
 src/sipcall.h                                 |   84 +-
 src/sipvoiplink.cpp                           |  862 +++++++++
 src/sipvoiplink.h                             |  124 ++
 src/skin.cpp                                  |   37 +-
 src/skin.h                                    |   17 +-
 src/user_cfg.h                                |  106 ++
 src/voIPLink.cpp                              |  114 ++
 src/voIPLink.h                                |   86 +
 stund/client                                  |  Bin 328570 -> 328558 bytes
 stund/server                                  |  Bin 323140 -> 323128 bytes
 stund/udp.h                                   |    4 +-
 139 files changed, 7735 insertions(+), 5338 deletions(-)
 create mode 100644 src/audio/alaw.cpp
 create mode 100644 src/audio/alaw.h
 rename src/{ => audio}/audiobuffer.cpp (95%)
 rename src/{ => audio}/audiobuffer.h (97%)
 create mode 100644 src/audio/audiocodec.cpp
 create mode 100644 src/audio/audiocodec.h
 rename src/{ => audio}/audiodrivers.cpp (96%)
 rename src/{ => audio}/audiodrivers.h (97%)
 rename src/{ => audio}/audiodriversalsa.cpp (98%)
 rename src/{ => audio}/audiodriversalsa.h (96%)
 rename src/{ => audio}/audiodriversoss.cpp (99%)
 rename src/{ => audio}/audiodriversoss.h (95%)
 create mode 100644 src/audio/audiortp.cpp
 rename src/{ => audio}/audiortp.h (82%)
 create mode 100644 src/audio/codecDescriptor.cpp
 rename src/{audiocodec.h => audio/codecDescriptor.h} (60%)
 create mode 100644 src/audio/common.h
 rename src/{ => audio}/dtmf.cpp (98%)
 rename src/{ => audio}/dtmf.h (100%)
 rename src/{ => audio}/dtmfgenerator.cpp (98%)
 rename src/{ => audio}/dtmfgenerator.h (100%)
 rename src/{ => audio}/g711.cpp (100%)
 rename src/{ => audio}/g711.h (100%)
 rename {gsm => src/audio/gsm}/COPYRIGHT (100%)
 rename {gsm => src/audio/gsm}/ChangeLog (100%)
 rename {gsm => src/audio/gsm}/INSTALL (100%)
 rename {gsm => src/audio/gsm}/MACHINES (100%)
 rename {gsm => src/audio/gsm}/MANIFEST (100%)
 rename {gsm => src/audio/gsm}/Makefile (100%)
 rename {gsm => src/audio/gsm}/README (100%)
 rename {gsm => src/audio/gsm}/add.c (100%)
 rename {gsm => src/audio/gsm}/code.c (100%)
 rename {gsm => src/audio/gsm}/config.h (100%)
 rename {gsm => src/audio/gsm}/debug.c (100%)
 rename {gsm => src/audio/gsm}/decode.c (100%)
 rename {gsm => src/audio/gsm}/gsm.h (100%)
 rename {gsm => src/audio/gsm}/gsm_create.c (100%)
 rename {gsm => src/audio/gsm}/gsm_decode.c (100%)
 rename {gsm => src/audio/gsm}/gsm_destroy.c (100%)
 rename {gsm => src/audio/gsm}/gsm_encode.c (100%)
 rename {gsm => src/audio/gsm}/gsm_explode.c (100%)
 rename {gsm => src/audio/gsm}/gsm_implode.c (100%)
 rename {gsm => src/audio/gsm}/gsm_option.c (100%)
 rename {gsm => src/audio/gsm}/gsm_print.c (100%)
 rename {gsm => src/audio/gsm}/long_term.c (100%)
 rename {gsm => src/audio/gsm}/lpc.c (100%)
 rename {gsm => src/audio/gsm}/preprocess.c (100%)
 rename {gsm => src/audio/gsm}/private.h (100%)
 rename {gsm => src/audio/gsm}/proto.h (100%)
 rename {gsm => src/audio/gsm}/rpe.c (100%)
 rename {gsm => src/audio/gsm}/short_term.c (100%)
 rename {gsm => src/audio/gsm}/table.c (100%)
 rename {gsm => src/audio/gsm}/toast.c (100%)
 rename {gsm => src/audio/gsm}/toast.h (100%)
 rename {gsm => src/audio/gsm}/toast_alaw.c (100%)
 rename {gsm => src/audio/gsm}/toast_audio.c (100%)
 rename {gsm => src/audio/gsm}/toast_lin.c (100%)
 rename {gsm => src/audio/gsm}/toast_ulaw.c (100%)
 rename {gsm => src/audio/gsm}/unproto.h (100%)
 create mode 100644 src/audio/gsmcodec.cpp
 create mode 100644 src/audio/gsmcodec.h
 rename src/{ => audio}/tonegenerator.cpp (82%)
 rename src/{ => audio}/tonegenerator.h (81%)
 create mode 100644 src/audio/ulaw.cpp
 create mode 100644 src/audio/ulaw.h
 delete mode 100644 src/audiocodec.cpp
 delete mode 100644 src/audiortp.cpp
 create mode 100644 src/call.cpp
 create mode 100644 src/call.h
 create mode 100644 src/eventthread.cpp
 create mode 100644 src/eventthread.h
 create mode 100644 src/gui/guiframework.cpp
 create mode 100644 src/gui/guiframework.h
 rename src/{ => gui/qt}/configurationpanel.ui (87%)
 rename src/{ => gui/qt}/configurationpanel.ui.h (57%)
 rename src/{ => gui/qt}/configurationpanelui.cpp (68%)
 rename src/{ => gui/qt}/configurationpanelui.h (97%)
 rename src/{ => gui/qt}/jpushbutton.cpp (99%)
 rename src/{ => gui/qt}/jpushbutton.h (100%)
 rename src/{ => gui/qt}/mydisplay.cpp (77%)
 rename src/{ => gui/qt}/mydisplay.h (80%)
 rename src/{ => gui/qt}/numerickeypad.cpp (96%)
 rename src/{ => gui/qt}/numerickeypad.h (100%)
 rename src/{ => gui/qt}/numerickeypadtools.cpp (100%)
 rename src/{ => gui/qt}/numerickeypadtools.h (100%)
 rename src/{ => gui/qt}/phonebook.ui (100%)
 rename src/{ => gui/qt}/phonebookui.cpp (96%)
 rename src/{ => gui/qt}/phonebookui.h (91%)
 rename src/{ => gui/qt}/phoneline.cpp (99%)
 rename src/{ => gui/qt}/phoneline.h (83%)
 rename src/{ => gui/qt}/point.cpp (91%)
 rename src/{ => gui/qt}/point.h (98%)
 rename src/{ => gui/qt}/qjlistboxpixmap.cpp (100%)
 rename src/{ => gui/qt}/qjlistboxpixmap.h (100%)
 create mode 100644 src/gui/qt/qtGUImainwindow.cpp
 create mode 100644 src/gui/qt/qtGUImainwindow.h
 rename src/{ => gui/qt}/transqwidget.cpp (100%)
 rename src/{ => gui/qt}/transqwidget.h (100%)
 rename src/{ => gui/qt}/trayicon.cpp (100%)
 rename src/{ => gui/qt}/trayicon.h (100%)
 create mode 100644 src/gui/qt/trayicon_x11.cpp
 rename src/{ => gui/qt}/url_input.ui (100%)
 rename src/{ => gui/qt}/url_input.ui.h (100%)
 rename src/{ => gui/qt}/url_inputui.cpp (94%)
 rename src/{ => gui/qt}/url_inputui.h (88%)
 rename src/{ => gui/qt}/vector.cpp (100%)
 rename src/{ => gui/qt}/vector.h (100%)
 rename src/{ => gui/qt}/volumecontrol.cpp (99%)
 rename src/{ => gui/qt}/volumecontrol.h (99%)
 delete mode 100644 src/qtGUImainwindow.cpp
 delete mode 100644 src/qtGUImainwindow.h
 delete mode 100644 src/sip.cpp
 delete mode 100644 src/sip.h
 create mode 100644 src/sipvoiplink.cpp
 create mode 100644 src/sipvoiplink.h
 create mode 100644 src/user_cfg.h
 create mode 100644 src/voIPLink.cpp
 create mode 100644 src/voIPLink.h

diff --git a/Makefile b/Makefile
index a035b8fb96..65e18052cc 100644
--- a/Makefile
+++ b/Makefile
@@ -4,7 +4,7 @@
 # Author: Laurielle Lea (laurielle.lea@savoirfairelinux.com)
 #
 all:
-	cd gsm ; make
+	cd src/audio/gsm ; make
 	cd src; make
 
 install:
@@ -15,5 +15,5 @@ uninstall:
 
 clean:
 	cd src; make clean
-	cd gsm ; make clean
+	cd src/audio/gsm ; make clean
 
diff --git a/src/Makefile b/src/Makefile
index 0e2064f80c..42d4337ede 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -17,59 +17,73 @@ SKINS = skins
 RINGS = rings
 METAL_SKINS = metal
 
-ifdef ALSA
-endif
-	
-INCPATH  = -I. -I$(QTDIR)/include -I$(CCPPDIR)/include/cc++2 -I$(CCRTPDIR)/include -I$(OSIPDIR)/include -I$(EXOPSIP)/include -I/usr/include -I../gsm
+INCPATH  = -I. -I$(QTDIR)/include -I$(CCPPDIR)/include/cc++2 -I$(CCRTPDIR)/include -I$(OSIPDIR)/include -I$(EXOPSIP)/include -I/usr/include -Iaudio/gsm
 
 CXXFLAGS = -pipe -Wall -W -g -pipe -march=i386 -mcpu=i686  -DQT_NO_DEBUG -DQT_SHARED -DQT_THREAD_SUPPORT -fpermissive -Wno-deprecated $(INCPATH)
 
 LIBS=-L$(QTDIR)/lib -L/usr/X11R6/lib -lqt-mt -lXext -lX11 -lm -L/opt/lib -losip2 -leXosip -lccrtp1 -lasound `$(CCPPDIR)/bin/ccgnu2-config --flags --stdlibs` 
 
-EXTRALIBS=../gsm/libgsm.a
+EXTRALIBS=audio/gsm/libgsm.a
 
 CONFIGURE_CONF=$(shell ls ../configure.conf)
 
 	
 OBJS = \
-	audiobuffer.o \
-	audiocodec.o \
-	audiodrivers.o \
-	audiodriversoss.o \
-	audiodriversalsa.o \
-	audiortp.o \
-	configuration.o \
+	audio/audiobuffer.o \
+	audio/audiocodec.o \
+	audio/codecDescriptor.o \
+	audio/audiodrivers.o \
+	audio/audiodriversalsa.o \
+	audio/audiodriversoss.o \
+	audio/audiortp.o \
+	audio/dtmf.o \
+	audio/dtmfgenerator.o \
+	audio/tonegenerator.o \
+	audio/g711.o \
+	audio/gsmcodec.o \
+	audio/alaw.o \
+	audio/ulaw.o \
+	call.o \
 	configitem.o \
+	configuration.o \
 	configurationtree.o \
-	dtmf.o \
-	dtmfgenerator.o \
 	error.o \
-	g711.o \
+	eventthread.o \
+	gui/guiframework.o \
+	gui/qt/mydisplay.o \
+    gui/qt/numerickeypadtools.o \
+    gui/qt/phoneline.o \
+    gui/qt/point.o \
+	gui/qt/transqwidget.o \
+    gui/qt/trayicon.o \
+	gui/qt/trayicon.moc.o \
+	gui/qt/trayicon_x11.o \
+	gui/qt/vector.o \
+	gui/qt/volumecontrol.o \
+	gui/qt/volumecontrol.moc.o \
+    gui/qt/jpushbutton.o \
+	gui/qt/jpushbutton.moc.o \
+    gui/qt/numerickeypad.o \
+	gui/qt/numerickeypad.moc.o \
+	gui/qt/qjlistboxpixmap.o \
+    gui/qt/qtGUImainwindow.o \
+	gui/qt/qtGUImainwindow.moc.o \
+	gui/qt/configurationpanelui.o \
+	gui/qt/configurationpanelui.moc.o \
+	gui/qt/url_inputui.o \
+	gui/qt/url_inputui.moc.o \
 	main.o \
 	manager.o \
-	mydisplay.o \
-	numerickeypadtools.o \
-	phoneline.o \
-	point.o \
-	qjlistboxpixmap.o \
-	sip.o \
 	sipcall.o \
+	sipvoiplink.o \
 	skin.o \
-	url_inputui.o url_inputui.moc.o \
-	phonebookui.o phonebookui.moc.o \
-	configurationpanelui.o configurationpanelui.moc.o \
-	tonegenerator.o \
-	transqwidget.o \
-	trayicon.o trayicon.moc.o trayicon_x11.o \
-	jpushbutton.o jpushbutton.moc.o \
-	numerickeypad.o numerickeypad.moc.o \
-	qtGUImainwindow.o qtGUImainwindow.moc.o \
-	vector.o \
-	volumecontrol.o volumecontrol.moc.o \
-	stun.o udp.o  
+	voIPLink.o \
+	stun.o \
+	udp.o 
+  		
 	
 start:	check prereq all
-#start:	check  all
+#start:check all
 
 check:
 ifeq ($(CONFIGURE_CONF),../configure.conf)
@@ -81,14 +95,14 @@ endif
 .cpp.o:
 	$(CXX) $(DEFVARS) $(CXXFLAGS) -c -o $@ $<
 
-prereq:	phonebook.ui url_input.ui configurationpanel.ui
+prereq:	gui/qt/phonebook.ui gui/qt/url_input.ui gui/qt/configurationpanel.ui
 	@echo "Making User Interface files..."
-	$(UIC) -o phonebookui.h phonebook.ui
-	$(UIC) -o phonebookui.cpp -impl phonebookui.h phonebook.ui
-	$(UIC) -o url_inputui.h url_input.ui
-	$(UIC) -o url_inputui.cpp -impl url_inputui.h url_input.ui
-	$(UIC) -o configurationpanelui.h configurationpanel.ui
-	$(UIC) -o configurationpanelui.cpp -impl configurationpanelui.h configurationpanel.ui
+	$(UIC) -o gui/qt/phonebookui.h gui/qt/phonebook.ui
+	$(UIC) -o gui/qt/phonebookui.cpp -impl gui/qt/phonebookui.h gui/qt/phonebook.ui
+	$(UIC) -o gui/qt/url_inputui.h gui/qt/url_input.ui
+	$(UIC) -o gui/qt/url_inputui.cpp -impl gui/qt/url_inputui.h gui/qt/url_input.ui
+	$(UIC) -o gui/qt/configurationpanelui.h gui/qt/configurationpanel.ui
+	$(UIC) -o gui/qt/configurationpanelui.cpp -impl gui/qt/configurationpanelui.h gui/qt/configurationpanel.ui
 
 %.moc.cpp: %.h
 	$(MOC) -o $@ $<
@@ -106,21 +120,21 @@ all: $(PROGNAME)
 $(PROGNAME): $(OBJS) $(EXTRALIBS)
 	$(CXX) -o $@ $(OBJS) $(LIBS) $(EXTRALIBS)
 	
-install:	all
-	mkdir -p $(BIN_DIR)
-	mkdir -p $(SHARE_DIR)/$(PROGNAME)
-	install --mode=0755 $(PROGNAME) $(BIN_DIR)
-	cd ..; cp -R $(PIXMAPS) $(SHARE_DIR)/$(PROGNAME)/ ; \
-		chmod -R a+rX $(SHARE_DIR)/$(PROGNAME)/$(PIXMAPS)
-	cd ..; cp -R $(SKINS) $(SHARE_DIR)/$(PROGNAME)/ ; \
-		chmod -R a+rX $(SHARE_DIR)/$(PROGNAME)/$(SKINS)
-	cd ..; cp -R $(RINGS) $(SHARE_DIR)/$(PROGNAME)/ ; \
-		chmod -R a+rX $(SHARE_DIR)/$(PROGNAME)/$(RINGS)
-
-uninstall: 
-	rm -f $(BIN_DIR)/$(PROGNAME)
-	rm -rf $(SHARE_DIR)/$(PROGNAME)
+#install:	all
+#	mkdir -p $(BIN_DIR)
+#	mkdir -p $(SHARE_DIR)/$(PROGNAME)
+#	install --mode=0755 $(PROGNAME) $(BIN_DIR)
+#	cd ..; cp -R $(PIXMAPS) $(SHARE_DIR)/$(PROGNAME)/ ; \
+#		chmod -R a+rX $(SHARE_DIR)/$(PROGNAME)/$(PIXMAPS)
+#	cd ..; cp -R $(SKINS) $(SHARE_DIR)/$(PROGNAME)/ ; \
+#		chmod -R a+rX $(SHARE_DIR)/$(PROGNAME)/$(SKINS)
+#	cd ..; cp -R $(RINGS) $(SHARE_DIR)/$(PROGNAME)/ ; \
+#		chmod -R a+rX $(SHARE_DIR)/$(PROGNAME)/$(RINGS)
+#
+#uninstall: 
+#	rm -f $(BIN_DIR)/$(PROGNAME)
+#	rm -rf $(SHARE_DIR)/$(PROGNAME)
 
 clean:
-	rm -f $(PROGNAME) *.o *.a *~ *.moc.cpp *.bak core.*
+	rm -f $(PROGNAME) *.o audio/*.o audio/gsm/*.o gui/*.o gui/qt/*.o audio/gsm/*.a *~ *.moc.cpp *.bak core.*
 
diff --git a/src/audio/alaw.cpp b/src/audio/alaw.cpp
new file mode 100644
index 0000000000..041ee3337f
--- /dev/null
+++ b/src/audio/alaw.cpp
@@ -0,0 +1,44 @@
+/**
+ *  Copyright (C) 2004-2005 Savoir-Faire Linux inc.
+ *  Author:  Laurielle Lea <laurielle.lea@savoirfairelinux.com>
+ *                                                                              
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *                                                                              
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "g711.h"
+#include "alaw.h"
+
+Alaw::Alaw(int payload, const string& codec) : AudioCodec(payload, codec)
+{
+	_codecName = codec;
+	_payload = payload;
+}
+
+Alaw::~Alaw (void)
+{
+}
+
+int
+Alaw::codecDecode (short *dst, unsigned char *src, unsigned int size) 
+{
+	return G711::ALawDecode (dst, src, size);
+}
+
+int
+Alaw::codecEncode (unsigned char *dst, short *src, unsigned int size) 
+{	
+	return G711::ALawEncode (dst, src, size);
+}
+
diff --git a/src/audio/alaw.h b/src/audio/alaw.h
new file mode 100644
index 0000000000..27a6038670
--- /dev/null
+++ b/src/audio/alaw.h
@@ -0,0 +1,38 @@
+/**
+ *  Copyright (C) 2004-2005 Savoir-Faire Linux inc.
+ *  Author:  Laurielle Lea <laurielle.lea@savoirfairelinux.com>
+ *                                                                              
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *                                                                              
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef __ALAW_H__
+#define __ALAW_H__
+
+#include "audiocodec.h"
+
+class Alaw : public AudioCodec {
+public:
+	Alaw (int payload, const string& codec);
+	~Alaw (void);
+	
+	int	codecDecode	(short *, unsigned char *, unsigned int);
+	int	codecEncode	(unsigned char *, short *, unsigned int);
+
+private:
+	string _codecName;
+	int _payload;
+};
+
+#endif // __ULAW_H__
diff --git a/src/audiobuffer.cpp b/src/audio/audiobuffer.cpp
similarity index 95%
rename from src/audiobuffer.cpp
rename to src/audio/audiobuffer.cpp
index c85a0d59da..54ed0003db 100644
--- a/src/audiobuffer.cpp
+++ b/src/audio/audiobuffer.cpp
@@ -1,5 +1,5 @@
 /**
- *  Copyright (C) 2004 Savoir-Faire Linux inc.
+ *  Copyright (C) 2004-2005 Savoir-Faire Linux inc.
  *  Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com> 
  *
  * 	Portions Copyright (c) 2000 Billy Biggs <bbiggs@div8.net>
@@ -21,7 +21,7 @@
  */
 
 #include "audiobuffer.h"
-#include "global.h"
+#include "../global.h"
 
 #include <string.h>
 
diff --git a/src/audiobuffer.h b/src/audio/audiobuffer.h
similarity index 97%
rename from src/audiobuffer.h
rename to src/audio/audiobuffer.h
index c6607a2eed..386c774403 100644
--- a/src/audiobuffer.h
+++ b/src/audio/audiobuffer.h
@@ -1,5 +1,5 @@
 /**
- *  Copyright (C) 2004 Savoir-Faire Linux inc.
+ *  Copyright (C) 2004-2005 Savoir-Faire Linux inc.
  *  Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com> 
  *
  * 	Portions Copyright (c) 2000 Billy Biggs <bbiggs@div8.net>
diff --git a/src/audio/audiocodec.cpp b/src/audio/audiocodec.cpp
new file mode 100644
index 0000000000..492c492307
--- /dev/null
+++ b/src/audio/audiocodec.cpp
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2004-2005 Savoir-Faire Linux inc.
+ * Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com> 
+ *
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2,
+ * or (at your option) any later version.
+ *
+ * This is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with dpkg; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+#include <endian.h>
+#include <string.h>
+#include <iostream>
+#include <string>
+
+#include "audiocodec.h"
+#include "../configuration.h"
+
+using namespace std;
+
+
+AudioCodec::AudioCodec (int payload, const string& codec) {
+	_codecName = codec;
+	_payload = payload;
+}
+
+AudioCodec::~AudioCodec (void) {
+}
+
+void
+AudioCodec::setCodecName (const string& codec)
+{
+	_codecName = codec;
+}
+
+string
+AudioCodec::getCodecName (void)
+{
+	return _codecName;
+}
+
+
+
+
diff --git a/src/audio/audiocodec.h b/src/audio/audiocodec.h
new file mode 100644
index 0000000000..023878b564
--- /dev/null
+++ b/src/audio/audiocodec.h
@@ -0,0 +1,46 @@
+/**
+ *  Copyright (C) 2004-2005 Savoir-Faire Linux inc.
+ *  Author:  Laurielle Lea <laurielle.lea@savoirfairelinux.com>
+ *                                                                              
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *                                                                              
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef __CODEC_AUDIO_H__
+#define __CODEC_AUDIO_H__
+
+
+#include <string>
+
+using namespace std;
+
+
+
+class AudioCodec {
+public:
+	AudioCodec(int payload, const string& codec);		
+	virtual ~AudioCodec	(void);	
+
+	virtual int	codecDecode	(short *, unsigned char *, unsigned int) = 0;
+	virtual int	codecEncode	(unsigned char *, short *, unsigned int) = 0;
+	
+	void setCodecName (const string& codec);
+	string getCodecName (void);
+
+private:
+	string _codecName;
+	int _payload;
+};
+
+#endif // __CODEC_AUDIO_H__
diff --git a/src/audiodrivers.cpp b/src/audio/audiodrivers.cpp
similarity index 96%
rename from src/audiodrivers.cpp
rename to src/audio/audiodrivers.cpp
index c104564e85..30509e3f86 100644
--- a/src/audiodrivers.cpp
+++ b/src/audio/audiodrivers.cpp
@@ -1,5 +1,5 @@
 /**
- *  Copyright (C) 2004 Savoir-Faire Linux inc.
+ *  Copyright (C) 2004-2005 Savoir-Faire Linux inc.
  *  Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com> 
  *
  * 	Portions Copyright (c) 2000 Billy Biggs <bbiggs@div8.net>
diff --git a/src/audiodrivers.h b/src/audio/audiodrivers.h
similarity index 97%
rename from src/audiodrivers.h
rename to src/audio/audiodrivers.h
index 878ed5c5a3..bee6e7eb52 100644
--- a/src/audiodrivers.h
+++ b/src/audio/audiodrivers.h
@@ -1,5 +1,5 @@
 /**
- *  Copyright (C) 2004 Savoir-Faire Linux inc.
+ *  Copyright (C) 2004-2005 Savoir-Faire Linux inc.
  *  Author : Laurielle Lea <laurielle.lea@savoirfairelinux.com> 
  *
  * 	Portions Copyright (c) 2000 Billy Biggs <bbiggs@div8.net>
diff --git a/src/audiodriversalsa.cpp b/src/audio/audiodriversalsa.cpp
similarity index 98%
rename from src/audiodriversalsa.cpp
rename to src/audio/audiodriversalsa.cpp
index 812df6cc26..fffe5cf9aa 100644
--- a/src/audiodriversalsa.cpp
+++ b/src/audio/audiodriversalsa.cpp
@@ -1,5 +1,5 @@
 /**
- *  Copyright (C) 2004 Savoir-Faire Linux inc.
+ *  Copyright (C) 2004-2005 Savoir-Faire Linux inc.
  *  Author:  Jerome Oufella <jerome.oufella@savoirfairelinux.com> 
  *                                                                              
  *  This program is free software; you can redistribute it and/or modify
@@ -31,7 +31,7 @@
 #include <errno.h>
 
 #include "audiodriversalsa.h"
-#include "global.h"
+#include "../global.h"
 
 #define ALSA_DEVICE	"plughw:0,0"
 
diff --git a/src/audiodriversalsa.h b/src/audio/audiodriversalsa.h
similarity index 96%
rename from src/audiodriversalsa.h
rename to src/audio/audiodriversalsa.h
index f2b857297d..c337b3a4b3 100644
--- a/src/audiodriversalsa.h
+++ b/src/audio/audiodriversalsa.h
@@ -1,5 +1,5 @@
 /**
- *  Copyright (C) 2004 Savoir-Faire Linux inc.
+ *  Copyright (C) 2004-2005 Savoir-Faire Linux inc.
  *  Author:  Jerome Oufella <jerome.oufella@savoirfairelinux.com> 
  *                                                                              
  *  This program is free software; you can redistribute it and/or modify
@@ -23,7 +23,7 @@
 #include <alsa/asoundlib.h>
 
 #include "audiodrivers.h"
-#include "error.h"
+#include "../error.h"
 
 
 /**
diff --git a/src/audiodriversoss.cpp b/src/audio/audiodriversoss.cpp
similarity index 99%
rename from src/audiodriversoss.cpp
rename to src/audio/audiodriversoss.cpp
index 27b156104d..c00b85cf6a 100644
--- a/src/audiodriversoss.cpp
+++ b/src/audio/audiodriversoss.cpp
@@ -1,5 +1,5 @@
 /**
- *  Copyright (C) 2004 Savoir-Faire Linux inc.
+ *  Copyright (C) 2004-2005 Savoir-Faire Linux inc.
  *  Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com> 
  *
  * 	Portions Copyright (c) 2000 Billy Biggs <bbiggs@div8.net>
@@ -32,7 +32,7 @@
 #include <stdio.h>
 
 #include "audiodriversoss.h"
-#include "global.h"
+#include "../global.h"
 
 
 AudioDriversOSS::AudioDriversOSS (DeviceMode mode, Error *error) : 
diff --git a/src/audiodriversoss.h b/src/audio/audiodriversoss.h
similarity index 95%
rename from src/audiodriversoss.h
rename to src/audio/audiodriversoss.h
index 622ee6961e..7956793c41 100644
--- a/src/audiodriversoss.h
+++ b/src/audio/audiodriversoss.h
@@ -1,5 +1,5 @@
 /**
- *  Copyright (C) 2004 Savoir-Faire Linux inc.
+ *  Copyright (C) 2004-2005 Savoir-Faire Linux inc.
  *  Author:  Laurielle Lea <laurielle.lea@savoirfairelinux.com> 
  *
  * 	Portions Copyright (c) 2000 Billy Biggs <bbiggs@div8.net>
@@ -25,7 +25,7 @@
 
 
 #include "audiodrivers.h"
-#include "error.h"
+#include "../error.h"
 
 // TODO : a mettre dans config
 #define AUDIO_DEVICE	"/dev/dsp"
diff --git a/src/audio/audiortp.cpp b/src/audio/audiortp.cpp
new file mode 100644
index 0000000000..896535a90f
--- /dev/null
+++ b/src/audio/audiortp.cpp
@@ -0,0 +1,338 @@
+/**
+ *  Copyright (C) 2004 Savoir-Faire Linux inc.
+ *  Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com>
+ *                                                                              
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *                                                                              
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <cstdio>
+#include <cstdlib>
+#include <ccrtp/rtp.h>
+#include <assert.h>
+#include <iostream>
+#include <string>
+
+#include "audiortp.h"
+#include "../configuration.h"
+#include "../manager.h"
+#include "../user_cfg.h"
+#include "../sipcall.h"
+#include "../stund/stun.h"
+
+using namespace ost;
+using namespace std;
+
+
+////////////////////////////////////////////////////////////////////////////////
+// AudioRtp                                                          
+////////////////////////////////////////////////////////////////////////////////
+AudioRtp::AudioRtp (Manager *manager) {
+	string svr;
+	
+	_manager = manager;
+	_RTXThread = NULL;
+	
+	if (!manager->useStun()) {
+		if (get_config_fields_str(SIGNALISATION, PROXY).empty()) {
+			svr = get_config_fields_str(SIGNALISATION, PROXY);
+		}
+	} else {
+		svr = get_config_fields_str(SIGNALISATION, HOST_PART);
+	}
+}
+
+AudioRtp::~AudioRtp (void) {
+}
+
+int 
+AudioRtp::createNewSession (SipCall *ca) {
+	// Start RTP Send/Receive threads
+	ca->enable_audio = 1;
+	if (!_manager->useStun()) { 
+		_symetric = false;
+	} else {
+		_symetric = true;
+	}
+	
+#ifdef ALSA
+	if (_manager->useAlsa()) {
+		_RTXThread = new AudioRtpRTX (ca, _manager->audiodriver, 
+				_manager->audiodriverReadAlsa, _manager, _symetric);
+	}
+#endif
+	if (!_manager->useAlsa()) {
+		_RTXThread = new AudioRtpRTX (ca, _manager->audiodriver, NULL,_manager, 
+			_symetric);
+	}
+	
+	if (_RTXThread->start() != 0) {
+		return -1;
+	}
+		
+	return 0;
+}
+
+	
+void
+AudioRtp::closeRtpSession (SipCall *ca) {
+	// This will make RTP threads finish.
+	ca->enable_audio = -1;
+
+	if (_RTXThread != NULL) {
+		delete _RTXThread;
+		_RTXThread = NULL;
+	}
+
+	// Flush audio read buffer
+	_manager->audiodriver->resetDevice();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// AudioRtpRTX Class                                                          //
+////////////////////////////////////////////////////////////////////////////////
+AudioRtpRTX::AudioRtpRTX (SipCall *sipcall, AudioDrivers *driver, 
+		AudioDrivers *read_driver, Manager *mngr, bool sym) {
+	time = new Time();
+	_manager = mngr;
+	_ca = sipcall;
+	_sym =sym;
+	_audioDevice = driver;
+#ifdef ALSA
+	if (_manager->useAlsa()) {
+		_audioDeviceRead = read_driver;
+	}
+#endif
+
+	// TODO: Change bind address according to user settings.
+	InetHostAddress local_ip("0.0.0.0");
+
+	if (!_sym) {
+		_debug("Audiortp localport : %d\n", _ca->getLocalAudioPort());
+		_sessionRecv = new RTPSession (local_ip, _ca->getLocalAudioPort());
+		_sessionSend = new RTPSession (local_ip);
+	} else {
+		int forcedPort = _manager->getFirewallPort();
+		_session = new SymmetricRTPSession (local_ip, forcedPort);
+	}
+}
+
+AudioRtpRTX::~AudioRtpRTX () {
+	terminate();
+	
+	if (!_sym) {
+		if (_sessionRecv != NULL) {
+			delete _sessionRecv;	
+			_sessionRecv = NULL;
+		}
+		if (_sessionSend != NULL) {
+			delete _sessionSend;	
+			_sessionSend = NULL;
+		}
+	} else {
+		if (_session != NULL) {
+			delete _session;
+			_session = NULL;
+		}
+	}
+}
+
+void
+AudioRtpRTX::run (void) {
+	unsigned char	*data_to_send;
+	short			*data_mute;
+	short			*data_from_mic;
+	short			*data_from_mic_tmp;
+	int				 i,
+					 compSize, 
+					 timestamp;
+	int				 expandedSize;
+	short			*data_for_speakers = NULL;
+	int	 			 countTime = 0;
+	data_for_speakers = new short[2048];
+	data_from_mic = new short[1024];
+	data_from_mic_tmp = new short[1024];
+	data_to_send = new unsigned char[1024];
+	data_mute = new short[1024];
+
+	InetHostAddress remote_ip(_ca->getRemoteSdpAudioIp());
+	
+	if (!remote_ip) {
+	   _debug("RTX: IP address is not correct!\n");
+	   exit();
+	} else {
+		_debug("RTX: Connected to %s : %d\n", _ca->getRemoteSdpAudioIp(), 
+				_ca->getRemoteSdpAudioPort());
+	}
+	
+	// Initialization
+	if (!_sym) {
+		_sessionRecv->setSchedulingTimeout (100000);
+		_sessionRecv->setExpireTimeout(1000000);
+		
+		_sessionSend->setSchedulingTimeout(10000);
+		_sessionSend->setExpireTimeout(1000000);
+	} else {
+		_session->setSchedulingTimeout(10000);
+		_session->setExpireTimeout(1000000);
+	}
+
+	if (!_sym) {
+		if (!_sessionSend->addDestination (remote_ip, 
+					(unsigned short) _ca->getRemoteSdpAudioPort())) {
+			_debug("RTX send: could not connect to port %d\n",  
+					_ca->getRemoteSdpAudioPort());
+			exit();
+		} else {
+			_debug("RTP(Send): Added destination %s : %d\n", 
+					remote_ip.getHostname(), 
+					(unsigned short) _ca->getRemoteSdpAudioPort());
+		}
+
+		_sessionRecv->setPayloadFormat(StaticPayloadFormat(
+				(StaticPayloadType) _ca->payload));
+		_sessionSend->setPayloadFormat(StaticPayloadFormat(
+				(StaticPayloadType) _ca->payload));
+		setCancel(cancelImmediate);
+		_sessionSend->setMark(true);
+
+	} else {
+		if (!_session->addDestination (remote_ip, 
+					(unsigned short) _ca->getRemoteSdpAudioPort())) {
+			exit();
+		} else {
+			_session->setPayloadFormat(StaticPayloadFormat(
+				(StaticPayloadType) _ca->payload));
+			setCancel(cancelImmediate);
+		}
+	}
+	
+	timestamp = 0;
+
+	// TODO: get frameSize from user config 
+	int frameSize = 20; // 20ms frames
+	TimerPort::setTimer(frameSize);
+	
+	// start running the packet queue scheduler.
+	if (!_sym) {
+		_sessionRecv->startRunning();
+		_sessionSend->startRunning();	
+	} else {
+		_session->startRunning();
+	}
+
+	while (_ca->enable_audio != -1) {
+		////////////////////////////
+		// Send session
+		////////////////////////////
+		int size = 320;
+		if (!_manager->getCall(_ca->getId())->isOnMute()) {
+#ifdef ALSA
+			if (_manager->useAlsa()) {
+				i = _audioDeviceRead->readBuffer (data_from_mic, size);
+			}
+#endif
+			if (!_manager->useAlsa()) {
+				i = _audioDevice->readBuffer (data_from_mic, size);
+			}
+		} 
+	else {
+			// When IP-phone user click on mute button, we read buffer of a
+			// temp buffer to avoid delay in sound.
+#ifdef ALSA
+			if (_manager->useAlsa())
+				i = _audioDeviceRead->readBuffer (data_mute, size);
+#endif
+			if (!_manager->useAlsa())
+				i = _audioDevice->readBuffer (data_mute, size);
+		}
+		// TODO : return an error because no sound
+		if (i < 0) {
+			break;
+		}
+		for (int j = 0; j < i; j++) {
+			data_from_mic_tmp[j] = data_from_mic[j] * 
+												_manager->getMicroVolume()/100;
+		}
+		
+		// Encode acquired audio sample
+		compSize = _ca->getAudioCodec()->codecEncode (data_to_send,
+													  data_from_mic_tmp, 
+													  i);
+		// Send encoded audio sample
+		if (!_sym) {
+			_sessionSend->putData(timestamp, data_to_send, compSize);
+		} else {
+			_session->putData(timestamp, data_to_send, compSize);
+		}
+		timestamp += 160;
+
+		////////////////////////////
+		// Recv session
+		////////////////////////////
+		const AppDataUnit* adu = NULL;
+
+		do {
+			Thread::sleep(5); // in msec.
+			if (!_sym) {
+				adu = _sessionRecv->getData(_sessionRecv->getFirstTimestamp());
+			} else {
+				adu = _session->getData(_session->getFirstTimestamp());
+			}
+		} while (adu == NULL);
+
+		// Decode data with relevant codec
+		CodecDescriptor* cd = new CodecDescriptor (adu->getType());
+		
+		AudioCodec* ac = cd->alloc(adu->getType(), "");
+
+		expandedSize = ac->codecDecode (data_for_speakers,
+									    (unsigned char*) adu->getData(),
+										adu->getSize());
+			
+		// Set decoded data to sound device
+		_audioDevice->audio_buf.resize(expandedSize);
+		_audioDevice->audio_buf.setData (data_for_speakers, 
+										 _manager->getSpkrVolume()); 
+
+		// Notify (with a bip) an incoming call when there is already a call 
+		countTime += time->getSecond();
+		if (_manager->getNumberOfCalls() > 0 and _manager->getbRingtone()) {
+			countTime = countTime % 2000;
+			if (countTime < 10 and countTime > 0) {
+				_manager->notificationIncomingCall();
+			}
+		} 
+	  	
+		// Write data or notification
+		i = _audioDevice->writeBuffer ();
+		delete cd;
+		delete adu;
+   
+		// Let's wait for the next transmit cycle
+		Thread::sleep(TimerPort::getTimer());
+		TimerPort::incTimer(frameSize); // 'frameSize' ms
+	}
+		 
+//	AudioCodec::destroy(_ca->payload);
+	delete[] data_for_speakers;
+	delete[] data_from_mic;
+	delete[] data_from_mic_tmp;
+	delete[] data_mute;
+	delete[] data_to_send;
+	exit();
+}
+
+
+// EOF
diff --git a/src/audiortp.h b/src/audio/audiortp.h
similarity index 82%
rename from src/audiortp.h
rename to src/audio/audiortp.h
index 2117669d1a..d4b66c46fb 100644
--- a/src/audiortp.h
+++ b/src/audio/audiortp.h
@@ -27,12 +27,12 @@
 
 using namespace ost;
 
-#include "sipcall.h"
 
 #define LEN_BUFFER	160
 
-class SIP;
+class AudioDrivers;
 class Manager;
+class SipCall;
 
 ///////////////////////////////////////////////////////////////////////////////
 // Two pair of sockets
@@ -41,20 +41,21 @@ class AudioRtpRTX : public Thread, public TimerPort {
 public:
 	AudioRtpRTX (SipCall *, AudioDrivers *, AudioDrivers *, Manager *, bool);
 	~AudioRtpRTX();
+
 	Time *time; 	// For incoming call notification 
 	virtual void run ();
 
 private:
-	SipCall				*ca;
-	AudioDrivers		*audioDevice;
+	SipCall*			_ca;
+	AudioDrivers*		_audioDevice;
 #ifdef ALSA
-	AudioDrivers		*audioDeviceRead;
+	AudioDrivers*		_audioDeviceRead;
 #endif
-	RTPSession 			*sessionSend;
-	RTPSession 			*sessionRecv;
-	SymmetricRTPSession	*session;
-	Manager				*manager;
-	bool				 sym;
+	RTPSession*			_sessionSend;
+	RTPSession*			_sessionRecv;
+	SymmetricRTPSession* _session;
+	Manager*			_manager;
+	bool			 	_sym;
 };
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -65,14 +66,13 @@ public:
 	AudioRtp (Manager *);
 	~AudioRtp (void);
 
-	int 				createNewSession	(SipCall *);
-	void				closeRtpSession		(SipCall *);
+	int 			createNewSession (SipCall *);
+	void			closeRtpSession	 (SipCall *);
 
 private:
-	AudioRtpRTX			*RTXThread;
-	SIP 				*sip;
-	Manager				*manager;
-	bool				 symetric;
+	AudioRtpRTX*	_RTXThread;
+	Manager*		_manager;
+	bool			_symetric;
 };
 
 #endif // __AUDIO_RTP_H__
diff --git a/src/audio/codecDescriptor.cpp b/src/audio/codecDescriptor.cpp
new file mode 100644
index 0000000000..7cc255b792
--- /dev/null
+++ b/src/audio/codecDescriptor.cpp
@@ -0,0 +1,131 @@
+/**
+ *  Copyright (C) 2004-2005 Savoir-Faire Linux inc.
+ *  Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com>
+ *                                                                              
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *                                                                              
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *                                                                              
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <iostream>
+
+#include "audio/audiocodec.h"
+#include "audio/gsmcodec.h"
+#include "audio/alaw.h"
+#include "audio/ulaw.h"
+#include "codecDescriptor.h"
+
+CodecDescriptor::CodecDescriptor (int payload) 
+{
+	_payload = payload;
+	_codecName = "";
+}
+
+CodecDescriptor::CodecDescriptor (int payload, const string& name) 
+{
+	_payload = payload;
+	_codecName = name;
+}
+
+CodecDescriptor::~CodecDescriptor (void)
+{
+}
+
+AudioCodec*
+CodecDescriptor::alloc (int payload, const string& name)
+{
+	switch(payload) {
+	case PAYLOAD_CODEC_ULAW:
+		return new Ulaw(payload, name);
+		break;
+	case PAYLOAD_CODEC_ALAW:
+		return new Alaw(payload, name);
+		break;
+	case PAYLOAD_CODEC_GSM:
+		return new Gsm(payload, name);
+		break;
+	default:
+		return NULL;
+		break;
+	}
+}
+
+void 
+CodecDescriptor::setPayload (int payload)
+{
+	_payload =payload;
+}
+	
+int 
+CodecDescriptor::getPayload (void)
+{
+	return _payload;
+}
+	
+void 
+CodecDescriptor::setNameCodec (const string& name)
+{
+	_codecName = name;
+}
+	
+string 
+CodecDescriptor::getNameCodec (void)
+{
+	return _codecName;
+}
+
+int
+CodecDescriptor::matchPayloadCodec (const string& codecname) {
+	if (codecname == CODEC_ALAW) {
+		return PAYLOAD_CODEC_ALAW;
+	} else if (codecname == CODEC_ULAW) {
+		return PAYLOAD_CODEC_ULAW;
+	} else if (codecname == CODEC_GSM) {
+		return PAYLOAD_CODEC_GSM;
+	} else if (codecname == CODEC_ILBC) {
+		return PAYLOAD_CODEC_ILBC;
+	} else if (codecname == CODEC_SPEEX) {
+		return PAYLOAD_CODEC_SPEEX;
+	} else 
+		return -1;
+}
+
+string
+CodecDescriptor::rtpmapPayload (int payload) {
+	switch (payload) {
+		case PAYLOAD_CODEC_ALAW:
+ 			return string("PCMA");
+ 			break;
+
+ 		case PAYLOAD_CODEC_ULAW:
+ 			return string("PCMU");
+ 			break;
+
+ 		case PAYLOAD_CODEC_GSM:
+ 			return string("GSM");
+ 			break;
+
+ 		case PAYLOAD_CODEC_ILBC:
+ 			return string("iLBC");
+ 			break;
+
+ 		case PAYLOAD_CODEC_SPEEX:
+ 			return string("speex");
+ 			break;
+
+		default:
+			break;
+	}
+	return "";
+}
+
diff --git a/src/audiocodec.h b/src/audio/codecDescriptor.h
similarity index 60%
rename from src/audiocodec.h
rename to src/audio/codecDescriptor.h
index dabae0928e..e651f3727c 100644
--- a/src/audiocodec.h
+++ b/src/audio/codecDescriptor.h
@@ -1,12 +1,12 @@
 /**
- *  Copyright (C) 2004 Savoir-Faire Linux inc.
- *  Author:  Laurielle Lea <laurielle.lea@savoirfairelinux.com>
+ *  Copyright (C) 2004-2005 Savoir-Faire Linux inc.
+ *  Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com>
  *                                                                              
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
  *  the Free Software Foundation; either version 2 of the License, or
  *  (at your option) any later version.
- *
+ *                                                                              
  *  This program is distributed in the hope that it will be useful,
  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
@@ -17,12 +17,12 @@
  *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-#ifndef __CODEC_AUDIO_H__
-#define __CODEC_AUDIO_H__
 
-#include "../gsm/gsm.h"
+#ifndef __CODEC_DESCRIPTOR_H__
+#define __CODEC_DESCRIPTOR_H__
 
 #include <string>
+
 using namespace std;
 
 typedef enum {
@@ -39,27 +39,34 @@ typedef enum {
 #define CODEC_ILBC			string("iLBC")
 #define CODEC_SPEEX			string("SPEEX")
 
-#define NB_CODECS			5
 
-
-class AudioCodec {
+class AudioCodec;
+class CodecDescriptor 
+{
 public:
-	AudioCodec 				(void);		
-	~AudioCodec 			(void);	
+	CodecDescriptor (int payload);
+	CodecDescriptor (int payload, const string& name);
+	~CodecDescriptor (void);
+
+	AudioCodec* alloc (int payload, const string& name);
 
-	int 	handleCodecs[NB_CODECS];
+	void setPayload (int payload);
+	int getPayload (void);
+	void setNameCodec (const string& name);
+	string getNameCodec (void);
 	
-	int			matchPayloadCodec	(string);
-	char *		rtpmapPayload 		(int);
-	void 		noSupportedCodec	(void);
-	static int	codecDecode 	(int, short *, unsigned char *, unsigned int);
-	static int	codecEncode 	(int, unsigned char *, short *, unsigned int);
-	static void	create			(int);
-	static void	destroy			(int);
+	/*
+	 * Match codec name to the payload
+	 */
+	int	matchPayloadCodec (const string&);
+	/*
+	 * Match a payload to the codec name
+	 */
+	string rtpmapPayload (int);
 
 private:
-	static void	gsmCreate		(void);
-	static void	gsmDestroy		(void);
+	int _payload;
+	string _codecName;
 };
 
-#endif // __CODEC_AUDIO_H__
+#endif // __CODEC_DESCRIPTOR_H__
diff --git a/src/audio/common.h b/src/audio/common.h
new file mode 100644
index 0000000000..039dd91324
--- /dev/null
+++ b/src/audio/common.h
@@ -0,0 +1,56 @@
+/*
+	Type definitions and helper macros which aren't part of Standard C++
+	This will need to be edited on systems where 'char', 'short' and 'int'
+   	have sizes different from 8, 16 and 32 bits.
+*/
+
+#ifndef __COMMON_H__
+#define __COMMON_H__
+
+
+// #define DEBUG	/**< Defined when compiling code for debugging */
+
+/*
+Basic integer types.
+Note 'int' is assumed to be in 2s complement format and at least 32 bits in size
+*/
+typedef unsigned char  uint8;	/**< An 8 bit unsigned integer */
+typedef unsigned short uint16;	/**< An 16 bit unsigned integer */
+typedef unsigned int   uint32;	/**< An 32 bit unsigned integer */
+typedef signed char    int8;	/**< An 8 bit signed integer (2s complement) */
+typedef signed short   int16;	/**< An 16 bit signed integer (2s complement) */
+typedef signed int     int32;	/**< An 32 bit signed integer (2s complement) */
+typedef unsigned int   uint;	/**< An unsigned integer or at least 32 bits */
+
+
+#ifndef NULL
+#define NULL 0		/**< Used to represent a null pointer type */
+#endif
+
+
+#ifdef _MSC_VER		// Compiling for Microsoft Visual C++
+
+#define DEBUGGER	{ _asm int 3 }			/**< Invoke debugger */
+#define IMPORT		__declspec(dllexport)	/**< Mark a function which is to be imported from a DLL */
+#define EXPORT		__declspec(dllexport)	/**< Mark a function to be exported from a DLL */
+#define ASSERT(c)	{ if(!(c)) DEBUGGER; }	/**< Assert that expression 'c' is true */
+
+#else				// Not compiling for Microsoft Visual C++ ...
+
+#define DEBUGGER							/**< Invoke debugger */
+#define IMPORT								/**< Mark a function which is to be imported from a DLL */
+#define EXPORT								/**< Mark a function to be exported from a DLL */
+//#define ASSERT(c)							/**< Assert that expression 'c' is true */
+
+#endif
+
+
+#ifdef DEBUG
+#define ASSERT_DEBUG(c) ASSERT(c)	/**< Assert that expression 'c' is true (when compiled for debugging)*/
+#else
+#define ASSERT_DEBUG(c)
+#endif
+
+
+#endif
+
diff --git a/src/dtmf.cpp b/src/audio/dtmf.cpp
similarity index 98%
rename from src/dtmf.cpp
rename to src/audio/dtmf.cpp
index e44f5c1b9d..b9859627ce 100644
--- a/src/dtmf.cpp
+++ b/src/audio/dtmf.cpp
@@ -20,7 +20,6 @@
  *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-#include <qapplication.h>
 #include "dtmf.h"
 
 DTMF::DTMF (void) {
diff --git a/src/dtmf.h b/src/audio/dtmf.h
similarity index 100%
rename from src/dtmf.h
rename to src/audio/dtmf.h
diff --git a/src/dtmfgenerator.cpp b/src/audio/dtmfgenerator.cpp
similarity index 98%
rename from src/dtmfgenerator.cpp
rename to src/audio/dtmfgenerator.cpp
index e115bdcbf6..b0e095fdf2 100644
--- a/src/dtmfgenerator.cpp
+++ b/src/audio/dtmfgenerator.cpp
@@ -23,10 +23,8 @@
 
 #include <math.h>
 
-#include <qapplication.h>
-
 #include "dtmfgenerator.h"
-#include "global.h"
+#include "../global.h"
 
 
 /*
diff --git a/src/dtmfgenerator.h b/src/audio/dtmfgenerator.h
similarity index 100%
rename from src/dtmfgenerator.h
rename to src/audio/dtmfgenerator.h
diff --git a/src/g711.cpp b/src/audio/g711.cpp
similarity index 100%
rename from src/g711.cpp
rename to src/audio/g711.cpp
diff --git a/src/g711.h b/src/audio/g711.h
similarity index 100%
rename from src/g711.h
rename to src/audio/g711.h
diff --git a/gsm/COPYRIGHT b/src/audio/gsm/COPYRIGHT
similarity index 100%
rename from gsm/COPYRIGHT
rename to src/audio/gsm/COPYRIGHT
diff --git a/gsm/ChangeLog b/src/audio/gsm/ChangeLog
similarity index 100%
rename from gsm/ChangeLog
rename to src/audio/gsm/ChangeLog
diff --git a/gsm/INSTALL b/src/audio/gsm/INSTALL
similarity index 100%
rename from gsm/INSTALL
rename to src/audio/gsm/INSTALL
diff --git a/gsm/MACHINES b/src/audio/gsm/MACHINES
similarity index 100%
rename from gsm/MACHINES
rename to src/audio/gsm/MACHINES
diff --git a/gsm/MANIFEST b/src/audio/gsm/MANIFEST
similarity index 100%
rename from gsm/MANIFEST
rename to src/audio/gsm/MANIFEST
diff --git a/gsm/Makefile b/src/audio/gsm/Makefile
similarity index 100%
rename from gsm/Makefile
rename to src/audio/gsm/Makefile
diff --git a/gsm/README b/src/audio/gsm/README
similarity index 100%
rename from gsm/README
rename to src/audio/gsm/README
diff --git a/gsm/add.c b/src/audio/gsm/add.c
similarity index 100%
rename from gsm/add.c
rename to src/audio/gsm/add.c
diff --git a/gsm/code.c b/src/audio/gsm/code.c
similarity index 100%
rename from gsm/code.c
rename to src/audio/gsm/code.c
diff --git a/gsm/config.h b/src/audio/gsm/config.h
similarity index 100%
rename from gsm/config.h
rename to src/audio/gsm/config.h
diff --git a/gsm/debug.c b/src/audio/gsm/debug.c
similarity index 100%
rename from gsm/debug.c
rename to src/audio/gsm/debug.c
diff --git a/gsm/decode.c b/src/audio/gsm/decode.c
similarity index 100%
rename from gsm/decode.c
rename to src/audio/gsm/decode.c
diff --git a/gsm/gsm.h b/src/audio/gsm/gsm.h
similarity index 100%
rename from gsm/gsm.h
rename to src/audio/gsm/gsm.h
diff --git a/gsm/gsm_create.c b/src/audio/gsm/gsm_create.c
similarity index 100%
rename from gsm/gsm_create.c
rename to src/audio/gsm/gsm_create.c
diff --git a/gsm/gsm_decode.c b/src/audio/gsm/gsm_decode.c
similarity index 100%
rename from gsm/gsm_decode.c
rename to src/audio/gsm/gsm_decode.c
diff --git a/gsm/gsm_destroy.c b/src/audio/gsm/gsm_destroy.c
similarity index 100%
rename from gsm/gsm_destroy.c
rename to src/audio/gsm/gsm_destroy.c
diff --git a/gsm/gsm_encode.c b/src/audio/gsm/gsm_encode.c
similarity index 100%
rename from gsm/gsm_encode.c
rename to src/audio/gsm/gsm_encode.c
diff --git a/gsm/gsm_explode.c b/src/audio/gsm/gsm_explode.c
similarity index 100%
rename from gsm/gsm_explode.c
rename to src/audio/gsm/gsm_explode.c
diff --git a/gsm/gsm_implode.c b/src/audio/gsm/gsm_implode.c
similarity index 100%
rename from gsm/gsm_implode.c
rename to src/audio/gsm/gsm_implode.c
diff --git a/gsm/gsm_option.c b/src/audio/gsm/gsm_option.c
similarity index 100%
rename from gsm/gsm_option.c
rename to src/audio/gsm/gsm_option.c
diff --git a/gsm/gsm_print.c b/src/audio/gsm/gsm_print.c
similarity index 100%
rename from gsm/gsm_print.c
rename to src/audio/gsm/gsm_print.c
diff --git a/gsm/long_term.c b/src/audio/gsm/long_term.c
similarity index 100%
rename from gsm/long_term.c
rename to src/audio/gsm/long_term.c
diff --git a/gsm/lpc.c b/src/audio/gsm/lpc.c
similarity index 100%
rename from gsm/lpc.c
rename to src/audio/gsm/lpc.c
diff --git a/gsm/preprocess.c b/src/audio/gsm/preprocess.c
similarity index 100%
rename from gsm/preprocess.c
rename to src/audio/gsm/preprocess.c
diff --git a/gsm/private.h b/src/audio/gsm/private.h
similarity index 100%
rename from gsm/private.h
rename to src/audio/gsm/private.h
diff --git a/gsm/proto.h b/src/audio/gsm/proto.h
similarity index 100%
rename from gsm/proto.h
rename to src/audio/gsm/proto.h
diff --git a/gsm/rpe.c b/src/audio/gsm/rpe.c
similarity index 100%
rename from gsm/rpe.c
rename to src/audio/gsm/rpe.c
diff --git a/gsm/short_term.c b/src/audio/gsm/short_term.c
similarity index 100%
rename from gsm/short_term.c
rename to src/audio/gsm/short_term.c
diff --git a/gsm/table.c b/src/audio/gsm/table.c
similarity index 100%
rename from gsm/table.c
rename to src/audio/gsm/table.c
diff --git a/gsm/toast.c b/src/audio/gsm/toast.c
similarity index 100%
rename from gsm/toast.c
rename to src/audio/gsm/toast.c
diff --git a/gsm/toast.h b/src/audio/gsm/toast.h
similarity index 100%
rename from gsm/toast.h
rename to src/audio/gsm/toast.h
diff --git a/gsm/toast_alaw.c b/src/audio/gsm/toast_alaw.c
similarity index 100%
rename from gsm/toast_alaw.c
rename to src/audio/gsm/toast_alaw.c
diff --git a/gsm/toast_audio.c b/src/audio/gsm/toast_audio.c
similarity index 100%
rename from gsm/toast_audio.c
rename to src/audio/gsm/toast_audio.c
diff --git a/gsm/toast_lin.c b/src/audio/gsm/toast_lin.c
similarity index 100%
rename from gsm/toast_lin.c
rename to src/audio/gsm/toast_lin.c
diff --git a/gsm/toast_ulaw.c b/src/audio/gsm/toast_ulaw.c
similarity index 100%
rename from gsm/toast_ulaw.c
rename to src/audio/gsm/toast_ulaw.c
diff --git a/gsm/unproto.h b/src/audio/gsm/unproto.h
similarity index 100%
rename from gsm/unproto.h
rename to src/audio/gsm/unproto.h
diff --git a/src/audio/gsmcodec.cpp b/src/audio/gsmcodec.cpp
new file mode 100644
index 0000000000..64116b0f49
--- /dev/null
+++ b/src/audio/gsmcodec.cpp
@@ -0,0 +1,59 @@
+/**
+ *  Copyright (C) 2004-2005 Savoir-Faire Linux inc.
+ *  Author:  Laurielle Lea <laurielle.lea@savoirfairelinux.com>
+ *                                                                              
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *                                                                              
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <iostream>
+#include "gsm/gsm.h"
+#include "gsmcodec.h"
+#include "../global.h"
+
+Gsm::Gsm(int payload, const string& codec) : AudioCodec(payload, codec)
+{
+	_codecName = codec;
+	_payload = payload;
+	
+	if (!(_decode_gsmhandle = gsm_create() )) 
+		_debug("ERROR: decode_gsm_create\n");
+	if (!(_encode_gsmhandle = gsm_create() )) 
+		_debug("AudioCodec: ERROR: encode_gsm_create\n");
+}
+
+Gsm::~Gsm (void)
+{
+	gsm_destroy(_decode_gsmhandle);
+	gsm_destroy(_encode_gsmhandle);
+
+}
+
+int
+Gsm::codecDecode (short *dst, unsigned char *src, unsigned int size) 
+{
+	if (gsm_decode(_decode_gsmhandle, (gsm_byte*)src, (gsm_signal*)dst) < 0) {
+		_debug("ERROR: gsm_decode\n");
+	}
+	return 320;
+}
+
+int
+Gsm::codecEncode (unsigned char *dst, short *src, unsigned int size) 
+{	
+	gsm_encode(_encode_gsmhandle, (gsm_signal*)src, (gsm_byte*)dst);
+    return 33;
+}
+
+
diff --git a/src/audio/gsmcodec.h b/src/audio/gsmcodec.h
new file mode 100644
index 0000000000..28fce39c3a
--- /dev/null
+++ b/src/audio/gsmcodec.h
@@ -0,0 +1,42 @@
+/**
+ *  Copyright (C) 2004-2005 Savoir-Faire Linux inc.
+ *  Author:  Laurielle Lea <laurielle.lea@savoirfairelinux.com>
+ *                                                                              
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *                                                                              
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef __GSM_H__
+#define __GSM_H__
+
+#include "audiocodec.h"
+#include "gsm/gsm.h"
+
+class Gsm : public AudioCodec {
+public:
+	Gsm (int payload, const string& codec);
+	~Gsm (void);
+	
+	int	codecDecode	(short *, unsigned char *, unsigned int);
+	int	codecEncode	(unsigned char *, short *, unsigned int);
+
+private:
+	string _codecName;
+	int _payload;
+	gsm _decode_gsmhandle;
+	gsm _encode_gsmhandle;
+	
+};
+
+#endif // __ULAW_H__
diff --git a/src/tonegenerator.cpp b/src/audio/tonegenerator.cpp
similarity index 82%
rename from src/tonegenerator.cpp
rename to src/audio/tonegenerator.cpp
index 47c9063008..7cb987d4d7 100644
--- a/src/tonegenerator.cpp
+++ b/src/audio/tonegenerator.cpp
@@ -1,5 +1,5 @@
 /**
- *  Copyright (C) 2004 Savoir-Faire Linux inc.
+ *  Copyright (C) 2004-2005 Savoir-Faire Linux inc.
  *  Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com>
  *                                                                              
  *  This program is free software; you can redistribute it and/or modify
@@ -20,15 +20,15 @@
 #include <math.h>
 #include <iostream>
 #include <fstream>
+#include <stdlib.h>
 
-#include <qapplication.h>
-#include <qstring.h>
-
-#include "audiocodec.h"
-#include "configuration.h"
-#include "global.h"
-#include "manager.h"
+#include "codecDescriptor.h"
+#include "ulaw.h"
 #include "tonegenerator.h"
+#include "../configuration.h"
+#include "../global.h"
+#include "../manager.h"
+#include "../user_cfg.h"
 
 using namespace std;
 
@@ -47,7 +47,7 @@ ToneThread::~ToneThread (void) {
 
 void
 ToneThread::run (void) {
-	while (mngr->tonezone) {
+	while (mngr->getTonezone()) {
 		mngr->audiodriver->audio_buf.setData(buffer, mngr->getSpkrVolume());
 		mngr->audiodriver->writeBuffer();
 	} 
@@ -155,20 +155,27 @@ ToneGenerator::generateSin (int lowerfreq, int higherfreq, int amplitude,
 void
 ToneGenerator::buildTone (int idCountry, int idTones, int samplingRate, 
 							int amplitude, short* temp) {
-	QString s;
+	string s;
 	int count = 0;
 	int	byte = 0,
-		byte_temp = 0,
-		nbcomma;
+		byte_temp = 0;
+	static int	nbcomma = 0;
 	short *buffer = new short[1024*1024];
+	int pos;
+
+	string str(toneZone[idCountry][idTones]);
+	nbcomma = contains(toneZone[idCountry][idTones], ',');
 
-	nbcomma = (toneZone[idCountry][idTones]).contains(',');
 	// Number of format sections 
-	for (int i = 0; i < nbcomma+1; i++) {
-		s = (toneZone[idCountry][idTones]).section(',', i, i);
-		freq1 = ((s.section('/', 0, 0)).section('+', 0, 0)).toInt();
-		freq2 = ((s.section('/', 0, 0)).section('+', 1, 1)).toInt();
-		time = (s.section('/', 1, 1)).toInt();	
+	for (int i = 0; i < nbcomma + 1; i++) {
+		pos = str.find(',');
+		s = str.substr(0, pos);
+		pos = s.find('+');
+		freq1 = atoi((s.substr(0, pos)).data());
+		freq2 = atoi((s.substr(pos + 1, s.find('/'))).data());
+		pos = s.find('/');
+		time = atoi((s.substr(pos + 1, s.length())).data());
+		
 		// Generate sinus, buffer is the result
 		generateSin(freq1, freq2, amplitude, samplingRate, buffer);
 		
@@ -185,10 +192,11 @@ ToneGenerator::buildTone (int idCountry, int idTones, int samplingRate,
 		}		
 		byte_temp = byte;
 		count = 0;
+		
+		str = str.substr(str.find(',') + 1, str.length());
 	}
 	// Total number in final buffer
 	totalbytes = byte + (byte_temp * (nbcomma+1));
-	
 	delete[] buffer;
 }
 
@@ -199,23 +207,23 @@ ToneGenerator::buildTone (int idCountry, int idTones, int samplingRate,
  * @return	id of the zone
  */
 int
-ToneGenerator::idZoneName (const QString &name) {
-	if (name == "North America") {
+ToneGenerator::idZoneName (const string& name) {
+	if (name.compare("North America")) {
 		return ID_NORTH_AMERICA;
-	} else if (name == "France") {
+	} else if (name.compare("France")) {
 		return ID_FRANCE;
-	} else if (name == "Australia") {
+	} else if (name.compare("Australia")) {
 		return ID_AUSTRALIA;
-	} else if (name == "United Kingdom") {
+	} else if (name.compare("United Kingdom")) {
 		return ID_UNITED_KINGDOM;
-	} else if (name == "Spain") {
+	} else if (name.compare("Spain")) {
 		return ID_SPAIN;
-	} else if (name == "Italy") {
+	} else if (name.compare("Italy")) {
 		return ID_ITALY;
-	} else if (name == "Japan") {
+	} else if (name.compare("Japan")) {
 		return ID_JAPAN;
 	} else {
-		qWarning("Zone no supported");
+		_debug("Zone no supported\n");
 		return -1;
 	}
 }
@@ -228,7 +236,7 @@ ToneGenerator::idZoneName (const QString &name) {
  */
 void
 ToneGenerator::toneHandle (int idr) {
-	int idz = idZoneName(Config::gets("Preferences", "Options.zoneToneChoice"));
+	int idz = idZoneName(get_config_fields_str(PREFERENCES, ZONE_TONE));
 	
 	if (idz != -1) {
 		buildTone (idz, idr, SAMPLING_RATE, AMPLITUDE, buf);
@@ -240,7 +248,7 @@ ToneGenerator::toneHandle (int idr) {
 			tonethread->start();
 		}
 
-		if (!manager->tonezone) {
+		if (!manager->getTonezone()) {
 			manager->audiodriver->resetDevice();
 			if (tonethread != NULL) {	
 				delete tonethread;
@@ -256,6 +264,7 @@ ToneGenerator::playRingtone (const char *fileName) {
 	short* dst = NULL;
 	char* src = NULL;
 	int expandedsize, length;
+	Ulaw* ulaw = new Ulaw (PAYLOAD_CODEC_ULAW, CODEC_ULAW);
 
 	if (fileName == NULL) {
 		return 0;
@@ -280,11 +289,7 @@ ToneGenerator::playRingtone (const char *fileName) {
   	file.read (src,length);
 	
 	// Decode file.ul
-	expandedsize = AudioCodec::codecDecode (
-				PAYLOAD_CODEC_ULAW,
-				dst,
-				(unsigned char *)src,
-				length);
+	expandedsize = ulaw->codecDecode (dst, (unsigned char *)src, length);
 	
 	// Start tone thread
 	if (tonethread == NULL) {
@@ -292,7 +297,7 @@ ToneGenerator::playRingtone (const char *fileName) {
 		manager->audiodriver->audio_buf.resize(expandedsize);
 		tonethread->start();
 	}
-	if (!manager->tonezone) {
+	if (!manager->getTonezone()) {
 		manager->audiodriver->resetDevice();
 		if (tonethread != NULL) {	
 			delete tonethread;
@@ -305,4 +310,17 @@ ToneGenerator::playRingtone (const char *fileName) {
 	return 1;
 }
 
+int
+ToneGenerator::contains (const string& str, char c)
+{
+	static int nb = 0;
+	
+	unsigned int pos = str.find(c);
+	if (pos != string::npos) {
+		nb = nb + 1;
+		return contains(str.substr(pos + 1, str.length()), c);
+	} else {
+		return nb;
+	}
 
+}
diff --git a/src/tonegenerator.h b/src/audio/tonegenerator.h
similarity index 81%
rename from src/tonegenerator.h
rename to src/audio/tonegenerator.h
index 6a1a787e4b..381b122854 100644
--- a/src/tonegenerator.h
+++ b/src/audio/tonegenerator.h
@@ -1,5 +1,5 @@
 /**
- *  Copyright (C) 2004 Savoir-Faire Linux inc.
+ *  Copyright (C) 2004-2005 Savoir-Faire Linux inc.
  *  Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com>
  *                                                                              
  *  This program is free software; you can redistribute it and/or modify
@@ -21,10 +21,13 @@
 #define __TONE_GENRATOR_H__
 
 #include <cc++/thread.h>
+#include <string>
 
+#include "../manager.h"
+
+using namespace std;
 using namespace ost;
 
-#include "manager.h"
 
 #define ZT_TONE_DIALTONE	0
 #define ZT_TONE_BUSY		1
@@ -65,9 +68,9 @@ public:
 	ToneGenerator ();
 	~ToneGenerator (void);
 	
-	QString toneZone[NB_ZONES_MAX][NB_TONES_MAX];
+	string toneZone[NB_ZONES_MAX][NB_TONES_MAX];
 
-	int idZoneName 		(const QString &);
+	int idZoneName 		(const string &);
 			
 	void generateSin	(int, int, int, int, short *);
 	void buildTone		(int, int, int, int, short*);
@@ -82,7 +85,19 @@ public:
 
 	short   	*buf;
 private:
-	void		 initTone (void);
+	/*
+	 * Initialisation of the supported tones according to the countries.
+	 */
+	void		initTone (void);
+
+	/*
+	 * Count all the occurences of a character in a string
+	 *
+	 * @param	c character to locate
+	 * @param	str	string to work on
+	 * @return	return the number of time 'c' is found in 'str'
+	 */
+	int		 	contains(const string& str, char c);
 	
 	Manager*	manager;
 	ToneThread*	tonethread;
diff --git a/src/audio/ulaw.cpp b/src/audio/ulaw.cpp
new file mode 100644
index 0000000000..fd3cddd0c0
--- /dev/null
+++ b/src/audio/ulaw.cpp
@@ -0,0 +1,44 @@
+/**
+ *  Copyright (C) 2004-2005 Savoir-Faire Linux inc.
+ *  Author:  Laurielle Lea <laurielle.lea@savoirfairelinux.com>
+ *                                                                              
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *                                                                              
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "g711.h"
+#include "ulaw.h"
+
+Ulaw::Ulaw(int payload, const string& codec) : AudioCodec(payload, codec)
+{
+	_codecName = codec;
+	_payload = payload;
+}
+
+Ulaw::~Ulaw (void)
+{
+}
+
+int
+Ulaw::codecDecode (short *dst, unsigned char *src, unsigned int size) 
+{
+	return G711::ULawDecode (dst, src, size);
+}
+
+int
+Ulaw::codecEncode (unsigned char *dst, short *src, unsigned int size) 
+{	
+	return G711::ULawEncode (dst, src, size);
+}
+
diff --git a/src/audio/ulaw.h b/src/audio/ulaw.h
new file mode 100644
index 0000000000..418f224804
--- /dev/null
+++ b/src/audio/ulaw.h
@@ -0,0 +1,38 @@
+/**
+ *  Copyright (C) 2004-2005 Savoir-Faire Linux inc.
+ *  Author:  Laurielle Lea <laurielle.lea@savoirfairelinux.com>
+ *                                                                              
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *                                                                              
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef __ULAW_H__
+#define __ULAW_H__
+
+#include "audiocodec.h"
+
+class Ulaw : public AudioCodec {
+public:
+	Ulaw (int payload, const string& codec);
+	~Ulaw (void);
+	
+	int	codecDecode	(short *, unsigned char *, unsigned int);
+	int	codecEncode	(unsigned char *, short *, unsigned int);
+
+private:
+	string _codecName;
+	int _payload;
+};
+
+#endif // __ULAW_H__
diff --git a/src/audiocodec.cpp b/src/audiocodec.cpp
deleted file mode 100644
index 208bacbba5..0000000000
--- a/src/audiocodec.cpp
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * Copyright (C) 2004 Savoir-Faire Linux inc.
- * Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com> 
- *
- * This is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2,
- * or (at your option) any later version.
- *
- * This is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with dpkg; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-#include "audiocodec.h"
-#include "configuration.h"
-#include "g711.h"
-#include "../gsm/gsm.h"
-
-#include <endian.h>
-#include <string.h>
-
-#include <string>
-
-
-using namespace std;
-
-static gsm decode_gsmhandle;
-static gsm encode_gsmhandle;
-
-AudioCodec::AudioCodec (void) {
-	// Init array handleCodecs
-	handleCodecs[0] = matchPayloadCodec(Config::gets("Audio", "Codecs.codec1"));
-	handleCodecs[1] = matchPayloadCodec(Config::gets("Audio", "Codecs.codec2"));
-	handleCodecs[2] = matchPayloadCodec(Config::gets("Audio", "Codecs.codec3"));
-	handleCodecs[3] = matchPayloadCodec(Config::gets("Audio", "Codecs.codec4"));
-	handleCodecs[4] = matchPayloadCodec(Config::gets("Audio", "Codecs.codec5"));
-}
-
-AudioCodec::~AudioCodec (void) {
-}
-
-int
-AudioCodec::matchPayloadCodec (string codecname) {
-	if (codecname == CODEC_ALAW) {
-		return PAYLOAD_CODEC_ALAW;
-	} else if (codecname == CODEC_ULAW) {
-		return PAYLOAD_CODEC_ULAW;
-	} else if (codecname == CODEC_GSM) {
-		return PAYLOAD_CODEC_GSM;
-	} else if (codecname == CODEC_ILBC) {
-		return PAYLOAD_CODEC_ILBC;
-	} else if (codecname == CODEC_SPEEX) {
-		return PAYLOAD_CODEC_SPEEX;
-	} else 
-		return -1;
-}
-
-char *
-AudioCodec::rtpmapPayload (int payload) {
-	switch (payload) {
-		case PAYLOAD_CODEC_ALAW:
- 			return "PCMA";
- 			break;
-
- 		case PAYLOAD_CODEC_ULAW:
- 			return "PCMU";
- 			break;
-
- 		case PAYLOAD_CODEC_GSM:
- 			return "GSM";
- 			break;
-
- 		case PAYLOAD_CODEC_ILBC:
- 			return "iLBC";
- 			break;
-
- 		case PAYLOAD_CODEC_SPEEX:
- 			return "speex";
- 			break;
-
-		default:
-			break;
-	}
-	return NULL;
-}
-
-int
-AudioCodec::codecDecode (int pt, short *dst, unsigned char *src, unsigned int size) {
-	switch (pt) {
-	case PAYLOAD_CODEC_ULAW:
-		return G711::ULawDecode (dst, src, size);
-		break;
-
-	case PAYLOAD_CODEC_ALAW:
-		return G711::ALawDecode (dst, src, size);
-		break;
-
-	case PAYLOAD_CODEC_GSM:
-		if (gsm_decode(decode_gsmhandle, (gsm_byte*)src, (gsm_signal*)dst) < 0) 
-			printf("AudioCodec: ERROR: gsm_decode\n");
-		return 320;
-		break;
-
-	case PAYLOAD_CODEC_ILBC:
-		// TODO
-		break;
-
-	case PAYLOAD_CODEC_SPEEX:
-		// TODO
-		break;
-
-	default:
-		break;
-	}
-	return 0;
-}
-
-int
-AudioCodec::codecEncode (int pt, unsigned char *dst, short *src, unsigned int size) {	
-	switch (pt) {
-	case PAYLOAD_CODEC_ULAW:
-		return G711::ULawEncode (dst, src, size);
-		break;
-
-	case PAYLOAD_CODEC_ALAW:
-		return G711::ALawEncode (dst, src, size);
-		break;
-
-	case PAYLOAD_CODEC_GSM:
-		gsm_encode(encode_gsmhandle, (gsm_signal*)src, (gsm_byte*)dst);
-		return 33;
-		break;
-
-	case PAYLOAD_CODEC_ILBC:
-		// TODO
-		break;
-
-	case PAYLOAD_CODEC_SPEEX:
-		// TODO
-		break;
-
-	default:
-		break;
-	}
-	return 0;
-}
-
-void
-AudioCodec::noSupportedCodec (void) {
-	printf("Codec no supported\n");
-}
-
-void
-AudioCodec::gsmCreate (void) {
-	if (!(decode_gsmhandle = gsm_create() )) 
-		printf("AudioCodec: ERROR: decode_gsm_create\n");
-	if (!(encode_gsmhandle = gsm_create() )) 
-		printf("AudioCodec: ERROR: encode_gsm_create\n");
-}
-
-void
-AudioCodec::gsmDestroy (void) {
-	gsm_destroy(decode_gsmhandle);
-	gsm_destroy(encode_gsmhandle);
-}
-
-void
-AudioCodec::create (int pt) {
-	switch (pt) {
-	case PAYLOAD_CODEC_GSM:
-		AudioCodec::gsmCreate();
-		break;
-	default:
-		break;
-	}
-} 
-
-void
-AudioCodec::destroy (int pt) {
-	switch (pt) {
-	case PAYLOAD_CODEC_GSM:
-		AudioCodec::gsmDestroy();
-		break;
-	default:
-		break;
-	}
-}
diff --git a/src/audiortp.cpp b/src/audiortp.cpp
deleted file mode 100644
index c2914c6067..0000000000
--- a/src/audiortp.cpp
+++ /dev/null
@@ -1,358 +0,0 @@
-/**
- *  Copyright (C) 2004 Savoir-Faire Linux inc.
- *  Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com>
- *                                                                              
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *                                                                              
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <cstdio>
-#include <cstdlib>
-#include <ccrtp/rtp.h>
-
-#include <assert.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <qhostaddress.h>
-#include <qstring.h>
-
-#include "audiocodec.h"
-#include "configuration.h"
-#include "manager.h"
-#include "audiortp.h"
-#include "sip.h"
-#include "../stund/stun.h"
-
-#include <string>
-using namespace ost;
-using namespace std;
-
-
-////////////////////////////////////////////////////////////////////////////////
-// AudioRtp                                                          
-////////////////////////////////////////////////////////////////////////////////
-AudioRtp::AudioRtp (Manager *manager) {
-	string svr;
-	this->manager = manager;
-	RTXThread = NULL;
-	if (!manager->useStun()) {
-		if (Config::gets("Signalisations", "SIP.sipproxy") == "") {
-			svr = Config::gets("Signalisations", "SIP.sipproxy");
-		}
-	} else {
-		svr = Config::gets("Signalisations", "SIP.hostPart");
-	}
-}
-
-AudioRtp::~AudioRtp (void) {
-}
-
-int 
-AudioRtp::createNewSession (SipCall *ca) {
-	// Start RTP Send/Receive threads
-	ca->enable_audio = 1;
-	if (!manager->useStun()) { 
-		symetric = false;
-	} else {
-		symetric = true;
-	}
-	
-#ifdef ALSA
-	if (manager->useAlsa) {
-		RTXThread = new AudioRtpRTX (ca, manager->audiodriver, 
-				manager->audiodriverReadAlsa, manager, symetric);
-	}
-#endif
-	if (!manager->useAlsa) {
-		RTXThread = new AudioRtpRTX (ca, manager->audiodriver, NULL, manager, 
-			symetric);
-	}
-	
-	if (RTXThread->start() != 0) {
-		return -1;
-	}
-		
-	return 0;
-}
-
-	
-void
-AudioRtp::closeRtpSession (SipCall *ca) {
-	// This will make RTP threads finish.
-	ca->enable_audio = -1;
-
-	if (RTXThread != NULL) {
-		delete RTXThread;
-		RTXThread = NULL;
-	}
-
-	// Flush audio read buffer
-	manager->audiodriver->resetDevice();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// AudioRtpRTX Class                                                          //
-////////////////////////////////////////////////////////////////////////////////
-AudioRtpRTX::AudioRtpRTX (SipCall *sipcall, AudioDrivers *driver, 
-		AudioDrivers *read_driver, Manager *mngr, bool sym) {
-	this->time = new Time();
-	this->manager = mngr;
-	this->ca = sipcall;
-	this->sym =sym;
-	this->audioDevice = driver;
-#ifdef ALSA
-	if (manager->useAlsa) {
-		this->audioDeviceRead = read_driver;
-	}
-#endif
-
-	// TODO: Change bind address according to user settings.
-	InetHostAddress local_ip("0.0.0.0");
-
-	if (!sym) {
-		sessionRecv = new RTPSession (local_ip, ca->getLocalAudioPort());
-		sessionSend = new RTPSession (local_ip);
-	} else {
-		int forcedPort = manager->getFirewallPort();
-		qDebug("Forced port %d", forcedPort);
-		session = new SymmetricRTPSession (local_ip, forcedPort);
-	}
-}
-
-AudioRtpRTX::~AudioRtpRTX () {
-	this->terminate();
-	
-	if (!sym) {
-		if (sessionRecv != NULL) {
-			delete sessionRecv;	
-			sessionRecv = NULL;
-		}
-		if (sessionSend != NULL) {
-			delete sessionSend;	
-			sessionSend = NULL;
-		}
-	} else {
-		if (session != NULL) {
-			delete session;
-			session = NULL;
-		}
-	}
-}
-
-void
-AudioRtpRTX::run (void) {
-	unsigned char	*data_to_send;
-	short			*data_mute;
-	short			*data_from_mic;
-	short			*data_from_mic_tmp;
-	int				 i,
-					 compSize, 
-					 timestamp;
-	int				 expandedSize;
-	short			*data_for_speakers = NULL;
-	int	 			 countTime = 0;
-	data_for_speakers = new short[2048];
-	data_from_mic = new short[1024];
-	data_from_mic_tmp = new short[1024];
-	data_to_send = new unsigned char[1024];
-	data_mute = new short[1024];
-
-	InetHostAddress remote_ip(ca->remote_sdp_audio_ip);
-	
-	if (!remote_ip) {
-	   qDebug("RTX: IP address is not correct!");
-	   exit();
-	} else {
-		qDebug("RTX: Connected to %s:%d",
-				ca->remote_sdp_audio_ip, ca->remote_sdp_audio_port);
-	}
-	
-	// Initialization
-	if (!sym) {
-		sessionRecv->setSchedulingTimeout (100000);
-		sessionRecv->setExpireTimeout(1000000);
-		
-		sessionSend->setSchedulingTimeout(10000);
-		sessionSend->setExpireTimeout(1000000);
-	} else {
-		session->setSchedulingTimeout(10000);
-		session->setExpireTimeout(1000000);
-	}
-
-#if 0 // Necessaire ?
-    if (!sessionRecv->addDestination(remote_ip,
-				(unsigned short) ca->remote_sdp_audio_port)) {
-		qDebug("RTX recv: could not connect to port %d", 
-				ca->remote_sdp_audio_port);
-		this->exit();
-	} else {
-		qDebug("RTP(Recv): Added destination %s:%d",
-				remote_ip.getHostname(),
-				(unsigned short) ca->remote_sdp_audio_port);
-	}
-#endif
-
-	if (!sym) {
-		if (!sessionSend->addDestination (remote_ip, 
-					(unsigned short) ca->remote_sdp_audio_port)) {
-			qDebug("RTX send: could not connect to port %d", 
-					ca->remote_sdp_audio_port);
-			this->exit();
-		} else {
-			qDebug("RTP(Send): Added destination %s:%d",
-					remote_ip.getHostname(),
-					(unsigned short) ca->remote_sdp_audio_port);
-		}
-
-		sessionRecv->setPayloadFormat(StaticPayloadFormat(
-				(StaticPayloadType) ca->payload));
-		sessionSend->setPayloadFormat(StaticPayloadFormat(
-				(StaticPayloadType) ca->payload));
-		setCancel(cancelImmediate);
-		sessionSend->setMark(true);
-
-	} else {
-		if (!session->addDestination (remote_ip, 
-					(unsigned short) ca->remote_sdp_audio_port)) {
-			qDebug("Symmetric: could not connect to port %d", 
-					ca->remote_sdp_audio_port);
-			this->exit();
-		} else {
-			qDebug("Symmetric: Connected to %s:%d",
-					remote_ip.getHostname(),
-					(unsigned short) ca->remote_sdp_audio_port);
-
-			session->setPayloadFormat(StaticPayloadFormat(
-				(StaticPayloadType) ca->payload));
-			setCancel(cancelImmediate);
-		}
-	}
-	
-	timestamp = 0;
-
-	// TODO: get frameSize from user config 
-	int frameSize = 20; // 20ms frames
-	TimerPort::setTimer(frameSize);
-	
-	// start running the packet queue scheduler.
-	if (!sym) {
-		sessionRecv->startRunning();
-		sessionSend->startRunning();	
-	} else {
-		session->startRunning();
-	}
-
-	AudioCodec::create(ca->payload);
-
-	while (ca->enable_audio != -1) {
-		////////////////////////////
-		// Send session
-		////////////////////////////
-		int size = 320;
-		if (!manager->mute) {
-#ifdef ALSA
-			if (manager->useAlsa) {
-				i = audioDeviceRead->readBuffer (data_from_mic, size);
-			}
-#endif
-			if (!manager->useAlsa) {
-				i = audioDevice->readBuffer (data_from_mic, size);
-			}
-		} else {
-			// When IP-phone user click on mute button, we read buffer of a
-			// temp buffer to avoid delay in sound.
-#ifdef ALSA
-			if (manager->useAlsa)
-				i = audioDeviceRead->readBuffer (data_mute, size);
-#endif
-			if (!manager->useAlsa)
-				i = audioDevice->readBuffer (data_mute, size);
-		}
-		// TODO : return an error because no sound
-		if (i < 0) {
-			qDebug("audiortp.cpp: No sound");
-			break;
-		}
-		for (int j = 0; j < i; j++)
-			data_from_mic_tmp[j] = data_from_mic[j]*manager->getMicVolume()/100;
-		
-		// Encode acquired audio sample
-		compSize = AudioCodec::codecEncode (
-				ca->payload, 
-				data_to_send,
-				data_from_mic_tmp, i);
-
-		// Send encoded audio sample
-		if (!sym) {
-			sessionSend->putData(timestamp, data_to_send, compSize);
-		} else {
-			session->putData(timestamp, data_to_send, compSize);
-		}
-		timestamp += 160;
-
-		////////////////////////////
-		// Recv session
-		////////////////////////////
-		const AppDataUnit* adu = NULL;
-
-		do {
-			Thread::sleep(5); // in msec.
-			if (!sym) {
-				adu = sessionRecv->getData(sessionRecv->getFirstTimestamp());
-			} else {
-				adu = session->getData(session->getFirstTimestamp());
-			}
-		} while (adu == NULL);
-
-		// Decode data with relevant codec
-		expandedSize = AudioCodec::codecDecode (
-				adu->getType(),
-				data_for_speakers,
-				(unsigned char*) adu->getData(),
-				adu->getSize());
-		
-		// Set decoded data to sound device
-		audioDevice->audio_buf.resize(expandedSize);
-		audioDevice->audio_buf.setData (data_for_speakers, 
-				manager->getSpkrVolume());
-
-		// Notify (with a bip) an incoming call when there is already a call 
-		countTime += time->getSecond();
-		if (manager->getNumberPendingCalls() != 1 and manager->ringing()) {
-			countTime = countTime % 2000;
-			if (countTime < 10 and countTime > 0) {
-				manager->notificationIncomingCall();
-			}
-		} 
-	  	
-		// Write data or notification
-		i = audioDevice->writeBuffer ();
-		delete adu;
-   
-		// Let's wait for the next transmit cycle
-		Thread::sleep(TimerPort::getTimer());
-		TimerPort::incTimer(frameSize); // 'frameSize' ms
-	}
-		 
-	AudioCodec::destroy(ca->payload);
-	delete[] data_for_speakers;
-	delete[] data_from_mic;
-	delete[] data_from_mic_tmp;
-	delete[] data_mute;
-	delete[] data_to_send;
-	this->exit();
-}
-
-
-// EOF
diff --git a/src/call.cpp b/src/call.cpp
new file mode 100644
index 0000000000..b7da704f18
--- /dev/null
+++ b/src/call.cpp
@@ -0,0 +1,347 @@
+/**
+ *  Copyright (C) 2004-2005 Savoir-Faire Linux inc.
+ *  Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com>
+ *                                                                              
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *                                                                              
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *                                                                              
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <iostream>
+#include "audio/audiocodec.h"
+#include "call.h"
+#include "manager.h"
+#include "sipvoiplink.h"
+#include "voIPLink.h"
+
+Call::Call (void) 
+{
+ 	initConstructor();	
+	_id = 0;
+	_manager = NULL;
+	_voIPLink = NULL;
+}
+
+Call::Call (Manager* manager, short id, CallType type, VoIPLink* voiplink)
+{
+ 	initConstructor();
+	_id = id; 
+	_type = type;
+	_manager = manager;
+	_voIPLink = voiplink;
+	
+	switch (_type) {
+	case Outgoing:
+		_voIPLink->newOutgoingCall(_id);
+		break;
+	case Incoming:
+		_voIPLink->newIncomingCall(_id);
+		break;
+	default:
+		break;
+	}
+}
+
+Call::~Call (void)
+{
+}
+
+short
+Call::getId (void)
+{
+	return _id;
+}
+
+void 
+Call::setId (short id)
+{
+	_id = id;
+}
+
+unsigned int 
+Call::getTimestamp(void)
+{
+	return _timestamp;
+}
+
+void 
+Call::setTimestamp (unsigned int timestamp)
+{
+	_timestamp = timestamp;
+}
+
+short
+Call::getVoIPLinkId (void)
+{
+	return _voIPLinkId;
+}
+
+void 
+Call::setVoIPLinkId (short voIPLinkId)
+{
+	_voIPLinkId = voIPLinkId;
+}
+
+void 
+Call::setVoIPLink (VoIPLink* voIPLink)
+{
+	_voIPLink = voIPLink;
+}
+
+VoIPLink*
+Call::getVoIPLink (void)
+{
+	return _voIPLink;
+}
+
+void
+Call::setAudioCodec (void)
+{
+	_audiocodec = _voIPLink->getAudioCodec(getId());
+}
+
+string 
+Call::getStatus (void)
+{
+	return _status;
+}
+
+void 
+Call::setStatus (const string& status)
+{
+	_status = status;
+}
+
+string 
+Call::getTo (void)
+{
+	return _to;
+}
+
+void 
+Call::setTo (const string& to)
+{
+	_to = to;
+}
+
+string 
+Call::getCallerIdName (void)
+{
+	return _callerIdName;
+}
+
+void 
+Call::setCallerIdName (const string& callerId_name)
+{
+	_callerIdName = callerId_name;
+}
+
+string 
+Call::getCallerIdNumber (void)
+{
+	return _callerIdNumber;
+}
+
+void 
+Call::setCallerIdNumber (const string& callerId_number)
+{
+	_callerIdNumber = callerId_number;
+}
+
+enum CallState 
+Call::getState (void)
+{
+	return _state;
+}
+
+void 
+Call::setState (enum CallState state) 
+{
+	_state = state;
+}
+
+enum CallType 
+Call::getType (void)
+{
+	return _type;
+}
+
+void 
+Call::setType (enum CallType type)
+{
+	_type = type;
+}
+
+bool
+Call::isBusy (void)
+{
+	if (isAnswered() or isOffHold() or isOnMute()) {
+		return true;
+	} else {
+		return false;
+	}
+}
+bool 
+Call::isOnHold (void)
+{
+	return (_state == OnHold) ? true : false;
+}
+
+bool 
+Call::isOffHold (void)
+{
+	return (_state == OffHold) ? true : false;
+}
+
+bool 
+Call::isOnMute (void)
+{
+	return (_state == MuteOn) ? true : false;
+}
+
+bool 
+Call::isTransfered (void)
+{
+	return (_state == Transfered) ? true : false;
+}
+
+bool 
+Call::isHungup (void)
+{
+	return (_state == Hungup) ? true : false;
+}
+
+bool 
+Call::isRinging (void)
+{
+	return (_state == Ringing) ? true : false;
+}
+
+bool 
+Call::isRefused (void)
+{
+	return (_state == Refused) ? true : false;
+}
+
+bool 
+Call::isCancelled (void)
+{
+	return (_state == Cancelled) ? true : false;
+}
+
+bool 
+Call::isAnswered (void)
+{
+	return (_state == Answered) ? true : false;
+}
+
+bool 
+Call::isProgressing (void)
+{
+	return (_state == Progressing) ? true : false;
+}
+
+bool
+Call::isOutgoingType (void)
+{
+	return (_type == Outgoing) ? true : false;
+}
+
+bool
+Call::isIncomingType (void)
+{
+	return (_type == Incoming) ? true : false;
+}
+
+int 
+Call::outgoingCall  (const string& to)
+{
+	return _voIPLink->outgoingInvite(to);
+}
+
+int 
+Call::hangup  (void)
+{
+	int i = _voIPLink->hangup(_id);
+	_voIPLink->deleteSipCall(_id);
+	return 1;
+}
+
+int 
+Call::answer  (void)
+{
+	int i = _voIPLink->answer(_id);
+	return 1;
+}
+
+int 
+Call::onHold  (void)
+{
+	int i = _voIPLink->onhold(_id);
+	return 1;
+}
+
+int 
+Call::offHold  (void)
+{
+	int i = _voIPLink->offhold(_id);
+	return 1;
+}
+
+int 
+Call::transfer  (const string& to)
+{
+	int i = _voIPLink->transfer(_id, to);
+	return 1;
+}
+
+int 
+Call::muteOn (void)
+{
+	return 1;
+}
+
+int 
+Call::muteOff (void)
+{
+	return 1;
+}
+
+int 
+Call::refuse  (void)
+{
+	int i = _voIPLink->refuse(_id);
+	_voIPLink->deleteSipCall(_id);
+	return 1;
+}
+
+int 
+Call::cancel  (void)
+{
+	int i = _voIPLink->cancel(_id);
+	_voIPLink->deleteSipCall(_id);
+	return 1;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// Private functions
+///////////////////////////////////////////////////////////////////////////////
+void
+Call::initConstructor(void)
+{
+	_timestamp = 0;
+	_state = NotExist;
+	_type = Null;
+	_voIPLinkId = 1;
+	_audiocodec = NULL;
+}
diff --git a/src/call.h b/src/call.h
new file mode 100644
index 0000000000..b0c6259870
--- /dev/null
+++ b/src/call.h
@@ -0,0 +1,136 @@
+/**
+ *  Copyright (C) 2004-2005 Savoir-Faire Linux inc.
+ *  Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com>
+ *                                                                              
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *                                                                              
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *                                                                              
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef __CALL_H__
+#define __CALL_H__
+
+#include <string>
+#include <vector>
+using namespace std;
+
+#include "sipvoiplink.h"
+#include "voIPLink.h"
+
+
+enum CallState {
+	NotExist = 0,
+	Busy,
+	OnHold,
+	OffHold,
+	MuteOn,
+	MuteOff,
+	Transfered,
+	Hungup,
+	Answered,
+	Ringing,
+	Progressing,
+	Cancelled,	// for cancel outgoing ringing call
+	Refused		// for refuse incoming ringing call	
+};
+
+enum CallType {
+	Null = 0,
+	Incoming,
+	Outgoing
+};
+
+#include "manager.h"
+
+class AudioCodec;
+
+class Call {
+public:
+	Call(void);
+	Call(Manager* manager, short id, CallType type, VoIPLink* voiplink);
+	
+	~Call(void);
+	
+	short getId (void);
+	void setId (short id);
+	
+	unsigned int getTimestamp(void);
+	void setTimestamp (unsigned int timestamp);
+
+	short getVoIPLinkId(void);
+	void setVoIPLinkId (short voIPLinkId);
+	void setVoIPLink (VoIPLink* voIPLink);
+	VoIPLink* getVoIPLink(void);
+	void setAudioCodec(void);
+		
+	string getStatus (void);
+	void setStatus (const string& status);
+	
+	string getTo (void);
+	void setTo (const string& to);
+
+	string getCallerIdName (void);
+	void setCallerIdName (const string& callerId_name);
+	string getCallerIdNumber (void);
+	void setCallerIdNumber (const string& callerId_number);
+	
+	enum CallState getState (void);
+	void setState (enum CallState state);
+	enum CallType getType (void);
+	void setType (enum CallType type);
+
+	bool isBusy	(void);
+	bool isOnHold (void);
+	bool isOffHold (void);
+	bool isOnMute (void);
+	bool isTransfered (void);
+	bool isHungup (void);
+	bool isRinging (void);
+	bool isRefused (void);
+	bool isCancelled (void);
+	bool isAnswered (void);
+	bool isProgressing (void);
+	bool isOutgoingType (void);
+	bool isIncomingType (void);
+	
+	int outgoingCall  (const string& to);
+	int hangup  (void);
+	int answer  (void);
+	int onHold  (void);
+	int offHold  (void);
+	int transfer  (const string& to);
+	int muteOn (void);
+	int muteOff (void);
+	int refuse  (void);
+	int cancel  (void);
+
+
+private:
+	void initConstructor (void);
+	
+	Manager* _manager;
+	VoIPLink* _voIPLink;
+	AudioCodec* _audiocodec;
+	
+	short _id;
+	short _voIPLinkId;
+	unsigned int _timestamp;
+	enum CallState _state;
+	enum CallType _type;
+	string _to;
+	string _callerIdName;
+	string _callerIdNumber;
+	string _status;
+};
+
+#endif // __CALL_H__
diff --git a/src/configitem.cpp b/src/configitem.cpp
index d86ab9c2c2..d9a16ef1a7 100644
--- a/src/configitem.cpp
+++ b/src/configitem.cpp
@@ -3,14 +3,12 @@
 // (c) 2004 Savoir-faire Linux inc.
 //
 //
-#include <cc++/string.h>
 #include <assert.h>
 #include <stdio.h>
 #include <string.h>
 
 #include "configitem.h"
 
-using namespace ost;
 using namespace std;
 
 ConfigItem::ConfigItem (void) {
@@ -18,16 +16,16 @@ ConfigItem::ConfigItem (void) {
 }
 
 // Create a new ConfigItem, with key name keyName
-ConfigItem::ConfigItem (const char *keyName) {
+ConfigItem::ConfigItem (const string& keyName) {
 	init();
-	this->_key = new String(keyName);
+	this->_key = new string(keyName);
 }
 
 // Create a new ConfigItem, with key name keyName and value keyVal.
-ConfigItem::ConfigItem (const char *keyName, const char *keyVal) {
+ConfigItem::ConfigItem (const string& keyName, const string& keyVal) {
 	init();
-	this->_key = new String(keyName);
-	this->_value = new String(keyVal);
+	this->_key = new string(keyName);
+	this->_value = new string(keyVal);
 }
 
 ConfigItem::~ConfigItem (void) {
@@ -37,8 +35,8 @@ ConfigItem::~ConfigItem (void) {
 
 
 // Get the value of the passed key
-String*
-ConfigItem::getValueByKey (const char *keyName) {
+string*
+ConfigItem::getValueByKey (const string& keyName) {
 	assert (_key != NULL);
 	
 	if (*_key == keyName) {
@@ -53,7 +51,7 @@ ConfigItem::getValueByKey (const char *keyName) {
 // Get item pointer using a key value.
 // If key value not found, new item is appended to list.
 ConfigItem*
-ConfigItem::getItemByKey (const char *keyName) {
+ConfigItem::getItemByKey (const string& keyName) {
 	assert (_key != NULL);
 
 	if (*_key == keyName) {
@@ -94,17 +92,17 @@ ConfigItem::saveToFile (fstream *fd) {
 
 // Set the current objects value
 void
-ConfigItem::setValue (const char *newValue) {
+ConfigItem::setValue (const string& newValue) {
 	if (_value != NULL) {
 		delete _value;
 	}
 	
-	_value = new String(newValue);
+	_value = new string(newValue);
 }
 
 // Set a value given its key name
 void
-ConfigItem::setValueByKey (const char *key, const char *value) {
+ConfigItem::setValueByKey (const string& key, const string& value) {
 	getItemByKey(key)->setValue(value);
 }
 
diff --git a/src/configitem.h b/src/configitem.h
index 0a7fb8ba0e..9a236beab1 100644
--- a/src/configitem.h
+++ b/src/configitem.h
@@ -9,31 +9,30 @@
 #include <iostream>
 #include <fstream>
 
-#include <cc++/string.h>
+#include <string>
 #include <stdio.h>
 
-using namespace ost;
 using namespace std;
 
 class ConfigItem {
 public:
 	ConfigItem  (void);
-	ConfigItem  (const char *);
-	ConfigItem  (const char *, const char *);
+	ConfigItem  (const string& );
+	ConfigItem  (const string& , const string& );
 	~ConfigItem (void);
-	String*		key (void) { return _key; }
-	String*		value (void) { return _value; }
+	string*		key (void) { return _key; }
+	string*		value (void) { return _value; }
 	ConfigItem* head (void) { return _head; }
 	void		setHead (ConfigItem *h) { _head = h; }
-	String*		getValueByKey   (const char *);
-	ConfigItem* getItemByKey	(const char *);
-	void		setValue		(const char *);
-	void		setValueByKey   (const char *, const char *);
+	string*		getValueByKey   (const string& );
+	ConfigItem* getItemByKey	(const string& );
+	void		setValue		(const string& );
+	void		setValueByKey   (const string& , const string& );
 	void		saveToFile		(fstream*);
 	
 private:
-	String*		_key;
-	String*		_value;
+	string*		_key;
+	string*		_value;
 	ConfigItem* _next;
 	ConfigItem* _head;
 	void init   (void);
diff --git a/src/configuration.cpp b/src/configuration.cpp
index fc989cc24c..17c5c5491d 100644
--- a/src/configuration.cpp
+++ b/src/configuration.cpp
@@ -17,87 +17,91 @@
  *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-#include <qstring.h>
+#include <string>
 
 #include "configuration.h"
 #include "configurationtree.h"
 
+using namespace std;
+
 static ConfigurationTree	*globalConfigTree = NULL;
 
+
 string
-Config::gets (const char *section, const char *key) {
-	return Config::get (section, key, "");
+Config::gets (const string& section, const string& key) {
+	return Config::get (section, key, string(""));
 }
 
+
 string
-Config::get	(const char *section, const char *key, const char *defval) {
-	char *value = tree()->getValue (section, key);
-	if (value == NULL) {
+Config::get	(const string& section, const string& key, const string& defval) {
+	string value = tree()->getValue (section, key);
+	if (value.empty()) {
 		tree()->setValue(section, key, defval);
-		return string(defval);
+		return defval;
 	} else {
-		return string(value);
+		return value;
 	}
 }
-
-char *
-Config::getschar (const char *section, const char *key) {
+/*
+string 
+Config::getschar (const string& section, const string& key) {
 	return Config::getchar (section, key, "");
-}
+}*/
 
-char *
-Config::getchar	(const char *section, const char *key, const char *defval) {
-	char *value = tree()->getValue (section, key);
-	if (value == NULL) {
+string 
+Config::getchar	(const string& section, const string& key, const string& defval){
+	string value = tree()->getValue (section, key);
+	if (value == string("")) {
 		tree()->setValue(section, key, defval);
-		return (char*)defval;
+		return defval;
 	} else {
 		return value;
 	}
 }
-
+/*
 bool
-Config::getb (const char *section, const char *key) {
+Config::getb (const string& section, const string& key) {
 	return (bool)Config::get (section, key, 0);
 }
 
-
+*/
 int
-Config::geti (const char *section, const char *key) {
+Config::geti (const string& section, const string& key) {
 	return Config::get (section, key, 0);
 }
 
 int
-Config::get	(const char *section, const char * key, int defval) {
-	char *value = tree()->getValue(section, key);
-	if (value == NULL) {
+Config::get	(const string& section, const string&  key, int defval) {
+	string value = tree()->getValue(section, key);
+	if (value == string("")) {
 		tree()->setValue(section, key, defval);
 		return defval;
 	} else {
-		return atoi(value);
+		return atoi(value.data());
 	} 
 }
 
 string
-Config::set	(const char *section, const char *key, const char *val) {
+Config::set	(const string& section, const string& key, const string& val) {
 	tree()->setValue(section, key, val);
-	return string(val);
+	return val;
 }
 
-char *
-Config::setchar	(const char *section, const char *key, const char *val) {
+string 
+Config::setchar	(const string& section, const string& key, const string& val) {
 	tree()->setValue(section, key, val);
-	return (char*)val;
+	return val;
 }
 
 int
-Config::set	(const char *section, const char *key, int val) {
+Config::set	(const string& section, const string& key, int val) {
 	tree()->setValue(section, key, val);
 	return val;
 }
 
 bool
-Config::set	(const char *section, const char *key, bool val) {
+Config::set	(const string& section, const string& key, bool val) {
 	tree()->setValue(section, key, (int)val);
 	return val;
 }
@@ -108,6 +112,11 @@ Config::setTree (ConfigurationTree *t) {
 	globalConfigTree = t;
 }
 
+void
+Config::deleteTree (void) {
+	delete globalConfigTree;
+}
+
 ConfigurationTree*
 Config::tree(void) {
 	return globalConfigTree;
diff --git a/src/configuration.h b/src/configuration.h
index d6f147d0b0..885e1107a3 100644
--- a/src/configuration.h
+++ b/src/configuration.h
@@ -20,12 +20,10 @@
 #ifndef __CONFIG_H__
 #define __CONFIG_H__
 
-#include <qsettings.h>
-#include <qstring.h>
+#include <string>
 
 #include "global.h"
 
-#include <string>
 using namespace std;
 
 class ConfigurationTree;
@@ -34,22 +32,23 @@ public:
 	Config					(void) {};
 	~Config					(void) {};
 
-	static std::string	 gets	(const char*, const char*);
-	static char* getschar	(const char*, const char*);
-	static int		 geti	(const char*, const char*);
-	static bool		 getb	(const char*, const char*);
+	static string	gets	(const string&, const string&);
+//	static string	getschar(const string&, const string&);
+	static int		geti	(const string&, const string&);
+//	static bool		getb	(const string&, const string&);
 	
-	static std::string	 get	(const char*, const char*, const char*);	
-	static char* getchar	(const char*, const char*, const char*);	
-	static int		 get	(const char*, const char*, int);
-	static bool		 get	(const char*, const char*, bool);
+	static string	get		(const string&, const string&, const string&);	
+	static string 	getchar	(const string&, const string&, const string&);	
+	static int		get		(const string&, const string&, int);
+	static bool		get		(const string&, const string&, bool);
 	
-	static int		 set	(const char*, const char*, int);
-	static bool		 set	(const char*, const char*, bool);
-	static std::string	 set	(const char*, const char*, const char*);
-	static char* setchar	(const char*, const char*, const char*);
+	static int		set		(const string&, const string&, int);
+	static bool		set		(const string&, const string&, bool);
+	static string	set		(const string&, const string&, const string&);
+	static string 	setchar	(const string&, const string&, const string&);
 
-	static void		 setTree (ConfigurationTree *);
+	static void		setTree (ConfigurationTree *);
+	static void		deleteTree (void);
 	static ConfigurationTree*	tree (void);
 };
 
diff --git a/src/configurationtree.cpp b/src/configurationtree.cpp
index 4ceb4bc48b..43b630665f 100644
--- a/src/configurationtree.cpp
+++ b/src/configurationtree.cpp
@@ -9,6 +9,7 @@
 
 #include "configitem.h"
 #include "configurationtree.h"
+#include "global.h"
 
 using namespace std;
 
@@ -18,7 +19,7 @@ ConfigurationTree::ConfigurationTree (void) {
 }
 
 // Construct with file name, and load from this file
-ConfigurationTree::ConfigurationTree (const char *fileName) {
+ConfigurationTree::ConfigurationTree (const string& fileName) {
 	populateFromFile (fileName);
 }
 
@@ -31,67 +32,70 @@ ConfigurationTree::~ConfigurationTree (void) {
 
 // Create the tree from an existing ini file
 int
-ConfigurationTree::populateFromFile (const char *fileName) {
-	if (fileName == NULL) {
-		printf("Filename is NULL\n");
+ConfigurationTree::populateFromFile (const string& fileName) {
+	bool out = false;
+	if (fileName.empty()) {
 		return 0;
 	}
 	
 	fstream file;
-	file.open(fileName, fstream::in);
+	file.open(fileName.data(), fstream::in);
 	 
 	if (!file.is_open()) {
-        printf("\nConfig-file is creating ...\n");
-		return 0;
+		file.open(fileName.data(), fstream::out);
+		out = true;
+		if (!file.is_open()) {
+        	_debug("Error opening file (%s:%d)\n", __FILE__, __LINE__);
+			return 0;
+		}
+		return 2;
   	}
 	
 	char line[128];
 	bzero (line, 128);
 	
-	const char* section = NULL;
-	const char* key;
-	const char* val;
-	String s;
+	const string section("");
+	const string key("");
+	const string val("");
+	string s;
+	int pos;
 	
 	while (!file.eof()) {
 		// Read the file line by line
 		file.getline (line, 128 - 1);
-		String* str = new String(line);
-		if (*str[0] == '[') {
+		string str(line);
+		if (str[0] == '[') {
 			// If the line is a section
-			s = str->token("[",1);
-			s.trim("]");
-			section = s.data();
-	
-		} else if (*str != NULL and *str[0] != '#') {
+			pos = str.find(']');
+			section = str.substr(1, pos - 1);
+		} else if (!str.empty() and str[0] != '#') {
 			// If the line is "key=value" and doesn't begin with '#'(comments)
-			String k = str->token("=", 0);
-			key = k.data();
-			String v = str->token("=", 0);
-			val = v.data();
-			if (String(key).length() > 0 and String(val).length() > 0) {
+			pos = str.find('=');
+			key = str.substr(0, pos);
+			val = str.substr(pos + 1, str.length() - pos);
+		
+			if (key.length() > 0 and val.length() > 0) {
 				setValue(section, key, val);
 			} 
 		}
-		delete str;
 	}
-	
+
 	file.close();
 	return 1;
 }
 
 // Save tree's contents to a file
 int
-ConfigurationTree::saveToFile (const char *fileName) {
-	if (fileName == NULL || _head == NULL) {
+ConfigurationTree::saveToFile (const string& fileName) {
+	if (fileName.empty() || _head == NULL) {
 		return 0;
 	}
 	
 	fstream file;
-	file.open(fileName, fstream::out);
+	file.open(fileName.data(), fstream::out);
 	 
 	if (!file.is_open()) {
-        printf("\nError opening file\n");
+        _debug("Error opening file\n");
 		return 0;
   	}
 
@@ -104,7 +108,7 @@ ConfigurationTree::saveToFile (const char *fileName) {
 // set [section]/key to int value
 #define TMPBUFSIZE	32
 int
-ConfigurationTree::setValue (const char *section, const char *key, int value) {
+ConfigurationTree::setValue (const string& section, const string& key, int value) {
 	char tmpBuf[TMPBUFSIZE];
 
 	// Make string from int
@@ -116,8 +120,9 @@ ConfigurationTree::setValue (const char *section, const char *key, int value) {
 
 // set [section]/key to "value"
 int
-ConfigurationTree::setValue (const char *section, const char *key,
-							 const char *value) {
+ConfigurationTree::setValue (const string& section, const string& key,
+							 const string& value) {
+
 	if (_head != NULL) {
 		ConfigSection *list;
 		ConfigItem		*item;
@@ -145,11 +150,10 @@ ConfigurationTree::setValue (const char *section, const char *key,
 }
 
 // get [section]/key's value
-char *
-ConfigurationTree::getValue (const char *section, const char *key) {
-//	printf ("getValue(%s,%s)\n", section, key);
+string
+ConfigurationTree::getValue (const string& section, const string& key) {
 	if (_head != NULL) {
-		String *valuePtr;
+		string *valuePtr;
 		if (_head->getItemByKey(section)->head() != 0) {
 			// If config file exist
 			valuePtr = _head->getItemByKey(section)->head()->getValueByKey(key);
@@ -161,10 +165,10 @@ ConfigurationTree::getValue (const char *section, const char *key) {
 		if (valuePtr != NULL) {
 			return valuePtr->data();
 		} else {
-			return NULL;
+			return "";
 		}
 	} else {
-		return (char *) NULL;
+		return "";
 	}
 }
 
diff --git a/src/configurationtree.h b/src/configurationtree.h
index 694227e5b6..a4c3dc3544 100644
--- a/src/configurationtree.h
+++ b/src/configurationtree.h
@@ -28,14 +28,14 @@
 class ConfigurationTree {
 public:
 	ConfigurationTree (void);
-	ConfigurationTree (const char *);
+	ConfigurationTree (const string&);
 	~ConfigurationTree (void);	
 	ConfigSection*  head (void) { return this->_head; }
-	int				populateFromFile(const char*);
-	int				saveToFile		(const char*);
-	int				setValue		(const char*, const char*, int);
-	int				setValue		(const char*, const char*, const char*);
-	char*			getValue		(const char*, const char*);
+	int				populateFromFile(const string& );
+	int				saveToFile		(const string& );
+	int				setValue		(const string& , const string& , int);
+	int				setValue(const string& , const string& , const string& );
+	string			getValue		(const string& , const string& );
 	
 private:
 	ConfigSection *_head;
diff --git a/src/error.cpp b/src/error.cpp
index 19f6234c30..a46b564322 100644
--- a/src/error.cpp
+++ b/src/error.cpp
@@ -1,130 +1,133 @@
 
 #include "error.h"
+#include "global.h"
+#include "manager.h"
   
 #include <string>
 using namespace std;
 
-Error::Error (Manager *_mngr){
-	this->mngr = _mngr;
+Error::Error (Manager *mngr){
+	_mngr = mngr;
 	issetError = 0;
 } 
 
 int
 Error::errorName (Error_enum num_name, char* err) {
+#if 1
 	string str;
 	switch (num_name){
 		// Handle opening device errors
 		case DEVICE_NOT_OPEN:
-			printf ("ERROR: Device Not Open\n");			
-			mngr->errorDisplay("Device not open ");
+			_debug("ERROR: Device Not Open\n");	
+			_mngr->displayError("Device not open ");
 			issetError = 2;
 			break;
 		case DEVICE_ALREADY_OPEN:
-			printf ("ERROR: Device Already Open !\n");
-			mngr->errorDisplay("Device already open ");
+			_debug ("ERROR: Device Already Open !\n");
+			_mngr->displayError("Device already open ");
 			issetError = 2;
 			break;
 		case OPEN_FAILED_DEVICE:
-			printf ("ERROR: Open Failed\n");
-			mngr->errorDisplay("Open device failed ");
+			_debug ("ERROR: Open Failed\n");
+			_mngr->displayError("Open device failed ");
 			issetError = 2; 
 			break;
 			
 		// Handle ALSA errors
 		case PARAMETER_STRUCT_ERROR_ALSA:
 			str = str.append("Error with hardware parameter structure: ") + err;
-			mngr->errorDisplay((char*)str.data());
+			_mngr->displayError((char*)str.data());
 			issetError = 1;
 			break;
 		case ACCESS_TYPE_ERROR_ALSA:
 			str = str.append("Cannot set access type: ") + err;
-			mngr->errorDisplay((char*)str.data());
+			_mngr->displayError((char*)str.data());
 			issetError = 1;
 			break;
 		case SAMPLE_FORMAT_ERROR_ALSA:
 			str = str.append("Cannot set sample format: ") + err;
-			mngr->errorDisplay((char*)str.data());
+			_mngr->displayError((char*)str.data());
 			issetError = 1;
 			break;
 		case SAMPLE_RATE_ERROR_ALSA:
 			str = str.append("Cannot set sample rate: ") + err;
-			mngr->errorDisplay((char*)str.data());
+			_mngr->displayError((char*)str.data());
 			issetError = 1;
 			break;
 		case CHANNEL_ERROR_ALSA:
 			str = str.append("Cannot set channel: ") + err;
-			mngr->errorDisplay((char*)str.data());
+			_mngr->displayError((char*)str.data());
 			issetError = 1;
 			break;
 		case PARAM_SETUP_ALSA:
 			str = str.append("Cannot set parameters: ") + err;
-			mngr->errorDisplay((char*)str.data());
+			_mngr->displayError((char*)str.data());
 			issetError = 1;
 			break;
 		case DROP_ERROR_ALSA:
 			str = str.append("Error: drop(): ") + err;
-			mngr->errorDisplay((char*)str.data());
+			_mngr->displayError((char*)str.data());
 			issetError = 1;
 			break;
 		case PREPARE_ERROR_ALSA:
 			str = str.append("Error: prepare(): ") + err;
-			mngr->errorDisplay((char*)str.data());
+			_mngr->displayError((char*)str.data());
 			issetError = 1;
 			break;
 
 		// Handle OSS errors
 		case FRAGMENT_ERROR_OSS:
 			str = str.append("Error: SNDCTL_DSP_SETFRAGMENT: ") + err;
-			mngr->errorDisplay((char*)str.data());
+			_mngr->displayError((char*)str.data());
 			issetError = 1;
 			break;
 		case SAMPLE_FORMAT_ERROR_OSS:
 			str = str.append("Error: SNDCTL_DSP_SETFMT: ") + err;
-			mngr->errorDisplay((char*)str.data());
+			_mngr->displayError((char*)str.data());
 			issetError = 1;
 			break;	
 		case CHANNEL_ERROR_OSS:
 			str = str.append("Error: SNDCTL_DSP_CHANNELS: ") + err;
-			mngr->errorDisplay((char*)str.data());
+			_mngr->displayError((char*)str.data());
 			issetError = 1;
 			break;	
 		case SAMPLE_RATE_ERROR_OSS:
 			str = str.append("Error: SNDCTL_DSP_SPEED: ") + err;
-			mngr->errorDisplay((char*)str.data());
+			_mngr->displayError((char*)str.data());
 			issetError = 1;
 			break;
 		case GETISPACE_ERROR_OSS:
 			str = str.append("Error: SNDCTL_DSP_GETISPACE: ") + err;
-			mngr->errorDisplay((char*)str.data());
+			_mngr->displayError((char*)str.data());
 			issetError = 1;
 			break;
 		case GETOSPACE_ERROR_OSS:
 			str = str.append("Error: SNDCTL_DSP_GETOSPACE: ") + err;
-			mngr->errorDisplay((char*)str.data());
+			_mngr->displayError((char*)str.data());
 			issetError = 1;
 			break;
 
 		// Handle setup errors
 		case HOST_PART_FIELD_EMPTY:
-			mngr->errorDisplay("Fill host part field");
+			_mngr->displayError("Fill host part field");
 			issetError = 2;
 			break;	
 		case USER_PART_FIELD_EMPTY:
-			mngr->errorDisplay("Fill user part field");
+			_mngr->displayError("Fill user part field");
 			issetError = 2;
 			break;
 		case PASSWD_FIELD_EMPTY:
-			mngr->errorDisplay("Fill password field");
+			_mngr->displayError("Fill password field");
 			issetError = 2;
 			break; 
 
 		// Handle sip uri 
 		case FROM_ERROR:
-			mngr->errorDisplay("Error for 'From' header");
+			_mngr->displayError("Error for 'From' header");
 			issetError = 1;
 			break;
 		case TO_ERROR:
-			mngr->errorDisplay("Error for 'To' header");
+			_mngr->displayError("Error for 'To' header");
 			issetError = 1;
 			break;
 
@@ -133,5 +136,7 @@ Error::errorName (Error_enum num_name, char* err) {
 			break;
 	}  
 	return issetError;   
+#endif
+	return 1;
 } 
   
diff --git a/src/error.h b/src/error.h
index b58c089615..983acaee0a 100644
--- a/src/error.h
+++ b/src/error.h
@@ -3,7 +3,6 @@
 
 #include <stdio.h>
 
-#include "manager.h"
 
 typedef enum {
 	DEVICE_NOT_OPEN = 0,
@@ -35,10 +34,10 @@ typedef enum {
 
 } Error_enum;
 
-
+class Manager;
 class Error {
 public: 
-	Error (Manager *); 
+	Error (Manager *mngr); 
 	~Error (void) {};
 
 	int errorName (Error_enum, char *);
@@ -46,7 +45,7 @@ public:
 	inline void setError(int err) 	{ issetError = err; }
 
 private:
-	Manager *mngr;
+	Manager *_mngr;
 	int 	issetError;
 	
 };
diff --git a/src/eventthread.cpp b/src/eventthread.cpp
new file mode 100644
index 0000000000..17decd3ef5
--- /dev/null
+++ b/src/eventthread.cpp
@@ -0,0 +1,48 @@
+/**
+ *  Copyright (C) 2004-2005 Savoir-Faire Linux inc.
+ *  Author : Laurielle Lea <laurielle.lea@savoirfairelinux.com>
+ *                                                                              
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *                                                                              
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *                                                                              
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+//#include <stdio.h>
+#include <iostream>
+
+#include "eventthread.h"
+#include "sipvoiplink.h"
+
+using namespace std;
+
+EventThread::EventThread (SipVoIPLink* sip) : Thread () 
+{
+	_sipthread = sip;
+}
+
+EventThread::~EventThread (void) 
+{
+	terminate();
+}
+
+/**
+ * Reimplementation of run() 
+ */
+void
+EventThread::run (void) 
+{
+	while(1) {
+		_sipthread->getEvent();
+	}
+}
+
diff --git a/src/eventthread.h b/src/eventthread.h
new file mode 100644
index 0000000000..55c3b31e98
--- /dev/null
+++ b/src/eventthread.h
@@ -0,0 +1,38 @@
+/**
+ *  Copyright (C) 2004-2005 Savoir-Faire Linux inc.
+ *  Author : Laurielle Lea <laurielle.lea@savoirfairelinux.com>
+ *                                                                              
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *                                                                              
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *                                                                              
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef __EVENT_THREAD_H__
+#define __EVENT_THREAD_H__
+
+#include <cc++/thread.h>
+
+using namespace ost;
+
+class SipVoIPLink;
+class EventThread : public Thread {
+public:
+	EventThread (SipVoIPLink*);
+	~EventThread (void);
+	
+	virtual void 	 run ();
+private:
+	SipVoIPLink*	_sipthread;
+};
+
+#endif // __EVENT_THREAD_H__
diff --git a/src/global.h b/src/global.h
index 1b050dd4dd..4f6fb90fa5 100644
--- a/src/global.h
+++ b/src/global.h
@@ -1,5 +1,5 @@
 /**
- *  Copyright (C) 2004 Savoir-Faire Linux inc.
+ *  Copyright (C) 2004-2005 Savoir-Faire Linux inc.
  *  Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com>
  *                                                                              
  *  This program is free software; you can redistribute it and/or modify
@@ -20,15 +20,24 @@
 #ifndef __GLOBAL_H__
 #define __GLOBAL_H__
 
+#define DEBUG
+
+#ifdef DEBUG
+	#define _debug(...)	fprintf(stderr, "[debug] " __VA_ARGS__)
+#else
+	#define _debug(...)
+#endif
+
 #ifndef PREFIX
 #define PREFIX					"/usr/local"
 #endif
 
-#define VERSION					"0.3"
+#define VERSION					"0.4"
 #define PROGNAME				"sflphone"
 #define SKINDIR					"skins"
 #define PIXDIR					"pixmaps"
 #define RINGDIR					"rings"
+#define CODECDIR				"codecs"
 
 #define SFLPHONE_LOGO			"logo_ico.png"
 #define TRAY_ICON				"tray-icon.png"
@@ -46,8 +55,6 @@
 #define	FORMAT					2			// for 16 bits format
 #define OCTETS					SAMPLING_RATE * FORMAT	// Number of writen 
 														// bytes in buffer
-#define	YES						0
-#define NO						1
 #define OSS_DRIVER				0
 #define ALSA_DRIVER				1
 #endif	// __GLOBAL_H__
diff --git a/src/gui/guiframework.cpp b/src/gui/guiframework.cpp
new file mode 100644
index 0000000000..9db3fa8d2b
--- /dev/null
+++ b/src/gui/guiframework.cpp
@@ -0,0 +1,174 @@
+/**
+ *  Copyright (C) 2004-2005 Savoir-Faire Linux inc.
+ *  Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com>
+ *                                                                              
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *                                                                              
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *                                                                              
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <string>
+using namespace std;
+
+#include "guiframework.h"
+#include "../manager.h"
+
+GuiFramework::GuiFramework (Manager* manager)
+{
+	_manager = manager;
+}
+
+GuiFramework::~GuiFramework (void) {}
+
+int 
+GuiFramework::outgoingCall (const string& to)
+{
+	return _manager->outgoingCall(to);
+}
+
+int 
+GuiFramework::hangupCall (short id)
+{
+	if (_manager->hangupCall(id)) {
+		return 1;
+	} else {
+		return 0;
+	}
+}
+
+int 
+GuiFramework::answerCall (short id)
+{
+	if (_manager->answerCall(id)) {
+		return 1;
+	} else {
+		return 0;
+	}
+}
+
+int 
+GuiFramework::onHoldCall (short id)
+{
+	if (_manager->onHoldCall(id)) {
+		return 1;
+	} else {
+		return 0;
+	}
+}
+
+int 
+GuiFramework::offHoldCall (short id)
+{
+	if (_manager->offHoldCall(id)) {
+		return 1;
+	} else {
+		return 0;
+	}
+}
+
+int 
+GuiFramework::transferCall (short id, const string& to)
+{
+	if (_manager->transferCall(id, to)) {
+		return 1;
+	} else {
+		return 0;
+	}
+}
+
+int 
+GuiFramework::muteOn (short id)
+{
+	if (_manager->muteOn(id)) {
+		return 1;
+	} else {
+		return 0;
+	}
+}
+
+int 
+GuiFramework::muteOff (short id)
+{
+	if (_manager->muteOff(id)) {
+		return 1;
+	} else {
+		return 0;
+	}
+}
+
+int 
+GuiFramework::refuseCall (short id)
+{
+	if (_manager->refuseCall(id)) {
+		return 1;
+	} else {
+		return 0;
+	}
+}
+
+int 
+GuiFramework::cancelCall (short id)
+{
+	if (_manager->cancelCall(id)) {
+		return 1;
+	} else {
+		return 0;
+	}
+}
+
+int 
+GuiFramework::saveConfig (void)
+{
+	if (_manager->saveConfig()) {
+		return 1;
+	} else {
+		return 0;
+	}
+}
+
+int 
+GuiFramework::registerVoIPLink (void)
+{
+	if (_manager->registerVoIPLink()) {
+		return 1;
+	} else {
+		return 0;
+	}
+}
+
+void 
+GuiFramework::sendDtmf (short id, char code)
+{
+	_manager->sendDtmf(id, code);
+}
+
+int 
+GuiFramework::quitApplication (void)
+{
+	return (_manager->quitApplication() ? 1 : 0);
+}
+
+int 
+GuiFramework::sendTextMessage (short id, const string& message)
+{
+	_manager->sendTextMessage(id, message);
+	return 1;
+}
+
+int 
+GuiFramework::accessToDirectory (void)
+{
+	_manager->accessToDirectory();
+	return 1;
+}
+
diff --git a/src/gui/guiframework.h b/src/gui/guiframework.h
new file mode 100644
index 0000000000..affdc23457
--- /dev/null
+++ b/src/gui/guiframework.h
@@ -0,0 +1,74 @@
+/**
+ *  Copyright (C) 2004-2005 Savoir-Faire Linux inc.
+ *  Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com>
+ *                                                                              
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *                                                                              
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *                                                                              
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef __GUI_FRAMEWORK_H__
+#define __GUI_FRAMEWORK_H__
+
+/* Inherited class by GUI classes */
+/* The GuiFramework class is the base of all user interface */
+
+#include <string>
+using namespace std;
+
+#include "../manager.h"
+
+class GuiFramework {
+public:
+	GuiFramework (Manager* manager);
+	virtual ~GuiFramework (void);
+
+	/* Parent class to child class */
+	virtual int incomingCall (short id) = 0;
+	virtual int peerAnsweredCall (short id) = 0;
+	virtual int peerRingingCall (short id) = 0;
+	virtual int peerHungupCall (short id) = 0;
+	virtual void displayTextMessage (short id, const string& message) = 0;
+	virtual void displayError (const string& error) = 0;
+	virtual void displayStatus (const string& status) = 0;
+	virtual void displayContext (short id) = 0;
+	virtual string getRingtoneFile (void) = 0;
+	virtual void setup (void) = 0;
+	
+	/* Child class to parent class */
+	int outgoingCall (const string& to); 	
+	int hangupCall (short id);
+	int answerCall (short id);
+	int onHoldCall (short id);
+	int offHoldCall (short id);
+	int transferCall (short id, const string& to);
+	int muteOn (short id);
+	int muteOff (short id);
+	int refuseCall (short id);
+	int cancelCall (short id);
+
+	int saveConfig (void);
+	int registerVoIPLink (void);
+	int quitApplication (void);
+	int sendTextMessage (short id, const string& message);
+	int accessToDirectory (void);
+	void sendDtmf (short id, char code);
+	
+protected:
+	string _message;
+
+private:	
+	Manager* _manager;
+};
+
+#endif // __GUI_FRAMEWORK_H__
diff --git a/src/configurationpanel.ui b/src/gui/qt/configurationpanel.ui
similarity index 87%
rename from src/configurationpanel.ui
rename to src/gui/qt/configurationpanel.ui
index b9c1ebc504..72a52c2999 100644
--- a/src/configurationpanel.ui
+++ b/src/gui/qt/configurationpanel.ui
@@ -445,21 +445,24 @@
                                 </property>
                                 <widget class="QRadioButton">
                                     <property name="name">
-                                        <cstring>useStunYes</cstring>
+                                        <cstring>useStunNo</cstring>
                                     </property>
                                     <property name="text">
-                                        <string>Yes</string>
+                                        <string>No</string>
+                                    </property>
+                                    <property name="checked">
+                                        <bool>true</bool>
                                     </property>
                                 </widget>
                                 <widget class="QRadioButton">
                                     <property name="name">
-                                        <cstring>useStunNo</cstring>
+                                        <cstring>useStunYes</cstring>
                                     </property>
                                     <property name="text">
-                                        <string>No</string>
+                                        <string>Yes</string>
                                     </property>
                                     <property name="checked">
-                                        <bool>true</bool>
+                                        <bool>false</bool>
                                     </property>
                                 </widget>
                             </vbox>
@@ -1177,27 +1180,6 @@
                         <attribute name="title">
                             <string>About SFLPhone</string>
                         </attribute>
-                        <widget class="QLabel">
-                            <property name="name">
-                                <cstring>textLabel2_2</cstring>
-                            </property>
-                            <property name="geometry">
-                                <rect>
-                                    <x>20</x>
-                                    <y>170</y>
-                                    <width>371</width>
-                                    <height>121</height>
-                                </rect>
-                            </property>
-                            <property name="text">
-                                <string>&lt;p align="center"&gt;
-Copyright (C) 2004 Savoir-faire Linux inc.&lt;br&gt;&lt;br&gt;
-Laurielle LEA &amp;lt;laurielle.lea@savoirfairelinux.com&amp;gt;&lt;br&gt;&lt;br&gt;
-SFLPhone-0.3 is released under the General Public License.&lt;br&gt;
-For more information, see http://www.sflphone.org&lt;br&gt;
-&lt;/p&gt;</string>
-                            </property>
-                        </widget>
                         <widget class="QLabel">
                             <property name="name">
                                 <cstring>pixmapLabel1</cstring>
@@ -1217,6 +1199,27 @@ For more information, see http://www.sflphone.org&lt;br&gt;
                                 <bool>true</bool>
                             </property>
                         </widget>
+                        <widget class="QLabel">
+                            <property name="name">
+                                <cstring>textLabel2_2</cstring>
+                            </property>
+                            <property name="geometry">
+                                <rect>
+                                    <x>20</x>
+                                    <y>170</y>
+                                    <width>371</width>
+                                    <height>121</height>
+                                </rect>
+                            </property>
+                            <property name="text">
+                                <string>&lt;p align="center"&gt;
+Copyright (C) 2004-2005 Savoir-faire Linux inc.&lt;br&gt;&lt;br&gt;
+Laurielle LEA &amp;lt;laurielle.lea@savoirfairelinux.com&amp;gt;&lt;br&gt;&lt;br&gt;
+SFLPhone-0.4 is released under the General Public License.&lt;br&gt;
+For more information, see http://www.sflphone.org&lt;br&gt;
+&lt;/p&gt;</string>
+                            </property>
+                        </widget>
                     </widget>
                     <widget class="QWidget">
                         <property name="name">
@@ -1273,7 +1276,7 @@ Montreal, Quebec H2T 1S6&lt;/p&gt;</string>
         <data format="XPM.GZ" length="58862">789ced5d596fe3b8b27e9f5f114cbd0d0eea6475625cdc878eb3b4b34ca72799e9745f9c07c74b76c776363b07e7bfdf629194488ad49249e4f40151109292488a923e7dac85a2fff9dbc2e9d1e1c26ffffce5fea1f370d95de85e74260bbff51e6f6f67fff7affffdf72fbfae2c2d2f34971696165717967ffdc72fbfe21f0bdd05682c37d61a52ffcc7a87f40eebbb4a6f2a7d47e93da57f17fafa4aa3b7be2274e8487d7d49eab8a4f43575fc96f533d2cf58df547a53e953a5f794fe22f48d95f5de866caf2df58d25a9c34ce96beaf8b9d4cf96cf56f9f890f5333a2edb1b2bbd29757c547a4f1d1f495dd7c78b44efb13e507a43e9db426fae6ef49af27c7da93797943e50fa9ad4f145ea49fd65a577947ea8f5ee1ad7df557a5f1e872dadcbe3f8c47a97daefb2fea0f4a6d2ef95de53faa5d4757de849bdbbacf496d03babcd5e47f6ff52ea9d25a583d2d7a48e7da927f59f125d5ecf27a537947ec47a97eacbfe4c94de51fab1d2fb528767a927f5af94de913a74b5de93e7df577a5f955f14fad96aa7af9ee758eac9f36d28bda1f0b22775dd1e9e28bdaff403a9f79695bece7a2f799e23a5ebe7f9ac74f5fc7045eaba3e7c4af43e1f5f557a43eac0f8eaae25cffb4eeafa7ee354e90da5f7a4aeebe3b5d23baa3d7e3fba3d7d3fe14ee9ea7ee250e9eafec195d4757dfc5debfd06eb6b4aefabf62fb42e8fc367a9f79795ceef5b6f2db99f33a927f7734fe90da57f937a52ff20d1657fba4a6fa8fefc99e8f238bf2fd43b7d3f51e9fa7a6e95aefa8f9b52d7f5e14ce91dd5de86d0fb0d7d7df855eaba7fd854baea0fec285dd587b6d607f2f8b5d2fbaafd2f5a57c7f97dee27fdc153a5ebf6264ad7f5ffd2baac8f37521f2c2bfd4ce90da5ff10fa20391fee4b3d29df52ba2edf49f4019fff46e91da533df0c06fa3882d2d5f1af0f4a1f683d4a94fa24622e4add123117a56e89988b52b744cc45a95b22e6a2d42d117351ea9688b928754bc45c94ba25622e4add123117a56e89988b52b744cc45a95b22e6a2d42d7f177308d821399bf77544f979e4b598c32ef6b08f033cc70bb55de2155ee3cdbcafe8e30bdee210ef7084639ce03d3ee0233ed1df09e9cf38c519decebb87ef2bd53147ac768d2f8cb601612dfbf7136ecefbaa3ea2600bb70855dbb883bbf8b960dbc5366171847bb83fef7ebfbd54c51c1e58dc16da0e3f0eeef81df91dbfbc4bdbfb848b23622d282cf99570f4c7abb6e379dfc1b7962a98c31b1a3ffddce6fb7b52aac53f091107344a5ff2d87c42e8f8eb2daf0fbf25fd7973d4e1293392e0a5eff8a3a0ec6221b785b6a5b7eef7bca53ce6e8e915f39bbd2de7f916c43f57c17a2b7ebb903c966f6447ae166c6b29be08cdbaddde5bdf3b6c187c342a28bbe4e1b0255c278edcc0267e05c42d00e8f8b80ef0ad7b3e5f298b39465c96cb06849b2b42c8359ce1267433c797b1e36d0d88db2e0ab8f2c41db108a56539f602bfa9f324fbe1cd31077d838f724740ea4786bf60e02b07e7597b0fcedfbae7f3957298f372dc00d7ac327f911597e5ac818fb108a7699915dc14c8c40e9cc105f48cba874ead9ea7fdd0c67da3676df8d56f7defc8df4cb928b7751a855deeea602b507694e1bac5b7eef97ca50ce6f08b974baecd32c47321cec93c0db2e0521f37c38364e3ad32838ae3dfac73749df69709bb3d204e931bc915fd774dffabbec14d5e3ffeae900f9a72513ee6006e1d9edb0a9786a1c373776fddf3f94a29cc2dfbb8c4ba4b6730cae19c15abb52fc9fee073a267744163ab331a1242cd7657a13016581fcf6151d99151760727b9656fd9fa53e561f8d6fd9eb714638ec63eafdd649559ceb7afe0dadb5ec5f8b1652f96b2ce98e7743fde97e7c685a587e42734b3f13698900771ef29dfa211f9166790d766618c46956bc2234ee9fca76f7d0f5e234598a3912ec45f3725caa80d9e8c7bfca4f62f57ed2b3c57e5ac6a3c87fb70477e64533c49dcc7198ef101a6f81d66788477d9676ff1dc1fd2d2a7e7fa0c973084195c12b70523bad4b3676a7da6f90c3a30a61acd40e91f7847e567844260940e71421ecc928e1e877009f7e40bbfa49c293816c80dae7ae7df568a30079fcac4df380b96ef4b265137b6d5c4fe4f55fb6ad87307256b54b0e70861a94fd9f1c6ca1c5bdee439e6ba4e12af4bda8147efb9a6b0e9cf3f402bcb4584c5cf057ddbf58dd6701eb80eb204ca32e47b4821cf0d82fc3548fb4dcfd66bf319db956a2fe144c8b1a2037d49ec39b82859a302cf116b14e604888b8c676bf35cb0ceb6739e0d62a6dc3a84310311706ff154f83cb6853d8171ee39a64551ecf7937ccc4149eee2d859418e425bfc894ffa37ecb9b29833edb97c8cc343b9bc00f99f498cc3e539ff465c6322085d2ef46e064e7156a65fcca98955483ed8b0b04e7b5e5c5780b96e0e772dbb1126f20ef2b84e656089add27c43a5ab4eed3928392e97e7395f3e1436c9f619e13d8f50e9fe84e9caf11c6d897f41c8dec91cff4ee36cb64edab359e9dc6ce2e11253da1cb8497bc66401dad7f72131c7fe68c817ddf194ff421e4288eb5655995563ff7295b900863d57d287b0ecb9c3dc92599e3347d16d63ffae1e95b23c0703c2e83159edf6fe84b518a5d639a4f5c6734edaceb199aa93e1397811ef029dcbe52e957f33f2c09f79144d7c06f2904d3bf27b282efdbe92873908fba397e18c395c046cc0849bac5cc33969d7e5f2ef567ceeba548dd7f39ce32fc038cb412ecfe9d82db6c0e226d00c3fb4b8a7a351a5fbca2832b849ed77788ed84af11379d98e1da86a3c18fb3fdb769b7d9daead598fe4610ebf0438ab2036a66c3bb75e12d123241c7a8ef7b1879b79715e279fbb92df0bae61c6e772633336cfd93618f779cb3caef6d93c67645c9969b2e56d2ef5cc0ae051362dc3fce4f09cc54d60e571a1aff6764c4ecc9c636a5c67e6681d928bb96e96af60b7242765e78c185164c2c20a86e6e1898cd6375f9b467c4ee57269cf09b1a42d9be96c1693e7f27d0887e71a9eb34f8de3724434796ed78ec5391cc8c74c5b0ebc36059c5b9cc628b679ce9e1940bd36cb735c86fc629b17ad5929ecc398c7e71025ce1d5bcf325c5421a606570e9739f32838bf15f6750fb3a36726df1afeab50f76a7bce1335b5388547c5bc3c04581c28222c840593af02790b93a3a41de8f09c937b25de73cb8f1c3b8fd80cef69ef049f4c8e53dbccdf8ff7945c9edb7478a56214173edbf5bde7001ac1d788ad2e3dbce7ccb374f2ad79db4dd27aba2f17738e9de3cb45ad1bfcf0cc7bcc7925ce1be5d85a6453c1a3c55781f94966ec0ea6bcc7b6e79cecabe5f34a9e9b94f673c5f6fc1628aa26b93cd7b6b8a354ae8afcd6d574ae0878edb990e00d95bfb238cb9a7f97999f774863ab98a3796d6e84f4c4267c9d3d07de397f8c22cd5b6ced59f69c930720567379cea8af6d35cf3dc8f4c3e1b90da757e30ccfdd67b82c67f3e749de577279cef65bd3b9b7c44df464fd3697f4493fe9a33c37d3f15bf385ce7a62d88f8615e6d873d725be427815cff96d2df23a537e38e23da6cde662ceb60f7f64e6c505ec28b8346d446ec9e63907ab561f183fe4d796e5b85d7a6be610a32b88cfa5398313b56713b59de68d3d305e64fcaec7333121c9af96f0339356560dae4bfc34d39e2b9789b0ecb9f27eab27f2e8f014fb9c16cfb9b195877c9e0bcd37b7da6cf31e8be7dc6cbe555ef2dc83cd6564cd1d1147cf5c216fe263c68493f9bc623612f9142f066f9c786b98b9089e73492894ba971773ceece42fac7c6bc95cadc573b963bbc34b9ef920786c1c67abaa22cfd97c159887697d3721f754e4393cb2ec46af9d305f29c0dcb5b68792586f9abff4320d5c383ee441e29b56fad69ff854b7b39ab49dda732539d3b2e7cef3de6b87973c2c0426dfb0556571cc716e7b82e79a165f79470998581cb5ce67a9ca730dab8dc2797df54b01e63a094f64e36dde6f02c907f5fb92157d5e6c2575137e34f2adaf9957720139b90bc76fcde484a83fd9785b259e7338cc6bd1d9795299d7a8cc73b7561b7e0b08e6397bb370fedc5e300ee6650d62466f79a8b8a289f18d57ea8526f65cd9d62c7bee22ef8b5b273eb7eb8eae3831b84667a52ad9733cea99e7c85eb39527d57da8ca734e1ee2366b27e0a2884e136fcf213627a4107367c118981f7327deb2b93ea3b79d6b6d131afbd2f85cc9595036cfe5f1a39b6fd579247517d0e21a9d4bafca734de71c1607e186fd0dace6daaa3ca7a2d7693b632b5b36219426b6dec7cbf1ababfa1488f5fba3584f5e4eec5a2d7e29c20c8d6487b23e18350d7baee437f98e3d27da7bc26bfe4aec0c76f026b5313df34a1e93f9235bc416296725b9d86af61cd77062678487a9980bcf2b99d8f3eabeeb79ead5790ef7ed6f64a9f777c4a12d7a73d6ad3cc72eeebd359eca4809cc75d03f4fe44f4fd91b1f278215eb861ecab973413f965a39d4fc68bda3697cae24e65c9ef36df024d8cfbf9e08bc40dfcab38a2dc9c556e539f12e79e7cae5e607aaf31cc7654a9c43e639ea9752df1afee9e52e8f756ac5d5923cab3d57c498537268e62cd4d18ecafecbfa16b68cf85ce9b547f025688f5a9c5d7a9ef0d8988d6bd671fc43e215b3debeb17fa9c479ccb97b95798ef717ae8f42e89fd3ecf492dff11f7839c2f10369b4cae44c61e4ceedc41bd8b2ca5c72066b8dc6bc7dec9bf1347b44b66276a5a39999b928be6d10e2b90cefb5cc33e3c4389659338e9ea93e66dd01f12d56ee7976ecd89df33d843b37fbd8386665897196c7a9e4417cd0ef218c2b58f172841127232bed30cb21bed9c41cc53bcce59e174260c6e6c3dfd5f10a1e49609d15fbef75a9ef2176325fd3fc20ab4b1e6b7bce7cac8e7dcfe6f3f1ab9527357dd5a32c16f029e1a6ec9a08a9afbbebe662bf8a6fd9be67cf43e79e8b1da7a5c2ba4c2b7e8e202611ab21f9befbbac89b794e185dc1cb6c7be4b3acf96b243c7a55e50af10b5c65e6d8a5f24d62db89cf6d8ad506f116ce0939c46770e7fff29438eb0e4710f2e167b01d5ef781fcd4291e93bdb8091db21bc70070e79bcfc2e74142cfc8df07f2b7ee704cfdf0f7615f7c718b47d4fe0c0506a7f3febab5e2fa73df8cfc6be15ff2154a45d1e89e7dc12e1c10a20af334342e1f54cba1951587e7d6dfe31c51a4545b67932cfcb273d856e77d65d5c4b1e7fecb57f49daf545f4f18ce3cebcc59f3e4b057cc581f4d2c9efb3ecfafdcfffbe575eba613dfadaa58b1c96dcb7812b2c53eba58f3e7e6f265cacf254994fb156b6cffbddf87c01659619bbcc666096bec230b790c29cfcdbd37957b7f1b9a1bf54ee79b605bcc3026ff7b884fc15253ff4c82f83b385ae025b1e77e8a95cac9537dd4cf148f0803019ff75dcedda7bbb52efa407f3d7122eed30f98fa675245cc6949e69ded64e35c1f51a08f6d9d8703a0ff6bf47b08ed7c6e62b2761073b774ccfbf646cca5c22b03ce7e8e5f01c12631db4b92d53f224ea9317b8adb74be06af36360dadb543e3ee4be4b9aa8220a2baf82c249d394c96df3eaf8ad8247c9a6b81006ee008c5bccb75f5053e582b324d6cfe34d6779af1d7a723dc4a66ac00b5b108e7380cc589517c952884bf06123c074311b9a636c4b70fd64a50740d47b84eef53c1db04f738c6276a690cad74bd46c2ce3936685ba7f6f5fcaa323c774ac7bcbf60103117161abd8e047a080153fdcee20f7a26e24edf132a1e04d7c84c83989706537af6e2c91fd3336b094b3bcd55c13d3dc9699a3d23dc3e0a1c93d5d3a2273862643cc240cdeedc127692380fb5ef99274f3d7a54fd78e49537c56a9a6dfebda60798d179fa12a9544eac43774c489ca2f82e312707c1f938d9c63db5a1381487b84d75c53b764af7635baf6020ed39be2f219e8310f746cc85c5e405badb6da103f38bcea0121bb465665d7872aebf4b8c933c0f40ae97cc04854769f513e2da3ac34a3ca34ac09d6431f20a037379457d3ece7599e7668a5d9b023bb28764a3b6d3160889399683b8428d4a14efceb6ea53bab2a5e895fc46a304cf718b5e8c47cc95131ecbf6388ed74e5732a7777906721d89470fe6c8e6d2775da09339418f4e13815562b7a9594bd86522064123aae0b87e78ee07f1a4e04048eb19ebe22d4aeb9d38746622826c84b66f25163ec69c9a9ffbc73d7d8d65ec3931c3c0bf3f62ae8c306371448a79cef8f681ac37f915ea3a3353c35979eb51e7f84539168dc16dc144b2969e1387fb0223e249499ecbff5d0818a4f612fbad49691a0fd9cee335eddae96a13c2560bc51e39da92fb8d188fad8a87cbf15c287a1331972fbc7afabde4288101c173e69a21642bb5d53aeb6c0d11f7b4d2df39c4b1b4e8041f12beee68ec92df729dca919af889ed3042e494acf47b14489ae9b857becd0f2de2448d6830ed3ee6e24bf9a6703bf41fa1f888da7e0afd2e19db0ea17b704a0c3911f6a8b01f794f097b2e2c117321c1167b09fcf536bde3438939e639e38b6ec154fa7fb27deea43f49a5e52a3a5bd25aa367ced8a3b148f2c4a2fcc2465873f42cd14597e4b982fedda74cc83c675a9fcc73b0adbcd912d11fb6e63c5fe4d01508bbe007db78e2ad929e45299e0b49c45c48c4334d474acef69c2b9e33ec7ab6d2adf71c26621c250e427e4ec2b34cd0c156d8808f4b5d708767652469cf15f58fb84dfb32c29e4b7a21ceca3c37947fcb5e6d766c657b33b100c5fb26cb94b3e7421231e717810ecbba9f04786e94c58688a7249ee391b2e3b46fda521ea9f47685e5e5fb6587923c67d973e6ac7969cf9d9a9e72416b23ee97b326077be3497e83af3df2dcbb094cf819682ff394b5a987e746ca9e33c625b6a75ea4b720d0435c90c6e59e9903d3b89df00492f9bf34864ba40ec379cca4ec84da51dfae727c2ec3733c86bfa4ab7d91b5300dfa98fb6caf6d2719dc0deaa988eebda416204764c6b2d7ca9e1be6d97310f855b388b990f00828be09ddc031fb93722685e00e234a4b969a8c9534e8dd5f17bf8e04d2a6532312790f633342c1f113834f84374825d6a9ddafb00d331561c6222f52fbd26a55b2a30ccfc9d8728bfde545dc00b16eec76deec059cb1cd3aa41a138ef08937e996e37e77e25de0b743c70f5b9263a5671c686f3fe621aa0bee894c02bdef7b34aaece9cc8fbd8616dd5995d1a2e313fe052f61bf19712ef1bcac1a5fed118cd8846a127300e156b10c79230d7745cdac48bb51b02e21d62a0d8f464e6e28fa457d1a17fdde35e1f252bc5d847cd01904eafdb6f88e82aeee2b217028475a7a0ff95706443fc3bf688c81bc47c4dccf2c345abef91783ef3fc721622e4add123117a56e89988b52b744cc45a95b22e6a2d42d117351ea9688b928754bc45c94ba25622e4add123117a56e89988b52b744cc45a95b22e6a2d42d117351ea9688b928754bc45c94ba25622e4add123117a56e89988b52b744cc45a95b7efdcffffcf2ff6d14cd7e</data>
     </image>
     <image name="image1">
-        <data format="PNG" length="6033">89504e470d0a1a0a0000000d49484452000000ad0000003008060000006357fade0000175849444154789ced5d6d6c1bc7997ed6708d95a018bb86132c85d4208dd8c8d24910321f88a8ab11325723a6ec0026e31ffa68028b768a546e0f81ec1e1a5b2d12592d5a8b31ae95ce6863cac89d2501b14503b12d030a4c164e4505f6891b38b13688032d210422e106e44211a4851a60eec76a975fcb4fc917f7a2f9f348dc9d997766df79e69d77de9da52e00900130ab842d4b8448090034202b004303560618d94051ab59cf1a7e7f913ab382027c84902b77e210120a82a2042101002900ac213acd16d84d80e7511ee2965aea7ee88035fce743aa1aa6e5ef1232f089848010850c165052005d19320c0b8fc58213cf5b30ba915a53e0352c1b2b625af71c21ad174308c780628c5a293acd160ceee311d958bb6642ac61495c57ce8dde2542e2d7a749fda9118435138066570dc33109f5a727205ebf4dbeeb0e59c3fb1f4b322d7f3749da2e4a101212568b598ba18d03c60fb830b461cd645843632ccab48ebb84340e0baac2ae22b316434106ea4f8dc03d47c8fdd0416b78ff6141a6e5ef2649e35901b25221636e5e04d69bf492dc0f029d4ff24829324419e8fa305256390c9dc2d4ebde152dd25a920b64e0fc10a2ff13416ee21fe5e178dc01cb631644eaebff296ce996e40209fd2d04eb235684ac5b57652672cf2d90fe77fb217e2e42bc2381df66816fbf0fe2aec68acbbf17f219a1a1f7c0719710eb7008b25ca63700299cf9b10b2d8fb0a879204f3ff4149180c6f3a1b2bd0c0caa535cef1c21bda7fb31703e00060c64c8ba0c46ffbbf6ba70e257c711b8cf4d12e1ad6e12ba14820c1957fe6b64551443fc7927199d0865f587cd6987eba4bfe2817c2fe433c23ca6752f11527f2a5411c35efb891b2e4b0d8a25dfd528066eca659597cbb8a95f7a11a0ca57a8c8a1763221087add1c678277af070db60688770428090583e1201289b87ecfb9bf9c81647feabe66dc96e402095e0d82df6683f0ec8e152b84edc66dd2f6b3b6ace7d460b321d01fa86a00afb67c85308f6907df9f2461512adfeffab009a4dd8162c93e1481f09552953f17340b270774bcfa42590ae599499246cf0b3aa37a767b60e9ee32ec40d7174912f92c02ac079497f6142cdff54592b06676454cdc925c20439b0a6fa8b8a6a649b5cce49e5d2009395111b3796692a4e9152fe47919407a06ea3cd001741c2cd85fa1ed9b2a1ed895cae79e5d20a08142fd95c5b4f4ad2469bb1842254cd8fe0c83c06ebb81aaaaa95a86cdc573fb2ca09fd85ab2c32cd149d2f6da41bd7ea7d355f15467bb719bf49cea817847346c93d3e9c291431d886edf4af99f7712795e0653c7a0ef0f7d790cc35e1f27c77f7d1cf2bc0c7e1b0ff7f010a5c919181e857033a42b8e96f86d3c1a9eb6a1e34047d68383ff0cf10ff70300fadee9436a672395f8f319d2ff6ebf9e97e34cfa0c72f28d6e245af7183e784d6ea374e6b77d10773552fcd83839fec79eac19494b4c1d038fd38bd6431e7d4d508e7c4c1da3b75793cfb74448ffd900462e05f3eae238137c7bdbe169766374d98fbf5e6b888f10c2fe61a4622664698b61c301d5861df8745961ab60d84c3c1c06524b84948a61e0cd7c960c42380a718f9bb4eef6807d9c877db3a9e488d7a64ca68e41ef9b27c09b79c8dfcae83ddb0f211c45381c8270338ac81c21032f792143863c2fe3c8db47d19153ded01ffaf58794fa46060340f29f245dcb038b01038e33c16ee191525248dc9121de1121de1131303c843363e3445b14750df7eb8c1897e25000489f650f2c25b1a8ff3df1a5005b81761efb45278efeb60bb936be67b7078ee71c880338f8e6615dbe13bf38067a330d9666d17bb61fe1700803970298b819817bb9dc72e4c37cfacf892f0574ce248963974bef239ee3c13fc3c3b2d984d1bf8510bf1347cfbb3de81feec79565a65faf35c477290a59c96038a53cf4df91d0eb3456dc404c2abb9c5228cb299cf8240e530145d37068532d75666c9c1c7cf33000a80f2421c37f363ddaf1b48d30750cf86d16b89e77a165b7278bd1c683d7207d2d41b23f45897f6d447cf9771780f0d3360200f2bc0ce92b09ee663734264924e270ccce128d793c3349e2f7bca0577be217c7907aed6764e0ed2e00eaa0e838e403ddda46c918d5dbc10d5e26474fa9f71c7cf330ceddb84d846777507a7b00c88a0c0e404a4965f5b90c95d1db9b5ba0bcb4875206cf91e8271214590200d89f76a0e3800f810d147532a31e00f0ecf5c0f29b2e6aa4bb2bbf1f2eabf209007a930be4a9b0ba781313227a974d9b4ae56b7ab109be0e9faeb04ea70bf6937e8ab9bc6c52415ddc052f0555523879040e2cfb69bd4b8404a50c46ac046560eaef304c271eb3acaa1fd71f8ec0474afb6fc55d8dd4e4d838da9b5bd0f07883aa2060b2859b072604013da7fc786a5723e8f72ee8e506b76ca232176596e824e1829749ff1e37d1b233600005e838e00353c7e8e5873e8ca4a7e08c81c2733cc45d8d94ff2f437afeb4c266cb9f68dd43b5eff7e97903e70772a50743339001b0349bd5be633f3f06f7f010a5d9e83da7fc088783100509138280fe77fb31787e100c002b6f4d970706bebdad5972e4f6833d3a4db8e065d2f4cacb59fd99525255c9978aa5a02d981930487c1587edc66d62894e12d7d434b15cbf4de2b1b87e7d4210d0925c20eb6500839fa754f756954cd8f6e114a22d56e426d383c0c91f5970f443ac0ae3ca6031f8a954966d3ab4a996b2a839e106e0989d258aac40fa3a8eb81847f0af41c877d2d362cf9f7a303e9324c12d9b287e6c9c0c7e18847033aab240868dac2519324003810d14e5f19f2403c3aa32f69fed476489102926c1ff5a5af1da5f6b817279088984a8e76fdddf8a406b9bb16dde60c3c07935af70338adc55432e93690ca7bcfa7296e9e3d9eb41fc2b49cf47332c3cbb3d1802003abf3d59a6565e3f78f3fa01501553c8f9ad1cf9e46fd3fd2f43867c4746ae3723f33a53c700eb976dda9e890abc0506287c2902c8575a0038d26001c0e0e847c28a6c5a0d0302835614575823ccdc4050a04e3df4079749cfdb7ebd4387ae06b1f8fb3eddb460ea189c7cb31baee75ca8d95c83c1f383e83f15d0efd718a6a5b9039ad2621eb03ad22ac68001cdd5647827d23664f4b36841794d4a46feba1a9dc9b4fcb94c96ae2f6751f99b2eca92f3fbd0493f185d7e26af3d3254ffad7fd9a6a5b91a9c79f3046c8fd9f47ee839e5d7e58182aae4cbaddfb3d703dffed6a26b8ed18db558e7985b2042425e31138e88f92b4c2d1d696071612f9f56c015d4138e4968592a6e22786692c4129d24be12f7591fb1662d4216e75318381f503bb78e41642c8484670f355a5f4b05365014ddda46d15cda1fcdd2acda91f5b59467af0700b2cad3fef7ed6dd7ebe56d69fb3f303c5470a069a6850c19ee67dc7aa99936a3f6e0b3eb2b7f20abf2a7e5d5da63bb713bbde1500784825720ee6ad4fba1757f6b56fb3486ae543efb63f6bc4560218575ccceeac154eb4231052bb639372fc2cb9b502c797913165e77a1f347f615d717fc3c5554611b3d2fe0f06b476075d82175751365f01c714d4d13ef1c219e992461af8f93d4effb48d32be9e98ee778b89e71a7059e07a4cfd2a6484b7281848e7612cd2593c9303280633fefcc6aaf66c331750c5a9bbdfa7dc7df38ae5f0f874390baba89eb8ba4fe406c376e93a1e61612bf13d7f3771c6a2fdb66ac6406829223ef727be20929cb66cd9c115a920bc4fb6a6bd5366d66fd810d14d579a043bf7ef89787c18f8deb44e39d23847eef02f13fef24de975aa1f5d3fa506c397aab5a06ac5bc4c2a12694936a1e007a9d16b43f6ac18e4b2120515dbd822c832ff020688606bf8dd77dacc1ab41e02a00f80bcac56fe3d1fbd60958cc163daf0c194daf79c1ed7113657e11fe5d8d5979726dc0a14db554fb5b7d64e052207d1d406b732b4636a6dd7421eb56eadc8ddbe4c8db4781848ce0d5a02ae3b2570219361dc7991078a70fa3f5cb71c6193e4e239b91e34c902194adb896c7d2ac2f4306b3595534df8b4de879c70fccab5e92b6d70e16ec07206dd366fa888de463ea987c393a0e52edda9a605ef596687dd1e54a9b59fc361eac599d0928cffb932458c90e5806bab731b8b0c78e9a1f14d487a2e948780afe9b892a76c81874bc5a7ccbd576e336097d348a442c81dcbd7519321a1e6f80c96c82bbc195151ce25b2264f0fc20848f05a49414589ac5220db81b9c30994d103f95202b32cc0f7268fad7a62c85d4621ec42fa36069169c9983a5f3684139e90f2e13518ce9f76bf571660eae1fb9f3362ae80f2e93f087612cd2407f4fafba089c499223dd47c0d22cdcfb3d48ed6cac782365429880f9410e09cf9eac7ee83f1b80f499a8cb456f66d0f0b80d56b315914fa37a3f68f932e5ebfd55378636d566c9e7fcb1b3e0cea316dc94595f4a49817fc40e578313d2ce1d7a3e0a6f5d2015ef50d5997061b7a5a449504e8a4829345e1581afe365d7cfd02c7afffd85fb3ab8650def1daeabd4a66c79c68e85438e555158007058582cfcc401e7e37cd972c84a619b9681ea77a66f25c9c4d834197c7f924c8c4d12fa56927897c8da9b11ff0f707dd9b66499d15cd5a49a0780d03e2b4e706c3adeb6d40e599186594e471093d3cc1d060b20043f6741c70a3bccbd44882403b2928283610dc3265b9608111229f0cb030c5b2a0f322956ffa8c156b6692649120905e2b209c53100b37de571c2891bd3242a03525c8297e7c19b69880fa5db437f314b0627e259395d3c0ff7a34c55effcf1779324185330288afa1596e5d0f7bc452f6f7d59b664dd22667fe285a948acec6aa4e30d269868170e5e0a95b46d8b353c26c78dfdc989f236268a61d37014e1587a0d303b4748a6e2f2330ba4f67739311c6f5d20dd4e3bb0b3faf8d2962542ea4f8d403e1582edcf93e4d84fd336bd7b8e90dad39971ca2240b3189f21045baa3f6f227123490e87d3fef5702c028661d19b715fe4f354467f48fa7d5d61169d6393a4615779e19e3e4288f77c04c1b399fefce5726322ba9fb3eaf7af2b87616fef6bbae70aab259f8dc599bdae15316db5f9cac1708eb725f0c954d675ffc78261bd5de12806df9b24ee2a4d94814f24353644494148c859d7250586ed0d25e22b6a6f0a8a610c48e6ab507d2f5ae1345b0cebf74fc8e8f9f33552caafee9e23c4f2c72b088af9f54149a1db69c7c44369622869d35edbef867575cc573d4dfd1d705d9cc288b868785d57dc227215ebf06af39583b9e5690ef9f483a60bd61f8e49681c8e82bf5bb9e222a7dcaceb4abe5c2a53ad6c80a240b9929cbe6f740345b5befa14756e9f0b0c9ddf6eed9d3fee8ba4a1e2d2b792c47a7a0431a526af1e33b388dbaf7b61ca99a1d69be945c4146366b23dc2df131bd6fa2010fe5444f8d304b07911271b1c687d8486e981745d3e1b8b60c28ed19bd17cb938cb77c6b4b9e5a59414f8cceb8b72d1fa859884c6b332aecc244925b6ae58a41d3c9d2f17941458bafa76ca00d802e5323420e6deffc4266a6a8e90a6e110841cffbb0c167b864330ffc738f1d918806621ca718c880a62b9f1dbcbf93a6d0c7a7fec327c6365bddd64424c36f0d3322cc6f7e6c7138c88290c7c2e63f49b14a0bd56ce7120af18c71e144c0f9b80afe2c03c8ba39742384ab3004763769f4337452efc8b05b5525c758765c86761e9f298b6425bb82cc6cb298fa5f9ec075dc30028eef79695141a87059cbb9524cc13e529aebab3241ab64367c49c7a720754a5281690bf10838f6ea4a86300c4ebb3a46b42cccb1793e3e89a50749bdbf0f9302cc6f7b9206ea1a84001b9d6d9381a468ce0fe2193f592e291f014a8772278f97c08a39f4a404c029619ba7b1b5b81b62ea76f95fc7a630aea4f8f2024a96643cd0380db942f9fcbfcddd9b4464c9b793d55826933b1eda280d10f26cb32155245da81028c087a65ed2d182b5282c1f99df5d478b30d4ca1fc05d0c65930fbbaaab0c5ca5fe7325b6064839d7c4edd425bfc0740fde71575e76a3e6e68e3f00c63a8974513cd18d60bb078e1bf471110520080f647f3e5b371a6fbd6a6454d76bb6c660b2e373780fcda8b33bf79819a7dc38b6e27078651af0f883286de1f27a5e284d962edf83fb669e532ca8d6fd9444d1d70e9ed2cb576327326440fd861e4cecbc575e2965aca48f3ad2655616bdfbd027c5d53748478f92aec5ea538231dbc14827d680a2f7f2464fdce2085788991f85d326dae4d3bde6c87b2bd96d26cb3d18d14c5efdc41cdbeee82c7c6034a0a415181fd2fa1a20794489adfd9a81ddf814d5bde00476571da3f28afdc750c000fcfe569fe91b084da3f5d01e6f3577559f87095ae85424c9b81c297e272ebd3bffb6cf6d28af51d322d9bc1b44e330a32c7e8068a72bfb483ea76aa516fda2a3b7e7d9ab8e7d2de051f2124712349fc825cb01d8518317740558a29a5403f96c1b40d7709b19e1e29c9b01ac6949a920357c3753280eee7ad799aefff28aa2a6ca911b2be8052964a2598b6107a1e654a2b5691fc8eb985156de55666d31a4435e5a069e756ea72b30bccb269d4158ea2f654082fbf75811c7ceb1aa1de1ec1e1ab42d119e35ed9b4320a3cff224ceb5e3eac70c7e911ddaf5ceef3151280f5f408e85bc6ee310dd73100261ea2283367422531081a76fef0de316d2e3acd0ce265b8898a95138a29f79469b36ddaf2ca4d6cdf444dbdee35f473963363c0402ed02c42627c454c3b224c19969be9e8cf447e8610ebd908bac251c37c368e41df6e07ba9d1cba9d769899c5bcfb64b068bb18c2e8fb9359334e26aed3fe38d1604235cc27ca29439d2c99aa88e3eddb5dda349081a2e5b45d0c2132364d4c334952cd217795d9b4e5973bba91a252bff4c2c61497df8869c58728ca4c2fe6dd178ec9551f9f3afac12489c9f94cdbcee7cf743e42c8c4d824d971368458229e27878db360bcd986633f7d8aa29fada7f89d3b28d3cead54efbfeda1fa9c16432f435094507f3a84c48de93cf9f5730f9827b652cef7ae91b0e6182ee267ccc4d16ff4b15e769a925076f91a3a794bc1119ea75845fcb4a0590c4c4431202cfffffb6ba458bd1ede82f6277930dbd5608d8afcb4902b529400a5fa39473f982603228af6476efec88126584f8f20f764f6ae09c0f9de24e96cb0a0c9cc16fdf6857789902bb1140e5f8d2026ca79fd686380c05e3b32fda70d77d52dd8ac1dad8cfabb9d7698766ea5e205dacd3dbb959a9d23a4f16214422cdbbf2d2bea7917cef726c99566bb7efcebfacc0206f7b9507f6a246fa414c59884c57f541608eeaff03c04866631f8228f48990a50cd8c510883a284a028433b89c78869331df80c9d597ff19dbb42e87e692be5ba354dda2ee6d767c4b41a534fcd11e2387b256f87331c03c23175e7c9f9de35c2b29ccae8348bb892424852202b325efe5d08face54ce0e95930342afa477a8dc4b84747d2ce1e0e911c3fb19a470aed985c4f64d2589667423457500888c4d938189fc1dd0704c5da49efb224912db3751796779e9472355c0849dcf70e87596bf2346bd7305f8b6a6ecf2cfedb6812e73e78801303136a9aeb62b60f262d8ddc0815f8e9ccf3debecf6ebdeac19809f59208d6747d57eb159d0b0abf4514e85909f21a42d9ccf40360638f6d3c2679b29b79224204859d168d562bb8d87ef496b9e9b31f2c16d322018ef6c39399500ab39a6959f59204dc3a379338686979b5dc6e7d366697ceec833429ac5f87e1b1c16b6a4c2567ab657bb8d81fba5ca4f33cc8c7b6596a79a6ad0c82469b84b88aca460e358c313cb7d8490f8378babf60d092d3e5793ab9cc5a8962ff8b90449a1115a8e4f95e43862724d5e3fdb3880a119b0350a6c660b6c0cd0b4cd54f0b44ae5d634090829080935facc6906589643fba32c9415c6f1fa0821fd37258c88290032c231c0cc2cc2c29830b88f373e9fd6bb44887d387f8417c5874d18773ae0287cb4177a2752159d7f50c969896bf8fdc1822781bb9708693c1badf85b0beec7199c7cce9e15ce381507dac211085f2a6597e3e1698cec7754742eed1a7e3fb0e477c4c4b169e29f88ae8a6d582eb6f3d599046bf8fdc0b2be2346df4a92c35743d9a72ade036468167dbbcb3b87760dbfbf58d677c494273651b36f78e134a3a21dac4ad0c9ab61696b0abb86a5b0e26fe39a6692e478584abf2bb54286759a81beddaeb2370ed6700dabfa36ae0cf56534ffc71246a4b8ba755781cd6aa617e1b359d1f9a4fa5ddcfba123d6f09f0757f415720d357fa0acd008c524a416e9ac3bb41d181b67829da3d7be81bb862bc2ff050be4dfad23e1fbe00000000049454e44ae426082</data>
+        <data format="PNG" length="5777">89504e470d0a1a0a0000000d49484452000000ad0000003008060000006357fade0000165849444154789ced5d7f6c53d7bdff1cc4d00dcaaaeb6a45d7515be52240dcb0a2da2dd5ecbc216cb46a18a85e625689846e22e6873aa23d75097dda0aad28a04a90803a25456b7150579c4805870948786a875df15eeca9bcf84ef4812b40b911ab622b9be22b86122bafd2f7fde1f8c63faeed6b27b4ec35e79f0fe1def33ddf73cef77ccef77ccfb9c7ec2a000580384fe821a2d85f01f080a202220f983920b084b1f92c6701bfbbc84ecf4180878806eec430aa72f0ca32e4385f3487a3d60aab39819667ad082f63ec51688005fce7435609d30ae344fd5f26d0190e40e544405500be3ce405118d66115d3f35a177c982012fa0712c8b699ba68936f705101c2dcea8e5a2a3d60a5f8380e8634b175c88052c898b8cbce89c264a7e3e414bdff123a8ce182c2fce1b064723a8391345e8da4dfab61b64011f7d2cc9b4c2f804edb8a0428e47be11952c828ac81e27bc6cc16558407d2ccab4b671a2fa0b4aca60e791598ba19ce4613ae647d334d1a3d0400bf8e86141a615c627a8fe8c023559a6c81fc480c575dadfae271238fc232b143586789247eba5414372784ec1d86bee392dd23c9344dd1f7911f9ef107293b45a826b9d0ba61526446b6afe297c69cf24d1c09f0660ffa11dfdcb1f9f9799c8767f92ba3fe846f4cb28a27714482b45b4bdd286f0fa3565cb7f18fae9a16ef4c0364e5473210235ae188b0624159cdfea86fb4900dfcfb30f2d8514a0fe52c47094814f5666b8cefb44de333e747ed409112214289a0e7a7f5bb65a70e4cd038fbc4b12387498e44b32142818faf8eabc18466cff61ea0df667b547ad4384fb7867d903f961e86788696dd3443527236531ecf06e37ac66144d9e2b11f45c47d92af29c82c4ebeeb20c2ab4bb85c2b2ac952d0866b8b736c2657321f445005c9c4377b007f1784c7be7ecfba7a15a9f7ba419d73349e4bbe083fd1927026b6be66c10ce1b63b4b96573563fd92c1678dff7563480e75b3fc34cebbb38424139623ceeba420235d5a158b2f68620ff9dab289e0b5e84835771e0171b0d1994679ca8ce65d518b5a5c103d31badba0de8bc4d14ba1b42e2eb04aa5eda5250bef3361156624e4cec9924f22e2d9cbf7164822a6526e718512299288bd93ce344f6979d501fa800a0b5d7e157df80ead956b0bd02abcadfd92c573fe7181178a0507b6531ad709b684b9fbf2c955ad601de4d561d534da54a193617cf3698605ebbbc6483f19161dab1679756bec3e12c7baa73de18a3f677da11bd13d5ad93c3e144fbee7d50562d67073638487da082afe6e1fb9d2f8f61706d880ebc7900ea0315d24a09aebe5e96d6d3db17867cddaf194e3a492b25d89eb7a0fdd5f6ac8ee33bcfd3c1bea30080ae135dc0fa7a16fdfd69eafea05bcb2b08666d0639fd5a17a2cdf5ba1d9fd65b2f9d3f7116e1f56b98edda4d6a3db63f6b464a27be9a87c7e1816bb7535b1318d18fafe6b5faa6f5f31051f7fb5ef82ff5e795250866b46d6d8373bb0de19938fe626de41191e998bf6c261479a76ec581940fdb7307a9122a60d84c6c0d038969a25267183cabb307d06850c1912d2edad7d002ac34a3f149a9e4884f4f997c358fd36f77a14ea843627102074e1dc56850413018807c3d82d07d22f1250f64c8501fa8f0fc76170ee4c80b1df3699d94f8870a1140a4f338f5cc0c2c112238a10a4ec906455590bc03c8776444ef44d1d3d78bf3d76e527a51d4da775463c4a97812710089bbd99d5c15e7b47f0fde0dc059a09e1daf1fc1ae375b91ebe3b7347850f76c1de200b6fd7a074488100433ba5e3f8e647512222fe2c0a9a3080603e8bcd489d0f510ec33728de8677a60820a55d3efc83891dd31cbf836c106f33a332c4f4ae8fd533f927792d8ff413bf83e1ea119a6d798d67771987a6414e9ca0228a8a03dfa86eb0927d0f369a03c7945f070830be6b54b4b4e31b66b3769dbaf77e8ea944e7c350f69a508e706279a1b9ab318cd334e14f92aa2ebe3b63e6fa1b48ca18fafa2f7d37e6432c9d58b031af3a45d95743a7fe22c1455c1feb70f6a3aecdbed81b979475639926f88769d6cd5f20df40c20b0b686756694bd6ff73e487b77315f8eff0ea498ba657b13aa5edac262beb314fa8b8aa41a0100589fb763df1e0fbc8cb1dc721ab736427ceb60c976f04c12d5ad9fad577ad155ae7e9bb76e86678f07e9e70e8713d6e39d59fd1b387498fa2fa5168a368b05f60f7ad82211a91daffe18a031623998e471eb6fb926914a5d2b4cf31ac7edbc32080f958edf86d7af61b7ae45d0b2bd09ae752e002946cb4ca60726846519474f76a26ebd15c2c75735b9de658c6576141f19266970888e6c71699d2242045460df1e0ff86a5e931ff9afe8ec147cea88569e4db021bc7e0deb7c7f50cbaf67b0228068733d6b7ba54dcbdbf151678ef640ad494cbdcf8b59f53bfe7a075c7dbd2ceda31f3dd98960d08bb8ac222ccbe8fea01bbe5e1f4400922469f2448868dbba2f4b8fdc76b04426481a1c22e7cb9bb3da5351958af4c31d68062b4244fcab189c37c6888f0c53e3c80489d7c628194f6acfc3b20ccf24d16205c0c02852e12dcc4cc965e28e4fcd8834e5870faa9e008eaf3361ffa7a8486e2eaa10e1fb4231c4cbdea58c5967fe760190c606884b7290bf8a622a9a44cf675ee0ceacaefb8fb5e3d63891771963b66b37a9fb520fe4eb91d4b495e1236b1d0505e0538bb3c6cee3d4d3d70b0038fade11848848b9a320b0c7a3bddfb8c785aacbef211e0f6bf99b9b9ae16ddea1ab3f2c22f0512aaf7c3d82dc55c36842810420a42ab3fa0088bfbc318ba91ab73622f655ea99000b38de949a59b003163ebf3eb93356763b6ccc6b07206598fd39ff6744bfc4e24476f977665d33bdf6e6ab794c7d3d95f269db8373f339e5bb21006eddc2da6d220011fbaf634e3e6d1afbbf34c185e206ab87c8d8408803d80760eae2657aefed1ead41bb2f78c1bd7b56732dd23eadfd593b60067cbd3ef49eecd7de4f338c677b3bd2466b7a6042ddba59131321624a48664427667dc8881c29ece2809fcd5f9dd4982c9d3f93c9c29033cacb5954be75308fc9bdc753cc9dd25fccab8f8254fc36edd3724215cebfdd85ba15755a3b1c3dd9a9e9031595e997537ee3d646b4bdb2afe89a23fcd8522c92ee4f921c4fcc9909fdd1fc15663ab5db80f33f31035ce5f2d3d81f8d9474113ce3447c64984abd67ffa13d6b1132f52081ce8f529dc157f308050388baea59a086312f63ccdcbc834d09c9d90ee0531d13a861ac716b63aae333e4a5ff6edbdaa6952b64d09bb7afb7e0403b78eaa896bf795d9326352d7f34a1681d9f5d5e19039acfd96899a98ff3c698b6e190a84e20706900e1f56bb476686e6aceaa5f9aa1cbd5cf6ab16695ef69f0143458696c4c3b4cb52812afc29c7dce1fc4e0968aef2eb82533e8552b0effc439e7f27c5f1437d83a971507f71c45dd3a2b1247bb28e63b4b8d2313e4bc4fe41927c2b521c2bb67a9fee5d9e9ce26d8e05e37db19a6072624e4c4acdc4922fffe364a8764321946017064ff81acfaa67d38be9ac7e6ed4eedbd8edf7468cf83c1001247bbc8799bb40e71de18a3eeed4d94bc93d4f27b76371bf619cb99819011f1caaccfadd108327dd6cc19c13349e46e6a46a53e6d16e333c60ebffa86f6bcf957cdb05dbba9118df33e91f0f1553ab0c141bb5e6a45ba9d584ba5518334fe2006faa5be1f5228c51240cdb90050e24b8742d8b6c909e905fd1169bb3f493bf6ee2a1863d54bd24a091d878e405c29c2ddd49c955710cc483e98ca8ba502c8dbaac4a1b3d479a933eb9df42a3a6bcabe31469edfeed28d7f66264130c37ba20bcaaa547cda9b115bd55b9d0b8219cd97078d6f301051a62b736b3002ef32c63c941d8632da0ebe2d2e6d50ebe9c757f3f07c16ccd32f91b1262894a49512fcbd3e781963ace5e208f594b3039681aea7808186c21b0ba5527bf0163abf4856b04366c2815f14df6870de1823ffa73e24e349e4eead2b50e05ae7022770687234661d0ef11091afd707e52f4a8a41781131a8687634821338c4eeaa184d28b03c25c1fe2f76041e9b8d1ba7cf3c84fe27009117c1091cac6dfb0bea3975f132c515557b3f5d1e277070ffa4396fa362eae26592ff53460c2aba8f75c0cb18f38c1379def040e445d8b73a81f5f5656fa40c860761794a42d4559fd50eddef7b91b81bd3f44a5603ae754e488284d05d596b8774be2cfd0e75c0bb345b3fcb8f2d05771ed3879b32cb535405f61f3ae1b438a1ac9f5d93301c3a4f65336cb584f39b4c255d022329a424507f2506fc3d6ab87c9e13d1f1efcf3dd2875b16f0e1e1a2727dca5ffed809da5d372f060b0076d1047aa50e8debec86f55093c5c35ece6922e136d1e02713e4bb3842839f0c93709bc8394d0b5f46fc3fc0c58657ef4963a7b92a4adf07fc9bcce8165cb3e76d4be853b462a76e61549d65ee20447486fdb00856ec9b6383d9a689a424a0a8093409fa1f657a8828f4d7045cbc098a9a80f8f4e3f3767acc364d049dad6ceede04712a978a8bf222044e85b86aeee784a39f8f5024c9c3a7c8f0586c108424b06cb63e53b7c7c8174e66e5745a6c70d502a8e09b3f617c8242710e3e39ac3d31992574fd88d7e431bc3b4c257dc9c5314ceede8caaef19b1c0b9257f14d876aef41988ab6f6d2bd8201b0f9da74af219c1c18f47a83f3abb0698fc4df6795fdb38d19a53f9fa776d72822bb0783482e9b3212a27c2c299d0b17779962fcdcee49f531e6ab022f974e5f74d443f276a0d67cbe505111d7b675db3e82763d4190ee9f6539b04b85e3476dcd34344ee7321f4c7f44f038ebde6c6e063a9765e648461c7b67f33060b006e0938ff33f79c98b662863680fdd14896bcce3fdfca7a7ef0b3906eb9ad5702f07d3842b60a5d94eeeb0ad4644a9e1c4f643d8f01baf50da85373aa6f829bca93abc695ac4fa10e6f30c3516bd52dbf330cb4fffe6ac97879d33491f8bb01f447395d395d9b9c9ac12a30e0d30ebfe286d954dad8ca49b7fe06b8afc4e02f1095d20cb7885ec51abcd27c46304f1e2fe674b4b960f9c1d108eaffa840182fdf70794e285c0f355faf1443cd6d80a2805c393efb5e780963cdbf58ce2e6f7783e7f2eb9dfee64fbaa76fb8c26da29a937e8c22bfdd6af918c65e73e7cd508b6a11432166b2acb03f141fb6ee09a0ff7a08dbce45c0de1b40471488fd632aeb1db704b87eecd4d74bb07e6b4c9b274fcd362024f4cb4da31c8da0fe4c04dcbd89f20cb7583df87cbda02a10f9caeb59aedcf82ac6c65e73c3c2a979efab4911f567fc38f2ee4d0a5dbb49b11b9334f8c9301d79f7266de9f36b334866be3609507eb5398b6135a6758a331f21e68e284144646bbec5061460f38504d83905ec981fec7711b03f140f92eba61552aa9cafcdd87fce8f9a3351b03f8430f5bfb3af0c3c6f029e94f2f4134ddc23cbb4a249bfdcdce847fd0505b11b65306e917a1462c4dc015536aa05ea5180c17b9730d6b177233bec9074f38daa511c9493387861109d51a416cb39eff18288b19d56b85e7c8e15fa526491c84f418f115c4f20eb23c5f6e02db013b7b0f1233f06bf508068049819215dcf641c17329a1ec4f3cb1de5b0f4a41f91f418f83ee03225f3de6b5ccd3fb24cab9460da4cdc712102dfc56163865ba41e28c088c81d5065a2b618ca935b3c9f7dfd5236d420822ff3ac8945b0626ca715d1128bc7458dabf599f6f486d99d2ef6de406ae7ea41fec8488557aa50762ac4489c88e73ef06bfe6edbb3d6bcf744beea9165dadc7a59242b2e6fb782de74e3f45bcfb1c9dfb871d8c1811752cf7b14a0fbe3a1928b95624cfb4dfbb48a01b9c9a71f67633bad5a3d4bad9d6a6b2544768a081bb85d73517819637a969f5e7cb1f70680bf9b8b8e10f7ec5962e3a904236d3be787b537868de92f1f66fe9f4f2a25c338df26d3e6d66be85f4554ad62da54d7bb8431fbfa356c6ca7158d363ba02ae88f72b0be1f287a41891c8f16aec723e0d3ea0f7094774efb7bc6e42e1201344ae63ccb3f124e809d1800be2ebc1a069419dfb48264c0f793ef868064f6dd616d366769c3fa169936d3a775d4aa059923bc8431d78b35ac6b53ead49b9ce4b1f41d3f929fa74ea3a5dff31051f473a2ce6876bd8c31e237ebd366a2eb7e2a2a508a61d3380a73c981ab31ad02a0eba7f94c7af0d300f0a038c30222f0b5fe179d255319be5f263a6b0d185691fcd2fdc9396de596ebd39692c7bdf0381bdae9063f73cf44eb9500d8c908361e3a4fbb0e0d137bdb8fd62b91a233c6c3f26955ae40ff17615adbcc65853527f5a302c5508ef3a839e98770bbb8e12e12010c3ec6586d6dfe2add081e5ef9f09836171db526240d6c8916931389573d54a6cdae9731b9d1a753e122bd38a791192391ccd70bbc88801c9f13d3fad33b5d3972f5c2502200e91e515ddf2db45e09e8e6b308269c6d70e1b08343d726276af958de7b2a27624b9f1fa18b2359334e1ed38a008e58aa5009f385e34a41bb2c9a7276968ca0afc118731493b3a5cf8fd0b509e2ee4d502597dc95e7d31a97dbbb84b1c4ebfa714e3dcccc1f5fc6985ebc3d389aa8f8fa54dfc5611a55f399b645cc7fdf4344839f0c53cd99084647a3797a58042b861a4474ec5dce926b9732fbfa358c7be171e6fdb72daccb66d28d32f4c811984e4510fd7c244f7fedde0371ed72e6f8f02a0555519b5a8ce0e0d7e59fa78d29302c3f8d0e8bb5e0082fc8b405e4f50403e8e145400da0d4d98b168b15c26a11e2cccd2ab9cf45de955dbe29b5f355890fed658c7500f05d9ca01e0545db2337ffad5737a3e6a43fef66f683b208c7872374c421c22e14ffed0be73451280e345f18c0a892df8e164e8577ab13de8c7caefba92dd8ac1dad8cf2d3672e9205ea2dbdb09c25ee1359ffc304399a7dae5b5553f75d383e1ca1c0cf45ed869fc5990206b63bb1f41d7fde48298a69c62c231d28f39b349e13e1db20206ad0002a99310a618f1c418f9c40fa7e083da6b567941f4262f6395f7ce7ae1036bff43873de18a11d17f2cb2be42bf72e616c6c9aa8eed4004673195705eacfa4fac9f1e15532992558b804c08b88a90a024a15d4a402f99d48be4633721cbc8ac0cf67ef0db64d130dfe25815d27fdbaeff34905033bdd883e5d9a68028f31b60f40e8da04f5040379f50daa80e9580403f788a24f3396779797763552194cd8f60c870e47f1fbbc32133b31002c361b967fd6618579adf1d34a839f0ca756db653079313c6ce1605fbf8629c8bfeb2cf3f49182ec535e6d9208d78b951f4b94ee116dfeb392c740164e45c7dec2779bc56e10f57fa9a03f5ad9172999d866b3a371b5392fcc58ec7497835731b0dd59d135adb671a2fa33f933461a8776baf5efa7cdb27823457122867e26c22e963e5953eedd5e2d16a0f9a5f26f33b44d13a933e75ec5f4b9d60a50cf2571dd2752d404ec4f99742fa5f31051ec1f53f3f61b12e9f3b969bd8c2c46d3f97c5f2850202030733e55516f615435e7e5b0082a784e84a92a06cb6a0b2c9c8acd2bcd052fdd8bdd1821af0cc8f108d4642abc67324b68a905aae6788ed74344ddd795990d2605c1511eb57c0c225f075f83a07f3fad739ac8fac7fc115e14574818b2d5c12e1636d88e30b0ffbaf1fb69cbb92d7101bf3b58f02670db3451fd19a5ecdf5a703d039cde60cd3ace184b009baf8420dfe50ccb699492f0ffccfec85f74bc80df3c96fc1db1d8b5093a180ccc8b6f68145bc4ca5c8205fc6ea0a1df11136e13edb830b3c3f11055e239115d9b8cdd43bb80df5d34f43b62f155a9c0b7a3562d7bc7cc283a2c56245eb52e18ec0296c4b27f1b97bb374107826a2a803e0f2a386a55f81a9c86370e1670012bfa6d5c05a98fd10e7e96803f164b6ddd95e1b3d62286769b1dfb569bb26e6859c005348273fa15f234a6e3818080fe2f6524a6b2e380e91d18676d1d447efee2970bf8ddc4ff03848780e5eb0231170000000049454e44ae426082</data>
     </image>
 </images>
 <connections>
@@ -1335,7 +1338,7 @@ Montreal, Quebec H2T 1S6&lt;/p&gt;</string>
     <tabstop>confirmationToQuit</tabstop>
     <tabstop>checkedTray</tabstop>
     <tabstop>voicemailNumber</tabstop>
-    <tabstop>useStunNo</tabstop>
+    <tabstop>useStunYes</tabstop>
     <tabstop>STUNserver</tabstop>
     <tabstop>playTones</tabstop>
     <tabstop>pulseLength</tabstop>
diff --git a/src/configurationpanel.ui.h b/src/gui/qt/configurationpanel.ui.h
similarity index 57%
rename from src/configurationpanel.ui.h
rename to src/gui/qt/configurationpanel.ui.h
index 7c92a2103b..37c37c6cdb 100644
--- a/src/configurationpanel.ui.h
+++ b/src/gui/qt/configurationpanel.ui.h
@@ -12,10 +12,12 @@
 #include <qdir.h>
 #include <qstringlist.h>
 
-#include "configuration.h"
+#include "../../configuration.h"
+#include "../../global.h"
+#include "../../skin.h"
+#include "../../user_cfg.h"
 #include "qjlistboxpixmap.h"
 #include "qmessagebox.h"
-#include "skin.h"
 #include "qtGUImainwindow.h"
 
 
@@ -25,7 +27,7 @@ void ConfigurationPanel::init()
      // List skin choice from "skins" directory
    QDir dir(Skin::getPath(QString(SKINDIR)));
    if ( !dir.exists() ) {
-        printf ("\nCannot find 'skins' directory\n");
+        _debug("\nCannot find 'skins' directory\n");
     } else {
     dir.setFilter( QDir::Dirs | QDir::NoSymLinks);
     dir.setSorting( QDir::Name );
@@ -56,22 +58,21 @@ void ConfigurationPanel::init()
     } 
  }
   // For signalisations tab
-   fullName->setText(QString(Config::getchar("Signalisations", "SIP.fullName", "")));
-   userPart->setText(QString(Config::getchar("Signalisations", "SIP.userPart", "")));
-   username->setText(QString(Config::getchar("Signalisations", "SIP.username", "")));
-   password->setText(QString(Config::getchar("Signalisations", "SIP.password", "")));
-   hostPart->setText(QString(Config::getchar("Signalisations", "SIP.hostPart", "")));
-   sipproxy->setText(QString(Config::getchar("Signalisations", "SIP.sipproxy", "")));
-       autoregister->setChecked(Config::get("Signalisations", "SIP.autoregister", (int)true));
-   playTones->setChecked(Config::get("Signalisations", "DTMF.playTones", (int)true));
-   pulseLength->setValue(Config::get("Signalisations", "DTMF.pulseLength", 250));
-   sendDTMFas->setCurrentItem(Config::get("Signalisations", "DTMF.sendDTMFas",0));
-   STUNserver->setText(Config::get("Signalisations", "STUN.STUNserver", 
-      "stun.fwdnet.net:3478"));
-((QRadioButton*)stunButtonGroup->find(Config::get("Signalisations", "STUN.useStun", 1)))->setChecked(true);
+   fullName->setText(QString(get_config_fields_str(SIGNALISATION, FULL_NAME)));
+   userPart->setText(QString(get_config_fields_str(SIGNALISATION, USER_PART)));
+   username->setText(QString(get_config_fields_str(SIGNALISATION, AUTH_USER_NAME)));
+   password->setText(QString(get_config_fields_str(SIGNALISATION, PASSWORD)));
+   hostPart->setText(QString(get_config_fields_str(SIGNALISATION, HOST_PART)));
+   sipproxy->setText(QString(get_config_fields_str(SIGNALISATION, PROXY)));
+   autoregister->setChecked(get_config_fields_int(SIGNALISATION, AUTO_REGISTER));
+   playTones->setChecked(get_config_fields_int(SIGNALISATION, PLAY_TONES));
+   pulseLength->setValue(get_config_fields_int(SIGNALISATION, PULSE_LENGTH));
+   sendDTMFas->setCurrentItem(get_config_fields_int(SIGNALISATION, SEND_DTMF_AS));
+   STUNserver->setText(QString(get_config_fields_str(SIGNALISATION, STUN_SERVER)));
+((QRadioButton*)stunButtonGroup->find(get_config_fields_int(SIGNALISATION, USE_STUN)))->setChecked(true);
    // For audio tab
   
-((QRadioButton*)DriverChoice->find(Config::get("Audio", "Drivers.driverName", 0)))->setChecked(true);
+((QRadioButton*)DriverChoice->find(get_config_fields_int(AUDIO, DRIVER_NAME)))->setChecked(true);
 
 #ifdef ALSA
    alsaButton->setEnabled(true);
@@ -79,25 +80,24 @@ void ConfigurationPanel::init()
    alsaButton->setEnabled(false);
 #endif
 
-   codec1->setCurrentText(QString(Config::getchar("Audio", "Codecs.codec1", "G711u")));
-   codec2->setCurrentText(QString(Config::getchar("Audio", "Codecs.codec2", "G711u")));
-   codec3->setCurrentText(QString(Config::getchar("Audio", "Codecs.codec3", "G711u")));
-   codec4->setCurrentText(QString(Config::getchar("Audio", "Codecs.codec4", "G711u")));
-   codec5->setCurrentText(QString(Config::getchar("Audio", "Codecs.codec5", "G711u")));
-     ringsChoice->setCurrentText(QString(Config::getchar(
-      "Audio", "Rings.ringChoice", "konga.ul")));
+   codec1->setCurrentText(QString(get_config_fields_str(AUDIO, CODEC1)));
+   codec2->setCurrentText(QString(get_config_fields_str(AUDIO, CODEC2)));
+   codec3->setCurrentText(QString(get_config_fields_str(AUDIO, CODEC3)));
+   codec4->setCurrentText(QString(get_config_fields_str(AUDIO, CODEC4)));
+   codec5->setCurrentText(QString(get_config_fields_str(AUDIO, CODEC5)));
+   ringsChoice->setCurrentText(QString(get_config_fields_str(AUDIO, RING_CHOICE)));
    
    // For preferences tab
-   SkinChoice->setCurrentText(QString(Config::getchar(
-      "Preferences", "Themes.skinChoice", "metal")));
-   confirmationToQuit->setChecked(Config::get(
-      "Preferences", "Options.confirmQuit", (int)true));
-     zoneToneChoice->setCurrentText(QString(Config::getchar(
-     "Preferences", "Options.zoneToneChoice", "North America")));
-     checkedTray->setChecked(Config::get(
-     "Preferences", "Options.checkedTray", (int)false));
- 
-  voicemailNumber->setText(Config::get("Preferences", "Themes.voicemailNumber", "888"));
+   SkinChoice->setCurrentText(QString(get_config_fields_str(
+				   								PREFERENCES, SKIN_CHOICE)));
+   confirmationToQuit->setChecked(get_config_fields_int(
+			   									PREFERENCES, CONFIRM_QUIT));
+     zoneToneChoice->setCurrentText(QString(get_config_fields_str(
+					 							PREFERENCES, ZONE_TONE)));
+     checkedTray->setChecked(get_config_fields_int(
+			   									PREFERENCES, CHECKED_TRAY));
+  voicemailNumber->setText(QString(get_config_fields_str(
+				   								PREFERENCES, VOICEMAIL_NUM)));
   
    //  Init tab view order
     Tab_Signalisations->show();
@@ -130,41 +130,43 @@ void ConfigurationPanel::init()
 // For saving settings at application 'save'
 void ConfigurationPanel::saveSlot()
 { 
-   Config::set("Signalisations", "SIP.fullName", fullName->text());
-   Config::set("Signalisations", "SIP.userPart", userPart->text());
-   Config::set("Signalisations", "SIP.username", username->text());
-   Config::set("Signalisations", "SIP.password", password->text());
-   Config::set("Signalisations", "SIP.hostPart", hostPart->text());
-   Config::set("Signalisations", "SIP.sipproxy", sipproxy->text());
-      Config::set("Signalisations", "SIP.autoregister",autoregister->isChecked());
-   Config::set("Signalisations", "DTMF.pulseLength",  pulseLength->value());
-   Config::set("Signalisations", "DTMF.playTones",  playTones->isChecked());
-   Config::set("Signalisations", "DTMF.sendDTMFas" , sendDTMFas->currentItem());
-   Config::set("Signalisations", "STUN.STUNserver", STUNserver->text());
+   Config::set("VoIPLink", "SIP.fullName", string(fullName->text().ascii()));
+   Config::set("VoIPLink", "SIP.userPart", string(userPart->text().ascii()));
+   Config::set("VoIPLink", "SIP.username", string(username->text().ascii()));
+   Config::set("VoIPLink", "SIP.password", string(password->text().ascii()));
+   Config::set("VoIPLink", "SIP.hostPart", string(hostPart->text().ascii()));
+   Config::set("VoIPLink", "SIP.proxy", string(sipproxy->text().ascii()));
+   Config::set("VoIPLink", "SIP.autoregister",autoregister->isChecked());
+   Config::set("VoIPLink", "DTMF.pulseLength",  pulseLength->value());
+   Config::set("VoIPLink", "DTMF.playTones",  playTones->isChecked());
+   Config::set("VoIPLink", "DTMF.sendDTMFas" , sendDTMFas->currentItem());
+   Config::set("VoIPLink", "STUN.STUNserver", string(STUNserver->text().ascii()));
  
-   Config::set("Audio", "Codecs.codec1", codec1->currentText());
-   Config::set("Audio", "Codecs.codec2", codec2->currentText());
-   Config::set("Audio", "Codecs.codec3", codec3->currentText());
-   Config::set("Audio", "Codecs.codec4", codec4->currentText());
-   Config::set("Audio", "Codecs.codec5", codec5->currentText());
+   Config::set("Audio", "Codecs.codec1", string(codec1->currentText().ascii()));
+   Config::set("Audio", "Codecs.codec2", string(codec2->currentText().ascii()));
+   Config::set("Audio", "Codecs.codec3", string(codec3->currentText().ascii()));
+   Config::set("Audio", "Codecs.codec4", string(codec4->currentText().ascii()));
+   Config::set("Audio", "Codecs.codec5", string(codec5->currentText().ascii()));
    if (ringsChoice->currentText() != NULL)
-     Config::set("Audio", "Rings.ringChoice", ringsChoice->currentText());
+     Config::set("Audio", "Rings.ringChoice", 
+			 					string(ringsChoice->currentText().ascii()));
    
-   Config::set("Preferences", "Themes.skinChoice", SkinChoice->currentText());
+   Config::set("Preferences", "Themes.skinChoice", 
+		   string(SkinChoice->currentText().ascii()));
    Config::set("Preferences", "Options.zoneToneChoice", 
-     zoneToneChoice->currentText());
+     string(zoneToneChoice->currentText().ascii()));
    Config::set("Preferences", "Options.confirmQuit", 
      confirmationToQuit->isChecked());
    Config::set("Preferences", "Options.checkedTray", checkedTray->isChecked());
 
-   Config::set("Preferences", "Options.voicemailNumber", voicemailNumber->text());   
+   Config::set("Preferences", "Options.voicemailNumber", 
+		   string(voicemailNumber->text().ascii()));   
 #if 0 
    QMessageBox::information(this, "Save settings",
    "You must restart SFLPhone",
     QMessageBox::Yes);
 #endif
    accept();
-
 }
 
 // Handle tab view  according to current item of listbox
@@ -231,13 +233,13 @@ void ConfigurationPanel::changeTabSlot()
 
 void ConfigurationPanel::useStunSlot(int id)
 {
-    Config::set("Signalisations", "STUN.useStun", id);
+    Config::set("VoIPLink", "STUN.useStun", id);
 }
 
 
 void ConfigurationPanel::applySkinSlot()
 {
- Config::set("Preferences", "Themes.skinChoice", SkinChoice->currentText());
+ Config::set("Preferences", "Themes.skinChoice", string(SkinChoice->currentText().ascii()));
 }
 
 
diff --git a/src/configurationpanelui.cpp b/src/gui/qt/configurationpanelui.cpp
similarity index 68%
rename from src/configurationpanelui.cpp
rename to src/gui/qt/configurationpanelui.cpp
index 8612f9f466..c18dffdadf 100644
--- a/src/configurationpanelui.cpp
+++ b/src/gui/qt/configurationpanelui.cpp
@@ -1,13 +1,13 @@
 /****************************************************************************
-** Form implementation generated from reading ui file 'configurationpanel.ui'
+** Form implementation generated from reading ui file 'gui/qt/configurationpanel.ui'
 **
-** Created: Wed Apr 27 10:37:34 2005
+** Created: Fri May 20 14:27:25 2005
 **      by: The User Interface Compiler ($Id$)
 **
 ** WARNING! All changes made in this file will be lost!
 ****************************************************************************/
 
-#include "configurationpanelui.h"
+#include "gui/qt/configurationpanelui.h"
 
 #include <qvariant.h>
 #include <qpushbutton.h>
@@ -322,507 +322,486 @@ static const char* const image0_data[] = {
 static const unsigned char image1_data[] = { 
     0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
     0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, 0x00, 0x30,
-    0x08, 0x06, 0x00, 0x00, 0x00, 0x63, 0x57, 0xfa, 0xde, 0x00, 0x00, 0x17,
-    0x58, 0x49, 0x44, 0x41, 0x54, 0x78, 0x9c, 0xed, 0x5d, 0x6d, 0x6c, 0x1b,
-    0xc7, 0x99, 0x7e, 0xd6, 0x70, 0x8d, 0x95, 0xa0, 0x18, 0xbb, 0x86, 0x13,
-    0x2c, 0x85, 0xd4, 0x20, 0x8d, 0xd8, 0xc8, 0xd2, 0x49, 0x10, 0x32, 0x1f,
-    0x88, 0xa8, 0xab, 0x11, 0x32, 0x57, 0x23, 0xa6, 0xec, 0x00, 0x26, 0xe3,
-    0x1f, 0xfa, 0x68, 0x02, 0x8b, 0x76, 0x8a, 0x54, 0x6e, 0x0f, 0x81, 0xec,
-    0x1e, 0x1a, 0x5b, 0x2d, 0x12, 0x59, 0x2d, 0x5a, 0x8b, 0x31, 0xae, 0x95,
-    0xce, 0x68, 0x63, 0xca, 0xc8, 0x9d, 0x25, 0x01, 0xb1, 0x45, 0x03, 0xb1,
-    0x2d, 0x03, 0x0a, 0x4c, 0x16, 0x4e, 0x45, 0x05, 0xf6, 0x89, 0x1b, 0x38,
-    0xb1, 0x36, 0x88, 0x03, 0x2d, 0x21, 0x04, 0x22, 0xe1, 0x06, 0xe4, 0x42,
-    0x11, 0xa4, 0x85, 0x1a, 0x60, 0xee, 0xc7, 0x6a, 0x97, 0x5f, 0xcb, 0x4f,
-    0xc9, 0x17, 0xf7, 0xa2, 0xf9, 0xf3, 0x48, 0xdc, 0x9d, 0x99, 0x77, 0x66,
-    0xdf, 0x79, 0xe6, 0x9d, 0x77, 0xde, 0x9d, 0xa5, 0x2e, 0x00, 0x90, 0x01,
-    0x30, 0xab, 0x84, 0x2d, 0x4b, 0x84, 0x48, 0x09, 0x00, 0x34, 0x20, 0x2b,
-    0x00, 0x43, 0x03, 0x56, 0x06, 0x18, 0xd9, 0x40, 0x51, 0xab, 0x59, 0xcf,
-    0x1a, 0x7e, 0x7f, 0x91, 0x3a, 0xb3, 0x82, 0x02, 0x7c, 0x84, 0x90, 0x2b,
-    0x77, 0xe2, 0x10, 0x12, 0x0a, 0x82, 0xa2, 0x04, 0x21, 0x01, 0x00, 0x29,
-    0x00, 0xac, 0x21, 0x3a, 0xcd, 0x16, 0xd8, 0x4d, 0x80, 0xe7, 0x51, 0x1e,
-    0xe2, 0x96, 0x5a, 0xea, 0x7e, 0xe8, 0x80, 0x35, 0xfc, 0xe7, 0x43, 0xaa,
-    0x1a, 0xa6, 0xe5, 0xef, 0x12, 0x32, 0xf0, 0x89, 0x84, 0x80, 0x10, 0x85,
-    0x0c, 0x16, 0x50, 0x52, 0x00, 0x5d, 0x19, 0x32, 0x0c, 0x0b, 0x8f, 0xc5,
-    0x82, 0x13, 0xcf, 0x5b, 0x30, 0xba, 0x91, 0x5a, 0x53, 0xe0, 0x35, 0x2c,
-    0x1b, 0x2b, 0x62, 0x5a, 0xf7, 0x1c, 0x21, 0xad, 0x17, 0x43, 0x08, 0xc7,
-    0x80, 0x62, 0x8c, 0x5a, 0x29, 0x3a, 0xcd, 0x16, 0x0c, 0xee, 0xe3, 0x11,
-    0xd9, 0x58, 0xbb, 0x66, 0x42, 0xac, 0x61, 0x49, 0x5c, 0x57, 0xce, 0x8d,
-    0xde, 0x25, 0x42, 0xe2, 0xd7, 0xa7, 0x49, 0xfd, 0xa9, 0x11, 0x84, 0x35,
-    0x13, 0x80, 0x66, 0x57, 0x0d, 0xc3, 0x31, 0x09, 0xf5, 0xa7, 0x27, 0x20,
-    0x5e, 0xbf, 0x4d, 0xbe, 0xeb, 0x0e, 0x59, 0xc3, 0xfb, 0x1f, 0x4b, 0x32,
-    0x2d, 0x7f, 0x37, 0x49, 0xda, 0x2e, 0x4a, 0x10, 0x12, 0x12, 0x56, 0x8b,
-    0x59, 0x8b, 0xa1, 0x8d, 0x03, 0xc6, 0x0f, 0xb8, 0x30, 0xb4, 0x61, 0xcd,
-    0x64, 0x58, 0x43, 0x63, 0x2c, 0xca, 0xb4, 0x8e, 0xbb, 0x84, 0x34, 0x0e,
-    0x0b, 0xaa, 0xc2, 0xae, 0x22, 0xb3, 0x16, 0x43, 0x41, 0x06, 0xea, 0x4f,
-    0x8d, 0xc0, 0x3d, 0x47, 0xc8, 0xfd, 0xd0, 0x41, 0x6b, 0x78, 0xff, 0x61,
-    0x41, 0xa6, 0xe5, 0xef, 0x26, 0x49, 0xe3, 0x59, 0x01, 0xb2, 0x52, 0x21,
-    0x63, 0x6e, 0x5e, 0x04, 0xd6, 0x9b, 0xf4, 0x92, 0xdc, 0x0f, 0x02, 0x9d,
-    0x4f, 0xf2, 0x48, 0x29, 0x32, 0x44, 0x19, 0xe8, 0xfa, 0x30, 0x52, 0x56,
-    0x39, 0x0c, 0x9d, 0xc2, 0xd4, 0xeb, 0xde, 0x15, 0x2d, 0xd2, 0x5a, 0x92,
-    0x0b, 0x64, 0xe0, 0xfc, 0x10, 0xa2, 0xff, 0x13, 0x41, 0x6e, 0xe2, 0x1f,
-    0xe5, 0xe1, 0x78, 0xdc, 0x01, 0xcb, 0x63, 0x16, 0x44, 0xea, 0xeb, 0xff,
-    0x29, 0x6c, 0xe9, 0x96, 0xe4, 0x02, 0x09, 0xfd, 0x2d, 0x04, 0xeb, 0x23,
-    0x56, 0x84, 0xac, 0x5b, 0x57, 0x65, 0x26, 0x72, 0xcf, 0x2d, 0x90, 0xfe,
-    0x77, 0xfb, 0x21, 0x7e, 0x2e, 0x42, 0xbc, 0x23, 0x81, 0xdf, 0x66, 0x81,
-    0x6f, 0xbf, 0x0f, 0xe2, 0xae, 0xc6, 0x8a, 0xcb, 0xbf, 0x17, 0xf2, 0x19,
-    0xa1, 0xa1, 0xf7, 0xc0, 0x71, 0x97, 0x10, 0xeb, 0x70, 0x08, 0xb2, 0x5c,
-    0xa6, 0x37, 0x00, 0x29, 0x9c, 0xf9, 0xb1, 0x0b, 0x2d, 0x8f, 0xb0, 0xa8,
-    0x79, 0x20, 0x4f, 0x3f, 0xf4, 0x14, 0x91, 0x80, 0xc6, 0xf3, 0xa1, 0xb2,
-    0xbd, 0x0c, 0x0c, 0xaa, 0x53, 0x5c, 0xef, 0x1c, 0x21, 0xbd, 0xa7, 0xfb,
-    0x31, 0x70, 0x3e, 0x00, 0x06, 0x0c, 0x64, 0xc8, 0xba, 0x0c, 0x46, 0xff,
-    0xbb, 0xf6, 0xba, 0x70, 0xe2, 0x57, 0xc7, 0x11, 0xb8, 0xcf, 0x4d, 0x12,
-    0xe1, 0xad, 0x6e, 0x12, 0xba, 0x14, 0x82, 0x0c, 0x19, 0x57, 0xfe, 0x6b,
-    0x64, 0x55, 0x14, 0x43, 0xfc, 0x79, 0x27, 0x19, 0x9d, 0x08, 0x65, 0xf5,
-    0x87, 0xcd, 0x69, 0x87, 0xeb, 0xa4, 0xbf, 0xe2, 0x81, 0x7c, 0x2f, 0xe4,
-    0x33, 0xc2, 0x3c, 0xa6, 0x75, 0x2f, 0x11, 0x52, 0x7f, 0x2a, 0x54, 0x11,
-    0xc3, 0x5e, 0xfb, 0x89, 0x1b, 0x2e, 0x4b, 0x0d, 0x8a, 0x25, 0xdf, 0xd5,
-    0x28, 0x06, 0x6e, 0xca, 0x65, 0x95, 0x97, 0xcb, 0xb8, 0xa9, 0x5f, 0x7a,
-    0x11, 0xa0, 0xca, 0x57, 0xa8, 0xc8, 0xa1, 0x76, 0x32, 0x21, 0x08, 0x7a,
-    0xdd, 0x1c, 0x67, 0x82, 0x77, 0xaf, 0x07, 0x0d, 0xb6, 0x06, 0x88, 0x77,
-    0x04, 0x28, 0x09, 0x05, 0x83, 0xe1, 0x20, 0x12, 0x89, 0xb8, 0x7e, 0xcf,
-    0xb9, 0xbf, 0x9c, 0x81, 0x64, 0x7f, 0xea, 0xbe, 0x66, 0xdc, 0x96, 0xe4,
-    0x02, 0x09, 0x5e, 0x0d, 0x82, 0xdf, 0x66, 0x83, 0xf0, 0xec, 0x8e, 0x15,
-    0x2b, 0x84, 0xed, 0xc6, 0x6d, 0xd2, 0xf6, 0xb3, 0xb6, 0xac, 0xe7, 0xd4,
-    0x60, 0xb3, 0x21, 0xd0, 0x1f, 0xa8, 0x6a, 0x00, 0xaf, 0xb6, 0x7c, 0x85,
-    0x30, 0x8f, 0x69, 0x07, 0xdf, 0x9f, 0x24, 0x61, 0x51, 0x2a, 0xdf, 0xef,
-    0xfa, 0xb0, 0x09, 0xa4, 0xdd, 0x81, 0x62, 0xc9, 0x3e, 0x14, 0x81, 0xf0,
-    0x95, 0x52, 0x95, 0x3f, 0x17, 0x34, 0x0b, 0x27, 0x07, 0x74, 0xbc, 0xfa,
-    0x42, 0x59, 0x0a, 0xe5, 0x99, 0x49, 0x92, 0x46, 0xcf, 0x0b, 0x3a, 0xa3,
-    0x7a, 0x76, 0x7b, 0x60, 0xe9, 0xee, 0x32, 0xec, 0x40, 0xd7, 0x17, 0x49,
-    0x12, 0xf9, 0x2c, 0x02, 0xac, 0x07, 0x94, 0x97, 0xf6, 0x14, 0x2c, 0xdf,
-    0xf5, 0x45, 0x92, 0xb0, 0x66, 0x76, 0x45, 0x4c, 0xdc, 0x92, 0x5c, 0x20,
-    0x43, 0x9b, 0x0a, 0x6f, 0xa8, 0xb8, 0xa6, 0xa6, 0x49, 0xb5, 0xcc, 0xe4,
-    0x9e, 0x5d, 0x20, 0x09, 0x39, 0x51, 0x11, 0xb3, 0x79, 0x66, 0x92, 0xa4,
-    0xe9, 0x15, 0x2f, 0xe4, 0x79, 0x19, 0x40, 0x7a, 0x06, 0xea, 0x3c, 0xd0,
-    0x01, 0x74, 0x1c, 0x2c, 0xd8, 0x5f, 0xa1, 0xed, 0x9b, 0x2a, 0x1e, 0xd8,
-    0x95, 0xca, 0xe7, 0x9e, 0x5d, 0x20, 0xa0, 0x81, 0x42, 0xfd, 0x95, 0xc5,
-    0xb4, 0xf4, 0xad, 0x24, 0x69, 0xbb, 0x18, 0x42, 0x25, 0x4c, 0xd8, 0xfe,
-    0x0c, 0x83, 0xc0, 0x6e, 0xbb, 0x81, 0xaa, 0xaa, 0xa9, 0x5a, 0x86, 0xcd,
-    0xc5, 0x73, 0xfb, 0x2c, 0xa0, 0x9f, 0xd8, 0x5a, 0xb2, 0xc3, 0x2c, 0xd1,
-    0x49, 0xd2, 0xf6, 0xda, 0x41, 0xbd, 0x7e, 0xa7, 0xd3, 0x55, 0xf1, 0x54,
-    0x67, 0xbb, 0x71, 0x9b, 0xf4, 0x9c, 0xea, 0x81, 0x78, 0x47, 0x34, 0x6c,
-    0x93, 0xd3, 0xe9, 0xc2, 0x91, 0x43, 0x1d, 0x88, 0x6e, 0xdf, 0x4a, 0xf9,
-    0x9f, 0x77, 0x12, 0x79, 0x5e, 0x06, 0x53, 0xc7, 0xa0, 0xef, 0x0f, 0x7d,
-    0x79, 0x0c, 0xc3, 0x5e, 0x1f, 0x27, 0xc7, 0x7f, 0x7d, 0x1c, 0xf2, 0xbc,
-    0x0c, 0x7e, 0x1b, 0x0f, 0xf7, 0xf0, 0x10, 0xa5, 0xc9, 0x19, 0x18, 0x1e,
-    0x85, 0x70, 0x33, 0xa4, 0x2b, 0x8e, 0x96, 0xf8, 0x6d, 0x3c, 0x1a, 0x9e,
-    0xb6, 0xa1, 0xe3, 0x40, 0x47, 0xd6, 0x83, 0x83, 0xff, 0x0c, 0xf1, 0x0f,
-    0xf7, 0x03, 0x00, 0xfa, 0xde, 0xe9, 0x43, 0x6a, 0x67, 0x23, 0x95, 0xf8,
-    0xf3, 0x19, 0xd2, 0xff, 0x6e, 0xbf, 0x9e, 0x97, 0xe3, 0x4c, 0xfa, 0x0c,
-    0x72, 0xf2, 0x8d, 0x6e, 0x24, 0x5a, 0xf7, 0x18, 0x3e, 0x78, 0x4d, 0x6e,
-    0xa3, 0x74, 0xe6, 0xb7, 0x7d, 0x10, 0x77, 0x35, 0x52, 0xfc, 0xd8, 0x38,
-    0x39, 0xfe, 0xc7, 0x9e, 0xac, 0x19, 0x49, 0x4b, 0x4c, 0x1d, 0x03, 0x8f,
-    0xd3, 0x8b, 0xd6, 0x43, 0x1e, 0x7d, 0x4d, 0x50, 0x8e, 0x7c, 0x4c, 0x1d,
-    0xa3, 0xb7, 0x57, 0x93, 0xcf, 0xb7, 0x44, 0x48, 0xff, 0xd9, 0x00, 0x46,
-    0x2e, 0x05, 0xf3, 0xea, 0xe2, 0x38, 0x13, 0x7c, 0x7b, 0xdb, 0xe1, 0x69,
-    0x76, 0x63, 0x74, 0xd9, 0x8f, 0xbf, 0x5e, 0x6b, 0x88, 0x8f, 0x10, 0xc2,
-    0xfe, 0x61, 0xa4, 0x62, 0x26, 0x64, 0x69, 0x8b, 0x61, 0xc3, 0x01, 0xd5,
-    0x86, 0x1d, 0xf8, 0x74, 0x59, 0x61, 0xab, 0x60, 0xd8, 0x4c, 0x3c, 0x1c,
-    0x06, 0x52, 0x4b, 0x84, 0x94, 0x8a, 0x61, 0xe0, 0xcd, 0x7c, 0x96, 0x0c,
-    0x42, 0x38, 0x0a, 0x71, 0x8f, 0x9b, 0xb4, 0xee, 0xf6, 0x80, 0x7d, 0x9c,
-    0x87, 0x7d, 0xb3, 0xa9, 0xe4, 0x88, 0xd7, 0xa6, 0x4c, 0xa6, 0x8e, 0x41,
-    0xef, 0x9b, 0x27, 0xc0, 0x9b, 0x79, 0xc8, 0xdf, 0xca, 0xe8, 0x3d, 0xdb,
-    0x0f, 0x21, 0x1c, 0x45, 0x38, 0x1c, 0x82, 0x70, 0x33, 0x8a, 0xc8, 0x1c,
-    0x21, 0x03, 0x2f, 0x79, 0x21, 0x43, 0x86, 0x3c, 0x2f, 0xe3, 0xc8, 0xdb,
-    0x47, 0xd1, 0x91, 0x53, 0xde, 0xd0, 0x1f, 0xfa, 0xf5, 0x87, 0x94, 0xfa,
-    0x46, 0x06, 0x03, 0x40, 0xf2, 0x9f, 0x24, 0x5d, 0xcb, 0x03, 0x8b, 0x01,
-    0x03, 0x8e, 0x33, 0xc1, 0x6e, 0xe1, 0x91, 0x52, 0x52, 0x48, 0xdc, 0x91,
-    0x21, 0xde, 0x11, 0x21, 0xde, 0x11, 0x31, 0x30, 0x3c, 0x84, 0x33, 0x63,
-    0xe3, 0x44, 0x5b, 0x14, 0x75, 0x0d, 0xf7, 0xeb, 0x8c, 0x18, 0x97, 0xe2,
-    0x50, 0x00, 0x48, 0x9f, 0x65, 0x0f, 0x2c, 0x25, 0xb1, 0xa8, 0xff, 0x3d,
-    0xf1, 0xa5, 0x00, 0x5b, 0x81, 0x76, 0x1e, 0xfb, 0x45, 0x27, 0x8e, 0xfe,
-    0xb6, 0x0b, 0xb9, 0x36, 0xbe, 0x67, 0xb7, 0x07, 0x8e, 0xe7, 0x1c, 0x88,
-    0x03, 0x38, 0xf8, 0xe6, 0x61, 0x5d, 0xbe, 0x13, 0xbf, 0x38, 0x06, 0x7a,
-    0x33, 0x0d, 0x96, 0x66, 0xd1, 0x7b, 0xb6, 0x1f, 0xe1, 0x70, 0x08, 0x03,
-    0x97, 0x02, 0x98, 0xb8, 0x19, 0x81, 0x7b, 0xb9, 0xdc, 0x72, 0xe4, 0xc3,
-    0x7c, 0xfa, 0xcf, 0x89, 0x2f, 0x05, 0x74, 0xce, 0x24, 0x89, 0x63, 0x97,
-    0x4b, 0xef, 0x23, 0x9e, 0xe3, 0xc1, 0x3f, 0xc3, 0xc3, 0xb2, 0xd9, 0x84,
-    0xd1, 0xbf, 0x85, 0x10, 0xbf, 0x13, 0x47, 0xcf, 0xbb, 0x3d, 0xe8, 0x1f,
-    0xee, 0xc7, 0x95, 0x65, 0xa6, 0x5f, 0xaf, 0x35, 0xc4, 0x77, 0x29, 0x0a,
-    0x59, 0xc9, 0x60, 0x38, 0xa5, 0x3c, 0xf4, 0xdf, 0x91, 0xd0, 0xeb, 0x34,
-    0x56, 0xdc, 0x40, 0x4c, 0x2a, 0xbb, 0x9c, 0x52, 0x28, 0xcb, 0x29, 0x9c,
-    0xf8, 0x24, 0x0e, 0x53, 0x01, 0x45, 0xd3, 0x70, 0x68, 0x53, 0x2d, 0x75,
-    0x66, 0x6c, 0x9c, 0x1c, 0x7c, 0xf3, 0x30, 0x00, 0xa8, 0x0f, 0x24, 0x21,
-    0xc3, 0x7f, 0x36, 0x3d, 0xda, 0xf1, 0xb4, 0x8d, 0x30, 0x75, 0x0c, 0xf8,
-    0x6d, 0x16, 0xb8, 0x9e, 0x77, 0xa1, 0x65, 0xb7, 0x27, 0x8b, 0xd1, 0xc6,
-    0x83, 0xd7, 0x20, 0x7d, 0x2d, 0x41, 0xb2, 0x3f, 0x45, 0x89, 0x7f, 0x6d,
-    0x44, 0x7c, 0xf9, 0x77, 0x17, 0x80, 0xf0, 0xd3, 0x36, 0x02, 0x00, 0xf2,
-    0xbc, 0x0c, 0xe9, 0x2b, 0x09, 0xee, 0x66, 0x37, 0x34, 0x26, 0x49, 0x24,
-    0xe2, 0x70, 0xcc, 0xce, 0x12, 0x8d, 0x79, 0x3c, 0x33, 0x49, 0xe2, 0xf7,
-    0xbc, 0xa0, 0x57, 0x7b, 0xe2, 0x17, 0xc7, 0x90, 0x7a, 0xed, 0x67, 0x64,
-    0xe0, 0xed, 0x2e, 0x00, 0xea, 0xa0, 0xe8, 0x38, 0xe4, 0x03, 0xdd, 0xda,
-    0x46, 0xc9, 0x18, 0xd5, 0xdb, 0xc1, 0x0d, 0x5e, 0x26, 0x47, 0x4f, 0xa9,
-    0xf7, 0x1c, 0x7c, 0xf3, 0x30, 0xce, 0xdd, 0xb8, 0x4d, 0x84, 0x67, 0x77,
-    0x50, 0x7a, 0x7b, 0x00, 0xc8, 0x8a, 0x0c, 0x0e, 0x40, 0x4a, 0x49, 0x65,
-    0xf5, 0xb9, 0x0c, 0x95, 0xd1, 0xdb, 0x9b, 0x5b, 0xa0, 0xbc, 0xb4, 0x87,
-    0x52, 0x06, 0xcf, 0x91, 0xe8, 0x27, 0x12, 0x14, 0x59, 0x02, 0x00, 0xd8,
-    0x9f, 0x76, 0xa0, 0xe3, 0x80, 0x0f, 0x81, 0x0d, 0x14, 0x75, 0x32, 0xa3,
-    0x1e, 0x00, 0xf0, 0xec, 0xf5, 0xc0, 0xf2, 0x9b, 0x2e, 0x6a, 0xa4, 0xbb,
-    0x2b, 0xbf, 0x1f, 0x2e, 0xab, 0xf2, 0x09, 0x00, 0x7a, 0x93, 0x0b, 0xe4,
-    0xa9, 0xb0, 0xba, 0x78, 0x13, 0x13, 0x22, 0x7a, 0x97, 0x4d, 0x9b, 0x4a,
-    0xe5, 0x6b, 0x7a, 0xb1, 0x09, 0xbe, 0x0e, 0x9f, 0xae, 0xb0, 0x4e, 0xa7,
-    0x0b, 0xf6, 0x93, 0x7e, 0x8a, 0xb9, 0xbc, 0x6c, 0x52, 0x41, 0x5d, 0xdc,
-    0x05, 0x2f, 0x05, 0x55, 0x52, 0x38, 0x79, 0x04, 0x0e, 0x2c, 0xfb, 0x69,
-    0xbd, 0x4b, 0x84, 0x04, 0xa5, 0x0c, 0x46, 0xac, 0x04, 0x65, 0x60, 0xea,
-    0xef, 0x30, 0x4c, 0x27, 0x1e, 0xb3, 0xac, 0xaa, 0x1f, 0xd7, 0x1f, 0x8e,
-    0xc0, 0x47, 0x4a, 0xfb, 0x6f, 0xc5, 0x5d, 0x8d, 0xd4, 0xe4, 0xd8, 0x38,
-    0xda, 0x9b, 0x5b, 0xd0, 0xf0, 0x78, 0x83, 0xaa, 0x20, 0x60, 0xb2, 0x85,
-    0x9b, 0x07, 0x26, 0x04, 0x01, 0x3d, 0xa7, 0xfc, 0x78, 0x6a, 0x57, 0x23,
-    0xe8, 0xf7, 0x2e, 0xe8, 0xe5, 0x06, 0xb7, 0x6c, 0xa2, 0x32, 0x17, 0x65,
-    0x96, 0xe8, 0x24, 0xe1, 0x82, 0x97, 0x49, 0xff, 0x1e, 0x37, 0xd1, 0xb2,
-    0x33, 0x60, 0x00, 0x05, 0xe8, 0x38, 0xe0, 0x03, 0x53, 0xc7, 0xe8, 0xe5,
-    0x87, 0x3e, 0x8c, 0xa4, 0xa7, 0xe0, 0x8c, 0x81, 0xc2, 0x73, 0x3c, 0xc4,
-    0x5d, 0x8d, 0x94, 0xff, 0x2f, 0x43, 0x7a, 0xfe, 0xb4, 0xc2, 0x66, 0xcb,
-    0x9f, 0x68, 0xdd, 0x43, 0xb5, 0xef, 0xf7, 0xe9, 0x79, 0x03, 0xe7, 0x07,
-    0x72, 0xa5, 0x07, 0x43, 0x33, 0x90, 0x01, 0xb0, 0x34, 0x9b, 0xd5, 0xbe,
-    0x63, 0x3f, 0x3f, 0x06, 0xf7, 0xf0, 0x10, 0xa5, 0xd9, 0xe8, 0x3d, 0xa7,
-    0xfc, 0x08, 0x87, 0x83, 0x10, 0x05, 0x09, 0x13, 0x82, 0x80, 0xfe, 0x77,
-    0xfb, 0x31, 0x78, 0x7e, 0x10, 0x0c, 0x00, 0x2b, 0x6f, 0x4d, 0x97, 0x07,
-    0x06, 0xbe, 0xbd, 0xad, 0x59, 0x72, 0xe4, 0xf6, 0x83, 0x3d, 0x3a, 0x4d,
-    0xb8, 0xe0, 0x65, 0xd2, 0xf4, 0xca, 0xcb, 0x59, 0xfd, 0x99, 0x52, 0x52,
-    0x55, 0xc9, 0x97, 0x8a, 0xa5, 0xa0, 0x2d, 0x98, 0x19, 0x30, 0x48, 0x7c,
-    0x15, 0x87, 0xed, 0xc6, 0x6d, 0x62, 0x89, 0x4e, 0x12, 0xd7, 0xd4, 0x34,
-    0xb1, 0x5c, 0xbf, 0x4d, 0xe2, 0xb1, 0xb8, 0x7e, 0x7d, 0x42, 0x10, 0xd0,
-    0x92, 0x5c, 0x20, 0xeb, 0x65, 0x00, 0x83, 0x9f, 0xa7, 0x54, 0xf7, 0x56,
-    0x95, 0x4c, 0xd8, 0xf6, 0xe1, 0x14, 0xa2, 0x2d, 0x56, 0xe4, 0x26, 0xd3,
-    0x83, 0xc0, 0xc9, 0x1f, 0x59, 0x70, 0xf4, 0x43, 0xac, 0x0a, 0xe3, 0xca,
-    0x60, 0x31, 0xf8, 0xa9, 0x54, 0x96, 0x6d, 0x3a, 0xb4, 0xa9, 0x96, 0xb2,
-    0xa8, 0x39, 0xe1, 0x06, 0xe0, 0x98, 0x9d, 0x25, 0x8a, 0xac, 0x40, 0xfa,
-    0x3a, 0x8e, 0xb8, 0x18, 0x47, 0xf0, 0xaf, 0x41, 0xc8, 0x77, 0xd2, 0xd3,
-    0x62, 0xcf, 0x9f, 0x7a, 0x30, 0x3e, 0x93, 0x24, 0xc1, 0x2d, 0x9b, 0x28,
-    0x7e, 0x6c, 0x9c, 0x0c, 0x7e, 0x18, 0x84, 0x70, 0x33, 0xaa, 0xb2, 0x40,
-    0x86, 0x8d, 0xac, 0x25, 0x19, 0x32, 0x40, 0x03, 0x81, 0x0d, 0x14, 0xe5,
-    0xf1, 0x9f, 0x24, 0x03, 0xc3, 0xaa, 0x32, 0xf6, 0x9f, 0xed, 0x47, 0x64,
-    0x89, 0x10, 0x29, 0x26, 0xc1, 0xff, 0x5a, 0x5a, 0xf1, 0xda, 0x5f, 0x6b,
-    0x81, 0x72, 0x79, 0x08, 0x89, 0x84, 0xa8, 0xe7, 0x6f, 0xdd, 0xdf, 0x8a,
-    0x40, 0x6b, 0x9b, 0xb1, 0x6d, 0xde, 0x60, 0xc3, 0xc0, 0x79, 0x35, 0xaf,
-    0x70, 0x33, 0x8a, 0xdc, 0x55, 0x43, 0x2e, 0x93, 0x69, 0x0c, 0xa7, 0xbc,
-    0xfa, 0x72, 0x96, 0xe9, 0xe3, 0xd9, 0xeb, 0x41, 0xfc, 0x2b, 0x49, 0xcf,
-    0x47, 0x33, 0x2c, 0x3c, 0xbb, 0x3d, 0x18, 0x02, 0x00, 0x3a, 0xbf, 0x3d,
-    0x59, 0xa6, 0x56, 0x5e, 0x3f, 0x78, 0xf3, 0xfa, 0x01, 0x50, 0x15, 0x53,
-    0xc8, 0xf9, 0xad, 0x1c, 0xf9, 0xe4, 0x6f, 0xd3, 0xfd, 0x2f, 0x43, 0x86,
-    0x7c, 0x47, 0x46, 0xae, 0x37, 0x23, 0xf3, 0x3a, 0x53, 0xc7, 0x00, 0xeb,
-    0x97, 0x6d, 0xda, 0x9e, 0x89, 0x0a, 0xbc, 0x05, 0x06, 0x28, 0x7c, 0x29,
-    0x02, 0xc8, 0x57, 0x5a, 0x00, 0x38, 0xd2, 0x60, 0x01, 0xc0, 0xe0, 0xe8,
-    0x47, 0xc2, 0x8a, 0x6c, 0x5a, 0x0d, 0x03, 0x02, 0x83, 0x56, 0x14, 0x57,
-    0x58, 0x23, 0xcc, 0xdc, 0x40, 0x50, 0xa0, 0x4e, 0x3d, 0xf4, 0x07, 0x97,
-    0x49, 0xcf, 0xdb, 0x7e, 0xbd, 0x43, 0x87, 0xae, 0x06, 0xb1, 0xf8, 0xfb,
-    0x3e, 0xdd, 0xb4, 0x60, 0xea, 0x18, 0x9c, 0x7c, 0xb3, 0x1b, 0xae, 0xe7,
-    0x5c, 0xa8, 0xd9, 0x5c, 0x83, 0xc1, 0xf3, 0x83, 0xe8, 0x3f, 0x15, 0xd0,
-    0xef, 0xd7, 0x18, 0xa6, 0xa5, 0xb9, 0x03, 0x9a, 0xd2, 0x62, 0x1e, 0xb0,
-    0x3a, 0xd2, 0x2a, 0xc6, 0x80, 0x01, 0xcd, 0xd5, 0x64, 0x78, 0x27, 0xd2,
-    0x36, 0x64, 0xf4, 0xb3, 0x68, 0x41, 0x79, 0x4d, 0x4a, 0x46, 0xfe, 0xba,
-    0x1a, 0x9d, 0xc9, 0xb4, 0xfc, 0xb9, 0x4c, 0x96, 0xae, 0x2f, 0x67, 0x51,
-    0xf9, 0x9b, 0x2e, 0xca, 0x92, 0xf3, 0xfb, 0xd0, 0x49, 0x3f, 0x18, 0x5d,
-    0x7e, 0x26, 0xaf, 0x3d, 0x32, 0x54, 0xff, 0xad, 0x7f, 0xd9, 0xa6, 0xa5,
-    0xb9, 0x1a, 0x9c, 0x79, 0xf3, 0x04, 0x6c, 0x8f, 0xd9, 0xf4, 0x7e, 0xe8,
-    0x39, 0xe5, 0xd7, 0xe5, 0x81, 0x82, 0xaa, 0xe4, 0xcb, 0xad, 0xdf, 0xb3,
-    0xd7, 0x03, 0xdf, 0xfe, 0xd6, 0xa2, 0x6b, 0x8e, 0xd1, 0x8d, 0xb5, 0x58,
-    0xe7, 0x98, 0x5b, 0x20, 0x42, 0x42, 0x5e, 0x31, 0x13, 0x8e, 0x88, 0xf9,
-    0x2b, 0x4c, 0x2d, 0x1d, 0x69, 0x60, 0x71, 0x61, 0x2f, 0x9f, 0x56, 0xc0,
-    0x15, 0xd4, 0x13, 0x8e, 0x49, 0x68, 0x59, 0x2a, 0x6e, 0x22, 0x78, 0x66,
-    0x92, 0xc4, 0x12, 0x9d, 0x24, 0xbe, 0x12, 0xf7, 0x59, 0x1f, 0xb1, 0x66,
-    0x2d, 0x42, 0x16, 0xe7, 0x53, 0x18, 0x38, 0x1f, 0x50, 0x3b, 0xb7, 0x8e,
-    0x41, 0x64, 0x2c, 0x84, 0x84, 0x67, 0x0f, 0x35, 0x5a, 0x5f, 0x4b, 0x05,
-    0x36, 0x50, 0x14, 0xdd, 0xda, 0x46, 0xd1, 0x5c, 0xda, 0x1f, 0xcd, 0xd2,
-    0xac, 0xda, 0x91, 0xf5, 0xb5, 0x94, 0x67, 0xaf, 0x07, 0x00, 0xb2, 0xca,
-    0xd3, 0xfe, 0xf7, 0xed, 0x6d, 0xd7, 0xeb, 0xe5, 0x6d, 0x69, 0xfb, 0x3f,
-    0x30, 0x3c, 0x54, 0x70, 0xa0, 0x69, 0xa6, 0x85, 0x0c, 0x19, 0xee, 0x67,
-    0xdc, 0x7a, 0xa9, 0x99, 0x36, 0xa3, 0xf6, 0xe0, 0xb3, 0xeb, 0x2b, 0x7f,
-    0x20, 0xab, 0xf2, 0xa7, 0xe5, 0xd5, 0xda, 0x63, 0xbb, 0x71, 0x3b, 0xbd,
-    0xe1, 0x50, 0x07, 0x84, 0x82, 0x57, 0x20, 0xee, 0x6a, 0xd4, 0xfb, 0xa1,
-    0x75, 0x7f, 0x6b, 0x56, 0xfb, 0x34, 0x86, 0xae, 0x54, 0x3e, 0xfb, 0x63,
-    0xf6, 0xbc, 0x45, 0x60, 0x21, 0x85, 0x75, 0xcc, 0xce, 0xea, 0xc1, 0x54,
-    0xeb, 0x42, 0x31, 0x05, 0x2b, 0xb6, 0x39, 0x37, 0x2f, 0xc2, 0xcb, 0x9b,
-    0x50, 0x2c, 0x79, 0x79, 0x13, 0x16, 0x5e, 0x77, 0xa1, 0xf3, 0x47, 0xf6,
-    0x15, 0xd7, 0x17, 0xfc, 0x3c, 0x55, 0x54, 0x61, 0x1b, 0x3d, 0x2f, 0xe0,
-    0xf0, 0x6b, 0x47, 0x60, 0x75, 0xd8, 0x21, 0x75, 0x75, 0x13, 0x65, 0xf0,
-    0x1c, 0x71, 0x4d, 0x4d, 0x13, 0xef, 0x1c, 0x21, 0x9e, 0x99, 0x24, 0x61,
-    0xaf, 0x8f, 0x93, 0xd4, 0xef, 0xfb, 0x48, 0xd3, 0x2b, 0xe9, 0xe9, 0x8e,
-    0xe7, 0x78, 0xb8, 0x9e, 0x71, 0xa7, 0x05, 0x9e, 0x07, 0xa4, 0xcf, 0xd2,
-    0xa6, 0x48, 0x4b, 0x72, 0x81, 0x84, 0x8e, 0x76, 0x12, 0xcd, 0x25, 0x93,
-    0xc9, 0x30, 0x32, 0x80, 0x63, 0x3f, 0xef, 0xcc, 0x6a, 0xaf, 0x66, 0xc3,
-    0x31, 0x75, 0x0c, 0x5a, 0x9b, 0xbd, 0xfa, 0x7d, 0xc7, 0xdf, 0x38, 0xae,
-    0x5f, 0x0f, 0x87, 0x43, 0x90, 0xba, 0xba, 0x89, 0xeb, 0x8b, 0xa4, 0xfe,
-    0x40, 0x6c, 0x37, 0x6e, 0x93, 0xa1, 0xe6, 0x16, 0x12, 0xbf, 0x13, 0xd7,
-    0xf3, 0x77, 0x1c, 0x6a, 0x2f, 0xdb, 0x66, 0xac, 0x64, 0x06, 0x82, 0x92,
-    0x23, 0xef, 0x72, 0x7b, 0xe2, 0x09, 0x29, 0xcb, 0x66, 0xcd, 0x9c, 0x11,
-    0x5a, 0x92, 0x0b, 0xc4, 0xfb, 0x6a, 0x6b, 0xd5, 0x36, 0x6d, 0x66, 0xfd,
-    0x81, 0x0d, 0x14, 0xd5, 0x79, 0xa0, 0x43, 0xbf, 0x7e, 0xf8, 0x97, 0x87,
-    0xc1, 0x8f, 0x8d, 0xeb, 0x44, 0xe3, 0x9d, 0x23, 0x84, 0x7e, 0xef, 0x02,
-    0xf1, 0x3f, 0xef, 0x24, 0xde, 0x97, 0x5a, 0xa1, 0xf5, 0xd3, 0xfa, 0x50,
-    0x6c, 0x39, 0x7a, 0xab, 0x5a, 0x06, 0xac, 0x5b, 0xc4, 0xc2, 0xa1, 0x26,
-    0x94, 0x93, 0x6a, 0x1e, 0x00, 0x7a, 0x9d, 0x16, 0xb4, 0x3f, 0x6a, 0xc1,
-    0x8e, 0x4b, 0x21, 0x20, 0x51, 0x5d, 0xbd, 0x82, 0x2c, 0x83, 0x2f, 0xf0,
-    0x20, 0x68, 0x86, 0x06, 0xbf, 0x8d, 0xd7, 0x7d, 0xac, 0xc1, 0xab, 0x41,
-    0xe0, 0x2a, 0x00, 0xf8, 0x0b, 0xca, 0xc5, 0x6f, 0xe3, 0xd1, 0xfb, 0xd6,
-    0x09, 0x58, 0xcc, 0x16, 0x3d, 0xaf, 0x0c, 0x19, 0x4d, 0xaf, 0x79, 0xc1,
-    0xed, 0x71, 0x13, 0x65, 0x7e, 0x11, 0xfe, 0x5d, 0x8d, 0x59, 0x79, 0x72,
-    0x6d, 0xc0, 0xa1, 0x4d, 0xb5, 0x54, 0xfb, 0x5b, 0x7d, 0x64, 0xe0, 0x52,
-    0x20, 0x7d, 0x1d, 0x40, 0x6b, 0x73, 0x2b, 0x46, 0x36, 0xa6, 0xdd, 0x74,
-    0x21, 0xeb, 0x56, 0xea, 0xdc, 0x8d, 0xdb, 0xe4, 0xc8, 0xdb, 0x47, 0x81,
-    0x84, 0x8c, 0xe0, 0xd5, 0xa0, 0x2a, 0xe3, 0xb2, 0x57, 0x02, 0x19, 0x36,
-    0x1d, 0xc7, 0x99, 0x10, 0x78, 0xa7, 0x0f, 0xa3, 0xf5, 0xcb, 0x71, 0xc6,
-    0x19, 0x3e, 0x4e, 0x23, 0x9b, 0x91, 0xe3, 0x4c, 0x90, 0x21, 0x94, 0xad,
-    0xb8, 0x96, 0xc7, 0xd2, 0xac, 0x2f, 0x43, 0x06, 0xb3, 0x59, 0x55, 0x34,
-    0xdf, 0x8b, 0x4d, 0xe8, 0x79, 0xc7, 0x0f, 0xcc, 0xab, 0x5e, 0x92, 0xb6,
-    0xd7, 0x0e, 0x16, 0xec, 0x07, 0x20, 0x6d, 0xd3, 0x66, 0xfa, 0x88, 0x8d,
-    0xe4, 0x63, 0xea, 0x98, 0x7c, 0x39, 0x3a, 0x0e, 0x52, 0xed, 0xda, 0x9a,
-    0x60, 0x5e, 0xf5, 0x96, 0x68, 0x7d, 0xd1, 0xe5, 0x4a, 0x9b, 0x59, 0xfc,
-    0x36, 0x1e, 0xac, 0x59, 0x9d, 0x09, 0x28, 0xcf, 0xfb, 0x93, 0x24, 0x58,
-    0xc9, 0x0e, 0x58, 0x06, 0xba, 0xb7, 0x31, 0xb8, 0xb0, 0xc7, 0x8e, 0x9a,
-    0x1f, 0x14, 0xd4, 0x87, 0xa2, 0xe9, 0x48, 0x78, 0x0a, 0xfe, 0x9b, 0x89,
-    0x2a, 0x76, 0xc8, 0x18, 0x74, 0xbc, 0x5a, 0x7c, 0xcb, 0xd5, 0x76, 0xe3,
-    0x36, 0x09, 0x7d, 0x34, 0x8a, 0x44, 0x2c, 0x81, 0xdc, 0xbd, 0x75, 0x19,
-    0x32, 0x1a, 0x1e, 0x6f, 0x80, 0xc9, 0x6c, 0x82, 0xbb, 0xc1, 0x95, 0x15,
-    0x1c, 0xe2, 0x5b, 0x22, 0x64, 0xf0, 0xfc, 0x20, 0x84, 0x8f, 0x05, 0xa4,
-    0x94, 0x14, 0x58, 0x9a, 0xc5, 0x22, 0x0d, 0xb8, 0x1b, 0x9c, 0x30, 0x99,
-    0x4d, 0x10, 0x3f, 0x95, 0x20, 0x2b, 0x32, 0xcc, 0x0f, 0x72, 0x68, 0xfa,
-    0xd7, 0xa6, 0x2c, 0x85, 0xd4, 0x62, 0x1e, 0xc4, 0x2f, 0xa3, 0x60, 0x69,
-    0x16, 0x9c, 0x99, 0x83, 0xa5, 0xf3, 0x68, 0x41, 0x39, 0xe9, 0x0f, 0x2e,
-    0x13, 0x51, 0x8c, 0xe9, 0xf7, 0x6b, 0xf5, 0x71, 0x66, 0x0e, 0xae, 0x1f,
-    0xb9, 0xf3, 0x36, 0x2a, 0xe8, 0x0f, 0x2e, 0x93, 0xf0, 0x87, 0x61, 0x2c,
-    0xd2, 0x40, 0x7f, 0x4f, 0xaf, 0xba, 0x08, 0x9c, 0x49, 0x92, 0x23, 0xdd,
-    0x47, 0xc0, 0xd2, 0x2c, 0xdc, 0xfb, 0x3d, 0x48, 0xed, 0x6c, 0xac, 0x78,
-    0x23, 0x65, 0x42, 0x98, 0x80, 0xf9, 0x41, 0x0e, 0x09, 0xcf, 0x9e, 0xac,
-    0x7e, 0xe8, 0x3f, 0x1b, 0x80, 0xf4, 0x99, 0xa8, 0xcb, 0x45, 0x6f, 0x66,
-    0xd0, 0xf0, 0xb8, 0x0d, 0x56, 0xb3, 0x15, 0x91, 0x4f, 0xa3, 0x7a, 0x3f,
-    0x68, 0xf9, 0x32, 0xe5, 0xeb, 0xfd, 0x55, 0x37, 0x86, 0x36, 0xd5, 0x66,
-    0xc9, 0xe7, 0xfc, 0xb1, 0xb3, 0xe0, 0xce, 0xa3, 0x16, 0xdc, 0x94, 0x59,
-    0x5f, 0x4a, 0x49, 0x81, 0x7f, 0xc4, 0x0e, 0x57, 0x83, 0x13, 0xd2, 0xce,
-    0x1d, 0x7a, 0x3e, 0x0a, 0x6f, 0x5d, 0x20, 0x15, 0xef, 0x50, 0xd5, 0x99,
-    0x70, 0x61, 0xb7, 0xa5, 0xa4, 0x49, 0x50, 0x4e, 0x8a, 0x48, 0x29, 0x34,
-    0x5e, 0x15, 0x81, 0xaf, 0xe3, 0x65, 0xd7, 0xcf, 0xd0, 0x2c, 0x7a, 0xff,
-    0xfd, 0x85, 0xfb, 0x3a, 0xb8, 0x65, 0x0d, 0xef, 0x1d, 0xae, 0xab, 0xd4,
-    0xa6, 0x6c, 0x79, 0xc6, 0x8e, 0x85, 0x43, 0x8e, 0x55, 0x51, 0x58, 0x00,
-    0x70, 0x58, 0x58, 0x2c, 0xfc, 0xc4, 0x01, 0xe7, 0xe3, 0x7c, 0xd9, 0x72,
-    0xc8, 0x4a, 0x61, 0x9b, 0x96, 0x81, 0xea, 0x77, 0xa6, 0x6f, 0x25, 0xc9,
-    0xc4, 0xd8, 0x34, 0x19, 0x7c, 0x7f, 0x92, 0x4c, 0x8c, 0x4d, 0x12, 0xfa,
-    0x56, 0x92, 0x78, 0x97, 0xc8, 0xda, 0x9b, 0x11, 0xff, 0x0f, 0x70, 0x7d,
-    0xd9, 0xb6, 0x64, 0x99, 0xd1, 0x5c, 0xd5, 0xa4, 0x9a, 0x07, 0x80, 0xd0,
-    0x3e, 0x2b, 0x4e, 0x70, 0x6c, 0x3a, 0xde, 0xb6, 0xd4, 0x0e, 0x59, 0x91,
-    0x86, 0x59, 0x4e, 0x47, 0x10, 0x93, 0xd3, 0xcc, 0x1d, 0x06, 0x0b, 0x20,
-    0x04, 0x3f, 0x67, 0x41, 0xc7, 0x0a, 0x3b, 0xcc, 0xbd, 0x44, 0x88, 0x24,
-    0x03, 0xb2, 0x92, 0x82, 0x83, 0x61, 0x0d, 0xc3, 0x26, 0x5b, 0x96, 0x08,
-    0x11, 0x12, 0x29, 0xf0, 0xcb, 0x03, 0x0c, 0x5b, 0x2a, 0x0f, 0x32, 0x29,
-    0x56, 0xff, 0xa8, 0xc1, 0x56, 0xb6, 0x69, 0x26, 0x49, 0x12, 0x09, 0x05,
-    0xe2, 0xb2, 0x09, 0xc5, 0x31, 0x00, 0xb3, 0x7d, 0xe5, 0x71, 0xc2, 0x89,
-    0x1b, 0xd3, 0x24, 0x2a, 0x03, 0x52, 0x5c, 0x82, 0x97, 0xe7, 0xc1, 0x9b,
-    0x69, 0x88, 0x0f, 0xa5, 0xdb, 0x43, 0x7f, 0x31, 0x4b, 0x06, 0x27, 0xe2,
-    0x59, 0x39, 0x5d, 0x3c, 0x0f, 0xf7, 0xa3, 0x4c, 0x55, 0xef, 0xfc, 0xf1,
-    0x77, 0x93, 0x24, 0x18, 0x53, 0x30, 0x28, 0x8a, 0xfa, 0x15, 0x96, 0xe5,
-    0xd0, 0xf7, 0xbc, 0x45, 0x2f, 0x6f, 0x7d, 0x59, 0xb6, 0x64, 0xdd, 0x22,
-    0x66, 0x7f, 0xe2, 0x85, 0xa9, 0x48, 0xac, 0xec, 0x6a, 0xa4, 0xe3, 0x0d,
-    0x26, 0x98, 0x68, 0x17, 0x0e, 0x5e, 0x0a, 0x95, 0xb4, 0x6d, 0x8b, 0x35,
-    0x3c, 0x26, 0xc7, 0x8d, 0xfd, 0xc9, 0x89, 0xf2, 0x36, 0x26, 0x8a, 0x61,
-    0xd3, 0x70, 0x14, 0xe1, 0x58, 0x7a, 0x0d, 0x30, 0x3b, 0x47, 0x48, 0xa6,
-    0xe2, 0xf2, 0x33, 0x0b, 0xa4, 0xf6, 0x77, 0x39, 0x31, 0x1c, 0x6f, 0x5d,
-    0x20, 0xdd, 0x4e, 0x3b, 0xb0, 0xb3, 0xfa, 0xf8, 0xd2, 0x96, 0x25, 0x42,
-    0xea, 0x4f, 0x8d, 0x40, 0x3e, 0x15, 0x82, 0xed, 0xcf, 0x93, 0xe4, 0xd8,
-    0x4f, 0xd3, 0x36, 0xbd, 0x7b, 0x8e, 0x90, 0xda, 0xd3, 0x99, 0x71, 0xca,
-    0x22, 0x40, 0xb3, 0x18, 0x9f, 0x21, 0x04, 0x5b, 0xaa, 0x3f, 0x6f, 0x22,
-    0x71, 0x23, 0x49, 0x0e, 0x87, 0xd3, 0xfe, 0xf5, 0x70, 0x2c, 0x02, 0x86,
-    0x61, 0xd1, 0x9b, 0x71, 0x5f, 0xe4, 0xf3, 0x54, 0x46, 0x7f, 0x48, 0xfa,
-    0x7d, 0x5d, 0x61, 0x16, 0x9d, 0x63, 0x93, 0xa4, 0x61, 0x57, 0x79, 0xe1,
-    0x9e, 0x3e, 0x42, 0x88, 0xf7, 0x7c, 0x04, 0xc1, 0xb3, 0x99, 0xfe, 0xfc,
-    0xe5, 0x72, 0x63, 0x22, 0xba, 0x9f, 0xb3, 0xea, 0xf7, 0xaf, 0x2b, 0x87,
-    0x61, 0x6f, 0xef, 0x6b, 0xba, 0xe7, 0x0a, 0xab, 0x25, 0x9f, 0x8d, 0xc5,
-    0x99, 0xbd, 0xae, 0x15, 0x31, 0x6d, 0xb5, 0xf9, 0xca, 0xc1, 0x70, 0x8e,
-    0xb7, 0x25, 0xf0, 0xc9, 0x54, 0xd6, 0x75, 0xff, 0xc7, 0x82, 0x61, 0xbd,
-    0x5d, 0xe1, 0x28, 0x06, 0xdf, 0x9b, 0x24, 0xee, 0x2a, 0x4d, 0x94, 0x81,
-    0x4f, 0x24, 0x35, 0x36, 0x44, 0x49, 0x41, 0x48, 0xc8, 0x59, 0xd7, 0x25,
-    0x05, 0x86, 0xed, 0x0d, 0x25, 0xe2, 0x2b, 0x6a, 0x6f, 0x0a, 0x8a, 0x61,
-    0x0c, 0x48, 0xe6, 0xab, 0x50, 0x7d, 0x2f, 0x5a, 0xe1, 0x34, 0x5b, 0x0c,
-    0xeb, 0xf7, 0x4f, 0xc8, 0xe8, 0xf9, 0xf3, 0x35, 0x52, 0xca, 0xaf, 0xee,
-    0x9e, 0x23, 0xc4, 0xf2, 0xc7, 0x2b, 0x08, 0x8a, 0xf9, 0xf5, 0x41, 0x49,
-    0xa1, 0xdb, 0x69, 0xc7, 0xc4, 0x43, 0x69, 0x62, 0x28, 0x69, 0xd3, 0x5e,
-    0xdb, 0xef, 0x86, 0x75, 0x75, 0xcc, 0x57, 0x3d, 0x4d, 0xfd, 0x1d, 0x70,
-    0x5d, 0x9c, 0xc2, 0x88, 0xb8, 0x68, 0x78, 0x5d, 0x57, 0xdc, 0x22, 0x72,
-    0x15, 0xeb, 0xf0, 0x6a, 0xf3, 0x95, 0x83, 0xb9, 0xe5, 0x69, 0x0e, 0xf9,
-    0xf4, 0x83, 0xa6, 0x0b, 0xd6, 0x1f, 0x8e, 0x49, 0x68, 0x1c, 0x8e, 0x82,
-    0xbf, 0x5b, 0xb9, 0xe2, 0x22, 0xa7, 0xdc, 0xac, 0xeb, 0x4a, 0xbe, 0x5c,
-    0x2a, 0x53, 0xad, 0x6c, 0x80, 0xa2, 0x40, 0xb9, 0x92, 0x9c, 0xbe, 0x6f,
-    0x74, 0x03, 0x45, 0xb5, 0xbe, 0xfa, 0x14, 0x75, 0x6e, 0x9f, 0x0b, 0x0c,
-    0x9d, 0xdf, 0x6e, 0xed, 0x9d, 0x3f, 0xee, 0x8b, 0xa4, 0xa1, 0xe2, 0xd2,
-    0xb7, 0x92, 0xc4, 0x7a, 0x7a, 0x04, 0x31, 0xa5, 0x26, 0xaf, 0x1e, 0x33,
-    0xb3, 0x88, 0xdb, 0xaf, 0x7b, 0x61, 0xca, 0x99, 0xa1, 0xd6, 0x9b, 0xe9,
-    0x45, 0xc4, 0x14, 0x63, 0x66, 0xb2, 0x3d, 0xc2, 0xdf, 0x13, 0x1b, 0xd6,
-    0xfa, 0x20, 0x10, 0xfe, 0x54, 0x44, 0xf8, 0xd3, 0x04, 0xb0, 0x79, 0x11,
-    0x27, 0x1b, 0x1c, 0x68, 0x7d, 0x84, 0x86, 0xe9, 0x81, 0x74, 0x5d, 0x3e,
-    0x1b, 0x8b, 0x60, 0xc2, 0x8e, 0xd1, 0x9b, 0xd1, 0x7c, 0xb9, 0x38, 0xcb,
-    0x77, 0xc6, 0xb4, 0xb9, 0xe5, 0xa5, 0x94, 0x14, 0xf8, 0xcc, 0xeb, 0x8b,
-    0x72, 0xd1, 0xfa, 0x85, 0x98, 0x84, 0xc6, 0xb3, 0x32, 0xae, 0xcc, 0x24,
-    0x49, 0x25, 0xb6, 0xae, 0x58, 0xa4, 0x1d, 0x3c, 0x9d, 0x2f, 0x17, 0x94,
-    0x14, 0x58, 0xba, 0xfa, 0x76, 0xca, 0x00, 0xd8, 0x02, 0xe5, 0x32, 0x34,
-    0x20, 0xe6, 0xde, 0xff, 0xc4, 0x26, 0x6a, 0x6a, 0x8e, 0x90, 0xa6, 0xe1,
-    0x10, 0x84, 0x1c, 0xff, 0xbb, 0x0c, 0x16, 0x7b, 0x86, 0x43, 0x30, 0xff,
-    0xc7, 0x38, 0xf1, 0xd9, 0x18, 0x80, 0x66, 0x21, 0xca, 0x71, 0x8c, 0x88,
-    0x0a, 0x62, 0xb9, 0xf1, 0xdb, 0xcb, 0xf9, 0x3a, 0x6d, 0x0c, 0x7a, 0x7f,
-    0xec, 0x32, 0x7c, 0x63, 0x65, 0xbd, 0xdd, 0x64, 0x42, 0x4c, 0x36, 0xf0,
-    0xd3, 0x32, 0x2c, 0xc6, 0xf7, 0xe6, 0xc7, 0x13, 0x8c, 0x88, 0x29, 0x0c,
-    0x7c, 0x2e, 0x63, 0xf4, 0x9b, 0x14, 0xa0, 0xbd, 0x56, 0xce, 0x71, 0x20,
-    0xaf, 0x18, 0xc7, 0x1e, 0x14, 0x4c, 0x0f, 0x9b, 0x80, 0xaf, 0xe2, 0xc0,
-    0x3c, 0x8b, 0xa3, 0x97, 0x42, 0x38, 0x4a, 0xb3, 0x00, 0x47, 0x63, 0x76,
-    0x9f, 0x43, 0x37, 0x45, 0x2e, 0xfc, 0x8b, 0x05, 0xb5, 0x52, 0x5c, 0x75,
-    0x87, 0x65, 0xc8, 0x67, 0x61, 0xe9, 0xf2, 0x98, 0xb6, 0x42, 0x5b, 0xb8,
-    0x2c, 0xc6, 0xcb, 0x29, 0x8f, 0xa5, 0xf9, 0xec, 0x07, 0x5d, 0xc3, 0x00,
-    0x28, 0xee, 0xf7, 0x96, 0x95, 0x14, 0x1a, 0x87, 0x05, 0x9c, 0xbb, 0x95,
-    0x24, 0xcc, 0x13, 0xe5, 0x29, 0xae, 0xba, 0xb3, 0x24, 0x1a, 0xb6, 0x43,
-    0x67, 0xc4, 0x9c, 0x7a, 0x72, 0x07, 0x54, 0xa5, 0x28, 0x16, 0x90, 0xbf,
-    0x10, 0x83, 0x8f, 0x6e, 0xa4, 0xa8, 0x63, 0x00, 0xc4, 0xeb, 0xb3, 0xa4,
-    0x6b, 0x42, 0xcc, 0xcb, 0x17, 0x93, 0xe3, 0xe8, 0x9a, 0x50, 0x74, 0x9b,
-    0xdb, 0xf0, 0xf9, 0x30, 0x2c, 0xc6, 0xf7, 0xb9, 0x20, 0x6e, 0xa1, 0xa8,
-    0x40, 0x01, 0xb9, 0xd6, 0xd9, 0x38, 0x1a, 0x46, 0x8c, 0xe0, 0xfe, 0x21,
-    0x93, 0xf5, 0x92, 0xe2, 0x91, 0xf0, 0x14, 0xa8, 0x77, 0x22, 0x78, 0xf9,
-    0x7c, 0x08, 0xa3, 0x9f, 0x4a, 0x40, 0x4c, 0x02, 0x96, 0x19, 0xba, 0x7b,
-    0x1b, 0x5b, 0x81, 0xb6, 0x2e, 0xa7, 0x6f, 0x95, 0xfc, 0x7a, 0x63, 0x0a,
-    0xea, 0x4f, 0x8f, 0x20, 0x24, 0xa9, 0x66, 0x43, 0xcd, 0x03, 0x80, 0xdb,
-    0x94, 0x2f, 0x9f, 0xcb, 0xfc, 0xdd, 0xd9, 0xb4, 0x46, 0x4c, 0x9b, 0x79,
-    0x3d, 0x55, 0x82, 0x69, 0x33, 0xb1, 0xed, 0xa2, 0x80, 0xd1, 0x0f, 0x26,
-    0xcb, 0x32, 0x15, 0x52, 0x45, 0xda, 0x81, 0x02, 0x8c, 0x08, 0x7a, 0x65,
-    0xed, 0x2d, 0x18, 0x2b, 0x52, 0x82, 0xc1, 0xf9, 0x9d, 0xf5, 0xd4, 0x78,
-    0xb3, 0x0d, 0x4c, 0xa1, 0xfc, 0x05, 0xd0, 0xc6, 0x59, 0x30, 0xfb, 0xba,
-    0xaa, 0xb0, 0xc5, 0xca, 0x5f, 0xe7, 0x32, 0x5b, 0x60, 0x64, 0x83, 0x9d,
-    0x7c, 0x4e, 0xdd, 0x42, 0x5b, 0xfc, 0x07, 0x40, 0xfd, 0xe7, 0x15, 0x75,
-    0xe7, 0x6a, 0x3e, 0x6e, 0x68, 0xe3, 0xf0, 0x0c, 0x63, 0xa8, 0x97, 0x45,
-    0x13, 0xcd, 0x18, 0xd6, 0x0b, 0xb0, 0x78, 0xe1, 0xbf, 0x47, 0x11, 0x10,
-    0x52, 0x00, 0x80, 0xf6, 0x47, 0xf3, 0xe5, 0xb3, 0x71, 0xa6, 0xfb, 0xd6,
-    0xa6, 0x45, 0x4d, 0x76, 0xbb, 0x6c, 0x66, 0x0b, 0x2e, 0x37, 0x37, 0x80,
-    0xfc, 0xda, 0x8b, 0x33, 0xbf, 0x79, 0x81, 0x9a, 0x7d, 0xc3, 0x8b, 0x6e,
-    0x27, 0x07, 0x86, 0x51, 0xaf, 0x0f, 0x88, 0x32, 0x86, 0xde, 0x1f, 0x27,
-    0xa5, 0xe2, 0x84, 0xd9, 0x62, 0xed, 0xf8, 0x3f, 0xb6, 0x69, 0xe5, 0x32,
-    0xca, 0x8d, 0x6f, 0xd9, 0x44, 0x4d, 0x1d, 0x70, 0xe9, 0xed, 0x2c, 0xb5,
-    0x76, 0x32, 0x73, 0x26, 0x44, 0x0f, 0xd8, 0x61, 0xe4, 0xce, 0xcb, 0xc5,
-    0x75, 0xe2, 0x96, 0x5a, 0xca, 0x48, 0xf3, 0xad, 0x26, 0x55, 0x61, 0x6b,
-    0xdf, 0xbd, 0x02, 0x7c, 0x5d, 0x53, 0x74, 0x84, 0x78, 0xf9, 0x2a, 0xec,
-    0x5e, 0xa5, 0x38, 0x23, 0x1d, 0xbc, 0x14, 0x82, 0x7d, 0x68, 0x0a, 0x2f,
-    0x7f, 0x24, 0x64, 0xfd, 0xce, 0x20, 0x85, 0x78, 0x89, 0x91, 0xf8, 0x5d,
-    0x32, 0x6d, 0xae, 0x4d, 0x3b, 0xde, 0x6c, 0x87, 0xb2, 0xbd, 0x96, 0xd2,
-    0x6c, 0xb3, 0xd1, 0x8d, 0x14, 0xc5, 0xef, 0xdc, 0x41, 0xcd, 0xbe, 0xee,
-    0x82, 0xc7, 0xc6, 0x03, 0x4a, 0x0a, 0x41, 0x51, 0x81, 0xfd, 0x2f, 0xa1,
-    0xa2, 0x07, 0x94, 0x48, 0x9a, 0xdf, 0xd9, 0xa8, 0x1d, 0xdf, 0x81, 0x4d,
-    0x5b, 0xde, 0x00, 0x47, 0x65, 0x71, 0xda, 0x3f, 0x28, 0xaf, 0xdc, 0x75,
-    0x0c, 0x00, 0x0f, 0xcf, 0xe5, 0x69, 0xfe, 0x91, 0xb0, 0x84, 0xda, 0x3f,
-    0x5d, 0x01, 0xe6, 0xf3, 0x57, 0x75, 0x59, 0xf8, 0x70, 0x95, 0xae, 0x85,
-    0x42, 0x4c, 0x9b, 0x81, 0xc2, 0x97, 0xe2, 0x72, 0xeb, 0xd3, 0xbf, 0xfb,
-    0x6c, 0xf6, 0xd2, 0x8a, 0xf5, 0x1d, 0x32, 0x2d, 0x9b, 0xc1, 0xb4, 0x4e,
-    0x33, 0x0a, 0x32, 0xc7, 0xe8, 0x06, 0x8a, 0x72, 0xbf, 0xb4, 0x83, 0xea,
-    0x76, 0xaa, 0x51, 0x6f, 0xda, 0x2a, 0x3b, 0x7e, 0x7d, 0x9a, 0xb8, 0xe7,
-    0xd2, 0xde, 0x05, 0x1f, 0x21, 0x24, 0x71, 0x23, 0x49, 0xfc, 0x82, 0x5c,
-    0xb0, 0x1d, 0x85, 0x18, 0x31, 0x77, 0x40, 0x55, 0x8a, 0x29, 0xa5, 0x40,
-    0x3f, 0x96, 0xc1, 0xb4, 0x0d, 0x77, 0x09, 0xb1, 0x9e, 0x1e, 0x29, 0xc9,
-    0xb0, 0x1a, 0xc6, 0x94, 0x9a, 0x92, 0x03, 0x57, 0xc3, 0x75, 0x32, 0x80,
-    0xee, 0xe7, 0xad, 0x79, 0x9a, 0xef, 0xff, 0x28, 0xaa, 0x2a, 0x6c, 0xa9,
-    0x11, 0xb2, 0xbe, 0x80, 0x52, 0x96, 0x4a, 0x25, 0x98, 0xb6, 0x10, 0x7a,
-    0x1e, 0x65, 0x4a, 0x2b, 0x56, 0x91, 0xfc, 0x8e, 0xb9, 0x85, 0x15, 0x6d,
-    0xe5, 0x56, 0x66, 0xd3, 0x1a, 0x44, 0x35, 0xe5, 0xa0, 0x69, 0xe7, 0x56,
-    0xea, 0x72, 0xb3, 0x0b, 0xcc, 0xb2, 0x69, 0xd4, 0x15, 0x8e, 0xa2, 0xf6,
-    0x54, 0x08, 0x2f, 0xbf, 0x75, 0x81, 0x1c, 0x7c, 0xeb, 0x1a, 0xa1, 0xde,
-    0x1e, 0xc1, 0xe1, 0xab, 0x42, 0xd1, 0x19, 0xe3, 0x5e, 0xd9, 0xb4, 0x32,
-    0x0a, 0x3c, 0xff, 0x22, 0x4c, 0xeb, 0x5e, 0x3e, 0xac, 0x70, 0xc7, 0xe9,
-    0x11, 0xdd, 0xaf, 0x5c, 0xee, 0xf3, 0x15, 0x12, 0x80, 0xf5, 0xf4, 0x08,
-    0xe8, 0x5b, 0xc6, 0xee, 0x31, 0x0d, 0xd7, 0x31, 0x00, 0x26, 0x1e, 0xa2,
-    0x28, 0x33, 0x67, 0x42, 0x25, 0x31, 0x08, 0x1a, 0x76, 0xfe, 0xf0, 0xde,
-    0x31, 0x6d, 0x2e, 0x3a, 0xcd, 0x0c, 0xe2, 0x65, 0xb8, 0x89, 0x8a, 0x95,
-    0x13, 0x8a, 0x29, 0xf7, 0x94, 0x69, 0xb3, 0x6d, 0xda, 0xf2, 0xca, 0x4d,
-    0x6c, 0xdf, 0x44, 0x4d, 0xbd, 0xee, 0x35, 0xf4, 0x73, 0x96, 0x33, 0x63,
-    0xc0, 0x40, 0x2e, 0xd0, 0x2c, 0x42, 0x62, 0x7c, 0x45, 0x4c, 0x3b, 0x22,
-    0x4c, 0x19, 0x96, 0x9b, 0xe9, 0xe8, 0xcf, 0x44, 0x7e, 0x86, 0x10, 0xeb,
-    0xd9, 0x08, 0xba, 0xc2, 0x51, 0xc3, 0x7c, 0x36, 0x8e, 0x41, 0xdf, 0x6e,
-    0x07, 0xba, 0x9d, 0x1c, 0xba, 0x9d, 0x76, 0x98, 0x99, 0xc5, 0xbc, 0xfb,
-    0x64, 0xb0, 0x68, 0xbb, 0x18, 0xc2, 0xe8, 0xfb, 0x93, 0x59, 0x33, 0x4e,
-    0x26, 0xae, 0xd3, 0xfe, 0x38, 0xd1, 0x60, 0x42, 0x35, 0xcc, 0x27, 0xca,
-    0x29, 0x43, 0x9d, 0x2c, 0x99, 0xaa, 0x88, 0xe3, 0xed, 0xdb, 0x5d, 0xda,
-    0x34, 0x90, 0x81, 0xa2, 0xe5, 0xb4, 0x5d, 0x0c, 0x21, 0x32, 0x36, 0x4d,
-    0x4c, 0x33, 0x49, 0x52, 0xcd, 0x21, 0x77, 0x95, 0xd9, 0xb4, 0xe5, 0x97,
-    0x3b, 0xba, 0x91, 0xa2, 0x52, 0xbf, 0xf4, 0xc2, 0xc6, 0x14, 0x97, 0xdf,
-    0x88, 0x69, 0xc5, 0x87, 0x28, 0xca, 0x4c, 0x2f, 0xe6, 0xdd, 0x17, 0x8e,
-    0xc9, 0x55, 0x1f, 0x9f, 0x3a, 0xfa, 0xc1, 0x24, 0x89, 0xc9, 0xf9, 0x4c,
-    0xdb, 0xce, 0xe7, 0xcf, 0x74, 0x3e, 0x42, 0xc8, 0xc4, 0xd8, 0x24, 0xd9,
-    0x71, 0x36, 0x84, 0x58, 0x22, 0x9e, 0x27, 0x87, 0x8d, 0xb3, 0x60, 0xbc,
-    0xd9, 0x86, 0x63, 0x3f, 0x7d, 0x8a, 0xa2, 0x9f, 0xad, 0xa7, 0xf8, 0x9d,
-    0x3b, 0x28, 0xd3, 0xce, 0xad, 0x54, 0xef, 0xbf, 0xed, 0xa1, 0xfa, 0x9c,
-    0x16, 0x43, 0x2f, 0x43, 0x50, 0x94, 0x50, 0x7f, 0x3a, 0x84, 0xc4, 0x8d,
-    0xe9, 0x3c, 0xf9, 0xf5, 0x73, 0x0f, 0x98, 0x27, 0xb6, 0x52, 0xce, 0xf7,
-    0xae, 0x91, 0xb0, 0xe6, 0x18, 0x2e, 0xe2, 0x67, 0xcc, 0xc4, 0xd1, 0x6f,
-    0xf4, 0xb1, 0x5e, 0x76, 0x9a, 0x92, 0x50, 0x76, 0xf9, 0x1a, 0x3a, 0x79,
-    0x4b, 0xc1, 0x11, 0x9e, 0xa7, 0x58, 0x45, 0xfc, 0xb4, 0xa0, 0x59, 0x0c,
-    0x4c, 0x44, 0x31, 0x20, 0x2c, 0xff, 0xff, 0xfb, 0x6b, 0xa4, 0x58, 0xbd,
-    0x1e, 0xde, 0x82, 0xf6, 0x27, 0x79, 0x30, 0xdb, 0xd5, 0x60, 0x8d, 0x8a,
-    0xfc, 0xb4, 0x90, 0x2b, 0x52, 0x94, 0x00, 0xa5, 0xfa, 0x39, 0x47, 0x3f,
-    0x98, 0x26, 0x03, 0x22, 0x8a, 0xf6, 0x47, 0x6e, 0xfe, 0xc8, 0x81, 0x26,
-    0x58, 0x4f, 0x8f, 0x20, 0xf7, 0x64, 0xf6, 0xae, 0x09, 0xc0, 0xf9, 0xde,
-    0x24, 0xe9, 0x6c, 0xb0, 0xa0, 0xc9, 0xcc, 0x16, 0xfd, 0xf6, 0x85, 0x77,
-    0x89, 0x90, 0x2b, 0xb1, 0x14, 0x0e, 0x5f, 0x8d, 0x20, 0x26, 0xca, 0x79,
-    0xfd, 0x68, 0x63, 0x80, 0xc0, 0x5e, 0x3b, 0x32, 0xfd, 0xa7, 0x0d, 0x77,
-    0xd5, 0x2d, 0xd8, 0xac, 0x1d, 0xad, 0x8c, 0xfa, 0xbb, 0x9d, 0x76, 0x98,
-    0x76, 0x6e, 0xa5, 0xe2, 0x05, 0xda, 0xcd, 0x3d, 0xbb, 0x95, 0x9a, 0x9d,
-    0x23, 0xa4, 0xf1, 0x62, 0x14, 0x42, 0x2c, 0xdb, 0xbf, 0x2d, 0x2b, 0xea,
-    0x79, 0x17, 0xce, 0xf7, 0x26, 0xc9, 0x95, 0x66, 0xbb, 0x7e, 0xfc, 0xeb,
-    0xfa, 0xcc, 0x02, 0x06, 0xf7, 0xb9, 0x50, 0x7f, 0x6a, 0x24, 0x6f, 0xa4,
-    0x14, 0xc5, 0x98, 0x84, 0xc5, 0x7f, 0x54, 0x16, 0x08, 0xee, 0xaf, 0xf0,
-    0x3c, 0x04, 0x86, 0x66, 0x31, 0xf8, 0x22, 0x8f, 0x48, 0x99, 0x0a, 0x50,
-    0xcd, 0x8c, 0x51, 0x08, 0x83, 0xa2, 0x84, 0xa0, 0x28, 0x43, 0x3b, 0x89,
-    0xc7, 0x88, 0x69, 0x33, 0x1d, 0xf8, 0x0c, 0x9d, 0x59, 0x7f, 0xf1, 0x9d,
-    0xbb, 0x42, 0xe8, 0x7e, 0x69, 0x2b, 0xe5, 0xba, 0x35, 0x4d, 0xda, 0x2e,
-    0xe6, 0xd7, 0x67, 0xc4, 0xb4, 0x1a, 0x53, 0x4f, 0xcd, 0x11, 0xe2, 0x38,
-    0x7b, 0x25, 0x6f, 0x87, 0x33, 0x1c, 0x03, 0xc2, 0x31, 0x75, 0xe7, 0xc9,
-    0xf9, 0xde, 0x35, 0xc2, 0xb2, 0x9c, 0xca, 0xe8, 0x34, 0x8b, 0xb8, 0x92,
-    0x42, 0x48, 0x52, 0x20, 0x2b, 0x32, 0x5e, 0xfe, 0x5d, 0x08, 0xfa, 0xce,
-    0x54, 0xce, 0x0e, 0x95, 0x93, 0x03, 0x42, 0xaf, 0xa4, 0x77, 0xa8, 0xdc,
-    0x4b, 0x84, 0x74, 0x7d, 0x2c, 0xe1, 0xe0, 0xe9, 0x11, 0xc3, 0xfb, 0x19,
-    0xa4, 0x70, 0xae, 0xd9, 0x85, 0xc4, 0xf6, 0x4d, 0x25, 0x89, 0x66, 0x74,
-    0x23, 0x45, 0x75, 0x00, 0x88, 0x8c, 0x4d, 0x93, 0x81, 0x89, 0xfc, 0x1d,
-    0xd0, 0x70, 0x4c, 0x5d, 0xa4, 0x9e, 0xfb, 0x22, 0x49, 0x12, 0xdb, 0x37,
-    0x51, 0x79, 0x67, 0x79, 0xe9, 0x47, 0x23, 0x55, 0xc0, 0x84, 0x9d, 0xcf,
-    0x70, 0xe8, 0x75, 0x96, 0xbf, 0x23, 0x46, 0xbd, 0x73, 0x05, 0xf8, 0xb6,
-    0xa6, 0xec, 0xf2, 0xcf, 0xed, 0xb6, 0x81, 0x2e, 0x73, 0xe7, 0x88, 0x01,
-    0x30, 0x31, 0x36, 0xa9, 0xae, 0xb6, 0x2b, 0x60, 0xf2, 0x62, 0xd8, 0xdd,
-    0xc0, 0x81, 0x5f, 0x8e, 0x9c, 0xcf, 0x3d, 0xeb, 0xec, 0xf6, 0xeb, 0xde,
-    0xac, 0x19, 0x80, 0x9f, 0x59, 0x20, 0x8d, 0x67, 0x47, 0xd5, 0x7e, 0xb1,
-    0x59, 0xd0, 0xb0, 0xab, 0xf4, 0x51, 0x4e, 0x85, 0x90, 0x9f, 0x21, 0xa4,
-    0x2d, 0x9c, 0xcf, 0x40, 0x36, 0x06, 0x38, 0xf6, 0xd3, 0xc2, 0x67, 0x9b,
-    0x29, 0xb7, 0x92, 0x24, 0x20, 0x48, 0x59, 0xd1, 0x68, 0xd5, 0x62, 0xbb,
-    0x8d, 0x87, 0xef, 0x49, 0x6b, 0x9e, 0x9b, 0x31, 0xf2, 0xc1, 0x6d, 0x32,
-    0x20, 0x18, 0xef, 0x6c, 0x39, 0x39, 0x95, 0x00, 0xab, 0x39, 0xa6, 0x95,
-    0x9f, 0x59, 0x20, 0x4d, 0xc3, 0xa3, 0x79, 0x33, 0x86, 0x86, 0x97, 0x9b,
-    0x5d, 0xc6, 0xe7, 0xd3, 0x66, 0x69, 0x7c, 0xee, 0xc8, 0x33, 0x42, 0x9a,
-    0xc5, 0xf8, 0x7e, 0x1b, 0x1c, 0x16, 0xb6, 0xa4, 0xc2, 0x56, 0x7a, 0xb6,
-    0x57, 0xbb, 0x8d, 0x81, 0xfb, 0xa5, 0xca, 0x4f, 0x33, 0xcc, 0x8c, 0x7b,
-    0x65, 0x96, 0xa7, 0x9a, 0x6a, 0xd0, 0xc8, 0x24, 0x69, 0xb8, 0x4b, 0x88,
-    0xac, 0xa4, 0x60, 0xe3, 0x58, 0xc3, 0x13, 0xcb, 0x7d, 0x84, 0x90, 0xf8,
-    0x37, 0x8b, 0xab, 0xf6, 0x0d, 0x09, 0x2d, 0x3e, 0x57, 0x93, 0xab, 0x9c,
-    0xc5, 0xa8, 0x96, 0x2f, 0xf8, 0xb9, 0x04, 0x49, 0xa1, 0x11, 0x5a, 0x8e,
-    0x4f, 0x95, 0xe4, 0x38, 0x62, 0x72, 0x4d, 0x5e, 0x3f, 0xdb, 0x38, 0x80,
-    0xa1, 0x19, 0xb0, 0x35, 0x0a, 0x6c, 0x66, 0x0b, 0x6c, 0x0c, 0xd0, 0xb4,
-    0xcd, 0x54, 0xf0, 0xb4, 0x4a, 0xe5, 0xd6, 0x34, 0x09, 0x08, 0x29, 0x08,
-    0x09, 0x35, 0xfa, 0xcc, 0x69, 0x06, 0x58, 0x96, 0x43, 0xfb, 0xa3, 0x2c,
-    0x94, 0x15, 0xc6, 0xf1, 0xfa, 0x08, 0x21, 0xfd, 0x37, 0x25, 0x8c, 0x88,
-    0x29, 0x00, 0x32, 0xc2, 0x31, 0xc0, 0xcc, 0x2c, 0xc2, 0xc2, 0x98, 0x30,
-    0xb8, 0x8f, 0x37, 0x3e, 0x9f, 0xd6, 0xbb, 0x44, 0x88, 0x7d, 0x38, 0x7f,
-    0x84, 0x17, 0xc5, 0x87, 0x4d, 0x18, 0x77, 0x3a, 0xe0, 0x28, 0x7c, 0xb4,
-    0x17, 0x7a, 0x27, 0x52, 0x15, 0x9d, 0x7f, 0x50, 0xc9, 0x69, 0x89, 0x6b,
-    0xf8, 0xfd, 0xc1, 0x82, 0x27, 0x81, 0xbb, 0x97, 0x08, 0x69, 0x3c, 0x1b,
-    0xad, 0xf8, 0x5b, 0x0b, 0xee, 0xc7, 0x19, 0x9c, 0x7c, 0xce, 0x9e, 0x15,
-    0xce, 0x38, 0x15, 0x07, 0xda, 0xc2, 0x11, 0x08, 0x5f, 0x2a, 0x65, 0x97,
-    0xe3, 0xe1, 0x69, 0x8c, 0xec, 0x77, 0x54, 0x74, 0x2e, 0xed, 0x1a, 0x7e,
-    0x3f, 0xb0, 0xe4, 0x77, 0xc4, 0xc4, 0xb1, 0x69, 0xe2, 0x9f, 0x88, 0xae,
-    0x8a, 0x6d, 0x58, 0x2e, 0xb6, 0xf3, 0xd5, 0x99, 0x04, 0x6b, 0xf8, 0xfd,
-    0xc0, 0xb2, 0xbe, 0x23, 0x46, 0xdf, 0x4a, 0x92, 0xc3, 0x57, 0x43, 0xd9,
-    0xa7, 0x2a, 0xde, 0x03, 0x64, 0x68, 0x16, 0x7d, 0xbb, 0xcb, 0x3b, 0x87,
-    0x76, 0x0d, 0xbf, 0xbf, 0x58, 0xd6, 0x77, 0xc4, 0x94, 0x27, 0x36, 0x51,
-    0xb3, 0x6f, 0x78, 0xe1, 0x34, 0xa3, 0xa2, 0x1d, 0xac, 0x4a, 0xd0, 0xc9,
-    0xab, 0x61, 0x69, 0x6b, 0x0a, 0xbb, 0x86, 0xa5, 0xb0, 0xe2, 0x6f, 0xe3,
-    0x9a, 0x66, 0x92, 0xe4, 0x78, 0x58, 0x4a, 0xbf, 0x2b, 0xb5, 0x42, 0x86,
-    0x75, 0x9a, 0x81, 0xbe, 0xdd, 0xae, 0xb2, 0x37, 0x0e, 0xd6, 0x70, 0x0d,
-    0xab, 0xfa, 0x36, 0xae, 0x0c, 0xf5, 0x65, 0x34, 0xff, 0xc7, 0x12, 0x46,
-    0xa4, 0xb8, 0xba, 0x75, 0x57, 0x81, 0xcd, 0x6a, 0xa6, 0x17, 0xe1, 0xb3,
-    0x59, 0xd1, 0xf9, 0xa4, 0xfa, 0x5d, 0xdc, 0xfb, 0xa1, 0x23, 0xd6, 0xf0,
-    0x9f, 0x07, 0x57, 0xf4, 0x15, 0x72, 0x0d, 0x35, 0x7f, 0xa0, 0xac, 0xd0,
-    0x08, 0xc5, 0x24, 0xa4, 0x16, 0xe9, 0xac, 0x3b, 0xb4, 0x1d, 0x18, 0x1b,
-    0x67, 0x82, 0x9d, 0xa3, 0xd7, 0xbe, 0x81, 0xbb, 0x86, 0x2b, 0xc2, 0xff,
-    0x05, 0x0b, 0xe4, 0xdf, 0xad, 0x23, 0xe1, 0xfb, 0xe0, 0x00, 0x00, 0x00,
-    0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
+    0x08, 0x06, 0x00, 0x00, 0x00, 0x63, 0x57, 0xfa, 0xde, 0x00, 0x00, 0x16,
+    0x58, 0x49, 0x44, 0x41, 0x54, 0x78, 0x9c, 0xed, 0x5d, 0x7f, 0x6c, 0x53,
+    0xd7, 0xbd, 0xff, 0x1c, 0xc4, 0xd0, 0x0d, 0xca, 0xaa, 0xeb, 0x6a, 0x45,
+    0xd7, 0x51, 0x5b, 0xe5, 0x22, 0x40, 0xdc, 0xb0, 0xa2, 0xda, 0x2d, 0xd5,
+    0xec, 0xbc, 0x21, 0x6c, 0xb4, 0x6a, 0x18, 0xa8, 0x5e, 0x62, 0x56, 0x89,
+    0x84, 0x6e, 0x22, 0xe6, 0x87, 0x3a, 0xa2, 0x3d, 0x75, 0x09, 0x7d, 0xda,
+    0x0a, 0xad, 0x28, 0xa0, 0x4a, 0x90, 0x80, 0x3a, 0x25, 0x45, 0x6b, 0x71,
+    0x50, 0x57, 0x9c, 0x48, 0x05, 0x87, 0x09, 0x48, 0x78, 0x6a, 0x87, 0x5d,
+    0xf1, 0x5e, 0xec, 0xa9, 0xbc, 0xf8, 0x4e, 0xf4, 0x81, 0x2b, 0x40, 0xb9,
+    0x11, 0xab, 0x62, 0x2b, 0x9b, 0xe2, 0x2b, 0x86, 0x12, 0x2b, 0xaf, 0xd2,
+    0xf7, 0xfd, 0xe1, 0xf8, 0xc6, 0x3f, 0xae, 0xed, 0x6b, 0x27, 0xb4, 0xec,
+    0x35, 0xe7, 0x9f, 0x0f, 0xe1, 0xde, 0xf3, 0x3d, 0xdf, 0x73, 0xce, 0xf7,
+    0x7c, 0xce, 0xf7, 0x7c, 0xcf, 0xb9, 0xc7, 0xec, 0x2a, 0x00, 0x05, 0x80,
+    0x38, 0x4f, 0xe8, 0x21, 0xa2, 0xd8, 0x5f, 0x01, 0xf0, 0x80, 0xa2, 0x02,
+    0x22, 0x0f, 0x98, 0x39, 0x20, 0xb0, 0x84, 0xb1, 0xf9, 0x2c, 0x67, 0x01,
+    0xbf, 0xbb, 0xc8, 0x4e, 0xcf, 0x41, 0x80, 0x87, 0x88, 0x06, 0xee, 0xc4,
+    0x30, 0xaa, 0x72, 0xf0, 0xca, 0x32, 0xe4, 0x38, 0x5f, 0x34, 0x87, 0xa3,
+    0xd6, 0x0a, 0xab, 0x39, 0x81, 0x96, 0x67, 0xad, 0x08, 0x2f, 0x63, 0xec,
+    0x51, 0x68, 0x80, 0x05, 0xfc, 0xe7, 0x43, 0x56, 0x09, 0xd3, 0x0a, 0xe3,
+    0x44, 0xfd, 0x5f, 0x26, 0xd0, 0x19, 0x0e, 0x40, 0xe5, 0x44, 0x40, 0x55,
+    0x00, 0xbe, 0x3c, 0xe4, 0x05, 0x11, 0x8d, 0x66, 0x11, 0x5d, 0x3f, 0x35,
+    0xa1, 0x77, 0xc9, 0x82, 0x01, 0x2f, 0xa0, 0x71, 0x2c, 0x8b, 0x69, 0x9b,
+    0xa6, 0x89, 0x36, 0xf7, 0x05, 0x10, 0x1c, 0x2d, 0xce, 0xa8, 0xe5, 0xa2,
+    0xa3, 0xd6, 0x0a, 0x5f, 0x83, 0x80, 0xe8, 0x63, 0x4b, 0x17, 0x5c, 0x88,
+    0x05, 0x2c, 0x89, 0x8b, 0x8c, 0xbc, 0xe8, 0x9c, 0x26, 0x4a, 0x7e, 0x3e,
+    0x41, 0x4b, 0xdf, 0xf1, 0x23, 0xa8, 0xce, 0x18, 0x2c, 0x2f, 0xce, 0x1b,
+    0x06, 0x47, 0x23, 0xa8, 0x39, 0x13, 0x45, 0xe8, 0xda, 0x4d, 0xfa, 0xb6,
+    0x1b, 0x64, 0x01, 0x1f, 0x7d, 0x2c, 0xc9, 0xb4, 0xc2, 0xf8, 0x04, 0xed,
+    0xb8, 0xa0, 0x42, 0x8e, 0x47, 0xbe, 0x11, 0x95, 0x2c, 0x82, 0x8a, 0xc8,
+    0x1e, 0x27, 0xbc, 0x6c, 0xc1, 0x65, 0x58, 0x40, 0x7d, 0x2c, 0xca, 0xb4,
+    0xb6, 0x71, 0xa2, 0xfa, 0x0b, 0x4a, 0xca, 0x60, 0xe7, 0x91, 0x59, 0x8b,
+    0xa1, 0x9c, 0xe4, 0x61, 0x3a, 0xe6, 0x47, 0xd3, 0x34, 0xd1, 0xa3, 0xd0,
+    0x40, 0x0b, 0xf8, 0xe8, 0x61, 0x41, 0xa6, 0x15, 0xc6, 0x27, 0xa8, 0xfe,
+    0x8c, 0x02, 0x35, 0x59, 0xa6, 0xc8, 0x1f, 0xc4, 0x80, 0xc5, 0x75, 0xda,
+    0xdf, 0xae, 0x27, 0x12, 0x38, 0xfc, 0x23, 0x2b, 0x14, 0x35, 0x86, 0x78,
+    0x92, 0x47, 0xeb, 0xa5, 0x41, 0x43, 0x72, 0x78, 0x4e, 0xc1, 0xd8, 0x6b,
+    0xee, 0x39, 0x2d, 0xd2, 0x3c, 0x93, 0x44, 0xdd, 0x1f, 0x79, 0x11, 0xf9,
+    0xef, 0x10, 0x72, 0x93, 0xb4, 0x5a, 0x82, 0x6b, 0x9d, 0x0b, 0xa6, 0x15,
+    0x26, 0x44, 0x6b, 0x6a, 0xfe, 0x29, 0x7c, 0x69, 0xcf, 0x24, 0xd1, 0xc0,
+    0x9f, 0x06, 0x60, 0xff, 0xa1, 0x1d, 0xfd, 0xcb, 0x1f, 0x9f, 0x97, 0x99,
+    0xc8, 0x76, 0x7f, 0x92, 0xba, 0x3f, 0xe8, 0x46, 0xf4, 0xcb, 0x28, 0xa2,
+    0x77, 0x14, 0x48, 0x2b, 0x45, 0xb4, 0xbd, 0xd2, 0x86, 0xf0, 0xfa, 0x35,
+    0x65, 0xcb, 0x7f, 0x18, 0xfa, 0xe9, 0xa1, 0x6e, 0xf4, 0xc0, 0x36, 0x4e,
+    0x54, 0x73, 0x21, 0x02, 0x35, 0xae, 0x18, 0x8b, 0x06, 0x24, 0x15, 0x9c,
+    0xdf, 0xea, 0x86, 0xfb, 0x49, 0x00, 0xdf, 0xcf, 0xb3, 0x0f, 0x2d, 0x85,
+    0x14, 0xa0, 0xfe, 0x52, 0xc4, 0x70, 0x94, 0x81, 0x4f, 0x56, 0x66, 0xb8,
+    0xce, 0xfb, 0x44, 0xde, 0x33, 0x3e, 0x74, 0x7e, 0xd4, 0x09, 0x11, 0x22,
+    0x14, 0x28, 0x9a, 0x0e, 0x7a, 0x7f, 0x5b, 0xb6, 0x5a, 0x70, 0xe4, 0xcd,
+    0x03, 0x8f, 0xbc, 0x4b, 0x12, 0x38, 0x74, 0x98, 0xe4, 0x4b, 0x32, 0x14,
+    0x28, 0x18, 0xfa, 0xf8, 0xea, 0xbc, 0x18, 0x46, 0x6c, 0xff, 0x61, 0xea,
+    0x0d, 0xf6, 0x67, 0xb5, 0x47, 0xad, 0x43, 0x84, 0xfb, 0x78, 0x67, 0xd9,
+    0x03, 0xf9, 0x61, 0xe8, 0x67, 0x88, 0x69, 0x6d, 0xd3, 0x44, 0x35, 0x27,
+    0x23, 0x65, 0x31, 0xec, 0xf0, 0x6e, 0x37, 0xac, 0x66, 0x14, 0x4d, 0x9e,
+    0x2b, 0x11, 0xf4, 0x5c, 0x47, 0xd9, 0x2a, 0xf2, 0x9c, 0x82, 0xc4, 0xeb,
+    0xee, 0xb2, 0x0c, 0x2a, 0xb4, 0xbb, 0x85, 0xc2, 0xb2, 0xac, 0x95, 0x2d,
+    0x08, 0x66, 0xb8, 0xb7, 0x36, 0xc2, 0x65, 0x73, 0x21, 0xf4, 0x45, 0x00,
+    0x5c, 0x9c, 0x43, 0x77, 0xb0, 0x07, 0xf1, 0x78, 0x4c, 0x7b, 0xe7, 0xec,
+    0xfb, 0xa7, 0xa1, 0x5a, 0x9f, 0x7b, 0xa4, 0x19, 0xd7, 0x33, 0x49, 0xe4,
+    0xbb, 0xe0, 0x83, 0xfd, 0x19, 0x27, 0x02, 0x6b, 0x6b, 0xe6, 0x6c, 0x10,
+    0xce, 0x1b, 0x63, 0xb4, 0xb9, 0x65, 0x73, 0x56, 0x3f, 0xd9, 0x2c, 0x16,
+    0x78, 0xdf, 0xf7, 0x56, 0x34, 0x80, 0xe7, 0x5b, 0x3f, 0xc3, 0x4c, 0xeb,
+    0xbb, 0x38, 0x42, 0x41, 0x39, 0x62, 0x3c, 0xee, 0xba, 0x42, 0x02, 0x35,
+    0xd5, 0xa1, 0x58, 0xb2, 0xf6, 0x86, 0x20, 0xff, 0x9d, 0xab, 0x28, 0x9e,
+    0x0b, 0x5e, 0x84, 0x83, 0x57, 0x71, 0xe0, 0x17, 0x1b, 0x0d, 0x19, 0x94,
+    0x67, 0x9c, 0xa8, 0xce, 0x65, 0xd5, 0x18, 0xb5, 0xa5, 0xc1, 0x03, 0xd3,
+    0x1b, 0xad, 0xba, 0x0d, 0xe8, 0xbc, 0x4d, 0x14, 0xba, 0x1b, 0x42, 0xe2,
+    0xeb, 0x04, 0xaa, 0x5e, 0xda, 0x52, 0x50, 0xbe, 0xf3, 0x36, 0x11, 0x56,
+    0x62, 0x4e, 0x4c, 0xec, 0x99, 0x24, 0xf2, 0x2e, 0x2d, 0x9c, 0xbf, 0x71,
+    0x64, 0x82, 0x2a, 0x65, 0x26, 0xe7, 0x18, 0x51, 0x22, 0x99, 0x28, 0x8b,
+    0xd9, 0x3c, 0xe3, 0x44, 0xf6, 0x97, 0x9d, 0x50, 0x1f, 0xa8, 0x00, 0xa0,
+    0xb5, 0xd7, 0xe1, 0x57, 0xdf, 0x80, 0xea, 0xd9, 0x56, 0xb0, 0xbd, 0x02,
+    0xab, 0xca, 0xdf, 0xd9, 0x2c, 0x57, 0x3f, 0xe7, 0x18, 0x11, 0x78, 0xa0,
+    0x50, 0x7b, 0x65, 0x31, 0xad, 0x70, 0x9b, 0x68, 0x4b, 0x9f, 0xbf, 0x2c,
+    0x95, 0x5a, 0xd6, 0x01, 0xde, 0x4d, 0x56, 0x1d, 0x53, 0x4d, 0xa5, 0x4a,
+    0x19, 0x36, 0x17, 0xcf, 0x36, 0x98, 0x60, 0x5e, 0xbb, 0xbc, 0x64, 0x83,
+    0xf1, 0x91, 0x61, 0xda, 0xb1, 0x67, 0x97, 0x56, 0xbe, 0xc3, 0xe1, 0x2c,
+    0x7b, 0xaa, 0x73, 0xde, 0x18, 0xa3, 0xf6, 0x77, 0xda, 0x11, 0xbd, 0x13,
+    0xd5, 0xad, 0x93, 0xc3, 0xe1, 0x44, 0xfb, 0xee, 0x7d, 0x50, 0x56, 0x2d,
+    0x67, 0x07, 0x36, 0x38, 0x48, 0x7d, 0xa0, 0x82, 0xaf, 0xe6, 0xe1, 0xfb,
+    0x9d, 0x2f, 0x8f, 0x61, 0x70, 0x6d, 0x88, 0x0e, 0xbc, 0x79, 0x00, 0xea,
+    0x03, 0x15, 0xd2, 0x4a, 0x09, 0xae, 0xbe, 0x5e, 0x96, 0xd6, 0xd3, 0xdb,
+    0x17, 0x86, 0x7c, 0xdd, 0xaf, 0x19, 0x4e, 0x3a, 0x49, 0x2b, 0x25, 0xd8,
+    0x9e, 0xb7, 0xa0, 0xfd, 0xd5, 0xf6, 0xac, 0x8e, 0xe3, 0x3b, 0xcf, 0xd3,
+    0xc1, 0xbe, 0xa3, 0x00, 0x80, 0xae, 0x13, 0x5d, 0xc0, 0xfa, 0x7a, 0x16,
+    0xfd, 0xfd, 0x69, 0xea, 0xfe, 0xa0, 0x5b, 0xcb, 0x2b, 0x08, 0x66, 0x6d,
+    0x06, 0x39, 0xfd, 0x5a, 0x17, 0xa2, 0xcd, 0xf5, 0xba, 0x1d, 0x9f, 0xd6,
+    0x5b, 0x2f, 0x9d, 0x3f, 0x71, 0x16, 0xe1, 0xf5, 0x6b, 0x98, 0xed, 0xda,
+    0x4d, 0x6a, 0x3d, 0xb6, 0x3f, 0x6b, 0x46, 0x4a, 0x27, 0xbe, 0x9a, 0x87,
+    0xc7, 0xe1, 0x81, 0x6b, 0xb7, 0x53, 0x5b, 0x13, 0x18, 0xd1, 0x8f, 0xaf,
+    0xe6, 0xb5, 0xfa, 0xa6, 0xf5, 0xf3, 0x10, 0x51, 0xf7, 0xfb, 0x5e, 0xf8,
+    0x2f, 0xf5, 0xe7, 0x95, 0x25, 0x08, 0x66, 0xb4, 0x6d, 0x6d, 0x83, 0x73,
+    0xbb, 0x0d, 0xe1, 0x99, 0x38, 0xfe, 0x62, 0x6d, 0xe4, 0x11, 0x91, 0xe9,
+    0x98, 0xbf, 0x6c, 0x26, 0x14, 0x79, 0xa7, 0x6e, 0xc5, 0x81, 0x94, 0x0f,
+    0xdb, 0x73, 0x07, 0xa9, 0x12, 0x2a, 0x60, 0xd8, 0x4c, 0x6c, 0x0d, 0x03,
+    0x89, 0x69, 0xa2, 0x52, 0x67, 0x18, 0x3c, 0xab, 0xb3, 0x07, 0xd0, 0x68,
+    0x50, 0xc1, 0x91, 0x2d, 0x2e, 0xda, 0xd7, 0xd0, 0x02, 0xac, 0x34, 0xa3,
+    0xf1, 0x49, 0xa9, 0xe4, 0x88, 0x4f, 0x4f, 0x99, 0x7c, 0x35, 0x8f, 0xd3,
+    0x6f, 0x77, 0xa1, 0x4e, 0xa8, 0x43, 0x62, 0x71, 0x02, 0x07, 0x4e, 0x1d,
+    0xc5, 0x68, 0x50, 0x41, 0x30, 0x18, 0x80, 0x7c, 0x3d, 0x82, 0xd0, 0x7d,
+    0x22, 0xf1, 0x25, 0x0f, 0x64, 0xc8, 0x50, 0x1f, 0xa8, 0xf0, 0xfc, 0x76,
+    0x17, 0x0e, 0xe4, 0xc8, 0x0b, 0x1d, 0xf3, 0x69, 0x9d, 0x94, 0xf8, 0x87,
+    0x0a, 0x11, 0x40, 0xa4, 0xf3, 0x38, 0xf5, 0xcc, 0x0c, 0x2c, 0x11, 0x22,
+    0x38, 0xa1, 0x0a, 0x4e, 0xc9, 0x06, 0x45, 0x55, 0x90, 0xbc, 0x03, 0xc8,
+    0x77, 0x64, 0x44, 0xef, 0x44, 0xd1, 0xd3, 0xd7, 0x8b, 0xf3, 0xd7, 0x6e,
+    0x52, 0x7a, 0x51, 0xd4, 0xda, 0x77, 0x54, 0x63, 0xc4, 0xa9, 0x78, 0x12,
+    0x71, 0x00, 0x89, 0xbb, 0xd9, 0x9d, 0x5c, 0x15, 0xe7, 0xb4, 0x7f, 0x0f,
+    0xde, 0x0d, 0xc0, 0x59, 0xa0, 0x9e, 0x1d, 0xaf, 0x1f, 0xc1, 0xae, 0x37,
+    0x5b, 0x91, 0xeb, 0xe3, 0xb7, 0x34, 0x78, 0x50, 0xf7, 0x6c, 0x1d, 0xe2,
+    0x00, 0xb6, 0xfd, 0x7a, 0x07, 0x44, 0x88, 0x10, 0x04, 0x33, 0xba, 0x5e,
+    0x3f, 0x8e, 0x64, 0x75, 0x12, 0x22, 0x2f, 0xe2, 0xc0, 0xa9, 0xa3, 0x08,
+    0x06, 0x03, 0xe8, 0xbc, 0xd4, 0x89, 0xd0, 0xf5, 0x10, 0xec, 0x33, 0x72,
+    0x8d, 0xe8, 0x67, 0x7a, 0x60, 0x82, 0x0a, 0x55, 0xd3, 0xef, 0xc8, 0x38,
+    0x91, 0xdd, 0x31, 0xcb, 0xf8, 0x36, 0xc1, 0x06, 0xf3, 0x3a, 0x33, 0x2c,
+    0x4f, 0x4a, 0xe8, 0xfd, 0x53, 0x3f, 0x92, 0x77, 0x92, 0xd8, 0xff, 0x41,
+    0x3b, 0xf8, 0x3e, 0x1e, 0xa1, 0x19, 0xa6, 0xd7, 0x98, 0xd6, 0x77, 0x71,
+    0x98, 0x7a, 0x64, 0x14, 0xe9, 0xca, 0x02, 0x28, 0xa8, 0xa0, 0x3d, 0xfa,
+    0x86, 0xeb, 0x09, 0x27, 0xd0, 0xf3, 0x69, 0xa0, 0x3c, 0x79, 0x45, 0xf0,
+    0x70, 0x83, 0x0b, 0xe6, 0xb5, 0x4b, 0x4b, 0x4e, 0x31, 0xb6, 0x6b, 0x37,
+    0x69, 0xdb, 0xaf, 0x77, 0xe8, 0xea, 0x94, 0x4e, 0x7c, 0x35, 0x0f, 0x69,
+    0xa5, 0x08, 0xe7, 0x06, 0x27, 0x9a, 0x1b, 0x9a, 0xb3, 0x18, 0xcd, 0x33,
+    0x4e, 0x14, 0xf9, 0x2a, 0xa2, 0xeb, 0xe3, 0xb6, 0x3e, 0x6f, 0xa1, 0xb4,
+    0x8c, 0xa1, 0x8f, 0xaf, 0xa2, 0xf7, 0xd3, 0x7e, 0x64, 0x32, 0xc9, 0xd5,
+    0x8b, 0x03, 0x1a, 0xf3, 0xa4, 0x5d, 0x95, 0x74, 0x3a, 0x7f, 0xe2, 0x2c,
+    0x14, 0x55, 0xc1, 0xfe, 0xb7, 0x0f, 0x6a, 0x3a, 0xec, 0xdb, 0xed, 0x81,
+    0xb9, 0x79, 0x47, 0x56, 0x39, 0x92, 0x6f, 0x88, 0x76, 0x9d, 0x6c, 0xd5,
+    0xf2, 0x0d, 0xf4, 0x0c, 0x20, 0xb0, 0xb6, 0x86, 0x75, 0x66, 0x94, 0xbd,
+    0x6f, 0xf7, 0x3e, 0x48, 0x7b, 0x77, 0x31, 0x5f, 0x8e, 0xff, 0x0e, 0xa4,
+    0x98, 0xba, 0x65, 0x7b, 0x13, 0xaa, 0x5e, 0xda, 0xc2, 0x62, 0xbe, 0xb3,
+    0x14, 0xfa, 0x8b, 0x8a, 0xa4, 0x1a, 0x01, 0x00, 0x58, 0x9f, 0xb7, 0x63,
+    0xdf, 0x1e, 0x0f, 0xbc, 0x8c, 0xb1, 0xdc, 0x72, 0x1a, 0xb7, 0x36, 0x42,
+    0x7c, 0xeb, 0x60, 0xc9, 0x76, 0xf0, 0x4c, 0x12, 0xd5, 0xad, 0x9f, 0xad,
+    0x57, 0x7a, 0xd1, 0x55, 0xae, 0x7e, 0x9b, 0xb7, 0x6e, 0x86, 0x67, 0x8f,
+    0x07, 0xe9, 0xe7, 0x0e, 0x87, 0x13, 0xd6, 0xe3, 0x9d, 0x59, 0xfd, 0x1b,
+    0x38, 0x74, 0x98, 0xfa, 0x2f, 0xa5, 0x16, 0x8a, 0x36, 0x8b, 0x05, 0xf6,
+    0x0f, 0x7a, 0xd8, 0x22, 0x11, 0xa9, 0x1d, 0xaf, 0xfe, 0x18, 0xa0, 0x31,
+    0x62, 0x39, 0x98, 0xe4, 0x71, 0xeb, 0x6f, 0xb9, 0x26, 0x91, 0x4a, 0x5d,
+    0x2b, 0x4c, 0xf3, 0x1a, 0xc7, 0xed, 0xbc, 0x32, 0x08, 0x0f, 0x95, 0x8e,
+    0xdf, 0x86, 0xd7, 0xaf, 0x61, 0xb7, 0xae, 0x45, 0xd0, 0xb2, 0xbd, 0x09,
+    0xae, 0x75, 0x2e, 0x00, 0x29, 0x46, 0xcb, 0x4c, 0xa6, 0x07, 0x26, 0x84,
+    0x65, 0x19, 0x47, 0x4f, 0x76, 0xa2, 0x6e, 0xbd, 0x15, 0xc2, 0xc7, 0x57,
+    0x35, 0xb9, 0xde, 0x65, 0x8c, 0x65, 0x76, 0x14, 0x1f, 0x19, 0x26, 0x69,
+    0x70, 0x88, 0x8e, 0x6c, 0x71, 0x69, 0x9d, 0x22, 0x42, 0x04, 0x54, 0x60,
+    0xdf, 0x1e, 0x0f, 0xf8, 0x6a, 0x5e, 0x93, 0x1f, 0xf9, 0xaf, 0xe8, 0xec,
+    0x14, 0x7c, 0xea, 0x88, 0x56, 0x9e, 0x4d, 0xb0, 0x21, 0xbc, 0x7e, 0x0d,
+    0xeb, 0x7c, 0x7f, 0x50, 0xcb, 0xaf, 0x67, 0xb0, 0x22, 0x80, 0x68, 0x73,
+    0x3d, 0x6b, 0x7b, 0xa5, 0x4d, 0xcb, 0xdb, 0xf1, 0x51, 0x67, 0x8e, 0xf6,
+    0x40, 0xad, 0x49, 0x4c, 0xbd, 0xcf, 0x8b, 0x59, 0xf5, 0x3b, 0xfe, 0x7a,
+    0x07, 0x5c, 0x7d, 0xbd, 0x2c, 0xed, 0xa3, 0x1f, 0x3d, 0xd9, 0x89, 0x60,
+    0xd0, 0x8b, 0xb8, 0xac, 0x22, 0x2c, 0xcb, 0xe8, 0xfe, 0xa0, 0x1b, 0xbe,
+    0x5e, 0x1f, 0x44, 0x00, 0x92, 0x24, 0x69, 0xf2, 0x44, 0x88, 0x68, 0xdb,
+    0xba, 0x2f, 0x4b, 0x8f, 0xdc, 0x76, 0xb0, 0x44, 0x26, 0x48, 0x1a, 0x1c,
+    0x22, 0xe7, 0xcb, 0x9b, 0xb3, 0xda, 0x53, 0x51, 0x95, 0x8a, 0xf4, 0xc3,
+    0x1d, 0x68, 0x06, 0x2b, 0x42, 0x44, 0xfc, 0xab, 0x18, 0x9c, 0x37, 0xc6,
+    0x88, 0x8f, 0x0c, 0x53, 0xe3, 0xc8, 0x04, 0x89, 0xd7, 0xc6, 0x28, 0x19,
+    0x4f, 0x6a, 0xcf, 0xc3, 0xb2, 0x0c, 0xcf, 0x24, 0xd1, 0x62, 0x05, 0xc0,
+    0xc0, 0x28, 0x52, 0xe1, 0x2d, 0xcc, 0x4c, 0xc9, 0x65, 0xe2, 0x8e, 0x4f,
+    0xcd, 0x88, 0x34, 0xe5, 0x87, 0x0f, 0xaa, 0x9e, 0x00, 0x8e, 0xaf, 0x33,
+    0x61, 0xff, 0xa7, 0xa8, 0x48, 0x6e, 0x2e, 0xaa, 0x10, 0xe1, 0xfb, 0x42,
+    0x31, 0xc4, 0xcb, 0xde, 0xa5, 0x8c, 0x59, 0x67, 0xfe, 0x76, 0x01, 0x90,
+    0xc6, 0x06, 0x88, 0x4b, 0x72, 0x90, 0xbf, 0x8a, 0x62, 0x2a, 0x9a, 0x44,
+    0xcf, 0x67, 0x5e, 0xe0, 0xce, 0xac, 0xae, 0xfb, 0x8f, 0xb5, 0xe3, 0xd6,
+    0x38, 0x91, 0x77, 0x19, 0x63, 0xb6, 0x6b, 0x37, 0xa9, 0xfb, 0x52, 0x0f,
+    0xe4, 0xeb, 0x91, 0xd4, 0xb4, 0x95, 0xe1, 0x23, 0x6b, 0x1d, 0x05, 0x05,
+    0xe0, 0x53, 0x8b, 0xb3, 0xc6, 0xce, 0xe3, 0xd4, 0xd3, 0xd7, 0x0b, 0x00,
+    0x38, 0xfa, 0xde, 0x11, 0x84, 0x88, 0x48, 0xb9, 0xa3, 0x20, 0xb0, 0xc7,
+    0xa3, 0xbd, 0xdf, 0xb8, 0xc7, 0x85, 0xaa, 0xcb, 0xef, 0x21, 0x1e, 0x0f,
+    0x6b, 0xf9, 0x9b, 0x9b, 0x9a, 0xe1, 0x6d, 0xde, 0xa1, 0xab, 0x3f, 0x2c,
+    0x22, 0xf0, 0x51, 0x2a, 0xaf, 0x7c, 0x3d, 0x82, 0xdc, 0x55, 0xc3, 0x68,
+    0x42, 0x81, 0x04, 0x20, 0xa4, 0x2a, 0xb3, 0xfa, 0x00, 0x88, 0xbf, 0xbc,
+    0x31, 0x8b, 0xa9, 0x1a, 0xb7, 0x36, 0x22, 0xf6, 0x55, 0xea, 0x99, 0x00,
+    0x0b, 0x38, 0xde, 0x94, 0x9a, 0x59, 0xb0, 0x03, 0x16, 0x3e, 0xbf, 0x3e,
+    0xb9, 0x33, 0x56, 0x76, 0x3b, 0x6c, 0xcc, 0x6b, 0x07, 0x20, 0x65, 0x98,
+    0xfd, 0x39, 0xff, 0x67, 0x44, 0xbf, 0xc4, 0xe2, 0x44, 0x76, 0xf9, 0x77,
+    0x66, 0x5d, 0x33, 0xbd, 0xf6, 0xe6, 0xab, 0x79, 0x4c, 0x7d, 0x3d, 0x95,
+    0xf2, 0x69, 0xdb, 0x83, 0x73, 0xf3, 0x39, 0xe5, 0xbb, 0x21, 0x00, 0x6e,
+    0xdd, 0xc2, 0xda, 0x6d, 0x22, 0x00, 0x11, 0xfb, 0xaf, 0x63, 0x4e, 0x3e,
+    0x6d, 0x1a, 0xfb, 0xbf, 0x34, 0xc1, 0x85, 0xe2, 0x06, 0xab, 0x87, 0xc8,
+    0xd8, 0x40, 0x88, 0x03, 0xd8, 0x07, 0x60, 0xea, 0xe2, 0x65, 0x7a, 0xef,
+    0xed, 0x1e, 0xad, 0x41, 0xbb, 0x2f, 0x78, 0xc1, 0xbd, 0x7b, 0x56, 0x73,
+    0x2d, 0xd2, 0x3e, 0xad, 0xfd, 0x59, 0x3b, 0x60, 0x06, 0x7c, 0xbd, 0x3e,
+    0xf4, 0x9e, 0xec, 0xd7, 0xde, 0x4f, 0x33, 0x8c, 0x67, 0x7b, 0x3b, 0xd2,
+    0x46, 0x6b, 0x7a, 0x60, 0x42, 0xdd, 0xba, 0x59, 0x13, 0x13, 0x21, 0x62,
+    0x4a, 0x48, 0x66, 0x44, 0x27, 0x66, 0x7d, 0xc8, 0x88, 0x1c, 0x29, 0xec,
+    0xe2, 0x80, 0x9f, 0xcd, 0x5f, 0x9d, 0xd4, 0x98, 0x2c, 0x9d, 0x3f, 0x93,
+    0xc9, 0xc2, 0x90, 0x33, 0xca, 0xcb, 0x59, 0x54, 0xbe, 0x75, 0x30, 0x8f,
+    0xc9, 0xbd, 0xc7, 0x53, 0xcc, 0x9d, 0xd2, 0x5f, 0xcc, 0xab, 0x8f, 0x82,
+    0x54, 0xfc, 0x36, 0xed, 0xd3, 0x72, 0x42, 0x15, 0xce, 0xbf, 0xdd, 0x85,
+    0xba, 0x15, 0x75, 0x5a, 0x3b, 0x1c, 0x3d, 0xd9, 0xa9, 0xe9, 0x03, 0x15,
+    0x95, 0xe9, 0x97, 0x53, 0x7e, 0xe3, 0xd6, 0x46, 0xb4, 0xbd, 0xb2, 0xaf,
+    0xe8, 0x9a, 0x23, 0xfc, 0xd8, 0x52, 0x2c, 0x92, 0xee, 0x4f, 0x92, 0x1c,
+    0x4f, 0xcc, 0x99, 0x09, 0xfd, 0xd1, 0xfc, 0x15, 0x66, 0x3a, 0xb5, 0xdb,
+    0x80, 0xf3, 0x3f, 0x31, 0x03, 0x5c, 0xe5, 0xf2, 0xd3, 0xd8, 0x1f, 0x8d,
+    0x94, 0x74, 0x11, 0x3c, 0xe3, 0x44, 0x7c, 0x64, 0x98, 0x4a, 0xbd, 0x67,
+    0xff, 0xa1, 0x3d, 0x6b, 0x11, 0x32, 0xf5, 0x20, 0x81, 0xce, 0x8f, 0x52,
+    0x9d, 0xc1, 0x57, 0xf3, 0x08, 0x05, 0x03, 0x88, 0xba, 0xea, 0x59, 0xa0,
+    0x86, 0x31, 0x2f, 0x63, 0xcc, 0xdc, 0xbc, 0x83, 0x4d, 0x09, 0xc9, 0xd9,
+    0x0e, 0xe0, 0x53, 0x1d, 0x13, 0xa8, 0x61, 0xac, 0x71, 0x6b, 0x63, 0xaa,
+    0xe3, 0x33, 0xe4, 0xa5, 0xff, 0x6e, 0xdb, 0xda, 0xa6, 0x95, 0x2b, 0x64,
+    0xd0, 0x9b, 0xb7, 0xaf, 0xb7, 0xe0, 0x40, 0x3b, 0x78, 0xea, 0xa8, 0x96,
+    0xbf, 0x79, 0x5d, 0x93, 0x26, 0x35, 0x2d, 0x7f, 0x34, 0xa1, 0x68, 0x1d,
+    0x9f, 0x5d, 0x5e, 0x19, 0x03, 0x9a, 0xcf, 0xd9, 0x68, 0x99, 0xa9, 0x8f,
+    0xf3, 0xc6, 0x98, 0xb6, 0xe1, 0x90, 0xa8, 0x4e, 0x20, 0x70, 0x69, 0x00,
+    0xe1, 0xf5, 0x6b, 0xb4, 0x76, 0x68, 0x6e, 0x6a, 0xce, 0xaa, 0x5f, 0x9a,
+    0xa1, 0xcb, 0xd5, 0xcf, 0x6a, 0xb1, 0x66, 0x95, 0xef, 0x69, 0xf0, 0x14,
+    0x34, 0x58, 0x69, 0x6c, 0x4c, 0x3b, 0x4c, 0xb5, 0x28, 0x12, 0xaf, 0xc2,
+    0x9c, 0x7d, 0xce, 0x1f, 0xc4, 0xe0, 0x96, 0x8a, 0xef, 0x2e, 0xb8, 0x25,
+    0x33, 0xe8, 0x55, 0x2b, 0x0e, 0xff, 0xc4, 0x39, 0xe7, 0xf2, 0x7c, 0x5f,
+    0x14, 0x37, 0xd8, 0x3a, 0x97, 0x15, 0x07, 0xf7, 0x1c, 0x45, 0xdd, 0x3a,
+    0x2b, 0x12, 0x47, 0xbb, 0x28, 0xe6, 0x3b, 0x4b, 0x8d, 0x23, 0x13, 0xe4,
+    0xbc, 0x4f, 0xe4, 0x19, 0x27, 0xc2, 0xb5, 0x21, 0xc2, 0xbb, 0x67, 0xa9,
+    0xfe, 0xe5, 0xd9, 0xe9, 0xce, 0x26, 0xd8, 0xe0, 0x5e, 0x37, 0xdb, 0x19,
+    0xa6, 0x07, 0x26, 0x24, 0xe4, 0xc4, 0xac, 0xdc, 0x49, 0x22, 0xff, 0xfe,
+    0x36, 0x4a, 0x87, 0x64, 0x32, 0x19, 0x46, 0x01, 0x70, 0x64, 0xff, 0x81,
+    0xac, 0xfa, 0xa6, 0x7d, 0x38, 0xbe, 0x9a, 0xc7, 0xe6, 0xed, 0x4e, 0xed,
+    0xbd, 0x8e, 0xdf, 0x74, 0x68, 0xcf, 0x83, 0xc1, 0x00, 0x12, 0x47, 0xbb,
+    0xc8, 0x79, 0x9b, 0xb4, 0x0e, 0x71, 0xde, 0x18, 0xa3, 0xee, 0xed, 0x4d,
+    0x94, 0xbc, 0x93, 0xd4, 0xf2, 0x7b, 0x76, 0x37, 0x1b, 0xf6, 0x19, 0xcb,
+    0x99, 0x81, 0x90, 0x11, 0xf1, 0xca, 0xac, 0xcf, 0xad, 0xd1, 0x08, 0x32,
+    0x7d, 0xd6, 0xcc, 0x19, 0xc1, 0x33, 0x49, 0xe4, 0x6e, 0x6a, 0x46, 0xa5,
+    0x3e, 0x6d, 0x16, 0xe3, 0x33, 0xc6, 0x0e, 0xbf, 0xfa, 0x86, 0xf6, 0xbc,
+    0xf9, 0x57, 0xcd, 0xb0, 0x5d, 0xbb, 0xa9, 0x11, 0x8d, 0xf3, 0x3e, 0x91,
+    0xf0, 0xf1, 0x55, 0x3a, 0xb0, 0xc1, 0x41, 0xbb, 0x5e, 0x6a, 0x45, 0xba,
+    0x9d, 0x58, 0x4b, 0xa5, 0x51, 0x83, 0x34, 0xfe, 0x20, 0x06, 0xfa, 0xa5,
+    0xbe, 0x1f, 0x52, 0x28, 0xc5, 0x12, 0x40, 0xcd, 0xb9, 0x00, 0x50, 0xe2,
+    0x4b, 0x87, 0x42, 0xd8, 0xb6, 0xc9, 0x09, 0xe9, 0x05, 0xfd, 0x11, 0x69,
+    0xbb, 0x3f, 0x49, 0x3b, 0xf6, 0xee, 0x2a, 0x18, 0x63, 0xd5, 0x4b, 0xd2,
+    0x4a, 0x09, 0x1d, 0x87, 0x8e, 0x40, 0x5c, 0x29, 0xc2, 0xdd, 0xd4, 0x9c,
+    0x95, 0x57, 0x10, 0xcc, 0x48, 0x3e, 0x98, 0xca, 0x8b, 0xa5, 0x02, 0xc8,
+    0xdb, 0xaa, 0xc4, 0xa1, 0xb3, 0xd4, 0x79, 0xa9, 0x33, 0xeb, 0x9d, 0xf4,
+    0x2a, 0x3a, 0x6b, 0xca, 0xbe, 0x31, 0x46, 0x9e, 0xdf, 0xee, 0xd2, 0x8d,
+    0x7f, 0x66, 0x26, 0x41, 0x30, 0xc3, 0x7b, 0xa2, 0x0b, 0xca, 0xaa, 0x54,
+    0x7c, 0xda, 0x9b, 0x11, 0x5b, 0xd5, 0x5b, 0x9d, 0x0b, 0x82, 0x19, 0xcd,
+    0x97, 0x07, 0x8d, 0x6f, 0x30, 0x10, 0x51, 0xa6, 0x2b, 0x73, 0x6b, 0x30,
+    0x02, 0xef, 0x32, 0xc6, 0x3c, 0x94, 0x1d, 0x86, 0x32, 0xda, 0x0e, 0xbe,
+    0x2d, 0x2e, 0x6d, 0x50, 0xeb, 0xe9, 0xc7, 0x57, 0xf3, 0xf0, 0x7c, 0x16,
+    0xcc, 0xd3, 0x2f, 0x91, 0xb1, 0x26, 0x28, 0x94, 0xa4, 0x95, 0x12, 0xfc,
+    0xbd, 0x3e, 0x78, 0x19, 0x63, 0xac, 0xe5, 0xe2, 0x08, 0xf5, 0x94, 0xb3,
+    0x03, 0x96, 0x81, 0xae, 0xa7, 0x80, 0x81, 0x86, 0xc2, 0x1b, 0x0b, 0xa5,
+    0x52, 0x7b, 0xf0, 0x16, 0x3a, 0xbf, 0x48, 0x56, 0xb0, 0x43, 0x66, 0xc2,
+    0x81, 0x5f, 0x14, 0xdf, 0x68, 0x70, 0xde, 0x18, 0x23, 0xff, 0xa7, 0x3e,
+    0x24, 0xe3, 0x49, 0xe4, 0xee, 0xad, 0x2b, 0x50, 0xe0, 0x5a, 0xe7, 0x02,
+    0x27, 0x70, 0x68, 0x72, 0x34, 0x66, 0x1d, 0x0e, 0xf1, 0x10, 0x91, 0xaf,
+    0xd7, 0x07, 0xe5, 0x2f, 0x4a, 0x8a, 0x41, 0x78, 0x11, 0x31, 0xa8, 0x68,
+    0x76, 0x34, 0x82, 0x13, 0x38, 0xc4, 0xee, 0xaa, 0x18, 0x4d, 0x28, 0xb0,
+    0x3c, 0x25, 0xc1, 0xfe, 0x2f, 0x76, 0x04, 0x1e, 0x9b, 0x8d, 0x1b, 0xa7,
+    0xcf, 0x3c, 0x84, 0xfe, 0x27, 0x00, 0x91, 0x17, 0xc1, 0x09, 0x1c, 0xac,
+    0x6d, 0xfb, 0x0b, 0xea, 0x39, 0x75, 0xf1, 0x32, 0xc5, 0x15, 0x55, 0x7b,
+    0x3f, 0x5d, 0x1e, 0x27, 0x70, 0x70, 0xff, 0xa4, 0x39, 0x6f, 0xa3, 0x62,
+    0xea, 0xe2, 0x65, 0x92, 0xff, 0x53, 0x46, 0x0c, 0x2a, 0xba, 0x8f, 0x75,
+    0xc0, 0xcb, 0x18, 0xf3, 0x8c, 0x13, 0x79, 0xde, 0xf0, 0x40, 0xe4, 0x45,
+    0xd8, 0xb7, 0x3a, 0x81, 0xf5, 0xf5, 0x65, 0x6f, 0xa4, 0x0c, 0x86, 0x07,
+    0x61, 0x79, 0x4a, 0x42, 0xd4, 0x55, 0x9f, 0xd5, 0x0e, 0xdd, 0xef, 0x7b,
+    0x91, 0xb8, 0x1b, 0xd3, 0xf4, 0x4a, 0x56, 0x03, 0xae, 0x75, 0x4e, 0x48,
+    0x82, 0x84, 0xd0, 0x5d, 0x59, 0x6b, 0x87, 0x74, 0xbe, 0x2c, 0xfd, 0x0e,
+    0x75, 0xc0, 0xbb, 0x34, 0x5b, 0x3f, 0xcb, 0x8f, 0x2d, 0x05, 0x77, 0x1e,
+    0xd3, 0x87, 0x9b, 0x32, 0xcb, 0x53, 0x54, 0x05, 0xf6, 0x1f, 0x3a, 0xe1,
+    0xb4, 0x38, 0xa1, 0xac, 0x9f, 0x5d, 0x93, 0x30, 0x1c, 0x3a, 0x4f, 0x65,
+    0x33, 0x6c, 0xb5, 0x84, 0xf3, 0x9b, 0x4c, 0x25, 0x5d, 0x02, 0x23, 0x29,
+    0xa4, 0x24, 0x50, 0x7f, 0x25, 0x06, 0xfc, 0x3d, 0x6a, 0xb8, 0x7c, 0x9e,
+    0x13, 0xd1, 0xf1, 0xef, 0xcf, 0x3d, 0xd2, 0x87, 0x5b, 0x16, 0xf0, 0xe1,
+    0xe1, 0xa2, 0x72, 0x7d, 0xca, 0x5f, 0xfe, 0xd8, 0x09, 0xda, 0x5d, 0x37,
+    0x2f, 0x06, 0x0b, 0x00, 0x76, 0xd1, 0x04, 0x7a, 0xa5, 0x0e, 0x8d, 0xeb,
+    0xec, 0x86, 0xf5, 0x50, 0x93, 0xc5, 0xc3, 0x5e, 0xce, 0x69, 0x22, 0xe1,
+    0x36, 0xd1, 0xe0, 0x27, 0x13, 0xe4, 0xbb, 0x38, 0x42, 0x83, 0x9f, 0x0c,
+    0x93, 0x70, 0x9b, 0xc8, 0x39, 0x4d, 0x0b, 0x5f, 0x46, 0xfc, 0x3f, 0xc0,
+    0xc5, 0x86, 0x57, 0xef, 0x49, 0x63, 0xa7, 0xb9, 0x2a, 0x4a, 0xdf, 0x07,
+    0xfc, 0x9b, 0xcc, 0xe8, 0x16, 0x5c, 0xb3, 0xe7, 0x6d, 0x4b, 0xe8, 0x53,
+    0xb4, 0x62, 0xa7, 0x6e, 0x61, 0x54, 0x9d, 0x65, 0xee, 0x20, 0x44, 0x74,
+    0x86, 0xfd, 0xb0, 0x08, 0x56, 0xec, 0x9b, 0x63, 0x83, 0xd9, 0xa6, 0x89,
+    0xa4, 0x24, 0xa0, 0xa8, 0x09, 0x34, 0x09, 0xfa, 0x1f, 0x65, 0x7a, 0x88,
+    0x28, 0xf4, 0xd7, 0x04, 0x5c, 0xbc, 0x09, 0x8a, 0x9a, 0x80, 0xf8, 0xf4,
+    0xe3, 0xf3, 0x76, 0x7a, 0xcc, 0x36, 0x4d, 0x04, 0x9d, 0xad, 0x6c, 0xee,
+    0xde, 0x04, 0x71, 0x2a, 0x97, 0x8a, 0x8b, 0xf2, 0x22, 0x04, 0x4e, 0x85,
+    0xb8, 0x6a, 0xee, 0xe7, 0x84, 0xa3, 0x9f, 0x8f, 0x50, 0x24, 0xc9, 0xc3,
+    0xa7, 0xc8, 0xf0, 0x58, 0x6c, 0x10, 0x84, 0x24, 0xb0, 0x6c, 0xb6, 0x3e,
+    0x53, 0xb7, 0xc7, 0xc8, 0x17, 0x4e, 0x66, 0xe5, 0x74, 0x5a, 0x6c, 0x70,
+    0xd5, 0x02, 0xa8, 0xe0, 0x9b, 0x3f, 0x61, 0x7c, 0x82, 0x42, 0x71, 0x0e,
+    0x3e, 0x39, 0xac, 0x3d, 0x31, 0x99, 0x25, 0x74, 0xfd, 0x88, 0xd7, 0xe4,
+    0x31, 0xbc, 0x3b, 0x4c, 0x25, 0x7d, 0xc9, 0xc5, 0x31, 0x4c, 0xee, 0xde,
+    0x8c, 0xaa, 0xef, 0x19, 0xb1, 0xc0, 0xb9, 0x25, 0x7f, 0x14, 0xd8, 0x76,
+    0xae, 0xf4, 0x19, 0x88, 0xab, 0x6f, 0x6d, 0x2b, 0xd8, 0x20, 0x1b, 0x0f,
+    0x9d, 0xa7, 0x4a, 0xf2, 0x19, 0xc1, 0xc1, 0x8f, 0x47, 0xa8, 0x3f, 0x3a,
+    0xbb, 0x06, 0x98, 0xfc, 0x4d, 0xf6, 0x79, 0x5f, 0xdb, 0x38, 0xd1, 0x9a,
+    0x53, 0xf9, 0xfa, 0x77, 0x6d, 0x72, 0x82, 0x2b, 0xb0, 0x78, 0x34, 0x82,
+    0xe9, 0xb3, 0x21, 0x2a, 0x27, 0xc2, 0xc2, 0x99, 0xd0, 0xb1, 0x77, 0x79,
+    0x96, 0x2f, 0xcd, 0xce, 0xe4, 0x9f, 0x53, 0x1e, 0x6a, 0xb0, 0x22, 0xf9,
+    0x74, 0xe5, 0xf7, 0x4d, 0x44, 0x3f, 0x27, 0x6a, 0x0d, 0x67, 0xcb, 0xe5,
+    0x05, 0x11, 0x1d, 0x7b, 0x67, 0x5d, 0xb3, 0xe8, 0x27, 0x63, 0xd4, 0x19,
+    0x0e, 0xe9, 0xf6, 0x53, 0x9b, 0x04, 0xb8, 0x5e, 0x34, 0x76, 0xdc, 0xd3,
+    0x43, 0x44, 0xee, 0x73, 0x21, 0xf4, 0xc7, 0xf4, 0x4f, 0x03, 0x8e, 0xbd,
+    0xe6, 0xc6, 0xe0, 0x63, 0xa9, 0x76, 0x5e, 0x64, 0x84, 0x61, 0xc7, 0xb6,
+    0x7f, 0x33, 0x06, 0x0b, 0x00, 0x6e, 0x09, 0x38, 0xff, 0x33, 0xf7, 0x9c,
+    0x98, 0xb6, 0x62, 0x86, 0x36, 0x80, 0xfd, 0xd1, 0x48, 0x96, 0xbc, 0xce,
+    0x3f, 0xdf, 0xca, 0x7a, 0x7e, 0xf0, 0xb3, 0x90, 0x6e, 0xb9, 0xad, 0x57,
+    0x02, 0xf0, 0x7d, 0x38, 0x42, 0xb6, 0x0a, 0x5d, 0x94, 0xee, 0xeb, 0x0a,
+    0xd4, 0x64, 0x4a, 0x9e, 0x1c, 0x4f, 0x64, 0x3d, 0x8f, 0x01, 0xba, 0xf5,
+    0x0d, 0xa8, 0x53, 0x73, 0xaa, 0x6f, 0x82, 0x9b, 0xca, 0x93, 0xab, 0xc6,
+    0x95, 0xac, 0x4f, 0xa1, 0x0e, 0x6f, 0x30, 0xc3, 0x51, 0x6b, 0xd5, 0x2d,
+    0xbf, 0x33, 0x0c, 0xb4, 0xff, 0xfe, 0x6a, 0xc9, 0x78, 0x79, 0xd3, 0x34,
+    0x91, 0xf8, 0xbb, 0x01, 0xf4, 0x47, 0x39, 0x5d, 0x39, 0x5d, 0x9b, 0x9c,
+    0x9a, 0xc1, 0x2a, 0x30, 0xe0, 0xd3, 0x0e, 0xbf, 0xe2, 0x86, 0xd9, 0x54,
+    0xda, 0xd8, 0xca, 0x49, 0xb7, 0xfe, 0x06, 0xb8, 0xaf, 0xc4, 0xe0, 0x2f,
+    0x10, 0x95, 0xd2, 0x0c, 0xb7, 0x88, 0x5e, 0xc5, 0x1a, 0xbc, 0xd2, 0x7c,
+    0x46, 0x30, 0x4f, 0x1e, 0x2f, 0xe6, 0x74, 0xb4, 0xb9, 0x60, 0xf9, 0xc1,
+    0xd1, 0x08, 0xea, 0xff, 0xa8, 0x40, 0x18, 0x2f, 0xdf, 0x70, 0x79, 0x4e,
+    0x28, 0x5c, 0x0f, 0x35, 0x5f, 0xaf, 0x14, 0x43, 0xcd, 0x6d, 0x80, 0xa2,
+    0x80, 0x5c, 0x39, 0x3e, 0xfb, 0x5e, 0x78, 0x09, 0x63, 0xcd, 0xbf, 0x58,
+    0xce, 0x2e, 0x6f, 0x77, 0x83, 0xe7, 0xf2, 0xeb, 0x9d, 0xfe, 0xe6, 0x4f,
+    0xba, 0xa7, 0x6f, 0xb8, 0xc2, 0x6d, 0xa2, 0x9a, 0x93, 0x7e, 0x8c, 0x22,
+    0xbf, 0xdd, 0x6a, 0xf9, 0x18, 0xc6, 0x5e, 0x73, 0xe7, 0xcd, 0x50, 0x8b,
+    0x6a, 0x11, 0x43, 0x21, 0x66, 0xb2, 0xac, 0xb0, 0x3f, 0x14, 0x1f, 0xb6,
+    0xee, 0x09, 0xa0, 0xff, 0x7a, 0x08, 0xdb, 0xce, 0x45, 0xc0, 0xde, 0x1b,
+    0x40, 0x47, 0x14, 0x88, 0xfd, 0x63, 0x2a, 0xeb, 0x1d, 0xb7, 0x04, 0xb8,
+    0x7e, 0xec, 0xd4, 0xd7, 0x4b, 0xb0, 0x7e, 0x6b, 0x4c, 0x9b, 0x27, 0x4f,
+    0xcd, 0x36, 0x20, 0x24, 0xf4, 0xcb, 0x4d, 0xa3, 0x1c, 0x8d, 0xa0, 0xfe,
+    0x4c, 0x04, 0xdc, 0xbd, 0x89, 0xf2, 0x0c, 0xb7, 0x58, 0x3d, 0xf8, 0x7c,
+    0xbd, 0xa0, 0x2a, 0x10, 0xf9, 0xca, 0xeb, 0x59, 0xae, 0xdc, 0xf8, 0x2a,
+    0xc6, 0xc6, 0x5e, 0x73, 0xc3, 0xc2, 0xa9, 0x79, 0xef, 0xab, 0x49, 0x11,
+    0xf5, 0x67, 0xfc, 0x38, 0xf2, 0xee, 0x4d, 0x0a, 0x5d, 0xbb, 0x49, 0xb1,
+    0x1b, 0x93, 0x34, 0xf8, 0xc9, 0x30, 0x1d, 0x79, 0xf7, 0x26, 0x6d, 0xe9,
+    0xf3, 0x6b, 0x33, 0x48, 0x66, 0xbe, 0x36, 0x09, 0x50, 0x7e, 0xb5, 0x39,
+    0x8b, 0x61, 0x35, 0xa6, 0x75, 0x8a, 0x33, 0x1f, 0x21, 0xe6, 0x8e, 0x28,
+    0x41, 0x44, 0x64, 0x6b, 0xbe, 0xc5, 0x06, 0x14, 0x60, 0xf3, 0x85, 0x04,
+    0xd8, 0x39, 0x05, 0xec, 0x98, 0x1f, 0xec, 0x77, 0x11, 0xb0, 0x3f, 0x14,
+    0x0f, 0x92, 0xeb, 0xa6, 0x15, 0x52, 0xaa, 0x9c, 0xaf, 0xcd, 0xd8, 0x7f,
+    0xce, 0x8f, 0x9a, 0x33, 0x51, 0xb0, 0x3f, 0x84, 0x30, 0xf5, 0xbf, 0xb3,
+    0xaf, 0x0c, 0x3c, 0x6f, 0x02, 0x9e, 0x94, 0xf2, 0xf4, 0x13, 0x4d, 0xdc,
+    0x23, 0xcb, 0xb4, 0xa2, 0x49, 0xbf, 0xdc, 0xdc, 0xe8, 0x47, 0xfd, 0x05,
+    0x05, 0xb1, 0x1b, 0x65, 0x30, 0x6e, 0x91, 0x7a, 0x14, 0x62, 0xc4, 0xdc,
+    0x01, 0x55, 0x36, 0xaa, 0x05, 0xea, 0x51, 0x80, 0xc1, 0x7b, 0x97, 0x30,
+    0xd6, 0xb1, 0x77, 0x23, 0x3b, 0xec, 0x90, 0x74, 0xf3, 0x8d, 0xaa, 0x51,
+    0x1c, 0x94, 0x93, 0x38, 0x78, 0x61, 0x10, 0x9d, 0x51, 0xa4, 0x16, 0xcb,
+    0x39, 0xef, 0xf1, 0x82, 0x88, 0xb1, 0x9d, 0x56, 0xb8, 0x5e, 0x7c, 0x8e,
+    0x15, 0xfa, 0x52, 0x64, 0x91, 0xc8, 0x4f, 0x41, 0x8f, 0x11, 0x5c, 0x4f,
+    0x20, 0xeb, 0x23, 0xc5, 0xf6, 0xe0, 0x2d, 0xb0, 0x13, 0xb7, 0xb0, 0xf1,
+    0x23, 0x3f, 0x06, 0xbf, 0x50, 0x80, 0x68, 0x04, 0x98, 0x19, 0x21, 0x5d,
+    0xcf, 0x64, 0x1c, 0x17, 0x32, 0x9a, 0x1e, 0xc4, 0xf3, 0xcb, 0x1d, 0xe5,
+    0xb0, 0xf4, 0xa4, 0x1f, 0x91, 0xf4, 0x18, 0xf8, 0x3e, 0xe0, 0x32, 0x25,
+    0xf3, 0xde, 0x6b, 0x5c, 0xcd, 0x3f, 0xb2, 0x4c, 0xab, 0x94, 0x60, 0xda,
+    0x4c, 0xdc, 0x71, 0x21, 0x02, 0xdf, 0xc5, 0x61, 0x63, 0x86, 0x5b, 0xa4,
+    0x1e, 0x28, 0xc0, 0x88, 0xc8, 0x1d, 0x50, 0x65, 0xa2, 0xb6, 0x18, 0xca,
+    0x93, 0x5b, 0x3c, 0x9f, 0x7d, 0xfd, 0x52, 0x36, 0xd4, 0x20, 0x82, 0x2f,
+    0xf3, 0xac, 0x89, 0x45, 0xb0, 0x62, 0x6c, 0xa7, 0x15, 0xd1, 0x12, 0x8b,
+    0xc7, 0x45, 0x8d, 0xab, 0xf5, 0x99, 0xf6, 0xf4, 0x86, 0xd9, 0x9d, 0x2e,
+    0xf6, 0xde, 0x40, 0x6a, 0xe7, 0xea, 0x41, 0xfe, 0xc8, 0x48, 0x85, 0x57,
+    0xaa, 0x50, 0x76, 0x2a, 0xc4, 0x48, 0x9c, 0x88, 0xe7, 0x3e, 0xf0, 0x6b,
+    0xfe, 0x6e, 0xdb, 0xb3, 0xd6, 0xbc, 0xf7, 0x44, 0xbe, 0xea, 0x91, 0x65,
+    0xda, 0xdc, 0x7a, 0x59, 0x24, 0x2b, 0x2e, 0x6f, 0xb7, 0x82, 0xde, 0x74,
+    0xe3, 0xf4, 0x5b, 0xcf, 0xb1, 0xc9, 0xdf, 0xb8, 0x71, 0xd8, 0xc1, 0x81,
+    0x17, 0x52, 0xcf, 0x7b, 0x14, 0xa0, 0xfb, 0xe3, 0xa1, 0x92, 0x8b, 0x95,
+    0x62, 0x4c, 0xfb, 0x4d, 0xfb, 0xb4, 0x8a, 0x01, 0xb9, 0xc9, 0xa7, 0x1f,
+    0x67, 0x63, 0x3b, 0xad, 0x5a, 0x3d, 0x4b, 0xad, 0x9d, 0x6a, 0x6b, 0x25,
+    0x44, 0x76, 0x8a, 0x08, 0x1b, 0xb8, 0x5d, 0x73, 0x51, 0x78, 0x19, 0x63,
+    0x7a, 0x96, 0x9f, 0x5e, 0x7c, 0xb1, 0xf7, 0x06, 0x80, 0xbf, 0x9b, 0x8b,
+    0x8e, 0x10, 0xf7, 0xec, 0x59, 0x62, 0xe3, 0xa9, 0x04, 0x23, 0x6d, 0x3b,
+    0xe7, 0x87, 0xb5, 0x37, 0x86, 0x8d, 0xe9, 0x2f, 0x1f, 0x66, 0xfe, 0x9f,
+    0x4f, 0x2a, 0x25, 0xc3, 0x38, 0xdf, 0x26, 0xd3, 0xe6, 0xd6, 0x6b, 0xe8,
+    0x5f, 0x45, 0x54, 0xad, 0x62, 0xda, 0x54, 0xd7, 0xbb, 0x84, 0x31, 0xfb,
+    0xfa, 0x35, 0x6c, 0x6c, 0xa7, 0x15, 0x8d, 0x36, 0x3b, 0xa0, 0x2a, 0xe8,
+    0x8f, 0x72, 0xb0, 0xbe, 0x1f, 0x28, 0x7a, 0x41, 0x89, 0x1c, 0x8f, 0x16,
+    0xae, 0xc7, 0x23, 0xe0, 0xd3, 0xea, 0x0f, 0x70, 0x94, 0x77, 0x4e, 0xfb,
+    0x7b, 0xc6, 0xe4, 0x2e, 0x12, 0x01, 0x34, 0x4a, 0xe6, 0x3c, 0xcb, 0x3f,
+    0x12, 0x4e, 0x80, 0x9d, 0x18, 0x00, 0xbe, 0x2e, 0xbc, 0x1a, 0x06, 0x94,
+    0x19, 0xdf, 0xb4, 0x82, 0x64, 0xc0, 0xf7, 0x93, 0xef, 0x86, 0x80, 0x64,
+    0xf6, 0xdd, 0x61, 0x6d, 0x36, 0x67, 0x69, 0xc3, 0xfa, 0x16, 0x99, 0x36,
+    0xd3, 0xa7, 0x75, 0xd4, 0xaa, 0x05, 0x99, 0x23, 0xbc, 0x84, 0x31, 0xd7,
+    0x8b, 0x35, 0xac, 0x6b, 0x53, 0xea, 0xd4, 0x9b, 0x9c, 0xe4, 0xb1, 0xf4,
+    0x1d, 0x3f, 0x92, 0x9f, 0xa7, 0x4e, 0xa3, 0xa5, 0xdf, 0xf3, 0x10, 0x51,
+    0xf4, 0x73, 0xa2, 0xce, 0x68, 0x76, 0xbd, 0x8c, 0x31, 0xe2, 0x37, 0xeb,
+    0xd3, 0x66, 0xa2, 0xeb, 0x7e, 0x2a, 0x2a, 0x50, 0x8a, 0x61, 0xd3, 0x38,
+    0x0a, 0x73, 0xc9, 0x81, 0xab, 0x31, 0xad, 0x02, 0xa0, 0xeb, 0xa7, 0xf9,
+    0x4c, 0x7a, 0xf0, 0xd3, 0x00, 0xf0, 0xa0, 0x38, 0xc3, 0x02, 0x22, 0xf0,
+    0xb5, 0xfe, 0x17, 0x9d, 0x25, 0x53, 0x19, 0xbe, 0x5f, 0x26, 0x3a, 0x6b,
+    0x0d, 0x18, 0x56, 0x91, 0xfc, 0xd2, 0xfd, 0xc9, 0x39, 0x6d, 0xe5, 0x96,
+    0xeb, 0xd3, 0x96, 0x92, 0xc7, 0xbd, 0xf0, 0x38, 0x1b, 0xda, 0xe9, 0x06,
+    0x3f, 0x73, 0xcf, 0x44, 0xeb, 0x95, 0x00, 0xd8, 0xc9, 0x08, 0x36, 0x1e,
+    0x3a, 0x4f, 0xbb, 0x0e, 0x0d, 0x13, 0x7b, 0xdb, 0x8f, 0xd6, 0x2b, 0x91,
+    0xa2, 0x33, 0xc6, 0xc3, 0xf2, 0x69, 0x55, 0xae, 0x40, 0xff, 0x17, 0x61,
+    0x5a, 0xdb, 0xcc, 0x65, 0x85, 0x35, 0x27, 0xf5, 0xa3, 0x02, 0xc5, 0x50,
+    0x8e, 0xf3, 0xa8, 0x39, 0xe9, 0x87, 0x70, 0xbb, 0xb8, 0xe1, 0x2e, 0x12,
+    0x01, 0x0c, 0x3e, 0xc6, 0x58, 0x6d, 0x6d, 0xfe, 0x2a, 0xdd, 0x08, 0x1e,
+    0x5e, 0xf9, 0xf0, 0x98, 0x36, 0x17, 0x1d, 0xb5, 0x26, 0x24, 0x0d, 0x6c,
+    0x89, 0x16, 0x93, 0x13, 0x89, 0x57, 0x3d, 0x54, 0xa6, 0xcd, 0xae, 0x97,
+    0x31, 0xb9, 0xd1, 0xa7, 0x53, 0xe1, 0x22, 0xbd, 0x38, 0xa7, 0x91, 0x19,
+    0x23, 0x91, 0xcc, 0xd7, 0x0b, 0xbc, 0x88, 0x80, 0x1c, 0x9f, 0x13, 0xd3,
+    0xfa, 0xd3, 0x3b, 0x5d, 0x39, 0x72, 0xf5, 0xc2, 0x50, 0x22, 0x00, 0xe9,
+    0x1e, 0x51, 0x5d, 0xdf, 0x2d, 0xb4, 0x5e, 0x09, 0xe8, 0xe6, 0xb3, 0x08,
+    0x26, 0x9c, 0x6d, 0x70, 0xe1, 0xb0, 0x83, 0x43, 0xd7, 0x26, 0x27, 0x6a,
+    0xf9, 0x58, 0xde, 0x7b, 0x2a, 0x27, 0x62, 0x4b, 0x9f, 0x1f, 0xa1, 0x8b,
+    0x23, 0x59, 0x33, 0x4e, 0x1e, 0xd3, 0x8a, 0x00, 0x8e, 0x58, 0xaa, 0x50,
+    0x09, 0xf3, 0x85, 0xe3, 0x4a, 0x41, 0xbb, 0x2c, 0x9a, 0x72, 0x76, 0x96,
+    0x8c, 0xa0, 0xaf, 0xc1, 0x18, 0x73, 0x14, 0x93, 0xb3, 0xa5, 0xcf, 0x8f,
+    0xd0, 0xb5, 0x09, 0xe2, 0xee, 0x4d, 0x50, 0x25, 0x97, 0xdc, 0x95, 0xe7,
+    0xd3, 0x1a, 0x97, 0xdb, 0xbb, 0x84, 0xb1, 0xc4, 0xeb, 0xfa, 0x71, 0x4e,
+    0x3d, 0xcc, 0xcc, 0x1f, 0x5f, 0xc6, 0x98, 0x5e, 0xbc, 0x3d, 0x38, 0x9a,
+    0xa8, 0xf8, 0xfa, 0x54, 0xdf, 0xc5, 0x61, 0x1a, 0x55, 0xf3, 0x99, 0xb6,
+    0x45, 0xcc, 0x7f, 0xdf, 0x43, 0x44, 0x83, 0x9f, 0x0c, 0x53, 0xcd, 0x99,
+    0x08, 0x46, 0x47, 0xa3, 0x79, 0x7a, 0x58, 0x04, 0x2b, 0x86, 0x1a, 0x44,
+    0x74, 0xec, 0x5d, 0xce, 0x92, 0x6b, 0x97, 0x32, 0xfb, 0xfa, 0x35, 0x8c,
+    0x7b, 0xe1, 0x71, 0xe6, 0xfd, 0xb7, 0x2d, 0xac, 0xcb, 0x66, 0xd2, 0x8d,
+    0x32, 0xf4, 0xc8, 0x11, 0x98, 0x4e, 0x45, 0x10, 0xfd, 0x7c, 0x24, 0x4f,
+    0x7f, 0xed, 0xde, 0x03, 0x71, 0xed, 0x72, 0xe6, 0xf8, 0xf0, 0x2a, 0x05,
+    0x55, 0x51, 0x9b, 0x5a, 0x8c, 0xe0, 0xe0, 0xd7, 0xe5, 0x9f, 0xa7, 0x8d,
+    0x29, 0x30, 0x2c, 0x3f, 0x8d, 0x0e, 0x8b, 0xb5, 0xe0, 0x08, 0x2f, 0xc8,
+    0xb4, 0x05, 0xe4, 0xf5, 0x04, 0x03, 0xe8, 0xe1, 0x45, 0x40, 0x0d, 0xa0,
+    0xd4, 0xd9, 0x8b, 0x16, 0x8b, 0x15, 0xc2, 0x6a, 0x11, 0xe2, 0xcc, 0xcd,
+    0x2a, 0xb9, 0xcf, 0x45, 0xde, 0x95, 0x5d, 0xbe, 0x29, 0xb5, 0xf3, 0x55,
+    0x89, 0x0f, 0xed, 0x65, 0x8c, 0x75, 0x00, 0xf0, 0x5d, 0x9c, 0xa0, 0x1e,
+    0x05, 0x45, 0xdb, 0x23, 0x37, 0xff, 0xad, 0x57, 0x37, 0xa3, 0xe6, 0xa4,
+    0x3f, 0xef, 0x66, 0xf6, 0x83, 0xb2, 0x08, 0xc7, 0x87, 0x23, 0x74, 0xc4,
+    0x21, 0xc2, 0x2e, 0x14, 0xff, 0xed, 0x0b, 0xe7, 0x34, 0x51, 0x28, 0x0e,
+    0x34, 0x5f, 0x18, 0xc0, 0xa8, 0x92, 0xdf, 0x8e, 0x16, 0x4e, 0x85, 0x77,
+    0xab, 0x13, 0xde, 0x8c, 0x7c, 0xae, 0xfb, 0xa9, 0x2d, 0xd8, 0xac, 0x1d,
+    0xad, 0x8c, 0xf2, 0xd3, 0x67, 0x2e, 0x92, 0x05, 0xea, 0x2d, 0xbd, 0xb0,
+    0x9c, 0x25, 0xee, 0x13, 0x59, 0xff, 0xc3, 0x04, 0x39, 0x9a, 0x7d, 0xae,
+    0x5b, 0x55, 0x53, 0xf7, 0x5d, 0x38, 0x3e, 0x1c, 0xa1, 0xc0, 0xcf, 0x45,
+    0xed, 0x86, 0x9f, 0xc5, 0x99, 0x02, 0x06, 0xb6, 0x3b, 0xb1, 0xf4, 0x1d,
+    0x7f, 0xde, 0x48, 0x29, 0x8a, 0x69, 0xc6, 0x2c, 0x23, 0x1d, 0x28, 0xf3,
+    0x9b, 0x34, 0x9e, 0x13, 0xe1, 0xdb, 0x20, 0x20, 0x6a, 0xd0, 0x00, 0x2a,
+    0x99, 0x31, 0x0a, 0x61, 0x8f, 0x1c, 0x41, 0x8f, 0x9c, 0x40, 0xfa, 0x7e,
+    0x08, 0x3d, 0xa6, 0xb5, 0x67, 0x94, 0x1f, 0x42, 0x62, 0xf6, 0x39, 0x5f,
+    0x7c, 0xe7, 0xae, 0x10, 0x36, 0xbf, 0xf4, 0x38, 0x73, 0xde, 0x18, 0xa1,
+    0x1d, 0x17, 0xf2, 0xcb, 0x2b, 0xe4, 0x2b, 0xf7, 0x2e, 0x61, 0x6c, 0x6c,
+    0x9a, 0xa8, 0xee, 0xd4, 0x00, 0x46, 0x73, 0x19, 0x57, 0x05, 0xea, 0xcf,
+    0xa4, 0xfa, 0xc9, 0xf1, 0xe1, 0x55, 0x32, 0x99, 0x25, 0x58, 0xb8, 0x04,
+    0xc0, 0x8b, 0x88, 0xa9, 0x0a, 0x02, 0x4a, 0x15, 0xd4, 0xa4, 0x02, 0xf9,
+    0x9d, 0x48, 0xbe, 0x46, 0x33, 0x72, 0x1c, 0xbc, 0x8a, 0xc0, 0xcf, 0x67,
+    0xef, 0x0d, 0xb6, 0x4d, 0x13, 0x0d, 0xfe, 0x25, 0x81, 0x5d, 0x27, 0xfd,
+    0xba, 0xef, 0xf3, 0x49, 0x05, 0x03, 0x3b, 0xdd, 0x88, 0x3e, 0x5d, 0x9a,
+    0x68, 0x02, 0x8f, 0x31, 0xb6, 0x0f, 0x40, 0xe8, 0xda, 0x04, 0xf5, 0x04,
+    0x03, 0x79, 0xf5, 0x0d, 0xaa, 0x80, 0xe9, 0x58, 0x04, 0x03, 0xf7, 0x88,
+    0xa2, 0x4f, 0x33, 0x96, 0x77, 0x97, 0x97, 0x76, 0x35, 0x52, 0x19, 0x4c,
+    0xd8, 0xf6, 0x0c, 0x87, 0x0e, 0x47, 0xf1, 0xfb, 0xbc, 0x32, 0x13, 0x3b,
+    0x31, 0x00, 0x2c, 0x36, 0x1b, 0x96, 0x7f, 0xd6, 0x61, 0x85, 0x79, 0xad,
+    0xf1, 0xd3, 0x4a, 0x83, 0x9f, 0x0c, 0xa7, 0x56, 0xdb, 0x65, 0x30, 0x79,
+    0x31, 0x3c, 0x6c, 0xe1, 0x60, 0x5f, 0xbf, 0x86, 0x29, 0xc8, 0xbf, 0xeb,
+    0x2c, 0xf3, 0xf4, 0x91, 0x82, 0xec, 0x53, 0x5e, 0x6d, 0x92, 0x08, 0xd7,
+    0x8b, 0x95, 0x1f, 0x4b, 0x94, 0xee, 0x11, 0x6d, 0xfe, 0xb3, 0x92, 0xc7,
+    0x40, 0x16, 0x4e, 0x45, 0xc7, 0xde, 0xc2, 0x77, 0x9b, 0xc5, 0x6e, 0x10,
+    0xf5, 0x7f, 0xa9, 0xa0, 0x3f, 0x5a, 0xd9, 0x17, 0x29, 0x99, 0xd8, 0x66,
+    0xb3, 0xa3, 0x71, 0xb5, 0x39, 0x2f, 0xcc, 0x58, 0xec, 0x74, 0x97, 0x83,
+    0x57, 0x31, 0xb0, 0xdd, 0x59, 0xd1, 0x35, 0xad, 0xb6, 0x71, 0xa2, 0xfa,
+    0x33, 0xf9, 0x33, 0x46, 0x1a, 0x87, 0x76, 0xba, 0xf5, 0xef, 0xa7, 0xcd,
+    0xb2, 0x78, 0x23, 0x45, 0x71, 0x22, 0x86, 0x7e, 0x26, 0xc2, 0x2e, 0x96,
+    0x3e, 0x59, 0x53, 0xee, 0xdd, 0x5e, 0x2d, 0x16, 0xa0, 0xf9, 0xa5, 0xf2,
+    0x6f, 0x33, 0xb4, 0x4d, 0x13, 0xa9, 0x33, 0xe7, 0x5e, 0xc5, 0xf4, 0xb9,
+    0xd6, 0x0a, 0x50, 0xcf, 0x25, 0x71, 0xdd, 0x27, 0x52, 0xd4, 0x04, 0xec,
+    0x4f, 0x99, 0x74, 0x2f, 0xa5, 0xf3, 0x10, 0x51, 0xec, 0x1f, 0x53, 0xf3,
+    0xf6, 0x1b, 0x12, 0xe9, 0xf3, 0xb9, 0x69, 0xbd, 0x8c, 0x2c, 0x46, 0xd3,
+    0xf9, 0x7c, 0x5f, 0x28, 0x50, 0x20, 0x20, 0x30, 0x73, 0x3e, 0x55, 0x51,
+    0x6f, 0x61, 0x54, 0x35, 0xe7, 0xe5, 0xb0, 0x08, 0x2a, 0x78, 0x4e, 0x84,
+    0xa9, 0x2a, 0x06, 0xcb, 0x6a, 0x0b, 0x2c, 0x9c, 0x8a, 0xcd, 0x2b, 0xcd,
+    0x05, 0x2f, 0xdd, 0x8b, 0xdd, 0x18, 0x21, 0xaf, 0x0c, 0xc8, 0xf1, 0x08,
+    0xd4, 0x64, 0x2a, 0xbc, 0x67, 0x32, 0x4b, 0x68, 0xa9, 0x05, 0xaa, 0xe6,
+    0x78, 0x8e, 0xd7, 0x43, 0x44, 0xdd, 0xd7, 0x95, 0x99, 0x0d, 0x26, 0x05,
+    0xc1, 0x51, 0x1e, 0xb5, 0x7c, 0x0c, 0x22, 0x5f, 0x07, 0x5f, 0x83, 0xa0,
+    0x7f, 0x3f, 0xad, 0x73, 0x9a, 0xc8, 0xfa, 0xc7, 0xfc, 0x11, 0x5e, 0x14,
+    0x57, 0x48, 0x18, 0xb2, 0xd5, 0xc1, 0x2e, 0x16, 0x36, 0xd8, 0x8e, 0x30,
+    0xb0, 0xff, 0xba, 0xf1, 0xfb, 0x69, 0xcb, 0xb9, 0x2d, 0x71, 0x01, 0xbf,
+    0x3b, 0x58, 0xf0, 0x26, 0x70, 0xdb, 0x34, 0x51, 0xfd, 0x19, 0xa5, 0xec,
+    0xdf, 0x5a, 0x70, 0x3d, 0x03, 0x9c, 0xde, 0x60, 0xcd, 0x3a, 0xce, 0x18,
+    0x4b, 0x00, 0x9b, 0xaf, 0x84, 0x20, 0xdf, 0xe5, 0x0c, 0xcb, 0x69, 0x94,
+    0x92, 0xf0, 0xff, 0xcc, 0xfe, 0xc8, 0x5f, 0x74, 0xbc, 0x80, 0xdf, 0x3c,
+    0x96, 0xfc, 0x1d, 0xb1, 0xd8, 0xb5, 0x09, 0x3a, 0x18, 0x0c, 0xcc, 0x8b,
+    0x6f, 0x68, 0x14, 0x5b, 0xc4, 0xca, 0x5c, 0x82, 0x05, 0xfc, 0x6e, 0xa0,
+    0xa1, 0xdf, 0x11, 0x13, 0x6e, 0x13, 0xed, 0xb8, 0x30, 0xb3, 0xc3, 0xf1,
+    0x10, 0x55, 0xe2, 0x39, 0x11, 0x5d, 0x9b, 0x8c, 0xdd, 0x43, 0xbb, 0x80,
+    0xdf, 0x5d, 0x34, 0xf4, 0x3b, 0x62, 0xf1, 0x55, 0xa9, 0xc0, 0xb7, 0xa3,
+    0x56, 0x2d, 0x7b, 0xc7, 0xcc, 0x28, 0x3a, 0x2c, 0x56, 0x24, 0x5e, 0xb5,
+    0x2e, 0x18, 0xec, 0x02, 0x96, 0xc4, 0xb2, 0x7f, 0x1b, 0x97, 0xbb, 0x37,
+    0x41, 0x07, 0x82, 0x6a, 0x2a, 0x80, 0x3e, 0x0f, 0x2a, 0x38, 0x6a, 0x55,
+    0xf8, 0x1a, 0x9c, 0x86, 0x37, 0x0e, 0x16, 0x70, 0x01, 0x2b, 0xfa, 0x6d,
+    0x5c, 0x05, 0xa9, 0x8f, 0xd1, 0x0e, 0x7e, 0x96, 0x80, 0x3f, 0x16, 0x4b,
+    0x6d, 0xdd, 0x95, 0xe1, 0xb3, 0xd6, 0x22, 0x86, 0x76, 0x9b, 0x1d, 0xfb,
+    0x56, 0x9b, 0xb2, 0x6e, 0x68, 0x59, 0xc0, 0x05, 0x34, 0x82, 0x73, 0xfa,
+    0x15, 0xf2, 0x34, 0xa6, 0xe3, 0x81, 0x80, 0x80, 0xfe, 0x2f, 0x65, 0x24,
+    0xa6, 0xb2, 0xe3, 0x80, 0xe9, 0x1d, 0x18, 0x67, 0x6d, 0x1d, 0x44, 0x7e,
+    0xfe, 0xe2, 0x97, 0x0b, 0xf8, 0xdd, 0xc4, 0xff, 0x03, 0x84, 0x87, 0x80,
+    0xe5, 0xeb, 0x02, 0x31, 0x17, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e,
+    0x44, 0xae, 0x42, 0x60, 0x82
 };
 
 
@@ -996,12 +975,13 @@ ConfigurationPanel::ConfigurationPanel( QWidget* parent, const char* name, bool
     stunButtonGroupLayout = new QVBoxLayout( stunButtonGroup->layout() );
     stunButtonGroupLayout->setAlignment( Qt::AlignTop );
 
-    useStunYes = new QRadioButton( stunButtonGroup, "useStunYes" );
-    stunButtonGroupLayout->addWidget( useStunYes );
-
     useStunNo = new QRadioButton( stunButtonGroup, "useStunNo" );
     useStunNo->setChecked( TRUE );
     stunButtonGroupLayout->addWidget( useStunNo );
+
+    useStunYes = new QRadioButton( stunButtonGroup, "useStunYes" );
+    useStunYes->setChecked( FALSE );
+    stunButtonGroupLayout->addWidget( useStunYes );
     Tab_Signalisations->insertTab( STUNPage, QString("") );
 
     DTMFPage = new QWidget( Tab_Signalisations, "DTMFPage" );
@@ -1203,13 +1183,13 @@ ConfigurationPanel::ConfigurationPanel( QWidget* parent, const char* name, bool
 
     DriversPage_5 = new QWidget( Tab_About, "DriversPage_5" );
 
-    textLabel2_2 = new QLabel( DriversPage_5, "textLabel2_2" );
-    textLabel2_2->setGeometry( QRect( 20, 170, 371, 121 ) );
-
     pixmapLabel1 = new QLabel( DriversPage_5, "pixmapLabel1" );
     pixmapLabel1->setGeometry( QRect( 50, 40, 312, 91 ) );
     pixmapLabel1->setPixmap( image0 );
     pixmapLabel1->setScaledContents( TRUE );
+
+    textLabel2_2 = new QLabel( DriversPage_5, "textLabel2_2" );
+    textLabel2_2->setGeometry( QRect( 20, 170, 371, 121 ) );
     Tab_About->insertTab( DriversPage_5, QString("") );
 
     CodecsPage_4 = new QWidget( Tab_About, "CodecsPage_4" );
@@ -1252,8 +1232,8 @@ ConfigurationPanel::ConfigurationPanel( QWidget* parent, const char* name, bool
     setTabOrder( zoneToneChoice, confirmationToQuit );
     setTabOrder( confirmationToQuit, checkedTray );
     setTabOrder( checkedTray, voicemailNumber );
-    setTabOrder( voicemailNumber, useStunNo );
-    setTabOrder( useStunNo, STUNserver );
+    setTabOrder( voicemailNumber, useStunYes );
+    setTabOrder( useStunYes, STUNserver );
     setTabOrder( STUNserver, playTones );
     setTabOrder( playTones, pulseLength );
     setTabOrder( pulseLength, sendDTMFas );
@@ -1309,8 +1289,8 @@ void ConfigurationPanel::languageChange()
     groupBox3->setTitle( tr( "Settings " ) );
     textLabel1_5->setText( tr( "STUN server (address:port)" ) );
     stunButtonGroup->setTitle( tr( "Use STUN" ) );
-    useStunYes->setText( tr( "Yes" ) );
     useStunNo->setText( tr( "No" ) );
+    useStunYes->setText( tr( "Yes" ) );
     Tab_Signalisations->changeTab( STUNPage, tr( "STUN" ) );
     SettingsDTMF->setTitle( tr( "Settings" ) );
     playTones->setText( tr( "Play tones locally" ) );
@@ -1374,9 +1354,9 @@ void ConfigurationPanel::languageChange()
     textLabel1_6->setText( tr( "Voicemail:" ) );
     Tab_Preferences->changeTab( TabPage, tr( "Options" ) );
     textLabel2_2->setText( tr( "<p align=\"center\">\n"
-"Copyright (C) 2004 Savoir-faire Linux inc.<br><br>\n"
+"Copyright (C) 2004-2005 Savoir-faire Linux inc.<br><br>\n"
 "Laurielle LEA &lt;laurielle.lea@savoirfairelinux.com&gt;<br><br>\n"
-"SFLPhone-0.3 is released under the General Public License.<br>\n"
+"SFLPhone-0.4 is released under the General Public License.<br>\n"
 "For more information, see http://www.sflphone.org<br>\n"
 "</p>" ) );
     Tab_About->changeTab( DriversPage_5, tr( "About SFLPhone" ) );
diff --git a/src/configurationpanelui.h b/src/gui/qt/configurationpanelui.h
similarity index 97%
rename from src/configurationpanelui.h
rename to src/gui/qt/configurationpanelui.h
index a6684acf38..5b6774411c 100644
--- a/src/configurationpanelui.h
+++ b/src/gui/qt/configurationpanelui.h
@@ -1,7 +1,7 @@
 /****************************************************************************
-** Form interface generated from reading ui file 'configurationpanel.ui'
+** Form interface generated from reading ui file 'gui/qt/configurationpanel.ui'
 **
-** Created: Wed Apr 27 10:37:34 2005
+** Created: Fri May 20 14:27:25 2005
 **      by: The User Interface Compiler ($Id$)
 **
 ** WARNING! All changes made in this file will be lost!
@@ -70,8 +70,8 @@ public:
     QLabel* textLabel1_5;
     QLineEdit* STUNserver;
     QButtonGroup* stunButtonGroup;
-    QRadioButton* useStunYes;
     QRadioButton* useStunNo;
+    QRadioButton* useStunYes;
     QWidget* DTMFPage;
     QGroupBox* SettingsDTMF;
     QCheckBox* playTones;
@@ -117,8 +117,8 @@ public:
     QLineEdit* voicemailNumber;
     QTabWidget* Tab_About;
     QWidget* DriversPage_5;
-    QLabel* textLabel2_2;
     QLabel* pixmapLabel1;
+    QLabel* textLabel2_2;
     QWidget* CodecsPage_4;
     QLabel* textLabel1;
     QLabel* pixmapLabel2;
diff --git a/src/jpushbutton.cpp b/src/gui/qt/jpushbutton.cpp
similarity index 99%
rename from src/jpushbutton.cpp
rename to src/gui/qt/jpushbutton.cpp
index fb2e3c9e1e..99cdddb06c 100644
--- a/src/jpushbutton.cpp
+++ b/src/gui/qt/jpushbutton.cpp
@@ -27,7 +27,7 @@
 #include <qevent.h>
 
 #include "jpushbutton.h"
-#include "skin.h"
+#include "../../skin.h"
 #include "qtGUImainwindow.h"
 
 // This is the default constructor, it must be called with pixname being
diff --git a/src/jpushbutton.h b/src/gui/qt/jpushbutton.h
similarity index 100%
rename from src/jpushbutton.h
rename to src/gui/qt/jpushbutton.h
diff --git a/src/mydisplay.cpp b/src/gui/qt/mydisplay.cpp
similarity index 77%
rename from src/mydisplay.cpp
rename to src/gui/qt/mydisplay.cpp
index 455ecd4785..017990103f 100644
--- a/src/mydisplay.cpp
+++ b/src/gui/qt/mydisplay.cpp
@@ -1,5 +1,5 @@
 /**
- *  Copyright (C) 2004 Savoir-Faire Linux inc.
+ *  Copyright (C) 2004-2005 Savoir-Faire Linux inc.
  *  Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com>
  *                                                                              
  *  This program is free software; you can redistribute it and/or modify
@@ -26,8 +26,8 @@
 #include <stdio.h>
 #include <math.h>
 
+#include "../../skin.h"
 #include "mydisplay.h"
-#include "skin.h"
 #include "qtGUImainwindow.h"
 
 #define TABULATION	1
@@ -88,23 +88,23 @@ MyDisplay::MyDisplay (void) : QWidget () {
  */
 MyDisplay::MyDisplay (QWidget *parent, const char *name, QtGUIMainWindow* qtgui)
 			: QWidget (parent, name)  {
-	this->qtgui = qtgui;
+	_qtgui = qtgui;
 	this->initGraphics();
 	this->initText();
 	// Graphics engine animation thread
-	this->animationThread = new MyDisplayThread (this);
-	this->animationThread->start();
+	_animationThread = new MyDisplayThread (this);
+	_animationThread->start();
 }
 
 /**
  * Destructor.
  */
 MyDisplay::~MyDisplay (void) {
-	delete animationThread;
-	delete textBuffer;
-	delete qtgui;
-	delete status;
-	delete time;
+	delete _animationThread;
+	delete _textBuffer;
+	delete _qtgui;
+	delete _status;
+	delete _time;
 }
 
 /**
@@ -115,7 +115,7 @@ void
 MyDisplay::paintEvent (QPaintEvent *e) {
 	if (e);
 		
-	QPixmap pm(centerImage.width(),centerImage.height());
+	QPixmap pm(_centerImage.width(),_centerImage.height());
 	
 	// Painter settings 
 	QFont font(FONT_FAMILY, FONT_SIZE);
@@ -128,23 +128,23 @@ MyDisplay::paintEvent (QPaintEvent *e) {
 	
 	// Text image (static)
 	bitBlt (&pm, 0, 0,
-		&(this->centerImage), 0, 0,
-		this->centerImage.width(),
-		this->centerImage.height(),
+		&(_centerImage), 0, 0,
+		_centerImage.width(),
+		_centerImage.height(),
 		Qt::CopyROP);
 	
 	// Display text render
-	renderText (p, fm, *textBuffer);
+	renderText (p, fm, *_textBuffer);
 	// Display status
-	renderStatus (p, fm, *status);
+	renderStatus (p, fm, *_status);
 	// Display time
 	renderTime (p, fm);
 
 	// Overscreen image
 	bitBlt (&pm, 0, 0,
-		&(this->overImage), 0, 0,
-		this->overImage.width(),
-		this->overImage.height(),
+		&(_overImage), 0, 0,
+		_overImage.width(),
+		_overImage.height(),
 		Qt::CopyROP);
 		
 	p.end();
@@ -152,8 +152,8 @@ MyDisplay::paintEvent (QPaintEvent *e) {
 	// "Swap" buffers
 	bitBlt (this, 0, 0,
 		&pm, 0, 0,
-		this->centerImage.width(),
-		this->centerImage.height(),
+		_centerImage.width(),
+		_centerImage.height(),
 		Qt::CopyROP);
 }
 
@@ -167,24 +167,20 @@ MyDisplay::initGraphics (void) {
 
 	// Load display screen image
 	QPixmap *pixcenter = new QPixmap(Skin::getPath(QString(SKINDIR), 
-		qtgui->setPathSkin(),
+		_qtgui->setPathSkin(),
 	   	QString(PIXMAP_SCREEN)));
-	this->centerImage = pixcenter->convertToImage();
+	_centerImage = pixcenter->convertToImage();
 	delete pixcenter;
 
 	// Load overscreen image
 	QPixmap *pixover = new QPixmap(Skin::getPath(QString(SKINDIR), 
-		qtgui->setPathSkin(),
+		_qtgui->setPathSkin(),
 	   	QString(PIXMAP_OVERSCREEN)));
-	this->overImage = pixover->convertToImage();
+	_overImage = pixover->convertToImage();
 	delete pixover;
 	
 	// Adjust our size to the picture's one
-	this->setGeometry (0, 0, centerImage.width(), centerImage.height());
-
-	// Graphics engine animation thread
-//	this->animationThread = new MyDisplayThread (this);
-//	this->animationThread->start();
+	this->setGeometry (0, 0, _centerImage.width(), _centerImage.height());
 }
 
 /**
@@ -192,11 +188,11 @@ MyDisplay::initGraphics (void) {
  */
 void
 MyDisplay::initText (void) {
-	this->textBuffer = new QString ();
+	_textBuffer = new QString ();
 	// Init status to free-status
-	this->status = new QString(FREE_STATUS);
+	_status = new QString(FREE_STATUS);
 	// No display call-timer
-	inFunction = false;
+	_inFunction = false;
 }
 
 /**
@@ -210,7 +206,7 @@ MyDisplay::initText (void) {
 void
 MyDisplay::renderText (QPainter &painter, QFontMetrics &fm, QString &str) {
 	// cpl = how many chars per line.
-	static unsigned int	cpl = centerImage.width() / fm.width("a");
+	static unsigned int	cpl = _centerImage.width() / fm.width("a");
 	
 	// If the texts length is greater than the screen, we have to
 	// scroll the WHOLE text towards the left.
@@ -219,7 +215,7 @@ MyDisplay::renderText (QPainter &painter, QFontMetrics &fm, QString &str) {
 	QString	 backup_string(".");
 	
 	// If the string is larger than the screen...
-	if (fm.width(str) > (centerImage.width() - 5)) {
+	if (fm.width(str) > (_centerImage.width() - 5)) {
 		extra_chars = str.length() - cpl;
 		x_offset = fm.width(str[0]) * extra_chars;
 		x_offset = fm.width(str[0]) * extra_chars;
@@ -232,7 +228,7 @@ MyDisplay::renderText (QPainter &painter, QFontMetrics &fm, QString &str) {
 	// Render text
 	painter.drawText (TABULATION - x_offset, fm.height() * TEXT_LINE, str);
 
-	if (fm.width(str) > (centerImage.width() - 5)) {
+	if (fm.width(str) > (_centerImage.width() - 5)) {
 		// Restore initial string.
 		str.replace(extra_chars, backup_string.length(), backup_string);
 	}
@@ -263,8 +259,8 @@ MyDisplay::renderTime (QPainter &painter, QFontMetrics &fm) {
 	QString minStr,secStr;
 
 	// If conversation, display call-timer
-	if (inFunction) {
-		elapse = qtgui->callmanager->phLines[qtgui->currentLineNumber]->timer->elapsed() / 1000;
+	if (_inFunction) {
+		elapse = _qtgui->getElapse();
 		// To calculate minutes
 		if (elapse % 60 == 0) {
 			minute = elapse / 60;
@@ -283,11 +279,11 @@ MyDisplay::renderTime (QPainter &painter, QFontMetrics &fm) {
 			minStr = QString::number(minute);
 		}
 		
-		time = new QString(minStr + ":" + secStr);
+		_time = new QString(minStr + ":" + secStr);
 
 	} else {
 		// If no conversation, display the current time
-		time = new QString(QDateTime::currentDateTime().toString("hh:mm"));
+		_time = new QString(QDateTime::currentDateTime().toString("hh:mm"));
 		
 		/** For english time format:
 		 * time = new QString(QDateTime::currentDateTime().toString("h:m AP"));
@@ -296,10 +292,10 @@ MyDisplay::renderTime (QPainter &painter, QFontMetrics &fm) {
 		// Handle time separator blinking.
 		static unsigned int i = 0;
 		if (i++ % 12 > 5) {
-			time->replace (':', ' ');
+			_time->replace (':', ' ');
 		}
 	}
-	painter.drawText (TABULATION, fm.height() * TIMER_LINE, *time);
+	painter.drawText (TABULATION, fm.height() * TIMER_LINE, *_time);
 }
 
 /**
@@ -310,11 +306,11 @@ MyDisplay::renderTime (QPainter &painter, QFontMetrics &fm) {
 void
 MyDisplay::setStatus (const QString &status) {
 	// Free if previously allocated
-	if (this->status != NULL) {
-		delete this->status;
+	if (_status != NULL) {
+		delete _status;
 	}
 
-	this->status = new QString (status);
+	_status = new QString (status);
 }
 
 /**
@@ -324,7 +320,7 @@ MyDisplay::setStatus (const QString &status) {
  */
 QString &
 MyDisplay::getStatus (void) {
-	return *status;
+	return *_status;
 }
 
 /**
@@ -335,10 +331,10 @@ MyDisplay::getStatus (void) {
 void
 MyDisplay::setTimer (const QString &time) {
 	// Free if previously allocated
-	if (this->time != NULL) {
-		delete this->time;
+	if (_time != NULL) {
+		delete _time;
 	}
-	this->time = new QString (time);
+	_time = new QString (time);
 }
 
 /**
@@ -348,7 +344,31 @@ MyDisplay::setTimer (const QString &time) {
  */
 QString &
 MyDisplay::getTimer (void) {
-	return *time;
+	return *_time;
+}
+
+/**
+ * To modify text buffer.
+ *
+ * @param	text buffer
+ */
+void
+MyDisplay::setTextBuffer (const QString& text) {
+	// Free if previously allocated
+	if (_textBuffer != NULL) {
+		delete _textBuffer;
+	}
+	_textBuffer = new QString (text);
+}
+
+/**
+ * To access text buffer.
+ *
+ * @return	text buffer
+ */
+QString &
+MyDisplay::getTextBuffer (void) {
+	return *_textBuffer;
 }
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -356,42 +376,42 @@ MyDisplay::getTimer (void) {
 ///////////////////////////////////////////////////////////////////////////////
 void 
 MyDisplay::appendText (const QString &strToAdd) {
-	this->textBuffer->append(strToAdd);
+	_textBuffer->append(strToAdd);
 }
 
 void
 MyDisplay::appendText (const char *text) {
-	this->textBuffer->append(QString(text));
+	_textBuffer->append(QString(text));
 }
 
 void
 MyDisplay::appendText (const QChar &key) {
-	this->textBuffer->append(QChar(key));
+	_textBuffer->append(QChar(key));
 }
 
 void
 MyDisplay::clear (void) {
 	// Remove everything in the buffer.
-	this->textBuffer->remove(0, this->textBuffer->length());
+	_textBuffer->remove(0, _textBuffer->length());
 	setStatus(QString(FREE_STATUS));
 }
 
 void
 MyDisplay::clearBuffer (void) {
-	this->textBuffer->remove(0, this->textBuffer->length());
+	_textBuffer->remove(0, _textBuffer->length());
 }
 
 void
 MyDisplay::clear (const QString &newstatus) {
 	// Remove everything in the buffer and set the new status.
-	this->textBuffer->remove(0, this->textBuffer->length());
+	_textBuffer->remove(0, _textBuffer->length());
 	setStatus(newstatus);
 }
 
 void
 MyDisplay::backspace (void) {
 	// Remove the last char of the string
-	this->textBuffer->remove(this->textBuffer->length() - 1, 1);
+	_textBuffer->remove(_textBuffer->length() - 1, 1);
 }
 
 // EOF
diff --git a/src/mydisplay.h b/src/gui/qt/mydisplay.h
similarity index 80%
rename from src/mydisplay.h
rename to src/gui/qt/mydisplay.h
index 6d3cf44bd5..881975b4bb 100644
--- a/src/mydisplay.h
+++ b/src/gui/qt/mydisplay.h
@@ -1,5 +1,5 @@
 /**
- *  Copyright (C) 2004 Savoir-Faire Linux inc.
+ *  Copyright (C) 2004-2005 Savoir-Faire Linux inc.
  *  Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com>
  *                                                                              
  *  This program is free software; you can redistribute it and/or modify
@@ -27,10 +27,9 @@
 #include <qthread.h>
 #include <qwidget.h>
 
-#include "global.h"
+#include "../../global.h"
 
-#define FREE_STATUS		QObject::tr("Welcome to SFLPhone")
-#define ONHOLD_STATUS	QObject::tr("On hold ...")
+#define FREE_STATUS		"Welcome to SFLPhone"
 
 // Screen animation thread
 class MyDisplayThread : public QThread {
@@ -58,11 +57,12 @@ public:
 	QString &	getStatus (void);
 	void 		setTimer (const QString &);
 	QString &	getTimer (void);
+	void 		setTextBuffer (const QString &);
+	QString &	getTextBuffer (void);
 	void		initGraphics	(void);
-	bool 		inFunction;
 
-	QString		       *textBuffer;		
-	QString		       *time;
+	inline bool getInFunction (void) { return _inFunction; }
+	inline void setInFunction (bool b) { _inFunction = b; }
 
 public slots:
 	void	 appendText	(const QString &);
@@ -77,11 +77,14 @@ protected:
 	void	 paintEvent (QPaintEvent *);
 
 private:
-	QImage		 		centerImage;	// text zone
-	QImage				overImage;
-	QString			   *status;	
-	MyDisplayThread	   *animationThread;
-	QtGUIMainWindow	   *qtgui;	
+	QImage		 		_centerImage;	// text zone
+	QImage				_overImage;
+	QString*			_status;	
+	MyDisplayThread*	_animationThread;
+	QtGUIMainWindow*	_qtgui;	
+	QString*			_textBuffer;		
+	QString*			_time;
+	bool 				_inFunction;
 	
 	void		initText		(void);
 	void		renderText		(QPainter &, QFontMetrics &, QString &);
diff --git a/src/numerickeypad.cpp b/src/gui/qt/numerickeypad.cpp
similarity index 96%
rename from src/numerickeypad.cpp
rename to src/gui/qt/numerickeypad.cpp
index e431585597..502e478800 100644
--- a/src/numerickeypad.cpp
+++ b/src/gui/qt/numerickeypad.cpp
@@ -17,12 +17,15 @@
  *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
+#include <string>
 #include <qapplication.h>
 
 #include "jpushbutton.h"
 #include "numerickeypad.h"
 #include "qtGUImainwindow.h"
-#include "skin.h"
+#include "../../skin.h"
+
+using namespace std;
 
 
 NumericKeypad::NumericKeypad (QWidget *parent, const char *name, WFlags f) 
@@ -44,7 +47,7 @@ NumericKeypad::NumericKeypad (QWidget *parent, const char *name, WFlags f)
 	// Calculate just one time the transparency mask bit to bit
 	transparencyMask ();						
 
-	QString skinfilename(Skin::getPath(QString(SKINDIR), 
+	string skinfilename(Skin::getPath(QString(SKINDIR), 
 										gui->setPathSkin(),
 										QString(FILE_INI)));
 	pt = new Point(skinfilename);
diff --git a/src/numerickeypad.h b/src/gui/qt/numerickeypad.h
similarity index 100%
rename from src/numerickeypad.h
rename to src/gui/qt/numerickeypad.h
diff --git a/src/numerickeypadtools.cpp b/src/gui/qt/numerickeypadtools.cpp
similarity index 100%
rename from src/numerickeypadtools.cpp
rename to src/gui/qt/numerickeypadtools.cpp
diff --git a/src/numerickeypadtools.h b/src/gui/qt/numerickeypadtools.h
similarity index 100%
rename from src/numerickeypadtools.h
rename to src/gui/qt/numerickeypadtools.h
diff --git a/src/phonebook.ui b/src/gui/qt/phonebook.ui
similarity index 100%
rename from src/phonebook.ui
rename to src/gui/qt/phonebook.ui
diff --git a/src/phonebookui.cpp b/src/gui/qt/phonebookui.cpp
similarity index 96%
rename from src/phonebookui.cpp
rename to src/gui/qt/phonebookui.cpp
index 3cb38a9af1..50570c2965 100644
--- a/src/phonebookui.cpp
+++ b/src/gui/qt/phonebookui.cpp
@@ -1,13 +1,13 @@
 /****************************************************************************
-** Form implementation generated from reading ui file 'phonebook.ui'
+** Form implementation generated from reading ui file 'gui/qt/phonebook.ui'
 **
-** Created: Wed Apr 27 10:37:33 2005
+** Created: Fri May 20 14:27:25 2005
 **      by: The User Interface Compiler ($Id$)
 **
 ** WARNING! All changes made in this file will be lost!
 ****************************************************************************/
 
-#include "phonebookui.h"
+#include "gui/qt/phonebookui.h"
 
 #include <qvariant.h>
 #include <qpushbutton.h>
diff --git a/src/phonebookui.h b/src/gui/qt/phonebookui.h
similarity index 91%
rename from src/phonebookui.h
rename to src/gui/qt/phonebookui.h
index 2307632181..b4944c4b63 100644
--- a/src/phonebookui.h
+++ b/src/gui/qt/phonebookui.h
@@ -1,7 +1,7 @@
 /****************************************************************************
-** Form interface generated from reading ui file 'phonebook.ui'
+** Form interface generated from reading ui file 'gui/qt/phonebook.ui'
 **
-** Created: Wed Apr 27 10:37:33 2005
+** Created: Fri May 20 14:27:25 2005
 **      by: The User Interface Compiler ($Id$)
 **
 ** WARNING! All changes made in this file will be lost!
diff --git a/src/phoneline.cpp b/src/gui/qt/phoneline.cpp
similarity index 99%
rename from src/phoneline.cpp
rename to src/gui/qt/phoneline.cpp
index 817ba8de96..a196ce46fe 100644
--- a/src/phoneline.cpp
+++ b/src/gui/qt/phoneline.cpp
@@ -30,6 +30,7 @@ PhoneLine::PhoneLine (void) {
 	timer = new QTime();	
 	b_dial = false;
 	b_ringing = false;
+	_callid = 0;
 }
 
 PhoneLine::~PhoneLine (void) {
diff --git a/src/phoneline.h b/src/gui/qt/phoneline.h
similarity index 83%
rename from src/phoneline.h
rename to src/gui/qt/phoneline.h
index e49064614e..0a3829c93c 100644
--- a/src/phoneline.h
+++ b/src/gui/qt/phoneline.h
@@ -53,10 +53,11 @@ public:
 	void			 startTimer	(void);
 	void			 stopTimer	(void);
 	QTime			*timer;
-	QString			 status;
 	QString			 text;
 	bool			 first;
 
+	inline QString	getStatus 	(void) { return _status; }
+	inline void setStatus 		(const QString& status) { _status = status; }
 	inline void setbDial 		(bool dial) { b_dial = dial; }
 	inline bool getbDial 		(void) 		{ return b_dial; }
 	inline void setbInProgress 	(bool prog) { b_inProgress = prog; }
@@ -66,16 +67,21 @@ public:
 	inline void setbRinging 	(bool ring) { if (this->b_ringing != ring) 
 												this->b_ringing = ring;
 											} 
+	inline short getCallId 		(void) { return _callid; }
+	inline void setCallId 		(short id) { _callid = id; }
 
 private:
-	JPushButton			*jpb;
-	enum line_state		 state;
-	enum line_state		 stateLine;
+	short 			_callid;
+	QString			_status;
+	
+	JPushButton*	jpb;
+	enum line_state	state;
+	enum line_state	stateLine;
 
-	bool			 	 b_dial; 		// if ok button is clicked (->true)
-	bool				 b_inProgress;	// if outgoing call, 
+	bool			b_dial; 		// if ok button is clicked (->true)
+	bool			b_inProgress;	// if outgoing call, 
 										// before remote callee answers (->true)
-	bool				 b_ringing;		// if incoming call, 
+	bool			b_ringing;		// if incoming call, 
 										// before IP-phone user answers (->true) 
 };
 
diff --git a/src/point.cpp b/src/gui/qt/point.cpp
similarity index 91%
rename from src/point.cpp
rename to src/gui/qt/point.cpp
index aa31c6de46..ce124d033d 100644
--- a/src/point.cpp
+++ b/src/gui/qt/point.cpp
@@ -17,7 +17,7 @@
  *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-#include "configurationtree.h"
+#include "../../configurationtree.h"
 #include "point.h"
 
 #include <string>
@@ -26,7 +26,7 @@ using namespace std;
 /**
  * Create a config-tree from file 'filename'
  */
-Point::Point (const char* filename) {
+Point::Point (const string& filename) {
 	skinConfigTree = new ConfigurationTree();
 	skinConfigTree->populateFromFile (filename);
 }
@@ -44,10 +44,9 @@ Point::~Point (void) {
  */
 string
 Point::getSubstrX (const char* key) {
-	char * value = skinConfigTree->getValue(NULL, key);
-	string tmp(value);
-	int index = tmp.find(',');
-	return tmp.substr(0, index);
+	string value = skinConfigTree->getValue("", string(key));
+	int index = value.find(',');
+	return value.substr(0, index);
 }
 
 /**
@@ -55,10 +54,9 @@ Point::getSubstrX (const char* key) {
  */
 string
 Point::getSubstrY (const char* key) {
-	char * value = skinConfigTree->getValue(NULL, key);
-	string tmp(value);
-	int index = tmp.find(',');
-	return tmp.substr(index + 1, tmp.length() - index);
+	string value = skinConfigTree->getValue("", string(key));
+	int index = value.find(',');
+	return value.substr(index + 1, value.length() - index);
 }
 
 /**
diff --git a/src/point.h b/src/gui/qt/point.h
similarity index 98%
rename from src/point.h
rename to src/gui/qt/point.h
index 37d11bb34f..8b814815e7 100644
--- a/src/point.h
+++ b/src/gui/qt/point.h
@@ -31,7 +31,7 @@ class ConfigurationTree;
 
 class Point {
 public:
-	Point (const char*);
+	Point (const string&);
 	~Point (void);
 
 	int	getX			(const char*);
diff --git a/src/qjlistboxpixmap.cpp b/src/gui/qt/qjlistboxpixmap.cpp
similarity index 100%
rename from src/qjlistboxpixmap.cpp
rename to src/gui/qt/qjlistboxpixmap.cpp
diff --git a/src/qjlistboxpixmap.h b/src/gui/qt/qjlistboxpixmap.h
similarity index 100%
rename from src/qjlistboxpixmap.h
rename to src/gui/qt/qjlistboxpixmap.h
diff --git a/src/gui/qt/qtGUImainwindow.cpp b/src/gui/qt/qtGUImainwindow.cpp
new file mode 100644
index 0000000000..565731d815
--- /dev/null
+++ b/src/gui/qt/qtGUImainwindow.cpp
@@ -0,0 +1,1688 @@
+/**
+ *  Copyright (C) 2004-2005 Savoir-Faire Linux inc.
+ *  Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com> 
+ *                                                                             
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *                                                                             
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *                                                                             
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+////////////////////////////////////////////////////////////////////////////////
+// QtGUIMainWindow Implementation                                             //
+////////////////////////////////////////////////////////////////////////////////
+
+#include "../../configurationtree.h"
+#include <stdio.h>
+
+#include <qbitmap.h>
+#include <qcheckbox.h>
+#include <qcombobox.h>
+#include <qevent.h>
+#include <qinputdialog.h>
+#include <qlineedit.h>
+#include <qmessagebox.h>
+#include <qpushbutton.h>
+#include <qregexp.h>
+#include <qsettings.h>
+#include <qspinbox.h>
+#include <qtimer.h>
+#include <qtooltip.h>
+
+#include "../../audio/audiodrivers.h"
+#include "../../configuration.h"
+#include "../../global.h"
+#include "../../manager.h"
+#include "../../user_cfg.h"
+#include "../../skin.h"
+#include "configurationpanelui.h"
+#include "jpushbutton.h"
+#include "numerickeypadtools.h"
+#include "point.h"
+#include "phoneline.h"
+#include "qtGUImainwindow.h"
+#include "vector.h"
+#include "volumecontrol.h"
+
+#define QCHAR_TO_STRIP	"-"
+#define REG_EXPR		"(-|\\(|\\)| )"
+	
+
+///////////////////////////////////////////////////////////////////////////////
+// Tray Icon implementation
+///////////////////////////////////////////////////////////////////////////////
+MyTrayIcon::MyTrayIcon(const QPixmap &icon, const QString &tooltip, 
+		QPopupMenu *_mypop, QObject *parent, const char *name)
+		: TrayIcon (icon, tooltip, _mypop, parent, name)
+{
+	menu = _mypop;
+}
+
+void
+MyTrayIcon::mousePressEvent (QMouseEvent *e) 
+{
+	switch ( e->button() ) {
+		case RightButton:
+			menu->popup( e->globalPos() );
+			e->accept();
+			break;
+			
+		case LeftButton:
+			emit clickedLeft();
+			break;
+			
+		case MidButton:
+			break;
+			
+		default:
+			break;
+	}
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// QtGUIMainWindow implementation
+///////////////////////////////////////////////////////////////////////////////
+
+/**
+ * Default Constructor
+ * Init, Connections
+ */
+QtGUIMainWindow::QtGUIMainWindow (QWidget *parent, const char *name, WFlags f, 
+									Manager *mngr) 
+									: TransQWidget (parent, name, f), 
+									  GuiFramework(mngr) {	
+										    
+	for (int i = 0; i < NUMBER_OF_LINES; i++) {
+		phLines[i] = new PhoneLine();
+		phLines[i]->setState(FREE);
+		_TabIncomingCalls[i] = -1;
+    }
+	
+	// Create configuration _panel
+	_panel = new ConfigurationPanel (0, 0, false);
+										
+	// Address book dialog
+
+	// URL input dialog
+	_urlinput = new URL_Input (this);
+	
+	// For managing 
+	_callmanager = mngr;
+
+	// For DTMF
+    _key = new DTMF ();
+    _buf = new short[SIZEBUF];
+
+	// Create new display and numeric _keypad
+	_lcd = new MyDisplay(this, 0, this);
+	_keypad = new NumericKeypad (this, NULL, Qt::WDestructiveClose |
+                    					Qt::WStyle_Customize |
+                    					Qt::WStyle_NoBorder);
+	_currentLine = -1;
+	_chosenLine = -1;
+	_freeLine = -1;
+ 	_first = true;
+	_chooseLine = false;
+	_transfer = false;
+	_dialtone = false;
+	_msgVar = false;
+	_apply = false;
+
+	// Initialisation of all that concern the skin
+	initSkin();
+	this->initBlinkTimer();
+
+	
+	// By default, keyboard mapping mode is numerical mode
+	this->setMode(NUM_MODE);
+	
+	// Move 
+	setMainLCD ();
+	
+	// Change window title and Icon.
+	this->setCaption(PROGNAME);
+	this->setIcon(QPixmap(Skin::getPathPixmap(QString(PIXDIR), 
+				QString(SFLPHONE_LOGO))));
+
+	// Show the GUI
+	this->show();	
+
+	// Handle the tray icon system
+	_mypop = new QPopupMenu(this);
+	_mypop->insertItem ("Quit", qApp, SLOT(quit()));
+
+	_trayicon = new MyTrayIcon(QPixmap(
+				Skin::getPathPixmap(QString(PIXDIR), QString(TRAY_ICON))), 
+				NULL, _mypop, parent, name);
+	_trayicon->show();
+	
+	// Connect to handle _trayicon
+	connect(_trayicon, SIGNAL(clickedLeft()), this, SLOT(clickHandle()));
+	// Connect _blinkTimer signals to blink slot
+    connect(_blinkTimer, SIGNAL(timeout()),this, SLOT(blinkMessageSlot()));
+	connect (_blinkTimer, SIGNAL(timeout()), this, SLOT(blinkRingSlot()) );
+	connect (_blinkTimer, SIGNAL(timeout()), this, SLOT(blinkLineSlot()));
+	// Connect to append url in display
+	connect (_urlinput->buttonOK, SIGNAL(clicked()), this, SLOT(stripSlot()));
+	// Connect to save settings
+	connect (_panel->buttonSave, SIGNAL(clicked()), this, SLOT(save()));
+	// Connect to apply skin
+	connect (_panel->buttonApplySkin, SIGNAL(clicked()), this,SLOT(applySkin()));
+	// Connect to register manually
+	connect (_panel->Register, SIGNAL(clicked()), this, SLOT(registerSlot()));
+}
+
+/**
+ * Destructor
+ */
+QtGUIMainWindow::~QtGUIMainWindow(void) {
+	deleteButtons();
+	delete	_panel;
+	delete  _blinkTimer;
+	delete  _keypad;
+	delete	_lcd;
+	delete  _urlinput;
+	delete	_callmanager;
+	delete 	_mypop;
+	delete 	_trayicon;
+	delete  pt;
+	delete 	_key;
+	delete[] _buf;
+	delete[] phLines;
+}
+
+void
+QtGUIMainWindow::deleteButtons (void) {
+	delete  phoneKey_transf;
+	delete  phoneKey_msg;
+	delete  phoneKey_conf;
+	delete  phoneKey_line0;
+	delete  phoneKey_line1;
+	delete  phoneKey_line2;
+	delete  phoneKey_line3;
+	delete  reduce_button;
+	delete  quit_button;
+	delete  addr_book_button;
+	delete  configuration_button;
+	delete  hangup_button;
+	delete  dial_button;
+	delete  mute_button;
+	delete	dtmf_button;
+	delete  vol_mic;
+    delete  vol_spkr;
+    delete  micVolVector;
+    delete  spkrVolVector;
+
+	for (int j = 0; j < NUMBER_OF_LINES; j++) {
+        delete phLines[j]->button();
+    }
+
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// Private Methods implementations     	                               	     
+///////////////////////////////////////////////////////////////////////////////
+/**
+ * Init and start blink timer for all blinking pixmap, with 500 ms timeout.
+ */
+void
+QtGUIMainWindow::initBlinkTimer(void) {
+	_blinkTimer = new QTimer(this);
+	_blinkTimer->start(500);
+}
+
+/**
+ * Init variable with skin choice
+ */
+QString
+QtGUIMainWindow::setPathSkin (void) {
+	return QString(Config::getchar(
+					"Preferences", "Themes.skinChoice", "metal"));
+}
+
+/**
+ * Init variable with ring choice
+ */
+string
+QtGUIMainWindow::ringFile(void) {
+	return get_config_fields_str(AUDIO, RING_CHOICE);
+}
+
+/**
+ * Get whole path for rings
+ */
+string
+QtGUIMainWindow::getRingtoneFile (void) {
+	string ringFilename(Skin::getPathRing(string(RINGDIR), ringFile()));
+	return ringFilename;
+}
+
+void
+QtGUIMainWindow::initSkin (void) {
+	// Load file configuration skin
+	string skinfilename(Skin::getPath(QString(SKINDIR), setPathSkin(),
+				QString(FILE_INI)));
+	
+	if (!_apply) {
+		this->pt = new Point(skinfilename);	
+	} else {
+		// If click on apply button
+		delete pt;
+		deleteButtons();
+		this->pt = new Point(skinfilename);	
+	}
+	// Initialisation of the buttons
+	initSpkrVolumePosition();
+    initMicVolumePosition();
+	initButtons();
+	initVolume();
+	// Connections of the buttons
+	connections();
+	
+	// Load background image phone
+	setbgPixmap (new QPixmap (Skin::getPath(QString(SKINDIR), 
+											setPathSkin(),
+											QString(PIXMAP_PHONE))));
+	// Transform pixmap to QImage
+	setSourceImage ();
+	this->setMaximumSize (getSourceImage().width(), getSourceImage().height());
+	this->setGeometry (MAIN_INITIAL_POSITION, 
+					   MAIN_INITIAL_POSITION, 
+					   getSourceImage().width(),
+					   getSourceImage().height());
+	// Calculate just one time the transparency mask bit to bit
+	transparencyMask ();
+
+	// Line pixmaps initialisation
+	for (int i = 0; i < NUMBER_OF_LINES; i++) {
+		for (int j = 0; j < NUMBER_OF_STATES; j++) {
+	 		TabLinePixmap[i][j] = QPixmap(Skin::getPath(QString(SKINDIR),
+												setPathSkin(), 
+												QString(PIXMAP_LINE(i, j))));
+	 	}
+	}
+	// Message pixmaps initialisation
+	TabMsgPixmap[0] = QPixmap(Skin::getPath(QString(SKINDIR), setPathSkin(), 
+						PIXMAP_MESSAGE_OFF));
+	TabMsgPixmap[1] = QPixmap(Skin::getPath(QString(SKINDIR), setPathSkin(), 
+						PIXMAP_MESSAGE_ON));
+}
+
+void
+QtGUIMainWindow::initSpkrVolumePosition (void) {
+    if (pt->getDirection(VOL_SPKR) == VERTICAL) {
+        vol_spkr_x = Config::get("Audio", "Volume.speakers_x",
+                pt->getX(VOL_SPKR));
+        vol_spkr_y = Config::get("Audio", "Volume.speakers_y",
+                pt->getVariation(VOL_SPKR));
+    } else if (pt->getDirection(VOL_SPKR) == HORIZONTAL) {
+        vol_spkr_x = Config::get("Audio", "Volume.speakers_x",
+                pt->getX(VOL_SPKR) + pt->getVariation(VOL_SPKR));
+        vol_spkr_y = Config::get("Audio", "Volume.speakers_y",
+                pt->getY(VOL_SPKR));
+    }
+}
+                                                                                
+void
+QtGUIMainWindow::initMicVolumePosition (void) {
+    if (pt->getDirection(VOL_MIC) == VERTICAL) {
+        vol_mic_x = Config::get("Audio", "Volume.micro_x", pt->getX(VOL_MIC));
+        vol_mic_y = Config::get("Audio", "Volume.micro_y",
+                pt->getVariation(VOL_MIC));
+    } else if (pt->getDirection(VOL_MIC) == HORIZONTAL) {
+        vol_mic_x = Config::get("Audio", "Volume.micro_x",
+                pt->getX(VOL_MIC) + pt->getVariation(VOL_MIC));
+        vol_mic_y = Config::get("Audio", "Volume.micro_y", pt->getY(VOL_MIC));
+    }
+}
+
+void
+QtGUIMainWindow::initVolume (void) 
+{
+    _callmanager->setSpkrVolume(spkrVolVector->Y() - vol_spkr_y);
+    _callmanager->setMicroVolume(micVolVector->Y() - vol_mic_y);
+}
+
+/**
+ * Inits all phonekey buttons.
+ * Create new QPushButtons, set up tool tip, disable focus, set button geometry
+ * set palette.
+ */
+void
+QtGUIMainWindow::initButtons (void) {
+	// Buttons initialisation
+	phoneKey_msg= new JPushButton(this, NULL, VOICEMAIL);
+	phoneKey_transf = new JPushButton(this, NULL, TRANSFER);
+	phoneKey_conf = new JPushButton(this, NULL, CONFERENCE);
+	reduce_button = new JPushButton(this, NULL, MINIMIZE);
+	quit_button = new JPushButton(this, NULL, CLOSE);
+	addr_book_button = new JPushButton(this, NULL, DIRECTORY);
+	configuration_button = new JPushButton(this, NULL, SETUP);
+	hangup_button = new JPushButton(this, NULL, HANGUP);
+	dial_button = new JPushButton(this, NULL, CONNECT);
+	mute_button = new JPushButton(this, NULL, MUTE);
+	dtmf_button = new JPushButton(this, NULL, DTMF_SHOW);
+
+	// Set tooltip buttons
+	QToolTip::add(reduce_button, tr("Minimize window"));
+	QToolTip::add(quit_button, tr("Close window (Ctrl+Q)"));
+	QToolTip::add(phoneKey_msg, tr("Get your message"));
+	QToolTip::add(phoneKey_transf, tr("Call transfer"));
+	QToolTip::add(phoneKey_conf, tr("Conference"));
+	QToolTip::add(addr_book_button, tr("Address book"));
+	QToolTip::add(configuration_button, tr("Configuration tools (Ctrl+C)"));
+	QToolTip::add(hangup_button, tr("Hangup"));
+	QToolTip::add(dial_button, tr("Dial"));
+	QToolTip::add(mute_button, tr("Mute"));
+	QToolTip::add(dtmf_button, tr("Show DTMF _keypad (Ctrl+D)"));
+
+	// Buttons position
+	phoneKey_msg->move (pt->getX(VOICEMAIL), pt->getY(VOICEMAIL));
+	phoneKey_transf->move (pt->getX(TRANSFER), pt->getY(TRANSFER));
+	phoneKey_conf->move (pt->getX(CONFERENCE), pt->getY(CONFERENCE));
+	reduce_button->move (pt->getX(MINIMIZE), pt->getY(MINIMIZE));
+	addr_book_button->move (pt->getX(DIRECTORY), pt->getY(DIRECTORY));
+	quit_button->move (pt->getX(CLOSE), pt->getY(CLOSE));
+	configuration_button->move (pt->getX(SETUP), pt->getY(SETUP));
+	hangup_button->move (pt->getX(HANGUP), pt->getY(HANGUP));
+	dial_button->move (pt->getX(CONNECT), pt->getY(CONNECT));
+	mute_button->move (pt->getX(MUTE), pt->getY(MUTE));
+	dtmf_button->move (pt->getX(DTMF_SHOW), pt->getY(DTMF_SHOW));
+	
+	// Loop for line buttons
+	// Initialisation, set no focus, set geometry, set palette, pixmap
+	for (int j = 0; j < NUMBER_OF_LINES; j++) {
+		QString lnum;
+   
+		lnum = "l" + lnum.setNum (j + 1);
+		phLines[j]->setButton(new JPushButton(
+					this, NULL, lnum.ascii()));
+		phLines[j]->button()->move (pt->getX(lnum),pt->getY(lnum));
+	}
+     
+	// Set pixmaps volume
+    micVolVector = new Vector(this, VOL_MIC, pt);
+    spkrVolVector = new Vector(this, VOL_SPKR, pt);
+                                                                               
+    vol_mic = new VolumeControl(this, NULL, VOLUME, micVolVector);
+    vol_spkr = new VolumeControl(this, NULL, VOLUME, spkrVolVector);
+    vol_mic->move(vol_mic_x, vol_mic_y);
+    vol_spkr->move(vol_spkr_x, vol_spkr_y);
+}
+
+void
+QtGUIMainWindow::connections (void) {
+	// Connect for clicked numeric _keypad button 
+	connect ((QObject*)_keypad->key0, SIGNAL(clicked()), this, 
+			SLOT(pressedKey0()));
+	connect ((QObject*)_keypad->key1, SIGNAL(clicked()), this, 
+			SLOT(pressedKey1()));
+	connect ((QObject*)_keypad->key2, SIGNAL(clicked()), this, 
+			SLOT(pressedKey2()));
+	connect ((QObject*)_keypad->key3, SIGNAL(clicked()), this, 
+			SLOT(pressedKey3()));
+	connect ((QObject*)_keypad->key4, SIGNAL(clicked()), this, 
+			SLOT(pressedKey4()));
+	connect ((QObject*)_keypad->key5, SIGNAL(clicked()), this, 
+			SLOT(pressedKey5()));
+	connect ((QObject*)_keypad->key6, SIGNAL(clicked()), this, 
+			SLOT(pressedKey6()));
+	connect ((QObject*)_keypad->key7, SIGNAL(clicked()), this, 
+			SLOT(pressedKey7()));
+	connect ((QObject*)_keypad->key8, SIGNAL(clicked()), this, 
+			SLOT(pressedKey8()));
+	connect ((QObject*)_keypad->key9, SIGNAL(clicked()), this, 
+			SLOT(pressedKey9()));
+	connect ((QObject*)_keypad->keyStar, SIGNAL(clicked()), this, 
+			SLOT(pressedKeyStar()));
+	connect ((QObject*)_keypad->keyHash, SIGNAL(clicked()), this, 
+			SLOT(pressedKeyHash()));
+	connect ((QObject*)_keypad->keyClose, SIGNAL(clicked()), this, 
+			SLOT(dtmfKeypad()));
+
+	// Connections for the lines 
+	connect (phLines[0]->button(), SIGNAL(clicked()), this, 
+			SLOT(button_line0()));
+	connect (phLines[1]->button(), SIGNAL(clicked()), this, 
+			SLOT(button_line1()));
+	connect (phLines[2]->button(), SIGNAL(clicked()), this, 
+			SLOT(button_line2()));
+	connect (phLines[3]->button(), SIGNAL(clicked()), this, 
+			SLOT(button_line3()));
+	connect (phLines[4]->button(), SIGNAL(clicked()), this, 
+			SLOT(button_line4()));
+	connect (phLines[5]->button(), SIGNAL(clicked()), this, 
+			SLOT(button_line5()));
+
+	// Misc 
+	connect (phoneKey_msg, SIGNAL(clicked()), this, SLOT(button_msg()));
+	connect (phoneKey_transf, SIGNAL(clicked()), this, SLOT(button_transfer()));
+	connect (phoneKey_conf, SIGNAL(clicked()), this, SLOT(button_conf()));
+	connect (dial_button, SIGNAL(clicked()), this, SLOT(dial()));
+	connect (mute_button, SIGNAL(clicked()), this, SLOT(button_mute()));
+	connect (hangup_button, SIGNAL(clicked()), this, SLOT(hangupLine()));
+	connect (configuration_button,SIGNAL(clicked()),this,SLOT(configuration()));
+	connect (addr_book_button, SIGNAL(clicked()), this,SLOT(addressBook()));
+	connect (dtmf_button, SIGNAL(clicked()), this, SLOT(dtmfKeypad()));
+
+	// Connect to reduce
+	connect (reduce_button, SIGNAL(clicked()), this, SLOT(reduceHandle()));
+	// Connect to quit with keyboard
+	connect (this, SIGNAL(keyPressed(int)), this, SLOT(qt_quitApplication()));
+   	// Connect to quit with quit button
+	connect (quit_button, SIGNAL(clicked()), this, SLOT(qt_quitApplication()));
+
+	// Connections for volume control
+    connect(vol_spkr, SIGNAL(setVolumeValue(int)), this,
+            SLOT(volumeSpkrChanged(int)));
+    connect(vol_mic, SIGNAL(setVolumeValue(int)), this,
+            SLOT(volumeMicChanged(int)));
+
+}
+
+/**
+ * Returns true if the keyboard mapping returns letters. 
+ *
+ * @return	bool
+ */
+bool
+QtGUIMainWindow::isInTextMode (void) {
+	if (modeType == TEXT_MODE) {
+		return true;
+	} else {
+		return false;
+	}
+}
+
+/**
+ * Returns true if the keyboard mapping returns digits. 
+ *
+ * @return	bool
+ */
+bool
+QtGUIMainWindow::isInNumMode (void) {
+	if (modeType == NUM_MODE) {
+		return true;
+	} else {
+		return false;
+	}
+}
+
+/**
+ * Sets up the keyboard mapping mode.
+ */
+void
+QtGUIMainWindow::setMode (int mode) {
+	this->modeType = mode;
+}
+
+short 
+QtGUIMainWindow::isThereIncomingCall (void)
+{
+	for (int i = 0; i < NUMBER_OF_LINES; i++) {
+		if (_TabIncomingCalls[i] > 0) {
+			return _TabIncomingCalls[i];
+		}
+	}
+	
+	return -1;
+}
+
+short 
+QtGUIMainWindow::isIncomingCall (int line)
+{
+	if (_TabIncomingCalls[line] > 0) {
+		return 	_TabIncomingCalls[line];
+	} else {
+		return -1;
+	}
+}
+
+int
+QtGUIMainWindow::id2line (short id)
+{
+	int i;
+	for (i = 0; i < NUMBER_OF_LINES; i++) {
+		if (phLines[i]->getCallId() == id) {
+			return i;
+		}
+	}
+	if (i == NUMBER_OF_LINES) {
+		_debug("Id is not attributed to a phoneline\n");
+		return -1;
+	}
+	return -1;
+}
+
+short
+QtGUIMainWindow::line2id (int line)
+{
+	short i;
+	if (line != -1) {
+		i = phLines[line]->getCallId();
+	} else {
+		return -1;
+	}
+	
+	if (i > 0) {
+		return i;
+	} else {
+		return -1;
+	}
+}
+
+void 
+QtGUIMainWindow::changeLineStatePixmap (int line, line_state state)
+{
+	// Set free-status for current line
+    phLines[line]->setState(state);
+    // Set free-pixmap
+	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;
+	}
+   	phLines[line]->button()->setPixmap(TabLinePixmap[line][state]);
+}
+
+int
+QtGUIMainWindow::busyLineNumber (void)
+{
+	int temp = -1;
+    for (int i = 0; i < NUMBER_OF_LINES; i++) {
+        if (phLines[i]->isBusy() and i != _currentLine) {
+            temp = i;
+        }
+    }
+    return temp;
+}
+
+int
+QtGUIMainWindow::putOnHoldBusyLine (int line)
+{
+	if (line != -1 and !phLines[line]->getbRinging()) {
+		// Occurs when newly off-hook line replaces another one.
+		qt_onHoldCall(line2id(line));
+		changeLineStatePixmap(line, ONHOLD);
+		return 1;
+	} 
+	return 0;
+}
+
+void
+QtGUIMainWindow::dialtone (bool var) {
+    if (_callmanager->error()->getError() == 0) {
+        if (_dialtone != var) {
+            _dialtone = var;
+        }
+        _callmanager->setTonezone(var);
+        _callmanager->getTonegenerator()->toneHandle(ZT_TONE_DIALTONE);
+    } else {
+        _callmanager->error()->errorName(DEVICE_NOT_OPEN, NULL);
+    }
+}
+
+////////////////////////////////////////////////////////////////////////////
+// Public functions
+////////////////////////////////////////////////////////////////////////////
+Call* 
+QtGUIMainWindow::getCall (short id)
+{
+	return _callmanager->getCall(id);
+}
+
+int 
+QtGUIMainWindow::associateCall2Line (short id)
+{
+	int i;
+
+	if (getChooseLine()) {
+		i = getCurrentLine();
+		phLines[i]->setState(BUSY);
+		phLines[i]->setCallId(id);
+		return i;
+	} else {
+		for (i = 0 ; i < NUMBER_OF_LINES; i++) {
+			if (phLines[i]->isFree()) {
+				phLines[i]->setState(BUSY);
+				phLines[i]->setCallId(id);
+				return i;
+			}
+		}
+		if (i == NUMBER_OF_LINES) {
+			displayError("All the lines are busy");
+			return -1;
+		}
+		return -1;
+	}
+}
+
+PhoneLine* 
+QtGUIMainWindow::getPhoneLine (short id)
+{
+	int i;
+	for (i = 0; i < NUMBER_OF_LINES; i++) {
+		if (phLines[i]->getCallId() == id) {
+			return phLines[i];
+		} 
+	}
+	if (i == NUMBER_OF_LINES) {
+		_debug("Id is not attributed to a phoneline\n");
+		return NULL;
+	}
+	return NULL;
+}
+
+int 
+QtGUIMainWindow::getCurrentLine (void)
+{
+	return _currentLine;
+}
+
+void 
+QtGUIMainWindow::setCurrentLine (int current)
+{
+	_currentLine = current;
+}
+
+int 
+QtGUIMainWindow::getElapse (void)
+{
+	int line = getCurrentLine();
+	return (phLines[line]->timer->elapsed() / 1000);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// Reimplementation of virtual functions
+/////////////////////////////////////////////////////////////////////////////
+
+int 
+QtGUIMainWindow::incomingCall (short id)
+{
+	int i;
+	// Associate call id with a phoneline i.
+	i = associateCall2Line(id);
+	if (i >= 0) {
+		_TabIncomingCalls[i] = id;
+		_debug("Phoneline %d associated to id %d\n", i, id);
+		if (getPhoneLine(id) != NULL) {
+			// Set boolean to true to blink pixmap to notify the ringing line 
+			getPhoneLine(id)->setbRinging(true);
+			// Set the status to the phoneline
+			getPhoneLine(id)->setStatus(QString(getCall(id)->getStatus()));
+		}
+	}
+	return i;
+}
+	
+int 
+QtGUIMainWindow::peerAnsweredCall (short id)
+{
+	getPhoneLine(id)->setStatus(QString(getCall(id)->getStatus()));
+	// Afficher call-timer
+	startCallTimer(id);
+	setChooseLine(false);
+	
+	return 1;
+}
+
+int 
+QtGUIMainWindow::peerRingingCall (short id)
+{
+	getPhoneLine(id)->setStatus(QString(getCall(id)->getStatus()));
+	return 1;
+}
+
+	
+int 
+QtGUIMainWindow::peerHungupCall (short id)
+{
+	int line = id2line(id);
+
+	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;
+}
+
+void 
+QtGUIMainWindow::displayTextMessage (short id, const string& message)
+{
+	_lcd->clearBuffer();
+	_lcd->appendText(message);
+}
+	
+void 
+QtGUIMainWindow::displayError (const string& error)
+{
+	_lcd->clearBuffer();
+	_lcd->appendText(error);
+}
+	
+void 
+QtGUIMainWindow::displayStatus (const string& status)
+{
+	if (status.compare(HUNGUP_STATUS) == 0 or 
+			status.compare(TRANSFER_STATUS) == 0) {
+		_lcd->clearBuffer();
+	}
+	_lcd->setStatus(status);
+}
+
+void 
+QtGUIMainWindow::displayContext (short id)
+{
+	displayStatus(getCall(id)->getStatus());
+	if (getCall(id)->isIncomingType()) {
+		displayTextMessage (id, getCall(id)->getCallerIdName());
+	} else if (getCall(id)->isOutgoingType()) {
+		displayTextMessage (id, getCall(id)->getCallerIdNumber());
+	} else {
+		_debug("No call with id *%d\n", id);
+	}
+}
+
+void 
+QtGUIMainWindow::setup (void) 
+{
+	configuration();
+}
+
+////////////////////////////////////////////////////////////////////////////
+// IP-phone user actions
+////////////////////////////////////////////////////////////////////////////
+
+int 
+QtGUIMainWindow::qt_outgoingCall (void)
+{
+	int id, line;
+	if (_lcd->getTextBuffer() == NULL) {
+		_debug("Enter a phone number\n");
+		_callmanager->displayStatus(ENTER_NUMBER_STATUS);
+		return -1;
+	}
+	const string to(_lcd->getTextBuffer().ascii());
+	if (to.empty()) {
+		_debug("Enter a phone number\n");
+		_callmanager->displayStatus(ENTER_NUMBER_STATUS);
+		return -1;
+	} 
+	
+	id = outgoingCall(to);
+	if (id > 0) {	
+		line = associateCall2Line(id);
+
+		setCurrentLine(line);
+		displayStatus(TRYING_STATUS);
+		_callmanager->getCall(id)->setCallerIdNumber(to);
+		changeLineStatePixmap(line, BUSY);
+	}
+	
+	return line;
+}	
+	
+int 
+QtGUIMainWindow::qt_hangupCall (short id)
+{
+	int i;
+	i = hangupCall(id);
+	stopCallTimer(id);	
+	displayStatus(HUNGUP_STATUS);
+	setCurrentLine(-1);
+	return i;
+}	
+	
+int 
+QtGUIMainWindow::qt_answerCall (short id)
+{
+	int i;
+	i = answerCall(id);
+	getPhoneLine(id)->setStatus(QString(getCall(id)->getStatus()));
+	startCallTimer(id);	
+	displayStatus(CONNECTED_STATUS);
+	getPhoneLine(id)->setbRinging(false);
+	return i;	
+}	
+	
+int 
+QtGUIMainWindow::qt_onHoldCall (short id)
+{
+	int i;
+	i = onHoldCall(id);
+	getPhoneLine(id)->setStatus(QString(getCall(id)->getStatus()));
+	return i;	
+}	
+	
+int 
+QtGUIMainWindow::qt_offHoldCall (short id)
+{
+	int i;
+	i = offHoldCall(id);
+	getPhoneLine(id)->setStatus(QString(getCall(id)->getStatus()));
+	displayStatus(CONNECTED_STATUS);
+	return i;	
+}	
+	
+int 
+QtGUIMainWindow::qt_transferCall (short id)
+{
+	int i;
+	const string to(_lcd->getTextBuffer().ascii());;
+	_debug("Transfer call %d to %s\n", id, to.data());
+	i = transferCall(id, to);
+	getPhoneLine(id)->setStatus(QString(getCall(id)->getStatus()));
+	return i;	
+}	
+	
+void 
+QtGUIMainWindow::qt_muteOn (short id)
+{
+	int i;
+	i = muteOn(id);
+	getPhoneLine(id)->setStatus(QString(getCall(id)->getStatus()));	
+	displayStatus(MUTE_ON_STATUS);
+}	
+	
+void 
+QtGUIMainWindow::qt_muteOff (short id)
+{
+	int i;
+	i = muteOff(id);
+	getPhoneLine(id)->setStatus(QString(getCall(id)->getStatus()));
+	displayStatus(CONNECTED_STATUS);
+}	
+	
+int 
+QtGUIMainWindow::qt_refuseCall (short id)
+{
+	int i;
+	i = refuseCall(id);
+//	getPhoneLine(id)->setStatus(QString(getCall(id)->getStatus()));
+	displayStatus(HUNGUP_STATUS);
+	getPhoneLine(id)->setbRinging(false);
+	_TabIncomingCalls[id2line(id)] = -1;
+	return i;	
+}	
+	
+int 
+QtGUIMainWindow::qt_cancelCall (short id)
+{
+	int i;
+	i = cancelCall(id);
+	getPhoneLine(id)->setStatus(QString(getCall(id)->getStatus()));
+	displayStatus(HUNGUP_STATUS);
+	
+	return i;	
+}	
+
+///////////////////////////////////////////////////////////////////////////////
+// Public Methods implementations                                            //
+///////////////////////////////////////////////////////////////////////////////
+
+	
+/**
+ * Initializes LCD display, and move it at the configuration file position.
+ */
+void
+QtGUIMainWindow::setMainLCD (void) {
+	// Screen initialisation
+	this->_lcd->move (pt->getX(SCREEN), pt->getY(SCREEN));
+}
+
+
+int
+QtGUIMainWindow::toggleLine (int line) 
+{
+	int id;
+	int busyLine;
+	Call* call;
+
+	if (line == -1) {
+		return -1;
+	}
+	
+	setCurrentLine(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);
+		if (call == NULL) {
+		// Check if the call exists
+			return -1;
+		} else if (call->isBusy()){
+			// If call is busy, put this call on hold
+			_debug("CASE 1\n");
+			changeLineStatePixmap(line, ONHOLD);
+			displayStatus(ONHOLD_STATUS);
+			qt_onHoldCall(id);
+		} else if (call->isOnHold()) {
+			// If call is on hold, put this call on busy state
+			_debug("CASE 2\n");
+			changeLineStatePixmap(line, BUSY);
+			putOnHoldBusyLine(busyLine);
+			if (getChooseLine()) {
+				// If a free line is off-hook, set this line to free state
+				setChooseLine(false);
+				changeLineStatePixmap(getChosenLine(), FREE);
+				dialtone(false);
+			}		
+			_lcd->setInFunction(true);
+			qt_offHoldCall(id);
+			displayContext(id);
+		} else if (call->isIncomingType()) {
+		// If incoming call occurs
+			_debug("CASE 3\n");
+			changeLineStatePixmap(line, BUSY);
+			putOnHoldBusyLine(busyLine);
+			qt_answerCall(id);
+		} else {
+			_debug("Others cases to handle\n");
+			return -1;
+		}	
+	} else {
+	// If just click on free line
+		_debug("CASE 4\n");
+		phLines[line]->button()->setPixmap(TabLinePixmap[line][BUSY]);
+		displayStatus(ENTER_NUMBER_STATUS);
+		setChooseLine(true);
+		setChosenLine(line);
+
+		putOnHoldBusyLine(busyLine);
+		if (getFreeLine() != -1 and getFreeLine() != line) {
+			changeLineStatePixmap(getFreeLine(), FREE);
+		}
+	
+		setFreeLine(line);			
+		_lcd->setInFunction(false);
+		_lcd->clearBuffer();
+		dialtone(true);
+	}
+	return 1;
+}
+
+/**
+ * Actions occur when click on hang off button. 
+ * Use to validate incoming and outgoing call, transfer call.
+ */
+void
+QtGUIMainWindow::dial (void) 
+{
+	short i;
+	int line = -1;
+	
+	if ((i = isThereIncomingCall()) > 0) {
+		// If new incoming call 
+		_debug("Dial : new incoming call\n");
+		line = id2line(i);
+		_TabIncomingCalls[line] = -1;
+		toggleLine(line);
+	} else if (getTransfer()){
+		// If call transfer
+		_debug("Dial : call transfer\n");
+		qt_transferCall (line2id(getCurrentLine()));
+	} else {
+		// If new outgoing call  
+		_debug("Dial : outgoing call\n");
+		if (getCurrentLine() < 0 or getChooseLine()) {
+			line = qt_outgoingCall();
+		}
+	}		
+}
+
+/**
+ * Hangup the current call.
+ */
+void
+QtGUIMainWindow::hangupLine (void) 
+{  
+	int i;
+	int line = getCurrentLine();
+	int id = phLines[line]->getCallId();
+	if (_callmanager->getbCongestion()) {
+		_callmanager->congestion(false);
+        _lcd->clear(QString(ENTER_NUMBER_STATUS));
+	}
+	
+	if (line >= 0 and id > 0) {
+		qt_hangupCall(id);
+		changeLineStatePixmap(line, FREE);
+		phLines[line]->setCallId(0);
+		setChooseLine(false);
+	} else if ((i = isThereIncomingCall()) > 0){
+		// To refuse new incoming call 
+		qt_refuseCall(i);
+		changeLineStatePixmap(id2line(i), FREE);
+	} else if (line >= 0) {
+		_debug("Just load free pixmap for the line %d\n", line);
+		changeLineStatePixmap(line, FREE);
+		dialtone(false);
+		setChooseLine(false);
+	}
+}
+
+/**
+ * Stop the blinking message slot and load the message-off button pixmap.
+ */
+void
+QtGUIMainWindow::stopTimerMessage (void) {
+   	_msgVar = false;
+    phoneKey_msg->setPixmap(TabMsgPixmap[FREE]);
+}
+
+/**
+ * Stop the call timer.
+ * 
+ * @param	line: number of line 
+ */
+void
+QtGUIMainWindow::stopCallTimer (short id) {
+	// Stop the call timer when hang up
+    if (getPhoneLine(id)->timer != NULL) {
+        getPhoneLine(id)->stopTimer();
+    }
+    // No display call timer, display current hour
+	_lcd->setInFunction(false);
+    getPhoneLine(id)->first = true;
+}
+
+/**
+ * Start the call timer.
+ * 
+ * @param	line: number of line 
+ */
+void
+QtGUIMainWindow::startCallTimer (short id) {
+	// Call-timer enable
+    _lcd->setInFunction(true);
+                                                                                
+    // To start the timer for display text just one time
+    if (getPhoneLine(id)->first) {
+        getPhoneLine(id)->startTimer();
+        getPhoneLine(id)->first = false;
+    }
+} 
+
+///////////////////////////////////////////////////////////////////////////////
+// Public slot implementations                                               //
+///////////////////////////////////////////////////////////////////////////////
+void
+QtGUIMainWindow::volumeSpkrChanged (int val) {
+	_callmanager->setSpkrVolume(val);
+}
+
+void
+QtGUIMainWindow::volumeMicChanged (int val) {
+	_callmanager->setMicroVolume(val);
+}
+
+void
+QtGUIMainWindow::registerSlot (void) {
+	registerVoIPLink();
+}
+
+/**
+ * Slot to blink with free and busy pixmaps when line is hold.
+ */
+void
+QtGUIMainWindow::blinkLineSlot (void) {
+    static bool isOn = false;
+    int state = BUSY;                                                                                 
+    if  (!isOn) {
+        state = FREE;
+    }
+                                                                                
+    for (int i = 0; i < NUMBER_OF_LINES; i++) {
+        // If lines are hold on, set blinking pixmap
+        if (phLines[i]->isOnHold()) {
+            phLines[i]->button()->setPixmap(TabLinePixmap[i][state]);
+        }
+    }
+    isOn = !isOn;
+}
+
+// Dial the voicemail Number automatically when button is clicked
+void
+QtGUIMainWindow::button_msg (void) {
+     stopTimerMessage();
+     _lcd->appendText(get_config_fields_str(PREFERENCES, VOICEMAIL_NUM));
+	 qt_outgoingCall();
+}
+
+// Allow to enter a phone number to transfer the current call.
+// This number is validated by ok-button or typing Enter
+void
+QtGUIMainWindow::button_transfer (void) {
+	if (getCurrentLine() != -1) {
+		setTransfer(true);
+		onHoldCall(line2id(getCurrentLine()));
+		displayStatus(TRANSFER_STATUS);
+    }
+}
+
+void
+QtGUIMainWindow::button_conf (void) {
+//TODO: This feature is not implemented yet
+	QMessageBox::information(this, "Conference",
+		"This feature is not implemented yet", QMessageBox::Yes);
+}
+
+void
+QtGUIMainWindow::button_line0 (void) {
+ 	toggleLine (0);
+	 
+}
+
+void
+QtGUIMainWindow::button_line1 (void) {
+	toggleLine (1);
+}
+
+void
+QtGUIMainWindow::button_line2 (void) {
+	toggleLine (2);
+}
+
+void
+QtGUIMainWindow::button_line3 (void) {
+	toggleLine (3);
+}
+
+void
+QtGUIMainWindow::button_line4 (void) {
+	toggleLine (4);
+}
+
+void
+QtGUIMainWindow::button_line5 (void) {
+	toggleLine (5);
+}
+
+void
+QtGUIMainWindow::button_mute(void) 
+{
+   // Disable micro sound
+    static bool isOn = true;
+	
+	int id = line2id(getCurrentLine());
+	
+	if (_callmanager->getNumberOfCalls() > 0) {
+    // If there is at least a pending call
+        if(!isOn) {
+			qt_muteOff(id);
+        } else {
+			qt_muteOn(id);
+        }                                                                       
+        isOn = !isOn;
+    }
+}
+
+// Show the setup _panel
+void
+QtGUIMainWindow::configuration (void) {
+	 _panel->show();
+}
+
+void
+QtGUIMainWindow::addressBook (void) {
+//	TODO: phonebook->show();
+	QMessageBox::information(this, "Directory",
+		"This feature is not implemented yet", QMessageBox::Yes);
+}
+
+// Handle the dtmf-button click
+void
+QtGUIMainWindow::dtmfKeypad (void) {
+	if (_keypad->isVisible()) {
+        // Hide _keypad if it's visible.
+        _keypad->hide();
+    } else {
+                                                                                
+        if (_first and !getMoved()) {
+            // If it's the first time that _keypad is shown.
+            // The position is fixed with the main initial position.
+            _first = false;
+            _keypad->setGeometry (MAIN_INITIAL_POSITION +
+                                    this->getSourceImage().width(),
+                                MAIN_INITIAL_POSITION,
+                                _keypad->getSourceImage().width(),
+                                _keypad->getSourceImage().height());
+        } else {
+            // If main window is moved, we calculate the _keypad new position
+            // to fix it with main window
+            if (getMoved()) {
+                _keypad->setGeometry (positionOffsetX(),
+                                getGlobalMouseY() - getMouseY(),
+                                _keypad->getSourceImage().width(),
+                                _keypad->getSourceImage().height());
+            }
+            if (_keypad->getMoved()) {
+                // If _keypad is moved, it shows at the previous position
+                _keypad->setGeometry (
+                                _keypad->getGlobalMouseX()-_keypad->getMouseX(),
+                                _keypad->getGlobalMouseY()-_keypad->getMouseY(),
+                                _keypad->getSourceImage().width(),
+                                _keypad->getSourceImage().height());
+            }
+        }
+                                                                                
+        // Show _keypad if it's hidden.
+        _keypad->show();
+    }
+
+}
+
+// Get x-position offset, related to the screen size, to show numeric _keypad
+int
+QtGUIMainWindow::positionOffsetX (void) {
+	QRect screenRect;
+	int offset;
+
+	// Get the screen geometry
+	screenRect = (QApplication::desktop())->screenGeometry (0);
+	
+	offset = this->getSourceImage().width() - getMouseX() + getGlobalMouseX();
+	if (offset + _keypad->getSourceImage().width() > screenRect.right()) {
+		return getGlobalMouseX() - (
+								getMouseX() + _keypad->getSourceImage().width());
+	} else {
+		return offset;
+	}
+}
+
+/**
+ * Slot when receive a message, blink pixmap.
+ */
+void
+QtGUIMainWindow::blinkMessageSlot (void) {
+    static bool isOn = false;     
+	int stateMsg = BUSY;
+                                                                                
+    if(!isOn) {
+        stateMsg = FREE;
+    }
+                                                                                
+    if (_msgVar) {
+        phoneKey_msg->setPixmap(TabMsgPixmap[stateMsg]);
+    }
+    isOn = !isOn;
+}
+
+
+/**
+ * Slot when phone is ringing, blink pixmap.
+ */
+void
+QtGUIMainWindow::blinkRingSlot (void) 
+{
+    static bool isOn = false;
+    int state = BUSY;
+    int line;
+	int i;
+
+	if (isThereIncomingCall() != -1) {
+		// For the line
+		if  (!isOn) {
+			state = FREE;
+		}
+		for (i = 0; i < NUMBER_OF_LINES; i++) {
+			if (isIncomingCall(i) != -1 and phLines[i]->getbRinging()) {
+				phLines[i]->button()->setPixmap(TabLinePixmap[i][state]);
+			}
+		}
+		isOn = !isOn;
+	}
+}
+
+/**
+ * Slot to quit application with or without QMessageBox confirmation
+ */
+void
+QtGUIMainWindow::qt_quitApplication (void) 
+{
+	// Save volume positions
+    // TODO: save position if direction is horizontal
+    Config::set("Audio", "Volume.speakers_x",  pt->getX(VOL_SPKR));
+    if (vol_spkr->getValue() != 0) {
+        Config::set("Audio", "Volume.speakers_y",  pt->getY(VOL_SPKR) -
+            vol_spkr->getValue());
+    }
+    Config::set("Audio", "Volume.micro_x",  pt->getX(VOL_MIC));
+    if (vol_mic->getValue() != 0) {
+        Config::set("Audio", "Volume.micro_y",  pt->getY(VOL_MIC) -
+            vol_mic->getValue());
+    }
+    // Save current position of the controls volume
+    save();
+	
+	if (get_config_fields_int(PREFERENCES, CONFIRM_QUIT) == YES) {
+		// If message-box
+		if (QMessageBox::question(this, "Confirm quit",
+		"Are you sure you want to quit SFLPhone ?",
+		 QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) {		
+			QApplication::exit(0);
+			if (!quitApplication()) {
+				_debug("Your data didn't be saved\n");
+			}
+		}
+	} else {
+		// If no message-box
+		QApplication::exit(0);
+		if (!quitApplication()) {
+			_debug("Your data didn't be saved\n");
+		}
+	}
+}
+
+/**
+ * Slot to strip _urlinput.
+ */
+void
+QtGUIMainWindow::stripSlot (void) {
+    QRegExp rx(REG_EXPR);
+    _lcd->appendText(_urlinput->url->text().remove(rx));
+    _urlinput->close();
+}
+
+/**
+ * Slot when numeric _keypad phonekey is pressed, append the key text and setup 
+ * the DTMF _keypad .
+ *
+ * @param	button group id 
+ */ 
+void
+QtGUIMainWindow::pressedKeySlot (int id) {
+	char code = 0;
+    int pulselen = 0;
+    int a = 0;
+	int callid;
+                                                                                
+    // Stop dial tone
+    if (_dialtone) {
+        dialtone(false);
+    }
+                                                                                
+    switch (id) {
+        case KEYPAD_ID_0:       code = '0'; break;
+        case KEYPAD_ID_1:       code = '1'; break;
+        case KEYPAD_ID_2:       code = '2'; break;
+        case KEYPAD_ID_3:       code = '3'; break;
+        case KEYPAD_ID_4:       code = '4'; break;
+        case KEYPAD_ID_5:       code = '5'; break;
+        case KEYPAD_ID_6:       code = '6'; break;
+        case KEYPAD_ID_7:       code = '7'; break;
+        case KEYPAD_ID_8:       code = '8'; break;
+        case KEYPAD_ID_9:       code = '9'; break;
+        case KEYPAD_ID_STAR:    code = '*'; break;
+        case KEYPAD_ID_HASH:    code = '#'; break;
+    }
+       
+	callid = line2id(getCurrentLine());
+    if (callid != -1 and getCall(callid)->isBusy()) {
+        sendDtmf(callid, code); // pour envoyer DTMF
+    }
+
+	// Handle dtmf
+    _key->startTone(code);
+    _key->generateDTMF(_buf, SAMPLING_RATE);
+    _callmanager->audiodriver->audio_buf.resize(SAMPLING_RATE);
+    _callmanager->audiodriver->audio_buf.setData(
+                                        _buf, _callmanager->getSpkrVolume());
+                                                                                
+    pulselen = get_config_fields_int(SIGNALISATION, PULSE_LENGTH);
+    _callmanager->audiodriver->audio_buf.resize(pulselen * (OCTETS/1000));
+    a = _callmanager->audiodriver->writeBuffer();
+    if (a == 1) {
+        pressedKeySlot(id);
+    } else {
+        //if (_callmanager->error->getError() == 0)
+            _lcd->appendText (code);
+        /*else if (callmanager->error->getError() == 1) {
+            _lcd->clearBuffer();
+            _callmanager->error->setError(0);
+            _lcd->appendText (code);
+        }*/
+    }
+}
+
+// Save settings in config-file
+void 
+QtGUIMainWindow::save() {
+	saveConfig();
+}
+
+void
+QtGUIMainWindow::applySkin (void) {
+	_apply = true;
+    // For skin of the screen
+    _lcd->initGraphics();
+    setMainLCD();
+    // For skin of the gui
+    initSkin();
+
+}
+
+
+// Handle operation to minimize the application
+void 
+QtGUIMainWindow::reduceHandle (void) {
+	if (get_config_fields_int(PREFERENCES, CHECKED_TRAY)) {
+        clickHandle();
+    } else {
+        showMinimized();
+    }
+}
+
+// Handle mouse left-button click to minimize/maximize the application
+void
+QtGUIMainWindow::clickHandle (void) {
+	if (this->isShown()) {
+		hide();
+	}
+	
+	else if (this->isMinimized()) {
+		showMaximized();
+	}
+	
+	else {
+		show();
+	}
+}
+
+void
+QtGUIMainWindow::pressedKey0 (void) {
+	pressedKeySlot (KEYPAD_ID_0);
+}
+
+void
+QtGUIMainWindow::pressedKey1 (void) {
+	pressedKeySlot (KEYPAD_ID_1);
+}
+
+void
+QtGUIMainWindow::pressedKey2 (void) {
+	pressedKeySlot (KEYPAD_ID_2);
+}
+void
+QtGUIMainWindow::pressedKey3 (void) {
+	pressedKeySlot (KEYPAD_ID_3);
+}
+void
+QtGUIMainWindow::pressedKey4 (void) {
+	pressedKeySlot (KEYPAD_ID_4);
+}
+void
+QtGUIMainWindow::pressedKey5 (void) {
+	pressedKeySlot (KEYPAD_ID_5);
+}
+void
+QtGUIMainWindow::pressedKey6 (void) {
+	pressedKeySlot (KEYPAD_ID_6);
+}
+void
+QtGUIMainWindow::pressedKey7 (void) {
+	pressedKeySlot (KEYPAD_ID_7);
+}
+void
+QtGUIMainWindow::pressedKey8 (void) {
+	pressedKeySlot (KEYPAD_ID_8);
+}
+void
+QtGUIMainWindow::pressedKey9 (void) {
+	pressedKeySlot (KEYPAD_ID_9);
+}
+void
+QtGUIMainWindow::pressedKeyStar  (void) {
+	pressedKeySlot (KEYPAD_ID_STAR);
+}
+void
+QtGUIMainWindow::pressedKeyHash (void) {
+	pressedKeySlot (KEYPAD_ID_HASH);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// Protected Methods implementations                                         //
+///////////////////////////////////////////////////////////////////////////////
+/**
+ * Reimplementation of keyPressEvent() to handle the keyboard mapping.
+ */
+void
+QtGUIMainWindow::keyPressEvent(QKeyEvent *e) {
+	// Misc. key	  
+	switch (e->key()) {
+	case Qt::Key_At:
+	case Qt::Key_Colon:
+	case Qt::Key_Period:
+	case Qt::Key_Comma:
+	case Qt::Key_Plus:
+	case Qt::Key_Minus:
+	case Qt::Key_Slash:
+		_lcd->appendText(QChar(e->key()));
+		return;
+	   	break;
+
+	case Qt::Key_Backspace:
+		_lcd->backspace();
+		return;
+	   	break;	
+
+	case Qt::Key_Escape:
+		hangupLine();
+		return;
+		break;	
+
+	case Qt::Key_Return:
+	case Qt::Key_Enter:
+		dial();
+		return;
+		break;	
+
+	case Qt::Key_F1:
+	case Qt::Key_F2:
+	case Qt::Key_F3:
+	case Qt::Key_F4:
+	case Qt::Key_F5:
+	case Qt::Key_F6:
+		this->toggleLine(e->key() - Qt::Key_F1);
+		return;
+	   	break;
+		
+	case Qt::Key_L:
+ 		if (e->state() == Qt::ControlButton ) {		
+			_lcd->clear();
+			return;
+		}
+	   	break;
+	case Qt::Key_Q :
+ 		if (e->state() == Qt::ControlButton ) {
+			emit keyPressed(e->key());
+			return;			
+		}			
+		break;
+	case Qt::Key_O :
+ 		if (e->state() == Qt::ControlButton ) {
+		 	_urlinput->show();
+			return;			
+		}			
+		break;
+	case Qt::Key_C :
+ 		if (e->state() == Qt::ControlButton ) {
+		 	configuration();
+			return;			
+		}			
+		break;
+	case Qt::Key_D :
+ 		if (e->state() == Qt::ControlButton ) {
+		 	dtmfKeypad();
+			return;			
+		}			
+		break;
+	case Qt::Key_Space:
+		if (this->isInNumMode()) {
+			this->setMode(TEXT_MODE);
+		} else {
+			this->setMode(NUM_MODE);
+		}
+		return;
+		break;
+
+	case Qt::Key_Alt:
+	case Qt::Key_CapsLock:
+	case Qt::Key_Shift:
+	case Qt::Key_Tab:
+	case Qt::Key_Control:
+		return;
+		break;
+
+	default:
+		break;
+	 }
+
+	if (QChar(e->key()).isDigit() ) {
+		// Numeric _keypad
+		if (e->key() == Qt::Key_0) {
+			pressedKeySlot(KEYPAD_ID_0);
+		} else {
+			pressedKeySlot(e->key() - Qt::Key_0 - 1);
+		}
+	}
+	
+	// Handle * and # too.
+	else if ((e->key() == Qt::Key_Asterisk)
+							or (e->key() == Qt::Key_NumberSign)) {
+		(e->key() == Qt::Key_Asterisk) ? 
+			pressedKeySlot(KEYPAD_ID_STAR)
+			: pressedKeySlot(KEYPAD_ID_HASH);
+	}
+	
+	// If letter _keypad and numeric mode, display digit.
+	else if (QChar(e->key()).isLetter() && this->isInNumMode() ) {
+		pressedKeySlot(
+			(NumericKeypadTools::keyToNumber(e->key())- Qt::Key_0) - 1);
+	}
+	
+	// If letter _keypad and text mode, display letter.
+	else if (QChar(e->key()).isLetter() && this->isInTextMode()) {
+		_lcd->appendText(QChar(e->key()).lower());
+	}  
+}
+
+// EOF
diff --git a/src/gui/qt/qtGUImainwindow.h b/src/gui/qt/qtGUImainwindow.h
new file mode 100644
index 0000000000..8726377c0e
--- /dev/null
+++ b/src/gui/qt/qtGUImainwindow.h
@@ -0,0 +1,364 @@
+/**
+ *  Copyright (C) 2004-2005 Savoir-Faire Linux inc.
+ *  Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com>
+ *                                                                              
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *                                                                              
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef __QT_GUI_MAIN_WINDOW_H__
+#define __QT_GUI_MAIN_WINDOW_H__
+
+#include <qbitmap.h>
+#include <qimage.h>
+#include <qdragobject.h>
+#include <qevent.h>	
+#include <qpixmap.h>
+#include <qpopupmenu.h>
+#include <qpushbutton.h>
+#include <qsettings.h> 
+#include <qthread.h>
+#include <qwidget.h>
+
+#include "../../call.h"
+#include "../../configuration.h"
+#include "../../manager.h"
+#include "../../sipvoiplink.h"
+#include "../../skin.h"
+#include "../guiframework.h"
+#include "../../audio/dtmf.h"
+#include "configurationpanelui.h"
+#include "jpushbutton.h"
+#include "mydisplay.h"
+#include "numerickeypad.h"
+#include "point.h"
+#include "phoneline.h"
+#include "transqwidget.h"
+#include "trayicon.h"
+#include "url_inputui.h"
+#include "vector.h"
+#include "volumecontrol.h"
+
+#define	MAIN_INITIAL_POSITION	20
+#define TEXT_MODE				0
+#define NUM_MODE				1
+
+///////////////////////////////////////////////////////////////////////////////
+// Tray Icon class
+///////////////////////////////////////////////////////////////////////////////
+class MyTrayIcon : public TrayIcon
+{
+	Q_OBJECT
+public:
+	MyTrayIcon(const QPixmap &, const QString &, QPopupMenu *popup = 0, 
+			QObject *parent = 0, const char *name = 0 );
+	~MyTrayIcon(){};
+
+	QPopupMenu *menu;
+
+signals:
+	void	clickedLeft(void);
+protected:	
+	void 	mousePressEvent (QMouseEvent *);
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// GUI main window
+///////////////////////////////////////////////////////////////////////////////
+class QtGUIMainWindow : public TransQWidget, public GuiFramework {
+	Q_OBJECT
+public:
+	// Default Constructor and destructor
+	QtGUIMainWindow	(QWidget* = 0, const char* = 0,WFlags = 0,Manager * = NULL);
+	~QtGUIMainWindow(void);
+	
+	QPixmap	 TabLinePixmap[NUMBER_OF_LINES][NUMBER_OF_STATES];
+	
+	// Reimplementation of virtual functions
+	virtual int incomingCall (short id);
+	virtual int peerAnsweredCall (short id);
+	virtual int peerRingingCall (short id);
+	virtual int peerHungupCall (short id);
+	virtual void displayTextMessage (short id, const string& message);
+	virtual void displayError (const string& error);
+	virtual void displayStatus (const string& status);
+	virtual void displayContext (short id);
+	virtual string getRingtoneFile (void);
+	virtual void setup (void);
+
+	// Handle IP-phone user actions
+	int qt_outgoingCall (void); 	
+	int qt_hangupCall (short id);
+	int qt_answerCall (short id);
+	int qt_onHoldCall (short id);
+	int qt_offHoldCall (short id);
+	int qt_transferCall (short id);
+	void qt_muteOn (short id);
+	void qt_muteOff (short id);
+	int qt_refuseCall (short id);
+	int qt_cancelCall (short id);
+	
+	/*
+	 * Return the call corresponding to the id
+	 */
+	Call* getCall (short id);
+	
+	/*
+	 * Return the phoneline corresponding to the call-id
+	 */
+	PhoneLine* getPhoneLine (short id);
+
+	/*
+	 * Accessor of the current line
+	 */
+	int getCurrentLine (void);
+
+	/*
+	 * Modifior of the current line
+	 */
+	void setCurrentLine (int current);
+
+	/*
+	 * Return elapse for call-timer
+	 */
+	int getElapse (void);
+
+	// Public functions
+	void 	 setMainLCD		 	(void);
+	QString  setPathSkin		(void);
+
+	/**
+	 * Sets the corresponding pixmap button according to its state.
+	 * Handle operations between lines (on hold, off hold) when you click on
+	 * a line. 
+	 * 
+	 * @param	line: number of the current line
+	 */
+	int 	 toggleLine 	 	(int);
+	
+	/*
+	 * Functions to handle timer call
+	 */
+	void	 stopCallTimer 		(short);
+	void	 startCallTimer 	(short);
+
+	void 	 stopTimerMessage 	(void);
+	void	 dialTone			(bool);
+
+	inline void setChooseLine (bool b) { _chooseLine = b; }
+	inline bool getChooseLine (void) { return _chooseLine; }
+	
+	inline void setChosenLine (int line) { _chosenLine = line; }
+	inline int getChosenLine (void) { return _chosenLine; }
+
+	inline void setTransfer (bool b) { _transfer = b; }
+	inline bool getTransfer (void) {return _transfer; }
+
+signals:
+	void 	 keyPressed			(int);
+
+public slots:
+	void 	 dial				(void);
+	void 	 blinkRingSlot		(void);
+	void 	 blinkLineSlot		(void);
+	void 	 blinkMessageSlot	(void);
+	void 	 qt_quitApplication	(void);
+	void 	 pressedKeySlot		(int);
+	void 	 stripSlot			(void);
+	void 	 addressBook 		(void);
+	void	 dtmfKeypad			(void);
+	void 	 configuration		(void);
+	void 	 hangupLine			(void);
+	void 	 button_mute		(void);
+	void 	 button_line0		(void);
+	void 	 button_line1		(void);
+	void 	 button_line2		(void);
+	void 	 button_line3		(void);
+	void 	 button_line4		(void);
+	void 	 button_line5		(void);
+	void 	 button_msg			(void);
+	void 	 button_transfer	(void);
+	void 	 button_conf		(void);
+	void 	 clickHandle 		(void);
+	void	 reduceHandle		(void);
+	void	 save				(void);
+	void	 applySkin			(void);
+	
+	void 	 pressedKey0		(void);
+	void 	 pressedKey1		(void);
+	void 	 pressedKey2		(void);
+	void 	 pressedKey3		(void);
+	void 	 pressedKey4		(void);
+	void 	 pressedKey5		(void);
+	void 	 pressedKey6		(void);
+	void 	 pressedKey7		(void);
+	void 	 pressedKey8		(void);
+	void 	 pressedKey9		(void);
+	void 	 pressedKeyStar		(void);
+	void 	 pressedKeyHash		(void);
+
+	void	 volumeSpkrChanged		(int);
+	void	 volumeMicChanged		(int);
+	void	 registerSlot			(void);
+
+protected:
+	// To handle the key pressed event
+	void 		 keyPressEvent 	(QKeyEvent *);
+
+private:
+	NumericKeypad* 		_keypad;
+	MyDisplay*			_lcd;
+	QTimer*				_blinkTimer;
+	URL_Input* 			_urlinput;
+	ConfigurationPanel*	_panel;
+	Manager*			_callmanager;
+	QPopupMenu*			_mypop;
+	MyTrayIcon*			_trayicon;
+	DTMF*				_key;
+	PhoneLine*			phLines[NUMBER_OF_LINES];
+
+	JPushButton*		phoneKey_msg;
+	JPushButton*		phoneKey_transf;
+	JPushButton*		phoneKey_conf;
+	JPushButton*		phoneKey_line0;
+	JPushButton*		phoneKey_line1;
+	JPushButton*		phoneKey_line2;
+	JPushButton*		phoneKey_line3;
+	JPushButton*		reduce_button;
+	JPushButton*		quit_button;
+	JPushButton*		addr_book_button;
+	JPushButton*		configuration_button;
+	JPushButton*		hangup_button;
+	JPushButton*		dial_button;
+	JPushButton*		mute_button;
+	JPushButton*		dtmf_button;
+	short*				_buf;
+	// Configuration skin file
+	Point*		pt;
+
+	// For volume buttons
+	VolumeControl*		vol_mic;
+    VolumeControl*		vol_spkr;
+	Vector*		micVolVector;
+    Vector*		spkrVolVector;
+	int			vol_mic_x, 
+				vol_mic_y;
+	int			vol_spkr_x, 
+				vol_spkr_y;
+
+	// To construct ring rect pixmap
+	QImage 		imageRing;
+	QImage 		imageNoRing;
+
+	QPixmap		TabMsgPixmap[NUMBER_OF_STATES];
+	int 		modeType;
+	bool		_apply;
+
+	bool b_dialtone;
+
+	// For numeric keypad
+	bool _first;
+	
+	bool _transfer;
+	bool _msgVar;
+	
+	// For outgoing call, if it occurs on the first free line or on the chosen
+	// line by the user
+	bool _chooseLine;
+	int _chosenLine;
+	int _freeLine;
+	inline void setFreeLine(int line) { _freeLine = line; }
+	inline int getFreeLine(void) { return _freeLine; }
+
+	// Array of incoming calls
+	int _TabIncomingCalls[NUMBER_OF_LINES];
+
+	// The current phoneline
+	int _currentLine;
+
+	bool _dialtone;
+	
+	void setMode			(int);
+	bool isInTextMode		(void);
+	bool isInNumMode		(void);
+	void initSkin			(void);
+	void initVolume 		(void);
+	void initButtons 		(void);
+	void initBlinkTimer	(void);
+	void initSpkrVolumePosition (void);
+	void initMicVolumePosition (void);
+	void connections		(void);
+	string  ringFile			(void);
+
+	int  positionOffsetX	(void);
+	void deleteButtons		(void);
+
+	/*
+	 * Associate a phoneline number to a call identifiant
+	 * @param	identifiant call
+	 * @return	phoneline number
+	 */
+	int associateCall2Line (short id);
+	
+	/**
+	 * Search the busy line number among all lines and different with
+	 * current line number.
+	 *
+	 * @return  number of busy line
+	 */
+	int  busyLineNumber		(void);
+
+	/*
+	 * Put in state on-hold the line 'line'
+	 */
+	int putOnHoldBusyLine 	(int line);
+	
+	/*
+	 * Return the id of the first line number if incoming call occurs
+	 * Otherwise return -1
+	 */
+	short isThereIncomingCall	(void);
+
+	/*
+	 * Return the id of the line number 'line' if an incoming call occurs
+	 * Otherwise return -1
+	 */
+	short isIncomingCall	(int line);
+
+	/*
+	 * Return phoneline number according to the identifiant 'id'
+	 * id2line returns -1 if phoneline number is not found
+	 */
+	int id2line				(short id);
+	
+	/*
+	 * Return id according to the phoneline number 'line'
+	 * line2id returns -1 if id is not found
+	 */
+	short line2id			(int line);
+
+	/*
+	 * Change state and pixmap of the line 'line' according to the state 'state'
+	 */
+	void changeLineStatePixmap (int line, line_state state);
+
+	/*
+	 * Handle dial tone
+	 */
+	void dialtone (bool var);
+
+};
+
+
+#endif	// __QT_GUI_MAIN_WIDOW_H__
diff --git a/src/transqwidget.cpp b/src/gui/qt/transqwidget.cpp
similarity index 100%
rename from src/transqwidget.cpp
rename to src/gui/qt/transqwidget.cpp
diff --git a/src/transqwidget.h b/src/gui/qt/transqwidget.h
similarity index 100%
rename from src/transqwidget.h
rename to src/gui/qt/transqwidget.h
diff --git a/src/trayicon.cpp b/src/gui/qt/trayicon.cpp
similarity index 100%
rename from src/trayicon.cpp
rename to src/gui/qt/trayicon.cpp
diff --git a/src/trayicon.h b/src/gui/qt/trayicon.h
similarity index 100%
rename from src/trayicon.h
rename to src/gui/qt/trayicon.h
diff --git a/src/gui/qt/trayicon_x11.cpp b/src/gui/qt/trayicon_x11.cpp
new file mode 100644
index 0000000000..053eeda9c4
--- /dev/null
+++ b/src/gui/qt/trayicon_x11.cpp
@@ -0,0 +1,407 @@
+/*
+ * trayicon_x11.cpp - X11 trayicon (for use with KDE and GNOME)
+ * Copyright (C) 2003  Justin Karneges
+ * GNOME2 Notification Area support: Tomasz Sterna
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#include "trayicon.h"
+
+#include<qapplication.h>
+#include<qimage.h>
+#include<qpixmap.h>
+#include<qtooltip.h>
+#include<qpainter.h>
+
+#include<X11/Xlib.h>
+#include<X11/Xutil.h>
+#include<X11/Xatom.h>
+
+//#if QT_VERSION < 0x030200
+extern Time qt_x_time;
+//#endif
+
+//----------------------------------------------------------------------------
+// common stuff
+//----------------------------------------------------------------------------
+
+// for Gnome2 Notification Area
+static XErrorHandler old_handler = 0;
+static int dock_xerror = 0;
+extern "C" int dock_xerrhandler(Display* dpy, XErrorEvent* err)
+{
+	dock_xerror = err->error_code;
+	return old_handler(dpy, err);
+}
+
+static void trap_errors()
+{
+	dock_xerror = 0;
+	old_handler = XSetErrorHandler(dock_xerrhandler);
+}
+
+static bool untrap_errors()
+{
+	XSetErrorHandler(old_handler);
+	return (dock_xerror == 0);
+}
+
+static bool send_message(
+	Display* dpy,	/* display */
+	Window w,	/* sender (tray icon window) */
+	long message,	/* message opcode */
+	long data1,	/* message data 1 */
+	long data2,	/* message data 2 */
+	long data3	/* message data 3 */
+) {
+	XEvent ev;
+
+	memset(&ev, 0, sizeof(ev));
+	ev.xclient.type = ClientMessage;
+	ev.xclient.window = w;
+	ev.xclient.message_type = XInternAtom (dpy, "_NET_SYSTEM_TRAY_OPCODE", False );
+	ev.xclient.format = 32;
+	ev.xclient.data.l[0] = CurrentTime;
+	ev.xclient.data.l[1] = message;
+	ev.xclient.data.l[2] = data1;
+	ev.xclient.data.l[3] = data2;
+	ev.xclient.data.l[4] = data3;
+
+	trap_errors();
+	XSendEvent(dpy, w, False, NoEventMask, &ev);
+	XSync(dpy, False);
+	return untrap_errors();
+}
+
+#define SYSTEM_TRAY_REQUEST_DOCK    0
+#define SYSTEM_TRAY_BEGIN_MESSAGE   1
+#define SYSTEM_TRAY_CANCEL_MESSAGE  2
+
+//----------------------------------------------------------------------------
+// TrayIcon::TrayIconPrivate
+//----------------------------------------------------------------------------
+
+class TrayIcon::TrayIconPrivate : public QWidget
+{
+public:
+	TrayIconPrivate(TrayIcon *object, int size);
+	~TrayIconPrivate() { }
+
+	virtual void initWM(WId icon);
+
+	virtual void setPixmap(const QPixmap &pm);
+
+	virtual void paintEvent(QPaintEvent *);
+	virtual void enterEvent(QEvent *);
+	virtual void mouseMoveEvent(QMouseEvent *e);
+	virtual void mousePressEvent(QMouseEvent *e);
+	virtual void mouseReleaseEvent(QMouseEvent *e);
+	virtual void mouseDoubleClickEvent(QMouseEvent *e);
+	virtual void closeEvent(QCloseEvent *e);
+
+private:
+	TrayIcon *iconObject;
+	QPixmap pix;
+	int size;
+};
+
+TrayIcon::TrayIconPrivate::TrayIconPrivate(TrayIcon *object, int _size)
+	: QWidget(0, "psidock", WRepaintNoErase)
+{
+	iconObject = object;
+	size = _size;
+
+	setFocusPolicy(NoFocus);
+	setBackgroundMode(X11ParentRelative);
+
+	setMinimumSize(size, size);
+	setMaximumSize(size, size);
+}
+
+// This base stuff is required by both FreeDesktop specification and WindowMaker
+void TrayIcon::TrayIconPrivate::initWM(WId icon)
+{
+	Display *dsp = x11Display();
+	WId leader   = winId();
+
+	// set the class hint
+	XClassHint classhint;
+	classhint.res_name  = (char*)"psidock";
+	classhint.res_class = (char*)"Psi";
+	XSetClassHint(dsp, leader, &classhint);
+
+	// set the Window Manager hints
+	XWMHints *hints;
+	hints = XGetWMHints(dsp, leader);	// init hints
+	hints->flags = WindowGroupHint | IconWindowHint | StateHint;	// set the window group hint
+	hints->window_group = leader;		// set the window hint
+	hints->initial_state = WithdrawnState;	// initial state
+	hints->icon_window = icon;		// in WM, this should be winId() of separate widget
+	hints->icon_x = 0;
+	hints->icon_y = 0;
+	XSetWMHints(dsp, leader, hints);	// set the window hints for WM to use.
+	XFree( hints );
+}
+
+void TrayIcon::TrayIconPrivate::setPixmap(const QPixmap &pm)
+{
+	pix = pm;
+	setIcon(pix);
+	repaint();
+}
+
+void TrayIcon::TrayIconPrivate::paintEvent(QPaintEvent *)
+{
+	QPainter p(this);
+	p.drawPixmap((width() - pix.width())/2, (height() - pix.height())/2, pix);
+}
+
+void TrayIcon::TrayIconPrivate::enterEvent(QEvent *e)
+{
+	// Taken from KSystemTray..
+//#if QT_VERSION < 0x030200
+	//if ( !qApp->focusWidget() ) {
+		XEvent ev;
+		memset(&ev, 0, sizeof(ev));
+		ev.xfocus.display = qt_xdisplay();
+		ev.xfocus.type = FocusIn;
+		ev.xfocus.window = winId();
+		ev.xfocus.mode = NotifyNormal;
+		ev.xfocus.detail = NotifyAncestor;
+		Time time = qt_x_time;
+		qt_x_time = 1;
+		qApp->x11ProcessEvent( &ev );
+		qt_x_time = time;
+	//}
+//#endif
+	QWidget::enterEvent(e);
+}
+
+void TrayIcon::TrayIconPrivate::mouseMoveEvent(QMouseEvent *e)
+{
+	QApplication::sendEvent(iconObject, e);
+}
+
+void TrayIcon::TrayIconPrivate::mousePressEvent(QMouseEvent *e)
+{
+	QApplication::sendEvent(iconObject, e);
+}
+
+void TrayIcon::TrayIconPrivate::mouseReleaseEvent(QMouseEvent *e)
+{
+	QApplication::sendEvent(iconObject, e);
+}
+
+void TrayIcon::TrayIconPrivate::mouseDoubleClickEvent(QMouseEvent *e)
+{
+	QApplication::sendEvent(iconObject, e);
+}
+
+void TrayIcon::TrayIconPrivate::closeEvent(QCloseEvent *e)
+{
+	iconObject->gotCloseEvent();
+	e->accept();
+}
+
+//----------------------------------------------------------------------------
+// TrayIconFreeDesktop
+//----------------------------------------------------------------------------
+
+class TrayIconFreeDesktop : public TrayIcon::TrayIconPrivate
+{
+public:
+	TrayIconFreeDesktop(TrayIcon *object, const QPixmap &pm);
+protected:
+	virtual bool x11Event(XEvent*);
+};
+
+TrayIconFreeDesktop::TrayIconFreeDesktop(TrayIcon *object, const QPixmap &pm)
+	: TrayIconPrivate(object, 22)
+{
+	initWM( winId() );
+
+	// initialize NetWM
+	Display *dsp = x11Display();
+
+	// dock the widget (adapted from SIM-ICQ)
+	Screen *screen = XDefaultScreenOfDisplay(dsp); // get the screen
+	int screen_id = XScreenNumberOfScreen(screen); // and it's number
+
+	// tell X that we want to see ClientMessage and Deleted events, which
+	// are picked up by QApplication::x11EventFilter
+	Window root_window = QApplication::desktop()->winId();
+	XWindowAttributes attr;
+
+	XGetWindowAttributes(dsp, root_window, &attr);
+	XSelectInput(dsp, root_window, attr.your_event_mask | StructureNotifyMask);
+
+	char buf[32];
+	snprintf(buf, sizeof(buf), "_NET_SYSTEM_TRAY_S%d", screen_id);
+	Atom selection_atom = XInternAtom(dsp, buf, false);
+	XGrabServer(dsp);
+	Window manager_window = XGetSelectionOwner(dsp, selection_atom);
+	if ( manager_window != None )
+		XSelectInput(dsp, manager_window, StructureNotifyMask);
+	XUngrabServer(dsp);
+	XFlush(dsp);
+
+	if ( manager_window != None )
+		send_message(dsp, manager_window, SYSTEM_TRAY_REQUEST_DOCK, winId(), 0, 0);
+	else
+	{
+		object->hide();
+		return;
+	}
+
+	// some KDE mumbo-jumbo... why is it there? anybody?
+	Atom kwm_dockwindow_atom = XInternAtom(dsp, "KWM_DOCKWINDOW", false);
+	Atom kde_net_system_tray_window_for_atom = XInternAtom(dsp, "_KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR", false);
+
+	long data = 0;
+	XChangeProperty(dsp, winId(), kwm_dockwindow_atom, kwm_dockwindow_atom, 32, PropModeReplace, (uchar*)&data, 1);
+	XChangeProperty(dsp, winId(), kde_net_system_tray_window_for_atom, XA_WINDOW, 32, PropModeReplace, (uchar*)&data, 1);
+
+	setPixmap(pm);
+}
+
+bool TrayIconFreeDesktop::x11Event(XEvent *ev)
+{
+	switch(ev->type)
+	{
+		case ReparentNotify:
+			show();
+
+	}
+	return false;
+}
+
+//----------------------------------------------------------------------------
+// TrayIconWindowMaker
+//----------------------------------------------------------------------------
+
+class TrayIconWharf : public TrayIcon::TrayIconPrivate
+{
+public:
+	TrayIconWharf(TrayIcon *object, const QPixmap &pm)
+		: TrayIconPrivate(object, 44)
+	{
+		// set the class hint
+		XClassHint classhint;
+		classhint.res_name  = (char*)"psidock-wharf";
+		classhint.res_class = (char*)"Psi";
+		XSetClassHint(x11Display(), winId(), &classhint);
+
+		setPixmap(pm);
+	}
+
+	void setPixmap(const QPixmap &_pm)
+	{
+		QPixmap pm;
+		QImage i = _pm.convertToImage();
+		i = i.scale(i.width() * 2, i.height() * 2);
+		pm.convertFromImage(i);
+
+		TrayIconPrivate::setPixmap(pm);
+
+		// thanks to Robert Spier for this:
+		// for some reason the repaint() isn't being honored, or isn't for
+		// the icon.  So force one on the widget behind the icon
+		erase();
+		QPaintEvent pe( rect() );
+		paintEvent(&pe);
+	}
+};
+
+class TrayIconWindowMaker : public TrayIcon::TrayIconPrivate
+{
+public:
+	TrayIconWindowMaker(TrayIcon *object, const QPixmap &pm);
+	~TrayIconWindowMaker();
+
+	void setPixmap(const QPixmap &pm);
+
+private:
+	TrayIconWharf *wharf;
+};
+
+TrayIconWindowMaker::TrayIconWindowMaker(TrayIcon *object, const QPixmap &pm)
+	: TrayIconPrivate(object, 32)
+{
+	wharf = new TrayIconWharf(object, pm);
+
+	initWM( wharf->winId() );
+}
+
+TrayIconWindowMaker::~TrayIconWindowMaker()
+{
+	delete wharf;
+}
+
+void TrayIconWindowMaker::setPixmap(const QPixmap &pm)
+{
+	wharf->setPixmap(pm);
+}
+
+//----------------------------------------------------------------------------
+// TrayIcon
+//----------------------------------------------------------------------------
+
+void TrayIcon::sysInstall()
+{
+	if ( d )
+		return;
+
+	if ( v_isWMDock )
+		d = (TrayIconPrivate *)(new TrayIconWindowMaker(this, pm));
+	else
+		d = (TrayIconPrivate *)(new TrayIconFreeDesktop(this, pm));
+
+	sysUpdateToolTip();
+
+	if ( v_isWMDock )
+		d->show();
+}
+
+void TrayIcon::sysRemove()
+{
+	if ( !d )
+		return;
+
+	delete d;
+	d = 0;
+}
+
+void TrayIcon::sysUpdateIcon()
+{
+	if ( !d )
+		return;
+
+	QPixmap pix = pm;
+	d->setPixmap(pix);
+}
+
+void TrayIcon::sysUpdateToolTip()
+{
+	if ( !d )
+		return;
+
+	if ( tip.isEmpty() )
+		QToolTip::remove(d);
+	else
+		QToolTip::add(d, tip);
+}
+
diff --git a/src/url_input.ui b/src/gui/qt/url_input.ui
similarity index 100%
rename from src/url_input.ui
rename to src/gui/qt/url_input.ui
diff --git a/src/url_input.ui.h b/src/gui/qt/url_input.ui.h
similarity index 100%
rename from src/url_input.ui.h
rename to src/gui/qt/url_input.ui.h
diff --git a/src/url_inputui.cpp b/src/gui/qt/url_inputui.cpp
similarity index 94%
rename from src/url_inputui.cpp
rename to src/gui/qt/url_inputui.cpp
index 946dba5b55..179f1048c6 100644
--- a/src/url_inputui.cpp
+++ b/src/gui/qt/url_inputui.cpp
@@ -1,13 +1,13 @@
 /****************************************************************************
-** Form implementation generated from reading ui file 'url_input.ui'
+** Form implementation generated from reading ui file 'gui/qt/url_input.ui'
 **
-** Created: Wed Apr 27 10:37:33 2005
+** Created: Fri May 20 14:27:25 2005
 **      by: The User Interface Compiler ($Id$)
 **
 ** WARNING! All changes made in this file will be lost!
 ****************************************************************************/
 
-#include "url_inputui.h"
+#include "gui/qt/url_inputui.h"
 
 #include <qvariant.h>
 #include <qpushbutton.h>
diff --git a/src/url_inputui.h b/src/gui/qt/url_inputui.h
similarity index 88%
rename from src/url_inputui.h
rename to src/gui/qt/url_inputui.h
index 0a9011232d..26c7c91f2a 100644
--- a/src/url_inputui.h
+++ b/src/gui/qt/url_inputui.h
@@ -1,7 +1,7 @@
 /****************************************************************************
-** Form interface generated from reading ui file 'url_input.ui'
+** Form interface generated from reading ui file 'gui/qt/url_input.ui'
 **
-** Created: Wed Apr 27 10:37:33 2005
+** Created: Fri May 20 14:27:25 2005
 **      by: The User Interface Compiler ($Id$)
 **
 ** WARNING! All changes made in this file will be lost!
diff --git a/src/vector.cpp b/src/gui/qt/vector.cpp
similarity index 100%
rename from src/vector.cpp
rename to src/gui/qt/vector.cpp
diff --git a/src/vector.h b/src/gui/qt/vector.h
similarity index 100%
rename from src/vector.h
rename to src/gui/qt/vector.h
diff --git a/src/volumecontrol.cpp b/src/gui/qt/volumecontrol.cpp
similarity index 99%
rename from src/volumecontrol.cpp
rename to src/gui/qt/volumecontrol.cpp
index a9def14705..be1367d0a2 100644
--- a/src/volumecontrol.cpp
+++ b/src/gui/qt/volumecontrol.cpp
@@ -20,8 +20,8 @@
 #include <qapplication.h>
 
 #include "qtGUImainwindow.h"
-#include "skin.h"
 #include "volumecontrol.h"
+#include "../../skin.h"
 
 VolumeControl::VolumeControl (QWidget *parent, const char *name, 
 		const char* pixname, Vector *v) : JPushButton(parent, name, pixname) {
diff --git a/src/volumecontrol.h b/src/gui/qt/volumecontrol.h
similarity index 99%
rename from src/volumecontrol.h
rename to src/gui/qt/volumecontrol.h
index 109ed4a018..c59e859228 100644
--- a/src/volumecontrol.h
+++ b/src/gui/qt/volumecontrol.h
@@ -35,6 +35,7 @@ public:
 signals:
 	void	setVolumeValue 	(int);
 private:
+	
 	void 	mouseMoveEvent	(QMouseEvent*);
 	void 	mousePressEvent	(QMouseEvent*);
 	int	 	offset			(int);
diff --git a/src/main.cpp b/src/main.cpp
index ae517e3d62..e38ae9bf5c 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1,5 +1,5 @@
 /**
- *  Copyright (C) 2004 Savoir-Faire Linux inc.
+ *  Copyright (C) 2005 Savoir-Faire Linux inc.
  *  Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com>
  *                                                                              
  *  This program is free software; you can redistribute it and/or modify
@@ -16,90 +16,102 @@
  *  along with this program; if not, write to the Free Software
  *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
-#include "configurationtree.h"
 
 #include <getopt.h>
-
+#include "user_cfg.h"
+#ifdef QT_GUI
 #include <qapplication.h>
-#include <qmessagebox.h>
-#include <qtranslator.h>
-#include <qwidget.h>
+#include "gui/qt/qtGUImainwindow.h"
+#endif
 
+#include "configuration.h"
+#include "configurationtree.h"
 #include "manager.h"
-#include "mydisplay.h"
-#include "numerickeypad.h"
-#include "skin.h"
-#include "qtGUImainwindow.h"
 
 
-void OptionProcess (int argc,char **argv) ;
-QString *pOption = NULL;
-
+int OptionProcess (int argc,char **argv, Manager* manager);
 
 int
 main (int argc, char **argv) {
-	QApplication	a(argc, argv);
-	Manager *manager;
-	
+	Manager* manager;
 	Config::setTree(new ConfigurationTree());	
-	
-	OptionProcess (argc,argv);
-	manager = new Manager(pOption);
-/*
-	if ( pOption )  
-		manager = new Manager(pOption);
-	else
-		manager = new Manager(new QString());
-*/
-
-#if 0
-	QTranslator translator (0);
-	translator.load("app_fr.qm", ".");
-	a.installTranslator (&translator);	
-#endif
-
-	a.setMainWidget(manager->gui());
-	return a.exec();
+	manager = new Manager();
+
+	// Faire partir la gui selon l'option choisie
+		QApplication a(argc, argv);
+		QtGUIMainWindow *qtgui = new QtGUIMainWindow (0, 0 ,
+									Qt::WDestructiveClose |
+									Qt::WStyle_Customize |
+									Qt::WStyle_NoBorder,
+									manager);
+		manager->setGui(qtgui);
+		manager->init();		
+		
+		a.setMainWidget(qtgui);
+		return a.exec();
+//	int ret = OptionProcess (argc,argv, manager);
+//	return ret;
 }
 
-
-void OptionProcess (int argc,char **argv) {
-int c;
-
-        while (1) {
-                int option_index = 0;
-                static struct option long_options[] =
-                {
-                                {"phonenumber", 1, 0, 'p'},
-                                {"stun", 1, 0, 's'},
-                                {"verbose", 0, 0, 'v'},
-                                {"help", 0, 0, 'h'},
-                                {0, 0, 0, 0}
-                };
-
-                c = getopt_long (argc, argv, "p:s:vh", long_options, &option_index);
-                if (c == -1)
-                        break;
-
-                switch (c) {
-                        case 'v':
-                                break;
-                        case 'p':
-				printf("Phone number to call : %s\n",optarg);
-				pOption = new QString(optarg);		
-                                break;
-                        case 's':
-                                break;
-                        case '?':
-                        case 'h':
-                                break;
-                        default:
-                                printf ("?? caractère de code 0%o ??\n", c);
-                }
-        }
+int OptionProcess (int argc,char **argv, Manager* manager) 
+{
+	int c;
+
+	while (1) {
+		int option_index = 0;
+		static struct option long_options[] =
+		{
+			{"ui", 1, 0, 'i'},
+			{"phonenumber", 1, 0, 'p'},
+			{"stun", 1, 0, 's'},
+			{"verbose", 0, 0, 'v'},
+			{"help", 0, 0, 'h'},
+			{0, 0, 0, 0}
+		};
+
+		c = getopt_long (argc, argv, "i:p:s:vh", long_options, &option_index);
+		if (c == -1)
+			break;
+
+		switch (c) {
+			case 'i':
+				{
+					string optStr(optarg);
+					if (optStr.compare("qt") == 0) {
+#ifdef QT_GUI
+						QApplication a(argc, argv);
+						QtGUIMainWindow *qtgui = new QtGUIMainWindow (0, 0 ,
+                    								Qt::WDestructiveClose |
+                    								Qt::WStyle_Customize |
+                    								Qt::WStyle_NoBorder,
+													manager);
+						cout << "a.setMainWidget(qtgui);" << endl;
+						a.setMainWidget(qtgui);
+						return a.exec();
+#endif
+					} else if (optStr.compare("text")) {
+					} else {
+					}
+				}
+				break;				
+			case 'v':
+				break;
+			case 'p':
+				cout << "Phone number to call : " << optarg << endl;
+				break;
+			case 's':
+				break;
+			case '?':
+			case 'h':
+				break;
+			default:
+				cout << "Option " << c << "doesn't exist" <<endl;
+				break;
+		}
+	}
+	return 0;
 }
 
 
 
 
-
diff --git a/src/manager.cpp b/src/manager.cpp
index a9021f5a3f..2d0cb3ded2 100644
--- a/src/manager.cpp
+++ b/src/manager.cpp
@@ -1,5 +1,5 @@
 /**
- *  Copyright (C) 2004 Savoir-Faire Linux inc.
+ *  Copyright (C) 2004-2005 Savoir-Faire Linux inc.
  *  Author : Laurielle Lea <laurielle.lea@savoirfairelinux.com>
  *                                                                              
  *  This program is free software; you can redistribute it and/or modify
@@ -16,649 +16,717 @@
  *  along with this program; if not, write to the Free Software
  *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
+
 #include <errno.h>
-#include <stdlib.h>
-#include <string.h>
+#include <time.h>
+
+// For using inet_ntoa()
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
 #include <sys/types.h>
 #include <sys/stat.h>
-
-#include <cstdio>
+#include <cc++/thread.h>
+#include <cc++/file.h>
 #include <cstdlib>
-#include <ccrtp/rtp.h>
-
-#include <qapplication.h>
-#include <qhostaddress.h>
-#include <qwidget.h>
+#include <iostream>
+#include <fstream>
+#include <string>
+#include <vector>
 
-#include "../stund/udp.h"
-#include "../stund/stun.h"
 
-#include "audiodriversoss.h"
+#include "user_cfg.h"
+#include "audio/audiocodec.h"
+#include "audio/codecDescriptor.h"
+#include "audio/tonegenerator.h"
 
 #ifdef ALSA
-#include "audiodriversalsa.h"
+#include "audio/audiodriversalsa.h"
 #endif
 
+#ifdef OSS
+#include "audio/audiodriversoss.h"
+#endif
+ 
+#include "call.h"
 #include "configuration.h"
 #include "configurationtree.h"
-#include "global.h"
 #include "manager.h"
-#include "audiortp.h"
-#include "sip.h"
-#include "qtGUImainwindow.h"
-#include "error.h"
+#include "sipvoiplink.h"
+#include "skin.h"
+#include "voIPLink.h"
+#include "../stund/udp.h"
 
-#include <string>
 using namespace std;
-
-Manager::Manager (QString *Dc = NULL) {
-	DirectCall = Dc;
-	for (int i = 0; i < NUMBER_OF_LINES; i++) {
-		phLines[i] = new PhoneLine ();
-	}
-	
-	exist = createSettingsPath();
-	
-	phonegui = new QtGUIMainWindow (0, 0 ,  
-					Qt::WDestructiveClose | 
-					Qt::WStyle_Customize |
-					Qt::WStyle_NoBorder,this);
-
-	error = new Error(this);
-	selectAudioDriver();
-	sip = new SIP(this);
-	tone = new ToneGenerator(this);
-	audioRTP = new AudioRtp(this);
+using namespace ost;
+ 
+Manager::Manager (void)
+{
+	// initialize random generator  
+  	srand (time(NULL));
+
+	// Init private variables 
+	_callVector = new CallVector();
+	_voIPLinkVector = new VoIPLinkVector();	
+	_error = new Error(this);
+	_tone = new ToneGenerator(this);	
+
+	// Set a sip voip link by default
+	_voIPLinkVector->push_back(new SipVoIPLink(DFT_VOIP_LINK, this));
+	_nCalls = 0;
+	_nCodecs = 0;
+	_currentCallId = 0;
+	_startTime = 0;
+	_endTime = 0;
+	_path = ""; 
+	_tonezone = false;
+	_congestion = false;
+	_ringback = false;
+	_ringback = false;
+	_useAlsa = false;
+	_exist = 0;
 	
-	sip_init();
-
-	// Init variables
-	b_ringing = false;
-	b_ringtone = false;
-	b_congestion = false;
-	mute = false;
-
-	if (DirectCall) { 
-		qWarning ("Direct call.....");
-		gui()->lcd->textBuffer = DirectCall ;
-		gui()->dial();
-	}
-
-	if (!exist){
-		// If config file $HOME/.PROGNAME/PROGNAMErc doesn't exist,
-  		// show configuration panel
-		gui()->configuration();
+	initConfigFile();
+	_exist = createSettingsPath();
+	if (_exist == 0) {
+		_debug("Cannot create config file in your home directory\n");
 	} 
-
-	initVolume ();	
-	
 }
 
-Manager::~Manager (void) {
-	delete phonegui;
-	delete sip;
-	delete audioRTP;
-	delete audiodriver;
-#ifdef ALSA
-	delete audiodriverReadAlsa;
-#endif
-	delete tone;
-	delete[] phLines;
-}
+Manager::~Manager (void) 
+{
+	delete _callVector;
+	delete _voIPLinkVector;			
+	delete _error;
+	delete _tone;
+} 
 
-/**
- * Create .PROGNAME directory in home user and create configuration tree from
- * the settings file if this file exists.
- *
- * @return	true if config-file exists or false if not.
- */
-bool
-Manager::createSettingsPath (void) {
-	// 
-	bool exist = true;
-	char * buffer;
-	// Get variable $HOME
-  	buffer = getenv ("HOME");                                        
-	path = string(buffer);
-  	path = path + "/." + PROGNAME;
-             
-  	if (mkdir (path.data(), 0755) != 0) {
-		// If directory	creation failed
-    	if (errno != EEXIST) {
-        	printf ("Cannot create directory: %s\n", strerror(errno));
-      	} 
-  	}
-  
-	// Load user's config
-	path = path + "/" + PROGNAME + "rc";
-	if (Config::tree()->populateFromFile(path.data()) == 0){
-		exist = false;
-	}
-	return exist;
-}
- 
-/**
- * Call audio driver constructor according to the selected driver in setup
- */
 void 
-Manager::selectAudioDriver (void) {
-	if (Config::geti("Audio", "Drivers.driverName") == OSS_DRIVER) {
-		useAlsa = false; 
-		this->audiodriver = new AudioDriversOSS (AudioDrivers::ReadWrite, error);
-	}
-	if (Config::geti("Audio", "Drivers.driverName") == ALSA_DRIVER) {
-#ifdef ALSA
-		useAlsa = true;
-		this->audiodriver = new AudioDriversALSA (AudioDrivers::WriteOnly, error);
-		this->audiodriverReadAlsa = new AudioDriversALSA (AudioDrivers::ReadOnly, error);
-#endif
+Manager::init (void) 
+{
+	if (_exist == 2) {
+		// If config-file doesn't exist, launch configuration setup
+		_gui->setup();
 	}
+	initAudioCodec();
+	selectAudioDriver();
+	_voIPLinkVector->at(DFT_VOIP_LINK)->init();
+	if (get_config_fields_int(SIGNALISATION, AUTO_REGISTER) == YES and 
+			_exist == 1) {
+		registerVoIPLink();
+	} 
 }
 
 void
-Manager::initVolume (void) {
-	spkr_volume = gui()->spkrVolVector->Y() - gui()->vol_spkr_y;
-	mic_volume = gui()->micVolVector->Y() - gui()->vol_mic_y;
+Manager::setGui (GuiFramework* gui)
+{
+	_gui = gui;
 }
 
-/**
- * Init the SIP stack
- */
-void
-Manager::sip_init (void) {
-	if ( sip->initSIP () != -1) {
-		 sip->initRtpmapCodec ();
-	}
-	
-	if (Config::getb("Signalisations", "SIP.autoregister")) {
-		// Register to the known proxies if available
-		if (Config::gets("Signalisations", "SIP.password").length() > 0) {
-			sip->setRegister ();
-		} else {
-			if (exist)
-				error->errorName(PASSWD_FIELD_EMPTY, NULL);		
-		}
-	} 
+ToneGenerator*
+Manager::getTonegenerator (void) 
+{
+	return _tone;
 }
 
-void
-Manager::quitLibrary (void) {
-	sip->quitSIP();
+Error*
+Manager::error (void) 
+{
+	return _error;
 }
 
-int
-Manager::outgoingNewCall (void) {
-	return sip->outgoingInvite();
+unsigned int 
+Manager::getNumberOfCalls (void)
+{
+	return _nCalls;
 }
 
-bool
-Manager::ringing (void) {
-	return this->b_ringing;
+void 
+Manager::setNumberOfCalls (unsigned int nCalls)
+{
+	_nCalls = nCalls;
 }
 
-// When IP-phone user receives a call 
-void
-Manager::ring (bool var) {
-	if (sip->getNumberPendingCalls() != 1 and tonezone == true 
-			and var == false) {
-	// If more than one line is ringing
-		for (int i = 0; i < NUMBER_OF_LINES; i++) {
-			if (i != getCurrentLineNumber() and phLines[i]->getbRinging()) {
-				tonezone = false;
-				tone->playRingtone ((gui()->getRingFile()).ascii());
-			}
-		}
-	}
-
-	if (this->b_ringing != var) {
-		this->b_ringing = var;
-	}
-
-	tonezone = ringing();
+short
+Manager::getCurrentCallId (void)
+{
+	return _currentCallId;
+}
 
-	if (sip->getNumberPendingCalls() == 1) { 
-	// If just one line is ringing
-		tone->playRingtone ((gui()->getRingFile()).ascii());
-	} 
+void 
+Manager::setCurrentCallId (short currentCallId)
+{
+	_currentCallId = currentCallId;
 }
 
-// When IP-phone user makes call
-void
-Manager::ringTone (bool var) {
-	if (this->b_ringtone != var) {
-		this->b_ringtone = var;
-	}
-	tonezone = var;
-	tone->toneHandle(ZT_TONE_RINGTONE);
+CallVector* 
+Manager::getCallVector (void)
+{
+	return _callVector;
 }
 
-void
-Manager::congestion (bool var) {
-	if (error->getError() == 0) {
-		if (this->b_congestion != var) {
-			this->b_congestion = var;
+Call*
+Manager::getCall (short id)
+{
+	if (id > 0 and _callVector->size() > 0) {
+		for (unsigned int i = 0; i < _nCalls; i++) {
+			if (_callVector->at(i)->getId() == id) {
+				return _callVector->at(i);
+			}
 		}
-		tonezone = var;
-		tone->toneHandle(ZT_TONE_CONGESTION);
+		return NULL;
 	} else {
-		error->errorName(DEVICE_NOT_OPEN, NULL);
+		return NULL;
 	}
 }
 
+
+unsigned int
+Manager::getNumberOfCodecs (void)
+{
+	return _nCodecs;
+}
+
 void
-Manager::notificationIncomingCall (void) {
-	short *buffer = new short[SAMPLING_RATE];
-	
-	tone->generateSin(440, 0, AMPLITUDE, SAMPLING_RATE, buffer);
-		
-	audiodriver->audio_buf.resize(SAMPLING_RATE/2);
-	audiodriver->audio_buf.setData(buffer, getSpkrVolume());
-	delete[] buffer;
+Manager::setNumberOfCodecs (unsigned int nb_codec)
+{
+	_nCodecs = nb_codec;
 }
-#if 0
-bool
-Manager::getCallInProgress (void) {
-	return gui()->callinprogress;
+
+VoIPLinkVector* 
+Manager::getVoIPLinkVector (void)
+{
+	return _voIPLinkVector;
 }
 
-void
-Manager::setCallInProgress (bool inprogress) {
-	gui()->callinprogress = inprogress;
+CodecDescriptorVector*
+Manager::getCodecDescVector (void)
+{
+	return _codecDescVector;
 }
-#endif
 
-bool
-Manager::transferedCall(void) {
-	return gui()->transfer;
+void
+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);
 }
 
-/**
- * Handle IP_Phone user's actions
- *
- * @param	lineNumber: line where occurs the action
- * @param 	action:		type of action
- */
 void
-Manager::actionHandle (int lineNumber, int action) {
-	switch (action) {
-	case REFUSE_CALL:
-		sip->manageActions (lineNumber, REFUSE_CALL);
-		this->ring(false);
-		phLines[lineNumber]->setbRinging(false);
-		gui()->lcd->setStatus(REFUSED_CALL_STATUS);
-		break;
-		
-	case ANSWER_CALL:
-		// TODO
-		// Stopper l'etat "ringing" du main (audio, signalisation, gui)
-		this->ring(false);
-		sip->manageActions (lineNumber, ANSWER_CALL);		
-		phLines[lineNumber]->setbRinging(false);
-		gui()->lcd->setStatus(CONNECTED_STATUS);	
-		gui()->startCallTimer(lineNumber);
-		break;
-
-	case CLOSE_CALL:
-		// If the call is active TODO: or is ringing for the callee
-		if (sip->call[lineNumber] != NULL) {
-			// stop call timer			
-			gui()->stopCallTimer(lineNumber);
-			sip->manageActions (lineNumber, CLOSE_CALL);
-			sip->notUsedLine = -1;	
-		}		
-		break;
-
-	case ONHOLD_CALL:
-		if (sip->call[lineNumber] != NULL) {
-			sip->manageActions (lineNumber, ONHOLD_CALL);
-		}
-		break;
-		
-	case OFFHOLD_CALL:
-		if (sip->call[lineNumber] != NULL) {
-			sip->manageActions (lineNumber, OFFHOLD_CALL);
-		}
-		break;
-		
-	case TRANSFER_CALL:
-		if (sip->call[lineNumber] != NULL) {
-			sip->manageActions (lineNumber, TRANSFER_CALL);
-		}
-		break;
-		
-	case CANCEL_CALL:
-		if (sip->call[lineNumber] != NULL) {
-			sip->manageActions (lineNumber, CANCEL_CALL);
+Manager::deleteCall (short id)
+{
+	unsigned int i = 0;
+	while (i < _callVector->size()) {
+		if (_callVector->at(i)->getId() == id) {
+			_callVector->erase(_callVector->begin()+i);
+	//		delete getCall(id);	
+			return;
+		} else {
+			i++;
 		}
-		break;
+	}
+}
 
-	default:
-		break;
+///////////////////////////////////////////////////////////////////////////////
+// Management of events' IP-phone user
+///////////////////////////////////////////////////////////////////////////////
+int 
+Manager::outgoingCall (const string& to)
+{	
+	short id;
+	Call* call;
+	
+	id = generateNewCallId();
+	pushBackNewCall(id, Outgoing);
+	
+	_debug("\nOutgoing Call with identifiant %d\n", id);
+	call = getCall(id);
+	
+	call->setStatus(string(TRYING_STATUS));
+	call->setState(Progressing);
+	if (call->outgoingCall(to) == 0) {
+		return id;
+	} else {
+		return 0;
 	}
 }
 
+int 
+Manager::hangupCall (short id)
+{
+	Call* call;
+
+	call = getCall(id);
+	call->setStatus(string(HUNGUP_STATUS));
+	call->setState(Hungup);
+	getCall(id)->hangup();
+	_mutex.enterMutex();
+	_nCalls -= 1;
+	_mutex.leaveMutex();
+	deleteCall(id);
+	return 1;
+}
+
+int 
+Manager::answerCall (short id)
+{
+	Call* call;
+
+	call = getCall(id);
+	call->setStatus(string(CONNECTED_STATUS));
+	call->setState(Answered);
+	call->answer();
+	ringtone(false);
+	return 1;
+}
+
+int 
+Manager::onHoldCall (short id)
+{
+	Call* call;
+	call = getCall(id);
+	call->setStatus(string(ONHOLD_STATUS));
+	call->setState(OnHold);
+	call->onHold();
+	return 1;
+}
+
+int 
+Manager::offHoldCall (short id)
+{
+	Call* call;
+	call = getCall(id);
+	call->setStatus(string(CONNECTED_STATUS));
+	call->setState(OffHold);
+	call->offHold();	
+	return 1;
+}
+
+int 
+Manager::transferCall (short id, const string& to)
+{
+	Call* call;
+	call = getCall(id);
+	call->setStatus(string(TRANSFER_STATUS));
+	call->setState(Transfered);
+	call->transfer(to);
+	return 1;
+}
+
+int 
+Manager::muteOn (short id)
+{
+	Call* call;
+	call = getCall(id);
+	call->setStatus(string(MUTE_ON_STATUS));
+	call->setState(MuteOn);
+	call->muteOn();
+	return 1;
+}
+
+int 
+Manager::muteOff (short id)
+{
+	Call* call;
+	call = getCall(id);
+	call->setStatus(string(CONNECTED_STATUS));
+	call->setState(MuteOff);
+	call->muteOff();
+	return 1;
+}
+
+int 
+Manager::refuseCall (short id)
+{
+	Call *call;
+	call = getCall(id);
+	call->setStatus(string(HUNGUP_STATUS));
+	call->setState(Refused);	
+	call->refuse();
+	ringtone(false);
+	delete call;
+	return 1;
+}
+
+int 
+Manager::cancelCall (short id)
+{
+	Call *call;
+	call = getCall(id);
+	call->setStatus(string(LOGGED_IN_STATUS));
+	call->setState(Cancelled);	
+	call->cancel();
+	ringback(false);
+	delete call;
+	return 1;
+}
+
 int
-Manager::newCallLineNumber (void) {
-	return sip->notUsedLine;
+Manager::saveConfig (void)
+{
+	return (Config::tree()->saveToFile(_path.data()) ? 1 : 0);
 }
 
-bool
-Manager::isRingingLine (int line) {
-	if (line == this->newCallLineNumber()) {
-		return true;
-	}
-	return false;
+int 
+Manager::registerVoIPLink (void)
+{
+	_voIPLinkVector->at(DFT_VOIP_LINK)->setRegister();
+	return 1;
 }
 
-bool
-Manager::isNotUsedLine (int line) {
-	for (int k = 0; k < NUMBER_OF_LINES; k++) {
-		if (line == k) {
-			if (sip->call[line] == NULL) {
-				return true;
-			}
-		}
+int 
+Manager::quitApplication (void)
+{
+	// Quit VoIP-link library
+	_voIPLinkVector->at(DFT_VOIP_LINK)->quit();
+	if (saveConfig()) {
+		return 1;
+	} else {
+		return 0;
 	}
-	return false;
+	Config::deleteTree();
+}
+
+int 
+Manager::sendTextMessage (short id, const string& message)
+{
+	return 1;
+}
+
+int 
+Manager::accessToDirectory (void)
+{
+	return 1;
+}
+
+int 
+Manager::sendDtmf (short id, char code)
+{
+	int sendType = get_config_fields_int(SIGNALISATION, SEND_DTMF_AS);
+                                                                                
+    switch (sendType) {
+        // SIP INFO
+        case 0:
+			_voIPLinkVector->at(DFT_VOIP_LINK)->carryingDTMFdigits(id, code);
+			return 1;
+            break;
+                                                                                
+        // Audio way
+        case 1:
+			return 1;
+            break;
+                                                                                
+        // rfc 2833
+        case 2:
+			return 1;
+            break;
+                                                                                
+        default:
+			return -1;
+            break;
+    }
 }
 
-bool
-Manager::isUsedLine (int line) {
-	for (int k = 0; k < NUMBER_OF_LINES; k++) {
-		if (line == k) {
-			if (sip->call[line] != NULL) {
-				return true;
-			}
-		}
-	}
-	return false;
+///////////////////////////////////////////////////////////////////////////////
+// Management of event peer IP-phone 
+///////////////////////////////////////////////////////////////////////////////
+
+int 
+Manager::incomingCall (short id)
+{
+	Call* call;
+	call = getCall(id);
+	call->setType(Incoming);
+	call->setStatus(string(RINGING_STATUS));
+	call->setState(Progressing);
+	ringtone(true);
+	_gui->incomingCall(id);
+	return 1;
+}
+
+// L'autre personne a repondu
+int 
+Manager::peerAnsweredCall (short id)
+{
+	Call* call;
+
+	call = getCall(id);
+	call->setStatus(string(CONNECTED_STATUS));
+	call->setState(Answered);
+	_gui->peerAnsweredCall(id);
+	ringback(false);
+	return 1;
+}
+
+int 
+Manager::peerRingingCall (short id)
+{
+	Call* call;
+
+	call = getCall(id);
+	call->setStatus(string(RINGING_STATUS));
+	call->setState(Ringing);
+	_gui->peerRingingCall(id);
+	ringback(true);
+	
+	return 1;
 }
 
+int 
+Manager::peerHungupCall (short id)
+{
+	Call* call;
 
-int
-Manager::findLineNumberNotUsed (void) {
-	return sip->findLineNumberNotUsed();
+	call = getCall(id);
+	call->setStatus(string(HUNGUP_STATUS));
+	call->setState(Hungup);
+	_gui->peerHungupCall(id);
+	ringback(false);
+	_mutex.enterMutex();
+	_nCalls -= 1;
+	_mutex.leaveMutex();
+	deleteCall(id);
+	return 1;
 }
 
-int
-Manager::getNumberPendingCalls (void) {
-	return sip->getNumberPendingCalls();
+void 
+Manager::displayTextMessage (short id, const string& message)
+{
+	_gui->displayTextMessage(id, message);
 }
-/**
- * Handle the remote callee's events
- *
- * @param	code:		event code
- * @param	reason:		event reason
- * @param	remotetype:	event type
- */
-void
-Manager::handleRemoteEvent (int code, char * reason, int remotetype, int line) {
-	QString qinfo;
-	
-	switch (remotetype) {
-		// Registration success
-		case EXOSIP_REGISTRATION_SUCCESS: 
-			gui()->lcd->setStatus(LOGGED_IN_STATUS);				
-			break;
-
-		// Registration failure
-		case EXOSIP_REGISTRATION_FAILURE:
-			gui()->lcd->setStatus(REG_FAIL_STATUS);				
-			break;
-			
-		// Remote callee answered
-		case EXOSIP_CALL_ANSWERED:
-			if (!gui()->transfer)
-				gui()->lcd->setStatus(CONNECTED_STATUS);
-			// Start call timer
-			gui()->startCallTimer(getCurrentLineNumber());
-			phLines[getCurrentLineNumber()]->setbDial(false);
-			break;
-
-		// Remote callee hangup
-		case EXOSIP_CALL_CLOSED:
-			if (sip->getNumberPendingCalls() == 0 
-					or !phLines[line]->isOnHold()) {
-			// Show HUNGUP_STATUS if there's not pending call 
-			// or line is not onhold
-				gui()->lcd->clear(QString(HUNGUP_STATUS));
-				if (getCurrentLineNumber() != -1 and line != getCurrentLineNumber()) {
-				// To show current status and phone number
-					gui()->lcd->appendText(phLines[getCurrentLineNumber()]->text);
-					gui()->lcd->setStatus(phLines[getCurrentLineNumber()]->status);
-				}
-			}
-
-			if (phLines[line]->getbInProgress()) {
-				this->ring(false);
-				phLines[line]->setbRinging(false);
-			//	gui()->setFreeStateLine(newCallLineNumber());
-				gui()->setFreeStateLine(line);
-				
-				//setCallInProgress(false);
-				phLines[line]->setbInProgress(false);
-			} else {
-				if (line == getCurrentLineNumber()) {
-					// set free line
-					gui()->setCurrentLineNumber(-1);
-				}
-				// Stop call timer
-				gui()->stopCallTimer(line);
-				// set state free pixmap line
-				gui()->setFreeStateLine(line);			
-			}
-			phLines[line]->setbDial(false);
-			sip->notUsedLine = -1;
-			
-			break;
-
-		// Remote call ringing
-		case EXOSIP_CALL_RINGING:
-			gui()->lcd->setStatus(RINGING_STATUS);
-			phLines[getCurrentLineNumber()]->setbDial(false);
-			break;
-			
-		default:
-			break;
-	}
 
-	// If dialog is established
-	if (code == DIALOG_ESTABLISHED) {
-		gui()->lcd->setStatus(RINGING_STATUS);		
-	// if error code
-	} else { 	
-		if (code == AUTH_REQUIRED) {
-			gui()->lcd->setStatus(TRYING_STATUS);
-		} else if (code > 399 and code != AUTH_REQUIRED and 
-					code != REQ_TERMINATED) {
-			qinfo = QString::number(code, 10) + " " + 
-				QString(reason);
-			gui()->lcd->setStatus(qinfo);
-		} else if (0 < code < 400) {
-			qinfo = QString(reason);
-		}
-	}
-		
-	// Store the status of current line
-	if(getCurrentLineNumber() != -1) {
-/*		if (remotetype == EXOSIP_CALL_NEW) {
-			theline = line;
-		} else {
-			theline = getCurrentLineNumber();
-		}
-		if ((code != REQ_TERMINATED and code != DIALOG_ESTABLISHED) 
-				or line == getCurrentLineNumber()) {*/
-		// If the remote-user close its remote call.
-		//	phLines[theline]->status = getStatusRender();	
-			phLines[getCurrentLineNumber()]->status = getStatusRender();	
-	//	}
-	}
+void 
+Manager::displayError (const string& error)
+{
+	_gui->displayStatus(error);
 }
 
-bool
-Manager::tryingState (int line) {
-	if (phLines[line]->status == TRYING_STATUS) {
-		return true;
-	} else {
-		return false;
-	}
+void 
+Manager::displayStatus (const string& status)
+{
+	_gui->displayStatus(status);
 }
 
+
 void
-Manager::startDialTone (void) {
-	gui()->dialTone(true);
+Manager::congestion (bool var) {
+    if (_error->getError() == 0) {
+        if (_congestion != var) {
+            _congestion = var;
+        }
+        _tonezone = var;
+        _tone->toneHandle(ZT_TONE_CONGESTION);
+    } else {
+        _error->errorName(DEVICE_NOT_OPEN, NULL);
+    }
 }
 
-int
-Manager::startSound (SipCall *ca) {
-	return audioRTP->createNewSession(ca);
+void
+Manager::ringback (bool var) {
+    if (_ringback != var) {
+        _ringback = var;
+    }
+    _tonezone = var;
+    _tone->toneHandle(ZT_TONE_RINGTONE);
 }
 
 void
-Manager::closeSound (SipCall *ca) {
-	audioRTP->closeRtpSession (ca);
-}
+Manager::ringtone (bool var) { 
 
-QString
-Manager::bufferTextRender (void) {
-	return QString(*gui()->lcd->textBuffer);
+	if (getNumberOfCalls() > 1 and _tonezone and var == false) {
+		// If more than one line is ringing
+		_tonezone = false;
+		_tone->playRingtone((_gui->getRingtoneFile()).data());
+	}
+	
+	if (_ringtone != var) {
+        _ringtone = var;
+    }
+                                                                                
+    _tonezone = var;
+	if (getNumberOfCalls() == 1) {
+		// If just one line is ringing
+	    _tone->playRingtone((_gui->getRingtoneFile()).data());
+	} 
 }
 
-QString
-Manager::getStatusRender (void) {
-	return (gui()->lcd->getStatus());
+void
+Manager::notificationIncomingCall (void) {
+    short *buffer = new short[SAMPLING_RATE];
+                                                                                
+    _tone->generateSin(440, 0, AMPLITUDE, SAMPLING_RATE, buffer);
+                                                                                
+    audiodriver->audio_buf.resize(SAMPLING_RATE/2);
+    audiodriver->audio_buf.setData(buffer, 50/*getSpkrVolume()*/);
+    delete[] buffer;
 }
 
 void
-Manager::getInfoStun (StunAddress4& stunSvrAddr) {
-	StunAddress4 mappedAddr;
-	
-	int fd3, fd4; 
+Manager::getStunInfo (StunAddress4& stunSvrAddr) {
+    StunAddress4 mappedAddr;
+	struct in_addr in;
+	char* addr;
+	char to[16];
+	bzero (to, 16);
+                                                                                
+    int fd3, fd4;
     bool ok = stunOpenSocketPair(stunSvrAddr,
                                       &mappedAddr,
                                       &fd3,
                                       &fd4);
-	if (ok) {
-    	closesocket(fd3);
+    if (ok) {
+        closesocket(fd3);
         closesocket(fd4);
-        qDebug("Got port pair at %d", mappedAddr.port);
-		firewallPort = mappedAddr.port;
-		QHostAddress ha(mappedAddr.addr);
-		firewallAddr = ha.toString();
-		qDebug("address firewall = %s",firewallAddr.ascii());
-	} else {
-    	qDebug("Opened a stun socket pair FAILED");
+        _debug("Got port pair at %d\n", mappedAddr.port);
+        _firewallPort = mappedAddr.port;
+		
+		// Convert ipv4 address to host byte ordering
+		in.s_addr = ntohl (mappedAddr.addr);
+		addr = inet_ntoa(in);
+        _firewallAddr = string(addr);
+        _debug("address firewall = %s\n",_firewallAddr.data());
+    } else {
+        _debug("Opened a stun socket pair FAILED\n");
     }
 }
 
-int
-Manager::getFirewallPort (void) {
-	return firewallPort;
+bool
+Manager::useStun (void) {
+    if (get_config_fields_int(SIGNALISATION, USE_STUN) == YES) {
+        return true;
+    } else {
+        return false;
+    }
 }
 
-void
-Manager::setFirewallPort (int port) {
-	firewallPort = port;
-}
 
-QString
-Manager::getFirewallAddress (void) {
-	return firewallAddr;
-}
+///////////////////////////////////////////////////////////////////////////////
+// Private functions
+///////////////////////////////////////////////////////////////////////////////
 
-/**
- * Returns true if the current line replaces another one
- */
-bool
-Manager::otherLine (void) {
-	if (gui()->busyNum != -1) {
-		if (phLines[getCurrentLineNumber()]->status != TRYING_STATUS and
-				gui()->busyNum != getCurrentLineNumber()) {
-			return true;
-		}
+short 
+Manager::generateNewCallId (void)
+{
+	short random_id = rand();  
+	
+	// Check if already a call with this id exists 
+	while (getCall(random_id) != NULL or random_id <= 0) {
+		random_id = rand();
 	}
-	return false;
+	_mutex.enterMutex();
+	_nCalls += 1;
+	_mutex.leaveMutex();
+	// If random_id is not attributed, returns it.
+	return random_id;
 }
 
-int
-Manager::getCurrentLineNumber (void) {
-	return gui()->currentLineNumber;
-}
-
-bool
-Manager::isChosenLine (void) {
-	return gui()->choose;
+unsigned int 
+Manager::callVectorSize (void)
+{
+	return _callVector->size();
 }
 
 int
-Manager::chosenLine (void) {
-	return gui()->chosenLine;
-}
-
-void
-Manager::setChoose (bool b, bool b2) {
-	gui()->choose = b;
-	gui()->noChoose = b2;
-}
+Manager::createSettingsPath (void) {
+	int exist = 1;
+  	_path = string(HOMEDIR) + "/." + PROGNAME;
+             
+  	if (mkdir (_path.data(), 0755) != 0) {
+		// If directory	creation failed
+    	if (errno != EEXIST) {
+			_debug("Cannot create directory: %d\n", strerror(errno));
+			return -1;
+      	} 	
+  	} 
 
-bool
-Manager::useStun () {
-	if (Config::geti("Signalisations", "STUN.useStun") == YES) {
-		return true;
-	} else {
-		return false;
-	}
-}
+	// Load user's config
+	_path = _path + "/" + PROGNAME + "rc";
 
-/**
- * Handle choice of the DTMF-send-way
- *
- * @param	line: number of the line.
- * @param	digit: pressed key.
- */
-void
-Manager::dtmf (int line, char digit) {
-	int sendType = Config::geti ("Signalisations", "DTMF.sendDTMFas");
+	exist = Config::tree()->populateFromFile(_path);
 	
-	switch (sendType) {
-		// SIP INFO
-		case 0:
-			if (sip->call[line] != NULL) {
-				sip->carryingDTMFdigits(line, digit);
-			}
-			break;
-
-		// Audio way
-		case 1:
-			break;
-			
-		// rfc 2833
-		case 2:
-			break;
-			
-		default:
-			break;
+	if (exist == 0){
+		// If populateFromFile failed
+		return 0;
+	} else if (exist == 2) {
+		// If  file doesn't exist yet
+		return 2;
 	}
+	return exist;
 }
 
 void
-Manager::errorDisplay (char *error) {
-	gui()->lcd->clearBuffer();
-	gui()->lcd->appendText(error);
+Manager::initConfigFile (void) 
+{
+	fill_config_fields_int(SIGNALISATION, VOIP_LINK_ID, DFT_VOIP_LINK); 	
+	fill_config_fields_str(SIGNALISATION, FULL_NAME, EMPTY_FIELD);
+	fill_config_fields_str(SIGNALISATION, USER_PART, EMPTY_FIELD); 
+	fill_config_fields_str(SIGNALISATION, AUTH_USER_NAME, EMPTY_FIELD); 
+	fill_config_fields_str(SIGNALISATION, PASSWORD, EMPTY_FIELD); 
+	fill_config_fields_str(SIGNALISATION, HOST_PART, EMPTY_FIELD); 
+	fill_config_fields_str(SIGNALISATION, PROXY, EMPTY_FIELD); 
+	fill_config_fields_int(SIGNALISATION, AUTO_REGISTER, YES);
+	fill_config_fields_int(SIGNALISATION, PLAY_TONES, YES); 
+	fill_config_fields_int(SIGNALISATION, PULSE_LENGTH, DFT_PULSE_LENGTH); 
+	fill_config_fields_int(SIGNALISATION, SEND_DTMF_AS, SIP_INFO); 
+	fill_config_fields_str(SIGNALISATION, STUN_SERVER, DFT_STUN_SERVER); 
+	fill_config_fields_int(SIGNALISATION, USE_STUN, NO); 
+
+	fill_config_fields_int(AUDIO, DRIVER_NAME, DFT_DRIVER); 
+	fill_config_fields_int(AUDIO, NB_CODEC, DFT_NB_CODEC); 
+	fill_config_fields_str(AUDIO, CODEC1, DFT_CODEC); 
+	fill_config_fields_str(AUDIO, CODEC2, DFT_CODEC); 
+	fill_config_fields_str(AUDIO, CODEC3, DFT_CODEC); 
+	fill_config_fields_str(AUDIO, CODEC4, DFT_CODEC); 
+	fill_config_fields_str(AUDIO, CODEC5, DFT_CODEC); 
+	fill_config_fields_str(AUDIO, RING_CHOICE, DFT_RINGTONE); 
+	fill_config_fields_int(AUDIO, VOLUME_SPKR_X, DFT_VOL_SPKR_X); 
+	fill_config_fields_int(AUDIO, VOLUME_SPKR_Y, DFT_VOL_SPKR_Y); 
+	fill_config_fields_int(AUDIO, VOLUME_MICRO_X, DFT_VOL_MICRO_X); 
+	fill_config_fields_int(AUDIO, VOLUME_MICRO_Y, DFT_VOL_MICRO_Y); 
+
+	fill_config_fields_str(PREFERENCES, SKIN_CHOICE, DFT_SKIN); 
+	fill_config_fields_int(PREFERENCES, CONFIRM_QUIT, YES); 
+	fill_config_fields_str(PREFERENCES, ZONE_TONE, DFT_ZONE); 
+	fill_config_fields_int(PREFERENCES, CHECKED_TRAY, NO); 
+	fill_config_fields_str(PREFERENCES, VOICEMAIL_NUM, DFT_VOICEMAIL); 
 }
 
 void
-Manager::nameDisplay (char *name) {
-	gui()->lcd->clearBuffer();
-	gui()->lcd->appendText(name);
+Manager::initAudioCodec (void)
+{
+	_nCodecs = 3;//get_config_fields_int(AUDIO, NB_CODEC);
+	_codecDescVector = new CodecDescriptorVector();
+	_codecDescVector->push_back(new CodecDescriptor(PAYLOAD_CODEC_ULAW, 
+				CODEC_ULAW));
+	_codecDescVector->push_back(new CodecDescriptor(PAYLOAD_CODEC_ALAW, 
+				CODEC_ALAW));
+	_codecDescVector->push_back(new CodecDescriptor(PAYLOAD_CODEC_GSM, 
+				CODEC_GSM));
+	// TODO: put to 1 when these codec will be implemented
+#if 0
+	_codecDescVector->push_back(new CodecDescriptor(PAYLOAD_CODEC_ILBC, 
+				CODEC_ILBC));
+	_codecDescVector->push_back(new CodecDescriptor(PAYLOAD_CODEC_SPEEX, 
+				CODEC_SPEEX));
+#endif
 }
 
-void
-Manager::spkrSoundVolume (int val) {
-	spkr_volume = val;
-}
 
 void
-Manager::micSoundVolume (int val) {
-	mic_volume = val;
+Manager::selectAudioDriver (void)
+{
+	if (get_config_fields_int(AUDIO, DRIVER_NAME) == OSS_DRIVER) {
+		_useAlsa = false;
+        audiodriver = new AudioDriversOSS (AudioDrivers::ReadWrite, _error);
+    } else {
+		_useAlsa = true;
+        audiodriver = new AudioDriversALSA (AudioDrivers::WriteOnly, _error);
+        audiodriverReadAlsa = new AudioDriversALSA (AudioDrivers::ReadOnly, _error);
+    }
 }
+
+
+
diff --git a/src/manager.h b/src/manager.h
index 8d32d97065..c4e04e9d0d 100644
--- a/src/manager.h
+++ b/src/manager.h
@@ -1,5 +1,5 @@
 /**
- *  Copyright (C) 2004 Savoir-Faire Linux inc.
+ *  Copyright (C) 2004-2005 Savoir-Faire Linux inc.
  *  Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com>
  *                                                                              
  *  This program is free software; you can redistribute it and/or modify
@@ -20,119 +20,250 @@
 #ifndef __MANAGER_H__
 #define __MANAGER_H__
 
-#include "audiodrivers.h"
-#include "phoneline.h"
+#include <cc++/thread.h>
+
+#include <string>
+#include <vector>
+
+#include "audio/codecDescriptor.h"
+#include "audio/audiodrivers.h"
+#include "error.h"
+#include "call.h"
+#include "user_cfg.h"
+#include "voIPLink.h"
+#include "gui/guiframework.h"
 #include "../stund/stun.h"
 
-// Status list
-#define LOGGED_IN_STATUS 	"Logged in"	
-#define REG_FAIL_STATUS		"Registration failure"	
+using namespace std;
+using namespace ost;
+
+// Status
 #define CONNECTED_STATUS	"Connected"
-#define	HUNGUP_STATUS		"Hung up"
+#define LOGGED_IN_STATUS	"Logged in"
 #define RINGING_STATUS		"Ringing"
-#define TRYING_STATUS		"Trying..."
-#define	REFUSED_CALL_STATUS	"Refused call"
-#define ENTER_NUMBER_STATUS	"Enter Phone Number:"
-#define TRANSFER_STATUS		"Transfer to:"
+#define TRYING_STATUS		"Trying ..."
+#define HUNGUP_STATUS       "Hung up"
+#define ONHOLD_STATUS       "On hold ..."
+#define TRANSFER_STATUS     "Transfer to:"
+#define MUTE_ON_STATUS		"Mute on"
+#define ENTER_NUMBER_STATUS "Enter Phone Number:"
 
-#include <string>
-using namespace std;
+/*
+ * Define a type for a list of call
+ */
+typedef vector<Call*, allocator<Call*> > CallVector;
 
-class AudioRtp;
-class SIP;
-class SipCall;
-class ToneGenerator;
-class QtGUIMainWindow;
-class Error;
+/*
+ * Define a type for a list of VoIPLink
+ */
+typedef vector<VoIPLink*, allocator<VoIPLink*> > VoIPLinkVector;
 
+/*
+ * Define a type for a list of CodecDescriptor
+ */
+typedef vector<CodecDescriptor*, allocator<CodecDescriptor*> > CodecDescriptorVector;
+
+class GuiFramework;
+class ToneGenerator;
 class Manager {
 public:
-	Manager (QString *);
+	Manager (void);
 	~Manager (void);
 
-	QtGUIMainWindow *phonegui;
-	SIP 			*sip;
-	PhoneLine		*phLines[NUMBER_OF_LINES];	
-	AudioRtp		*audioRTP;
-		
-	AudioDrivers	*audiodriver;
 #ifdef ALSA
-	AudioDrivers	*audiodriverReadAlsa;
-#endif
-	Error 			*error;
-
-	bool			 useAlsa;
-	ToneGenerator	*tone;
-	QString 		*DirectCall; // from -p argv
-	bool 			 mute;
-	bool 			 tonezone;
-	std::string		 path;
-
-	inline
-	QtGUIMainWindow*gui				(void) { return this->phonegui; }
-	bool	ringing 				(void);
-	inline
-	void 	ring    				(void) { this->ring(true); }
-	void 	ring    				(bool);
-	void 	quitLibrary 			(void);
-	int		outgoingNewCall			(void);
-	void 	actionHandle			(int, int);
-	int 	findLineNumberNotUsed	(void);
-	int 	getNumberPendingCalls	(void);
-	void 	handleRemoteEvent		(int, char *, int, int = -1);
-	int		startSound				(SipCall *);
-	void 	closeSound 				(SipCall *);	
-	void	selectAudioDriver		(void);
-	QString	bufferTextRender		(void);
-	QString	getStatusRender			(void);
-	bool	isNotUsedLine			(int);
-	bool	isUsedLine				(int);
-	bool	isRingingLine			(int);
-	int		newCallLineNumber		(void);
-	void	getInfoStun		       	(StunAddress4 &);
-	int		getFirewallPort			(void);
-	void	setFirewallPort 		(int);
-	QString	getFirewallAddress		(void);
-	bool	otherLine				(void);
-	bool	isChosenLine			(void);
-	int		chosenLine				(void);
-	void	setChoose				(bool, bool);
-	bool	useStun					(void);
-	void	dtmf					(int, char);
-	int		getCurrentLineNumber	(void);
-#if 0
-	bool	getCallInProgress		(void);
-	void	setCallInProgress		(bool);
+	AudioDrivers* audiodriverReadAlsa;
 #endif
-	bool	transferedCall			(void);
-
-	void	ringTone				(bool);
-	void	startDialTone			(void);
-	void	congestion				(bool); 
-	inline bool	getbCongestion		(void) { return b_congestion; } 
-	void	notificationIncomingCall(void);
-	void	errorDisplay			(char*);
-	void	nameDisplay				(char*);
-	void	spkrSoundVolume			(int);
-	void	micSoundVolume			(int);
-	inline 	int	getSpkrVolume (void) { return spkr_volume; }
-	inline 	int	getMicVolume (void) { return mic_volume; }
-	bool	tryingState (int);
+	AudioDrivers* audiodriver;
+
+	void init (void);
+	void setGui (GuiFramework* gui);
+	ToneGenerator* getTonegenerator(void);
+	Error* error(void);
+
+	// Accessor to number of calls 
+	unsigned int getNumberOfCalls (void);
+	// Modifior of number of calls 
+	void setNumberOfCalls (unsigned int nCalls);
+	
+	// Accessor to current call id 
+	short getCurrentCallId (void);
+	// Modifior of current call id 
+	void setCurrentCallId (short currentCallId);
+
+	// Accessor to the Call vector 
+	CallVector* getCallVector (void);
+	// Accessor to the Call with the id 'id' 
+	Call* getCall (short id);
+	
+	unsigned int getNumberOfCodecs (void);
+	void setNumberOfCodecs (unsigned int nb_codec);
+	
+	VoIPLinkVector* getVoIPLinkVector (void);
+
+	CodecDescriptorVector* getCodecDescVector(void);
+
+	inline bool getTonezone (void) { return _tonezone; }
+	inline void setTonezone (bool b) { _tonezone = b; }
+
+	/* 
+	 * Attribute a new random id for a new call 
+	 * and check if it's already attributed to existing calls. 
+	 * If not exists, returns 'id' otherwise return 0 
+	 */   
+	short generateNewCallId (void);
+
+	/*
+	 * Add a new call at the end of the CallVector with identifiant 'id'
+	 */
+	void pushBackNewCall (short id, enum CallType type);
+	void deleteCall	(short id);
+	
+	int outgoingCall (const string& to);
+	int hangupCall (short id);
+	int answerCall (short id);
+	int onHoldCall (short id);
+	int offHoldCall (short id);
+	int transferCall (short id, const string& to);
+	int muteOn (short id);
+	int muteOff (short id);
+	int refuseCall (short id);
+	int cancelCall (short id);
+
+	int saveConfig (void);
+	int registerVoIPLink (void);
+	int quitApplication (void);
+	int sendTextMessage (short id, const string& message);
+	int accessToDirectory (void);
+	
+	/**
+   	 * Handle choice of the DTMF-send-way
+ 	 *
+ 	 * @param   id: callid of the line.
+  	 * @param   code: pressed key.
+ 	 */
+	int sendDtmf (short id, char code);
+	
+
+	int incomingCall (short id);
+	int peerAnsweredCall (short id);
+	int peerRingingCall (short id);
+	int peerHungupCall (short id);
+	void displayTextMessage (short id, const string& message);
+	void displayError (const string& error);
+	void displayStatus (const string& status);
+
+	
+	/*
+	 * Handle audio sounds heard by a caller while they wait for their 
+	 * connection to a called party to be completed.
+	 */
+	void ringback (bool var);
+
+	void ringtone (bool var);
+	void congestion (bool var);
+	void notificationIncomingCall (void);
+
+	/*
+	 * Get information about firewall 
+	 * @param	stunSvrAddr: stun server
+	 */
+	void getStunInfo (StunAddress4& stunSvrAddr);
+	bool useStun (void);
+	
+	inline bool getbCongestion 	(void) { return _congestion; }
+	inline bool getbRingback 	(void) { return _ringback; }
+	inline bool getbRingtone 	(void) { return _ringtone; }
+	inline bool useAlsa 		(void) { return _useAlsa; }
+
+	inline int getSpkrVolume 	(void) 			{ return _spkr_volume; }
+	inline void setSpkrVolume 	(int spkr_vol) 	{ _spkr_volume = spkr_vol; }
+	inline int getMicroVolume 	(void) 			{ return _mic_volume; }
+	inline void setMicroVolume 	(int mic_vol) 	{ _mic_volume = mic_vol; }
+	
+	inline int getFirewallPort 		(void) 		{ return _firewallPort; }
+	inline void setFirewallPort 	(int port) 	{ _firewallPort = port; }
+	inline string getFirewallAddress (void) 	{ return _firewallAddr; }
 
 private:
-	bool    exist;
-	bool	b_ringing;
-	bool	b_ringtone;
-	bool	b_congestion;
-	int		firewallPort;
-	QString	firewallAddr;
-	int 	spkr_volume;
-	int 	mic_volume;
-
-	void 	sip_init			(void);
-	void 	initVolume			(void);
-	bool 	createSettingsPath	(void);
 
+	/*
+	 * Returns the number of calls in the vector
+	 */
+	unsigned int callVectorSize (void);
+
+	/**
+ 	 * Create .PROGNAME directory in home user and create 
+	 * configuration tree from the settings file if this file exists.
+ 	 *
+ 	 * @return	0 if creating file failed
+	 *			1 if config-file exists
+	 *			2 if file doesn't exist yet.
+ 	 */
+	int createSettingsPath (void);
+		
+	/*
+	 * Init default values for the different fields
+	 */
+	void initConfigFile (void);
+
+	void initAudioCodec(void);
+	void selectAudioDriver (void);
+	
+/////////////////////
+// Private variables
+/////////////////////
+	ToneGenerator* _tone;
+	Error* _error;
+	GuiFramework* _gui;
+	/*
+	 * Vector of VoIPLink
+	 */
+	VoIPLinkVector* _voIPLinkVector;
+	
+	/*
+	 * Vector of calls
+	 */
+	CallVector* _callVector;
+
+	/*
+	 * Vector of CodecDescriptor
+	 */
+	CodecDescriptorVector* _codecDescVector;
+
+	/*
+	 * Mutex to protect access to code section
+	 */
+	Mutex		_mutex;
+	
+	unsigned int _nCalls;
+	short _currentCallId;
+
+	/*
+	 * For the call timer
+	 */
+	unsigned int _startTime;
+	unsigned int _endTime;
+
+	/* Path of the ConfigFile 
+	 */
+	string 	_path;
+	int 	_exist;
+
+	unsigned int _nCodecs;
+	bool         _tonezone;
+	bool		 _congestion;
+	bool		 _ringback;
+	bool		 _ringtone;
+
+	bool 		_useAlsa;
+	
+	// To handle volume control
+	int 		_spkr_volume;
+	int 		_mic_volume;
+
+	// To handle firewall
+	int			_firewallPort;
+	string		_firewallAddr;
 };
 
 #endif // __MANAGER_H__
diff --git a/src/qtGUImainwindow.cpp b/src/qtGUImainwindow.cpp
deleted file mode 100644
index 463a4cb48a..0000000000
--- a/src/qtGUImainwindow.cpp
+++ /dev/null
@@ -1,1449 +0,0 @@
-/**
- *  Copyright (C) 2004 Savoir-Faire Linux inc.
- *  Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com> 
- *                                                                             
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *                                                                             
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *                                                                             
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-
-////////////////////////////////////////////////////////////////////////////////
-// QtGUIMainWindow Implementation                                             //
-////////////////////////////////////////////////////////////////////////////////
-
-#include "configurationtree.h"
-#include <stdio.h>
-
-#include <qbitmap.h>
-#include <qcheckbox.h>
-#include <qcombobox.h>
-#include <qevent.h>
-#include <qinputdialog.h>
-#include <qlineedit.h>
-#include <qmessagebox.h>
-#include <qpushbutton.h>
-#include <qregexp.h>
-#include <qsettings.h>
-#include <qspinbox.h>
-#include <qtimer.h>
-#include <qtooltip.h>
-
-#include "audiodrivers.h"
-#include "configuration.h"
-#include "configurationpanelui.h"
-#include "error.h"
-#include "global.h"
-#include "jpushbutton.h"
-#include "manager.h"
-#include "numerickeypadtools.h"
-#include "point.h"
-#include "skin.h"
-#include "qtGUImainwindow.h"
-#include "vector.h"
-#include "volumecontrol.h"
-
-#define QCHAR_TO_STRIP	"-"
-#define REG_EXPR		"(-|\\(|\\)| )"
-	
-
-///////////////////////////////////////////////////////////////////////////////
-// Tray Icon implementation
-///////////////////////////////////////////////////////////////////////////////
-MyTrayIcon::MyTrayIcon(const QPixmap &icon, const QString &tooltip, 
-		QPopupMenu *mypop, QObject *parent, const char *name)
-		: TrayIcon (icon, tooltip, mypop, parent, name)
-{
-	menu = mypop;
-}
-
-void
-MyTrayIcon::mousePressEvent (QMouseEvent *e) 
-{
-	switch ( e->button() ) {
-		case RightButton:
-			menu->popup( e->globalPos() );
-			e->accept();
-			break;
-			
-		case LeftButton:
-			emit clickedLeft();
-			break;
-			
-		case MidButton:
-			break;
-			
-		default:
-			break;
-	}
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// QtGUIMainWindow implementation
-///////////////////////////////////////////////////////////////////////////////
-
-/**
- * Default Constructor
- * Init, Connections
- */
-QtGUIMainWindow::QtGUIMainWindow (QWidget *parent, const char *name, WFlags f, 
-									Manager *mngr) 
-									: TransQWidget (parent, name, f) {
-	// Create configuration panel
-	panel = new ConfigurationPanel (0, 0, false);
-										
-	// Address book dialog
-	phonebook = new PhoneBook (0, 0, false);
-
-	// URL input dialog
-	urlinput = new URL_Input (this);
-	
-	// For managing 
-	this->callmanager = mngr;
-
-	// For DTMF
-	key = new DTMF ();
-	buf = new short[SIZEBUF];
-
-	// Create new display and numeric keypad
-	lcd = new MyDisplay(this, 0, this);
-	keypad = new NumericKeypad (this, NULL, Qt::WDestructiveClose |
-                    					Qt::WStyle_Customize |
-                    					Qt::WStyle_NoBorder);
- 	// Initialisation of variables
-	currentLineNumber = -1;
-	onLine = currentLineNumber;
-	chosenLine = -1;
-	choose = false;
-	noChoose = false;
-	transfer = false;
-	msgVar = false;
-	b_dialtone = false;
-	apply = false;
-	this->first = true;
-	
-	// Initialisation of all that concern the skin
-	initSkin();
-	this->initBlinkTimer();
-
-	
-	// By default, keyboard mapping mode is numerical mode
-	this->setMode(NUM_MODE);
-	
-	// Move 
-	setMainLCD ();
-	
-	// Change window title and Icon.
-	this->setCaption(PROGNAME);
-	this->setIcon(QPixmap(Skin::getPathPixmap(QString(PIXDIR), 
-				QString(SFLPHONE_LOGO))));
-
-	// Show the GUI
-	this->show();	
-
-	// Handle the tray icon system
-	mypop = new QPopupMenu(this);
-	mypop->insertItem ("Quit", qApp, SLOT(quit()));
-
-	trayicon = new MyTrayIcon(QPixmap(
-				Skin::getPathPixmap(QString(PIXDIR), QString(TRAY_ICON))), 
-				NULL, mypop, parent, name);
-	trayicon->show();
-	
-	// Connect to handle trayicon
-	connect(trayicon, SIGNAL(clickedLeft()), this, SLOT(clickHandle()));
-	// Connect blinkTimer signals to blink slot
-    connect(blinkTimer, SIGNAL(timeout()),this, SLOT(blinkMessageSlot()));
-	connect (blinkTimer, SIGNAL(timeout()), this, SLOT(blinkRingSlot()) );
-	connect (blinkTimer, SIGNAL(timeout()), this, SLOT(blinkLineSlot()));
-	// Connect to append url in display
-	connect (urlinput->buttonOK, SIGNAL(clicked()), this, SLOT(stripSlot()));
-	// Connect to save settings
-	connect (panel->buttonSave, SIGNAL(clicked()), this, SLOT(save()));
-	// Connect to apply skin
-	connect (panel->buttonApplySkin, SIGNAL(clicked()), this,SLOT(applySkin()));
-	// Connect to register manually
-	connect (panel->Register, SIGNAL(clicked()), this, SLOT(registerSlot()));
-}
-
-/**
- * Destructor
- */
-QtGUIMainWindow::~QtGUIMainWindow(void) {
-	deleteButtons();
-	delete	panel;
-	delete  blinkTimer;
-	delete  keypad;
-	delete	lcd;
-	delete  urlinput;
-	delete	callmanager;
-	delete 	mypop;
-	delete 	trayicon;
-	delete  pt;
-}
-
-void
-QtGUIMainWindow::deleteButtons (void) {
-	delete  phoneKey_transf;
-	delete  phoneKey_msg;
-	delete  phoneKey_conf;
-	delete  phoneKey_line0;
-	delete  phoneKey_line1;
-	delete  phoneKey_line2;
-	delete  phoneKey_line3;
-	delete  reduce_button;
-	delete  quit_button;
-	delete  addr_book_button;
-	delete  configuration_button;
-	delete  hangup_button;
-	delete  dial_button;
-	delete  mute_button;
-	delete	dtmf_button;
-	delete	vol_mic;
-	delete 	vol_spkr;
-	delete	micVolVector;
-	delete	spkrVolVector;
-	for (int j = 0; j < NUMBER_OF_LINES; j++) {
-		delete callmanager->phLines[j]->button();
-	}
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Private Methods implementations     	                               	     
-///////////////////////////////////////////////////////////////////////////////
-/**
- * Init and start blink timer for all blinking pixmap, with 500 ms timeout.
- */
-void
-QtGUIMainWindow::initBlinkTimer(void) {
-	blinkTimer = new QTimer(this);
-	blinkTimer->start(500);
-}
-
-/**
- * Init variable with skin choice
- */
-QString
-QtGUIMainWindow::setPathSkin (void) {
-	return QString(Config::getchar(
-					"Preferences", "Themes.skinChoice", "metal"));
-}
-
-/**
- * Init variable with ring choice
- */
-QString
-QtGUIMainWindow::ringFile(void) {
-	return QString(Config::getchar(
-					"Audio", "Rings.ringChoice", "konga.ul"));
-}
-
-/**
- * Get whole path for rings
- */
-QString
-QtGUIMainWindow::getRingFile (void) {
-	QString ringFilename(Skin::getPathRing(QString(RINGDIR), ringFile()));
-	return ringFilename;
-}
-
-void
-QtGUIMainWindow::initSkin (void) {
-	// Load file configuration skin
-	QString skinfilename(Skin::getPath(QString(SKINDIR), setPathSkin(),
-				QString(FILE_INI)));
-	
-	if (!apply) {
-		this->pt = new Point(skinfilename.ascii());	
-	} else {
-		// If click on apply button
-		delete pt;
-		deleteButtons();
-		this->pt = new Point(skinfilename.ascii());	
-	}
-	// Initialisation of the buttons
-	this->initSpkrVolumePosition();
-	this->initMicVolumePosition();
-	this->initButtons();
-	// Connections of the buttons
-	this->connections();
-	
-	// Load background image phone
-	setbgPixmap (new QPixmap (Skin::getPath(QString(SKINDIR), 
-											setPathSkin(),
-											QString(PIXMAP_PHONE))));
-	// Transform pixmap to QImage
-	setSourceImage ();
-	this->setMaximumSize (getSourceImage().width(), getSourceImage().height());
-	this->setGeometry (MAIN_INITIAL_POSITION, 
-					   MAIN_INITIAL_POSITION, 
-					   getSourceImage().width(),
-					   getSourceImage().height());
-	// Calculate just one time the transparency mask bit to bit
-	transparencyMask ();
-
-	// Line pixmaps initialisation
-	for (int i = 0; i < NUMBER_OF_LINES; i++) {
-		for (int j = 0; j < NUMBER_OF_STATES; j++) {
-	 		TabLinePixmap[i][j] = QPixmap(Skin::getPath(QString(SKINDIR),
-												setPathSkin(), 
-												QString(PIXMAP_LINE(i, j))));
-	 	}
-	}
-	// Message pixmaps initialisation
-	TabMsgPixmap[0] = QPixmap(Skin::getPath(QString(SKINDIR), setPathSkin(), 
-						PIXMAP_MESSAGE_OFF));
-	TabMsgPixmap[1] = QPixmap(Skin::getPath(QString(SKINDIR), setPathSkin(), 
-						PIXMAP_MESSAGE_ON));
-}
-
-void
-QtGUIMainWindow::initSpkrVolumePosition (void) {
-	if (pt->getDirection(VOL_SPKR) == VERTICAL) {
-		vol_spkr_x = Config::get("Audio", "Volume.speakers_x", 
-				pt->getX(VOL_SPKR));
-		vol_spkr_y = Config::get("Audio", "Volume.speakers_y",
-				pt->getVariation(VOL_SPKR));
-	} else if (pt->getDirection(VOL_SPKR) == HORIZONTAL) {
-		vol_spkr_x = Config::get("Audio", "Volume.speakers_x",
-				pt->getX(VOL_SPKR) + pt->getVariation(VOL_SPKR));
-		vol_spkr_y = Config::get("Audio", "Volume.speakers_y", 
-				pt->getY(VOL_SPKR));
-	} 
-}
-
-void
-QtGUIMainWindow::initMicVolumePosition (void) {
-	if (pt->getDirection(VOL_MIC) == VERTICAL) {
-		vol_mic_x = Config::get("Audio", "Volume.micro_x", pt->getX(VOL_MIC));
-		vol_mic_y = Config::get("Audio", "Volume.micro_y",
-				pt->getVariation(VOL_MIC));
-	} else if (pt->getDirection(VOL_MIC) == HORIZONTAL) {
-		vol_mic_x = Config::get("Audio", "Volume.micro_x",
-				pt->getX(VOL_MIC) + pt->getVariation(VOL_MIC));
-		vol_mic_y = Config::get("Audio", "Volume.micro_y", pt->getY(VOL_MIC));
-	} 
-}
-
-/**
- * Inits all phonekey buttons.
- * Create new QPushButtons, set up tool tip, disable focus, set button geometry
- * set palette.
- */
-void
-QtGUIMainWindow::initButtons (void) {
-	// Buttons initialisation
-	phoneKey_msg= new JPushButton(this, NULL, VOICEMAIL);
-	phoneKey_transf = new JPushButton(this, NULL, TRANSFER);
-	phoneKey_conf = new JPushButton(this, NULL, CONFERENCE);
-	reduce_button = new JPushButton(this, NULL, MINIMIZE);
-	quit_button = new JPushButton(this, NULL, CLOSE);
-	addr_book_button = new JPushButton(this, NULL, DIRECTORY);
-	configuration_button = new JPushButton(this, NULL, SETUP);
-	hangup_button = new JPushButton(this, NULL, HANGUP);
-	dial_button = new JPushButton(this, NULL, CONNECT);
-	mute_button = new JPushButton(this, NULL, MUTE);
-	dtmf_button = new JPushButton(this, NULL, DTMF_SHOW);
-
-	// Set tooltip buttons
-	QToolTip::add(reduce_button, tr("Minimize window"));
-	QToolTip::add(quit_button, tr("Close window (Ctrl+Q)"));
-	QToolTip::add(phoneKey_msg, tr("Get your message"));
-	QToolTip::add(phoneKey_transf, tr("Call transfer"));
-	QToolTip::add(phoneKey_conf, tr("Conference"));
-	QToolTip::add(addr_book_button, tr("Address book"));
-	QToolTip::add(configuration_button, tr("Configuration tools (Ctrl+C)"));
-	QToolTip::add(hangup_button, tr("Hangup"));
-	QToolTip::add(dial_button, tr("Dial"));
-	QToolTip::add(mute_button, tr("Mute"));
-	QToolTip::add(dtmf_button, tr("Show DTMF keypad (Ctrl+D)"));
-
-	// Buttons position
-	phoneKey_msg->move (pt->getX(VOICEMAIL), pt->getY(VOICEMAIL));
-	phoneKey_transf->move (pt->getX(TRANSFER), pt->getY(TRANSFER));
-	phoneKey_conf->move (pt->getX(CONFERENCE), pt->getY(CONFERENCE));
-	reduce_button->move (pt->getX(MINIMIZE), pt->getY(MINIMIZE));
-	addr_book_button->move (pt->getX(DIRECTORY), pt->getY(DIRECTORY));
-	quit_button->move (pt->getX(CLOSE), pt->getY(CLOSE));
-	configuration_button->move (pt->getX(SETUP), pt->getY(SETUP));
-	hangup_button->move (pt->getX(HANGUP), pt->getY(HANGUP));
-	dial_button->move (pt->getX(CONNECT), pt->getY(CONNECT));
-	mute_button->move (pt->getX(MUTE), pt->getY(MUTE));
-	dtmf_button->move (pt->getX(DTMF_SHOW), pt->getY(DTMF_SHOW));
-	
-	// Loop for line buttons
-	// Initialisation, set no focus, set geometry, set palette, pixmap
-	for (int j = 0; j < NUMBER_OF_LINES; j++) {
-		QString lnum;
-
-		lnum = "l" + lnum.setNum (j + 1);
-		callmanager->phLines[j]->setButton(new JPushButton(
-					this, NULL, lnum.ascii()));
-		callmanager->phLines[j]->button()->move (pt->getX(lnum),pt->getY(lnum));
-	}
-
-	// Set pixmaps volume 
-	micVolVector = new Vector(this, VOL_MIC, pt);
-	spkrVolVector = new Vector(this, VOL_SPKR, pt);
-
-	vol_mic = new VolumeControl(this, NULL, VOLUME, micVolVector);
-	vol_spkr = new VolumeControl(this, NULL, VOLUME, spkrVolVector);
-	vol_mic->move(vol_mic_x, vol_mic_y);
-	vol_spkr->move(vol_spkr_x, vol_spkr_y);
-}
-
-void
-QtGUIMainWindow::connections (void) {
-	// Connect for clicked numeric keypad button 
-	connect ((QObject*)keypad->key0, SIGNAL(clicked()), this, 
-			SLOT(pressedKey0()));
-	connect ((QObject*)keypad->key1, SIGNAL(clicked()), this, 
-			SLOT(pressedKey1()));
-	connect ((QObject*)keypad->key2, SIGNAL(clicked()), this, 
-			SLOT(pressedKey2()));
-	connect ((QObject*)keypad->key3, SIGNAL(clicked()), this, 
-			SLOT(pressedKey3()));
-	connect ((QObject*)keypad->key4, SIGNAL(clicked()), this, 
-			SLOT(pressedKey4()));
-	connect ((QObject*)keypad->key5, SIGNAL(clicked()), this, 
-			SLOT(pressedKey5()));
-	connect ((QObject*)keypad->key6, SIGNAL(clicked()), this, 
-			SLOT(pressedKey6()));
-	connect ((QObject*)keypad->key7, SIGNAL(clicked()), this, 
-			SLOT(pressedKey7()));
-	connect ((QObject*)keypad->key8, SIGNAL(clicked()), this, 
-			SLOT(pressedKey8()));
-	connect ((QObject*)keypad->key9, SIGNAL(clicked()), this, 
-			SLOT(pressedKey9()));
-	connect ((QObject*)keypad->keyStar, SIGNAL(clicked()), this, 
-			SLOT(pressedKeyStar()));
-	connect ((QObject*)keypad->keyHash, SIGNAL(clicked()), this, 
-			SLOT(pressedKeyHash()));
-	connect ((QObject*)keypad->keyClose, SIGNAL(clicked()), this, 
-			SLOT(dtmfKeypad()));
-
-	// Connections for the lines 
-	connect (callmanager->phLines[0]->button(), SIGNAL(clicked()), this, 
-			SLOT(button_line0()));
-	connect (callmanager->phLines[1]->button(), SIGNAL(clicked()), this, 
-			SLOT(button_line1()));
-	connect (callmanager->phLines[2]->button(), SIGNAL(clicked()), this, 
-			SLOT(button_line2()));
-	connect (callmanager->phLines[3]->button(), SIGNAL(clicked()), this, 
-			SLOT(button_line3()));
-	connect (callmanager->phLines[4]->button(), SIGNAL(clicked()), this, 
-			SLOT(button_line4()));
-	connect (callmanager->phLines[5]->button(), SIGNAL(clicked()), this, 
-			SLOT(button_line5()));
-
-	// Misc 
-	connect (phoneKey_msg, SIGNAL(clicked()), this, SLOT(button_msg()));
-	connect (phoneKey_transf, SIGNAL(clicked()), this, SLOT(button_transfer()));
-	connect (phoneKey_conf, SIGNAL(clicked()), this, SLOT(button_conf()));
-	connect (dial_button, SIGNAL(clicked()), this, SLOT(dial()));
-	connect (mute_button, SIGNAL(clicked()), this, SLOT(button_mute()));
-	connect (hangup_button, SIGNAL(clicked()), this, SLOT(hangupLine()));
-	connect (configuration_button,SIGNAL(clicked()),this,SLOT(configuration()));
-	connect (addr_book_button, SIGNAL(clicked()), this,SLOT(addressBook()));
-	connect (dtmf_button, SIGNAL(clicked()), this, SLOT(dtmfKeypad()));
-
-	// Connect to reduce
-	connect (reduce_button, SIGNAL(clicked()), this, SLOT(reduceHandle()));
-	// Connect to quit with keyboard
-	connect (this, SIGNAL(keyPressed(int)), this, SLOT(quitApplication()));
-   	// Connect to quit with quit button
-	connect (quit_button, SIGNAL(clicked()), this, SLOT(quitApplication()));
-
-	// Connections for volume control
-	connect(vol_spkr, SIGNAL(setVolumeValue(int)), this, 
-			SLOT(volumeSpkrChanged(int)));
-	connect(vol_mic, SIGNAL(setVolumeValue(int)), this, 
-			SLOT(volumeMicChanged(int)));
-}
-
-/**
- * Returns true if the keyboard mapping returns letters. 
- *
- * @return	bool
- */
-bool
-QtGUIMainWindow::isInTextMode (void) {
-	if (modeType == TEXT_MODE) {
-		return true;
-	} else {
-		return false;
-	}
-}
-
-/**
- * Returns true if the keyboard mapping returns digits. 
- *
- * @return	bool
- */
-bool
-QtGUIMainWindow::isInNumMode (void) {
-	if (modeType == NUM_MODE) {
-		return true;
-	} else {
-		return false;
-	}
-}
-
-/**
- * Sets up the keyboard mapping mode.
- */
-void
-QtGUIMainWindow::setMode (int mode) {
-	this->modeType = mode;
-}
-
-/**
- * Search the busy line number among all lines and different of current line
- * number.
- *
- * @return	number of busy line
- */
-int
-QtGUIMainWindow::numLineBusy(void) {
-	int temp = -1;
-	for (int i = 0; i < NUMBER_OF_LINES; i++) {
-		if (callmanager->phLines[i]->isBusy() && i != currentLineNumber) {
-			temp = i;	
-		} 
-	}
-	return temp;
-}
-
-void
-QtGUIMainWindow::dialTone (bool var) {
-	if (callmanager->error->getError() == 0) {
-		if (this->b_dialtone != var) {
-			this->b_dialtone = var;
-		}
-		callmanager->tonezone = var;
-		callmanager->tone->toneHandle(ZT_TONE_DIALTONE); 
-	} else {
-		callmanager->error->errorName(DEVICE_NOT_OPEN, NULL);
-	}
-}
-///////////////////////////////////////////////////////////////////////////////
-// Public Methods implementations                                            //
-///////////////////////////////////////////////////////////////////////////////
-
-/**
- * Initializes LCD display, and move it at the configuration file position.
- */
-void
-QtGUIMainWindow::setMainLCD (void) {
-	// Screen initialisation
-	this->lcd->move (pt->getX(SCREEN), pt->getY(SCREEN));
-}
-
-void
-QtGUIMainWindow::setCurrentLineNumber(int newcur) {
-	this->currentLineNumber = newcur;
-}
-
-/**
- * Sets the corresponding pixmap button according to its state.
- * Handle operations between lines (on hold, off hold) and dial tone 
- * 
- * @param	num_line: number of the current line
- */
-void
-QtGUIMainWindow::toggleLine (int num_line) {
-	if ( num_line == -1 ){
-		qDebug("Should not arrived !!!!!!!%d\n", num_line);
-		return ;
-	}
-	//Current line number
-	currentLineNumber = num_line;
-	// Change state when click on line button
-	callmanager->phLines[currentLineNumber]->toggleState();
-	// If another line is busy
-	busyNum = numLineBusy();
-
-	if (callmanager->isNotUsedLine(currentLineNumber) and busyNum == -1) {
-		qDebug("GUI: FIRST LINE IN USED %d", currentLineNumber);
-		lcd->setStatus(ENTER_NUMBER_STATUS);
-		chosenLine = currentLineNumber;
-		if (!noChoose) {
-			choose = true; 
-			if (!callmanager->phLines[currentLineNumber]->getbDial()) {
-				this->dialTone(true);
-			}
-		}
-		callmanager->phLines[currentLineNumber]->setStateLine(BUSY);
-	} 
-
-	// Occurs when newly off-hook line replaces another one.
-	if (busyNum != currentLineNumber && busyNum != -1) {
-		if (callmanager->isNotUsedLine(currentLineNumber)) {
-			qDebug("GUI: Line %d replaces another one", currentLineNumber);
-			lcd->clear(QString(ENTER_NUMBER_STATUS));
-			chosenLine = currentLineNumber;
-			lcd->inFunction = false;
-			if (!noChoose) {
-				choose = true;
-			}	
-		}
-		// Change state to ONHOLD
-		callmanager->phLines[busyNum]->setState(ONHOLD);
-		callmanager->phLines[busyNum]->setStateLine(ONHOLD);
-		callmanager->actionHandle (busyNum, ONHOLD_CALL);
-		if (!callmanager->phLines[currentLineNumber]->getbDial()) {
-		// If ok-button not clicked before 
-			if (callmanager->sip->call[busyNum] == NULL and
-				!callmanager->tryingState(busyNum)) {
-				setInactiveLine(busyNum);
-			}
-			callmanager->phLines[busyNum]->setbDial(false);
-
-			if (!callmanager->phLines[currentLineNumber]->getbRinging()
-				and callmanager->sip->call[currentLineNumber] == NULL and
-				!callmanager->tryingState(currentLineNumber)) {
-			// If no occured incoming call (not ringing and call[current]=null)
-				this->dialTone(true);			
-			}
-		}
-		callmanager->phLines[currentLineNumber]->setState(BUSY);
-		qDebug("GUI: state ON-HOLD line busyNum %d", busyNum);
-	}
-
-	if (callmanager->phLines[currentLineNumber]->isBusy()) {
-		qDebug("GUI: isBusy line %d", currentLineNumber);
-		
-		// Change line button pixmap to "line in use" state.
-		callmanager->phLines[currentLineNumber]->button()->setPixmap(
-				TabLinePixmap[currentLineNumber][BUSY]);
-		callmanager->phLines[currentLineNumber]->setState(BUSY);
-					
-		// Answer new call
-		if ((callmanager->isRingingLine(currentLineNumber) || 
-			(callmanager->isUsedLine(currentLineNumber) and 
-			callmanager->phLines[currentLineNumber]->getbRinging())) and 
-			callmanager->phLines[currentLineNumber]->getStateLine() != ONHOLD){
-
-			qDebug("GUI: -- New answered call %d --", currentLineNumber);
-			callmanager->actionHandle (currentLineNumber, ANSWER_CALL);
-			callmanager->phLines[currentLineNumber]->setState(BUSY);
-			callmanager->phLines[currentLineNumber]->setStateLine(BUSY);
-
-			lcd->clearBuffer();
-			lcd->appendText(callmanager->phLines[currentLineNumber]->text);
-		} 
-		else if (callmanager->phLines[currentLineNumber]->getStateLine() 
-																== ONHOLD
-				or callmanager->tryingState(currentLineNumber)) {
-			qDebug("GUI: state OFF-HOLD line %d", currentLineNumber);
-			lcd->clear(QString(CONNECTED_STATUS));
-			if (callmanager->sip->call[currentLineNumber] != NULL) {
-				if (!callmanager->phLines[currentLineNumber]->getbInProgress()){
-				// Timer-call function
-					lcd->inFunction = true;
-			   	} else {
-				// Time function
-					lcd->inFunction = false;
-			   	}
-			}
-			callmanager->phLines[currentLineNumber]->setStateLine(OFFHOLD);
-			callmanager->actionHandle (currentLineNumber, OFFHOLD_CALL);
-			lcd->appendText(callmanager->phLines[currentLineNumber]->text);
-			lcd->setStatus(callmanager->phLines[currentLineNumber]->status);
-		}
-	} 
-	else if (callmanager->phLines[currentLineNumber]->isOnHold()){
-		// Change state to ONHOLD
-		callmanager->phLines[currentLineNumber]->setState(ONHOLD);
-		callmanager->phLines[currentLineNumber]->setStateLine(ONHOLD);
-		qDebug("GUI: state ON-HOLD line %d", currentLineNumber);
-		lcd->setStatus(ONHOLD_STATUS);
-		callmanager->actionHandle (currentLineNumber, ONHOLD_CALL);
-		
-		if (callmanager->sip->call[currentLineNumber] == NULL and
-				!callmanager->phLines[currentLineNumber]->getbDial()) {
-			setInactiveLine(currentLineNumber);
-			lcd->clear(QString(ENTER_NUMBER_STATUS));
-		}
-	}
-}
-
-/**
- * Actions occur when click on hang off button. 
- * Use to validate incoming and outgoing call, transfer call.
- */
-void
-QtGUIMainWindow::dial (void) {
-	int i = 0;
-	
-	if (transfer and callmanager->sip->call[currentLineNumber] != NULL
-			and currentLineNumber != -1) {
-		// If transfer button clicked, validate the number for transfer.
-		callmanager->actionHandle (currentLineNumber, TRANSFER_CALL);
-		transfer = false;
-	} else {
-		qDebug("GUI: LINE CURRENT %d", currentLineNumber);
-		 
-		 if (callmanager->ringing()) {
-		// If new incoming call
-			currentLineNumber = callmanager->newCallLineNumber();
-			toggleLine (currentLineNumber);
-			// Set used-state pixmap 'currentLineNumber' line
-			callmanager->phLines[currentLineNumber]->button()->setPixmap(
-						TabLinePixmap[currentLineNumber][BUSY]);
-			callmanager->phLines[currentLineNumber]->setState(BUSY);
-		} else if (callmanager->phLines[currentLineNumber]->isOnHold() or
-			callmanager->phLines[currentLineNumber]->getStateLine() == OFFHOLD
-			or (callmanager->phLines[currentLineNumber]->isBusy() and
-				callmanager->sip->call[currentLineNumber] != NULL)){
-			// If line is used
-			// NOTHING
-		} else {
-			// If new outgoing call
-			
-			if (callmanager->bufferTextRender() != "") {
-			// If a phone number is entered
-				
-				// To make outgoing call
-				i = callmanager->outgoingNewCall();
-				
-				if (i == 0) {
-					// If outgoing call succeeded
-					if (!choose) {
-						// If find not used line
-						noChoose = true;
-						currentLineNumber=callmanager->findLineNumberNotUsed();
-					} else {
-						// If choose line
-						currentLineNumber = chosenLine;
-					}
-					
-					// Store the phone number 
-					callmanager->phLines[currentLineNumber]->text = 
-									callmanager->bufferTextRender();
-
-					// Dial button is clicked
-					callmanager->phLines[currentLineNumber]->setbDial(true);
-					// Main function
-					toggleLine (currentLineNumber);
-					// Call in progress
-					callmanager->phLines[currentLineNumber]->setbInProgress(true);
-					// Set used-state pixmap 'currentLineNumber' line
-					callmanager->phLines[currentLineNumber]->button()->setPixmap(
-							TabLinePixmap[currentLineNumber][BUSY]);
-					callmanager->phLines[currentLineNumber]->setState(BUSY);
-				}
-			}
-		}	
-	}
-}
-
-/**
- * Hangup the current call.
- */
-void
-QtGUIMainWindow::hangupLine (void) {  
-	qDebug("HANGUP: line %d", currentLineNumber);
-	int line = callmanager->sip->notUsedLine;
-	
-	if (line != -1 and callmanager->phLines[line]->getbRinging()) {
-	// If the IP-phone user want to refuse an incoming call
-		int tmp = currentLineNumber;	// store currentLineNumber
-		callmanager->actionHandle (line, REFUSE_CALL);
-		setCurrentLineNumber(tmp); 		// set currentLineNumber
-		if (currentLineNumber != -1) {
-		// If there is current call, put on-hold this call
-			callmanager->phLines[currentLineNumber]->setState(ONHOLD);
-			callmanager->phLines[currentLineNumber]->setStateLine(ONHOLD);
-			callmanager->actionHandle (currentLineNumber, ONHOLD_CALL);
-		}
-	}
-	else if (currentLineNumber != -1 and 
-			!(callmanager->phLines[currentLineNumber]->isOnHold()) and
-			!callmanager->tryingState(currentLineNumber)) {
-	// If there is current line opened and state line not onHold
-		// set free pixmap
-		setFreeStateLine (currentLineNumber);
-		callmanager->phLines[currentLineNumber]->setbDial(false);
-
-		if (callmanager->phLines[currentLineNumber]->getbInProgress()) {
-			// If call is progressing, cancel the call
-			lcd->clear(QString(HUNGUP_STATUS));
-			callmanager->actionHandle (currentLineNumber, CANCEL_CALL);
-		} else if (b_dialtone 
-				and callmanager->sip->call[currentLineNumber] == NULL){
-			// If stop dialtone
-			this->dialTone(false);
-			lcd->clear(QString(ENTER_NUMBER_STATUS));
-		} else if (callmanager->getbCongestion()){		
-			// If stop congestion tone
-			callmanager->congestion(false);
-			lcd->clear(QString(ENTER_NUMBER_STATUS));
-		} else {
-			// Hang up the call
-			callmanager->actionHandle (currentLineNumber, CLOSE_CALL);
-			callmanager->phLines[currentLineNumber]->setbDial(false);
-			lcd->clear(QString(HUNGUP_STATUS));
-		}
-		// Make free hung current line
-		setCurrentLineNumber(-1);
-		choose = false;
-		noChoose = false;
-	}
-	
-	// Just to test when  receive a message
-#if 0
-	msgVar = true;
-#endif
-}
-
-void
-QtGUIMainWindow::setInactiveLine (int num) {
-	// set free pixmap
-	setFreeStateLine (num);
-	// Stop dial tone
-	this->dialTone(false);
-	callmanager->phLines[num]->setbDial(false);
-}
-
-/**
- * Stop the blinking message slot and load the message-off button pixmap.
- */
-void
-QtGUIMainWindow::stopTimerMessage (void) {
-	msgVar = false;	
-	phoneKey_msg->setPixmap(TabMsgPixmap[FREE]);
-}
-
-/**
- * Set pixamp of free state.
- */
-void
-QtGUIMainWindow::setFreeStateLine (int line) {
-	// Set free-status for current line
-	callmanager->phLines[line]->setState (FREE);
-	callmanager->phLines[line]->setStateLine (FREE);
-	// Set free-pixmap
-	callmanager->phLines[line]->button()->setPixmap(TabLinePixmap[line][FREE]);
-}
-
-/**
- * Stop the call timer.
- * 
- * @param	line: number of line 
- */
-void
-QtGUIMainWindow::stopCallTimer (int line) {
-	// Stop the call timer when hang up
-	if (callmanager->phLines[line]->timer != NULL) {
-		callmanager->phLines[line]->stopTimer();
-	}
-	// No display call timer, display current hour
-	lcd->inFunction = false;
-	callmanager->phLines[line]->first = true;
-}
-
-/**
- * Start the call timer.
- * 
- * @param	line: number of line 
- */
-void
-QtGUIMainWindow::startCallTimer (int line) {
-	// Call-timer enable
-	lcd->inFunction = true;
-	
-	// To start the timer for display text just one time
-	if (callmanager->phLines[line]->first) {
-		callmanager->phLines[line]->startTimer();
-		callmanager->phLines[line]->first = false;
-	}
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Public slot implementations                                               //
-///////////////////////////////////////////////////////////////////////////////
-void
-QtGUIMainWindow::volumeSpkrChanged (int val) {
-	callmanager->spkrSoundVolume (val);
-}
-
-void
-QtGUIMainWindow::volumeMicChanged (int val) {
-	callmanager->micSoundVolume (val);
-}
-
-void
-QtGUIMainWindow::registerSlot (void) {
-	callmanager->sip->setRegister();
-}
-
-/**
- * Slot to blink with free and busy pixmaps when line is hold.
- */
-void
-QtGUIMainWindow::blinkLineSlot (void) {
-	static bool isOn = false;
-	int state = BUSY;
-	
-	if	(!isOn) {
-		state = FREE;	
-	}
-
-	for (int i = 0; i < NUMBER_OF_LINES; i++) {
-		// If lines are hold on, set blinking pixmap
-		if (callmanager->phLines[i]->isOnHold()) {
-			callmanager->phLines[i]->button()->setPixmap(TabLinePixmap[i][state]);
-		}
-	}
-	isOn = !isOn;
-}
-
-// Dial the voicemail Number automatically when button is clicked
-void
-QtGUIMainWindow::button_msg (void) {
-	 stopTimerMessage();
-	 lcd->clear("Voicemail");
-	 lcd->appendText(Config::getchar("Preferences","Options.voicemailNumber",""));
-	 dial();
-}
-
-// Allow to enter a phone number to transfer the current call.
-// This number is validated by ok-button or typing Enter
-void
-QtGUIMainWindow::button_transfer (void) {
-	if (currentLineNumber != -1) {
-		transfer = true;
-		callmanager->actionHandle (currentLineNumber, ONHOLD_CALL);
-		lcd->clear(QString(TRANSFER_STATUS));
-	}
-}
-
-void
-QtGUIMainWindow::button_conf (void) {
-//TODO: This feature is not implemented yet
-	QMessageBox::information(this, "Conference",
-		"This feature is not implemented yet", QMessageBox::Yes);
-}
-
-void
-QtGUIMainWindow::button_line0 (void) {
- 	toggleLine (0);
-	 
-}
-
-void
-QtGUIMainWindow::button_line1 (void) {
-	toggleLine (1);
-}
-
-void
-QtGUIMainWindow::button_line2 (void) {
-	toggleLine (2);
-}
-
-void
-QtGUIMainWindow::button_line3 (void) {
-	toggleLine (3);
-}
-
-void
-QtGUIMainWindow::button_line4 (void) {
-	toggleLine (4);
-}
-
-void
-QtGUIMainWindow::button_line5 (void) {
-	toggleLine (5);
-}
-
-void
-QtGUIMainWindow::button_mute(void) {
-	// Disable micro sound 
-	static bool isOn = true;
-	
-	if (callmanager->sip->getNumberPendingCalls() != 0) {
-	// If there is at least a pending call
-		if(!isOn) {
-			callmanager->mute = false;	
-			lcd->clear("Mute off");
-		} else { 
-			callmanager->mute = true;	
-			lcd->clear("Mute on");		
-		}
-		
-		isOn = !isOn;
-	}
-}
-
-// Show the setup panel
-void
-QtGUIMainWindow::configuration (void) {
-	 panel->show();
-}
-
-void
-QtGUIMainWindow::addressBook (void) {
-//	TODO: phonebook->show();
-	QMessageBox::information(this, "Directory",
-		"This feature is not implemented yet", QMessageBox::Yes);
-}
-
-// Handle the dtmf-button click
-void
-QtGUIMainWindow::dtmfKeypad (void) {
-	if (keypad->isVisible()) {
-		// Hide keypad if it's visible.
-		keypad->hide();
-	} else {
-		
-		if (this->first and !getMoved()) {
-			// If it's the first time that keypad is shown.
-			// The position is fixed with the main initial position.
-			this->first = false;
-			keypad->setGeometry (MAIN_INITIAL_POSITION + 
-									this->getSourceImage().width(), 
-							 	MAIN_INITIAL_POSITION, 
-							 	keypad->getSourceImage().width(),
-							 	keypad->getSourceImage().height());
-		} else {
-			// If main window is moved, we calculate the keypad new position 
-			// to fix it with main window
-			if (getMoved()) {
-				keypad->setGeometry (positionOffsetX(), 
-							 	getGlobalMouseY() - getMouseY(), 
-							 	keypad->getSourceImage().width(),
-							 	keypad->getSourceImage().height());
-			}
-			if (keypad->getMoved()) {
-				// If keypad is moved, it shows at the previous position
-				keypad->setGeometry (
-								keypad->getGlobalMouseX()-keypad->getMouseX(), 
-							 	keypad->getGlobalMouseY()-keypad->getMouseY(), 
-							 	keypad->getSourceImage().width(),
-							 	keypad->getSourceImage().height());
-			}
-		}
-
-		// Show keypad if it's hidden.		
-	 	keypad->show();
-	}
-}
-
-// Get x-position offset, related to the screen size, to show numeric keypad
-int
-QtGUIMainWindow::positionOffsetX (void) {
-	QRect screenRect;
-	int offset;
-
-	// Get the screen geometry
-	screenRect = (QApplication::desktop())->screenGeometry (0);
-	
-	offset = this->getSourceImage().width() - getMouseX() + getGlobalMouseX();
-	if (offset + keypad->getSourceImage().width() > screenRect.right()) {
-		return getGlobalMouseX() - (
-								getMouseX() + keypad->getSourceImage().width());
-	} else {
-		return offset;
-	}
-}
-
-/**
- * Slot when receive a message, blink pixmap.
- */
-void
-QtGUIMainWindow::blinkMessageSlot (void) {
-	static bool isOn = false;
-	int stateMsg = BUSY;
-	
-	if(!isOn) {
-		stateMsg = FREE;
-	}
-	
-	if (msgVar) {
-		phoneKey_msg->setPixmap(TabMsgPixmap[stateMsg]);
-	}
-	isOn = !isOn;
-}
-
-
-/**
- * Slot when phone is ringing, blink pixmap.
- */
-void
-QtGUIMainWindow::blinkRingSlot (void) {
-	static bool isOn = false;
-	int state = BUSY;
-	int line = callmanager->sip->notUsedLine;
-	if ( line == -1 ) 
-		return;
-
-	// If more than one line is ringing
-	for (int i = 0; i < NUMBER_OF_LINES; i++) {
-		if (callmanager->isUsedLine(i) 
-			and callmanager->phLines[i]->getbRinging()) {
-			if	(!isOn) 
-				state = FREE;	
-			callmanager->phLines[i]->button()->setPixmap(
-				TabLinePixmap[i][state]);		
-		}
-	}
-	
-	//If new line is ringing
-	if (callmanager->phLines[line]->getbRinging()) {
-		// For the line
-		if	(!isOn) {
-			state = FREE;	
-		}
-
-		callmanager->phLines[line]->button()->setPixmap(
-				TabLinePixmap[line][state]);
-		isOn = !isOn;
-	}
-}
-
-
-/**
- * Slot to quit application with or without QMessageBox confirmation
- */
-void
-QtGUIMainWindow::quitApplication (void) {
-	bool confirm;
-
-	// Save volume positions
-	// TODO: save position if direction is horizontal
-	Config::set("Audio", "Volume.speakers_x",  pt->getX(VOL_SPKR));
-	if (vol_spkr->getValue() != 0) { 
-		Config::set("Audio", "Volume.speakers_y",  pt->getY(VOL_SPKR) - 
-			vol_spkr->getValue());
-	}
-	Config::set("Audio", "Volume.micro_x",  pt->getX(VOL_MIC)); 
-	if (vol_mic->getValue() != 0) {
-		Config::set("Audio", "Volume.micro_y",  pt->getY(VOL_MIC) - 
-			vol_mic->getValue());
-	}
-	// Save current position of the controls volume
-	save();
-		
-	// Show QMessageBox
-	confirm = Config::get("Preferences", "Options.confirmQuit", (int)true);
-	if (confirm) {
-		if (QMessageBox::question(this, "Confirm quit",
-			"Are you sure you want to quit SFLPhone ?",
-			 QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) {
-				QApplication::exit(0);
-				callmanager->quitLibrary();
-		}
-	} 
-	// No QMessageBox
-	else {
-		QApplication::exit(0);
-		callmanager->quitLibrary();
-		qDebug("QUIT");
-	}
-}
-
-/**
- * Slot to strip urlinput.
- */
-void
-QtGUIMainWindow::stripSlot (void) {
-	QRegExp rx(REG_EXPR);
-	lcd->appendText(urlinput->url->text().remove(rx));
-	urlinput->close();
-}
-
-/**
- * Slot when numeric keypad phonekey is pressed, append the key text and setup 
- * the DTMF keypad .
- *
- * @param	button group id 
- */ 
-void
-QtGUIMainWindow::pressedKeySlot (int id) {
-	char code = 0;
-	int pulselen = 0;
-	int a = 0;
-
-	// Stop dial tone
- 	if (b_dialtone) {
-		this->dialTone(false);
-	}
-
-	switch (id) {
-		case KEYPAD_ID_0:		code = '0'; break;
-		case KEYPAD_ID_1:		code = '1'; break;
-		case KEYPAD_ID_2:		code = '2'; break;
-		case KEYPAD_ID_3:		code = '3'; break;
-		case KEYPAD_ID_4:		code = '4'; break;
-		case KEYPAD_ID_5:		code = '5'; break;
-		case KEYPAD_ID_6:		code = '6'; break;
-		case KEYPAD_ID_7:		code = '7'; break;
-		case KEYPAD_ID_8:		code = '8'; break;
-		case KEYPAD_ID_9:		code = '9'; break;
-		case KEYPAD_ID_STAR:	code = '*'; break;
-		case KEYPAD_ID_HASH:	code = '#'; break;
-	}
-	
-	onLine = currentLineNumber;
-	if (onLine != -1) {
-		callmanager->dtmf(onLine, code);
-	} 
-
-	// Handle dtmf
-	key->startTone(code);
-	key->generateDTMF(buf, SAMPLING_RATE);
-	callmanager->audiodriver->audio_buf.resize(SAMPLING_RATE);
-	callmanager->audiodriver->audio_buf.setData(
-										buf, callmanager->getSpkrVolume());
-
-	pulselen = Config::get("Signalisations", "DTMF.pulseLength", 250);
-	callmanager->audiodriver->audio_buf.resize(pulselen * (OCTETS/1000));
-	a = callmanager->audiodriver->writeBuffer();
-	if (a == 1) {
-		pressedKeySlot(id);
-	} else {
-		if (callmanager->error->getError() == 0) 
-			lcd->appendText (code);		
-		else if (callmanager->error->getError() == 1) {
-			lcd->clearBuffer();
-			callmanager->error->setError(0);
-			lcd->appendText (code);
-		}
-	}
-}
-
-// Save settings in config-file
-void 
-QtGUIMainWindow::save() {
-	Config::tree()->saveToFile(callmanager->path.data());
-}
-
-void
-QtGUIMainWindow::applySkin (void) {
-	apply = true;
-	// For skin of the screen
-	lcd->initGraphics();
-	setMainLCD();
-	// For skin of the gui
-	initSkin();
-}
-
-
-// Handle operation to minimize the application
-void 
-QtGUIMainWindow::reduceHandle (void) {
-	if (Config::getb("Preferences", "Options.checkedTray")) {
-		clickHandle();
-	} else {
-		showMinimized();
-	}
-}
-
-// Handle mouse left-button click to minimize/maximize the application
-void
-QtGUIMainWindow::clickHandle (void) {
-	if (this->isShown()) {
-		hide();
-	}
-	
-	else if (this->isMinimized()) {
-		showMaximized();
-	}
-	
-	else {
-		show();
-	}
-}
-
-void
-QtGUIMainWindow::pressedKey0 (void) {
-	pressedKeySlot (KEYPAD_ID_0);
-}
-
-void
-QtGUIMainWindow::pressedKey1 (void) {
-	pressedKeySlot (KEYPAD_ID_1);
-}
-
-void
-QtGUIMainWindow::pressedKey2 (void) {
-	pressedKeySlot (KEYPAD_ID_2);
-}
-void
-QtGUIMainWindow::pressedKey3 (void) {
-	pressedKeySlot (KEYPAD_ID_3);
-}
-void
-QtGUIMainWindow::pressedKey4 (void) {
-	pressedKeySlot (KEYPAD_ID_4);
-}
-void
-QtGUIMainWindow::pressedKey5 (void) {
-	pressedKeySlot (KEYPAD_ID_5);
-}
-void
-QtGUIMainWindow::pressedKey6 (void) {
-	pressedKeySlot (KEYPAD_ID_6);
-}
-void
-QtGUIMainWindow::pressedKey7 (void) {
-	pressedKeySlot (KEYPAD_ID_7);
-}
-void
-QtGUIMainWindow::pressedKey8 (void) {
-	pressedKeySlot (KEYPAD_ID_8);
-}
-void
-QtGUIMainWindow::pressedKey9 (void) {
-	pressedKeySlot (KEYPAD_ID_9);
-}
-void
-QtGUIMainWindow::pressedKeyStar  (void) {
-	pressedKeySlot (KEYPAD_ID_STAR);
-}
-void
-QtGUIMainWindow::pressedKeyHash (void) {
-	pressedKeySlot (KEYPAD_ID_HASH);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Protected Methods implementations                                         //
-///////////////////////////////////////////////////////////////////////////////
-/**
- * Reimplementation of keyPressEvent() to handle the keyboard mapping.
- */
-void
-QtGUIMainWindow::keyPressEvent(QKeyEvent *e) {
-	// Misc. key	  
-	switch (e->key()) {
-	case Qt::Key_At:
-	case Qt::Key_Colon:
-	case Qt::Key_Period:
-	case Qt::Key_Comma:
-	case Qt::Key_Plus:
-	case Qt::Key_Minus:
-	case Qt::Key_Slash:
-		lcd->appendText(QChar(e->key()));
-		return;
-	   	break;
-
-	case Qt::Key_Backspace:
-		lcd->backspace();
-		return;
-	   	break;	
-
-	case Qt::Key_Escape:
-		hangupLine();
-		return;
-		break;	
-
-
-	
-	case Qt::Key_Return:
-	case Qt::Key_Enter:
-		dial();
-		return;
-		break;	
-
-	case Qt::Key_F1:
-	case Qt::Key_F2:
-	case Qt::Key_F3:
-	case Qt::Key_F4:
-	case Qt::Key_F5:
-	case Qt::Key_F6:
-		this->toggleLine(e->key() - Qt::Key_F1);
-		return;
-	   	break;
-		
-	case Qt::Key_L:
- 		if (e->state() == Qt::ControlButton ) {		
-			lcd->clear();
-			return;
-		}
-	   	break;
-	case Qt::Key_Q :
- 		if (e->state() == Qt::ControlButton ) {
-			emit keyPressed(e->key());
-			return;			
-		}			
-		break;
-	case Qt::Key_O :
- 		if (e->state() == Qt::ControlButton ) {
-		 	urlinput->show();
-			return;			
-		}			
-		break;
-	case Qt::Key_C :
- 		if (e->state() == Qt::ControlButton ) {
-		 	configuration();
-			return;			
-		}			
-		break;
-	case Qt::Key_D :
- 		if (e->state() == Qt::ControlButton ) {
-		 	dtmfKeypad();
-			return;			
-		}			
-		break;
-	case Qt::Key_Space:
-		if (this->isInNumMode()) {
-			this->setMode(TEXT_MODE);
-		} else {
-			this->setMode(NUM_MODE);
-		}
-		return;
-		break;
-
-	case Qt::Key_Alt:
-	case Qt::Key_CapsLock:
-	case Qt::Key_Shift:
-	case Qt::Key_Tab:
-	case Qt::Key_Control:
-		return;
-		break;
-
-	default:
-		break;
-	 }
-
-	if (QChar(e->key()).isDigit() ) {
-		// Numeric keypad
-		if (e->key() == Qt::Key_0) {
-			pressedKeySlot(KEYPAD_ID_0);
-		} else {
-			pressedKeySlot(e->key() - Qt::Key_0 - 1);
-		}
-	}
-	
-	// Handle * and # too.
-	else if ((e->key() == Qt::Key_Asterisk)
-							or (e->key() == Qt::Key_NumberSign)) {
-		(e->key() == Qt::Key_Asterisk) ? 
-			pressedKeySlot(KEYPAD_ID_STAR)
-			: pressedKeySlot(KEYPAD_ID_HASH);
-	}
-	
-	// If letter keypad and numeric mode, display digit.
-	else if (QChar(e->key()).isLetter() && this->isInNumMode() ) {
-		pressedKeySlot(
-			(NumericKeypadTools::keyToNumber(e->key())- Qt::Key_0) - 1);
-	}
-	
-	// If letter keypad and text mode, display letter.
-	else if (QChar(e->key()).isLetter() && this->isInTextMode()) {
-		lcd->appendText(QChar(e->key()).lower());
-	}  
-}
-
-// EOF
diff --git a/src/qtGUImainwindow.h b/src/qtGUImainwindow.h
deleted file mode 100644
index cef45807df..0000000000
--- a/src/qtGUImainwindow.h
+++ /dev/null
@@ -1,243 +0,0 @@
-/**
- *  Copyright (C) 2004 Savoir-Faire Linux inc.
- *  Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com>
- *                                                                              
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *                                                                              
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef __QT_GUI_MAIN_WINDOW_H__
-#define __QT_GUI_MAIN_WINDOW_H__
-
-#include <qbitmap.h>
-#include <qimage.h>
-#include <qdragobject.h>
-#include <qevent.h>	
-#include <qpixmap.h>
-#include <qpopupmenu.h>
-#include <qpushbutton.h>
-#include <qsettings.h> 
-#include <qthread.h>
-#include <qwidget.h>
-
-#include "configuration.h"
-#include "configurationpanelui.h"
-#include "dtmf.h"
-#include "jpushbutton.h"
-#include "manager.h"
-#include "mydisplay.h"
-#include "numerickeypad.h"
-#include "phonebookui.h"
-#include "point.h"
-#include "skin.h"
-#include "sip.h"
-#include "transqwidget.h"
-#include "trayicon.h"
-#include "url_inputui.h"
-#include "volumecontrol.h"
-
-#define	MAIN_INITIAL_POSITION	20
-#define TEXT_MODE				0
-#define NUM_MODE				1
-
-///////////////////////////////////////////////////////////////////////////////
-// Tray Icon class
-///////////////////////////////////////////////////////////////////////////////
-class MyTrayIcon : public TrayIcon
-{
-	Q_OBJECT
-public:
-	MyTrayIcon(const QPixmap &, const QString &, QPopupMenu *popup = 0, 
-			QObject *parent = 0, const char *name = 0 );
-	~MyTrayIcon(){};
-
-	QPopupMenu *menu;
-
-signals:
-	void	clickedLeft(void);
-protected:	
-	void 	mousePressEvent (QMouseEvent *);
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// GUI main window
-///////////////////////////////////////////////////////////////////////////////
-
-class QtGUIMainWindow : public TransQWidget {
-	Q_OBJECT
-public:
-	// Default Constructor and destructor
-	QtGUIMainWindow	(QWidget* = 0, const char* = 0,WFlags = 0,Manager * = NULL);
-	~QtGUIMainWindow(void);
-
-	// Public member variables
-	NumericKeypad		*keypad;
-	MyDisplay			*lcd;
-	QTimer 				*blinkTimer;
-	PhoneBook		   	*phonebook;
-	URL_Input		   	*urlinput;
-	ConfigurationPanel 	*panel;
-	QSettings 			 settings;
-	Manager				*callmanager;
-		
-	JPushButton			*phoneKey_msg;
-	JPushButton			*phoneKey_transf;
-	JPushButton			*phoneKey_conf;
-	JPushButton			*phoneKey_line0;
-	JPushButton			*phoneKey_line1;
-	JPushButton			*phoneKey_line2;
-	JPushButton			*phoneKey_line3;
-	JPushButton			*reduce_button;
-	JPushButton			*quit_button;
-	JPushButton			*addr_book_button;
-	JPushButton			*configuration_button;
-	JPushButton			*hangup_button;
-	JPushButton			*dial_button;
-	JPushButton			*mute_button;
-	JPushButton			*dtmf_button;
-	VolumeControl		*vol_mic;
-	VolumeControl		*vol_spkr;
-
-	int 				 currentLineNumber;
-	int 				 busyNum;
-	bool				 ringVar;
-	bool 				 msgVar;
-	int			 		 chosenLine;
-	bool		 		 choose;
-	bool				 noChoose;
-	bool		 		 transfer;
-	bool				 callinprogress;
-	
-	QPixmap				 TabLinePixmap[NUMBER_OF_LINES][NUMBER_OF_STATES];
-
-	QPopupMenu 			*mypop;
-	MyTrayIcon 			*trayicon;
-
-	Vector				*micVolVector;
-	Vector				*spkrVolVector;
-	int			vol_mic_x, vol_mic_y;
-	int			vol_spkr_x, vol_spkr_y;
-
-	// Public functions
-	void 	 setMainLCD		 	(void);
-	void 	 toggleLine 	 	(int);
-	void 	 stopTimerMessage 	(void);
-	QString  setPathSkin		(void);
-	QString  ringFile			(void);
-	QString	 getRingFile		(void);
-	inline 
-	void 	 ring				(bool b)	{ this->ringVar = b; }
-	inline 
-	bool 	 ringing			(void) 		{ return this->ringVar; }
-	void	 stopCallTimer 		(int);
-	void	 startCallTimer 	(int);
-	void	 setFreeStateLine 	(int);
-	void	 setCurrentLineNumber(int);
-	void	 dialTone			(bool);
-	void	 setInactiveLine 	(int);
-
-signals:
-	void 	 keyPressed			(int);
-
-public slots:
-	void 	 dial				(void);
-	void 	 blinkRingSlot		(void);
-	void 	 blinkLineSlot		(void);
-	void 	 blinkMessageSlot	(void);
-	void 	 quitApplication	(void);
-	void 	 pressedKeySlot		(int);
-	void 	 stripSlot			(void);
-	void 	 addressBook 		(void);
-	void	 dtmfKeypad			(void);
-	void 	 configuration		(void);
-	void 	 hangupLine			(void);
-	void 	 button_mute		(void);
-	void 	 button_line0		(void);
-	void 	 button_line1		(void);
-	void 	 button_line2		(void);
-	void 	 button_line3		(void);
-	void 	 button_line4		(void);
-	void 	 button_line5		(void);
-	void 	 button_msg			(void);
-	void 	 button_transfer	(void);
-	void 	 button_conf		(void);
-	void 	 clickHandle 		(void);
-	void	 reduceHandle		(void);
-	void	 save				(void);
-	void	 applySkin			(void);
-	
-	void 	 pressedKey0		(void);
-	void 	 pressedKey1		(void);
-	void 	 pressedKey2		(void);
-	void 	 pressedKey3		(void);
-	void 	 pressedKey4		(void);
-	void 	 pressedKey5		(void);
-	void 	 pressedKey6		(void);
-	void 	 pressedKey7		(void);
-	void 	 pressedKey8		(void);
-	void 	 pressedKey9		(void);
-	void 	 pressedKeyStar		(void);
-	void 	 pressedKeyHash		(void);
-
-	void	 volumeSpkrChanged		(int);
-	void	 volumeMicChanged		(int);
-	void	 registerSlot			(void);
-
-protected:
-	// To handle the key pressed event
-	void 		 keyPressEvent 	(QKeyEvent *);
-
-private:
-	// Configuration skin file
-	Point				*pt;
-	
-
-	// To construct ring rect pixmap
-	QImage 		 imageRing;
-	QImage 		 imageNoRing;
-
-	QPixmap		 TabMsgPixmap[NUMBER_OF_STATES];
-	int 		 modeType;
-	DTMF 		*key;
-	short   	*buf;
-	bool		 apply;
-
-	int 		 onLine;
-
-	// For numeric keypad
-	bool first;
-	
-	bool b_dialtone;
-
-	
-	// Private functions
-	void 		 setMode		(int);
-	bool 		 isInTextMode	(void);
-	bool 		 isInNumMode	(void);
-	void		 initSkin		(void);
-	void 		 initButtons 	(void);
-	void 		 initBlinkTimer	(void);
-	void		 initSpkrVolumePosition (void);
-	void		 initMicVolumePosition (void);
-	void		 connections	(void);
-
-	int 		 numLineBusy	(void);
-
-	int			 positionOffsetX		(void);
-	void 		 deleteButtons	(void);
-
-};
-
-
-#endif	// __QT_GUI_MAIN_WIDOW_H__
diff --git a/src/sip.cpp b/src/sip.cpp
deleted file mode 100644
index 87d215385f..0000000000
--- a/src/sip.cpp
+++ /dev/null
@@ -1,1098 +0,0 @@
-/*
- * Copyright (C) 2004 Savoir-Faire Linux inc.
- * Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com> 
- *
- * Portions Copyright (C) 2002,2003   Aymeric Moizard <jack@atosc.org>
- *
- * This is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2,
- * or (at your option) any later version.
- *
- * This is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with dpkg; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <assert.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <time.h>
-
-#include <linux/socket.h>
-
-#include <qlineedit.h>
-#include <qcheckbox.h>
-
-#include "audiocodec.h"
-#include "configuration.h"
-#include "error.h"
-#include "global.h"
-#include "sip.h"
-#include "sipcall.h"
-
-#include <string>
-using namespace std;
-
-// TODO : mettre dans config
-#define DEFAULT_SIP_PORT	5060
-#define RANDOM_SIP_PORT		rand() % 64000 + 1024
-#define	DEFAULT_LOCAL_PORT	10500
-#define	RANDOM_LOCAL_PORT	((rand() % 27250) + 5250)*2
-
-
-///////////////////////////////////////////////////////////////////////////////
-// Thread implementation 
-///////////////////////////////////////////////////////////////////////////////
-EventThread::EventThread (SIP *sip) : Thread () {
-	this->sipthread = sip;
-}
-
-EventThread::~EventThread (void) {
-	this->terminate();
-}
-
-/**
- * Reimplementation of run() to update widget
- */
-void
-EventThread::run (void) {
-	for (;;) {
-		sipthread->getEvent();
-	}
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// SIP implementation
-///////////////////////////////////////////////////////////////////////////////
-
-SIP::SIP (Manager *_manager) {
-	this->callmanager = _manager;
-	this->myIPAddress = NULL;
-	
-	// For EventThread
-	evThread = new EventThread (this);
-
-	// Call init to NULL 
-	for (int i = 0; i < NUMBER_OF_LINES; i++) {
-		assert (i < NUMBER_OF_LINES);
-		this->call[i] = NULL;
-	}
-	notUsedLine = -1;
-}
-
-SIP::~SIP (void) {
-	if (evThread != NULL) {
-		delete evThread;
-		evThread = NULL;
-	}
-	delete[] call;
-	delete myIPAddress;
-}
-
-// Init eXosip and set user agent 
-int
-SIP::initSIP (void) {
-	QString tmp;
-
-	tmp = QString(PROGNAME) + "/" + QString(VERSION);
-
-	// Set IP address
-	if ( getLocalIp() == -1 )
-		return -1;
-	
-	srand (time(NULL));
-	if (eXosip_init (NULL, NULL, DEFAULT_SIP_PORT) != 0) {
-		if (eXosip_init (NULL, NULL, RANDOM_SIP_PORT) != 0) {
-			qDebug("Cannot init eXosip");
-			return -1;
-		}
-	}
-
-	// If use STUN server, firewall address setup
-	if (callmanager->useStun()) {
-		eXosip_set_user_agent(tmp.ascii());
-		StunAddress4 stunSvrAddr;
-		stunSvrAddr.addr = 0;
-		
-		// Stun server
-		string svr = Config::gets("Signalisations", "STUN.STUNserver");
-		qDebug("address server stun = %s", svr.data());
-		
-		// Convert char* to StunAddress4 structure
-		bool ret = stunParseServerName ((char*)svr.data(), stunSvrAddr);
-		if (!ret) {
-			qDebug("SIP: Stun server address not valid");
-		}
-		
-		// Firewall address
-		callmanager->getInfoStun(stunSvrAddr);
-		eXosip_set_firewallip((callmanager->getFirewallAddress()).ascii());
-	} 
-	eXosip_set_user_agent(tmp.ascii());
-
-	evThread->start();
-	return 0;
-}
-
-void
-SIP::quitSIP (void) {
-	eXosip_quit();
-}
-
-bool
-SIP::isInRtpmap (int index, int payload, AudioCodec &codec) {
-	for (int i = 0; i < index; i++) {
-		if (codec.handleCodecs[i] == payload) {
-			return true;
-		}
-	}
-	return false;
-}
-
-void
-SIP::initRtpmapCodec (void) {
-	int payload;
-	char rtpmap[128];
-	char tmp[64];
-
-	bzero(rtpmap, 128);
-	bzero(tmp, 64);
-	
-	AudioCodec codec;
- 	/* reset all payload to fit application capabilities */
-  	eXosip_sdp_negotiation_remove_audio_payloads();
-	
-	// Set rtpmap according to the supported codec order
-	for (int i = 0; i < NB_CODECS; i++) {
-		payload = codec.handleCodecs[i];
-
-		// Add payload to rtpmap if it is not already added
-		if (!isInRtpmap(i, payload, codec)) {
-			snprintf(rtpmap, 127, "%d %s/%d", payload, 
-					codec.rtpmapPayload(payload), SAMPLING_RATE);
-			snprintf(tmp, 63, "%d", payload);
-			
-			eXosip_sdp_negotiation_add_codec( osip_strdup(tmp), NULL,
-					   osip_strdup("RTP/AVP"), NULL, NULL, NULL, NULL,NULL,
-					   osip_strdup(rtpmap));
-		}
-	}
-#if 0    
-  	eXosip_sdp_negotiation_add_codec(osip_strdup("111"),
-				   NULL,
-				   osip_strdup("RTP/AVP"),
-				   NULL, NULL, NULL,
-				   NULL,NULL,
-				   osip_strdup("111 speex/16000"));
-
-  /* Those attributes should be added for speex
-     b=AS:110 20
-     b=AS:111 20
-  */
-#endif
-}
-
-int 
-SIP::getLocalIp (void) {
-	if (myIPAddress == NULL) {
-		myIPAddress = new char[64];
-	}
-	int ret = eXosip_guess_localip (2, myIPAddress, 64);
-	return ret;
-}
-
-//Number of lines used
-int
-SIP::getNumberPendingCalls(void) {
-  	int pos = 0;
-  	int k;
-  
-  	for (k = 0; k < NUMBER_OF_LINES; k++) {
-		assert (k < NUMBER_OF_LINES);
-	    if (call[k] != NULL) {
-	  		pos++;
-		}
-    }
-  	return pos;
-}
-
-// Return the first line number not used
-int
-SIP::findLineNumberNotUsed (void) {
-	int k;
-	
-	for (k = 0; k < NUMBER_OF_LINES; k++) {
-		assert (k < NUMBER_OF_LINES);
-		if (call[k] == NULL) {
-			return k;
-		}
-    }
-
-	// Every line is busy
-	// TODO: ATTENTION AU RETOUR
-	return -1;
-}
-
-// For ringing, answered, proceeding call
-int
-SIP::findLineNumber (eXosip_event_t *e) {
-	int k;
-	
-	// Look for call with same cid/did
-	for (k = 0; k < NUMBER_OF_LINES; k++) {
-		if (call[k] != NULL) {
-			if (call[k]->cid == e->cid and call[k]->did == e->did) {
-				return k;
-			}
-		}
-    }
-
-	// If not found, return free line ?
-	return findLineNumberNotUsed();
-}
-
-// For redirected, request,server,global failure, onhold, offhold call
-int
-SIP::findLineNumberUsed (eXosip_event_t *e) {
-	return findLineNumber (e);
-}
-
-int
-SIP::findLineNumberClosed (eXosip_event_t *e) {
-	for (int k = 0; k < NUMBER_OF_LINES; k++) {
-		if (call[k] != NULL) {
-			if (call[k]->cid == e->cid) {
-				return k;
-			}
-		} 
-    }
-
-	// TODO ATTENTION AU RETOUR
-	return -1;
-}
-  
-// Return call corresponding to pos
-SipCall*
-SIP::findCall (int pos) {
-	for (int k = 0; k < NUMBER_OF_LINES; k++) {
-		if (call[k] != NULL) {
-			if (pos == 0) {
-				return call[k];
-			}
-			pos--;
-		}
-	}
-	return NULL;
-}
-
-int
-SIP::checkURI (const char *buffer) {
-	osip_uri_t *uri;
-	int 		i;
-
-	// To parse a buffer containing a sip URI
-	i = osip_uri_init(&uri);
-	if (i != 0) {
-		qWarning ("Cannot allocate");
-	   	return -1; 
-	}
-	i = osip_uri_parse(uri, buffer);
-	if (i != 0) { 
-		qWarning("Cannot parse uri"); 
-	}
-
-	// Free memory
-	osip_uri_free(uri);	
-	return 0;	
-}
-
-// Parse url
-int
-SIP::checkUrl(char *url) {
-  	int i;
-	
-  	osip_from_t *to;
-  	i = osip_from_init(&to);
-  	if (i != 0) {
-		qWarning ("Cannot initialize");
-		return -1;
-	}
-  	i = osip_from_parse(to, url);
-  	if (i != 0) {
-		qWarning ("Cannot parse url");
-		return -1;
-	}
-
-	// Free memory
-	osip_from_free (to);
-  	return 0;
-}
-
-int
-SIP::setRegister (void) {
-	int reg_id = -1;
-
-	string qproxy = "sip:" + Config::gets("Signalisations", "SIP.sipproxy"); 
-	char * proxy = (char*)qproxy.data();
-
-	string qhostname = "sip:" + Config::gets("Signalisations", "SIP.hostPart"); 
-	char * hostname = (char*)qhostname.data();
-	
-	string qfrom = fromHeader(Config::gets("Signalisations", "SIP.userPart"), 
-							Config::gets("Signalisations", "SIP.hostPart"));
-	char * from = (char*)qfrom.data();
-	
-	qDebug("proxy = %s", proxy);
-	qDebug("from = %s", from);
-
-	if (Config::gets("Signalisations", "SIP.userPart") == "") {
-		callmanager->error->errorName(USER_PART_FIELD_EMPTY, NULL);
-		return -1;
-	} 
-	if (Config::gets("Signalisations", "SIP.hostPart") == "") {
-		callmanager->error->errorName(HOST_PART_FIELD_EMPTY, NULL);
-		return -1;
-	}
-	
-	eXosip_lock();
-	if (setAuthentication() == -1) {
-		eXosip_unlock();
-		return -1;
-	}
-	
-	if (Config::gets("Signalisations", "SIP.sipproxy") != "") {
-		reg_id = eXosip_register_init(from, proxy, NULL);
-	} else {
-		reg_id = eXosip_register_init(from, hostname, NULL);
-	}
-	
-	if (reg_id < 0) {
-		eXosip_unlock();
-		return -1;
-	}	
-	
-	// TODO: port SIP session timer dans config
-	int i = eXosip_register(reg_id, 3600);
-	if (i == -2) {
-		qDebug("cannot build registration, check the setup");
-	}
-	if (i == -1) {
-		qDebug("Registration Failed");
-	}
-	
-	eXosip_unlock();
-	return 0;
-}
-
-int
-SIP::setAuthentication (void) {
-	string login, pass, realm;
-	login = Config::gets("Signalisations", "SIP.username");
-	if (login == "") {
-		login = Config::gets("Signalisations", "SIP.userPart");
-	}
-	pass = Config::gets("Signalisations", "SIP.password");
-	if (pass == "") {
-		callmanager->error->errorName(PASSWD_FIELD_EMPTY, NULL);				
-		return -1;
-	}
-
-	if (callmanager->useStun()) {
-		realm = Config::gets("Signalisations", "SIP.hostPart");
-	} else {
-		if (Config::gets("Signalisations", "SIP.sipproxy") != "") {
-			realm = Config::gets("Signalisations", "SIP.sipproxy");
-		} else {
-			realm = Config::gets("Signalisations", "SIP.hostPart");
-		}
-	}
-	
-	if (eXosip_add_authentication_info(login.data(), login.data(), 
-		pass.data(), NULL, NULL) != 0) {
-		qDebug ("No authentication");
-		return -1;
-	}
-	return 0;
-}
-		
-string
-SIP::fromHeader (string user, string host) {
-	string displayname = Config::gets("Signalisations", "SIP.fullName");
-	return ("\"" + displayname + "\"" + " <sip:" + user + "@" + host + ">");
-}
-
-
-string
-SIP::toHeader(string to) {
-	if (to.find("sip:") == string::npos) {
-		return ("sip:" + to );
-	} else {
-		return to;
-	}
-}
-
-int
-SIP::startCall ( char *from,  char *to,  char *subject,  char *route) {
-  	osip_message_t *invite;
-  	int i;
-
-  	if (checkUrl(from) != 0) {
-		callmanager->error->errorName(FROM_ERROR, NULL);
-    	return -1;
-  	}
-  	if (checkUrl(to) != 0) {
-		callmanager->error->errorName(TO_ERROR, NULL);
-    	return -1;
-  	}
-  	
-	i = eXosip_build_initial_invite(&invite, to, from, route, subject);	
-  	if (i != 0) {
-		return -1;
-    }
-  	
-	eXosip_lock();
-	if (!callmanager->useStun()) {
-		char port[64];
-
-		// Set random port for outgoing call
-		setLocalPort(RANDOM_LOCAL_PORT);
-
-		bzero (port, 64);
-		snprintf (port, 63, "%d", getLocalPort());
-		
-  		i = eXosip_initiate_call (invite, NULL, NULL, port);
-		
-	} else {
-		QString qport;
-		qport = qport.number(callmanager->getFirewallPort());
-		
-		i = eXosip_initiate_call(invite, NULL, NULL, (char*)qport.ascii());
-
-		qDebug("sip invite: port = %s",(char*)qport.ascii());
-	}
-	if (i <= 0) {
-		qDebug("NO initiate_call = %d", i);
-		eXosip_unlock();
-		return -1;
-	}
-
-	eXosip_unlock();
-  	return i;	
-}
-
-int
-SIP::outgoingInvite (void) {
-	char * from;
-	char * to;
-
-	// Form the From header field basis on configuration panel
-	string qfrom = fromHeader(Config::gets("Signalisations", "SIP.userPart"),
-								Config::gets("Signalisations", "SIP.hostPart"));
-	from = (char*)qfrom.data();
-	
-	// Form the To header field
-	string qto;
-	if (callmanager->bufferTextRender().ascii() == NULL) 
-		return -1;
-	else 
-		qto = toHeader(string(callmanager->bufferTextRender().ascii()));
-
-	if (qto.find("@") == string::npos and 
-			Config::getb("Signalisations", "SIP.autoregister")) {
-		qto = qto + "@" + Config::gets("Signalisations", "SIP.hostPart");
-	}
-	to = (char*)qto.data();
-		
-	qDebug ("From: %s", from);
-	qDebug ("To: <%s>", to);
-
-	if (Config::gets("Signalisations", "SIP.sipproxy") == "") {
-	// If no SIP proxy setting for direct call with only IP address
-		if (startCall(from, to, NULL, NULL) <= 0) {
-			qDebug("SIP: no start call");
-			return -1;
-		}
-		return 0;
-	} else {
-	// If SIP proxy setting
-		string qroute = "<sip:" + 
-			Config::gets("Signalisations", "SIP.sipproxy") + ";lr>";
-		char * route = (char*)qroute.data();
-		if (startCall(from, to, NULL, route) <= 0) {
-			qDebug("SIP: no start call");
-			return -1;
-		}
-		return 0;
-	}
-}
-
-int
-SIP::getLocalPort (void) {
-	return local_port;
-}
-
-void
-SIP::setLocalPort (int port) {
-	this->local_port = port;
-}
-	
-void
-SIP::carryingDTMFdigits (int line, char digit) {
-	  int duration = Config::geti("Signalisations", "DTMF.pulseLength"); 
-      
-	  static const int body_len = 128;
-
-      char *dtmf_body = new char[body_len];
-	  snprintf(dtmf_body, body_len - 1,
-			  "Signal=%c\r\nDuration=%d\r\n",
-			  digit, duration);
-
-      eXosip_lock();
-      eXosip_info_call(call[line]->did, "application/dtmf-relay", dtmf_body);
-      eXosip_unlock();
-	
-	  delete[] dtmf_body;
-}
-
-// Handle IP-Phone user actions
-int
-SIP::manageActions (int usedLine, int action) {
-	int i;
-	string referTo;
-	
-	char tmpbuf[64];
-
-	assert (usedLine < NUMBER_OF_LINES);
-	assert (usedLine >= 0);
-
-	bzero (tmpbuf, 64);
-	// Get local port	
-	snprintf (tmpbuf, 63, "%d", call[usedLine]->getLocalAudioPort());
-
-	switch (action) {
-		
-	// IP-Phone user want to refuse a call.
-	case REFUSE_CALL: 
-		qDebug("REFUSE_CALL line %d, cid = %d, did = %d", 
-				usedLine, call[usedLine]->cid, call[usedLine]->did);
-
-		callmanager->phLines[usedLine]->setbInProgress(false);
-
-		eXosip_lock();
-		i = eXosip_answer_call(call[usedLine]->did, BUSY_HERE, tmpbuf);
-		eXosip_unlock();
-			
-		callmanager->ringTone(false);
-		
-		// Delete the call when I hangup
-		if (call[usedLine] != NULL) {
-			delete call[usedLine];
-			call[usedLine] = NULL;
-		}
-
-		break;
-
-	// IP-Phone user is answering a call.
-	case ANSWER_CALL: 
-		qDebug("ANSWER_CALL line %d, cid = %d, did = %d", 
-				usedLine, call[usedLine]->cid, call[usedLine]->did);
-
-		callmanager->phLines[usedLine]->setbInProgress(false);
-
-		eXosip_lock();
-		i = eXosip_answer_call(call[usedLine]->did, 200, tmpbuf);
-		eXosip_unlock();
-			
-		// Incoming call is answered, start the sound channel.
-		if (callmanager->startSound (call[usedLine]) < 0) {
-			qDebug ("FATAL: Unable to start sound (%s:%d)",
-					__FILE__, __LINE__);
-			exit(1);
-		}
-		break;
-
-	// IP-Phone user is hanging up.
-	case CLOSE_CALL: // 1
-		qDebug("CLOSE_CALL: cid = %d et did = %d", call[usedLine]->cid, 
-				call[usedLine]->did);
-		
-		call[usedLine]->usehold = false;
-		// Release SIP stack.
-		eXosip_lock();
-		i = eXosip_terminate_call (call[usedLine]->cid, call[usedLine]->did);
-		eXosip_unlock();
-
-		// Release RTP channels
-		call[usedLine]->closedCall();
-
-		// Delete the call when I hangup
-		if (call[usedLine] != NULL) {
-			qDebug("SIP: CLOSE_CALL delete call[%d]", usedLine);
-			delete call[usedLine];
-			call[usedLine] = NULL;
-		}
-		break;
-
-	// IP-Phone user is parking peer on HOLD
-	case ONHOLD_CALL:
-		qDebug("ONHOLD_CALL: cid = %d et did = %d", call[usedLine]->cid, 
-				call[usedLine]->did);
-				
-		call[usedLine]->usehold = true;
-		
-		eXosip_lock();
-		i = eXosip_on_hold_call(call[usedLine]->did);
-		eXosip_unlock();
-		
-		// Disable audio
-		call[usedLine]->closedCall();
-		break;
-
-	// IP-Phone user is parking peer OFF HOLD
-	case OFFHOLD_CALL:
-		qDebug("OFF-HOLD_CALL: cid = %d et did = %d", call[usedLine]->cid, 
-				call[usedLine]->did);
-		call[usedLine]->usehold = true;
-		eXosip_lock();
-		i = eXosip_off_hold_call(call[usedLine]->did, NULL, 0);
-		eXosip_unlock();
-
-		// Enable audio
-		if (callmanager->startSound (call[usedLine]) < 0) {
-			qDebug ("FATAL: Unable to start sound (%s:%d)",
-					__FILE__, __LINE__);
-			exit(1);
-		}
-		break;
-
-	// IP-Phone user is transfering call
-	case TRANSFER_CALL:
-		referTo	= toHeader(string(callmanager->bufferTextRender().ascii()));
-		if (referTo.find("@") == string::npos) {
-			referTo = referTo + "@" + 
-				Config::gets("Signalisations", "SIP.hostPart");
-		}
-		
-		eXosip_lock();
-		i = eXosip_transfer_call(call[usedLine]->did, (char*)referTo.data());
-		eXosip_unlock();
-		break;
-		
-	// IP-Phone user is hanging up during ringing
-	case CANCEL_CALL:
-		qDebug("SIP: CANCEL_CALL: terminate cid=%d did=%d", 
-				call[usedLine]->cid,call[usedLine]->did);
-	
-		eXosip_lock();
-		i = eXosip_terminate_call (call[usedLine]->cid, call[usedLine]->did);
-		eXosip_unlock();
-
-		callmanager->ringTone(false);
-		
-		// Delete the call when I hangup
-		if (call[usedLine] != NULL) {
-			delete call[usedLine];
-			call[usedLine] = NULL;
-		}
-		break;
-
-	default:
-		return -1;
-		break;
-	}
-	return 0;
-}
-
-
-// Receive events from the other
-int
-SIP::getEvent (void) {
-	eXosip_event_t *event;
-	int theline = -1;
-	int curLine;
-	char *name;
-	static int countReg = 0;
-
-	event = eXosip_event_wait (0, 50);
-	if (event == NULL) {
-		return -1;
-	}	
-	
-	callmanager->handleRemoteEvent(event->status_code,
-			event->reason_phrase,
-			-1);	
-//	qDebug("status-code %d %s", event->status_code, event->reason_phrase);
-	switch (event->type) {
-		// IP-Phone user receives a new call
-		case EXOSIP_CALL_NEW: //13
-			qDebug("<- (%i %i) INVITE from: %s", event->cid, event->did,
-				event->remote_uri);
-
-			// Set local random port for incoming call
-			setLocalPort(RANDOM_LOCAL_PORT);
-			
-			theline = findLineNumberNotUsed();
-			notUsedLine = theline;
-
-			if (theline < 0) {
-				// TODO: remonter erreur au manager (on refuse l'appel)
-			}
-			assert (theline >= 0); assert (theline < NUMBER_OF_LINES);
-
-			// Display the name which the call comes from
-			osip_from_t *from;
-  			osip_from_init(&from);
-  			osip_from_parse(from, event->remote_uri);
-			name = osip_from_get_displayname(from);
-			callmanager->nameDisplay(name);
-			callmanager->phLines[theline]->text = QString(name);
-			osip_from_free(from);
-			
-			if (call[theline] == NULL) {
-				//callmanager->setCallInProgress(true);
-				callmanager->phLines[theline]->setbInProgress(true);
-				call[theline] = new SipCall (callmanager);
-				call[theline]->newIncomingCall(event);
-			//	callmanager->handleRemoteEvent (
-			//				0, NULL, EXOSIP_CALL_NEW, theline);
-
-				// Associate an audio port with a call
-				call[theline]->setLocalAudioPort(local_port);
-
-				// Ringing starts when somebody calls IP-phone user
-				callmanager->ring();
-				callmanager->phLines[theline]->setbRinging(true);
-			}
-			break;
-
-		// The callee answers
-		case EXOSIP_CALL_ANSWERED: // 8, start call: event->status_code = 200
-			qDebug("ANSWERED<- (%i %i) [%i %s] %s", event->cid, event->did, 
-				event->status_code, event->reason_phrase,
-				event->remote_uri);
-			   	
-			// TODO: stop the ringtone
-			callmanager->ringTone(false);
-			
-			//theline = callmanager->getCurrentLineNumber();
-			curLine = callmanager->getCurrentLineNumber();
-			
-			// If we have chosen the line before validating the phone number
-			if (callmanager->isChosenLine() and !callmanager->otherLine()) {
-				theline = callmanager->chosenLine();
-			} else {
-				theline = findLineNumber(event);
-			}
-
-			if (call[theline] == NULL) {
-				call[theline] = new SipCall(callmanager);
-			}
-
-			// Stop the call progress
-			//callmanager->setCallInProgress(false);
-			callmanager->phLines[theline]->setbInProgress(false);
-			
-			// Conditions to not start sound when callee answers for onhold
-			// and offhold state
-			if (callmanager->phLines[theline]->getStateLine() == BUSY or 
-					callmanager->phLines[theline]->getStateLine() == OFFHOLD
-					or !call[theline]->usehold) {
-				if (!callmanager->transferedCall()) {
-					if (!call[theline]->usehold) {
-						// Associate an audio port with a call
-						call[theline]->setLocalAudioPort(local_port);
-					}
-
-					// Answer
-					call[theline]->answeredCall(event);
-
-					// Handle event
-					callmanager->handleRemoteEvent (
-							0, NULL, EXOSIP_CALL_ANSWERED);
-
-					callmanager->setChoose (false, false);
-					
-					// Outgoing call is answered, start the sound channel.
-					if (callmanager->startSound (call[theline]) < 0) {
-						qDebug ("FATAL: Unable to start sound (%s:%d)",
-							__FILE__, __LINE__);
-						exit(1);
-					}
-				}
-			} else if (callmanager->otherLine() and
-					call[curLine] == NULL) {
-				// If a new line replaces the used current line and 
-				// it's not ringing.
-				callmanager->startDialTone();	
-			}
-			break;
-
-		case EXOSIP_CALL_RINGING:
-			qDebug("RINGING<- (%i %i) [%i %s] %s", event->cid, event->did, 
-				event->status_code, event->reason_phrase, 
-				event->remote_uri);
-			
-			callmanager->handleRemoteEvent (0, NULL, EXOSIP_CALL_RINGING);
-			// TODO : rajouter tonalite qd ca sonne
-			callmanager->ringTone(true);
-
-			// If we have chosen the line before validating the phone number
-			if (callmanager->isChosenLine() and !callmanager->otherLine()) {
-				theline = callmanager->chosenLine();
-			} else {
-				theline = findLineNumber(event);
-			}
-
-			if (theline < 0) {
-				// TODO: remonter erreur au manager (on refuse l'appel)
-			}
-			assert (theline >= 0);
-			assert (theline < NUMBER_OF_LINES);
-
-			callmanager->phLines[theline]->setbInProgress(true);
-
-			if (call[theline] == NULL) {
-				call[theline] = new SipCall(callmanager);
-				call[theline]->setLocalAudioPort(local_port);
-				call[theline]->ringingCall(event);
-			}
-			break;
-
-		case EXOSIP_CALL_REDIRECTED:
-			qDebug("REDIRECTED<- (%i %i) [%i %s] %s",event->cid, event->did,
-				event->status_code, event->reason_phrase, 
-				event->remote_uri);
-			// theline = findLineNumberUsed(event);
-			//assert (theline >= 0);
-			//assert (theline < NUMBER_OF_LINES);
-			//? call[theline] = new SipCall(callmanager);
-			// call[theline]->redirectedCall(event);
-			break;
-
-		case EXOSIP_CALL_REQUESTFAILURE:
-#if 0
-			qDebug("REQUESTFAILURE<- (%i %i) [%i %s] %s", event->cid, 
-				event->did, event->status_code, event->reason_phrase,
-				event->remote_uri);
-#endif
-			if (callmanager->isChosenLine() and !callmanager->otherLine()) {
-				theline = callmanager->chosenLine();
-			} else {
-				theline = findLineNumber(event);
-			}
-			
-			assert (theline >= 0);
-			assert (theline < NUMBER_OF_LINES);
-		//	call[theline]->requestfailureCall(event);
-			callmanager->phLines[theline]->setbInProgress(false);
-
-			// Handle 4XX errors
-			switch (event->status_code) {
-				case AUTH_REQUIRED:
-					if (setAuthentication() == -1) {
-						break;
-					}
-					eXosip_lock();
-					eXosip_retry_call (event->cid);
-					eXosip_unlock();
-					break;
-				case FORBIDDEN:
-				case NOT_FOUND:
-				case REQ_TIMEOUT:
-				case ADDR_INCOMPLETE:
-					callmanager->congestion(true);
-					break;
-				case REQ_TERMINATED:
-					break;
-				default:
-					//callmanager->setCallInProgress(false);
-					break;
-			}
-			break; 
-
-		case EXOSIP_CALL_SERVERFAILURE:
-			qDebug("SERVERFAILURE<- (%i %i) [%i %s] %s", event->cid, 
-				event->did, event->status_code, event->reason_phrase,
-				event->remote_uri);
-			// Handle 5XX errors
-			switch (event->status_code) {
-				case SERVICE_UNAVAILABLE:
-					callmanager->ringTone(false);
-					callmanager->congestion(true);					
-					break;
-				default:
-					break;
-			}
-			//theline = findLineNumberUsed(event);
-			//assert (theline >= 0);
-			//assert (theline < NUMBER_OF_LINES);
-		//	call[theline]->serverfailureCall(event);
-			break;
-
-		case EXOSIP_CALL_GLOBALFAILURE:
-			qDebug("GLOBALFAILURE<- (%i %i) [%i %s] %s", event->cid, 
-				event->did, event->status_code, event->reason_phrase,
-				event->remote_uri);
-			// Handle 6XX errors
-			
-		//	call[findLineNumberUsed(event)]->globalfailureCall(event);
-			break;
-
-		// The remote peer closed the phone call(we received BYE).
-		case EXOSIP_CALL_CLOSED:
-			qDebug("<- (%i %i) BYE", event->cid, event->did);
-
-			call[theline]->usehold = false;
-			theline = findLineNumber(event);
-			if (!callmanager->phLines[theline]->getbInProgress()) {
-				// If callee answered before closing call 
-				// or callee not onhold by caller
-			 	theline = findLineNumberClosed(event);
-				call[theline]->closedCall();
-			} else {
-				// If caller closes call before callee answers
-				//theline = notUsedLine;
-				theline = findLineNumber(event);
-				// Stop ringTone
-				callmanager->ringTone(false);
-			}
-			
-			assert (theline >= 0);
-			assert (theline < NUMBER_OF_LINES);
-
-			if (call[theline] != NULL) {
-				delete call[theline];
-				call[theline] = NULL;
-				callmanager->handleRemoteEvent(
-						0, NULL, EXOSIP_CALL_CLOSED, theline);
-			}
-			break;
-
-		case EXOSIP_CALL_HOLD:
-			qDebug("<- (%i %i) INVITE (On Hold) from: %s", event->cid, 
-				event->did, event->remote_uri);
-			theline = findLineNumber(event);
-			call[theline]->closedCall();
-			call[theline]->onholdCall(event);
-			break;
-
-		case EXOSIP_CALL_OFFHOLD:
-			qDebug("<- (%i %i) INVITE (Off Hold) from: %s", event->cid, 
-				event->did, event->remote_uri);
-			theline = findLineNumber(event);
-			if (callmanager->startSound (call[theline]) < 0) {
-				qDebug ("FATAL: Unable to start sound (%s:%d)",
-						__FILE__, __LINE__);
-				exit(1);
-			}
-			call[theline]->offholdCall(event);
-			break;
-
-		case EXOSIP_REGISTRATION_SUCCESS:
-			qDebug("REGISTRATION_SUCCESS <- (%i) [%i %s] %s for REGISTER %s", 
-				event->rid, event->status_code, event->reason_phrase, 
-				event->remote_uri, event->req_uri);
-			callmanager->handleRemoteEvent(0,NULL,EXOSIP_REGISTRATION_SUCCESS);
-			break;
-
-		case EXOSIP_REGISTRATION_FAILURE:
-#if 0
-			qDebug("REGISTRATION_FAILURE <- (%i) [%i %s] %s for REGISTER %s", 
-				event->rid, event->status_code, event->reason_phrase, 
-				event->remote_uri, event->req_uri);
-#endif
-			if (countReg <= 3) { 
-				setRegister();
-				countReg++;
-			}
-			callmanager->handleRemoteEvent(0,NULL,EXOSIP_REGISTRATION_FAILURE);
-			break;
-
-		case EXOSIP_OPTIONS_NEW:
-			qDebug("OPT_NEW <- (%i %i) OPTIONS from: %s", event->cid, 
-				event->did, event->remote_uri);
-
-			/* answer the OPTIONS method */
-			/* 1: search for an existing call */
-			int k;
-			for (k = 0; k < NUMBER_OF_LINES; k++) {
-				if (call[k] != NULL) {
-					if (call[k]->cid == event->cid) {
-						break;
-					}
-				}
-			}
-				// TODO: Que faire si rien trouve??
-			eXosip_lock();
-			if (call[k]->cid == event->cid) {
-				/* already answered! */
-			}
-			else if (k == NUMBER_OF_LINES) {
-				/* answer 200 ok */
-				eXosip_answer_options (event->cid, event->did, 200);
-			} else {
-				/* answer 486 ok */
-				eXosip_answer_options (event->cid, event->did, 486);
-			}
-			eXosip_unlock();
-			break;
-
-		case EXOSIP_OPTIONS_ANSWERED:
-			qDebug("OPT_ANSWERED <- (%i %i) [%i %s] %s", event->cid, 
-				event->did, event->status_code, event->reason_phrase, 
-				event->remote_uri);
-			break;
-
-		case EXOSIP_OPTIONS_PROCEEDING:
-			qDebug("OPT_PROCEEDING <- (%i %i) [%i %s] %s", event->cid, 
-				event->did, event->status_code, event->reason_phrase, 
-				event->remote_uri);
-			break;
-
-		case EXOSIP_OPTIONS_REDIRECTED:
-			qDebug("OPT_REDIR <- (%i %i) [%i %s] %s", event->cid, 
-				event->did, event->status_code, event->reason_phrase, 
-				event->remote_uri);
-			break;
-
-		case EXOSIP_OPTIONS_REQUESTFAILURE:
-			qDebug ("OPT_REQ_FAIL <- (%i %i) [%i %s] %s", event->cid, 
-				event->did, event->status_code, event->reason_phrase, 
-				event->remote_uri);
-			break;
-
-		case EXOSIP_OPTIONS_SERVERFAILURE:
-			qDebug("OPT_SVR_FAIL <- (%i %i) [%i %s] %s", event->cid, 
-				event->did, event->status_code, event->reason_phrase, 
-				event->remote_uri);
-			break;
-
-		case EXOSIP_OPTIONS_GLOBALFAILURE:
-			qDebug("OPT_GL_FAIL <- (%i %i) [%i %s] %s", event->cid, 
-				event->did, event->status_code, event->reason_phrase, 
-				event->remote_uri);
-			break;
-
-		case EXOSIP_SUBSCRIPTION_NOTIFY:
-			qDebug("SUBS_NOTIFY <- (%i %i) NOTIFY from: %s", event->sid, 
-				event->did, event->remote_uri);
-			qDebug("<- (%i %i) online=%i [status: %i reason:%i]",
-				event->sid, event->did, event->online_status, 
-				event->ss_status, event->ss_reason);
-			//subscription_notify(je);
-			break;
-
-		default:
-			return -1;
-			break;
-	}
-	eXosip_event_free(event);
- 	
-    return 0;
-}
diff --git a/src/sip.h b/src/sip.h
deleted file mode 100644
index f91b2360c9..0000000000
--- a/src/sip.h
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (C) 2004 Savoir-Faire Linux inc.
- * Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com> 
- *
- * Portions Copyright (C) 2002,2003   Aymeric Moizard <jack@atosc.org>
- *
- * This is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2,
- * or (at your option) any later version.
- *
- * This is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with dpkg; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef __SIP_H__
-#define __SIP_H__
-
-#include <sys/time.h>
-
-#include <eXosip/eXosip.h>
-#include <osip2/osip.h>
-#include <osipparser2/osip_const.h>
-#include <osipparser2/osip_headers.h>
-#include <osipparser2/osip_body.h>
-
-#include <qthread.h>
-
-#include "audiocodec.h"
-#include "manager.h"
-#include "phoneline.h"
-#include "sipcall.h"
-
-#include <cc++/thread.h>
-#include <string>
-using namespace std;
-using namespace ost;
-
-// List of actions
-#define ANSWER_CALL		0
-#define	CLOSE_CALL		1
-#define	ONHOLD_CALL		2
-#define	OFFHOLD_CALL	3
-#define TRANSFER_CALL	4
-#define CANCEL_CALL		5
-#define REFUSE_CALL		6
-
-// 1XX responses
-#define DIALOG_ESTABLISHED 101
-// 4XX Errors
-#define	FORBIDDEN		403
-#define NOT_FOUND		404
-#define AUTH_REQUIRED	407
-#define REQ_TIMEOUT		408
-#define	ADDR_INCOMPLETE	484
-#define	BUSY_HERE		486
-#define	REQ_TERMINATED	487
-// 5XX errors
-#define SERVICE_UNAVAILABLE	503
-
-class EventThread : public Thread {
-public:
-	EventThread (SIP *);
-	~EventThread (void);
-	virtual void 	 run ();
-private:
-	SIP	*	sipthread;
-};
-
-
-class SIP {
-public:
-	SIP		(void) {}
-	SIP 	(Manager*);
-	~SIP 	(void);
-
-	int  	getNumberPendingCalls	(void);
-	int 	findLineNumberNotUsed	(void);
-	int		findLineNumber 			(eXosip_event_t *);
-	int		findLineNumberUsed 		(eXosip_event_t *);
-	int		findLineNumberClosed 	(eXosip_event_t *);	
-	SipCall *findCall				(int pos);
-	int 	initSIP 				(void);	
-	void	quitSIP					(void);
-	void 	initRtpmapCodec			(void);
-	int 	checkURI				(const char *);
-	int 	startCall 				(char *,  char *,  char *,  char *);
-	int 	setRegister 			(void);
-	int 	setAuthentication		(void);
-	string	fromHeader				(string, string);
-	string  toHeader				(string);
-	int 	outgoingInvite			(void);
-	int 	manageActions 			(int, int);
-	int 	getEvent				(void);
-	void 	carryingDTMFdigits		(int, char);
-	int		getLocalPort			(void);
-	void	setLocalPort			(int);
-	
-	static int checkUrl				(char *url);
-	
-	char			*myIPAddress;
-	SipCall 		*call[NUMBER_OF_LINES];
-	Manager			*callmanager;
-	char 			 displayName[64];
-
-	int notUsedLine;
-	
-private:
-	EventThread	*evThread;
-	
-	int 	getLocalIp 				(void);
-	bool	isInRtpmap 				(int, int, AudioCodec&);
-	int 	local_port;	
-};
-
-#endif // __SIP_H__
diff --git a/src/sipcall.cpp b/src/sipcall.cpp
index 2a0318e424..69aaec0aa4 100644
--- a/src/sipcall.cpp
+++ b/src/sipcall.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2004 Savoir-Faire Linux inc.
+ * Copyright (C) 2004-2005 Savoir-Faire Linux inc.
  * Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com> 
  *
  * Portions Copyright (C) 2002,2003   Aymeric Moizard <jack@atosc.org>
@@ -22,31 +22,100 @@
 #include <osipparser2/sdp_message.h>
 #include <string.h>
 
-#include "audiocodec.h"
+#include <iostream>
+
+#include "audio/audiocodec.h"
+#include "global.h"
 #include "sipcall.h"
 
-SipCall::SipCall (void) {
-	this->alloc();
+using namespace std;
+
+SipCall::SipCall (short id, CodecDescriptorVector* cdv) 
+{
+	_id = id;	// Same id of Call object
+	alloc();
+	_cdv = cdv;
+	_audiocodec = NULL;
+	_standby = false;
+	//this->usehold = false;
+}
+
+
+SipCall::~SipCall (void) 
+{
+	dealloc();
+}
+
+void
+SipCall::setLocalAudioPort (int newport) 
+{
+	_local_audio_port = newport;
+}
+
+int
+SipCall::getLocalAudioPort (void) 
+{
+	return _local_audio_port;
+}
+
+void
+SipCall::setId (short id)
+{
+	_id = id;
+}
+
+short
+SipCall::getId (void)
+{
+	return _id;
 }
 
-SipCall::SipCall (Manager *mngr) {
-	this->alloc();
-	this->manager = mngr;
-	this->usehold = false;
+void
+SipCall::setDid (int did)
+{
+	_did = did;
 }
 
-SipCall::~SipCall (void) {
-	this->dealloc();
+int
+SipCall::getDid (void)
+{
+	return _did;
 }
 
 void
-SipCall::setLocalAudioPort (int newport) {
-	this->local_audio_port = newport;
+SipCall::setCid (int cid)
+{
+	_cid = cid;
+}
+
+int
+SipCall::getCid (void)
+{
+	return _cid;
 }
 
 int
-SipCall::getLocalAudioPort (void) {
-	return this->local_audio_port;
+SipCall::getRemoteSdpAudioPort (void)
+{
+	return _remote_sdp_audio_port;
+}
+
+char*
+SipCall::getRemoteSdpAudioIp (void)
+{
+	return _remote_sdp_audio_ip;
+}
+
+AudioCodec*
+SipCall::getAudioCodec (void)
+{
+	return _audiocodec;
+}
+
+void
+SipCall::setAudioCodec (AudioCodec* ac)
+{
+	_audiocodec = ac;
 }
 
 // newIncomingCall is called when the IP-Phone user receives a new call.
@@ -54,34 +123,37 @@ int
 SipCall::newIncomingCall (eXosip_event_t *event) {	
 	SipCall *ca = this;
 	
-  	this->cid = event->cid;
-  	this->did = event->did;
+  	_cid = event->cid;
+  	_did = event->did;
 
-  	if (this->did < 1 && this->cid < 1) {
+  	if (_did < 1 && _cid < 1) {
       	return -1; /* not enough information for this event?? */
     }
 	
-  	osip_strncpy (this->textinfo, event->textinfo, 255);
-  	osip_strncpy (this->req_uri, event->req_uri, 255);
-  	osip_strncpy (this->local_uri, event->local_uri, 255);
-  	osip_strncpy (this->local_uri, event->remote_uri, 255);
-  	osip_strncpy (this->subject, event->subject, 255);
+  	osip_strncpy (_textinfo, event->textinfo, 255);
+  	osip_strncpy (_req_uri, event->req_uri, 255);
+  	osip_strncpy (_local_uri, event->local_uri, 255);
+  	osip_strncpy (_local_uri, event->remote_uri, 255);
+  	osip_strncpy (_subject, event->subject, 255);
+	
+	osip_strncpy (ca->_remote_sdp_audio_ip, event->remote_sdp_audio_ip, 49);
+	ca->_remote_sdp_audio_port = event->remote_sdp_audio_port;
 	
-	osip_strncpy (ca->remote_sdp_audio_ip, event->remote_sdp_audio_ip, 49);
-	ca->remote_sdp_audio_port = event->remote_sdp_audio_port;
 	ca->payload = event->payload;
-	qDebug("For incoming ca->payload = %d",ca->payload);
-	osip_strncpy (ca->payload_name, event->payload_name, 49);
-	osip_strncpy (ca->sdp_body, event->sdp_body, 1000);
-	osip_strncpy (ca->sdp_body, event->sdp_body, 1000);
-	qDebug("%s", ca->sdp_body);
+	_debug("For incoming ca->_payload = %d\n", ca->payload);
+	osip_strncpy (ca->_payload_name, event->payload_name, 49);
+	setAudioCodec(_cdv->at(0)->alloc(ca->payload, ca->_payload_name));	
+
+	osip_strncpy (ca->_sdp_body, event->sdp_body, 1000);
+	osip_strncpy (ca->_sdp_body, event->sdp_body, 1000);
+	_debug("\n%s\n", ca->_sdp_body);
 	
   	if (event->reason_phrase[0] != '\0') {
-      	osip_strncpy(this->reason_phrase, event->reason_phrase, 49);
-      	this->status_code = event->status_code;
+      	osip_strncpy(this->_reason_phrase, event->reason_phrase, 49);
+      	this->_status_code = event->status_code;
     }
 	
-  	this->state = event->type;
+  	this->_state = event->type;
   	return 0;
 }
 
@@ -90,73 +162,73 @@ int
 SipCall::ringingCall (eXosip_event_t *event) {     
 	SipCall *ca = this;
 	
-    this->cid = event->cid;
-    this->did = event->did;
+    this->_cid = event->cid;
+    this->_did = event->did;
       
-    if (this->did < 1 && this->cid < 1) {
+    if (this->_did < 1 && this->_cid < 1) {
 	  return -1; 
 	}
 
-  	osip_strncpy(this->textinfo,   event->textinfo, 255);
-  	osip_strncpy(this->req_uri,    event->req_uri, 255);
-  	osip_strncpy(this->local_uri,  event->local_uri, 255);
-  	osip_strncpy(this->remote_uri, event->remote_uri, 255);
-  	osip_strncpy(this->subject,    event->subject, 255);
+  	osip_strncpy(this->_textinfo,   event->textinfo, 255);
+  	osip_strncpy(this->_req_uri,    event->req_uri, 255);
+  	osip_strncpy(this->_local_uri,  event->local_uri, 255);
+  	osip_strncpy(this->_remote_uri, event->remote_uri, 255);
+  	osip_strncpy(this->_subject,    event->subject, 255);
 
-	osip_strncpy(ca->remote_sdp_audio_ip, event->remote_sdp_audio_ip, 49);
-	ca->remote_sdp_audio_port = event->remote_sdp_audio_port;
+	osip_strncpy(ca->_remote_sdp_audio_ip, event->remote_sdp_audio_ip, 49);
+	ca->_remote_sdp_audio_port = event->remote_sdp_audio_port;
 	ca->payload = event->payload;
-	osip_strncpy(ca->payload_name, event->payload_name, 49);
+	osip_strncpy(ca->_payload_name, event->payload_name, 49);
 	
   	if (event->reason_phrase[0]!='\0') {
-      	osip_strncpy(this->reason_phrase, event->reason_phrase, 49);
-      	this->status_code = event->status_code;
+      	osip_strncpy(this->_reason_phrase, event->reason_phrase, 49);
+      	this->_status_code = event->status_code;
     }
-  	this->state = event->type;;
+  	this->_state = event->type;;
   	return 0;
 }
 
 
 int 
 SipCall::answeredCall(eXosip_event_t *event) {
-	AudioCodec* ac = new AudioCodec();
 	SipCall *ca = this;
 	
-    this->cid = event->cid;
-    this->did = event->did;
+    _cid = event->cid;
+    _did = event->did;
       
-    if (this->did < 1 && this->cid < 1)	{
+    if (_did < 1 && _cid < 1)	{
 	  return -1; /* not enough information for this event?? */
 	}
 
-	osip_strncpy(this->textinfo,   event->textinfo, 255);
-	osip_strncpy(this->req_uri,    event->req_uri, 255);
-    osip_strncpy(this->local_uri,  event->local_uri, 255);
-    osip_strncpy(this->remote_uri, event->remote_uri, 255);
-    osip_strncpy(this->subject,    event->subject, 255);
-
-	osip_strncpy(ca->remote_sdp_audio_ip, event->remote_sdp_audio_ip, 49);
-	ca->remote_sdp_audio_port = event->remote_sdp_audio_port;
-	osip_strncpy(ca->payload_name, event->payload_name, 49);
-	osip_strncpy (ca->sdp_body, event->sdp_body, 1000);
-	qDebug("%s", ca->sdp_body);
-	
+	osip_strncpy(this->_textinfo,   event->textinfo, 255);
+	osip_strncpy(this->_req_uri,    event->req_uri, 255);
+    osip_strncpy(this->_local_uri,  event->local_uri, 255);
+    osip_strncpy(this->_remote_uri, event->remote_uri, 255);
+    osip_strncpy(this->_subject,    event->subject, 255);
+
+	osip_strncpy(ca->_remote_sdp_audio_ip, event->remote_sdp_audio_ip, 49);
+	ca->_remote_sdp_audio_port = event->remote_sdp_audio_port;
+	osip_strncpy(ca->_payload_name, event->payload_name, 49);
+	osip_strncpy (ca->_sdp_body, event->sdp_body, 1000);
+	_debug("\n%s\n", ca->_sdp_body);
+
 	// For outgoing calls, find the first payload of the remote user
-	int i;
+	int i, size;
 	char temp[64];
 	bzero(temp, 64);
+	size = _cdv->size();
 	// Codec array in common with the 2 parts
-	int m_audio[NB_CODECS];
-	for (int a = 0; a < NB_CODECS; a++)
+	int m_audio[size];
+	for (int a = 0; a < size; a++)
 		m_audio[a] = -1;
 	
 	sdp_message_t *sdp;
 	i = sdp_message_init(&sdp);
-	if (i != 0) qDebug("Cannot allocate a SDP packet");
-	i = sdp_message_parse(sdp, ca->sdp_body);
-	if (i != 0) qDebug("Cannot parse the SDP body");
+	if (i != 0) _debug("Cannot allocate a SDP packet\n");
+	i = sdp_message_parse(sdp, ca->_sdp_body);
+	if (i != 0) _debug("Cannot parse the SDP body\n");
 	int pos = 0;
-	if (sdp == NULL) qDebug("SDP = NULL");
+	if (sdp == NULL) _debug("SDP = NULL\n");
 /*********/	
 	while (!sdp_message_endof_media (sdp, pos)) {
 		int k = 0;
@@ -167,10 +239,10 @@ SipCall::answeredCall(eXosip_event_t *event) {
 			int c = 0;
 		  	do {
 		    	payload = sdp_message_m_payload_get (sdp, pos, k);
-				for (int j = 0; j < NB_CODECS; j++) {
-					snprintf(temp, 63, "%d", ac->handleCodecs[j]);
+				for (int j = 0; j < size; j++) {
+					snprintf(temp, 63, "%d", _cdv->at(j)->getPayload());
 					if (payload != NULL and strcmp(temp, payload) == 0) {
-					   	m_audio[c] = ac->handleCodecs[j];
+					   	m_audio[c] = _cdv->at(j)->getPayload();
 						c++;
 						break;
 					}
@@ -181,22 +253,23 @@ SipCall::answeredCall(eXosip_event_t *event) {
 		pos++;
 	}
 /***********/
-	if (m_audio[0] == -1)
-		ac->noSupportedCodec();
-	else
+	if (m_audio[0] == -1) {
+		noSupportedCodec();
+	} else {
 		ca->payload = m_audio[0];
+		setAudioCodec(_cdv->at(0)->alloc(ca->payload, ""));
+	}
 
-	qDebug ("For outgoing call: ca->payload = %d", ca->payload);
+	_debug("For outgoing call: ca->_payload = %d\n", ca->payload);
 	
-
 	sdp_message_free(sdp);
-		
+
 	if (event->reason_phrase[0]!='\0') {
-		osip_strncpy(this->reason_phrase, event->reason_phrase, 49);
-		this->status_code = event->status_code;
+		osip_strncpy(this->_reason_phrase, event->reason_phrase, 49);
+		this->_status_code = event->status_code;
     }
-	this->state = event->type;
-	delete ac;
+	this->_state = event->type;
+//	delete ac;
 	return 0;
 }
 
@@ -204,15 +277,15 @@ int
 SipCall::onholdCall (eXosip_event_t *event) {
 	SipCall *ca = this;
 
-	osip_strncpy(ca->textinfo, event->textinfo, 255);
+	osip_strncpy(ca->_textinfo, event->textinfo, 255);
 
-    osip_strncpy(ca->remote_sdp_audio_ip, event->remote_sdp_audio_ip, 49);
-    ca->remote_sdp_audio_port = event->remote_sdp_audio_port;
+    osip_strncpy(ca->_remote_sdp_audio_ip, event->remote_sdp_audio_ip, 49);
+    ca->_remote_sdp_audio_port = event->remote_sdp_audio_port;
 
-    osip_strncpy(ca->reason_phrase, event->reason_phrase, 49);
-    ca->status_code = event->status_code;
+    osip_strncpy(ca->_reason_phrase, event->reason_phrase, 49);
+    ca->_status_code = event->status_code;
 		
-	ca->state = event->type;
+	ca->_state = event->type;
   	return 0;
 }
 
@@ -220,15 +293,15 @@ int
 SipCall::offholdCall (eXosip_event_t *event) {
 	SipCall *ca = this;
 
-	osip_strncpy(ca->textinfo, event->textinfo, 255);
+	osip_strncpy(ca->_textinfo, event->textinfo, 255);
 
-    osip_strncpy(ca->remote_sdp_audio_ip, event->remote_sdp_audio_ip, 49);
-    ca->remote_sdp_audio_port = event->remote_sdp_audio_port;
+    osip_strncpy(ca->_remote_sdp_audio_ip, event->remote_sdp_audio_ip, 49);
+    ca->_remote_sdp_audio_port = event->remote_sdp_audio_port;
 
-    osip_strncpy(ca->reason_phrase, event->reason_phrase, 49);
-    ca->status_code = event->status_code;
+    osip_strncpy(ca->_reason_phrase, event->reason_phrase, 49);
+    ca->_status_code = event->status_code;
   
-	ca->state = event->type;
+	ca->_state = event->type;
   	return 0;
 }
 
@@ -240,7 +313,7 @@ SipCall::redirectedCall(eXosip_event_t *event) {
 		os_sound_close(ca);
     }
 	*/
-    this->state = NOT_USED;
+    this->_state = NOT_USED;
 	return 0;
 }
 
@@ -249,7 +322,7 @@ SipCall::closedCall (void) {
 	SipCall *ca = this;
 
   	if (ca->enable_audio > 0) {
-      	manager->closeSound(ca);
+ //     	manager->closeSound(ca);
     }
 
   	return 0;
@@ -257,27 +330,32 @@ SipCall::closedCall (void) {
 
 void
 SipCall::alloc(void) {
-	this->reason_phrase = new char[50];
-  	this->textinfo = new char[256];
-  	this->req_uri = new char[256];
-  	this->local_uri = new char[256];
-  	this->remote_uri = new char[256];
-  	this->subject = new char[256];
-	this->remote_sdp_audio_ip = new char[50];
-  	this->payload_name = new char[50];
-  	this->sdp_body = new char[1000];
+	this->_reason_phrase = new char[50];
+  	this->_textinfo = new char[256];
+  	this->_req_uri = new char[256];
+  	this->_local_uri = new char[256];
+  	this->_remote_uri = new char[256];
+  	this->_subject = new char[256];
+	this->_remote_sdp_audio_ip = new char[50];
+  	this->_payload_name = new char[50];
+  	this->_sdp_body = new char[1000];
 }
 
 void
 SipCall::dealloc(void) {
-	delete reason_phrase;
-  	delete textinfo;
-  	delete req_uri;
-  	delete local_uri;
-  	delete remote_uri;
-  	delete subject;
-	delete remote_sdp_audio_ip;
-  	delete payload_name;
-	delete sdp_body;
+	delete _reason_phrase;
+  	delete _textinfo;
+  	delete _req_uri;
+  	delete _local_uri;
+  	delete _remote_uri;
+  	delete _subject;
+	delete _remote_sdp_audio_ip;
+  	delete _payload_name;
+	delete _sdp_body;
+}
+
+void
+SipCall::noSupportedCodec (void) {
+	_debug("Codec no supported\n");
 }
 
diff --git a/src/sipcall.h b/src/sipcall.h
index 60377058aa..ea7f9c3ac5 100644
--- a/src/sipcall.h
+++ b/src/sipcall.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2004 Savoir-Faire Linux inc.
+ * Copyright (C) 2004-2005 Savoir-Faire Linux inc.
  * Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com> 
  *
  * Portions Copyright (C) 2002,2003   Aymeric Moizard <jack@atosc.org>
@@ -23,41 +23,25 @@
 #define __SIP_CALL_H__
 
 #include <eXosip/eXosip.h>
-#include <qapplication.h>
+#include <vector>
 
-#include "manager.h"
+#include "audio/audiocodec.h"
+#include "audio/codecDescriptor.h"
 
 #define NOT_USED      0
+using namespace std;
 
+typedef vector<CodecDescriptor*, allocator<CodecDescriptor*> > CodecDescriptorVector;
+
+class AudioCodec;
 class SipCall {
 public:
-	SipCall (void);
-	SipCall (Manager *);
+	SipCall (short id, CodecDescriptorVector* cdv);
 	~SipCall (void);
 
-	Manager *manager;
-	bool 	 usehold;
-
-	int 	 cid;	// call id
-  	int 	 did;	// dialog id
-
-  	int  	 status_code;
-	
-	char 	*reason_phrase;
-  	char 	*textinfo;
-  	char 	*req_uri;
-  	char 	*local_uri;
-  	char 	*remote_uri;
-  	char 	*subject;
-	
-	char 	*remote_sdp_audio_ip;
-  	char 	*payload_name;
-	char	*sdp_body;
-	int		 local_audio_port;	
-  	int  	 remote_sdp_audio_port;
- 	int  	 payload;
-  	int  	 state;
-  	int  	 enable_audio; /* 1 started, -1 stopped */
+	bool 	usehold;
+ 	int  	payload;
+  	int  	enable_audio; /* 1 started, -1 stopped */
 	
 	int  	newIncomingCall 	(eXosip_event_t *);
 	int  	answeredCall 		(eXosip_event_t *);
@@ -74,11 +58,49 @@ public:
 
 	void	setLocalAudioPort 	(int);
 	int 	getLocalAudioPort 	(void);	
+	void 	setId				(short id);
+	short	getId				(void);
+	void 	setDid				(int did);
+	int 	getDid				(void);
+	void 	setCid				(int cid);
+	int 	getCid				(void);
+	int 	getRemoteSdpAudioPort (void);
+	char* 	getRemoteSdpAudioIp (void);
+	AudioCodec* getAudioCodec	(void);
+	void	setAudioCodec		(AudioCodec* ac);
+
+	inline void setStandBy (bool standby) { _standby = standby; }
+	inline bool getStandBy (void) { return _standby; }
 
 private:
-	void	alloc				(void);
-	void	dealloc				(void);
-		
+	void	alloc			(void);
+	void	dealloc			(void);
+	void 	noSupportedCodec(void);	
+	
+	CodecDescriptorVector* _cdv;
+	AudioCodec* _audiocodec;
+	
+	short 	_id;
+	int 	_cid;	// call id
+  	int 	_did;	// dialog id
+	bool	_standby;
+
+  	int  	_status_code;
+	
+	char*	_reason_phrase;
+  	char*	_textinfo;
+  	char*	_req_uri;
+  	char*	_local_uri;
+  	char*	_remote_uri;
+  	char*	_subject;
+	
+	char*	_remote_sdp_audio_ip;
+  	char*	_payload_name;
+	char*	_sdp_body;
+  	int  	_state;
+	int		_local_audio_port;
+  	int  	_remote_sdp_audio_port;
+	
 };
 
 #endif // __SIP_CALL_H__
diff --git a/src/sipvoiplink.cpp b/src/sipvoiplink.cpp
new file mode 100644
index 0000000000..b4e45e1b52
--- /dev/null
+++ b/src/sipvoiplink.cpp
@@ -0,0 +1,862 @@
+/**
+ *  Copyright (C) 2004-2005 Savoir-Faire Linux inc.
+ *  Author : Laurielle Lea <laurielle.lea@savoirfairelinux.com>
+ *                                                                              
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *                                                                              
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *                                                                              
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+#include <sys/time.h>
+
+#include <eXosip/eXosip.h>
+#include <osip2/osip.h>
+#include <osipparser2/osip_const.h>
+#include <osipparser2/osip_headers.h>
+#include <osipparser2/osip_body.h>
+
+#include <cc++/thread.h>
+#include <iostream>
+#include <string>
+#include <vector>
+
+#include "audio/audiortp.h"
+#include "call.h"
+#include "eventthread.h"
+#include "global.h"
+#include "manager.h"
+#include "sipcall.h"
+#include "sipvoiplink.h"
+#include "user_cfg.h"
+#include "voIPLink.h"
+ 
+using namespace ost;
+using namespace std;
+
+#define DEFAULT_SIP_PORT	5060
+#define RANDOM_SIP_PORT		rand() % 64000 + 1024
+#define	DEFAULT_LOCAL_PORT	10500
+#define	RANDOM_LOCAL_PORT	((rand() % 27250) + 5250)*2
+
+
+SipVoIPLink::SipVoIPLink (void) : VoIPLink ()
+{
+//	_evThread = new EventThread (this);
+	_sipcallVector = new SipCallVector();
+	_localPort = 0;
+	_manager = NULL;
+//	_audiortp = new AudioRtp(_manager);
+}
+
+SipVoIPLink::SipVoIPLink (short id, Manager* manager) : VoIPLink (id, manager)
+{
+	setId(id);
+	_localPort = 0;
+	_manager = manager;
+	_evThread = new EventThread (this);
+	_sipcallVector = new SipCallVector();
+	_audiortp = new AudioRtp(_manager);
+}
+
+SipVoIPLink::~SipVoIPLink (void)
+{
+	if (_evThread != NULL) {
+		delete _evThread;
+		_evThread = NULL;
+	}
+	delete _sipcallVector;
+	delete _audiortp;
+}
+
+int
+SipVoIPLink::init (void)
+{
+	string tmp;
+
+	tmp = string(PROGNAME) + "/" + string(VERSION);
+
+	// Set IP address
+	if (getLocalIp() == -1)
+		return -1;
+	
+	srand (time(NULL));
+	if (eXosip_init (NULL, NULL, DEFAULT_SIP_PORT) != 0) {
+		if (eXosip_init (NULL, NULL, RANDOM_SIP_PORT) != 0) {
+			_debug("Cannot init eXosip\n");
+			return -1;
+		}
+	}
+	// If use STUN server, firewall address setup
+	if (_manager->useStun()) {
+		eXosip_set_user_agent(tmp.data());
+		StunAddress4 stunSvrAddr;
+		stunSvrAddr.addr = 0;
+		
+		// Stun server
+		string svr = get_config_fields_str(SIGNALISATION, STUN_SERVER);
+		
+		// Convert char* to StunAddress4 structure
+		bool ret = stunParseServerName ((char*)svr.data(), stunSvrAddr);
+		if (!ret) {
+			_debug("SIP: Stun server address not valid\n");
+		}
+		
+		// Firewall address
+		_debug("STUN server: %s\n", svr.data());
+		_manager->getStunInfo(stunSvrAddr);
+		eXosip_set_firewallip((_manager->getFirewallAddress()).data());
+	} 
+	
+	eXosip_set_user_agent(tmp.data());
+	_evThread->start();
+	initRtpmapCodec();
+	return 1;
+}
+
+bool
+SipVoIPLink::isInRtpmap (int index, int payload, CodecDescriptorVector* cdv) {
+    for (int i = 0; i < index; i++) {
+        if (cdv->at(i)->getPayload() == payload) {
+            return true;
+        }
+    }
+    return false;
+}
+
+void
+SipVoIPLink::initRtpmapCodec (void)
+{
+	int payload;
+	unsigned int nb;
+	char rtpmap[128];
+	char tmp[64];
+
+	bzero(rtpmap, 128);
+	bzero(tmp, 64);
+	
+ 	/* reset all payload to fit application capabilities */
+  	eXosip_sdp_negotiation_remove_audio_payloads();
+	
+	// Set rtpmap according to the supported codec order
+	nb = _manager->getNumberOfCodecs();
+	for (unsigned int i = 0; i < nb; i++) {
+		payload = _manager->getCodecDescVector()->at(i)->getPayload();
+
+		// Add payload to rtpmap if it is not already added
+		if (!isInRtpmap(i, payload, _manager->getCodecDescVector())) {
+			snprintf(rtpmap, 127, "%d %s/%d", payload, 
+				_manager->getCodecDescVector()->at(i)->rtpmapPayload(payload).data(), 
+				SAMPLING_RATE);
+			snprintf(tmp, 63, "%d", payload);
+			
+			eXosip_sdp_negotiation_add_codec( osip_strdup(tmp), NULL,
+					   osip_strdup("RTP/AVP"), NULL, NULL, NULL, NULL,NULL,
+					   osip_strdup(rtpmap));
+		}
+	}
+}
+
+void
+SipVoIPLink::quit(void) 
+{
+	eXosip_quit();	
+}
+
+int
+SipVoIPLink::setRegister (void) 
+{
+	int reg_id = -1;
+
+	string proxy = "sip:" + get_config_fields_str(SIGNALISATION, PROXY);
+
+	string hostname = "sip:" + get_config_fields_str(SIGNALISATION, HOST_PART);
+	
+	string from = fromHeader(get_config_fields_str(SIGNALISATION, USER_PART), 
+							get_config_fields_str(SIGNALISATION, HOST_PART));
+
+	if (get_config_fields_str(SIGNALISATION, HOST_PART).empty()) {
+		_manager->error()->errorName(HOST_PART_FIELD_EMPTY, NULL);
+		return -1;
+	}
+	if (get_config_fields_str(SIGNALISATION, USER_PART).empty()) {
+		_manager->error()->errorName(USER_PART_FIELD_EMPTY, NULL);
+		return -1;
+	}
+
+	eXosip_lock();
+	if (setAuthentication() == -1) {
+		eXosip_unlock();
+		return -1;
+	}
+	
+	_debug("register From: %s\n", from.data());
+	if (!get_config_fields_str(SIGNALISATION, PROXY).empty()) {
+		reg_id = eXosip_register_init((char*)from.data(), (char*)proxy.data(), 
+				NULL);
+	} else {
+		reg_id = eXosip_register_init((char*)from.data(),(char*)hostname.data(),
+			   	NULL);
+	}
+	if (reg_id < 0) {
+		eXosip_unlock();
+		return -1;
+	}	
+	
+	// TODO: port SIP session timer dans config
+	int i = eXosip_register(reg_id, EXPIRES_VALUE);
+	if (i == -2) {
+		_debug("cannot build registration, check the setup\n"); 
+		eXosip_unlock();
+		return -1;
+	}
+	if (i == -1) {
+		_debug("Registration Failed\n");
+		eXosip_unlock();
+		return -1;
+	}
+	
+	eXosip_unlock();
+	return 0;
+}
+int
+SipVoIPLink::outgoingInvite (const string& to_url) 
+{
+	string from;
+	string to;
+
+	// Form the From header field basis on configuration panel
+	from = fromHeader(get_config_fields_str(SIGNALISATION, USER_PART),
+							get_config_fields_str(SIGNALISATION, HOST_PART));
+	
+	to = toHeader(to_url);
+
+	if (to.find("@") == string::npos and 
+			get_config_fields_int(SIGNALISATION, AUTO_REGISTER) == YES) {
+		to = to + "@" + get_config_fields_str(SIGNALISATION, HOST_PART);
+	}
+		
+	_debug("From: %s\n", from.data());
+	_debug("To: %s\n", to.data());
+
+	if (get_config_fields_str(SIGNALISATION, PROXY).empty()) {
+	// If no SIP proxy setting for direct call with only IP address
+		if (startCall(from, to, "", "") <= 0) {
+			_debug("Warning SipVoIPLink: call not started\n");
+			return -1;
+		}
+		return 0;
+	} else {
+	// If SIP proxy setting
+		string route = "<sip:" + 
+			get_config_fields_str(SIGNALISATION, PROXY) + ";lr>";
+		if (startCall(from, to, "", route) <= 0) {
+			_debug("Warning SipVoIPLink: call not started\n");
+			return -1;
+		}
+		return 0;
+	}
+}
+
+int
+SipVoIPLink::answer (short id) 
+{
+	int i;
+	char tmpbuf[64];
+	bzero (tmpbuf, 64);
+    // Get local port   
+    snprintf (tmpbuf, 63, "%d", getSipCall(id)->getLocalAudioPort());
+	
+	_debug("Answer call [id = %d, cid = %d, did = %d]\n", 
+			id, getSipCall(id)->getCid(), getSipCall(id)->getDid());
+	_debug("Local audio port: %d\n", getSipCall(id)->getLocalAudioPort());
+	
+	eXosip_lock();
+    i = eXosip_answer_call(getSipCall(id)->getDid(), 200, tmpbuf);
+	eXosip_unlock();
+
+	// Incoming call is answered, start the sound channel.
+	if (_audiortp->createNewSession (getSipCall(id)) < 0) {
+		_debug("FATAL: Unable to start sound (%s:%d)\n", __FILE__, __LINE__);
+		exit(1);
+	}
+	return i;
+}
+
+int
+SipVoIPLink::hangup (short id) 
+{
+	int i;
+	_debug("Hang up call [id = %d, cid = %d, did = %d]\n", 
+			id, getSipCall(id)->getCid(), getSipCall(id)->getDid());	
+	// Release SIP stack.
+	eXosip_lock();
+	i = eXosip_terminate_call (getSipCall(id)->getCid(), 
+								getSipCall(id)->getDid());
+	eXosip_unlock();
+
+	// Release RTP channels
+	_audiortp->closeRtpSession(getSipCall(id));
+				
+	deleteSipCall(id);
+	return i;
+}
+
+int
+SipVoIPLink::onhold (short id) 
+{
+	int i;
+	
+	eXosip_lock();
+	i = eXosip_on_hold_call(getSipCall(id)->getDid());
+	eXosip_unlock();
+
+	// Disable audio
+	_audiortp->closeRtpSession(getSipCall(id));
+	return i;
+}
+
+int
+SipVoIPLink::offhold (short id) 
+{
+	int i;
+	
+	eXosip_lock();
+	i = eXosip_off_hold_call(getSipCall(id)->getDid(), NULL, 0);
+	eXosip_unlock();
+
+	// Enable audio
+	if (_audiortp->createNewSession (getSipCall(id)) < 0) {
+		_debug("FATAL: Unable to start sound (%s:%d)\n", __FILE__, __LINE__);
+		exit(1);
+	}
+	return i;
+}
+
+int
+SipVoIPLink::transfer (short id, const string& to)
+{
+	int i;
+	string tmp_to;
+	to = toHeader(to);
+	if (to.find("@") == string::npos) {
+		tmp_to = to + "@" + get_config_fields_str(SIGNALISATION, HOST_PART);
+	}
+
+	eXosip_lock();
+	i = eXosip_transfer_call(getSipCall(id)->getDid(), (char*)tmp_to.data());
+	eXosip_unlock();
+	return i;
+}
+
+int
+SipVoIPLink::refuse (short id)
+{
+	int i;
+	char tmpbuf[64];
+	bzero (tmpbuf, 64);
+    // Get local port   
+    snprintf (tmpbuf, 63, "%d", getSipCall(id)->getLocalAudioPort());
+	
+	eXosip_lock();
+	i = eXosip_answer_call(getSipCall(id)->getDid(), BUSY_HERE, tmpbuf);
+	eXosip_unlock();
+	return i;
+}
+
+int
+SipVoIPLink::cancel (short id)
+{
+	int i;
+	eXosip_lock();
+    i = eXosip_terminate_call (getSipCall(id)->getCid(), 
+								getSipCall(id)->getDid());
+    eXosip_unlock();
+	return i;
+}
+
+int
+SipVoIPLink::getEvent (void)
+{
+	eXosip_event_t *event;
+	short id;
+	char *name;
+	static int countReg = 0;
+
+	event = eXosip_event_wait (0, 50);
+	//event = eXosip_event_get();
+	if (event == NULL) {
+		return -1;
+	}	
+	switch (event->type) {
+		// IP-Phone user receives a new call
+		case EXOSIP_CALL_NEW: //
+			// Set local random port for incoming call
+			setLocalPort(RANDOM_LOCAL_PORT);
+			
+			id = _manager->generateNewCallId();
+			_manager->pushBackNewCall(id, Incoming);
+			_debug("\nIncoming Call with identifiant %d [cid = %d, did = %d]\n",
+				   id, event->cid, event->did);
+			_debug("Local audio port: %d\n", _localPort);
+
+			// Display the callerId-name
+			osip_from_t *from;
+  			osip_from_init(&from);
+  			osip_from_parse(from, event->remote_uri);
+			name = osip_from_get_displayname(from);
+			_manager->displayTextMessage(id, name);
+			_manager->getCall(id)->setCallerIdName(name);
+			_debug("From: %s\n", name);
+			osip_from_free(from);
+			
+			getSipCall(id)->newIncomingCall(event);
+			_manager->incomingCall(id);
+
+			// Associate an audio port with a call
+			getSipCall(id)->setLocalAudioPort(_localPort);
+			
+			_manager->displayStatus(RINGING_STATUS);
+			break;
+
+		// The peer-user answers
+		case EXOSIP_CALL_ANSWERED: 
+			id = findCallId(event);
+			if (id == 0) {
+				id = findCallIdWhenRinging();
+			}
+			_debug("Call is answered [id = %d, cid = %d, did = %d]\n", 
+					id, event->cid, event->did);
+ 
+			// Answer
+			if (id > 0 and !_manager->getCall(id)->isOnHold()
+					   and !_manager->getCall(id)->isOffHold()) {
+				getSipCall(id)->setLocalAudioPort(_localPort);
+				getSipCall(id)->answeredCall(event);
+				_manager->peerAnsweredCall(id);
+
+				// Outgoing call is answered, start the sound channel.
+				if (_audiortp->createNewSession (getSipCall(id)) < 0) {
+					_debug("FATAL: Unable to start sound (%s:%d)\n", 
+							__FILE__, __LINE__);
+					exit(1);
+				}
+				_manager->displayStatus(CONNECTED_STATUS);
+			}
+			break;
+
+		case EXOSIP_CALL_RINGING:
+			id = findCallIdWhenRinging();
+			
+			_debug("Call is ringing [id = %d, cid = %d, did = %d]\n", 
+					id, event->cid, event->did);
+			
+			if (id > 0) {
+				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).
+		case EXOSIP_CALL_CLOSED:
+			id = findCallId(event);
+			_debug("Call is closed [id = %d, cid = %d, did = %d]\n", 
+					id, event->cid, event->did);	
+			
+			if (id > 0) {	
+				_manager->peerHungupCall(id);
+				_audiortp->closeRtpSession(getSipCall(id));
+				deleteSipCall(id);
+				_manager->displayStatus(HUNGUP_STATUS);
+			}	
+			break;
+
+		case EXOSIP_CALL_HOLD:
+			id = findCallId(event);
+			if (id > 0) {
+				getSipCall(id)->onholdCall(event);
+			}
+			break;
+
+		case EXOSIP_CALL_OFFHOLD:
+			id = findCallId(event);
+			if (id > 0) {
+				getSipCall(id)->offholdCall(event);
+			}
+			break;
+			
+		case EXOSIP_CALL_REQUESTFAILURE:
+			id = findCallId(event);
+
+			// Handle 4XX errors
+			switch (event->status_code) {
+				case AUTH_REQUIRED:
+					if (setAuthentication() == -1) {
+						break;
+					}
+					eXosip_lock();
+					eXosip_retry_call (event->cid);
+					eXosip_unlock();
+					break;
+				case FORBIDDEN:
+				case NOT_FOUND:
+				case REQ_TIMEOUT:
+				case ADDR_INCOMPLETE:
+					// Faire remonter l'erreur
+					_manager->displayError(event->reason_phrase);
+					_manager->congestion(true);
+					break;
+				case REQ_TERMINATED:
+					break;
+				default:
+					break;
+			}
+			break; 
+
+		case EXOSIP_CALL_SERVERFAILURE:
+			// Handle 5XX errors
+			switch (event->status_code) {
+				case SERVICE_UNAVAILABLE:
+					_manager->ringback(false);
+					_manager->congestion(true);					
+					break;
+				default:
+					break;
+			}
+			break;
+
+		case EXOSIP_CALL_GLOBALFAILURE:
+			// Handle 6XX errors
+			break;
+
+		case EXOSIP_REGISTRATION_SUCCESS:
+			_debug("-- Registration succeeded --\n");
+			_manager->displayStatus(LOGGED_IN_STATUS);
+			break;
+
+		case EXOSIP_REGISTRATION_FAILURE:
+			if (countReg <= 3) { 
+				setRegister();
+				countReg++;
+			}
+			break;
+
+		case EXOSIP_OPTIONS_NEW:
+			/* answer the OPTIONS method */
+			/* 1: search for an existing call */
+			unsigned int k;
+				
+			for (k = 0; k < _sipcallVector->size(); k++) {
+				if (_sipcallVector->at(k)->getCid() == event->cid) { 
+					break;
+				}
+			}
+		
+			// TODO: Que faire si rien trouve??
+			eXosip_lock();
+			if (_sipcallVector->at(k)->getCid() == event->cid) {
+				/* already answered! */
+			}
+			else if (k == _sipcallVector->size()) {
+				/* answer 200 ok */
+				eXosip_answer_options (event->cid, event->did, 200);
+			} else {
+				/* answer 486 ok */
+				eXosip_answer_options (event->cid, event->did, 486);
+			}
+			eXosip_unlock();
+			break;
+
+		case EXOSIP_OPTIONS_ANSWERED:
+			break;
+
+		case EXOSIP_OPTIONS_PROCEEDING:
+			break;
+
+		case EXOSIP_OPTIONS_REDIRECTED:
+			break;
+
+		case EXOSIP_OPTIONS_REQUESTFAILURE:
+			break;
+
+		case EXOSIP_OPTIONS_SERVERFAILURE:
+			break;
+
+		case EXOSIP_OPTIONS_GLOBALFAILURE:
+			break;
+
+		case EXOSIP_SUBSCRIPTION_NOTIFY:
+			break;
+
+		default:
+			return -1;
+			break;
+	}
+	eXosip_event_free(event);
+ 	
+    return 0;
+}
+
+int
+SipVoIPLink::getLocalPort (void) 
+{
+	return _localPort;
+}
+
+void
+SipVoIPLink::setLocalPort (int port) 
+{
+	_localPort = port;
+}
+
+void
+SipVoIPLink::carryingDTMFdigits (short id, char code) {
+	  int duration = get_config_fields_int(SIGNALISATION, PULSE_LENGTH);
+      
+	  static const int body_len = 128;
+
+      char *dtmf_body = new char[body_len];
+	  snprintf(dtmf_body, body_len - 1,
+			  "Signal=%c\r\nDuration=%d\r\n",
+			  code, duration);
+
+      eXosip_lock();
+      eXosip_info_call(getSipCall(id)->getDid(), "application/dtmf-relay", 
+			  dtmf_body);
+      eXosip_unlock();
+	
+	  delete[] dtmf_body;
+}
+ 
+void
+SipVoIPLink::newOutgoingCall (short callid)
+{
+	_sipcallVector->push_back(new SipCall(callid, 
+										  _manager->getCodecDescVector()));
+	if (getSipCall(callid) != NULL) {
+		getSipCall(callid)->setStandBy(true);
+	}
+}
+
+void
+SipVoIPLink::newIncomingCall (short callid)
+{
+	SipCall* sipcall = new SipCall(callid, _manager->getCodecDescVector());
+	_debug("new SipCall @ 0X%d\n", sipcall);
+	_sipcallVector->push_back(sipcall);
+}
+
+void
+SipVoIPLink::deleteSipCall (short callid)
+{
+	unsigned int i = 0;
+	while (i < _sipcallVector->size()) {
+		if (_sipcallVector->at(i)->getId() == callid) {
+			_sipcallVector->erase(_sipcallVector->begin()+i);
+	//		delete getSipCall(callid);	
+			return;
+		} else {
+			i++;
+		}
+	}
+}
+
+SipCall*
+SipVoIPLink::getSipCall (short callid)
+{
+	for (unsigned int i = 0; i < _sipcallVector->size(); i++) {
+		if (_sipcallVector->at(i)->getId() == callid) {
+			return _sipcallVector->at(i);
+		} 
+	}
+	return NULL;
+}
+
+AudioCodec*
+SipVoIPLink::getAudioCodec (short callid)
+{
+	return getSipCall(callid)->getAudioCodec();
+}
+///////////////////////////////////////////////////////////////////////////////
+// Private functions
+///////////////////////////////////////////////////////////////////////////////
+
+int 
+SipVoIPLink::getLocalIp (void) 
+{
+	char* myIPAddress;
+	if (getLocalIpAddress().empty()) {
+		myIPAddress = new char[64];
+	}
+	int ret = eXosip_guess_localip (2, myIPAddress, 64);
+	setLocalIpAddress(string(myIPAddress));
+
+	return ret;
+}
+
+int
+SipVoIPLink::checkUrl (const string& url)
+{
+  	int i;
+	
+  	osip_from_t *to;
+  	i = osip_from_init(&to);
+  	if (i != 0) {
+		_debug("Warning: Cannot initialize\n");
+		return -1;
+	}
+  	i = osip_from_parse(to, url.data());
+  	if (i != 0) {
+		_debug("Warning: Cannot parse url\n");
+		return -1;
+	}
+
+	// Free memory
+	osip_from_free (to);
+  	return 0;
+}
+
+int
+SipVoIPLink::setAuthentication (void) 
+{
+	string login, pass, realm;
+	login = get_config_fields_str(SIGNALISATION, AUTH_USER_NAME);
+	if (login.empty()) {
+		login = get_config_fields_str(SIGNALISATION, USER_PART);
+	}
+	pass = get_config_fields_str(SIGNALISATION, PASSWORD);
+	if (pass.empty()) {
+		_manager->error()->errorName(PASSWD_FIELD_EMPTY, NULL);				
+		return -1;
+	}
+
+#if 0
+	if (_manager->useStun()) {
+		realm = get_config_fields_str(SIGNALISATION, HOST_PART);
+	} else {
+		if (!get_config_fields_str(SIGNALISATION, PROXY).empty()) {
+			realm = get_config_fields_str(SIGNALISATION, PROXY);
+		} else {
+			realm = get_config_fields_str(SIGNALISATION, HOST_PART);
+		}
+	}
+#endif
+
+	if (eXosip_add_authentication_info(login.data(), login.data(), 
+		pass.data(), NULL, NULL) != 0) {
+		_debug("No authentication\n");
+		return -1;
+	}
+	return 0;
+}
+
+string
+SipVoIPLink::fromHeader (const string& user, const string& host) 
+{
+	string displayname = get_config_fields_str(SIGNALISATION, FULL_NAME);
+	return ("\"" + displayname + "\"" + " <sip:" + user + "@" + host + ">");
+}
+
+
+string
+SipVoIPLink::toHeader(const string& to) 
+{
+	if (to.find("sip:") == string::npos) {
+		return ("sip:" + to );
+	} else {
+		return to;
+	}
+}
+
+int
+SipVoIPLink::startCall (const string& from, const string& to, 
+							const string& subject,  const string& route) 
+{
+  	osip_message_t *invite;
+  	int i;
+
+  	if (checkUrl(from) != 0) {
+		_manager->error()->errorName(FROM_ERROR, NULL);
+    	return -1;
+  	}
+  	if (checkUrl(to) != 0) {
+		_manager->error()->errorName(TO_ERROR, NULL);
+    	return -1;
+  	}
+  	
+	i = eXosip_build_initial_invite(&invite,(char*)to.data(),(char*)from.data(),
+		   						(char*)route.data(), (char*)subject.data());	
+  	if (i != 0) {
+		return -1;
+    }
+  	
+	eXosip_lock();
+	
+	char port[64];
+	if (!_manager->useStun()) {
+		// Set random port for outgoing call
+		setLocalPort(RANDOM_LOCAL_PORT);
+		_debug("Local audio port: %d\n",_localPort);
+
+		bzero (port, 64);
+		snprintf (port, 63, "%d", getLocalPort());
+		
+  		i = eXosip_initiate_call (invite, NULL, NULL, port);
+		
+	} else {
+		// If use Stun server
+		bzero (port, 64);
+		snprintf (port, 63, "%d", _manager->getFirewallPort());
+		
+		i = eXosip_initiate_call(invite, NULL, NULL, port);
+
+		_debug("sip invite: firewall port = %s\n", port);
+	}
+
+	if (i <= 0) {
+		eXosip_unlock();
+		return -1;
+	}
+
+	eXosip_unlock();
+  	return i;	
+}
+
+short
+SipVoIPLink::findCallId (eXosip_event_t *e)
+{
+	unsigned int k;
+	
+	for (k = 0; k < _sipcallVector->size(); k++) {
+		if (_sipcallVector->at(k)->getCid() == e->cid and
+				_sipcallVector->at(k)->getDid()	== e->did) {
+			return _sipcallVector->at(k)->getId();
+		}
+    }
+	return 0;
+}
+
+short
+SipVoIPLink::findCallIdWhenRinging (void)
+{
+	unsigned int k;
+	
+	for (k = 0; k < _sipcallVector->size(); k++) {
+		if (_sipcallVector->at(k)->getStandBy()) {
+			return _sipcallVector->at(k)->getId();
+		}
+    }
+	return 0;
+}
diff --git a/src/sipvoiplink.h b/src/sipvoiplink.h
new file mode 100644
index 0000000000..deeca33368
--- /dev/null
+++ b/src/sipvoiplink.h
@@ -0,0 +1,124 @@
+/**
+ *  Copyright (C) 2004-2005 Savoir-Faire Linux inc.
+ *  Author : Laurielle Lea <laurielle.lea@savoirfairelinux.com>
+ *                                                                              
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *                                                                              
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *                                                                              
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef __SIP_VOIP_LINK_H__
+#define __SIP_VOIP_LINK_H__
+
+#include <eXosip/eXosip.h>
+
+#include <string>
+#include <vector>
+
+#include "audio/audiocodec.h"
+#include "audio/codecDescriptor.h"
+#include "voIPLink.h"
+
+using namespace std;
+
+#define EXPIRES_VALUE	3600
+// 1XX responses
+#define DIALOG_ESTABLISHED 101
+// 4XX Errors
+#define	FORBIDDEN		403
+#define NOT_FOUND		404
+#define AUTH_REQUIRED	407
+#define REQ_TIMEOUT		408
+#define	ADDR_INCOMPLETE	484
+#define	BUSY_HERE		486
+#define	REQ_TERMINATED	487
+// 5XX errors
+#define SERVICE_UNAVAILABLE	503
+
+class AudioCodec;
+class AudioRtp;
+class EventThread;
+class Manager;
+class SipCall;
+
+typedef vector<SipCall*, allocator<SipCall*> > SipCallVector;
+typedef vector<CodecDescriptor*, allocator<CodecDescriptor*> > CodecDescriptorVector;
+
+class SipVoIPLink : public VoIPLink {
+public:
+	SipVoIPLink (void);
+	SipVoIPLink (short id, Manager* manager);
+	virtual ~SipVoIPLink (void);
+	
+	virtual int init (void);
+	virtual void initRtpmapCodec (void);
+	virtual void quit (void);
+	virtual int setRegister (void);
+	virtual int outgoingInvite (const string& to_url);	
+	virtual int answer (short id);
+	virtual int hangup (short id);
+	virtual int onhold (short id);
+	virtual int offhold (short id);
+	virtual int transfer (short id, const string& to);
+	virtual int refuse (short id);	
+	virtual int cancel (short id);	
+	virtual int getEvent (void);
+	virtual void carryingDTMFdigits (short id, char code);
+	
+	int	getLocalPort (void);
+	void setLocalPort (int);
+
+	/*
+	 * Add a new SipCall at the end of the SipCallVector with identifiant 'id'
+	 */
+	void newOutgoingCall(short callid);
+	void newIncomingCall(short callid);
+
+	/*
+	 * Erase the call(id) from the SipCallVector
+	 * and delete this call
+	 */
+	void deleteSipCall(short callid);
+	
+	/*
+	 * Return a pointer to the SipCall with identifiant 'id'
+	 */
+	SipCall* getSipCall(short callid);
+
+	AudioCodec* getAudioCodec(short callid);
+	
+private:
+	int getLocalIp (void);
+	int checkUrl(const string& url);
+	int setAuthentication (void);
+	string fromHeader (const string& user, const string& host);
+	string toHeader(const string& to);
+	int startCall (const string& from, const string& to, 
+			const string& subject, const string& route);
+	/*
+	 * Look for call with same cid/did 
+	 * Return the id of the found call
+	 */
+	short findCallId (eXosip_event_t *e);
+	short findCallIdWhenRinging (void);
+	bool isInRtpmap (int index, int payload, CodecDescriptorVector* cdv);
+	
+	Manager* 		_manager;
+	EventThread* 	_evThread;
+	SipCallVector* 	_sipcallVector;
+	AudioRtp* 		_audiortp;
+	int 			_localPort;
+	
+};
+
+#endif // __SIP_VOIP_LINK_H__
diff --git a/src/skin.cpp b/src/skin.cpp
index 20c5383306..eb02d22bd2 100644
--- a/src/skin.cpp
+++ b/src/skin.cpp
@@ -1,5 +1,5 @@
 /**
- *  Copyright (C) 2004 Savoir-Faire Linux inc.
+ *  Copyright (C) 2004-2005 Savoir-Faire Linux inc.
  *  Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com>
  *                                                                              
  *  This program is free software; you can redistribute it and/or modify
@@ -17,7 +17,6 @@
  *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-#include <qstring.h>
 
 #include "global.h"
 #include "skin.h"
@@ -47,33 +46,33 @@ Skin::Skin (void) {
 Skin::~Skin (void) {
 }
 
-QString 
-Skin::getPath (const QString & prefix, const QString & progname, 
-	const QString & skindir, const QString & skin, 
-	const QString & filename) {
+string 
+Skin::getPath (const string & prefix, const string & progname, 
+	const string & skindir, const string & skin, 
+	const string & filename) {
 	return (prefix + "/" + progname + "/" + skindir + "/" + skin + "/" + 
 		filename);
 }
 
-QString 
-Skin::getPath (const QString & skindir, const QString & skintype, 
-	const QString & filename) {
-	return (QString(PROGSHAREDIR) + "/" + skindir + "/" + skintype + "/" + filename);
+string 
+Skin::getPath (const string & skindir, const string & skintype, 
+	const string & filename) {
+	return (string(PROGSHAREDIR) + "/" + skindir + "/" + skintype + "/" + filename);
 }
 		
-QString 
-Skin::getPath (const QString & dir) {
-	return (QString(PROGSHAREDIR) + "/" + dir);
+string 
+Skin::getPath (const string & dir) {
+	return (string(PROGSHAREDIR) + "/" + dir);
 }
 
-QString 
-Skin::getPathPixmap (const QString & pixdir, const QString & filename) {
-	return (QString(PROGSHAREDIR) + "/" + pixdir + "/" + filename);
+string 
+Skin::getPathPixmap (const string & pixdir, const string & filename) {
+	return (string(PROGSHAREDIR) + "/" + pixdir + "/" + filename);
 }
 
-QString 
-Skin::getPathRing (const QString & ringdir, const QString & filename) {
-	return (QString(PROGSHAREDIR) + "/" + ringdir + "/" + filename);
+string 
+Skin::getPathRing (const string & ringdir, const string & filename) {
+	return (string(PROGSHAREDIR) + "/" + ringdir + "/" + filename);
 }
 
 // EOF
diff --git a/src/skin.h b/src/skin.h
index bb175e2a1f..025a0bcfbd 100644
--- a/src/skin.h
+++ b/src/skin.h
@@ -1,5 +1,5 @@
 /**
- *  Copyright (C) 2004 Savoir-Faire Linux inc.
+ *  Copyright (C) 2004-2005 Savoir-Faire Linux inc.
  *  Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com>
  *                                                                              
  *  This program is free software; you can redistribute it and/or modify
@@ -20,6 +20,8 @@
 #ifndef __SKIN_H__
 #define __SKIN_H__
 
+#include <string>
+
 #include "global.h"
 
 #ifdef __cplusplus
@@ -98,18 +100,19 @@ extern const char* PIXMAP_LINE_NAMES[];
 }
 #endif
 
+using namespace std;
 
 class Skin {
 public:
 	Skin (void);
 	~Skin (void);
 	
-	static QString getPath(const QString &, const QString &, const QString &, 
-						const QString &, const QString &);
-	static QString getPath(const QString &,const QString &, const QString &);
-	static QString getPath(const QString &);
-	static QString getPathPixmap (const QString &, const QString &);
-	static QString getPathRing	 (const QString &, const QString &);
+	static string getPath(const string &, const string &, const string &, 
+						const string &, const string &);
+	static string getPath(const string &,const string &, const string &);
+	static string getPath(const string &);
+	static string getPathPixmap (const string &, const string &);
+	static string getPathRing	 (const string &, const string &);
 };
 
 #endif	// __SKIN_H__
diff --git a/src/user_cfg.h b/src/user_cfg.h
new file mode 100644
index 0000000000..c0d6701cd7
--- /dev/null
+++ b/src/user_cfg.h
@@ -0,0 +1,106 @@
+/**
+ *  Copyright (C) 2004-2005 Savoir-Faire Linux inc.
+ *  Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *                                                                                 
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef __USER_CFG_H__
+#define __USER_CFG_H__
+
+#define ALSA 	1
+#define OSS 	1
+#define QT_GUI 	1
+
+#include <stdlib.h>
+
+#include "configuration.h"
+
+#define fill_config_fields_str(main_menu, value, default_value)	\
+	(Config::get(string(main_menu), string(value), string(default_value)))
+
+#define fill_config_fields_int(main_menu, value, default_value)	\
+	(Config::get(string(main_menu), string(value), default_value))
+
+#define get_config_fields_str(main_menu, value)	\
+	(Config::gets(string(main_menu), string(value)))
+
+#define get_config_fields_int(main_menu, value)	\
+	(Config::geti(string(main_menu), value))
+
+// Home directory
+#define HOMEDIR	(getenv ("HOME"))
+
+// Main menu
+#define SIGNALISATION	"VoIPLink"
+#define AUDIO			"Audio"
+#define VIDEO			"Video"
+#define NETWORK			"Network"
+#define PREFERENCES		"Preferences"
+
+// Fields to fill
+#define VOIP_LINK_ID	"VoIPLink.index"
+#define FULL_NAME		"SIP.fullName"
+#define USER_PART		"SIP.userPart"
+#define AUTH_USER_NAME	"SIP.username"
+#define PASSWORD		"SIP.password"
+#define HOST_PART		"SIP.hostPart"
+#define PROXY			"SIP.proxy"
+#define AUTO_REGISTER	"SIP.autoregister"
+#define PLAY_TONES		"DTMF.playTones"
+#define PULSE_LENGTH	"DTMF.pulseLength"
+#define SEND_DTMF_AS	"DTMF.sendDTMFas"
+#define STUN_SERVER		"STUN.STUNserver"
+#define USE_STUN		"STUN.useStun"
+#define DRIVER_NAME		"Drivers.driverName"
+#define NB_CODEC		"Codecs.nbCodec"
+#define CODEC1			"Codecs.codec1"
+#define CODEC2			"Codecs.codec2"
+#define CODEC3			"Codecs.codec3"
+#define CODEC4			"Codecs.codec4"
+#define CODEC5			"Codecs.codec5"
+#define RING_CHOICE		"Rings.ringChoice"
+#define VOLUME_SPKR_X	"Volume.speakers_x"
+#define VOLUME_SPKR_Y	"Volume.speakers_y"
+#define VOLUME_MICRO_X	"Volume.micro_x"
+#define VOLUME_MICRO_Y	"Volume.micro_y"
+#define SKIN_CHOICE		"Themes.skinChoice"
+#define CONFIRM_QUIT	"Options.confirmQuit"
+#define ZONE_TONE		"Options.zoneToneChoice"
+#define CHECKED_TRAY	"Options.checkedTray"
+#define VOICEMAIL_NUM	"Themes.voicemailNumber"
+
+// Default values
+#define DFT_VOIP_LINK		0	// index of the first VoIP link by default
+#define EMPTY_FIELD			""
+#define	YES					1
+#define	NO					0
+#define DFT_PULSE_LENGTH	250
+#define SIP_INFO			0
+#define DFT_STUN_SERVER 	"stun.fwdnet.net:3478"
+#define DFT_DRIVER			OSS_DRIVER	
+#define DFT_NB_CODEC		3
+#define DFT_CODEC			"G711u"
+#define DFT_VOL_SPKR_X		365
+#define DFT_VOL_SPKR_Y		100
+#define DFT_VOL_MICRO_X		347
+#define DFT_VOL_MICRO_Y		100	
+#define DFT_RINGTONE 		"konga.ul"
+#define DFT_SKIN 			"metal"
+#define DFT_ZONE			"North America"
+#define DFT_VOICEMAIL 		"888"
+
+
+#endif // __USER_CFG_H__
diff --git a/src/voIPLink.cpp b/src/voIPLink.cpp
new file mode 100644
index 0000000000..e84c2a2481
--- /dev/null
+++ b/src/voIPLink.cpp
@@ -0,0 +1,114 @@
+/**
+ *  Copyright (C) 2005 Savoir-Faire Linux inc.
+ *  Author : Laurielle Lea <laurielle.lea@savoirfairelinux.com>
+ *                                                                              
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *                                                                              
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *                                                                              
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <string>
+
+#include "user_cfg.h"
+#include "voIPLink.h"
+
+
+using namespace std;
+
+VoIPLink::VoIPLink (void) 
+{
+	_id = 1;
+	_manager = NULL;
+	initConstructor();
+}
+
+VoIPLink::VoIPLink (short id, Manager* manager) 
+{
+	_id = id;
+	_manager = manager;
+	initConstructor();
+}
+
+VoIPLink::~VoIPLink (void) 
+{
+
+}
+
+void
+VoIPLink::setId (short id) 
+{
+	_id = id;
+}
+
+short
+VoIPLink::getId (void)
+{
+	return _id;
+}
+
+void
+VoIPLink::setType (VoIPLinkType type) 
+{
+	_type = type;
+}
+
+VoIPLinkType
+VoIPLink::getType (void)
+{
+	return _type;
+}
+
+void 
+VoIPLink::setFullName (const string& fullname)
+{
+	_fullname = fullname;
+}
+
+string 
+VoIPLink::getFullName (void)
+{
+	return _fullname;
+}
+
+void 
+VoIPLink::setHostName (const string& hostname)
+{
+	_hostname = hostname;
+}
+
+string 
+VoIPLink::getHostName (void)
+{
+	return _hostname;
+} 
+
+void 
+VoIPLink::setLocalIpAddress (const string& ipAdress)
+{
+	_localIpAddress = ipAdress;
+}
+
+string 
+VoIPLink::getLocalIpAddress (void)
+{
+	return _localIpAddress;
+} 
+
+void
+VoIPLink::initConstructor(void)
+{
+	_type = Sip;
+	_fullname = get_config_fields_str(SIGNALISATION,FULL_NAME);
+	_hostname = get_config_fields_str(SIGNALISATION,HOST_PART);
+	_localIpAddress = "";
+}
diff --git a/src/voIPLink.h b/src/voIPLink.h
new file mode 100644
index 0000000000..362d6abc1d
--- /dev/null
+++ b/src/voIPLink.h
@@ -0,0 +1,86 @@
+/**
+ *  Copyright (C) 2005 Savoir-Faire Linux inc.
+ *  Author : Laurielle Lea <laurielle.lea@savoirfairelinux.com>
+ *                                                                              
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *                                                                              
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *                                                                              
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef __VOIP_LINK_H__
+#define __VOIP_LINK_H__
+
+#include <string>
+#include "audio/audiocodec.h"
+
+using namespace std;
+
+enum VoIPLinkType {
+	Sip = 0,
+	Iax
+};
+
+class Call;
+class Manager;
+class VoIPLink {
+public:
+	VoIPLink (void);
+	VoIPLink (short id, Manager* manager);
+	virtual ~VoIPLink (void);
+
+	virtual int getEvent (void) = 0;
+	virtual int init (void) = 0;
+	virtual void initRtpmapCodec (void) = 0;
+	virtual void quit (void) = 0;
+	virtual void newOutgoingCall (short callid) = 0;
+	virtual void newIncomingCall (short callid) = 0;
+	virtual void deleteSipCall (short callid) = 0;
+	virtual int outgoingInvite (const string& to_url) = 0;
+	virtual int answer (short id) = 0;
+	virtual int hangup (short id) = 0;
+	virtual int onhold (short id) = 0;
+	virtual int offhold (short id) = 0;
+	virtual int transfer (short id, const string& to) = 0;
+	virtual int refuse (short id) = 0;
+	virtual int cancel (short id) = 0;
+	virtual int setRegister (void) = 0;
+	virtual void carryingDTMFdigits(short id, char code) = 0;
+
+	virtual AudioCodec* getAudioCodec (short callid) = 0;
+	
+	void setId (short id);
+	short getId (void);
+	void setType (VoIPLinkType type);
+	VoIPLinkType getType (void);
+	void setFullName (const string& fullname);
+	string getFullName (void);
+	void setHostName (const string& hostname);
+	string getHostName (void);
+	void setLocalIpAddress (const string& ipAdress);
+	string getLocalIpAddress (void);
+
+	
+protected:
+
+private:
+	void initConstructor(void);
+	
+	Manager* _manager;
+	short _id;
+	VoIPLinkType _type;
+	string _fullname;
+	string _hostname;
+	string _localIpAddress;
+};
+
+#endif // __VOIP_LINK_H__
diff --git a/stund/client b/stund/client
index 3df9eb511fe93a26e2a706ec1b75bc6403c2a36a..7a2ed7846fb75a5434f69c417c2f007572411965 100755
GIT binary patch
delta 108755
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
Y?)7X_1_FAT9-G8m`Dj_wrrZnve;1{AmH+?%

delta 108771
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%0A@~z}}G~
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

diff --git a/stund/server b/stund/server
index 13a3a0586404eb0fc6d98fc8950e3cad95be9ba9..ad65a85d87bfd058ede3b75d283fcd1912e82d19 100755
GIT binary patch
delta 104180
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%0A2urF0pqu*b<m
zl&)nDIywmT{nuH4Oj7LjQ{P|5#-Xt`f^)O{8`!#I4nov#WD9H8a3JdZn^;MZt;bJ_
z_S?XzZ!AnvwBIZrb`WJuuTR+m*pr5>6}3)fv7-UuCK}-Xr;YGJt|C&H%(lU4gxFG;
z&B~v05R$?ib_eaS^H4Nc!PcC$ky_b|!oe!`{Vpey3I~3PkES^YNoO@yW}WB=>72ww
zhxz|uOJ@t40Q)w*G;qAlmb`CBiqq2B%|4%Opa?y1yu&=7n{rw@dsxqG2O;U~We3g~
zL`Q>tY+vvdW674zLAD5DHaek!;}E@9%|JA89A=4S3v<;9!#N&d1+P1hR?{)&Z)IxK
z1Iqhs!chlN14>o@aaO;C15x-m!Fu{awRVz~mc=^bzaqP2wa%h?zj>g})(|P?b9VZK
zgOFgpV2|Dj5ljon!B+yKD+y-#OgurN5-j4M>c?{tTYSJ&?XQu0Iu{Nhbl8YyJ3GG4
z(og!^L&#3n7pBy|y>Ne!<`DZ?nbr<MqA6hh-3~&c`G8&A=OCn+Gi>$>2T_`lExU*)
zwp(U)F_Vf*Y&zUhR2$#0v5pX)(b~AdMszhSxU@EIvKt`Ab{9=5Zm}ybIS6UvTUPde
zv~in>PmCcmskqDDLzg!~AZ`4_uAtopB5mAbH)UE^Q9hgoiGQ<aW&f@sAyKXKwHrY!
z|Hje|hqC-T{)@J?tC=@gd>lHKU4mi<;~5`02*nP;`5Xr!CAj$E6bB(Cgz<WVLzHj>
zB>T4S0Ap$neo6Yf(Y&F3H{8r#BL{U8$peVUJ1n81Wnq%3s3jtQU?<u;2od>!U7qeB
zMC3zu?u>&_=YPz8MPqF{)cNrYwtU#l@cJ~5gA0rDT9V7D#;K8-S1+Hr*FZL}KHg@W
zDX05<6mL4*L5SCAzI}*6bf1sm69dLjce~GH1!;uA?BSw3PhV3A5wCIl0Ir}6)zs(X
z`96#jHl+J}McjA$v%5%Wed~~^SdSoy{5}umyE1>Psgs9B5I-MZWKy6mzLI&Y9NGhO
zjF~|vD-m6vKL$ItJc#H9`~nLhdfHA9{XAw7MD!=}T#v%}K{$FO^OV5Wipo=2)=1V<
zRB7-8y6C4VClSQ*#QqLKA}GVZui+phf@-|B%<3r;ym6V%0phtf|5UE(i6H;))2PAU
zkn1U5BYteOX}X>tH0Og6(X=1!Am4(Yg*6S?LH>FE`$$tx6W)^lecVBa@K!t%XJd<r
z<_E3$iR6vOl1+FA-U}m?&6}R`b>#Io6+%8aq8F9~^n_~dTsc$a@?N-B>)zX#&!G!~
z?!3x02ceGLgRkivN_0<NVx5zRh|b}ug`Ins{0o*l4uarpKB;pL;dc)>2ys4?_u1?q
z#Q8A()(at=$AVGcO@w~jR2kG;#F;C=Hxam)XFIl5RB^SxMy~4(z7tSIRe&aXx8);}
z9EA98&r9Rd(9T1A_u(t$<KChkyDt5Gz-~)~PUatFvpbsCEu3`I5I%vgXkq*que<X^
z9)w3i*qy|uXFDfHVfsb>OyTJgyOa5hSd&M0=PA5PP#8-#yEA!`1KHhq7T=a=a#_Qu
zJJ05Q5f_aHs5|2WRLvYncjvkM3(OE~TIiZ^9&ftdL6ihq_~-LcV;zVzuz;^@5UPQN
z{JRBC9@4-n-eRMJ?2@bdit3FYVOX>)BgWV8iXI0c#@F&l#DyX=!Tn&<Hy!1`ILpNU
zCD+IbnIa~}p7dqBiz8<I9?Ju=L#8O}rM^9lj~J%^sjdRNoSunGkSHlL(UUtMFr{f(
zP)}aLo5*vS;Q9ud%={Z|t~c==@U-3Ai0iHVZ_EX>SM8p>jYritklmBFbM@~Q`$UQB
z9eif4gAms{dF2lbqPgD12lNCP+PKa2K3)tH8^a<E$#{Kp<3fnI-p?~I;G0~;^?Upi
zXN<AXxj*hFs+ZqZ=zgN{FdxvjkVg4z7XBMqVzy~j4$bjD;)7>72#wPp^N2+b0zp~+
zPx+#)4noA9<+BPqHxYY|4>=V=Y$q`1D~$_l3g2-Z@y<LX<kl?V1II_RXt@4YmZ;Ka
z{bJkzM(j78csHNk%|WOW@8J=X9fUgZ`}~Jb9E3*h6TE$49vZn%@tLwmf6*W~Y=dI`
zbDQ-q_}SX#Y;^p-%sV-Qs@=oC=4%n;waabRukf!5hb&_KDzB1iEa^-3YrOqHgJ{;T
z^J&R18%s9pxA{2?hlWpL{X72ar-hJDHpzxsr;dU1f8-xS4@JB1U7lP>B1Q3^crJpN
zorkEu#|IxPq#ixq|1-b8%E?1L_#t0a#X(36kNEyq9VAKK$`+-XZG6K)h<ZG<_@;vp
z^?&pF^+Kq>2cmuNK_Eo^6Rb2CAWEB1KItHE&vb09s2eKJ8ksjhM77>D)Uu|iK5I|S
z|BoN}$VTj``3+v_O9vrc+~ViaeW+A6BVFL(eR+NWLO?t8Q2PLdfCqe`49kI2*HE~3
z2|bvHiTj<**=R8o6LD<~6HRouFD^D5HBd=CD=#6IoiXL~VE&9aSJ^=*1VoD8Qw*ZT
z@T|BL>~1XCVu%sX>^G1d?n{X-JqjTT0kPt%=L;bU0j0$_bR1hnI^35P2iut%^%Yw=
zQEP;QD6Itj<;4<Ap^J(oPSn~FDwcTBVUd%E#F8YI7fOS~QbU|Yud(e=<ftj$UF{$g
zIckgd`a1~8C%KL|y32t`KYnoxYA7-$EI`uN`LL~@yYkY&!n*^$BT7D{v9+S6sVw$D
zLAV(x!o}$}co$3&HF-q8I2*Cm<Q2cfI|!*MO60=FRLWLUf{4PXM~JyQkSK<|?_{Dd
zQ$=h?D6)%@)~aD`=B7dB0-=GJk!4O;ORTYYcA;S|LrbiQ7z6caGQC=286pEA-u5rW
zo2KIEAqOFe1;maRgJ_906B8kOZOB|8v=-M(8_bqi8_~RFAw&{uD{AHyLL{+v;t|vn
zBC!|5Mfv7noEwFiPU2wAP~~(M=UbZ=>3<nyiofPL2q~wZ*ax>3RZf=JyUamIIoYDF
z&p}8z0|Z~=Aiu`vBBtet)%hXHNrWzZKOa@fk$FRCHnDsNjWpYah$_J?7w`&sr3zaE
zEyUZ!9E3E`QXEC6vhz?x=_aQ4cMuwBdWcT#9fTy%OJuKf5RyP2vEa0gSkJgrvm#xI
zvcpi}4L(NrWd5Oc02(I7ernE2t7D8vM@Z66FQwIyC*F0Ypl+>>v7$^JQ%(n<e6g&m
zgOEDL35F1={jAk7UR-Ok#~9}$atFbQQ^dh42AYj$l}FHkG*!%T8}w_Sde%8jRF?6>
zM0q_l%@h%Ewap{VE@z7;a~*_+rkBKnFC2t4Ggs8x9IBalqNdBqL(yi1I6lfjNHZ%%
zBrb4_W`a<if0ant?m#3ODHb{1A%{fsn#jk@!!AbAX0>R5cv~deoWMZoTXtM&rk7=@
zHyyS+fdq?CU*o|?nXtuMfYfn2)BsO(4jc|WP&io~DYnY&;byWrQ49nXIm)7%tS%ca
zswXz+;~=D>C8B?ZgOG}riFA2=I37y*2Q=bxm3(jtiw@_&hW`y)KAXi$GtBvE`D_>8
z4KT#j)AHFNI(0G7Gg>}7#U@NaY`;)&*(DA<;~*rTx5fTe8fnIu*3WK{uB04=CNNt*
z`^Cw(3?%+E@_A1@hj!|W=brri_eh^SIYLy?H<b>H1@is~+@|i0KySB!q;Xul4j~l%
z&%+795Etz{B#m=o%t;3!X?!Lo)pZaWh|Y^kg?UIB7sTMtojjzB&qaJvxC4<iz7T`o
z36aKd@a0Q~(-BUNjihjLZKR0FvW4)MI%3A0e~8nVov4KYW(KoWY(bDB#Ev(6#J3pO
zZG_^@KJnjd2cdX#TI9>FxmaUcOHRra8TvnxSH+uqO<Oh1--_)$jf3qm<hD4}z(Dpi
z<vS6JTt#WVBaY8<5Tf~e;l}(>=g}<xAX1wcL$Nl^zldQQ4JM8&nq|jPcszlIj{9Pk
z%pE1-by)b1n6uOv)U%KWBBHQT3JZUT(vEKR4W>t;c<)f|{}h`bw4&UHyS7RPA?_nw
zAMJ3EBnk^2*R{e-M1C<>8AMdu5RqTpb!(u55cefq$1xxl2@54ogZt|rDDDv!*vFQ&
z_Cx&Qn+fX2qt@M8Q4iE{TMfXwItSE}t|A8tW%7-<i$iLeijm1paTd}f#Foij@j-P5
zxi7De77e|-A!s`fg@!QKMp<i&NPPOmrZ819_Y6M5A^VLH`WesCa>*FXnVx<F$5_NQ
z9Autvv9;=^s(ppmtziy)t`0QsLYZ(Nd7dd^FT@Y9hKLo(tJwj}NAyxFvWWFIOH?8C
zQR3tiFJHw{bCrzfc3V|f6(9IPj@?d<v$L*;=14=emR}b?x><J3!z2214&{Se5G=72
z-ly&ulmDAwu-mH=EaHIr@f^d}it4HM?XxU`*UdAyI!k?Erz+5Vu{z)}XGur?_bh+t
zV9AuRqW)7)Fp*-pPs_ZqqEgz*7qE)^d9L0o6f+euFr_8`7`9^YnIbEt6)#Y@dIxt(
zYhD!<`C0*>mVYD9W329EH}aH%Js)Fh)t#>P6<)6<i_izY1msaJ#u6vx^pxTJowtnB
zDGLsDQI)00^n4MEMe5!1v0#oG8P`NTwi;u%R82}vOE05<Y3WA_w_92-3@z;ifLiL4
z-{gxjb?ug_1<cHI8C$FFQnhbdst?=-<g`@Q8Yjw?iA9%Uorj}9%m19+Y(Is|v5vA_
zoE$t(RP1#T{j$El9WwBa=m7PT`>EZu>ex+DV&D%lu$!)CU%UdsV*S9&YWK@%>^9r3
zcH2$FZgb^eekBsStsy##$IBbz@ZXlU^1(Q~7NVUjHC`kk)qFf6(wjYyZ6;a2sp?!r
zC2pwQmsLe!J<sAqHelI%gCzIBb9ljE4SUhMdlUF?P_wqG0aC1keB`E*74SNJm0%J5
z)Q@K%wpLUt+J~VK+=WG89(iXx9vv9G5My|1^@Pk!<Vo1<QD(o2!@{qGh*TU&n2RV7
zmQWpi%wzF+2l3uOwaOf?=SHK-EkW!}eZ}1!Lrm(5ji?F>^V~fUeNtDd<2-@;ep3xl
zv8rUOWhDVbL;UK;(*RpbE}bCUQOZy#9?i<h?Gr=?c3eK10QZH-G808^;@);xtC;$K
z?qkhS$0g&Es8^7>ye)xT;+AsPL`*~XYyx;)XNh!smm~F!_L|Rq4fFHVn?x9v%Z>j`
zHBtUC5zFON1!&1;1$nk%3s3EpH71E_5qof`Sn3^jbJ-8cQr+@k<6g#jRcSF_Dg4rD
z2IYoHcuq=XhMjH-_VmFPcJ|2glSDqP4t!O%d{Okmqpq7?6fv=LTf<bUy{OOSYx7Ur
z)<SvVMcA5;!>~0;!Jg^Z!q$ArCW~tQ%EEDxY1N2<wCW^Wn}M{XhsdcIxM0i;Zi~0_
zT_9WZl$Iw73A}1o9an}>M-e<4FV&hq88@Ua%VU#8Y{y7&=t^JcK2sJ?(=19tQMC$l
zjIyWb4M!ti)5h1UAJ3cEVp*@+S4CmG2p)~sq*R##`NbW_38bGal?a(drk{=tTL<eO
zOhGDk-y!UNxJd0DI)U9YYq1;tHw>!!b|3+pd(@Ao09z|D8r$E|6+_|5MIpS7I|B3U
z^p6h14BG#cuZuDeCNE9_`KmD}{1MswOxcWPandtYj0rx@Q|-Irj-HFsSB=ykwL$7y
zJlW!I^^N-U>-8z+a%U|=>h>U9X5gzdzDD>ZKP^JE8Ltv7Vv73l%*57;Qj4aUsw5PT
zwlVo|sz?c5L?|np{-b+sGECn!jaY<Mr~hOc(QzbF_ZVj82oLV^>e$b_sY&7P8E+%?
zi#}G$_e52xT=}>&7NepIqv{&!$CHe$6&0=aRh0&pJEw_od<SIzG*PWq-$rT@`n&s$
z^|1M0U4!MW(gdl86xR|WeRGrrRl^EdY&wLj%D~t@s^p-mBpO3S!|4$6l7<+V8#Z%i
z*2C8rn`<9hZiO~%k@7D(8DBB{lDV_fFlMR*i)f>MJRPyMqAIC<RU{OTR^J_*E}o0%
z(*gQv*v8#Jh6P1Dz3=SdUYQgWrK8j#l)6CHzEakr@mhf1L3Dc;!dbC~olt6VP?Yf<
zJBucD)uAKYmwFN9!sOu~)T1)O27R2|GZF`2!zF)#jo^}eWuupSC)C+ceMCZO&mH~>
zQhkhGlE)y`SEs^#=g2Tz*KfaN{YNEO#AEg2VPC0py{-0@*-#wkS_HFjkv|a`rJR9D
zOqjepLuB?mb_+^ww9q~Bs%14=MB^9Q(%=SCi*<^-7hFSXNiU{F)JWxAs#D=^zsk9C
z0v#*n3&$*rIEj%<XM$p79ZjmQU{6DA;e=!I{h6X#&zHW&ORyTP))lV_sd#Nj#jopc
zc;d60s^WDzRZLgBURUh%9W)h7nK26$E9<EE4pn?lSNxJ3GYj6|^#g{+#)<CE$kMnn
zy{;Z-90@-*uA)O`xckOsq^i*i?(x;ATbGckNpG`Hh;%2R8I5bv3+?gQD&KXaYRAy|
zmvTS#JyLZlQmU-`w<}2bbq(?Ey{NZwvRYjYx~sY;!*PvMv>R)<PpZbGzQNV8I__Uo
z_388i_=FVq%$rC(|6GhZmg+u!2dS1imEq1)6}Hl;R_+U`if&V=hK}yh%4T<+>gp>A
zn~EB4rODN^;UeV+xF|#6p69UzH@oD=v*Dt<IN|<{`)L<tg}A7H8d(o_Uq^|?143Ms
z6XK$QAubve;-bMJE*cWzqM>OaE*ho@w_P+`yC_AwXry`rzH$n=Xq<5hxoEs`3b|;4
zPIc7G2I+eR2|az8a1rVCG=w@wC0N9wuPZ5!EJw<U8m}<r4m#lA(fD$=Z;q(eaQrvu
z%1vs!H=v6&sZ&9y=2-4uA*Lq&@{ua#a##Nrsbmu)el=Cjl`qZ#4ax$H$3rX3QyE*(
zFkWth@v2u5d0ZJ4V<Vy8j09yMcEnxmR#MX#U%o1#!s&eZNEuSOVQ3Q>+M*3zmDT6s
z-w8u;0vU;ZU?nS|p?#p)jEs`Z8@P=fFWZX)XtuX86p`UG6A$lURc(}=3?Fq4x=+a{
z#ab`>5qK<9mRe^(#Tn(8>V~6dAVYXYJoAoMW-G8J$e_$l^nQnQMf*8TS9ova3zIkI
ziqdt(Bx-Y8<ir=Ju*KKTia@B~0tB9sz)C6GTc}{Id7^ai<t|ik02Lfc1&czM*N+02
zQHedEb1UZi6J^O;n_)0t6=M-EQt6;79pzK|$}yoh;(iefUwTVHzN(fyGf(vIeFz@U
zNMuJ*MOZ~-D}%qtre)pL;gqK3j2MceMAPy{46RV6X`C$v_iHL=ydHv!`5vh@C`SJy
zXU+$s${w0iRsDEsVGC)Lk$dK&hpvaFe1UBDb;R?)08>>9M2bL;sj3UA3Jf$=#j0b2
zbgG!UI}{NZtaC>CcBmRu#b1A8SzqW{FHx=6RjpB{)V`_`tsy+ZLkFVSdO2VLnll8F
zhz$Jc?g+^Q{xZ$^4N?z0G0kZTBZ0r|=6Gu%d;~0}vljDpK*iL8mFPMXRRS-aRX?8D
z*y5$LYG2h7ibrcqdKQYrjAP%UF9rh4I|P0VG_!46-ftnlKyzld!`la4J<!6)+V{P(
ztj@ik9K8@uS5{C-G?>9NPuS9swP7L7G6oKf50v5FRcJ_{EL}q@fj2@(4wSQ#E^l2p
zDp1}|hI>b->f`KWF>epmxOlEFPa?g4qWVAuuC9U9r@-qfmMYSFaq;Mm_jh$Pf&Y$X
z;1jfEeP>mxRAZmUfk!IABGf_Vu~5*8`d00$W`^R?EJn^=B&v1Wg<@3$)wp-PYDIN^
z%cHw!0lXf-O9v_G^7d8dSA!pdP0Uuk9>rWuyA{Q}OHoOnwtYg8Uc5|gvGCG$Ohp;H
z7%o(`paB<AoO!OOhN+RI^<t5p`VUB=Swkg)F|80KSe2jD#)a)2<a_6`EBw+`S2*jI
zx9qq&&<`2;^6q(e3XUum)p^_P=*7*Nsp34+wf95Inm!*^)O{r$JcX{HQfvmx${K~6
zJu2Hwwhlop`Q+aDNIa`<`pjYnRHi?qf2pX2)#d${;ts_rIe95AD^JO_OGTNdvQ(qS
zACX6wiu7t@DUlC~S?9bSlz34mV(O`E>P84(-X;Hrtgs9Ze|lxZW#aZzWmLvPb!64$
zBE7`d2-@tB8aP>(yr9fmj+g#)D%iVR3}iJYsf>cnLze0{UE#Iy$GXj7C(!DvxK3ns
z0E{3o@8KNTY=x-pp4A2qmipzoRd}<@suf~TWp(CDK^dFJhQnMn7gwh{k8OrgJF$@c
zOUAFnKbd}(sVi|6w^xo@i5DikCSP7DYO|K|=t^;!%_?|p749G7TWkkj71f76MDgbB
zXQA@d)PN;yVFm`ICF(=ej4ffG?L}&-PAz5seA&`3@y1Q})+?}NXOZG3?JrC~n>YOf
z+u%J_EbU510D-Tt)j<Bff;LjzWNdvw&DCPz6nWL>`amYvaCuAAtWztccK+C$+WF(g
zj~ZC8Day4xS|)yt_hg;*xt=Y^uHjlf-<>}$Yv7;>1^3@|t#LoAGPW3%GkV~l_Ji{C
zvxf{Sc;&EbGcRa)%=IMfsZse^<Fdw%D`<P#wJw~!B!4*T!pI_vpL10SoAjZ}>L@RK
Z>hj8V=UkC&nal*tW)#dh=XyW>{{diRS|b1e

delta 104217
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

diff --git a/stund/udp.h b/stund/udp.h
index e3ec4e2043..28af798d18 100644
--- a/stund/udp.h
+++ b/stund/udp.h
@@ -57,8 +57,8 @@ inline int getErrno() { return WSAGetLastError(); }
 
 #else
 
-typedef int Socket;
-//#define Socket			int
+//typedef int Socket;
+#define Socket			int
 #define INVALID_SOCKET	-1
 #define SOCKET_ERROR	-1
 
-- 
GitLab