diff --git a/src/org/sflphone/client/CallActivity.java b/src/org/sflphone/client/CallActivity.java
index fda7403..2f5de06 100644
--- a/src/org/sflphone/client/CallActivity.java
+++ b/src/org/sflphone/client/CallActivity.java
@@ -38,28 +38,24 @@
 import java.util.Timer;
 import java.util.TimerTask;
 
+import android.support.v4.app.FragmentActivity;
 import org.sflphone.R;
 import org.sflphone.fragments.CallFragment;
 import org.sflphone.fragments.IMFragment;
-import org.sflphone.interfaces.CallInterface;
 import org.sflphone.model.Account;
 import org.sflphone.model.CallContact;
 import org.sflphone.model.Conference;
 import org.sflphone.model.SipCall;
 import org.sflphone.model.SipMessage;
-import org.sflphone.receivers.CallReceiver;
-import org.sflphone.service.CallManagerCallBack;
 import org.sflphone.service.ISipService;
 import org.sflphone.service.SipService;
 import org.sflphone.utils.CallProximityManager;
 import org.sflphone.utils.CallProximityManager.ProximityDirector;
 import org.sflphone.views.CallPaneLayout;
 
-import android.app.Activity;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
-import android.content.IntentFilter;
 import android.content.ServiceConnection;
 import android.graphics.Color;
 import android.graphics.PixelFormat;
@@ -70,17 +66,18 @@
 import android.os.RemoteException;
 import android.os.SystemClock;
 import android.support.v4.widget.SlidingPaneLayout;
-import android.util.Log;
 import android.view.KeyEvent;
 import android.view.View;
 import android.view.Window;
 import android.view.WindowManager;
 
-public class CallActivity extends Activity implements CallInterface, IMFragment.Callbacks, CallFragment.Callbacks, ProximityDirector {
+public class CallActivity extends FragmentActivity implements IMFragment.Callbacks, CallFragment.Callbacks, ProximityDirector {
+
+    @SuppressWarnings("unused")
     static final String TAG = "CallActivity";
     private ISipService mService;
 
-    CallReceiver mReceiver;
+
 
     CallPaneLayout mSlidingPaneLayout;
 
@@ -97,7 +94,7 @@
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_call_layout);
 
-        mReceiver = new CallReceiver(this);
+
 
         mProximityManager = new CallProximityManager(this, this);
 
@@ -131,23 +128,6 @@
         bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
     }
 
-    /* activity gets back to the foreground and user input */
-    @Override
-    protected void onResume() {
-        Log.i(TAG, "onResume");
-        IntentFilter intentFilter = new IntentFilter();
-        intentFilter.addAction(CallManagerCallBack.INCOMING_CALL);
-        intentFilter.addAction(CallManagerCallBack.INCOMING_TEXT);
-        intentFilter.addAction(CallManagerCallBack.CALL_STATE_CHANGED);
-        intentFilter.addAction(CallManagerCallBack.CONF_CREATED);
-        intentFilter.addAction(CallManagerCallBack.CONF_REMOVED);
-        intentFilter.addAction(CallManagerCallBack.CONF_CHANGED);
-        intentFilter.addAction(CallManagerCallBack.RECORD_STATE_CHANGED);
-        registerReceiver(mReceiver, intentFilter);
-
-        super.onResume();
-    }
-
     @Override
     public void onAttachedToWindow() {
         super.onAttachedToWindow();
@@ -184,7 +164,7 @@
 
     @Override
     protected void onDestroy() {
-        unregisterReceiver(mReceiver);
+
         unbindService(mConnection);
 
         mProximityManager.stopTracking();
@@ -251,7 +231,7 @@
             }
 
             mSlidingPaneLayout.setCurFragment(mCurrentCallFragment);
-            getFragmentManager().beginTransaction().replace(R.id.ongoingcall_pane, mCurrentCallFragment)
+            getSupportFragmentManager().beginTransaction().replace(R.id.ongoingcall_pane, mCurrentCallFragment)
                                                     .replace(R.id.message_list_frame, mIMFragment).commit();
 
         }
@@ -261,31 +241,6 @@
         }
     };
 
-    @Override
-    public void callStateChanged(Intent callState) {
-
-        Bundle b = callState.getBundleExtra("com.savoirfairelinux.sflphone.service.newstate");
-        processCallStateChangedSignal(b.getString("CallID"), b.getString("State"));
-
-    }
-
-    public void processCallStateChangedSignal(String callID, String newState) {
-        if (mCurrentCallFragment != null) {
-            mCurrentCallFragment.changeCallState(callID, newState);
-        }
-        mProximityManager.updateProximitySensorMode();
-    }
-
-    @Override
-    public void incomingText(Intent in) {
-        Bundle b = in.getBundleExtra("com.savoirfairelinux.sflphone.service.newtext");
-
-        if (mIMFragment != null) {
-            SipMessage msg = new SipMessage(true, b.getString("Msg"));
-            mIMFragment.putMessage(msg);
-        }
-
-    }
 
     @Override
     public ISipService getService() {
@@ -302,28 +257,6 @@
     }
 
     @Override
-    public void confCreated(Intent intent) {
-        // mCallsFragment.update();
-
-    }
-
-    @Override
-    public void confRemoved(Intent intent) {
-        // mCallsFragment.update();
-    }
-
-    @Override
-    public void confChanged(Intent intent) {
-        // mCallsFragment.update();
-    }
-
-    @Override
-    public void recordingChanged(Intent intent) {
-
-        Log.i(TAG, "RECORDING CHANGED");
-    }
-
-    @Override
     public void terminateCall() {
         mHandler.removeCallbacks(mUpdateTimeTask);
         mCurrentCallFragment.getBubbleView().stopThread();
@@ -336,7 +269,6 @@
         };
 
         new Timer().schedule(quit, 1000);
-
     }
 
     @Override
diff --git a/src/org/sflphone/fragments/AccountWrapperFragment.java b/src/org/sflphone/fragments/AccountWrapperFragment.java
new file mode 100644
index 0000000..7f1144a
--- /dev/null
+++ b/src/org/sflphone/fragments/AccountWrapperFragment.java
@@ -0,0 +1,73 @@
+package org.sflphone.fragments;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.util.Log;
+import org.sflphone.interfaces.AccountsInterface;
+import org.sflphone.service.ConfigurationManagerCallback;
+
+/**
+ * Created by lisional on 11/02/14.
+ */
+public class AccountWrapperFragment extends Fragment implements AccountsInterface {
+
+
+    private AccountsReceiver mReceiver;
+
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        mReceiver = new AccountsReceiver();
+    }
+
+    @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);
+        getActivity().registerReceiver(mReceiver, intentFilter);
+    }
+
+    @Override
+    public void accountsChanged() {
+
+    }
+
+    @Override
+    public void accountStateChanged(Intent accountState) {
+
+    }
+
+
+    @Override
+    public void onPause() {
+        super.onPause();
+        getActivity().unregisterReceiver(mReceiver);
+    }
+
+    public class AccountsReceiver extends BroadcastReceiver {
+
+        private final String TAG = AccountsReceiver.class.getSimpleName();
+
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNT_STATE_CHANGED)) {
+                Log.i(TAG, "Received" + intent.getAction());
+                accountStateChanged(intent);
+            } else if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNTS_CHANGED)) {
+                Log.i(TAG, "Received" + intent.getAction());
+                accountsChanged();
+
+            }
+
+        }
+    }
+
+
+}
\ No newline at end of file
diff --git a/src/org/sflphone/fragments/AccountsManagementFragment.java b/src/org/sflphone/fragments/AccountsManagementFragment.java
index 93114dc..7204808 100644
--- a/src/org/sflphone/fragments/AccountsManagementFragment.java
+++ b/src/org/sflphone/fragments/AccountsManagementFragment.java
@@ -32,54 +32,38 @@
 
 package org.sflphone.fragments;
 
-import java.io.File;
-import java.util.ArrayList;
-
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.support.v4.app.ListFragment;
-import android.support.v4.app.LoaderManager;
-import android.support.v4.content.AsyncTaskLoader;
-import android.support.v4.content.Loader;
-import org.sflphone.R;
-import org.sflphone.client.AccountEditionActivity;
-import org.sflphone.client.AccountWizard;
-import org.sflphone.interfaces.AccountsInterface;
-import org.sflphone.loaders.AccountsLoader;
-import org.sflphone.loaders.LoaderConstants;
-import org.sflphone.model.Account;
-import org.sflphone.receivers.AccountsReceiver;
-import org.sflphone.service.ConfigurationManagerCallback;
-import org.sflphone.service.ISipService;
-import org.sflphone.views.dragsortlv.DragSortListView;
-
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
 import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
 import android.os.Bundle;
 import android.os.RemoteException;
+import android.support.v4.app.LoaderManager;
+import android.support.v4.content.AsyncTaskLoader;
+import android.support.v4.content.Loader;
 import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.MenuItem;
-import android.view.View;
+import android.view.*;
 import android.view.View.OnClickListener;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
+import android.widget.*;
 import android.widget.AdapterView.OnItemClickListener;
-import android.widget.BaseAdapter;
-import android.widget.CheckBox;
-import android.widget.ListView;
-import android.widget.TextView;
+import org.sflphone.R;
+import org.sflphone.client.AccountEditionActivity;
+import org.sflphone.client.AccountWizard;
+import org.sflphone.loaders.AccountsLoader;
+import org.sflphone.loaders.LoaderConstants;
+import org.sflphone.model.Account;
+import org.sflphone.service.ISipService;
+import org.sflphone.views.dragsortlv.DragSortListView;
 
-public class AccountsManagementFragment extends ListFragment implements LoaderManager.LoaderCallbacks<Bundle>, AccountsInterface {
+import java.io.File;
+import java.util.ArrayList;
+
+public class AccountsManagementFragment extends AccountWrapperFragment implements LoaderManager.LoaderCallbacks<Bundle> {
     static final String TAG = "AccountManagementFragment";
     static final String DEFAULT_ACCOUNT_ID = "IP2IP";
     static final int ACCOUNT_CREATE_REQUEST = 1;
     public static final int ACCOUNT_EDIT_REQUEST = 2;
-    AccountsReceiver accountReceiver;
     AccountsAdapter mAccountsAdapter;
     AccountsAdapter mIP2IPAdapter;
 
@@ -144,7 +128,6 @@
         mAccountsAdapter = new AccountsAdapter(getActivity(), new ArrayList<Account>());
         mIP2IPAdapter = new AccountsAdapter(getActivity(), new ArrayList<Account>());
         this.setHasOptionsMenu(true);
-        accountReceiver = new AccountsReceiver(this);
 
         mShortAnimationDuration = getResources().getInteger(android.R.integer.config_mediumAnimTime);
         Log.i(TAG, "anim time: " + mShortAnimationDuration);
@@ -154,21 +137,16 @@
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
         View inflatedView = inflater.inflate(R.layout.frag_accounts_list, parent, false);
-        setListAdapter(mAccountsAdapter);
+        ((ListView)inflatedView.findViewById(R.id.accounts_list)).setAdapter(mAccountsAdapter);
 
         return inflatedView;
     }
 
     @Override
-    public DragSortListView getListView() {
-        return (DragSortListView) super.getListView();
-    }
-
-    @Override
     public void onViewCreated(View view, Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
 
-        mDnDListView = getListView();
+        mDnDListView = (DragSortListView) getView().findViewById(R.id.accounts_list);
 
         mDnDListView.setDropListener(onDrop);
         mDnDListView.setOnItemClickListener(new OnItemClickListener() {
@@ -195,15 +173,11 @@
     @Override
     public void onPause() {
         super.onPause();
-        getActivity().unregisterReceiver(accountReceiver);
     }
 
     public void onResume() {
         super.onResume();
-        IntentFilter intentFilter2 = new IntentFilter();
-        intentFilter2.addAction(ConfigurationManagerCallback.ACCOUNT_STATE_CHANGED);
-        intentFilter2.addAction(ConfigurationManagerCallback.ACCOUNTS_CHANGED);
-        getActivity().registerReceiver(accountReceiver, intentFilter2);
+
         getLoaderManager().restartLoader(LoaderConstants.ACCOUNTS_LOADER, null, this);
         getActivity().getActionBar().setTitle(R.string.menu_item_accounts);
     }
diff --git a/src/org/sflphone/fragments/CallFragment.java b/src/org/sflphone/fragments/CallFragment.java
index 04b2e21..1436954 100644
--- a/src/org/sflphone/fragments/CallFragment.java
+++ b/src/org/sflphone/fragments/CallFragment.java
@@ -31,62 +31,46 @@
 
 package org.sflphone.fragments;
 
-import java.util.ArrayList;
-import java.util.Locale;
-
-import android.content.BroadcastReceiver;
-import android.content.IntentFilter;
-import android.net.wifi.WifiInfo;
-import android.net.wifi.WifiManager;
-import org.sflphone.R;
-import org.sflphone.model.Attractor;
-import org.sflphone.model.Bubble;
-import org.sflphone.model.BubbleContact;
-import org.sflphone.model.BubbleModel;
-import org.sflphone.model.BubbleUser;
-import org.sflphone.model.BubblesView;
-import org.sflphone.model.CallContact;
-import org.sflphone.model.Conference;
-import org.sflphone.model.SipCall;
-import org.sflphone.service.ISipService;
-
 import android.app.Activity;
-import android.app.Fragment;
-import android.app.FragmentManager;
+import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
+import android.content.IntentFilter;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.graphics.PointF;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
 import android.os.Bundle;
 import android.os.PowerManager;
-import android.os.RemoteException;
 import android.os.PowerManager.WakeLock;
+import android.os.RemoteException;
+import android.support.v4.app.FragmentManager;
 import android.util.Log;
-import android.view.KeyEvent;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.MenuItem;
-import android.view.SurfaceHolder;
+import android.view.*;
 import android.view.SurfaceHolder.Callback;
-import android.view.View;
 import android.view.View.OnClickListener;
-import android.view.ViewGroup;
 import android.view.inputmethod.InputMethodManager;
 import android.widget.CompoundButton;
 import android.widget.CompoundButton.OnCheckedChangeListener;
-import android.widget.ImageButton;
 import android.widget.TextView;
 import android.widget.ToggleButton;
+import org.sflphone.R;
+import org.sflphone.interfaces.CallInterface;
+import org.sflphone.model.*;
+import org.sflphone.service.ISipService;
 
-public class CallFragment extends Fragment implements Callback {
+import java.util.ArrayList;
+import java.util.Locale;
+
+public class CallFragment extends CallableWrapperFragment implements CallInterface, Callback {
 
     static final String TAG = "CallFragment";
 
     float BUBBLE_SIZE = 75;
     static final float ATTRACTOR_SIZE = 40;
 
+
     public static final int REQUEST_TRANSFER = 10;
 
     private Conference conf;
@@ -94,6 +78,7 @@
     private TextView callStatusTxt;
     private ToggleButton speakers;
 
+
     private PowerManager powerManager;
     // Screen wake lock for incoming call
     private WakeLock wakeLock;
@@ -131,6 +116,7 @@
                 "org.sflphone.onIncomingCall");
         wakeLock.setReferenceCounted(false);
 
+
         Log.d(TAG, "Acquire wake up lock");
         if (wakeLock != null && !wakeLock.isHeld()) {
             wakeLock.acquire();
@@ -251,9 +237,36 @@
     }
 
     @Override
+    public void callStateChanged(Intent callState) {
+        Bundle b = callState.getBundleExtra("com.savoirfairelinux.sflphone.service.newstate");
+        changeCallState(b.getString("CallID"), b.getString("State"));
+    }
+
+    @Override
+    public void recordingChanged(Intent intent) {
+
+    }
+
+    @Override
+    public void secureZrtpOn(Intent intent) {
+        Log.i(TAG, "secureZrtpOn");
+        //enableSASButton();
+    }
+
+    @Override
+    public void secureZrtpOff(Intent intent) {
+        Log.i(TAG, "secureZrtpOff");
+    }
+
+    @Override
+    public void displaySAS(Intent intent) {
+        Log.i(TAG, "displaySAS");
+    }
+
+    @Override
     public void onActivityResult(int requestCode, int resultCode, Intent data) {
         super.onActivityResult(requestCode, resultCode, data);
-        SipCall transfer = null;
+        SipCall transfer;
         if (requestCode == REQUEST_TRANSFER) {
             switch (resultCode) {
             case TransferDFragment.RESULT_TRANSFER_CONF:
@@ -314,7 +327,7 @@
             }
         });
 
-        ((ImageButton) rootView.findViewById(R.id.dialpad_btn)).setOnClickListener(new OnClickListener() {
+        rootView.findViewById(R.id.dialpad_btn).setOnClickListener(new OnClickListener() {
 
             @Override
             public void onClick(View v) {
@@ -334,8 +347,7 @@
         getBubbleForUser(conf, model.width / 2, model.height / 2);
 
         int angle_part = 360 / conf.getParticipants().size();
-        double dX = 0;
-        double dY = 0;
+        double dX, dY;
         int radiusCalls = (int) (model.width / 2 - BUBBLE_SIZE);
         for (int i = 0; i < conf.getParticipants().size(); ++i) {
 
@@ -394,8 +406,7 @@
 
         // TODO off-thread image loading
         int angle_part = 360 / conf.getParticipants().size();
-        double dX = 0;
-        double dY = 0;
+        double dX, dY;
         int radiusCalls = (int) (model.width / 2 - BUBBLE_SIZE);
         for (int i = 0; i < conf.getParticipants().size(); ++i) {
             dX = Math.cos(Math.toRadians(angle_part * i - 90)) * radiusCalls;
diff --git a/src/org/sflphone/fragments/CallListFragment.java b/src/org/sflphone/fragments/CallListFragment.java
index 9aae4b2..86e67ea 100644
--- a/src/org/sflphone/fragments/CallListFragment.java
+++ b/src/org/sflphone/fragments/CallListFragment.java
@@ -35,10 +35,8 @@
 import android.content.ClipData.Item;
 import android.content.Context;
 import android.content.Intent;
-import android.content.IntentFilter;
 import android.graphics.Color;
 import android.os.*;
-import android.support.v4.app.Fragment;
 import android.util.Log;
 import android.view.DragEvent;
 import android.view.LayoutInflater;
@@ -52,10 +50,7 @@
 import org.sflphone.R;
 import org.sflphone.client.CallActivity;
 import org.sflphone.client.HomeActivity;
-import org.sflphone.interfaces.CallInterface;
 import org.sflphone.model.Conference;
-import org.sflphone.receivers.CallReceiver;
-import org.sflphone.service.CallManagerCallBack;
 import org.sflphone.service.ISipService;
 
 import java.util.ArrayList;
@@ -63,14 +58,13 @@
 import java.util.Observable;
 import java.util.Observer;
 
-public class CallListFragment extends Fragment implements CallInterface {
+public class CallListFragment extends CallableWrapperFragment {
 
     private static final String TAG = CallListFragment.class.getSimpleName();
 
     private Callbacks mCallbacks = sDummyCallbacks;
     private TextView mConversationsTitleTextView;
     CallListAdapter mConferenceAdapter;
-    CallReceiver mCallReceiver;
 
     public static final int REQUEST_TRANSFER = 10;
     public static final int REQUEST_CONF = 20;
@@ -128,7 +122,8 @@
 
     @Override
     public void recordingChanged(Intent intent) {
-
+        Log.i(TAG, "confChanged");
+        updateLists();
     }
 
     /**
@@ -168,11 +163,6 @@
     @Override
     public void onResume() {
         super.onResume();
-        IntentFilter intentFilter = new IntentFilter();
-        intentFilter.addAction(CallManagerCallBack.INCOMING_CALL);
-        intentFilter.addAction(CallManagerCallBack.INCOMING_TEXT);
-        intentFilter.addAction(CallManagerCallBack.CALL_STATE_CHANGED);
-        getActivity().registerReceiver(mCallReceiver, intentFilter);
         if (mCallbacks.getService() != null) {
 
             updateLists();
@@ -206,14 +196,12 @@
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        mCallReceiver = new CallReceiver(this);
     }
 
     @Override
     public void onPause() {
         super.onPause();
         mHandler.removeCallbacks(mUpdateTimeTask);
-        getActivity().unregisterReceiver(mCallReceiver);
     }
 
     @Override
diff --git a/src/org/sflphone/fragments/CallableWrapperFragment.java b/src/org/sflphone/fragments/CallableWrapperFragment.java
new file mode 100644
index 0000000..fc6b732
--- /dev/null
+++ b/src/org/sflphone/fragments/CallableWrapperFragment.java
@@ -0,0 +1,132 @@
+package org.sflphone.fragments;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+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;
+
+/**
+ * Created by lisional on 10/02/14.
+ */
+public abstract class CallableWrapperFragment extends Fragment implements CallInterface {
+
+
+    private CallReceiver mReceiver;
+
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        mReceiver = new CallReceiver();
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();IntentFilter intentFilter = new IntentFilter();
+        intentFilter.addAction(CallManagerCallBack.INCOMING_CALL);
+        intentFilter.addAction(CallManagerCallBack.INCOMING_TEXT);
+        intentFilter.addAction(CallManagerCallBack.CALL_STATE_CHANGED);
+        intentFilter.addAction(CallManagerCallBack.CONF_CREATED);
+        intentFilter.addAction(CallManagerCallBack.CONF_REMOVED);
+        intentFilter.addAction(CallManagerCallBack.CONF_CHANGED);
+        intentFilter.addAction(CallManagerCallBack.RECORD_STATE_CHANGED);
+        intentFilter.addAction(CallManagerCallBack.ZRTP_OFF);
+        intentFilter.addAction(CallManagerCallBack.ZRTP_ON);
+        intentFilter.addAction(CallManagerCallBack.DISPLAY_SAS);
+        getActivity().registerReceiver(mReceiver, intentFilter);
+    }
+
+
+    @Override
+    public void onPause() {
+        super.onPause();
+        getActivity().unregisterReceiver(mReceiver);
+    }
+
+    @Override
+    public void callStateChanged(Intent callState) {
+
+    }
+
+    @Override
+    public void incomingText(Intent msg) {
+
+    }
+
+    @Override
+    public void confCreated(Intent intent) {
+
+    }
+
+    @Override
+    public void confRemoved(Intent intent) {
+
+    }
+
+    @Override
+    public void confChanged(Intent intent) {
+
+    }
+
+    @Override
+    public void recordingChanged(Intent intent) {
+
+    }
+
+    @Override
+    public void secureZrtpOn(Intent intent) {
+
+    }
+
+    @Override
+    public void secureZrtpOff(Intent intent) {
+
+    }
+
+    @Override
+    public void displaySAS(Intent intent) {
+
+    }
+
+    public class CallReceiver extends BroadcastReceiver {
+
+        private final String TAG = CallReceiver.class.getSimpleName();
+
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            if (intent.getAction().contentEquals(CallManagerCallBack.INCOMING_TEXT)) {
+                incomingText(intent);
+            } else if (intent.getAction().contentEquals(CallManagerCallBack.CALL_STATE_CHANGED)) {
+                callStateChanged(intent);
+            } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_CREATED)) {
+                confCreated(intent);
+            } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_REMOVED)) {
+                confRemoved(intent);
+            } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_CHANGED)) {
+                confChanged(intent);
+            } else if (intent.getAction().contentEquals(CallManagerCallBack.RECORD_STATE_CHANGED)) {
+                recordingChanged(intent);
+            } else if (intent.getAction().contentEquals(CallManagerCallBack.ZRTP_OFF)) {
+                secureZrtpOff(intent);
+            } else if (intent.getAction().contentEquals(CallManagerCallBack.ZRTP_ON)) {
+                secureZrtpOn(intent);
+            } else if (intent.getAction().contentEquals(CallManagerCallBack.DISPLAY_SAS)) {
+                displaySAS(intent);
+            } else {
+                Log.e(TAG, "Unknown action: " + intent.getAction());
+            }
+
+        }
+
+    }
+
+
+}
\ No newline at end of file
diff --git a/src/org/sflphone/fragments/IMFragment.java b/src/org/sflphone/fragments/IMFragment.java
index cc57d3f..6ec7e39 100644
--- a/src/org/sflphone/fragments/IMFragment.java
+++ b/src/org/sflphone/fragments/IMFragment.java
@@ -37,7 +37,6 @@
 import org.sflphone.service.ISipService;
 
 import android.app.Activity;
-import android.app.Fragment;
 import android.content.Intent;
 import android.os.Bundle;
 import android.util.Log;
@@ -49,7 +48,7 @@
 import android.view.inputmethod.EditorInfo;
 import android.widget.TextView.OnEditorActionListener;
 
-public class IMFragment extends Fragment {
+public class IMFragment extends CallableWrapperFragment {
     static final String TAG = IMFragment.class.getSimpleName();
 
     private Callbacks mCallbacks = sDummyCallbacks;
@@ -67,6 +66,14 @@
 
     }
 
+    @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);
+    }
+
+
     /**
      * A dummy implementation of the {@link Callbacks} interface that does nothing. Used only when this fragment is not attached to an activity.
      */
@@ -86,7 +93,6 @@
 
     /**
      * The Activity calling this fragment has to implement this interface
-     * 
      */
     public interface Callbacks {
         public ISipService getService();
@@ -141,14 +147,13 @@
         });
 
 
-
         return rootView;
     }
 
     private void sendMessage() {
         if (sendTextField.getText().toString().length() > 0) {
             SipMessage toSend = new SipMessage(false, sendTextField.getText().toString());
-            if(mCallbacks.sendIM(toSend)){
+            if (mCallbacks.sendIM(toSend)) {
                 putMessage(toSend);
                 sendTextField.setText("");
             } else {
@@ -158,7 +163,6 @@
     }
 
 
-
     @Override
     public void onActivityResult(int requestCode, int resultCode, Intent data) {
         super.onActivityResult(requestCode, resultCode, data);
diff --git a/src/org/sflphone/fragments/MenuFragment.java b/src/org/sflphone/fragments/MenuFragment.java
index e097505..dde43fd 100644
--- a/src/org/sflphone/fragments/MenuFragment.java
+++ b/src/org/sflphone/fragments/MenuFragment.java
@@ -30,50 +30,40 @@
  */
 package org.sflphone.fragments;
 
-import java.util.ArrayList;
-
-import android.support.v4.app.Fragment;
-import android.support.v4.app.LoaderManager;
-import android.support.v4.content.AsyncTaskLoader;
-import android.support.v4.content.Loader;
-import android.util.Log;
-import org.sflphone.R;
-import org.sflphone.adapters.AccountSelectionAdapter;
-import org.sflphone.adapters.ContactPictureTask;
-import org.sflphone.interfaces.AccountsInterface;
-import org.sflphone.loaders.AccountsLoader;
-import org.sflphone.loaders.LoaderConstants;
-import org.sflphone.model.Account;
-import org.sflphone.model.CallContact;
-import org.sflphone.receivers.AccountsReceiver;
-import org.sflphone.service.ConfigurationManagerCallback;
-import org.sflphone.service.ISipService;
-
 import android.app.Activity;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.os.Bundle;
 import android.os.RemoteException;
+import android.support.v4.app.LoaderManager;
+import android.support.v4.content.AsyncTaskLoader;
+import android.support.v4.content.Loader;
+import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
-import android.widget.AdapterView;
+import android.widget.*;
 import android.widget.AdapterView.OnItemClickListener;
 import android.widget.AdapterView.OnItemSelectedListener;
-import android.widget.ArrayAdapter;
-import android.widget.ImageView;
-import android.widget.ListView;
-import android.widget.Spinner;
-import android.widget.TextView;
+import org.sflphone.R;
+import org.sflphone.adapters.AccountSelectionAdapter;
+import org.sflphone.adapters.ContactPictureTask;
+import org.sflphone.loaders.AccountsLoader;
+import org.sflphone.loaders.LoaderConstants;
+import org.sflphone.model.Account;
+import org.sflphone.model.CallContact;
+import org.sflphone.service.ConfigurationManagerCallback;
+import org.sflphone.service.ISipService;
 
-public class MenuFragment extends Fragment implements LoaderManager.LoaderCallbacks<Bundle>, AccountsInterface {
+import java.util.ArrayList;
+
+public class MenuFragment extends AccountWrapperFragment implements LoaderManager.LoaderCallbacks<Bundle> {
 
     @SuppressWarnings("unused")
     private static final String TAG = MenuFragment.class.getSimpleName();
 
     AccountSelectionAdapter mAccountAdapter;
     private Spinner spinnerAccounts;
-    AccountsReceiver accountReceiver;
     private Callbacks mCallbacks = sDummyCallbacks;
 
     private ListView sections;
@@ -127,17 +117,12 @@
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        accountReceiver = new AccountsReceiver(this);
     }
 
     public void onResume() {
         super.onResume();
 
         Log.i(TAG, "Resuming");
-        IntentFilter intentFilter2 = new IntentFilter();
-        intentFilter2.addAction(ConfigurationManagerCallback.ACCOUNT_STATE_CHANGED);
-        intentFilter2.addAction(ConfigurationManagerCallback.ACCOUNTS_CHANGED);
-        getActivity().registerReceiver(accountReceiver, intentFilter2);
         getLoaderManager().restartLoader(LoaderConstants.ACCOUNTS_LOADER, null, this);
 
     }
@@ -153,7 +138,6 @@
     @Override
     public void onPause() {
         super.onPause();
-        getActivity().unregisterReceiver(accountReceiver);
     }
 
     @Override
diff --git a/src/org/sflphone/fragments/TransferDFragment.java b/src/org/sflphone/fragments/TransferDFragment.java
index ff925f8..6c8bee9 100644
--- a/src/org/sflphone/fragments/TransferDFragment.java
+++ b/src/org/sflphone/fragments/TransferDFragment.java
@@ -35,6 +35,8 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import android.app.Dialog;
+import android.support.v4.app.DialogFragment;
 import org.sflphone.R;
 import org.sflphone.loaders.ContactsLoader;
 import org.sflphone.model.Conference;
@@ -42,8 +44,6 @@
 
 import android.app.Activity;
 import android.app.AlertDialog;
-import android.app.Dialog;
-import android.app.DialogFragment;
 import android.app.LoaderManager;
 import android.content.Context;
 import android.content.DialogInterface;
diff --git a/src/org/sflphone/interfaces/CallInterface.java b/src/org/sflphone/interfaces/CallInterface.java
index e7a9145..708d59e 100644
--- a/src/org/sflphone/interfaces/CallInterface.java
+++ b/src/org/sflphone/interfaces/CallInterface.java
@@ -46,5 +46,14 @@
     public void confChanged(Intent intent);
     
     public void recordingChanged(Intent intent);
+
+    public void secureZrtpOn(Intent intent);
+
+    public void secureZrtpOff(Intent intent);
+
+    public void displaySAS(Intent intent);
+
+
+
     
 }
diff --git a/src/org/sflphone/model/SipCall.java b/src/org/sflphone/model/SipCall.java
index 7aa83be..1a9c297 100644
--- a/src/org/sflphone/model/SipCall.java
+++ b/src/org/sflphone/model/SipCall.java
@@ -52,6 +52,15 @@
     private int mCallType;
     private int mCallState = state.CALL_STATE_NONE;
 
+    private boolean isSecured;
+    private String SAS;
+    private boolean confirmedSAS;
+
+
+    public boolean isSecured() {
+        return isSecured;
+    }
+
     /**
      * *********************
      * Construtors
@@ -68,6 +77,9 @@
         mCallState = in.readInt();
         timestampStart_ = in.readLong();
         timestampEnd_ = in.readLong();
+        SAS = in.readString();
+        confirmedSAS = in.readByte() == 1;
+        isSecured = in.readByte() == 1;
     }
 
     private SipCall(String id, Account account, int call_type, int call_state, CallContact c) {
@@ -90,6 +102,10 @@
         return mCallType;
     }
 
+    public void setSecured(boolean secured) {
+        isSecured = secured;
+    }
+
     public interface direction {
         public static final int CALL_TYPE_INCOMING = 1;
         public static final int CALL_TYPE_OUTGOING = 2;
@@ -123,6 +139,9 @@
         out.writeInt(mCallState);
         out.writeLong(timestampStart_);
         out.writeLong(timestampEnd_);
+        out.writeString(SAS);
+        out.writeByte((byte) (confirmedSAS ? 1 : 0));
+        out.writeByte((byte) (isSecured ? 1 : 0));
     }
 
     public static final Parcelable.Creator<SipCall> CREATOR = new Parcelable.Creator<SipCall>() {
@@ -355,4 +374,20 @@
     public boolean isCurrent() {
         return mCallState == state.CALL_STATE_CURRENT;
     }
+
+    public boolean isConfirmedSAS() {
+        return confirmedSAS;
+    }
+
+    public void setConfirmedSAS(boolean confirmedSAS) {
+        this.confirmedSAS = confirmedSAS;
+    }
+
+    public String getSAS() {
+        return SAS;
+    }
+
+    public void setSAS(String SAS) {
+        this.SAS = SAS;
+    }
 }
diff --git a/src/org/sflphone/receivers/AccountsReceiver.java b/src/org/sflphone/receivers/AccountsReceiver.java
deleted file mode 100644
index 23c5b6c..0000000
--- a/src/org/sflphone/receivers/AccountsReceiver.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- *  Copyright (C) 2004-2014 Savoir-Faire Linux Inc.
- *
- *  Author: Alexandre Lision <alexandre.lision@savoirfairelinux.com>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 3 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- *  Additional permission under GNU GPL version 3 section 7:
- *
- *  If you modify this program, or any covered work, by linking or
- *  combining it with the OpenSSL project's OpenSSL library (or a
- *  modified version of that library), containing parts covered by the
- *  terms of the OpenSSL or SSLeay licenses, Savoir-Faire Linux Inc.
- *  grants you additional permission to convey the resulting work.
- *  Corresponding Source for a non-source form of such a combination
- *  shall include the source code for the parts of OpenSSL used as well
- *  as that of the covered work.
- */
-package org.sflphone.receivers;
-
-import org.sflphone.interfaces.AccountsInterface;
-import org.sflphone.service.ConfigurationManagerCallback;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.util.Log;
-
-public class AccountsReceiver extends BroadcastReceiver {
-
-    static final String TAG = AccountsReceiver.class.getSimpleName();
-
-    AccountsInterface callback;
-
-    public AccountsReceiver(AccountsInterface client) {
-        callback = client;
-    }
-
-    @Override
-    public void onReceive(Context context, Intent intent) {
-        if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNT_STATE_CHANGED)) {
-            Log.i(TAG, "Received" + intent.getAction());
-            callback.accountStateChanged(intent);
-        } else if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNTS_CHANGED)) {
-            Log.i(TAG, "Received" + intent.getAction());
-            callback.accountsChanged();
-
-        }
-
-    }
-}
\ No newline at end of file
diff --git a/src/org/sflphone/receivers/CallReceiver.java b/src/org/sflphone/receivers/CallReceiver.java
deleted file mode 100644
index 27848a7..0000000
--- a/src/org/sflphone/receivers/CallReceiver.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- *  Copyright (C) 2004-2014 Savoir-Faire Linux Inc.
- *
- *  Author: Alexandre Lision <alexandre.lision@savoirfairelinux.com>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 3 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- *  Additional permission under GNU GPL version 3 section 7:
- *
- *  If you modify this program, or any covered work, by linking or
- *  combining it with the OpenSSL project's OpenSSL library (or a
- *  modified version of that library), containing parts covered by the
- *  terms of the OpenSSL or SSLeay licenses, Savoir-Faire Linux Inc.
- *  grants you additional permission to convey the resulting work.
- *  Corresponding Source for a non-source form of such a combination
- *  shall include the source code for the parts of OpenSSL used as well
- *  as that of the covered work.
- */
-package org.sflphone.receivers;
-
-import org.sflphone.interfaces.CallInterface;
-import org.sflphone.service.CallManagerCallBack;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.util.Log;
-
-public class CallReceiver extends BroadcastReceiver {
-
-    static final String TAG = CallReceiver.class.getSimpleName();
-
-    CallInterface callback;
-
-    public CallReceiver(CallInterface client) {
-        callback = client;
-    }
-
-    @Override
-    public void onReceive(Context context, Intent intent) {
-        if (intent.getAction().contentEquals(CallManagerCallBack.INCOMING_TEXT)) {
-            callback.incomingText(intent);
-        } else if (intent.getAction().contentEquals(CallManagerCallBack.CALL_STATE_CHANGED)) {
-            callback.callStateChanged(intent);
-        } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_CREATED)) {
-            callback.confCreated(intent);
-        } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_REMOVED)) {
-            callback.confRemoved(intent);
-        } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_CHANGED)) {
-            callback.confChanged(intent);
-        } else if (intent.getAction().contentEquals(CallManagerCallBack.RECORD_STATE_CHANGED)) {
-            callback.recordingChanged(intent);
-        } else {
-            Log.e(TAG, "Unknown action: " + intent.getAction());
-        }
-
-    }
-
-}
diff --git a/src/org/sflphone/service/CallManagerCallBack.java b/src/org/sflphone/service/CallManagerCallBack.java
index 6b67e24..093b10e 100644
--- a/src/org/sflphone/service/CallManagerCallBack.java
+++ b/src/org/sflphone/service/CallManagerCallBack.java
@@ -24,6 +24,10 @@
     static public final String CONF_CHANGED = "conf_changed";
     static public final String RECORD_STATE_CHANGED = "record_state";
 
+    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";
+
 
     public CallManagerCallBack(SipService context) {
         mService = context;
@@ -303,17 +307,34 @@
     @Override
     public void on_secure_zrtp_on(String callID, String cipher) {
         Log.i(TAG, "on_secure_zrtp_on");
+        SipCall call = mService.getCallById(callID);
+        call.setSecured(true);
+        Intent intent = new Intent(ZRTP_ON);
+        intent.putExtra("callID", callID);
+        mService.sendBroadcast(intent);
     }
 
     @Override
     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);
+
     }
 
     @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);
+        SipCall call = mService.getCallById(callID);
+        call.setSAS(sas);
+        call.setConfirmedSAS(verified);
+        Intent intent = new Intent(DISPLAY_SAS);
+        intent.putExtra("callID", callID);
+        mService.sendBroadcast(intent);
     }
 
     @Override
diff --git a/src/org/sflphone/service/SipService.java b/src/org/sflphone/service/SipService.java
index 1d9a5d1..d381b10 100644
--- a/src/org/sflphone/service/SipService.java
+++ b/src/org/sflphone/service/SipService.java
@@ -185,6 +185,22 @@
         return mExecutor;
     }
 
+    public SipCall getCallById(String callID) {
+        if (getConferences().get(callID) != null) {
+            return getConferences().get(callID).getCallById(callID);
+        } else {
+            // Check if call is in a conference
+            Iterator<Map.Entry<String, Conference>> it = getConferences().entrySet().iterator();
+            while (it.hasNext()) {
+                Conference tmp = it.next().getValue();
+                SipCall c = tmp.getCallById(callID);
+                if(c != null)
+                     return c;
+            }
+        }
+        return null;
+    }
+
     // Executes immediate tasks in a single executorThread.
     public static class SipServiceExecutor extends Handler {
 
