diff --git a/res/values/strings.xml b/res/values/strings.xml
index ea50e85..c33b98f 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -50,6 +50,8 @@
 
     <!-- Title text used for system dialog from STK app -->
     <string name="stk_dialog_title">SIM ToolKit</string>
+    <!-- Default message when no alpha tag in Play Tone -->
+    <string name="default_tone_dialog_msg">Playing Tone</string>
     <!-- Default message when no alpha in OPEN_CHANNEL -->
     <string name="default_open_channel_msg">Open Channel?</string>
     <!-- Default message when no alpha in SEND_DATA -->
diff --git a/src/com/android/stk/StkApp.java b/src/com/android/stk/StkApp.java
index 4484493..9d653c1 100644
--- a/src/com/android/stk/StkApp.java
+++ b/src/com/android/stk/StkApp.java
@@ -40,7 +40,7 @@
     static final int UI_TIMEOUT = (30 * 1000);
 
     // Tone default timeout - 2 seconds
-    static final int TONE_DFEAULT_TIMEOUT = (2 * 1000);
+    static final int TONE_DEFAULT_TIMEOUT = (2 * 1000);
 
     public static final String TAG = "STK App";
 
diff --git a/src/com/android/stk/StkAppService.java b/src/com/android/stk/StkAppService.java
index 91ae3d3..edd4306 100755
--- a/src/com/android/stk/StkAppService.java
+++ b/src/com/android/stk/StkAppService.java
@@ -32,6 +32,8 @@
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.content.res.Resources.NotFoundException;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.net.Uri;
@@ -43,6 +45,7 @@
 import android.os.PersistableBundle;
 import android.os.PowerManager;
 import android.os.SystemProperties;
+import android.os.Vibrator;
 import android.provider.Settings;
 import android.telephony.CarrierConfigManager;
 import android.telephony.TelephonyManager;
@@ -73,6 +76,7 @@
 import com.android.internal.telephony.cat.CatLog;
 import com.android.internal.telephony.cat.CatResponseMessage;
 import com.android.internal.telephony.cat.TextMessage;
+import com.android.internal.telephony.cat.ToneSettings;
 import com.android.internal.telephony.uicc.IccRefreshResponse;
 import com.android.internal.telephony.uicc.IccCardStatus.CardState;
 import com.android.internal.telephony.PhoneConstants;
@@ -167,6 +171,8 @@
     private int mSimCount = 0;
     private PowerManager mPowerManager = null;
     private StkCmdReceiver mStkCmdReceiver = null;
+    private TonePlayer mTonePlayer = null;
+    private Vibrator mVibrator = null;
 
     // Used for setting FLAG_ACTIVITY_NO_USER_ACTION when
     // creating an intent.
@@ -190,6 +196,8 @@
     static final String STK_MENU_URI = "stk://com.android.stk/menu/";
     static final String STK_INPUT_URI = "stk://com.android.stk/input/";
     static final String STK_TONE_URI = "stk://com.android.stk/tone/";
+    static final String FINISH_TONE_ACTIVITY_ACTION =
+                                "android.intent.action.stk.finish_activity";
 
     // These below constants are used for SETUP_EVENT_LIST
     static final String SETUP_EVENT_TYPE = "event";
@@ -213,6 +221,15 @@
     //Invalid SetupEvent
     static final int INVALID_SETUP_EVENT = 0xFF;
 
+    // Message id to signal stop tone due to play tone timeout.
+    private static final int OP_STOP_TONE = 16;
+
+    // Message id to signal stop tone on user keyback.
+    static final int OP_STOP_TONE_USER = 17;
+
+    // Message id to remove stop tone message from queue.
+    private static final int STOP_TONE_WHAT = 100;
+
     // Response ids
     static final int RES_ID_MENU_SELECTION = 11;
     static final int RES_ID_INPUT = 12;
@@ -351,6 +368,10 @@
         case OP_END_SESSION:
         case OP_BOOT_COMPLETED:
             break;
+        case OP_STOP_TONE_USER:
+            msg.obj = args;
+            msg.what = STOP_TONE_WHAT;
+            break;
         default:
             return;
         }
@@ -598,6 +619,11 @@
                     }
                 }
                 break;
+            case OP_STOP_TONE_USER:
+            case OP_STOP_TONE:
+                CatLog.d(this, "Stop tone");
+                handleStopTone(msg, slotId);
+                break;
             }
         }
 
@@ -988,7 +1014,7 @@
             launchConfirmationDialog(mesg, slotId);
             break;
         case PLAY_TONE:
-            launchToneDialog(slotId);
+            handlePlayTone(slotId);
             break;
         case OPEN_CHANNEL:
             launchOpenChannelDialog(slotId);
@@ -1616,21 +1642,122 @@
         }
     }
 
-    private void launchToneDialog(int slotId) {
-        Intent newIntent = new Intent(this, ToneDialog.class);
-        String uriString = STK_TONE_URI + slotId;
-        Uri uriData = Uri.parse(uriString);
-        //Set unique URI to create a new instance of activity for different slotId.
-        CatLog.d(LOG_TAG, "launchToneDialog, slotId: " + slotId);
-        newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
-                | Intent.FLAG_ACTIVITY_NO_HISTORY
-                | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
-                | getFlagActivityNoUserAction(InitiatedByUserAction.unknown, slotId));
-        newIntent.putExtra("TEXT", mStkContext[slotId].mCurrentCmd.geTextMessage());
-        newIntent.putExtra("TONE", mStkContext[slotId].mCurrentCmd.getToneSettings());
-        newIntent.putExtra(SLOT_ID, slotId);
-        newIntent.setData(uriData);
-        startActivity(newIntent);
+    private void handlePlayTone(int slotId) {
+        TextMessage toneMsg = mStkContext[slotId].mCurrentCmd.geTextMessage();
+
+        boolean showUser = true;
+        boolean displayDialog = true;
+        Resources resource = Resources.getSystem();
+        try {
+            displayDialog = !resource.getBoolean(
+                    com.android.internal.R.bool.config_stkNoAlphaUsrCnf);
+        } catch (NotFoundException e) {
+            displayDialog = true;
+        }
+
+        // As per the spec 3GPP TS 11.14, 6.4.5. Play Tone.
+        // If there is no alpha identifier tlv present, UE may show the
+        // user information. 'config_stkNoAlphaUsrCnf' value will decide
+        // whether to show it or not.
+        // If alpha identifier tlv is present and its data is null, play only tone
+        // without showing user any information.
+        // Alpha Id is Present, but the text data is null.
+        if ((toneMsg.text != null ) && (toneMsg.text.equals(""))) {
+            CatLog.d(this, "Alpha identifier data is null, play only tone");
+            showUser = false;
+        }
+        // Alpha Id is not present AND we need to show info to the user.
+        if (toneMsg.text == null && displayDialog) {
+            CatLog.d(this, "toneMsg.text " + toneMsg.text
+                    + " Starting ToneDialog activity with default message.");
+            toneMsg.text = getResources().getString(R.string.default_tone_dialog_msg);
+            showUser = true;
+        }
+        // Dont show user info, if config setting is true.
+        if (toneMsg.text == null && !displayDialog) {
+            CatLog.d(this, "config value stkNoAlphaUsrCnf is true");
+            showUser = false;
+        }
+
+        CatLog.d(this, "toneMsg.text: " + toneMsg.text + "showUser: " +showUser +
+                "displayDialog: " +displayDialog);
+        playTone(showUser, slotId);
+    }
+
+    private void playTone(boolean showUserInfo, int slotId) {
+        // Start playing tone and vibration
+        ToneSettings settings = mStkContext[slotId].mCurrentCmd.getToneSettings();
+        if (null == settings) {
+            CatLog.d(this, "null settings, not playing tone.");
+            return;
+        }
+
+        mVibrator = (Vibrator)getSystemService(VIBRATOR_SERVICE);
+        mTonePlayer = new TonePlayer();
+        mTonePlayer.play(settings.tone);
+        int timeout = StkApp.calculateDurationInMilis(settings.duration);
+        if (timeout == 0) {
+            timeout = StkApp.TONE_DEFAULT_TIMEOUT;
+        }
+
+        Message msg = mServiceHandler.obtainMessage();
+        msg.arg1 = OP_STOP_TONE;
+        msg.arg2 = slotId;
+        msg.obj = (Integer)(showUserInfo ? 1 : 0);
+        msg.what = STOP_TONE_WHAT;
+        mServiceHandler.sendMessageDelayed(msg, timeout);
+        if (settings.vibrate) {
+            mVibrator.vibrate(timeout);
+        }
+
+        // Start Tone dialog Activity to show user the information.
+        if (showUserInfo) {
+            Intent newIntent = new Intent(sInstance, ToneDialog.class);
+            String uriString = STK_TONE_URI + slotId;
+            Uri uriData = Uri.parse(uriString);
+            newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
+                    | Intent.FLAG_ACTIVITY_NO_HISTORY
+                    | Intent.FLAG_ACTIVITY_SINGLE_TOP
+                    | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
+                    | getFlagActivityNoUserAction(InitiatedByUserAction.unknown, slotId));
+            newIntent.putExtra("TEXT", mStkContext[slotId].mCurrentCmd.geTextMessage());
+            newIntent.putExtra(SLOT_ID, slotId);
+            newIntent.setData(uriData);
+            startActivity(newIntent);
+        }
+    }
+
+    private void finishToneDialogActivity() {
+        Intent finishIntent = new Intent(FINISH_TONE_ACTIVITY_ACTION);
+        sendBroadcast(finishIntent);
+    }
+
+    private void handleStopTone(Message msg, int slotId) {
+        int resId = 0;
+
+        // Stop the play tone in following cases:
+        // 1.OP_STOP_TONE: play tone timer expires.
+        // 2.STOP_TONE_USER: user pressed the back key.
+        if (msg.arg1 == OP_STOP_TONE) {
+            resId = RES_ID_DONE;
+            // Dismiss Tone dialog, after finishing off playing the tone.
+            int finishActivity = (Integer) msg.obj;
+            if (finishActivity == 1) finishToneDialogActivity();
+        } else if (msg.arg1 == OP_STOP_TONE_USER) {
+            resId = RES_ID_END_SESSION;
+        }
+
+        sendResponse(resId, slotId, true);
+        mServiceHandler.removeMessages(STOP_TONE_WHAT);
+        if (mTonePlayer != null)  {
+            mTonePlayer.stop();
+            mTonePlayer.release();
+            mTonePlayer = null;
+        }
+        if (mVibrator != null) {
+            mVibrator.cancel();
+            mVibrator = null;
+        }
     }
 
     private void launchOpenChannelDialog(final int slotId) {
diff --git a/src/com/android/stk/ToneDialog.java b/src/com/android/stk/ToneDialog.java
index 834d575..40660f5 100755
--- a/src/com/android/stk/ToneDialog.java
+++ b/src/com/android/stk/ToneDialog.java
@@ -17,11 +17,13 @@
 package com.android.stk;
 
 import android.app.Activity;
+import android.content.BroadcastReceiver;
+import android.content.Context;
 import android.content.Intent;
+import android.content.IntentFilter;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Message;
-import android.os.Vibrator;
 import android.view.KeyEvent;
 import android.view.MotionEvent;
 import android.view.View;
@@ -29,49 +31,28 @@
 import android.widget.TextView;
 import com.android.internal.telephony.cat.CatLog;
 import com.android.internal.telephony.cat.TextMessage;
-import com.android.internal.telephony.cat.ToneSettings;
+import com.android.internal.telephony.cat.CatLog;
 
 /**
- * Activity used for PLAY TONE command.
+ * Activity used to display tone dialog.
  *
  */
 public class ToneDialog extends Activity {
     TextMessage toneMsg = null;
-    ToneSettings settings = null;
-    TonePlayer player = null;
     int mSlotId = -1;
-    boolean mIsResponseSent = false;
 
     private static final String LOG_TAG = new Object(){}.getClass().getEnclosingClass().getName();
 
-    /**
-     * Handler used to stop tones from playing when the duration ends.
-     */
-    Handler mToneStopper = new Handler() {
-        @Override
-        public void handleMessage(Message msg) {
-            switch (msg.what) {
-            case MSG_ID_STOP_TONE:
-                sendResponse(StkAppService.RES_ID_DONE);
-                finish();
-                break;
-            }
-        }
-    };
-
-    Vibrator mVibrator;
-
-    // Message id to signal tone duration timeout.
-    private static final int MSG_ID_STOP_TONE = 0xda;
-
     @Override
     protected void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
         CatLog.d(LOG_TAG, "onCreate");
-        mVibrator = (Vibrator)getSystemService(VIBRATOR_SERVICE);
-
         initFromIntent(getIntent());
+        // Register receiver
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(StkAppService.FINISH_TONE_ACTIVITY_ACTION);
+        registerReceiver(mFinishActivityReceiver, filter);
 
         // remove window title
         View title = findViewById(com.android.internal.R.id.title);
@@ -98,50 +79,21 @@
         if (toneMsg.iconSelfExplanatory && toneMsg.icon != null) {
             tv.setVisibility(View.GONE);
         }
-
-        // Start playing tone and vibration
-        if (null == settings) {
-            CatLog.d(LOG_TAG, "onCreate - null settings - finish");
-            finish();
-            return;
-        }
-
-        player = new TonePlayer();
-        player.play(settings.tone);
-        int timeout = StkApp.calculateDurationInMilis(settings.duration);
-        if (timeout == 0) {
-            timeout = StkApp.TONE_DFEAULT_TIMEOUT;
-        }
-        mToneStopper.sendEmptyMessageDelayed(MSG_ID_STOP_TONE, timeout);
-        if (settings.vibrate && mVibrator != null) {
-            mVibrator.vibrate(timeout);
-        }
     }
 
     @Override
     protected void onDestroy() {
-        super.onDestroy();
         CatLog.d(LOG_TAG, "onDestroy");
-
-        mToneStopper.removeMessages(MSG_ID_STOP_TONE);
-        if (!mIsResponseSent) {
-            sendResponse(StkAppService.RES_ID_END_SESSION);
-        }
-
-        if (null != player) {
-            player.stop();
-            player.release();
-        }
-        if (null != mVibrator) {
-            mVibrator.cancel();
-        }
+        // Unregister receiver
+        unregisterReceiver(mFinishActivityReceiver);
+        super.onDestroy();
     }
 
     @Override
     public boolean onKeyDown(int keyCode, KeyEvent event) {
         switch (keyCode) {
         case KeyEvent.KEYCODE_BACK:
-            sendResponse(StkAppService.RES_ID_END_SESSION);
+            sendStopTone();
             finish();
             break;
         }
@@ -152,28 +104,38 @@
     public boolean onTouchEvent(MotionEvent event) {
         switch (event.getAction()) {
         case MotionEvent.ACTION_DOWN:
-            sendResponse(StkAppService.RES_ID_END_SESSION);
+            sendStopTone();
             finish();
             return true;
         }
         return super.onTouchEvent(event);
     }
 
+    private BroadcastReceiver mFinishActivityReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            // Intent received from StkAppService to finish ToneDialog activity,
+            // after finishing off playing the tone.
+            if (intent.getAction().equals(StkAppService.FINISH_TONE_ACTIVITY_ACTION)) {
+                CatLog.d(this, "Finishing Tone dialog activity");
+                finish();
+            }
+        }
+    };
+
     private void initFromIntent(Intent intent) {
         if (intent == null) {
             finish();
         }
         toneMsg = intent.getParcelableExtra("TEXT");
-        settings = intent.getParcelableExtra("TONE");
         mSlotId = intent.getIntExtra(StkAppService.SLOT_ID, -1);
     }
 
-    private void sendResponse(int resId) {
+    // Send stop playing tone to StkAppService, when user presses back key.
+    private void sendStopTone() {
         Bundle args = new Bundle();
-        args.putInt(StkAppService.OPCODE, StkAppService.OP_RESPONSE);
+        args.putInt(StkAppService.OPCODE, StkAppService.OP_STOP_TONE_USER);
         args.putInt(StkAppService.SLOT_ID, mSlotId);
-        args.putInt(StkAppService.RES_ID, resId);
         startService(new Intent(this, StkAppService.class).putExtras(args));
-        mIsResponseSent = true;
     }
 }
