diff --git a/ring-android/app/src/main/java/cx/ring/model/SipCall.java b/ring-android/app/src/main/java/cx/ring/model/SipCall.java
index f64a505458ff9cf8c61fce10ea730d12097ac04f..5524f202767230b96d354bd80fae89f698aed7f9 100644
--- a/ring-android/app/src/main/java/cx/ring/model/SipCall.java
+++ b/ring-android/app/src/main/java/cx/ring/model/SipCall.java
@@ -118,19 +118,20 @@ public class SipCall implements Parcelable {
 
 
     public interface direction {
-        public static final int CALL_TYPE_INCOMING = 1;
-        public static final int CALL_TYPE_OUTGOING = 2;
+        int CALL_TYPE_INCOMING = 1;
+        int CALL_TYPE_OUTGOING = 2;
     }
 
     public interface state {
-        public static final int CALL_STATE_NONE = 0;
-        public static final int CALL_STATE_RINGING = 2;
-        public static final int CALL_STATE_CURRENT = 3;
-        public static final int CALL_STATE_HUNGUP = 4;
-        public static final int CALL_STATE_BUSY = 5;
-        public static final int CALL_STATE_FAILURE = 6;
-        public static final int CALL_STATE_HOLD = 7;
-        public static final int CALL_STATE_UNHOLD = 8;
+        int CALL_STATE_NONE = 0;
+        int CALL_STATE_CONNECTING = 1;
+        int CALL_STATE_RINGING = 2;
+        int CALL_STATE_CURRENT = 3;
+        int CALL_STATE_HUNGUP = 4;
+        int CALL_STATE_BUSY = 5;
+        int CALL_STATE_FAILURE = 6;
+        int CALL_STATE_HOLD = 7;
+        int CALL_STATE_UNHOLD = 8;
     }
 
     @Override
diff --git a/ring-android/app/src/main/java/cx/ring/service/CallManagerCallBack.java b/ring-android/app/src/main/java/cx/ring/service/CallManagerCallBack.java
index 4f7c5a770a44f3cb52de0e1976cb5b0f742e04f2..66bc4aeacf3ae0043ea664279562b2f7fc6301dc 100644
--- a/ring-android/app/src/main/java/cx/ring/service/CallManagerCallBack.java
+++ b/ring-android/app/src/main/java/cx/ring/service/CallManagerCallBack.java
@@ -175,8 +175,13 @@ public class CallManagerCallBack extends Callback {
     }
 
     @Override
-    public void incomingMessage(String ID, String from, String msg) {
-        Log.w(TAG, "on_incoming_message:" + msg);
+    public void incomingMessage(String ID, String from, StringMap messages) {
+        Log.w(TAG, "on_incoming_message:" + messages);
+
+        String msg = messages.get("text/plain");
+        if (msg == null)
+            return;
+
         Intent intent = new Intent(INCOMING_TEXT);
         intent.putExtra("CallID", ID);
         intent.putExtra("From", from);
diff --git a/ring-android/app/src/main/java/cx/ring/service/ISipService.aidl b/ring-android/app/src/main/java/cx/ring/service/ISipService.aidl
index 3342b7ccfedaf250cbec74822603a6141a3cbf2c..4708062d2546e61c2da59a5a9b86a1ae4ee57c9d 100644
--- a/ring-android/app/src/main/java/cx/ring/service/ISipService.aidl
+++ b/ring-android/app/src/main/java/cx/ring/service/ISipService.aidl
@@ -58,7 +58,9 @@ interface ISipService {
     
     /* IM */
     void sendTextMessage(in String callID, in SipMessage message);
-        
+    void sendAccountTextMessage(in String accountid, in String to, in String msg);
+
+
     void transfer(in String callID, in String to);
     void attendedTransfer(in String transferID, in String targetID);
     
diff --git a/ring-android/app/src/main/java/cx/ring/service/SipService.java b/ring-android/app/src/main/java/cx/ring/service/SipService.java
index ea66a73e145ca0d7e6457a58d53b60bff583a1e0..8f9caae9db56547f7a76507b68e89520499fd9cc 100644
--- a/ring-android/app/src/main/java/cx/ring/service/SipService.java
+++ b/ring-android/app/src/main/java/cx/ring/service/SipService.java
@@ -930,7 +930,9 @@ public class SipService extends Service {
                 @Override
                 protected void doRun() throws SameThreadException, RemoteException {
                     Log.i(TAG, "SipService.sendTextMessage() thread running...");
-                    Ringservice.sendTextMessage(callID, message.comment);
+                    StringMap messages  = new StringMap();
+                    messages.set("text/plain", message.comment);
+                    Ringservice.sendTextMessage(callID, messages, "", false);
                     if (getConferences().get(callID) != null)
                         getConferences().get(callID).addSipMessage(message);
                 }
@@ -938,6 +940,17 @@ public class SipService extends Service {
 
         }
 
+        @Override
+        public void sendAccountTextMessage(final String accountid, final String to, final String msg) {
+            getExecutor().execute(new SipRunnable() {
+                @Override
+                protected void doRun() throws SameThreadException, RemoteException {
+                    Log.i(TAG, "SipService.sendAccountTextMessage() thread running... " + accountid + " " + to + " " + msg);
+                    Ringservice.sendAccountTextMessage(accountid, to, msg);
+                }
+            });
+        }
+
         @Override
         public List<Codec> getAudioCodecList(final String accountID) throws RemoteException {
             return getExecutor().executeAndReturn(new SipRunnableWithReturn<ArrayList<Codec>>() {
@@ -1064,7 +1077,7 @@ public class SipService extends Service {
                 @Override
                 protected Map<String, String> doRun() throws SameThreadException {
                     Log.i(TAG, "SipService.validateCertificatePath() thread running...");
-                    return Ringservice.validateCertificatePath(accountID, certificatePath, privateKeyPath, "").toNative();
+                    return Ringservice.validateCertificatePath(accountID, certificatePath, privateKeyPath, "", "").toNative();
                 }
             });
         }
diff --git a/ring-android/app/src/main/jni/callmanager.i b/ring-android/app/src/main/jni/callmanager.i
index 9d29d4cc02a683242b737110097149630cc9abcc..8efe4e047af49b6cd3d3e970aa671e661d01ae6e 100644
--- a/ring-android/app/src/main/jni/callmanager.i
+++ b/ring-android/app/src/main/jni/callmanager.i
@@ -41,7 +41,7 @@ public:
     virtual void transferSucceeded(void){}
     virtual void recordPlaybackStopped(const std::string& path){}
     virtual void voiceMailNotify(const std::string& call_id, int nd_msg){}
-    virtual void incomingMessage(const std::string& id, const std::string& from, const std::string& msg){}
+    virtual void incomingMessage(const std::string& id, const std::string& from, const std::map<std::string, std::string>& messages){}
     virtual void incomingCall(const std::string& account_id, const std::string& call_id, const std::string& from){}
     virtual void recordPlaybackFilepath(const std::string& id, const std::string& filename){}
     virtual void conferenceCreated(const std::string& conf_id){}
@@ -129,8 +129,7 @@ void requestGoClear(const std::string& callID);
 void acceptEnrollment(const std::string& callID, bool accepted);
 
 /* Instant messaging */
-void sendTextMessage(const std::string& callID, const std::string& message);
-void sendTextMessage(const std::string& callID, const std::string& message, const std::string& from);
+void sendTextMessage(const std::string& callID, const std::map<std::string, std::string>& messages, const std::string& from, const bool& isMixed);
 
 }
 
@@ -142,7 +141,7 @@ public:
     virtual void transferSucceeded(void){}
     virtual void recordPlaybackStopped(const std::string& path){}
     virtual void voiceMailNotify(const std::string& call_id, int nd_msg){}
-    virtual void incomingMessage(const std::string& id, const std::string& from, const std::string& msg){}
+    virtual void incomingMessage(const std::string& id, const std::string& from, const std::map<std::string, std::string>& messages){}
     virtual void incomingCall(const std::string& account_id, const std::string& call_id, const std::string& from){}
     virtual void recordPlaybackFilepath(const std::string& id, const std::string& filename){}
     virtual void conferenceCreated(const std::string& conf_id){}
diff --git a/ring-android/app/src/main/jni/configurationmanager.i b/ring-android/app/src/main/jni/configurationmanager.i
index fe28f4583e50c1053acdb8c393408d7200dd7bb3..2450194c3c99952947f22d84ead1f51300399ee5 100644
--- a/ring-android/app/src/main/jni/configurationmanager.i
+++ b/ring-android/app/src/main/jni/configurationmanager.i
@@ -144,12 +144,13 @@ double getVolume(const std::string& device);
 std::map<std::string, std::string> validateCertificatePath(const std::string& accountId,
                                                        const std::string& certificate,
                                                        const std::string& privateKey,
+                                                       const std::string& privateKeyPassword,
                                                        const std::string& caList);
 
 std::map<std::string, std::string> validateCertificate(const std::string& accountId, const std::string& certificate);
 
 std::map<std::string, std::string> getCertificateDetails(const std::string& certificate);
-std::map<std::string, std::string> getCertificateDetailsPath(const std::string& certificate);
+std::map<std::string, std::string> getCertificateDetailsPath(const std::string& certificate, const std::string& privateKey, const std::string& privateKeyPass);
 
 std::vector<std::string> getPinnedCertificates();