diff --git a/bttestapp/src/org/codeaurora/bluetooth/bttestapp/MapTestActivity.java b/bttestapp/src/org/codeaurora/bluetooth/bttestapp/MapTestActivity.java
index c35b0be..e6ff140 100644
--- a/bttestapp/src/org/codeaurora/bluetooth/bttestapp/MapTestActivity.java
+++ b/bttestapp/src/org/codeaurora/bluetooth/bttestapp/MapTestActivity.java
@@ -298,14 +298,14 @@
                     new MonkeyEvent("map-getfolderlisting-size", true)
                             .addReplyParam("size", size)
                             .send();
-                    shortToast("GetMessagesListing size OK: size=" + size);
+                    shortToast("GetFolderListing size OK: size=" + size);
                 }
 
                 @Override
                 public void onGetFolderListingSizeError() {
                     goToState(Job.IDLE);
                     new MonkeyEvent("map-getfolderlisting-size", false).send();
-                    shortToast("GetMessagesListing size FAILED");
+                    shortToast("GetFolderListing size FAILED");
                 }
 
                 @Override
diff --git a/src/org/codeaurora/bluetooth/map/BluetoothMasAppEmail.java b/src/org/codeaurora/bluetooth/map/BluetoothMasAppEmail.java
index 7d1f99e..c218e40 100644
--- a/src/org/codeaurora/bluetooth/map/BluetoothMasAppEmail.java
+++ b/src/org/codeaurora/bluetooth/map/BluetoothMasAppEmail.java
@@ -735,64 +735,40 @@
 
     private int setMsgStatusEmail(long handle,
             BluetoothMasAppParams bluetoothMasAppParams){
-        //Query the mailbox table to get the id values for Inbox and Trash folder
-        Uri uri1 = Uri.parse("content://com.android.email.provider/mailbox");
-        Cursor cr1 = mContext.getContentResolver().query(uri1, null,
-                "(UPPER(displayName) = 'INBOX' OR UPPER(displayName) LIKE '%TRASH%')", null, null);
-        int inboxFolderId = 0;
-        int deletedFolderId = 0;
-        int msgFolderId = 0;
-        String folderName;
-        if (cr1 != null && cr1.moveToFirst()) {
-            do {
-                folderName = cr1.getString(cr1.getColumnIndex("displayName"));
-                if(folderName.equalsIgnoreCase("INBOX")){
-                    inboxFolderId = cr1.getInt(cr1.getColumnIndex("_id"));
-                } else {
-                    deletedFolderId = cr1.getInt(cr1.getColumnIndex("_id"));
-                }
-            } while (cr1.moveToNext());
-        }
-        if (cr1 != null) {
-            cr1.close();
-        }
 
-        //Query the message table for the given message id
         long emailMsgId = handle - 0;
         emailMsgId = handle - OFFSET_START;
-        Uri uri2 = Uri.parse("content://com.android.email.provider/message/"+emailMsgId);
-        Cursor crEmail = mContext.getContentResolver().query(uri2, null, null, null, null);
-        if (crEmail != null && crEmail.moveToFirst()) {
-            if (bluetoothMasAppParams.StatusIndicator == 0) {
-                /* Read Status */
-                ContentValues values = new ContentValues();
-                values.put("flagRead", bluetoothMasAppParams.StatusValue);
-                mContext.getContentResolver().update(uri2, values, null, null);
-            } else {
+        if (V) Log.v(TAG, " Msg id before Mail service:: " + emailMsgId);
+
+        long accountId = EmailUtils.getAccountId(mMasId);
+        if (V) Log.v(TAG, " Account id before Mail service:: " + accountId);
+
+        if(accountId <= -1 || emailMsgId <= -1){
+             return  ResponseCodes.OBEX_HTTP_BAD_REQUEST;
+        }
+
+        Intent emailIn = new Intent();
+        if (bluetoothMasAppParams.StatusIndicator == 0) {
+            // Read Status
+            emailIn.setAction("org.codeaurora.email.intent.action.MAIL_SERVICE_MESSAGE_READ");
+            emailIn.putExtra("org.codeaurora.email.intent.extra.MESSAGE_INFO",
+                (bluetoothMasAppParams.StatusValue ==1) ? 1:0);
+        } else {
                 if (bluetoothMasAppParams.StatusValue == 1) { //if the email is deleted
-                    msgFolderId = crEmail.getInt(crEmail.getColumnIndex("mailboxKey"));
-                    if(msgFolderId == deletedFolderId){
-                        // TODO: need to add notification for deleted email here
-                        mMnsClient.addMceInitiatedOperation(Long.toString(handle));
-                        mContext.getContentResolver().delete(
-                                Uri.parse("content://com.android.email.provider/message/"
-                                + emailMsgId), null, null);
-                    } else {
-                        ContentValues values = new ContentValues();
-                        values.put("mailboxKey", deletedFolderId);
-                        mContext.getContentResolver().update(uri2, values, null, null);
-                    }
+                    // TODO: need to add notification for deleted email here
+                    mMnsClient.addMceInitiatedOperation(Long.toString(handle));
+                    emailIn.setAction("org.codeaurora.email.intent.action.MAIL_SERVICE_DELETE_MESSAGE");
                 } else { // if the email is undeleted
+                    emailIn.setAction("org.codeaurora.email.intent.action.MAIL_SERVICE_MOVE_MESSAGE");
                     // TODO: restore it to original folder
-                    ContentValues values = new ContentValues();
-                    values.put("mailboxKey", inboxFolderId);
-                    mContext.getContentResolver().update(uri2, values, null, null);
+                    emailIn.putExtra("org.codeaurora.email.intent.extra.MESSAGE_INFO", TYPE_INBOX);
                 }
-            }
         }
-        if (crEmail != null) {
-            crEmail.close();
-        }
+
+        emailIn.putExtra("com.android.email.intent.extra.ACCOUNT", accountId);
+        emailIn.putExtra("org.codeaurora.email.intent.extra.MESSAGE_ID", emailMsgId);
+        mContext.startService(emailIn);
+
         return ResponseCodes.OBEX_HTTP_OK;
     }
 }
