diff --git a/linphone/coreapi/linphonecore.c b/linphone/coreapi/linphonecore.c
index 49fba6761af9bc820fc3c3fa44807747c0546c26..1ff4e4824cb68506666d832a1d70446918fd5cfb 100644
--- a/linphone/coreapi/linphonecore.c
+++ b/linphone/coreapi/linphonecore.c
@@ -2331,7 +2331,7 @@ void linphone_core_set_waiting_callback(LinphoneCore *lc, LinphoneWaitingCallbac
 
 void linphone_core_start_waiting(LinphoneCore *lc, const char *purpose){
 	if (lc->wait_cb){
-		lc->wait_ctx=lc->wait_cb(lc,NULL,LinphoneWaitingStart,purpose,0);
+		lc->wait_ctx=lc->wait_cb(lc,lc->wait_ctx,LinphoneWaitingStart,purpose,0);
 	}
 }
 
diff --git a/linphone/coreapi/linphonecore.h b/linphone/coreapi/linphonecore.h
index d4cbf58c937d36174863417b47a5d624291cbfe7..8334d9bd81d8d55aa7a21a38fd2955f04ff18680 100644
--- a/linphone/coreapi/linphonecore.h
+++ b/linphone/coreapi/linphonecore.h
@@ -340,6 +340,8 @@ LinphoneAccountCreator *linphone_account_creator_new(struct _LinphoneCore *core,
 void linphone_account_creator_set_username(LinphoneAccountCreator *obj, const char *username);
 void linphone_account_creator_set_password(LinphoneAccountCreator *obj, const char *password);
 void linphone_account_creator_set_domain(LinphoneAccountCreator *obj, const char *domain);
+const char * linphone_account_creator_get_username(LinphoneAccountCreator *obj);
+const char * linphone_account_creator_get_domain(LinphoneAccountCreator *obj);
 int linphone_account_creator_test_existence(LinphoneAccountCreator *obj);
 LinphoneProxyConfig * linphone_account_creator_validate(LinphoneAccountCreator *obj);
 void linphone_account_creator_destroy(LinphoneAccountCreator *obj);
diff --git a/linphone/coreapi/proxy.c b/linphone/coreapi/proxy.c
index 97a65fe92d34330455ed1f195f078c15d1d36fdf..a12b8cf72bbb660c22dd6c32509ef9641ed9f6c4 100644
--- a/linphone/coreapi/proxy.c
+++ b/linphone/coreapi/proxy.c
@@ -235,8 +235,10 @@ static void linphone_proxy_config_register(LinphoneProxyConfig *obj){
 	if (obj->reg_sendregister){
 		char *ct=NULL;
 		osip_message_t *msg=NULL;
+		eXosip_lock();
 		obj->rid=eXosip_register_build_initial_register(id_str,obj->reg_proxy,NULL,obj->expires,&msg);
 		eXosip_register_send_register(obj->rid,msg);
+		eXosip_unlock();
 		if (ct!=NULL) osip_free(ct);
 	}
 }
@@ -504,7 +506,7 @@ void linphone_proxy_config_process_authentication_failure(LinphoneCore *lc, eXos
 	LinphoneProxyConfig *cfg=linphone_core_get_proxy_config_from_rid(lc, ev->rid);
 	if (cfg){
 		cfg->auth_failures++;
-		/*restart a new register */
+		/*restart a new register so that the user gets a chance to be prompted for a password*/
 		if (cfg->auth_failures==1){
 			linphone_proxy_config_register(cfg);
 		}
@@ -667,6 +669,14 @@ void linphone_account_creator_set_domain(LinphoneAccountCreator *obj, const char
 	set_string(&obj->domain,domain);
 }
 
+const char * linphone_account_creator_get_username(LinphoneAccountCreator *obj){
+	return obj->username;
+}
+
+const char * linphone_account_creator_get_domain(LinphoneAccountCreator *obj){
+	return obj->domain;
+}
+
 int linphone_account_creator_test_existence(LinphoneAccountCreator *obj){
 	SipSetupContext *ssctx=obj->ssctx;
 	char *uri=ms_strdup_printf("%s@%s",obj->username,obj->domain);
diff --git a/linphone/gtk-glade/setupwizard.c b/linphone/gtk-glade/setupwizard.c
index 4f96363bd3cc29ec6fafba2d202b78cb74f8926a..1262de7119359114574296f1274cba3b8a77aa33 100644
--- a/linphone/gtk-glade/setupwizard.c
+++ b/linphone/gtk-glade/setupwizard.c
@@ -85,10 +85,10 @@ static void *progress_bar_update(LinphoneCore *lc, void *ctx, LinphoneWaitingSta
 }
 
 static void check_username(GtkWidget *page){
-	GtkWidget *progress=g_object_get_data(G_OBJECT(page),"progress");
-	GtkWidget *label=g_object_get_data(G_OBJECT(page),"label");
-	const char *username=g_object_get_data(G_OBJECT(page),"username");
-	gchar *text=g_strdup_printf(_("Checking if '%s' is available..."),username);
+	GtkWidget *progress=(GtkWidget*)g_object_get_data(G_OBJECT(page),"progress");
+	GtkWidget *label=(GtkWidget*)g_object_get_data(G_OBJECT(page),"label");
+	LinphoneAccountCreator *creator=linphone_gtk_assistant_get_creator(gtk_widget_get_toplevel(page));
+	gchar *text=g_strdup_printf(_("Checking if '%s' is available..."),linphone_account_creator_get_username(creator));
 	LinphoneAccountCreator *c=linphone_gtk_assistant_get_creator(gtk_widget_get_toplevel(page));
 	int res;
 	gtk_label_set_text(GTK_LABEL(label),text);
@@ -107,6 +107,27 @@ static void check_username(GtkWidget *page){
 	linphone_core_set_waiting_callback(linphone_gtk_get_core(),linphone_gtk_wait,NULL);
 }
 
+static GtkWidget *create_confirmation_page(){
+	GtkWidget *vbox=gtk_vbox_new(FALSE,2);
+	GtkWidget *label=gtk_label_new(NULL);
+	gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 2);
+	g_object_set_data(G_OBJECT(vbox),"label",label);
+	gtk_widget_show_all(vbox);
+	return vbox;
+}
+
+static GtkWidget *create_creation_page(){
+	GtkWidget *vbox=gtk_vbox_new(FALSE,2);
+	GtkWidget *label=gtk_label_new(NULL);
+	GtkWidget *progress=gtk_progress_bar_new();
+	gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 2);
+	gtk_box_pack_start (GTK_BOX (vbox), progress, TRUE, TRUE, 2);
+	g_object_set_data(G_OBJECT(vbox),"label",label);
+	g_object_set_data(G_OBJECT(vbox),"progress",progress);
+	gtk_widget_show_all(vbox);
+	return vbox;
+}
+
 static GtkWidget *create_finish_page(){
 	GtkWidget *vbox=gtk_vbox_new(FALSE,2);
 	GtkWidget *label=gtk_label_new(_("Thank you. Your account is now configured and ready for use."));
@@ -135,13 +156,40 @@ static int linphone_gtk_assistant_forward(int curpage, gpointer data){
 }
 
 static void linphone_gtk_assistant_apply(GtkWidget *w){
-	g_message("in apply()");
+	LinphoneAccountCreator *creator=linphone_gtk_assistant_get_creator(w);
+	GtkWidget *page=gtk_assistant_get_nth_page(GTK_ASSISTANT(w),gtk_assistant_get_current_page(GTK_ASSISTANT(w)));
+	GtkWidget *progress=(GtkWidget*)g_object_get_data(G_OBJECT(page),"progress");
+	LinphoneProxyConfig *res;
+	gtk_progress_bar_set_text(GTK_PROGRESS_BAR(progress),_("Please wait..."));
+	linphone_core_set_waiting_callback(linphone_gtk_get_core(),progress_bar_update,progress);
+	res=linphone_account_creator_validate(creator);
+	if (res){
+		gtk_progress_bar_set_text(GTK_PROGRESS_BAR(progress),_("Ok !"));
+		gtk_assistant_set_page_complete(GTK_ASSISTANT(w),page,TRUE);
+	}else{
+		gtk_progress_bar_set_text(GTK_PROGRESS_BAR(progress),_("Communication problem, please try again later."));
+	}
+	linphone_core_set_waiting_callback(linphone_gtk_get_core(),linphone_gtk_wait,NULL);
+	if (res) linphone_core_add_proxy_config(linphone_gtk_get_core(),res);
+	gtk_assistant_set_page_complete(GTK_ASSISTANT(w),page,TRUE);
 }
 
 static void linphone_gtk_assistant_prepare(GtkWidget *assistant, GtkWidget *page){
 	int pagenum=gtk_assistant_get_current_page(GTK_ASSISTANT(assistant));
 	if (pagenum==3){
 		check_username(page);
+	}else if (pagenum==4){
+		GtkWidget *label=(GtkWidget*)g_object_get_data(G_OBJECT(page),"label");
+		LinphoneAccountCreator *creator=linphone_gtk_assistant_get_creator(assistant);
+		gchar *text=g_strdup_printf("You have choosen '%s' as username.\nDo you confirm the creation of the account ?",linphone_account_creator_get_username(creator));
+		gtk_label_set_text(GTK_LABEL(label),text);
+		g_free(text);
+	}else if (pagenum==5){
+		GtkWidget *label=(GtkWidget*)g_object_get_data(G_OBJECT(page),"label");
+		LinphoneAccountCreator *creator=linphone_gtk_assistant_get_creator(assistant);
+		gchar *text=g_strdup_printf("Account creation in progress for '%s'",linphone_account_creator_get_username(creator));
+		gtk_label_set_text(GTK_LABEL(label),text);
+		g_free(text);
 	}
 }
 
@@ -169,6 +217,8 @@ GtkWidget * linphone_gtk_create_assistant(void){
 	GtkWidget *p2=create_setup_signin_choice();
 	GtkWidget *p3=create_username_chooser();
 	GtkWidget *checking=create_username_checking_page();
+	GtkWidget *confirm=create_confirmation_page();
+	GtkWidget *creation=create_creation_page();
 	GtkWidget *end=create_finish_page();
 	
 	linphone_gtk_assistant_init(w);
@@ -182,12 +232,21 @@ GtkWidget * linphone_gtk_create_assistant(void){
 	gtk_assistant_set_page_complete(GTK_ASSISTANT(w),p2,TRUE);
 	gtk_assistant_append_page(GTK_ASSISTANT(w),p3);
 	gtk_assistant_set_page_type(GTK_ASSISTANT(w),p3,GTK_ASSISTANT_PAGE_CONTENT);
-	gtk_assistant_set_page_title(GTK_ASSISTANT(w),p3,_("Account setup assistant - enter your information"));
+	gtk_assistant_set_page_title(GTK_ASSISTANT(w),p3,_("Choosing a username"));
 	
 	gtk_assistant_append_page(GTK_ASSISTANT(w),checking);
 	gtk_assistant_set_page_type(GTK_ASSISTANT(w),checking,GTK_ASSISTANT_PAGE_PROGRESS);
-	gtk_assistant_set_page_title(GTK_ASSISTANT(w),checking,_("Account setup assistant - verifying"));
+	gtk_assistant_set_page_title(GTK_ASSISTANT(w),checking,_("Verifying"));
 	
+	gtk_assistant_append_page(GTK_ASSISTANT(w),confirm);
+	gtk_assistant_set_page_type(GTK_ASSISTANT(w),confirm,GTK_ASSISTANT_PAGE_CONFIRM);
+	gtk_assistant_set_page_title(GTK_ASSISTANT(w),confirm,_("Confirmation"));
+	gtk_assistant_set_page_complete(GTK_ASSISTANT(w),confirm,TRUE);
+
+	gtk_assistant_append_page(GTK_ASSISTANT(w),creation);
+	gtk_assistant_set_page_type(GTK_ASSISTANT(w),creation,GTK_ASSISTANT_PAGE_PROGRESS);
+	gtk_assistant_set_page_title(GTK_ASSISTANT(w),creation,_("Creating your account"));
+
 	gtk_assistant_append_page(GTK_ASSISTANT(w),end);
 	gtk_assistant_set_page_type(GTK_ASSISTANT(w),end,GTK_ASSISTANT_PAGE_SUMMARY);
 	gtk_assistant_set_page_title(GTK_ASSISTANT(w),end,_("Now ready !"));
diff --git a/p2pproxy/configure.ac b/p2pproxy/configure.ac
index 94f8d420fa329a2c6fa3b525183b51098d131713..fffaf614f0908c533e643bcb556c031fb986ab9a 100644
--- a/p2pproxy/configure.ac
+++ b/p2pproxy/configure.ac
@@ -39,8 +39,8 @@ if test $GCC = yes && test $wall_werror = yes;  then
 fi
 
 AC_ARG_WITH(java,
-		[  --with-java	Sets directory of java home,  [default=/usr/lib/jvm/java-1.5.0-sun] ],
-		[ javadir=${withval}],[javadir=/usr/lib/jvm/java-1.5.0-sun/])
+		[  --with-java	Sets directory of java home,  [default=/usr/lib/jvm/java-6-sun] ],
+		[ javadir=${withval}],[javadir=/usr/lib/jvm/java-6-sun/])
 
 AC_SUBST(javadir)
 
diff --git a/p2pproxy/launcher/src/Makefile.am b/p2pproxy/launcher/src/Makefile.am
index 0b920ff7537b96f861bdef670abcf55ecb2921de..a47d2326fb7d24fe50ecb243a983b52f09e606a2 100644
--- a/p2pproxy/launcher/src/Makefile.am
+++ b/p2pproxy/launcher/src/Makefile.am
@@ -1,5 +1,5 @@
 JAVA_LIBS=-L$(javadir)/jre/lib/amd64 -L$(javadir)/jre/lib/i386 \
-			-L$(javadir)/jre/lib/amd64/server -L$(javadir)/jre/lib/i386/server -ljvm 
+			-L$(javadir)/jre/lib/amd64/server -L$(javadir)/jre/lib/i386/server -ljava 
 
 JAVA_LDFLAGS=\
 	-Wl,-rpath,$(javadir)/jre/lib/amd64 -Wl,-rpath,$(javadir)/jre/lib/i386 \
diff --git a/p2pproxy/plugin-src/fonis.c b/p2pproxy/plugin-src/fonis.c
index f15ee892ea5ee2d474063bf21a3c0cd4174d1f8d..36f23a953cbc9dff8c740b3b48956b3e429fd311 100644
--- a/p2pproxy/plugin-src/fonis.c
+++ b/p2pproxy/plugin-src/fonis.c
@@ -67,10 +67,26 @@ static bool_t fonis_check_connected(SipSetupContext *ctx){
 	return FALSE;
 }
 
+static int fonis_test_account(SipSetupContext *ctx, const char *uri){
+	int ret;
+	LinphoneCore *lc=linphone_proxy_config_get_core(sip_setup_context_get_proxy_config(ctx));
+	if (!fonis_check_connected(ctx)) return -1;
+	linphone_core_start_waiting(lc,"Checking...");
+	ret=(p2pproxy_accountmgt_isValidAccount(uri)==P2PPROXY_ACCOUNTMGT_USER_EXIST) ? 1 : 0;
+	linphone_core_update_progress(lc,NULL,1);
+	linphone_core_stop_waiting(lc);
+	return ret;
+}
+
 static int fonis_create_account(SipSetupContext *ctx, const char *uri, const char *passwd){
 	int err;
+	LinphoneCore *lc=linphone_proxy_config_get_core(sip_setup_context_get_proxy_config(ctx));
 	if (!fonis_check_connected(ctx)) return -1;
+	linphone_core_start_waiting(lc,"Creating account...");
 	err=p2pproxy_accountmgt_createAccount(uri);
+	ms_message("Account creation result for %s: %i",uri,err);
+	linphone_core_update_progress(lc,NULL,1);
+	linphone_core_stop_waiting(lc);
 	if (err<0) return -1;
 	return 0;
 }
@@ -128,6 +144,7 @@ static SipSetup fonis_sip_setup={
 				SIP_SETUP_CAP_RELAY_PROVIDER|SIP_SETUP_CAP_ACCOUNT_MANAGER,
 	.name="fonis",
 	.init=fonis_init,
+	.account_exists=fonis_test_account,
 	.create_account=fonis_create_account,
 	.login_account=fonis_login_account,
 	.get_proxy=fonis_get_proxy,