diff --git a/FMRecord/src/com/codeaurora/fmrecording/FMRecordingService.java b/FMRecord/src/com/codeaurora/fmrecording/FMRecordingService.java
index 39db48a..e542512 100644
--- a/FMRecord/src/com/codeaurora/fmrecording/FMRecordingService.java
+++ b/FMRecord/src/com/codeaurora/fmrecording/FMRecordingService.java
@@ -64,6 +64,9 @@
 import android.R.drawable;
 import android.content.ComponentName;
 import android.content.res.Resources;
+import android.os.Process;
+import android.app.ActivityManager;
+import android.app.ActivityManager.RunningAppProcessInfo;
 
 public class FMRecordingService extends Service {
     private static final String TAG     = "FMRecordingService";
@@ -86,6 +89,10 @@
     static final int START = 1;
     static final int STOP = 0;
     private int mRecordDuration = -1;
+    private Thread mStatusCheckThread = null;
+    private int clientPid = -1;
+    private String clientProcessName = "";
+
     public void onCreate() {
 
         super.onCreate();
@@ -319,6 +326,7 @@
         sendRecordingStatusIntent(STOP);
         saveFile();
         stopForeground(true);
+        stopClientStatusCheck();
     }
 
     private void saveFile() {
@@ -464,11 +472,15 @@
                      Log.d(TAG, " action = " +action);
                      if (action.equals(ACTION_FM_RECORDING)) {
                          int state = intent.getIntExtra("state", STOP);
-                         Log.d(TAG, "ACTION_FM_RECORDING Intent received" +state);
+                         Log.d(TAG, "ACTION_FM_RECORDING Intent received" + state);
                          if (state == START) {
                              Log.d(TAG, "Recording start");
                              mRecordDuration = intent.getIntExtra("record_duration", mRecordDuration);
-                             startRecord();
+                             if(startRecord()) {
+                                clientProcessName = intent.getStringExtra("process_name");
+                                clientPid = intent.getIntExtra("process_id", -1);
+                                startClientStatusCheck();
+                             }
                          } else if (state == STOP) {
                              Log.d(TAG, "Stop recording");
                              stopRecord();
@@ -482,4 +494,62 @@
         }
     }
 
+    private boolean getClientStatus(int pid, String processName) {
+      boolean status = false;
+      ActivityManager actvityManager =
+                    (ActivityManager)this.getSystemService(
+                                                           this.ACTIVITY_SERVICE);
+
+      List<RunningAppProcessInfo> procInfos =
+                                     actvityManager.getRunningAppProcesses();
+
+      for(RunningAppProcessInfo procInfo : procInfos) {
+         if ((pid == procInfo.pid)
+               &&
+              (procInfo.processName.equals(processName))) {
+              status = true;
+              break;
+         }
+      }
+      procInfos.clear();
+      return status;
+    }
+
+    private Runnable clientStatusCheckThread = new Runnable() {
+       @Override
+       public void run() {
+          while(!Thread.currentThread().isInterrupted()) {
+                try {
+                     if(!getClientStatus(clientPid, clientProcessName)) {
+                        stopRecord();
+                        break;
+                     };
+                     Thread.sleep(500);
+                }catch(Exception e) {
+                     Log.d(TAG, "Client status check thread interrupted");
+                     break;
+                }
+          }
+       }
+    };
+
+   private void startClientStatusCheck() {
+       if((mStatusCheckThread == null) ||
+          (mStatusCheckThread.getState() == Thread.State.TERMINATED)) {
+           mStatusCheckThread = new Thread(null,
+                                           clientStatusCheckThread,
+                                           "GetClientStatus");
+       }
+       if((mStatusCheckThread != null) &&
+          (mStatusCheckThread.getState() == Thread.State.NEW)) {
+           mStatusCheckThread.start();
+       }
+   }
+
+   private void stopClientStatusCheck() {
+       if(mStatusCheckThread != null) {
+          mStatusCheckThread.interrupt();
+       }
+   }
+
 }
diff --git a/fmapp/src/com/codeaurora/fmradio/FMRadioService.java b/fmapp/src/com/codeaurora/fmradio/FMRadioService.java
index 4505e9f..db64782 100644
--- a/fmapp/src/com/codeaurora/fmradio/FMRadioService.java
+++ b/fmapp/src/com/codeaurora/fmradio/FMRadioService.java
@@ -82,6 +82,9 @@
 import android.content.IntentFilter;
 import android.app.IntentService;
 import android.os.UserHandle;
+import android.os.Process;
+import android.app.ActivityManager;
+import android.app.ActivityManager.RunningAppProcessInfo;
 
 /**
  * Provides "background" FM Radio (that uses the hardware) capabilities,
@@ -688,6 +691,24 @@
       return true;
    }
 
+   private String getProcessName() {
+      int id = Process.myPid();
+      String myProcessName = this.getPackageName();
+
+      ActivityManager actvityManager =
+             (ActivityManager)this.getSystemService(this.ACTIVITY_SERVICE);
+      List<RunningAppProcessInfo> procInfos =
+             actvityManager.getRunningAppProcesses();
+
+      for(RunningAppProcessInfo procInfo : procInfos) {
+         if (id == procInfo.pid) {
+              myProcessName = procInfo.processName;
+         }
+      }
+      procInfos.clear();
+      return myProcessName;
+   }
+
    private void sendRecordIntent(int action) {
        Intent intent = new Intent(ACTION_FM_RECORDING);
        intent.putExtra("state", action);
@@ -698,6 +719,8 @@
              mRecordDuration = (FmSharedPreferences.getRecordDuration() * 60 * 1000);
           }
           intent.putExtra("record_duration", mRecordDuration);
+          intent.putExtra("process_name", getProcessName());
+          intent.putExtra("process_id", Process.myPid());
         }
        Log.d(LOGTAG, "Sending Recording intent for = " +action);
        getApplicationContext().sendBroadcast(intent);
diff --git a/fmapp2/src/com/caf/fmradio/FMRadioService.java b/fmapp2/src/com/caf/fmradio/FMRadioService.java
index b162627..c7abf00 100644
--- a/fmapp2/src/com/caf/fmradio/FMRadioService.java
+++ b/fmapp2/src/com/caf/fmradio/FMRadioService.java
@@ -80,6 +80,9 @@
 import android.content.ComponentName;
 import android.os.StatFs;
 import android.os.SystemClock;
+import android.os.Process;
+import android.app.ActivityManager;
+import android.app.ActivityManager.RunningAppProcessInfo;
 
 /**
  * Provides "background" FM Radio (that uses the hardware) capabilities,
@@ -686,6 +689,24 @@
       return true;
    }
 
+   private String getProcessName() {
+      int id = Process.myPid();
+      String myProcessName = this.getPackageName();
+
+      ActivityManager actvityManager =
+              (ActivityManager)this.getSystemService(this.ACTIVITY_SERVICE);
+      List<RunningAppProcessInfo> procInfos =
+              actvityManager.getRunningAppProcesses();
+
+      for(RunningAppProcessInfo procInfo : procInfos) {
+         if (id == procInfo.pid) {
+              myProcessName = procInfo.processName;
+         }
+      }
+      procInfos.clear();
+      return myProcessName;
+   }
+
    private void sendRecordIntent(int action) {
        Intent intent = new Intent(ACTION_FM_RECORDING);
        intent.putExtra("state", action);
@@ -696,6 +717,8 @@
              mRecordDuration = (FmSharedPreferences.getRecordDuration() * 60 * 1000);
           }
           intent.putExtra("record_duration", mRecordDuration);
+          intent.putExtra("process_name", getProcessName());
+          intent.putExtra("process_id", Process.myPid());
         }
        Log.d(LOGTAG, "Sending Recording intent for = " +action);
        getApplicationContext().sendBroadcast(intent);
