diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c
index cdb18042875508d214f1f1b46e0fe0eb29e5b00e..a4c2d510aa5613f23d758705208a7963dd41c8d7 100644
--- a/coreapi/callbacks.c
+++ b/coreapi/callbacks.c
@@ -369,8 +369,8 @@ static void register_success(SalOp *op, bool_t registered){
 	LinphoneCore *lc=(LinphoneCore *)sal_get_user_pointer(sal_op_get_sal(op));
 	LinphoneProxyConfig *cfg=(LinphoneProxyConfig*)sal_op_get_user_pointer(op);
 	char *msg;
-	gstate_new_state(lc, GSTATE_REG_OK, NULL);
 	cfg->registered=registered;
+	gstate_new_state(lc, GSTATE_REG_OK, NULL);
 	if (cfg->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));
 	if (lc->vtable.display_status) 
diff --git a/coreapi/linphonecore_jni.cc b/coreapi/linphonecore_jni.cc
index 4c595cd0e50ee9a7f6f117895ce8924b9db26c65..390c56232e78c38e0d975f715325cc33de983fd3 100644
--- a/coreapi/linphonecore_jni.cc
+++ b/coreapi/linphonecore_jni.cc
@@ -352,16 +352,38 @@ extern "C" void Java_org_linphone_core_LinphoneProxyConfigImpl_setIdentity(JNIEn
 	linphone_proxy_config_set_identity((LinphoneProxyConfig*)proxyCfg,identity);
 	env->ReleaseStringUTFChars(jidentity, identity);
 }
+extern "C" jstring Java_org_linphone_core_LinphoneProxyConfigImpl_getIdentity(JNIEnv* env,jobject thiz,jlong proxyCfg) {
+	const char* identity = linphone_proxy_config_get_identity((LinphoneProxyConfig*)proxyCfg);
+	if (identity) {
+		return env->NewStringUTF(identity);
+	} else {
+		return NULL;
+	}
+}
 extern "C" int Java_org_linphone_core_LinphoneProxyConfigImpl_setProxy(JNIEnv* env,jobject thiz,jlong proxyCfg,jstring jproxy) {
 	const char* proxy = env->GetStringUTFChars(jproxy, NULL);
 	int err=linphone_proxy_config_set_server_addr((LinphoneProxyConfig*)proxyCfg,proxy);
 	env->ReleaseStringUTFChars(jproxy, proxy);
 	return err;
 }
+extern "C" jstring Java_org_linphone_core_LinphoneProxyConfigImpl_getProxy(JNIEnv* env,jobject thiz,jlong proxyCfg) {
+	const char* proxy = linphone_proxy_config_get_addr((LinphoneProxyConfig*)proxyCfg);
+	if (proxy) {
+		return env->NewStringUTF(proxy);
+	} else {
+		return NULL;
+	}
+}
 
 extern "C" void Java_org_linphone_core_LinphoneProxyConfigImpl_enableRegister(JNIEnv* env,jobject thiz,jlong proxyCfg,jboolean enableRegister) {
 	linphone_proxy_config_enable_register((LinphoneProxyConfig*)proxyCfg,enableRegister);
 }
+extern "C" jboolean Java_org_linphone_core_LinphoneProxyConfigImpl_isRegistered(JNIEnv* env,jobject thiz,jlong proxyCfg) {
+	return linphone_proxy_config_is_registered((LinphoneProxyConfig*)proxyCfg);
+}
+extern "C" jboolean Java_org_linphone_core_LinphoneProxyConfigImpl_isRegisterEnabled(JNIEnv* env,jobject thiz,jlong proxyCfg) {
+	return linphone_proxy_config_register_enabled((LinphoneProxyConfig*)proxyCfg);
+}
 extern "C" void Java_org_linphone_core_LinphoneProxyConfigImpl_edit(JNIEnv* env,jobject thiz,jlong proxyCfg) {
 	linphone_proxy_config_edit((LinphoneProxyConfig*)proxyCfg);
 }
diff --git a/java/org/.DS_Store b/java/common/org/.DS_Store
similarity index 100%
rename from java/org/.DS_Store
rename to java/common/org/.DS_Store
diff --git a/java/org/linphone/.DS_Store b/java/common/org/linphone/.DS_Store
similarity index 100%
rename from java/org/linphone/.DS_Store
rename to java/common/org/linphone/.DS_Store
diff --git a/java/org/linphone/core/CallDirection.java b/java/common/org/linphone/core/CallDirection.java
similarity index 100%
rename from java/org/linphone/core/CallDirection.java
rename to java/common/org/linphone/core/CallDirection.java
diff --git a/java/org/linphone/core/LinphoneAddress.java b/java/common/org/linphone/core/LinphoneAddress.java
similarity index 100%
rename from java/org/linphone/core/LinphoneAddress.java
rename to java/common/org/linphone/core/LinphoneAddress.java
diff --git a/java/org/linphone/core/LinphoneAuthInfo.java b/java/common/org/linphone/core/LinphoneAuthInfo.java
similarity index 100%
rename from java/org/linphone/core/LinphoneAuthInfo.java
rename to java/common/org/linphone/core/LinphoneAuthInfo.java
diff --git a/java/org/linphone/core/LinphoneCallLog.java b/java/common/org/linphone/core/LinphoneCallLog.java
similarity index 100%
rename from java/org/linphone/core/LinphoneCallLog.java
rename to java/common/org/linphone/core/LinphoneCallLog.java
diff --git a/java/org/linphone/core/LinphoneCore.java b/java/common/org/linphone/core/LinphoneCore.java
similarity index 65%
rename from java/org/linphone/core/LinphoneCore.java
rename to java/common/org/linphone/core/LinphoneCore.java
index d519c9d1edaedd6f74997b9a4324896fe1b4df57..927c9596e2c5a4517510795bc918394abddb139e 100644
--- a/java/org/linphone/core/LinphoneCore.java
+++ b/java/common/org/linphone/core/LinphoneCore.java
@@ -28,39 +28,44 @@ public interface LinphoneCore {
 	 * linphone core states
 	 */
 	static public class 	GeneralState {
-		  /* states for GSTATE_GROUP_POWER */
-	static GeneralState GSTATE_POWER_OFF = new GeneralState(0);        /* initial state */
-	static GeneralState GSTATE_POWER_STARTUP = new GeneralState(1);
-	static GeneralState GSTATE_POWER_ON = new GeneralState(2);
-	static GeneralState GSTATE_POWER_SHUTDOWN = new GeneralState(3);
-		  /* states for GSTATE_GROUP_REG */
-	static GeneralState GSTATE_REG_NONE = new GeneralState(10);       /* initial state */
-	static GeneralState GSTATE_REG_OK  = new GeneralState(11);
-	static GeneralState GSTATE_REG_FAILED = new GeneralState(12);
-		  /* states for GSTATE_GROUP_CALL */
-	static GeneralState GSTATE_CALL_IDLE = new GeneralState(20);      /* initial state */
-	static GeneralState GSTATE_CALL_OUT_INVITE = new GeneralState(21);
-	static GeneralState GSTATE_CALL_OUT_CONNECTED = new GeneralState(22);
-	static GeneralState GSTATE_CALL_IN_INVITE = new GeneralState(23);
-	static GeneralState GSTATE_CALL_IN_CONNECTED = new GeneralState(24);
-	static GeneralState GSTATE_CALL_END = new GeneralState(25);
-	static GeneralState GSTATE_CALL_ERROR = new GeneralState(26);
-	static GeneralState GSTATE_INVALID = new GeneralState(27);
-	private final int mValue;
-	static private Vector values = new Vector();
-	
-	private GeneralState(int value) {
-		mValue = value;
-		values.addElement(this);
-	}
-	public static GeneralState fromInt(int value) {
-		
-		for (int i=0; i<values.size();i++) {
-			GeneralState state = (GeneralState) values.elementAt(i);
-			if (state.mValue == value) return state;
+		static private Vector values = new Vector();
+		/* states for GSTATE_GROUP_POWER */
+		static public GeneralState GSTATE_POWER_OFF = new GeneralState(0,"GSTATE_POWER_OFF");        /* initial state */
+		static public GeneralState GSTATE_POWER_STARTUP = new GeneralState(1,"GSTATE_POWER_STARTUP");
+		static public GeneralState GSTATE_POWER_ON = new GeneralState(2,"GSTATE_POWER_ON");
+		static public GeneralState GSTATE_POWER_SHUTDOWN = new GeneralState(3,"GSTATE_POWER_SHUTDOWN");
+		/* states for GSTATE_GROUP_REG */
+		static public GeneralState GSTATE_REG_NONE = new GeneralState(10,"GSTATE_REG_NONE");       /* initial state */
+		static public GeneralState GSTATE_REG_OK  = new GeneralState(11,"GSTATE_REG_OK");
+		static public GeneralState GSTATE_REG_FAILED = new GeneralState(12,"GSTATE_REG_FAILED");
+		/* states for GSTATE_GROUP_CALL */
+		static public GeneralState GSTATE_CALL_IDLE = new GeneralState(20,"GSTATE_CALL_IDLE");      /* initial state */
+		static public GeneralState GSTATE_CALL_OUT_INVITE = new GeneralState(21,"GSTATE_CALL_OUT_INVITE");
+		static public GeneralState GSTATE_CALL_OUT_CONNECTED = new GeneralState(22,"GSTATE_CALL_OUT_CONNECTED");
+		static public GeneralState GSTATE_CALL_IN_INVITE = new GeneralState(23,"GSTATE_CALL_IN_INVITE");
+		static public GeneralState GSTATE_CALL_IN_CONNECTED = new GeneralState(24,"GSTATE_CALL_IN_CONNECTED");
+		static public GeneralState GSTATE_CALL_END = new GeneralState(25,"GSTATE_CALL_END");
+		static public GeneralState GSTATE_CALL_ERROR = new GeneralState(26,"GSTATE_CALL_ERROR");
+		static public GeneralState GSTATE_INVALID = new GeneralState(27,"GSTATE_INVALID");
+		private final int mValue;
+		private final String mStringValue;
+
+		private GeneralState(int value,String stringValue) {
+			mValue = value;
+			values.addElement(this);
+			mStringValue=stringValue;
+		}
+		public static GeneralState fromInt(int value) {
+
+			for (int i=0; i<values.size();i++) {
+				GeneralState state = (GeneralState) values.elementAt(i);
+				if (state.mValue == value) return state;
+			}
+			throw new RuntimeException("state not found ["+value+"]");
+		}
+		public String toString() {
+			return mStringValue;
 		}
-		throw new RuntimeException("sate not found ["+value+"]");
-	}
 	}
 
 	
diff --git a/java/org/linphone/core/LinphoneCoreFactory.java b/java/common/org/linphone/core/LinphoneCoreFactory.java
similarity index 98%
rename from java/org/linphone/core/LinphoneCoreFactory.java
rename to java/common/org/linphone/core/LinphoneCoreFactory.java
index b352edca115e8a78c6f4ff5ef76ec58e026b856e..b267373a3eadef9df2ef2ef2cbf5e194d1b882a6 100644
--- a/java/org/linphone/core/LinphoneCoreFactory.java
+++ b/java/common/org/linphone/core/LinphoneCoreFactory.java
@@ -46,7 +46,7 @@ abstract public class LinphoneCoreFactory {
 		}
 		return theLinphoneCoreFactory;
 	}
-	abstract public LinphoneAuthInfo createAuthInfo(String username,String password);
+	abstract public LinphoneAuthInfo createAuthInfo(String username,String password, String realm);
 	
 	abstract public LinphoneCore createLinphoneCore(LinphoneCoreListener listener, String userConfig,String factoryConfig,Object  userdata) throws LinphoneCoreException;
 	
diff --git a/java/org/linphone/core/LinphoneCoreListener.java b/java/common/org/linphone/core/LinphoneCoreListener.java
similarity index 100%
rename from java/org/linphone/core/LinphoneCoreListener.java
rename to java/common/org/linphone/core/LinphoneCoreListener.java
diff --git a/java/org/linphone/core/LinphoneProxyConfig.java b/java/common/org/linphone/core/LinphoneProxyConfig.java
similarity index 100%
rename from java/org/linphone/core/LinphoneProxyConfig.java
rename to java/common/org/linphone/core/LinphoneProxyConfig.java
diff --git a/java/j2me/org/linphone/core/LinphoneCoreException.java b/java/j2me/org/linphone/core/LinphoneCoreException.java
new file mode 100644
index 0000000000000000000000000000000000000000..10900a633e71809d575afa136e3fb4a966323d09
--- /dev/null
+++ b/java/j2me/org/linphone/core/LinphoneCoreException.java
@@ -0,0 +1,47 @@
+/*
+LinphoneCoreException.java
+Copyright (C) 2010  Belledonne Communications, Grenoble, France
+
+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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+*/
+package org.linphone.core;
+
+
+public class LinphoneCoreException extends Exception {
+	Throwable mE;
+	public LinphoneCoreException() {
+		super();
+	}
+
+	public LinphoneCoreException(String detailMessage) {
+		super(detailMessage);
+
+	}
+	public LinphoneCoreException(Throwable e) {
+		mE = e;
+	}
+
+	public LinphoneCoreException(String detailMessage,Throwable e) {
+		super(detailMessage);
+		mE = e;
+	}
+
+	public void printStackTrace() {
+		super.printStackTrace();
+		mE.printStackTrace();
+	}
+	
+
+}
diff --git a/java/org/linphone/core/LinphoneCoreException.java b/java/j2se/org/linphone/core/LinphoneCoreException.java
similarity index 93%
rename from java/org/linphone/core/LinphoneCoreException.java
rename to java/j2se/org/linphone/core/LinphoneCoreException.java
index b1967943929c1f1258000c7a47f00b51c8145e35..a424e2871903694fdaa4de76b36df4e2c09639cb 100644
--- a/java/org/linphone/core/LinphoneCoreException.java
+++ b/java/j2se/org/linphone/core/LinphoneCoreException.java
@@ -29,11 +29,11 @@ public class LinphoneCoreException extends Exception {
 	}
 
 	public LinphoneCoreException(Throwable e) {
-		super(e.getMessage());
+		super(e);
 	}
 
 	public LinphoneCoreException(String detailMessage,Throwable e) {
-		super(detailMessage +" reason ["+e.getMessage()+"]");
+		super(detailMessage,e);
 	}