diff --git a/src/com/savoirfairelinux/sflphone/client/CallActivity.java b/src/com/savoirfairelinux/sflphone/client/CallActivity.java
index 51a6cb4..d032e8d 100644
--- a/src/com/savoirfairelinux/sflphone/client/CallActivity.java
+++ b/src/com/savoirfairelinux/sflphone/client/CallActivity.java
@@ -64,9 +64,13 @@
         // Parcelable value = b.getParcelable("CallInfo");
         SipCall.CallInfo info = b.getParcelable("CallInfo"); // new SipCall.CallInfo.CREATOR.createFromParcel
         Log.i(TAG, "Starting activity for call " + info.mCallID);
+        mCall = new SipCall(info); 
 
         Intent intent = new Intent(this, SipService.class);
         bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
+
+        findViewById(R.id.buttonhangup).setOnClickListener(this);
+        
     }
 
     @Override
@@ -90,12 +94,11 @@
     @Override
     public void onClick(View view)
     {
+        Log.i(TAG, "On click action");
         if(view.getId() == R.id.buttonhangup) {
-            try {
-                service.hangUp(mCall.mCallInfo.mCallID);
-            } catch (RemoteException e) {
-                Log.e(TAG, "Cannot call service method", e);
-            }
+            mCall.hangup(service);
+            // terminate this activity
+            finish();
         }
     }
 }
diff --git a/src/com/savoirfairelinux/sflphone/client/CallElementList.java b/src/com/savoirfairelinux/sflphone/client/CallElementList.java
index 47f6af0..cbbe17a 100644
--- a/src/com/savoirfairelinux/sflphone/client/CallElementList.java
+++ b/src/com/savoirfairelinux/sflphone/client/CallElementList.java
@@ -289,17 +289,17 @@
                               Log.i(TAG, "Selected " + items[item]);
                               switch (item) {
                                   case 0:
-                                      call.hangup();
+                                      call.hangup(service);
                                       break;
                                   case 1:
                                       call.sendTextMessage();
                                       // Need to hangup this call immediately since no way to do it after this action
-                                      call.hangup();
+                                      call.hangup(service);
                                       break;
                                   case 2:
                                       call.addToConference();
                                       // Need to hangup this call immediately since no way to do it after this action
-                                      call.hangup();
+                                      call.hangup(service);
                                       break;
                                   default:
                                       break; 
@@ -354,7 +354,7 @@
         // Insert desired behavior here.
         Log.i(TAG, "Item clicked: " + id);
         SipCall call = (SipCall) mAdapter.getItem(position);
-        call.hangup(); 
+        call.hangup(service); 
     }
 
 	@Override
diff --git a/src/com/savoirfairelinux/sflphone/client/ContactListFragment.java b/src/com/savoirfairelinux/sflphone/client/ContactListFragment.java
index d7a8d6f..0cf95b4 100644
--- a/src/com/savoirfairelinux/sflphone/client/ContactListFragment.java
+++ b/src/com/savoirfairelinux/sflphone/client/ContactListFragment.java
@@ -232,12 +232,12 @@
                                   case 1:
                                       call.sendTextMessage();
                                       // Need to hangup this call immediately since no way to do it after this action
-                                      call.hangup();
+                                      call.hangup(service);
                                       break;
                                   case 2:
                                       call.addToConference();
                                       // Need to hangup this call immediately since no way to do it after this action
-                                      call.hangup();
+                                      call.hangup(service);
                                       break;
                                   default:
                                       break; 
diff --git a/src/com/savoirfairelinux/sflphone/client/SFLPhoneHome.java b/src/com/savoirfairelinux/sflphone/client/SFLPhoneHome.java
index df4ac8a..7d7a863 100644
--- a/src/com/savoirfairelinux/sflphone/client/SFLPhoneHome.java
+++ b/src/com/savoirfairelinux/sflphone/client/SFLPhoneHome.java
@@ -41,6 +41,7 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
+import android.content.IntentFilter;
 import android.content.ServiceConnection;
 import android.os.Bundle;
 import android.os.Handler;
@@ -49,6 +50,7 @@
 import android.os.RemoteException;
 import android.support.v13.app.FragmentStatePagerAdapter;
 import android.support.v4.view.ViewPager;
+import android.support.v4.content.LocalBroadcastManager;
 import android.util.Log;
 import android.view.Gravity;
 import android.view.LayoutInflater;
@@ -69,6 +71,7 @@
 import com.savoirfairelinux.sflphone.service.ISipService;
 import com.savoirfairelinux.sflphone.service.SipService;
 import com.savoirfairelinux.sflphone.utils.AccountList;
+import com.savoirfairelinux.sflphone.utils.CallList;
 
 import java.util.HashMap;
 
@@ -91,6 +94,7 @@
     private boolean mBound = false;
     private ISipService service;
     public AccountList mAccountList = new AccountList();
+    public CallList mCallList = new CallList();
 
     /**
      * The {@link ViewPager} that will host the section contents.
@@ -164,6 +168,10 @@
         animation.setRepeatCount(Animation.INFINITE);
         // Reverse
         animation.setRepeatMode(Animation.REVERSE);
+
+        LocalBroadcastManager.getInstance(this).registerReceiver(mCallList, new IntentFilter("new-call-created"));
+        LocalBroadcastManager.getInstance(this).registerReceiver(mCallList, new IntentFilter("call-state-changed"));
+        LocalBroadcastManager.getInstance(this).registerReceiver(mCallList, new IntentFilter("incoming-call"));
     }
 
     @Override
@@ -484,12 +492,19 @@
             Log.e(TAG, "Cannot call service method", e);
         }
         */
-        SipCall call = new SipCall();
+        
+        Random random = new Random();
+        String callID = Integer.toString(random.nextInt());
+        SipCall.CallInfo info = new SipCall.CallInfo();
+        info.mCallID = callID;
+
+        SipCall call = CallList.getCallInstance(info);
+
         launchCallActivity(call);
     }
 
     public void processingHangUpAction() {
-       try {
+        try {
             if (incomingCallID != "") {
                 buttonCall.clearAnimation();
                 Log.d(TAG, "service.refuse(" + incomingCallID + ");");
diff --git a/src/com/savoirfairelinux/sflphone/client/SipCall.java b/src/com/savoirfairelinux/sflphone/client/SipCall.java
index caf9c9a..ed1aee8 100644
--- a/src/com/savoirfairelinux/sflphone/client/SipCall.java
+++ b/src/com/savoirfairelinux/sflphone/client/SipCall.java
@@ -32,13 +32,16 @@
 
 import android.os.Parcelable;
 import android.os.Parcel;
+import android.os.RemoteException;
 import android.util.Log;
 import java.util.ArrayList;
 
+import com.savoirfairelinux.sflphone.service.ISipService;
+
 public class SipCall
 {
     final static String TAG = "SipCall";
-    public static CallElementList mCallElementList;
+    public static CallElementList mCallElementList = null;
     public CallInfo mCallInfo;
 
     public static int CALL_STATE_INVALID = 0;      // The call is not existent in SFLphone service
@@ -74,6 +77,8 @@
         @Override
         public void writeToParcel(Parcel out, int flags) {
             ArrayList<String> list = new ArrayList<String>();
+
+            // Don't mess with this order!!!
             list.add(mCallID);
             list.add(mDisplayName);
             list.add(mPhone);
@@ -100,6 +105,8 @@
 
         private CallInfo(Parcel in) {
             ArrayList<String> list = in.createStringArrayList();
+
+            // Don't mess with this order!!!
             mCallID = list.get(0);
             mDisplayName = list.get(1);
             mPhone = list.get(2);
@@ -126,27 +133,10 @@
         mCallElementList = list;
     }
 
-    /** TODO factory method that should be moved in CallList 
-    public static SipCall getCallInstance(CallInfo info)
-    {
-        if(CallList.isEmpty())
-            return new SipCall(info);
-       
-        for(SipCall sipcall : CallList) {
-            if(sipcall.mCallInfo.mDisplayName.equals(info.mDisplayName)) {
-                if(sipcall.mCallInfo.mPhone.equals(info.mPhone)) {
-                    return sipcall;
-                }
-            }
-        }
-
-        return new SipCall(info);
-    }
-    */
-
     public void placeCall()
     {
-        mCallElementList.addCall(this); 
+        if(mCallElementList != null)
+            mCallElementList.addCall(this); 
         // mManager.callmanagerJNI.placeCall("IP2IP", "CALL1234", "192.168.40.35");
     }
 
@@ -155,10 +145,18 @@
 
     }
 
-    public void hangup()
+    public void hangup(ISipService service)
     {
-        mCallElementList.removeCall(this);
-        // mManager.callmanagerJNI.hangup("IP2IP", "CALL1234", "192.168.40.35");
+        Log.i(TAG, "Hangup call " + mCallInfo.mCallID);
+
+        if(mCallElementList != null)
+            mCallElementList.removeCall(this);
+
+        try {
+            service.hangUp(mCallInfo.mCallID);
+        } catch (RemoteException e) {
+            Log.e(TAG, "Cannot call service method", e);
+        }
     }
 
     public void addToConference()
diff --git a/src/com/savoirfairelinux/sflphone/service/CallManagerCallBack.java b/src/com/savoirfairelinux/sflphone/service/CallManagerCallBack.java
index 602eaa9..4ef7cc4 100644
--- a/src/com/savoirfairelinux/sflphone/service/CallManagerCallBack.java
+++ b/src/com/savoirfairelinux/sflphone/service/CallManagerCallBack.java
@@ -1,23 +1,67 @@
 package com.savoirfairelinux.sflphone.service;
 
+import android.content.Context;
+import android.content.Intent;
 import android.util.Log;
+import android.os.Bundle;
+import android.support.v4.content.LocalBroadcastManager;
 
 public class CallManagerCallBack extends Callback {
     
     private static final String TAG = "CallManagerCallBack";
+    private Context mContext; 
+
+    public CallManagerCallBack(Context context) {
+        mContext = context;
+    }
 
     @Override
     public void on_new_call_created(String accountID, String callID, String to) {
         Log.d(TAG, "on_new_call_created(" + accountID + ", " + callID + ", " + to + ")");
+        sendNewCallCreatedMessage(accountID, callID, to);
     }
 
     @Override
     public void on_call_state_changed(String callID, String state) {
         Log.d(TAG, "on_call_state_changed(" + callID + ", " + state + ")");
+        sendCallStateChangedMessage(callID, state);
     }
 
     @Override
     public void on_incoming_call(String accountID, String callID, String from) {
         Log.d(TAG, "on_incoming_call(" + accountID + ", " + callID + ", " + from + ")");
+        sendIncomingCallMessage(accountID, callID, from);
+    }
+
+    private void sendNewCallCreatedMessage(String accountID, String callID, String to) {
+        Bundle bundle = new Bundle();
+        bundle.putString("AccountID", accountID);
+        bundle.putString("CallID", callID);
+        bundle.putString("To", to);
+        Intent intent = new Intent("new-call-created");
+        intent.putExtra("signal-name", "new-call-created");
+        intent.putExtra("newcall", bundle);
+        LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);
+    }
+
+    private void sendCallStateChangedMessage(String callID, String state) {
+        Bundle bundle = new Bundle();
+        bundle.putString("CallID", callID);
+        bundle.putString("State", state);
+        Intent intent = new Intent("call-state-changed");
+        intent.putExtra("signal-name", "call-state-changed"); 
+        intent.putExtra("newstate", bundle);
+        LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);
+    }
+
+    private void sendIncomingCallMessage(String accountID, String callID, String from) {
+        Bundle bundle = new Bundle();
+        bundle.putString("AccountID", accountID);
+        bundle.putString("CallID", callID);
+        bundle.putString("From", from);
+        Intent intent = new Intent("incoming-call");
+        intent.putExtra("signal-name", "incoming-call"); 
+        intent.putExtra("newcall", bundle);
+        LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);
     }
 }
diff --git a/src/com/savoirfairelinux/sflphone/service/ConfigurationManagerCallback.java b/src/com/savoirfairelinux/sflphone/service/ConfigurationManagerCallback.java
index 787447b..3bfcafc 100644
--- a/src/com/savoirfairelinux/sflphone/service/ConfigurationManagerCallback.java
+++ b/src/com/savoirfairelinux/sflphone/service/ConfigurationManagerCallback.java
@@ -29,9 +29,9 @@
 
 public class ConfigurationManagerCallback extends ConfigurationCallback {
     private static final String TAG = "ConfigurationManagerCallback";
-    Context mContext; 
+    private Context mContext; 
 
-    ConfigurationManagerCallback(Context context) {
+    public ConfigurationManagerCallback(Context context) {
         mContext = context;
     }
 
diff --git a/src/com/savoirfairelinux/sflphone/service/SipService.java b/src/com/savoirfairelinux/sflphone/service/SipService.java
index 14c39bf..3eb2758 100644
--- a/src/com/savoirfairelinux/sflphone/service/SipService.java
+++ b/src/com/savoirfairelinux/sflphone/service/SipService.java
@@ -369,7 +369,7 @@
         managerImpl.setPath(sflphoneApp.getAppPath());
 
         callManagerJNI = new CallManagerJNI();
-        callManagerCallBack = new CallManagerCallBack();
+        callManagerCallBack = new CallManagerCallBack(this);
         SFLPhoneservice.setCallbackObject(callManagerCallBack);
 
         configurationManagerJNI = new ConfigurationManagerJNI();
diff --git a/src/com/savoirfairelinux/sflphone/utils/CallList.java b/src/com/savoirfairelinux/sflphone/utils/CallList.java
index 20d3dae..0afa0ed 100644
--- a/src/com/savoirfairelinux/sflphone/utils/CallList.java
+++ b/src/com/savoirfairelinux/sflphone/utils/CallList.java
@@ -43,7 +43,7 @@
 public class CallList extends BroadcastReceiver
 {
     static final String TAG = "CallList";
-    ArrayList<SipCall> mList = new ArrayList<SipCall>();
+    static ArrayList<SipCall> mList = new ArrayList<SipCall>();
 
     private enum Signals {
         NEW_CALL_CREATED,
@@ -52,22 +52,35 @@
         CALL_STATE_CHANGED
     }
 
+    /**
+     * Factory method to create/retreive call instance
+     */
+    public static SipCall getCallInstance(SipCall.CallInfo info)
+    {
+        if(mList.isEmpty())
+            return new SipCall(info);
+
+        for(SipCall sipcall : mList) {
+            if(sipcall.mCallInfo.mCallID.equals(info.mCallID)) {
+                return sipcall;
+            }
+        }
+
+        SipCall call = new SipCall(info);
+        mList.add(call);
+
+        return call;
+    }
+
     @Override
     public void onReceive(Context context, Intent intent)
     {
         String signalName = intent.getStringExtra("signal-name");
         Log.d(TAG, "Signal received: " + signalName);
 
-        Signals signalReceived = Signals.valueOf(signalName.toUpperCase());
-        switch(signalReceived) {
-            case NEW_CALL_CREATED:
-                break;
-            case INCOMING_CALL:
-                break;
-            case INCOMING_MESSAGE:
-                break;
-            case CALL_STATE_CHANGED:
-                break;
+        if(signalName.equals("new-call-created")) {
+        } else if(signalName.equals("call-state-changed")) {
+        } else if(signalName.equals("incoming-call")) {
         }
     }
 }
