diff --git a/java/android/OlmLibSdk/olm-sdk/build.gradle b/java/android/OlmLibSdk/olm-sdk/build.gradle
index b02ca0c620969671fc0e1908cc9190b58dea2d18..188acb66f021775443d65e38a6d4de1dcb5c27f3 100644
--- a/java/android/OlmLibSdk/olm-sdk/build.gradle
+++ b/java/android/OlmLibSdk/olm-sdk/build.gradle
@@ -11,7 +11,7 @@ android {
         targetSdkVersion 21
         versionCode 1
         versionName "1.0"
-        version "0.3.0"
+        version "0.2.0"
         testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
     }
     buildTypes {
diff --git a/java/android/OlmLibSdk/olm-sdk/src/androidTest/java/org/matrix/olm/OlmGroupSessionTest.java b/java/android/OlmLibSdk/olm-sdk/src/androidTest/java/org/matrix/olm/OlmGroupSessionTest.java
index 6e12463319a190871cc3456dd2d8163700a4e350..7e0324bd235009c970fdd42804051d9af07ee463 100644
--- a/java/android/OlmLibSdk/olm-sdk/src/androidTest/java/org/matrix/olm/OlmGroupSessionTest.java
+++ b/java/android/OlmLibSdk/olm-sdk/src/androidTest/java/org/matrix/olm/OlmGroupSessionTest.java
@@ -151,8 +151,10 @@ public class OlmGroupSessionTest {
     @Test
     public void test10InboundDecryptMessage() {
         // test decrypted message
-        mBobDecryptedMessage = mBobInboundGroupSession.decryptMessage(mAliceToBobMessage);
+        OlmInboundGroupSession.DecryptIndex index = new OlmInboundGroupSession.DecryptIndex();
+        mBobDecryptedMessage = mBobInboundGroupSession.decryptMessage(mAliceToBobMessage, index);
         assertFalse(TextUtils.isEmpty(mBobDecryptedMessage));
+        assertTrue(0==index.mIndex);
     }
 
     @Test
@@ -435,8 +437,10 @@ public class OlmGroupSessionTest {
             assertTrue("Exception in test18TestBadCharacterCrashInDecrypt, Exception code=" + e.getExceptionCode(), false);
         }
 
-        String decryptedMessage = bobInboundGroupSession.decryptMessage(msgToDecryptWithEmoji);
+        OlmInboundGroupSession.DecryptIndex index = new OlmInboundGroupSession.DecryptIndex();
+        String decryptedMessage = bobInboundGroupSession.decryptMessage(msgToDecryptWithEmoji, index);
         assertNotNull(decryptedMessage);
+        assertTrue(13==index.mIndex);
     }
 
 }
diff --git a/java/android/OlmLibSdk/olm-sdk/src/main/java/org/matrix/olm/OlmInboundGroupSession.java b/java/android/OlmLibSdk/olm-sdk/src/main/java/org/matrix/olm/OlmInboundGroupSession.java
index fa4ca1d53e3c73a45bcbe812452a31d3d941ec3c..664b22e658ed71ea47af2190ef5db0f60466f220 100644
--- a/java/android/OlmLibSdk/olm-sdk/src/main/java/org/matrix/olm/OlmInboundGroupSession.java
+++ b/java/android/OlmLibSdk/olm-sdk/src/main/java/org/matrix/olm/OlmInboundGroupSession.java
@@ -44,6 +44,14 @@ public class OlmInboundGroupSession extends CommonSerializeUtils implements Seri
      */
     private transient long mNativeId;
 
+    /**
+     * Wrapper class to be used in {@link #decryptMessage(String, DecryptIndex)}
+     */
+    static public class DecryptIndex {
+        /** decrypt index **/
+        public long mIndex;
+    }
+
     /**
      * Constructor.<br>
      * Create and save a new native session instance ID and start a new inbound group session.
@@ -136,13 +144,14 @@ public class OlmInboundGroupSession extends CommonSerializeUtils implements Seri
     /**
      * Decrypt the message passed in parameter.
      * @param aEncryptedMsg the message to be decrypted
+     * @param aDecryptIndex_out decrypted message index
      * @return the decrypted message if operation succeed, null otherwise.
      */
-    public String decryptMessage(String aEncryptedMsg) {
-        String decryptedMessage = decryptMessageJni(aEncryptedMsg, OlmManager.ENABLE_STRING_UTF8_SPECIFIC_CONVERSION);
+    public String decryptMessage(String aEncryptedMsg, DecryptIndex aDecryptIndex_out) {
+        String decryptedMessage = decryptMessageJni(aEncryptedMsg, aDecryptIndex_out, OlmManager.ENABLE_STRING_UTF8_SPECIFIC_CONVERSION);
         return decryptedMessage;
     }
-    private native String decryptMessageJni(String aEncryptedMsg, boolean aIsUtf8ConversionRequired);
+    private native String decryptMessageJni(String aEncryptedMsg, DecryptIndex aDecryptIndex_out, boolean aIsUtf8ConversionRequired);
 
 
     /**
diff --git a/java/android/OlmLibSdk/olm-sdk/src/main/jni/Android.mk b/java/android/OlmLibSdk/olm-sdk/src/main/jni/Android.mk
index 2d94676e036efdc72d8323543b44b68afdbb84cd..2a7d216e991700f683721a3d497df43834f7673b 100644
--- a/java/android/OlmLibSdk/olm-sdk/src/main/jni/Android.mk
+++ b/java/android/OlmLibSdk/olm-sdk/src/main/jni/Android.mk
@@ -2,8 +2,8 @@ LOCAL_PATH := $(call my-dir)
 include $(CLEAR_VARS)
 
 LOCAL_MODULE := olm
-MAJOR := 1
-MINOR := 3
+MAJOR := 2
+MINOR := 0
 PATCH := 0
 OLM_VERSION := $(MAJOR).$(MINOR).$(PATCH)
 SRC_ROOT_DIR := ../../../../../../..
diff --git a/java/android/OlmLibSdk/olm-sdk/src/main/jni/olm_inbound_group_session.cpp b/java/android/OlmLibSdk/olm-sdk/src/main/jni/olm_inbound_group_session.cpp
index a78c2cf9772579ce7900f2b9f727f6a1379778dd..e450a4c4d9c38ea5651932488b30f8b5702b7849 100644
--- a/java/android/OlmLibSdk/olm-sdk/src/main/jni/olm_inbound_group_session.cpp
+++ b/java/android/OlmLibSdk/olm-sdk/src/main/jni/olm_inbound_group_session.cpp
@@ -180,13 +180,16 @@ JNIEXPORT jstring OLM_INBOUND_GROUP_SESSION_FUNC_DEF(sessionIdentifierJni)(JNIEn
 }
 
 
-JNIEXPORT jstring OLM_INBOUND_GROUP_SESSION_FUNC_DEF(decryptMessageJni)(JNIEnv *env, jobject thiz, jstring aEncryptedMsg, jboolean aIsUtf8ConversionRequired)
+JNIEXPORT jstring OLM_INBOUND_GROUP_SESSION_FUNC_DEF(decryptMessageJni)(JNIEnv *env, jobject thiz, jstring aEncryptedMsg, jobject aDecryptIndex, jboolean aIsUtf8ConversionRequired)
 {
     jstring decryptedMsgRetValue = 0;
     OlmInboundGroupSession *sessionPtr = NULL;
     const char *encryptedMsgPtr = NULL;
     uint8_t *plainTextMsgPtr = NULL;
     uint8_t *tempEncryptedPtr = NULL;
+    uint32_t messageIndex = 0;
+    jclass indexObjJClass = 0;
+    jfieldID indexMsgFieldId;
 
     LOGD("## decryptMessageJni(): inbound group session IN");
 
@@ -198,10 +201,22 @@ JNIEXPORT jstring OLM_INBOUND_GROUP_SESSION_FUNC_DEF(decryptMessageJni)(JNIEnv *
     {
         LOGE(" ## decryptMessageJni(): failure - invalid encrypted message");
     }
+    else if(0 == aDecryptIndex)
+    {
+        LOGE(" ## decryptMessageJni(): failure - invalid index object");
+    }
     else if(0 == (encryptedMsgPtr = env->GetStringUTFChars(aEncryptedMsg, 0)))
     {
         LOGE(" ## decryptMessageJni(): failure - encrypted message JNI allocation OOM");
     }
+    else if(0 == (indexObjJClass = env->GetObjectClass(aDecryptIndex)))
+    {
+        LOGE("## decryptMessageJni(): failure - unable to get index class");
+    }
+    else if(0 == (indexMsgFieldId = env->GetFieldID(indexObjJClass,"mIndex","J")))
+    {
+        LOGE("## decryptMessageJni(): failure - unable to get index type field");
+    }
     else
     {
         // get encrypted message length
@@ -238,13 +253,17 @@ JNIEXPORT jstring OLM_INBOUND_GROUP_SESSION_FUNC_DEF(decryptMessageJni)(JNIEnv *
                                                            tempEncryptedPtr,
                                                            encryptedMsgLength,
                                                            plainTextMsgPtr,
-                                                           maxPlainTextLength);
+                                                           maxPlainTextLength,
+                                                           &messageIndex);
                 if(plaintextLength == olm_error())
                 {
                     LOGE(" ## decryptMessageJni(): failure - olm_group_decrypt Msg=%s",(const char *)olm_inbound_group_session_last_error(sessionPtr));
                 }
                 else
                 {
+                    // update index
+                    env->SetLongField(aDecryptIndex, indexMsgFieldId, (jlong)messageIndex);
+
                     // UTF-8 conversion workaround for issue on Android versions older than Marshmallow (23)
                     if(aIsUtf8ConversionRequired)
                     {
diff --git a/java/android/OlmLibSdk/olm-sdk/src/main/jni/olm_inbound_group_session.h b/java/android/OlmLibSdk/olm-sdk/src/main/jni/olm_inbound_group_session.h
index ec402fdb6c96a3502a56f6910fc465b2cc4b4ecc..7d6fb5eacb2301e290b67026ead9e6bc211fe8f1 100644
--- a/java/android/OlmLibSdk/olm-sdk/src/main/jni/olm_inbound_group_session.h
+++ b/java/android/OlmLibSdk/olm-sdk/src/main/jni/olm_inbound_group_session.h
@@ -33,7 +33,7 @@ JNIEXPORT jlong OLM_INBOUND_GROUP_SESSION_FUNC_DEF(createNewSessionJni)(JNIEnv *
 
 JNIEXPORT jint OLM_INBOUND_GROUP_SESSION_FUNC_DEF(initInboundGroupSessionWithSessionKeyJni)(JNIEnv *env, jobject thiz, jstring aSessionKey);
 JNIEXPORT jstring OLM_INBOUND_GROUP_SESSION_FUNC_DEF(sessionIdentifierJni)(JNIEnv *env, jobject thiz);
-JNIEXPORT jstring OLM_INBOUND_GROUP_SESSION_FUNC_DEF(decryptMessageJni)(JNIEnv *env, jobject thiz, jstring aEncryptedMsg, jboolean aIsUtf8ConversionRequired);
+JNIEXPORT jstring OLM_INBOUND_GROUP_SESSION_FUNC_DEF(decryptMessageJni)(JNIEnv *env, jobject thiz, jstring aEncryptedMsg, jobject aDecryptIndex, jboolean aIsUtf8ConversionRequired);
 
 // serialization
 JNIEXPORT jstring OLM_INBOUND_GROUP_SESSION_FUNC_DEF(serializeDataWithKeyJni)(JNIEnv *env, jobject thiz, jstring aKey, jobject aErrorMsg);