* #40232: Display SAS when call starts
diff --git a/src/org/sflphone/adapters/AccountSelectionAdapter.java b/src/org/sflphone/adapters/AccountSelectionAdapter.java
index cc722b8..acb1ed2 100644
--- a/src/org/sflphone/adapters/AccountSelectionAdapter.java
+++ b/src/org/sflphone/adapters/AccountSelectionAdapter.java
@@ -149,23 +149,17 @@
 
     /**
      * Modify state of specific account
-     * 
-     * @param accountState
      */
-    public void updateAccount(Intent accountState) {
+    public void updateAccount(String accoundID, String state, int code) {
         Log.i(TAG, "updateAccount");
-        String id = accountState.getStringExtra("Account");
-        String newState = accountState.getStringExtra("state");
-        accountState.getStringExtra("Account");
 
         for (Account a : accounts) {
-            if (a.getAccountID().contentEquals(id)) {
-                a.setRegistered_state(newState);
+            if (a.getAccountID().contentEquals(accoundID)) {
+                a.setRegistered_state(state);
                 notifyDataSetChanged();
                 return;
             }
         }
-
     }
 
     public String getAccountOrder() {
diff --git a/src/org/sflphone/client/AccountWizard.java b/src/org/sflphone/client/AccountWizard.java
index fbb5780..788b1f7 100644
--- a/src/org/sflphone/client/AccountWizard.java
+++ b/src/org/sflphone/client/AccountWizard.java
@@ -55,10 +55,9 @@
 import android.util.Log;
 import android.view.MenuItem;
 
-public class AccountWizard extends Activity implements AccountsInterface, Callbacks {
+public class AccountWizard extends Activity implements Callbacks {
     static final String TAG = "AccountWizard";
     private boolean mBound = false;
-    public static final int ACCOUNT_CREATED = Activity.RESULT_OK;
     private ISipService service;
     ViewPager mViewPager;
     private SectionsPagerAdapter mSectionsPagerAdapter;
@@ -118,18 +117,6 @@
         }
     }
 
-    @Override
-    public void accountsChanged() {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public void accountStateChanged(Intent accountState) {
-        // TODO Auto-generated method stub
-
-    }
-
     public class SectionsPagerAdapter extends FragmentStatePagerAdapter {
 
         Context mContext;
diff --git a/src/org/sflphone/client/CallActivity.java b/src/org/sflphone/client/CallActivity.java
index 2f5de06..4242390 100644
--- a/src/org/sflphone/client/CallActivity.java
+++ b/src/org/sflphone/client/CallActivity.java
@@ -76,14 +76,11 @@
     @SuppressWarnings("unused")
     static final String TAG = "CallActivity";
     private ISipService mService;
-
-
-
     CallPaneLayout mSlidingPaneLayout;
 
     IMFragment mIMFragment;
     CallFragment mCurrentCallFragment;
-
+    private Conference mDisplayedConference;
 
     /* result code sent in case of call failure */
     public static int RESULT_FAILURE = -10;
@@ -94,8 +91,6 @@
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_call_layout);
 
-
-
         mProximityManager = new CallProximityManager(this, this);
 
         mSlidingPaneLayout = (CallPaneLayout) findViewById(R.id.slidingpanelayout);
@@ -198,11 +193,8 @@
 
                     SipCall call = SipCall.SipCallBuilder.getInstance().startCallCreation().setContact(c).setAccount(acc)
                             .setCallType(SipCall.direction.CALL_TYPE_OUTGOING).build();
-                    Conference tmp = new Conference(Conference.DEFAULT_ID);
-                    tmp.getParticipants().add(call);
-                    Bundle b = new Bundle();
-                    b.putParcelable("conference", tmp);
-                    mCurrentCallFragment.setArguments(b);
+                    mDisplayedConference = new Conference(Conference.DEFAULT_ID);
+                    mDisplayedConference.getParticipants().add(call);
                 } catch (RemoteException e) {
                     e.printStackTrace();
                 } catch (Exception e) {
@@ -211,18 +203,14 @@
             } else {
                 if (getIntent().getBooleanExtra("resuming", false)) {
 
-                    Bundle b = new Bundle();
-                    Conference resumed = getIntent().getParcelableExtra("conference");
-                    b.putParcelable("conference", getIntent().getParcelableExtra("conference"));
-                    mCurrentCallFragment.setArguments(b);
+                    mDisplayedConference = getIntent().getParcelableExtra("conference");
 
                     Bundle IMBundle = new Bundle();
-                    IMBundle.putParcelableArrayList("messages", resumed.getMessages());
+                    IMBundle.putParcelableArrayList("messages", mDisplayedConference.getMessages());
                     mIMFragment.setArguments(IMBundle);
 
                 } else {
-                    mCurrentCallFragment.setArguments(getIntent().getExtras());
-
+                    mDisplayedConference = getIntent().getParcelableExtra("conference");
                     Bundle IMBundle = new Bundle();
                     IMBundle.putParcelableArrayList("messages", new ArrayList<SipMessage>());
                     mIMFragment.setArguments(IMBundle);
@@ -248,6 +236,11 @@
     }
 
     @Override
+    public Conference getDisplayedConference() {
+        return mDisplayedConference;
+    }
+
+    @Override
     public void onBackPressed() {
         super.onBackPressed();
         Intent launchHome = new Intent(this, HomeActivity.class);
diff --git a/src/org/sflphone/client/HomeActivity.java b/src/org/sflphone/client/HomeActivity.java
index fbba340..092ced0 100644
--- a/src/org/sflphone/client/HomeActivity.java
+++ b/src/org/sflphone/client/HomeActivity.java
@@ -363,16 +363,12 @@
     }
 
     public void launchCallActivity(SipCall infos) {
-
-        Bundle bundle = new Bundle();
         Conference tmp = new Conference(Conference.DEFAULT_ID);
 
         tmp.getParticipants().add(infos);
-
-        bundle.putParcelable("conference", tmp);
         Intent intent = new Intent().setClass(this, CallActivity.class);
+        intent.putExtra("conference", tmp);
         intent.putExtra("resuming", false);
-        intent.putExtras(bundle);
         startActivityForResult(intent, REQUEST_CODE_CALL);
 
         // overridePendingTransition(R.anim.slide_down, R.anim.slide_up);
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
diff --git a/src/org/sflphone/interfaces/AccountsInterface.java b/src/org/sflphone/interfaces/AccountsInterface.java
index 32e9492..b41f229 100644
--- a/src/org/sflphone/interfaces/AccountsInterface.java
+++ b/src/org/sflphone/interfaces/AccountsInterface.java
@@ -30,13 +30,11 @@
  */
 package org.sflphone.interfaces;
 
-import android.content.Intent;
-
 public interface AccountsInterface {
     
     public void accountsChanged();
 
-    public void accountStateChanged(Intent accountState);
+    public void accountStateChanged(String accoundID, String state, int code);
 
 
 }
diff --git a/src/org/sflphone/interfaces/CallInterface.java b/src/org/sflphone/interfaces/CallInterface.java
index 708d59e..3a3fd61 100644
--- a/src/org/sflphone/interfaces/CallInterface.java
+++ b/src/org/sflphone/interfaces/CallInterface.java
@@ -31,29 +31,25 @@
 
 package org.sflphone.interfaces;
 
-import android.content.Intent;
-
 public interface CallInterface {
 
-    public void callStateChanged(Intent callState);
+    public void callStateChanged(String callID, String state);
 
-    public void incomingText(Intent msg);
+    public void incomingText(String ID, String from, String msg);
 
-    public void confCreated(Intent intent);
+    public void confCreated(String id);
 
-    public void confRemoved(Intent intent);
+    public void confRemoved(String id);
 
-    public void confChanged(Intent intent);
-    
-    public void recordingChanged(Intent intent);
+    public void confChanged(String id, String state);
 
-    public void secureZrtpOn(Intent intent);
+    public void recordingChanged(String callID, String filename);
 
-    public void secureZrtpOff(Intent intent);
+    public void secureZrtpOn(String id);
 
-    public void displaySAS(Intent intent);
+    public void secureZrtpOff(String id);
+
+    public void displaySAS(String callID, String SAS, boolean verified);
 
 
-
-    
 }
diff --git a/src/org/sflphone/service/CallManagerCallBack.java b/src/org/sflphone/service/CallManagerCallBack.java
index 093b10e..97e1fab 100644
--- a/src/org/sflphone/service/CallManagerCallBack.java
+++ b/src/org/sflphone/service/CallManagerCallBack.java
@@ -27,6 +27,8 @@
     static public final String ZRTP_ON = "secure_zrtp_on";
     static public final String ZRTP_OFF = "secure_zrtp_off";
     static public final String DISPLAY_SAS = "display_sas";
+    static public final String ZRTP_NEGOTIATION_FAILED = "zrtp_nego_failed";
+    static public final String ZRTP_NOT_SUPPORTED = "zrtp_not_supported";
 
 
     public CallManagerCallBack(SipService context) {
@@ -36,12 +38,10 @@
     @Override
     public void on_call_state_changed(String callID, String newState) {
         Log.d(TAG, "on_call_state_changed : (" + callID + ", " + newState + ")");
-        Bundle bundle = new Bundle();
-        bundle.putString("CallID", callID);
-        bundle.putString("State", newState);
-        Intent intent = new Intent(CALL_STATE_CHANGED);
-        intent.putExtra("com.savoirfairelinux.sflphone.service.newstate", bundle);
 
+        Intent intent = new Intent(CALL_STATE_CHANGED);
+        intent.putExtra("CallID", callID);
+        intent.putExtra("State", newState);
         if (newState.equals("RINGING")) {
             try {
                 mService.getConferences().get(callID).setCallState(callID, SipCall.state.CALL_STATE_RINGING);
@@ -202,7 +202,7 @@
                 }
             }
         }
-        intent.putExtra("newconf", created);
+        intent.putExtra("confID", created.getId());
         mService.getConferences().put(created.getId(), created);
         mService.sendBroadcast(intent);
     }
@@ -210,14 +210,10 @@
     @Override
     public void on_incoming_message(String ID, String from, String msg) {
         Log.w(TAG, "on_incoming_message:" + msg);
-        Bundle bundle = new Bundle();
-
-        bundle.putString("CallID", ID);
-        bundle.putString("From", from);
-        bundle.putString("Msg", msg);
         Intent intent = new Intent(INCOMING_TEXT);
-        intent.putExtra("com.savoirfairelinux.sflphone.service.newtext", bundle);
-
+        intent.putExtra("CallID", ID);
+        intent.putExtra("From", from);
+        intent.putExtra("Msg", msg);
 
         if (mService.getConferences().get(ID) != null) {
             mService.getConferences().get(ID).addSipMessage(new SipMessage(true, msg));
@@ -270,7 +266,7 @@
         if (toModify.getParticipants().size() < newParticipants.size()) {
             // We need to add the new participant to the conf
             for (int i = 0; i < newParticipants.size(); ++i) {
-                if(toModify.getCallById(newParticipants.get(i))==null){
+                if (toModify.getCallById(newParticipants.get(i)) == null) {
                     mService.addCallToConference(toModify.getId(), newParticipants.get(i));
                 }
             }
@@ -289,7 +285,7 @@
     @Override
     public void on_record_playback_filepath(String id, String filename) {
         Intent intent = new Intent(RECORD_STATE_CHANGED);
-        intent.putExtra("id", id);
+        intent.putExtra("callID", id);
         intent.putExtra("file", filename);
         mService.sendBroadcast(intent);
     }
@@ -318,33 +314,51 @@
     public void on_secure_zrtp_off(String callID) {
         Log.i(TAG, "on_secure_zrtp_off");
         SipCall call = mService.getCallById(callID);
-        call.setSecured(false);
-        Intent intent = new Intent(ZRTP_OFF);
-        intent.putExtra("callID", callID);
-        mService.sendBroadcast(intent);
+
+        if (call != null) {
+            call.setSecured(false);
+            Intent intent = new Intent(ZRTP_OFF);
+            intent.putExtra("callID", callID);
+            mService.sendBroadcast(intent);
+        }
 
     }
 
     @Override
     public void on_show_sas(String callID, String sas, boolean verified) {
-        Log.i(TAG, "on_show_sas:"+ sas);
-        Log.i(TAG, "SAS Verified:"+ verified);
+        Log.i(TAG, "on_show_sas:" + sas);
+        Log.i(TAG, "SAS Verified:" + verified);
         SipCall call = mService.getCallById(callID);
         call.setSAS(sas);
         call.setConfirmedSAS(verified);
         Intent intent = new Intent(DISPLAY_SAS);
         intent.putExtra("callID", callID);
+        intent.putExtra("SAS", sas);
+        intent.putExtra("verified", verified);
+
         mService.sendBroadcast(intent);
     }
 
     @Override
     public void on_zrtp_not_supported(String callID) {
         Log.i(TAG, "on_zrtp_not_supported");
+        Intent intent = new Intent(ZRTP_NOT_SUPPORTED);
+        SipCall call = mService.getCallById(callID);
+        call.setSecured(false);
+        intent.putExtra("callID", callID);
+        mService.sendBroadcast(intent);
     }
 
     @Override
     public void on_zrtp_negociation_failed(String callID, String reason, String severity) {
         Log.i(TAG, "on_zrtp_negociation_failed");
+        Intent intent = new Intent(ZRTP_NEGOTIATION_FAILED);
+        SipCall call = mService.getCallById(callID);
+        call.setSecured(false);
+        intent.putExtra("callID", callID);
+        intent.putExtra("reason", reason);
+        intent.putExtra("severity", severity);
+        mService.sendBroadcast(intent);
     }
 
 }
diff --git a/src/org/sflphone/service/ConfigurationManagerCallback.java b/src/org/sflphone/service/ConfigurationManagerCallback.java
index 8d40272..77c157c 100644
--- a/src/org/sflphone/service/ConfigurationManagerCallback.java
+++ b/src/org/sflphone/service/ConfigurationManagerCallback.java
@@ -25,7 +25,7 @@
 import android.content.Intent;
 
 public class ConfigurationManagerCallback extends ConfigurationCallback {
-//    private static final String TAG = "ConfigurationManagerCallback";
+
     private  SipService mService;
 
     static public final String ACCOUNTS_CHANGED = "accounts-changed";
diff --git a/src/org/sflphone/service/ISipService.aidl b/src/org/sflphone/service/ISipService.aidl
index cb8b64c..418fe1b 100644
--- a/src/org/sflphone/service/ISipService.aidl
+++ b/src/org/sflphone/service/ISipService.aidl
@@ -49,8 +49,10 @@
 	/* Mute */
 	void setMuted(boolean mute);
     boolean isCaptureMuted();
-            
-	
+
+    /* Security */
+    void confirmSAS(in String callID);
+
 	/* DTMF */
 	void playDtmf(in String key);
     
diff --git a/src/org/sflphone/service/SipService.java b/src/org/sflphone/service/SipService.java
index d381b10..a2ccf2a 100644
--- a/src/org/sflphone/service/SipService.java
+++ b/src/org/sflphone/service/SipService.java
@@ -1082,21 +1082,6 @@
             });
         }
 
-/*        @Override
-        public Conference getCallById(String callID) throws RemoteException {
-            if(mConferences.containsKey(callID))
-                return mConferences.get(callID);
-            else{
-                Iterator<Conference> it = getConferences().values().iterator();
-                while (it.hasNext()) {
-                    Conference c = it.next();
-                    if (c.getCallById(callID) != null)
-                        return c;
-                }
-            }
-            return null;
-        }*/
-
         /***********************
          * Notification API
          ***********************/
@@ -1182,6 +1167,17 @@
         }
 
         @Override
+        public void confirmSAS(final String callID) throws RemoteException {
+            getExecutor().execute(new SipRunnable() {
+                @Override
+                protected void doRun() throws SameThreadException, RemoteException {
+                    Log.i(TAG, "SipService.confirmSAS() thread running...");
+                    callManagerJNI.setSASVerified(callID);
+                }
+            });
+        }
+
+        @Override
         public List getCredentials(final String accountID) throws RemoteException {
             class Credentials extends SipRunnableWithReturn {