diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c
index 84092e69fdb560aa10490622cb9f0d88c8da18a8..31aca35c5cbb287670f27dab2569df76412da2fc 100644
--- a/coreapi/callbacks.c
+++ b/coreapi/callbacks.c
@@ -623,12 +623,11 @@ static void register_success(SalOp *op, bool_t registered){
 	LinphoneProxyConfig *cfg=(LinphoneProxyConfig*)sal_op_get_user_pointer(op);
 	char *msg;
 	
-	cfg->registered=registered;
 	linphone_proxy_config_set_error(cfg,LinphoneReasonNone);
 	linphone_proxy_config_set_state(cfg, registered ? LinphoneRegistrationOk : LinphoneRegistrationCleared ,
 	                                registered ? "Registration sucessful" : "Unregistration done");
 	if (lc->vtable.display_status){
-		if (cfg->registered) msg=ms_strdup_printf(_("Registration on %s successful."),sal_op_get_proxy(op));
+		if (registered) msg=ms_strdup_printf(_("Registration on %s successful."),sal_op_get_proxy(op));
 		else msg=ms_strdup_printf(_("Unregistration on %s done."),sal_op_get_proxy(op));
 		lc->vtable.display_status(lc,msg);
 		ms_free(msg);
diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c
index 30f5997628c1ef3438b5fd52dd9a3d183d4b11f6..9a8c5120865fd9a4e5e00a8f8a006eb02ad5435a 100644
--- a/coreapi/linphonecore.c
+++ b/coreapi/linphonecore.c
@@ -4164,7 +4164,7 @@ static void set_network_reachable(LinphoneCore* lc,bool_t isReachable, time_t cu
 		LinphoneProxyConfig *cfg=(LinphoneProxyConfig*)elem->data;
 		if (linphone_proxy_config_register_enabled(cfg) ) {
 			if (!isReachable) {
-				cfg->registered=0;
+				linphone_proxy_config_set_state(cfg, LinphoneRegistrationNone,"Registration impossible (network down)");
 			}else{
 				cfg->commit=TRUE;
 			}
diff --git a/coreapi/private.h b/coreapi/private.h
index a21fc8b20aec9bb17379c52530ac201f087230dd..77f62c33407ce7ccc3038df588fc4a75aade32e7 100644
--- a/coreapi/private.h
+++ b/coreapi/private.h
@@ -255,7 +255,6 @@ struct _LinphoneProxyConfig
 	SalOp *publish_op;
 	bool_t commit;
 	bool_t reg_sendregister;
-	bool_t registered;
 	bool_t publish;
 	bool_t dial_escape_plus;
 	void* user_data;
diff --git a/coreapi/proxy.c b/coreapi/proxy.c
index 011be670672f228ea7c4efb739946b20c694c808..959c321b6862d194c5275683a693d025d69f31ab 100644
--- a/coreapi/proxy.c
+++ b/coreapi/proxy.c
@@ -84,7 +84,7 @@ void linphone_proxy_config_destroy(LinphoneProxyConfig *obj){
  * Returns a boolean indicating that the user is sucessfully registered on the proxy.
 **/
 bool_t linphone_proxy_config_is_registered(const LinphoneProxyConfig *obj){
-	return obj->registered;
+	return obj->state == LinphoneRegistrationOk;
 }
 
 /**
@@ -232,9 +232,8 @@ void linphone_proxy_config_enable_publish(LinphoneProxyConfig *obj, bool_t val){
 void linphone_proxy_config_edit(LinphoneProxyConfig *obj){
 	if (obj->reg_sendregister){
 		/* unregister */
-		if (obj->registered) {
+		if (obj->state != LinphoneRegistrationNone && obj->state != LinphoneRegistrationCleared) {
 			sal_unregister(obj->op);
-			obj->registered=FALSE;
 		}
 	}
 }
@@ -301,7 +300,7 @@ static void linphone_proxy_config_register(LinphoneProxyConfig *obj){
 **/
 void linphone_proxy_config_refresh_register(LinphoneProxyConfig *obj){
 	if (obj->reg_sendregister && obj->op){
-		obj->registered=FALSE;
+		linphone_proxy_config_set_state(obj,LinphoneRegistrationProgress, "Refresh registration");
 		sal_register_refresh(obj->op,obj->expires);
 	}
 }