diff --git a/testapps/TestRcsApp/TestApp/AndroidManifest.xml b/testapps/TestRcsApp/TestApp/AndroidManifest.xml
index f439883..4e40120 100644
--- a/testapps/TestRcsApp/TestApp/AndroidManifest.xml
+++ b/testapps/TestRcsApp/TestApp/AndroidManifest.xml
@@ -19,8 +19,8 @@
 -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.google.android.sample.rcsclient"
-    android:versionCode="8"
-    android:versionName="1.0.7">
+    android:versionCode="9"
+    android:versionName="1.0.8">
 
     <uses-sdk
         android:minSdkVersion="30"
diff --git a/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/ChatActivity.java b/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/ChatActivity.java
index bb1283a..8f7e6a8 100644
--- a/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/ChatActivity.java
+++ b/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/ChatActivity.java
@@ -49,10 +49,10 @@
 public class ChatActivity extends AppCompatActivity {
 
     public static final String EXTRA_REMOTE_PHONE_NUMBER = "REMOTE_PHONE_NUMBER";
-    public static final String TELURI_PREFIX = "tel:";
     private static final String TAG = "TestRcsApp.ChatActivity";
     private static final int INIT_LIST = 1;
     private static final int SHOW_STATUS = 2;
+    private static final int EMPTY_MSG = 3;
     private static final float TEXT_SIZE = 20.0f;
     private static final int MARGIN_SIZE = 20;
     private static final long TIMEOUT_IN_MS = 10000L;
@@ -85,6 +85,9 @@
                     case SHOW_STATUS:
                         mTips.setText(msg.obj.toString());
                         break;
+                    case EMPTY_MSG:
+                        mNewMessage.setText("");
+                        break;
                     default:
                         Log.d(TAG, "unknown msg:" + msg.what);
                         break;
@@ -134,7 +137,7 @@
                     ChatActivity.this.getResources().getString(R.string.session_timeout)),
                     TIMEOUT_IN_MS);
             ChatManager.getInstance(getApplicationContext(), mSubId).initChatSession(
-                    TELURI_PREFIX + mDestNumber, new SessionStateCallback() {
+                    mDestNumber, new SessionStateCallback() {
                         @Override
                         public void onSuccess() {
                             Log.i(TAG, "session init succeeded");
@@ -176,7 +179,8 @@
                         ChatManager.getInstance(getApplicationContext(), mSubId).addNewMessage(
                                 mNewMessage.getText().toString(), ChatManager.SELF, mDestNumber);
                         ChatManager.getInstance(getApplicationContext(), mSubId).sendMessage(
-                                TELURI_PREFIX + mDestNumber, mNewMessage.getText().toString());
+                                mDestNumber, mNewMessage.getText().toString());
+                        mHandler.sendMessage(mHandler.obtainMessage(EMPTY_MSG));
                     }
                 });
             });
@@ -259,8 +263,7 @@
     protected void onDestroy() {
         super.onDestroy();
         Log.i(TAG, "onDestroy");
-        ChatManager.getInstance(getApplicationContext(), mSubId).terminateSession(
-                TELURI_PREFIX + mDestNumber);
+        ChatManager.getInstance(getApplicationContext(), mSubId).terminateSession(mDestNumber);
     }
 
     @Override
diff --git a/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/UceActivity.java b/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/UceActivity.java
index 6835fea..0fae8f6 100644
--- a/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/UceActivity.java
+++ b/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/UceActivity.java
@@ -46,6 +46,7 @@
 public class UceActivity extends AppCompatActivity {
 
     private static final String TAG = "TestRcsApp.UceActivity";
+    private static final String TELURI_PREFIX = "tel:";
     private Button mCapabilityButton;
     private Button mAvailabilityButton;
     private TextView mCapabilityResult;
@@ -146,7 +147,7 @@
 
                             public void onComplete() {
                                 Log.i(TAG, "onComplete()");
-                                mCapabilityResult.append("complete");
+                                mCapabilityResult.append("onComplete");
 
                             }
 
@@ -174,7 +175,7 @@
             for (String number : numbers) {
                 String formattedNumber = NumberUtils.formatNumber(this, number);
                 if (formattedNumber != null) {
-                    contactList.add(Uri.parse(ChatActivity.TELURI_PREFIX + formattedNumber));
+                    contactList.add(Uri.parse(TELURI_PREFIX + formattedNumber));
                 } else {
                     Log.w(TAG, "number formatted improperly, skipping: " + number);
                 }
diff --git a/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/util/ChatManager.java b/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/util/ChatManager.java
index ec048b8..399a860 100644
--- a/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/util/ChatManager.java
+++ b/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/util/ChatManager.java
@@ -55,6 +55,7 @@
 public class ChatManager {
     public static final String SELF = "self";
     private static final String TAG = "TestRcsApp.ChatManager";
+    private static final String TELURI_PREFIX = "tel:";
     private static AddressFactory sAddressFactory = new AddressFactoryImpl();
     private static HashMap<Integer, ChatManager> sChatManagerInstances = new HashMap<>();
     private final ExecutorService mFixedThreadPool = Executors.newFixedThreadPool(5);
@@ -65,7 +66,7 @@
     private SimpleRcsClient mSimpleRcsClient;
     private State mState;
     private int mSubId;
-    private HashMap<URI, SimpleChatSession> mContactSessionMap = new HashMap<>();
+    private HashMap<String, SimpleChatSession> mContactSessionMap = new HashMap<>();
     private RcsStateChangedCallback mRcsStateChangedCallback;
 
     private ChatManager(Context context, int subId) {
@@ -90,15 +91,14 @@
             mRcsStateChangedCallback.notifyStateChange(oldState, newState);
         });
         mImsService.setListener((session) -> {
-            Log.i(TAG, "onIncomingSession()");
-            mContactSessionMap.put(session.getRemoteUri(), session);
+            Log.i(TAG, "onIncomingSession():" + session.getRemoteUri());
+            String phoneNumber = getNumberFromUri(session.getRemoteUri().toString());
+            mContactSessionMap.put(phoneNumber, session);
             session.setListener(
                     // implement onMessageReceived()
                     (message) -> {
                         mFixedThreadPool.execute(() -> {
                             String msg = message.content();
-                            String phoneNumber = getNumberFromUri(
-                                    session.getRemoteUri().toString());
                             if (TextUtils.isEmpty(phoneNumber)) {
                                 Log.i(TAG, "dest number is empty, uri:"
                                         + session.getRemoteUri());
@@ -173,33 +173,34 @@
 
     /**
      * Initiate 1 to 1 chat session.
-     * @param telUriContact destination tel Uri.
+     *
+     * @param contact  destination phone number.
      * @param callback callback for session state.
      */
-    public void initChatSession(String telUriContact, SessionStateCallback callback) {
+    public void initChatSession(String contact, SessionStateCallback callback) {
         if (mState != State.REGISTERED) {
             Log.i(TAG, "Could not init session due to State = " + mState);
             return;
         }
-        URI uri = createUri(telUriContact);
-        if (mContactSessionMap.containsKey(uri)) {
+        Log.i(TAG, "initChatSession contact: " + contact);
+        if (mContactSessionMap.containsKey(contact)) {
             callback.onSuccess();
-            Log.i(TAG, "uri exists");
+            Log.i(TAG, "contact exists");
             return;
         }
         Futures.addCallback(
-                mImsService.startOriginatingChatSession(telUriContact),
+                mImsService.startOriginatingChatSession(TELURI_PREFIX + contact),
                 new FutureCallback<SimpleChatSession>() {
                     @Override
                     public void onSuccess(SimpleChatSession chatSession) {
-                        mContactSessionMap.put(chatSession.getRemoteUri(), chatSession);
+                        String phoneNumber = getNumberFromUri(
+                                chatSession.getRemoteUri().toString());
+                        mContactSessionMap.put(phoneNumber, chatSession);
                         chatSession.setListener(
                                 // implement onMessageReceived()
                                 (message) -> {
                                     mFixedThreadPool.execute(() -> {
                                         String msg = message.content();
-                                        String phoneNumber = getNumberFromUri(
-                                                chatSession.getRemoteUri().toString());
                                         if (TextUtils.isEmpty(phoneNumber)) {
                                             Log.i(TAG, "dest number is empty, uri:"
                                                     + chatSession.getRemoteUri());
@@ -222,13 +223,14 @@
 
     /**
      * Send a chat message.
-     * @param telUriContact destination tel Uri.
+     *
+     * @param contact destination phone number.
      * @param message chat message.
      */
-    public void sendMessage(String telUriContact, String message) {
-        SimpleChatSession chatSession = mContactSessionMap.get(createUri(telUriContact));
+    public void sendMessage(String contact, String message) {
+        SimpleChatSession chatSession = mContactSessionMap.get(contact);
         if (chatSession == null) {
-            Log.i(TAG, "session is unavailable for telUriContact = " + telUriContact);
+            Log.i(TAG, "session is unavailable for contact = " + contact);
             return;
         }
         chatSession.sendMessage(message);
@@ -240,22 +242,23 @@
 
     /**
      * Terminate the chat session.
-     * @param telUriContact destination tel Uri
+     *
+     * @param contact destination phone number.
      */
-    public void terminateSession(String telUriContact) {
+    public void terminateSession(String contact) {
         Log.i(TAG, "terminateSession");
-        URI uri = createUri(telUriContact);
-        SimpleChatSession chatSession = mContactSessionMap.get(uri);
+        SimpleChatSession chatSession = mContactSessionMap.get(contact);
         if (chatSession == null) {
-            Log.i(TAG, "session is unavailable for telUriContact = " + telUriContact);
+            Log.i(TAG, "session is unavailable for contact = " + contact);
             return;
         }
         chatSession.terminate();
-        mContactSessionMap.remove(uri);
+        mContactSessionMap.remove(contact);
     }
 
     /**
      * Insert chat information into database.
+     *
      * @param message chat message.
      * @param src source phone number.
      * @param dest destination phone number.
