* #40232: Display SAS when call starts
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