diff --git a/src/org/sflphone/fragments/AccountWrapperFragment.java b/src/org/sflphone/fragments/AccountWrapperFragment.java
index 7f1144a..98dab74 100644
--- a/src/org/sflphone/fragments/AccountWrapperFragment.java
+++ b/src/org/sflphone/fragments/AccountWrapperFragment.java
@@ -27,10 +27,10 @@
 
     @Override
     public void onResume() {
-        super.onResume();IntentFilter intentFilter = new IntentFilter();
-        IntentFilter intentFilter2 = new IntentFilter();
-        intentFilter2.addAction(ConfigurationManagerCallback.ACCOUNT_STATE_CHANGED);
-        intentFilter2.addAction(ConfigurationManagerCallback.ACCOUNTS_CHANGED);
+        super.onResume();
+        IntentFilter intentFilter = new IntentFilter();
+        intentFilter.addAction(ConfigurationManagerCallback.ACCOUNT_STATE_CHANGED);
+        intentFilter.addAction(ConfigurationManagerCallback.ACCOUNTS_CHANGED);
         getActivity().registerReceiver(mReceiver, intentFilter);
     }
 
@@ -40,7 +40,7 @@
     }
 
     @Override
-    public void accountStateChanged(Intent accountState) {
+    public void accountStateChanged(String accoundID, String state, int code) {
 
     }
 
@@ -59,7 +59,7 @@
         public void onReceive(Context context, Intent intent) {
             if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNT_STATE_CHANGED)) {
                 Log.i(TAG, "Received" + intent.getAction());
-                accountStateChanged(intent);
+                accountStateChanged(intent.getStringExtra("Account"), intent.getStringExtra("state"), intent.getIntExtra("code", 0));
             } else if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNTS_CHANGED)) {
                 Log.i(TAG, "Received" + intent.getAction());
                 accountsChanged();
diff --git a/src/org/sflphone/fragments/AccountsManagementFragment.java b/src/org/sflphone/fragments/AccountsManagementFragment.java
index 7204808..f6f7413 100644
--- a/src/org/sflphone/fragments/AccountsManagementFragment.java
+++ b/src/org/sflphone/fragments/AccountsManagementFragment.java
@@ -220,8 +220,8 @@
     }
 
     @Override
-    public void accountStateChanged(Intent accountState) {
-        mAccountsAdapter.updateAccount(accountState);
+    public void accountStateChanged(String accoundID, String state, int code) {
+        mAccountsAdapter.updateAccount(accoundID, state, code);
     }
 
     @Override
@@ -348,17 +348,12 @@
 
         /**
          * Modify state of specific account
-         *
-         * @param accountState
          */
-        public void updateAccount(Intent accountState) {
-            String id = accountState.getStringExtra("Account");
-            String newState = accountState.getStringExtra("state");
-
-            Log.i(TAG, "updateAccount:" + newState);
+        public void updateAccount(String accoundID, String state, int code) {
+            Log.i(TAG, "updateAccount:" + state);
             for (Account a : accounts) {
-                if (a.getAccountID().contentEquals(id)) {
-                    a.setRegistered_state(newState);
+                if (a.getAccountID().contentEquals(accoundID)) {
+                    a.setRegistered_state(state);
                     notifyDataSetChanged();
                     return;
                 }
diff --git a/src/org/sflphone/fragments/CallFragment.java b/src/org/sflphone/fragments/CallFragment.java
index 1436954..382b1a6 100644
--- a/src/org/sflphone/fragments/CallFragment.java
+++ b/src/org/sflphone/fragments/CallFragment.java
@@ -51,6 +51,7 @@
 import android.view.SurfaceHolder.Callback;
 import android.view.View.OnClickListener;
 import android.view.inputmethod.InputMethodManager;
+import android.widget.Button;
 import android.widget.CompoundButton;
 import android.widget.CompoundButton.OnCheckedChangeListener;
 import android.widget.TextView;
@@ -69,11 +70,9 @@
 
     float BUBBLE_SIZE = 75;
     static final float ATTRACTOR_SIZE = 40;
-
-
     public static final int REQUEST_TRANSFER = 10;
 
-    private Conference conf;
+
 
     private TextView callStatusTxt;
     private ToggleButton speakers;
@@ -105,7 +104,6 @@
     @Override
     public void onCreate(Bundle savedBundle) {
         super.onCreate(savedBundle);
-        conf = new Conference((Conference) getArguments().getParcelable("conference"));
         model = new BubbleModel(getResources().getDisplayMetrics().density);
         BUBBLE_SIZE = getResources().getDimension(R.dimen.bubble_size);
         Log.e(TAG, "BUBBLE_SIZE " + BUBBLE_SIZE);
@@ -153,6 +151,11 @@
         }
 
         @Override
+        public Conference getDisplayedConference() {
+            return null;
+        }
+
+        @Override
         public void startTimer() {
         }
 
@@ -174,6 +177,8 @@
         public void slideChatScreen();
 
         public void terminateCall();
+
+        public Conference getDisplayedConference();
     }
 
     @Override
@@ -237,30 +242,43 @@
     }
 
     @Override
-    public void callStateChanged(Intent callState) {
-        Bundle b = callState.getBundleExtra("com.savoirfairelinux.sflphone.service.newstate");
-        changeCallState(b.getString("CallID"), b.getString("State"));
+    public void callStateChanged(String callID, String state) {
+        changeCallState(callID, state);
     }
 
     @Override
-    public void recordingChanged(Intent intent) {
+    public void recordingChanged(String callID, String filename) {
 
     }
 
     @Override
-    public void secureZrtpOn(Intent intent) {
+    public void secureZrtpOn(String id) {
         Log.i(TAG, "secureZrtpOn");
         //enableSASButton();
     }
 
     @Override
-    public void secureZrtpOff(Intent intent) {
+    public void secureZrtpOff(String id) {
         Log.i(TAG, "secureZrtpOff");
     }
 
     @Override
-    public void displaySAS(Intent intent) {
+    public void displaySAS(final String callID, String SAS, boolean verified) {
         Log.i(TAG, "displaySAS");
+        final Button sas = (Button) getView().findViewById(R.id.confirm_sas);
+        sas.setText("Confirm SAS: " + SAS);
+        sas.setVisibility(View.VISIBLE);
+        sas.setOnClickListener(new OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                try {
+                    mCallbacks.getService().confirmSAS(callID);
+                    sas.setVisibility(View.INVISIBLE);
+                } catch (RemoteException e) {
+                    e.printStackTrace();
+                }
+            }
+        });
     }
 
     @Override
@@ -339,24 +357,28 @@
         return rootView;
     }
 
+    public Conference getConference(){
+        return mCallbacks.getDisplayedConference();
+    }
+
     private void initNormalStateDisplay() {
         Log.i(TAG, "Start normal display");
 
         mCallbacks.startTimer();
 
-        getBubbleForUser(conf, model.width / 2, model.height / 2);
+        getBubbleForUser(getConference(), model.width / 2, model.height / 2);
 
-        int angle_part = 360 / conf.getParticipants().size();
+        int angle_part = 360 / getConference().getParticipants().size();
         double dX, dY;
         int radiusCalls = (int) (model.width / 2 - BUBBLE_SIZE);
-        for (int i = 0; i < conf.getParticipants().size(); ++i) {
+        for (int i = 0; i < getConference().getParticipants().size(); ++i) {
 
-            if (conf.getParticipants().get(i) == null) {
+            if (getConference().getParticipants().get(i) == null) {
                 continue;
             }
             dX = Math.cos(Math.toRadians(angle_part * i - 90)) * radiusCalls;
             dY = Math.sin(Math.toRadians(angle_part * i - 90)) * radiusCalls;
-            getBubbleFor(conf.getParticipants().get(i), (int) (model.width / 2 + dX), (int) (model.height / 2 + dY));
+            getBubbleFor(getConference().getParticipants().get(i), (int) (model.width / 2 + dX), (int) (model.height / 2 + dY));
         }
 
         model.clearAttractors();
@@ -368,8 +390,8 @@
         mCallbacks.startTimer();
 
         int radiusCalls = (int) (model.width / 2 - BUBBLE_SIZE);
-        getBubbleForUser(conf, model.width / 2, model.height / 2 + radiusCalls);
-        getBubbleFor(conf.getParticipants().get(0), model.width / 2, model.height / 2 - radiusCalls);
+        getBubbleForUser(getConference(), model.width / 2, model.height / 2 + radiusCalls);
+        getBubbleFor(getConference().getParticipants().get(0), model.width / 2, model.height / 2 - radiusCalls);
 
         model.clearAttractors();
         model.addAttractor(new Attractor(new PointF(model.width / 2, model.height / 2), ATTRACTOR_SIZE, new Attractor.Callback() {
@@ -388,9 +410,9 @@
             }
         }, call_icon));
 
-        if (conf.getParticipants().get(0).getAccount().isAutoanswerEnabled()) {
+        if (getConference().getParticipants().get(0).getAccount().isAutoanswerEnabled()) {
             try {
-                mCallbacks.getService().accept(conf.getParticipants().get(0).getCallId());
+                mCallbacks.getService().accept(getConference().getParticipants().get(0).getCallId());
             } catch (RemoteException e) {
                 e.printStackTrace();
             }
@@ -402,16 +424,16 @@
 
         mCallbacks.startTimer();
 
-        getBubbleForUser(conf, model.width / 2, model.height / 2);
+        getBubbleForUser(getConference(), model.width / 2, model.height / 2);
 
         // TODO off-thread image loading
-        int angle_part = 360 / conf.getParticipants().size();
+        int angle_part = 360 / getConference().getParticipants().size();
         double dX, dY;
         int radiusCalls = (int) (model.width / 2 - BUBBLE_SIZE);
-        for (int i = 0; i < conf.getParticipants().size(); ++i) {
+        for (int i = 0; i < getConference().getParticipants().size(); ++i) {
             dX = Math.cos(Math.toRadians(angle_part * i - 90)) * radiusCalls;
             dY = Math.sin(Math.toRadians(angle_part * i - 90)) * radiusCalls;
-            getBubbleFor(conf.getParticipants().get(i), (int) (model.width / 2 + dX), (int) (model.height / 2 + dY));
+            getBubbleFor(getConference().getParticipants().get(i), (int) (model.width / 2 + dX), (int) (model.height / 2 + dY));
         }
 
         model.clearAttractors();
@@ -474,25 +496,25 @@
                 e.printStackTrace();
             }
         }
-        if (conf == null) {
+        if (getConference() == null) {
             return;
         }
-        for (int i = 0; i < conf.getParticipants().size(); ++i) {
-            if (callID.equals(conf.getParticipants().get(i).getCallId())) {
+        for (int i = 0; i < getConference().getParticipants().size(); ++i) {
+            if (callID.equals(getConference().getParticipants().get(i).getCallId())) {
                 if (newState.contentEquals("HUNGUP")) {
-                    model.removeBubble(conf.getParticipants().get(i));
-                    conf.getParticipants().remove(i);
+                    model.removeBubble(getConference().getParticipants().get(i));
+                    getConference().getParticipants().remove(i);
                 } else {
-                    conf.getParticipants().get(i).setCallState(newState);
+                    getConference().getParticipants().get(i).setCallState(newState);
                 }
             }
         }
 
-        if (conf.isOnGoing()) {
+        if (getConference().isOnGoing()) {
             initNormalStateDisplay();
         }
 
-        if (conf.getParticipants().size() == 0) {
+        if (getConference().getParticipants().size() == 0) {
             callStatusTxt.setText(newState);
             mCallbacks.terminateCall();
         }
@@ -505,29 +527,29 @@
     @Override
     public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
 
-        if (conf.getParticipants().size() == 1) {
-            if (conf.getParticipants().get(0).isIncoming() && conf.getParticipants().get(0).isRinging()) {
+        if (getConference().getParticipants().size() == 1) {
+            if (getConference().getParticipants().get(0).isIncoming() && getConference().getParticipants().get(0).isRinging()) {
                 initIncomingCallDisplay();
             } else {
-                if (conf.getParticipants().get(0).isRinging()) {
+                if (getConference().getParticipants().get(0).isRinging()) {
                     initOutGoingCallDisplay();
                 }
                 try {
-                    if (conf.getParticipants().get(0).isOutGoing()
-                            && mCallbacks.getService().getConference(conf.getId()) == null) {
-                        mCallbacks.getService().placeCall(conf.getParticipants().get(0));
+                    if (getConference().getParticipants().get(0).isOutGoing()
+                            && mCallbacks.getService().getConference(getConference().getId()) == null) {
+                        mCallbacks.getService().placeCall(getConference().getParticipants().get(0));
                         initOutGoingCallDisplay();
-                    } else if (conf.getParticipants().get(0).isOutGoing() && conf.getParticipants().get(0).isRinging()) {
+                    } else if (getConference().getParticipants().get(0).isOutGoing() && getConference().getParticipants().get(0).isRinging()) {
                         initOutGoingCallDisplay();
                     }
                 } catch (RemoteException e) {
                     Log.e(TAG, e.toString());
                 }
             }
-            if (conf.getParticipants().get(0).isOngoing()) {
+            if (getConference().getParticipants().get(0).isOngoing()) {
                 initNormalStateDisplay();
             }
-        } else if (conf.getParticipants().size() > 1) {
+        } else if (getConference().getParticipants().size() > 1) {
             initNormalStateDisplay();
         }
     }
@@ -568,15 +590,11 @@
     }
 
     public void updateTime() {
-        long duration = System.currentTimeMillis() / 1000 - this.conf.getParticipants().get(0).getTimestampStart_();
-        if (conf.isOnGoing())
+        long duration = System.currentTimeMillis() / 1000 - this.getConference().getParticipants().get(0).getTimestampStart_();
+        if (getConference().isOnGoing())
             callStatusTxt.setText(String.format("%d:%02d:%02d", duration / 3600, duration % 3600 / 60, duration % 60));
     }
 
-    public Conference getConference() {
-        return conf;
-    }
-
     public void onKeyUp(int keyCode, KeyEvent event) {
         try {
 
diff --git a/src/org/sflphone/fragments/CallListFragment.java b/src/org/sflphone/fragments/CallListFragment.java
index 86e67ea..82b357b 100644
--- a/src/org/sflphone/fragments/CallListFragment.java
+++ b/src/org/sflphone/fragments/CallListFragment.java
@@ -83,45 +83,31 @@
     };
 
     @Override
-    public void callStateChanged(Intent callState) {
-        Bundle b = callState.getBundleExtra("com.savoirfairelinux.sflphone.service.newstate");
-        String cID = b.getString("CallID");
-        String state = b.getString("State");
-        Log.i(TAG, "callStateChanged" + cID + "    " + state);
-
+    public void callStateChanged(String callID, String state) {
+        Log.i(TAG, "callStateChanged" + callID + "    " + state);
         updateLists();
-
     }
 
     @Override
-    public void incomingText(Intent msg) {
-        Bundle b = msg.getBundleExtra("com.savoirfairelinux.sflphone.service.newtext");
-        b.getString("CallID");
-        String from = b.getString("From");
-        String mess = b.getString("Msg");
-        Toast.makeText(getActivity(), "text from " + from + " : " + mess, Toast.LENGTH_LONG).show();
-    }
-
-    @Override
-    public void confCreated(Intent intent) {
+    public void confCreated(String id) {
         Log.i(TAG, "confCreated");
         updateLists();
     }
 
     @Override
-    public void confRemoved(Intent intent) {
+    public void confRemoved(String id) {
         Log.i(TAG, "confRemoved");
         updateLists();
     }
 
     @Override
-    public void confChanged(Intent intent) {
+    public void confChanged(String id, String state) {
         Log.i(TAG, "confChanged");
         updateLists();
     }
 
     @Override
-    public void recordingChanged(Intent intent) {
+    public void recordingChanged(String callID, String filename) {
         Log.i(TAG, "confChanged");
         updateLists();
     }
diff --git a/src/org/sflphone/fragments/CallableWrapperFragment.java b/src/org/sflphone/fragments/CallableWrapperFragment.java
index fc6b732..e85f94f 100644
--- a/src/org/sflphone/fragments/CallableWrapperFragment.java
+++ b/src/org/sflphone/fragments/CallableWrapperFragment.java
@@ -7,9 +7,6 @@
 import android.os.Bundle;
 import android.support.v4.app.Fragment;
 import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
 import org.sflphone.interfaces.CallInterface;
 import org.sflphone.service.CallManagerCallBack;
 
@@ -30,7 +27,8 @@
 
     @Override
     public void onResume() {
-        super.onResume();IntentFilter intentFilter = new IntentFilter();
+        super.onResume();
+        IntentFilter intentFilter = new IntentFilter();
         intentFilter.addAction(CallManagerCallBack.INCOMING_CALL);
         intentFilter.addAction(CallManagerCallBack.INCOMING_TEXT);
         intentFilter.addAction(CallManagerCallBack.CALL_STATE_CHANGED);
@@ -52,47 +50,47 @@
     }
 
     @Override
-    public void callStateChanged(Intent callState) {
+    public void callStateChanged(String callID, String state) {
 
     }
 
     @Override
-    public void incomingText(Intent msg) {
+    public void incomingText(String ID, String from, String msg) {
 
     }
 
     @Override
-    public void confCreated(Intent intent) {
+    public void confCreated(String id) {
 
     }
 
     @Override
-    public void confRemoved(Intent intent) {
+    public void confRemoved(String id) {
 
     }
 
     @Override
-    public void confChanged(Intent intent) {
+    public void confChanged(String id, String state) {
 
     }
 
     @Override
-    public void recordingChanged(Intent intent) {
+    public void recordingChanged(String callID, String filename) {
 
     }
 
     @Override
-    public void secureZrtpOn(Intent intent) {
+    public void secureZrtpOn(String id) {
 
     }
 
     @Override
-    public void secureZrtpOff(Intent intent) {
+    public void secureZrtpOff(String id) {
 
     }
 
     @Override
-    public void displaySAS(Intent intent) {
+    public void displaySAS(String callID, String SAS, boolean verified) {
 
     }
 
@@ -103,23 +101,23 @@
         @Override
         public void onReceive(Context context, Intent intent) {
             if (intent.getAction().contentEquals(CallManagerCallBack.INCOMING_TEXT)) {
-                incomingText(intent);
+                incomingText(intent.getStringExtra("CallID"), intent.getStringExtra("From"), intent.getStringExtra("Msg"));
             } else if (intent.getAction().contentEquals(CallManagerCallBack.CALL_STATE_CHANGED)) {
-                callStateChanged(intent);
+                callStateChanged(intent.getStringExtra("CallID"), intent.getStringExtra("State"));
             } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_CREATED)) {
-                confCreated(intent);
+                confCreated(intent.getStringExtra("confID"));
             } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_REMOVED)) {
-                confRemoved(intent);
+                confRemoved(intent.getStringExtra("confID"));
             } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_CHANGED)) {
-                confChanged(intent);
+                confChanged(intent.getStringExtra("confID"), intent.getStringExtra("state"));
             } else if (intent.getAction().contentEquals(CallManagerCallBack.RECORD_STATE_CHANGED)) {
-                recordingChanged(intent);
+                recordingChanged(intent.getStringExtra("callID"), intent.getStringExtra("file"));
             } else if (intent.getAction().contentEquals(CallManagerCallBack.ZRTP_OFF)) {
-                secureZrtpOff(intent);
+                secureZrtpOff(intent.getStringExtra("callID"));
             } else if (intent.getAction().contentEquals(CallManagerCallBack.ZRTP_ON)) {
-                secureZrtpOn(intent);
+                secureZrtpOn(intent.getStringExtra("callID"));
             } else if (intent.getAction().contentEquals(CallManagerCallBack.DISPLAY_SAS)) {
-                displaySAS(intent);
+                displaySAS(intent.getStringExtra("callID"), intent.getStringExtra("SAS"), intent.getBooleanExtra("verified", false));
             } else {
                 Log.e(TAG, "Unknown action: " + intent.getAction());
             }
diff --git a/src/org/sflphone/fragments/IMFragment.java b/src/org/sflphone/fragments/IMFragment.java
index 6ec7e39..f9e63b8 100644
--- a/src/org/sflphone/fragments/IMFragment.java
+++ b/src/org/sflphone/fragments/IMFragment.java
@@ -33,6 +33,7 @@
 import android.widget.*;
 import org.sflphone.R;
 import org.sflphone.adapters.DiscussArrayAdapter;
+import org.sflphone.model.Conference;
 import org.sflphone.model.SipMessage;
 import org.sflphone.service.ISipService;
 
@@ -67,10 +68,11 @@
     }
 
     @Override
-    public void incomingText(Intent in) {
-        Bundle b = in.getBundleExtra("com.savoirfairelinux.sflphone.service.newtext");
-        SipMessage msg = new SipMessage(true, b.getString("Msg"));
-        putMessage(msg);
+    public void incomingText(String ID, String from, String msg) {
+        if (mCallbacks.getDisplayedConference().getId().contentEquals(ID)) {
+            SipMessage sipMsg = new SipMessage(true, msg);
+            putMessage(sipMsg);
+        }
     }
 
 
@@ -85,6 +87,11 @@
         }
 
         @Override
+        public Conference getDisplayedConference() {
+            return null;
+        }
+
+        @Override
         public boolean sendIM(SipMessage msg) {
             return false;
         }
@@ -97,6 +104,8 @@
     public interface Callbacks {
         public ISipService getService();
 
+        public Conference getDisplayedConference();
+
         public boolean sendIM(SipMessage msg);
     }
 
diff --git a/src/org/sflphone/fragments/MenuFragment.java b/src/org/sflphone/fragments/MenuFragment.java
index dde43fd..9ffde1c 100644
--- a/src/org/sflphone/fragments/MenuFragment.java
+++ b/src/org/sflphone/fragments/MenuFragment.java
@@ -201,11 +201,6 @@
             getLoaderManager().restartLoader(LoaderConstants.ACCOUNTS_LOADER, null, this);
     }
 
-    public void updateAccount(Intent accountState) {
-        if (mAccountAdapter != null)
-            mAccountAdapter.updateAccount(accountState);
-    }
-
     @Override
     public void accountsChanged() {
         updateAllAccounts();
@@ -213,9 +208,9 @@
     }
 
     @Override
-    public void accountStateChanged(Intent accountState) {
-        updateAccount(accountState);
-
+    public void accountStateChanged(String accoundID, String state, int code) {
+        if (mAccountAdapter != null)
+            mAccountAdapter.updateAccount(accoundID, state, code);
     }
 
     @Override
