diff --git a/src/org/sflphone/client/HomeActivity.java b/src/org/sflphone/client/HomeActivity.java
index f479a61..70f18a4 100644
--- a/src/org/sflphone/client/HomeActivity.java
+++ b/src/org/sflphone/client/HomeActivity.java
@@ -333,7 +333,7 @@
             fContent = getSupportFragmentManager().findFragmentByTag(entry.getName());
             if(fContent == null)
                 Log.i(TAG, "Null frag");
-            getSupportFragmentManager().popBackStack();
+            getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
             return;
         }
 
@@ -685,7 +685,10 @@
 
             if (fContent instanceof HomeFragment)
                 break;
-
+            
+            if(getSupportFragmentManager().getBackStackEntryCount() == 0)
+                break;
+            
             BackStackEntry entry = getSupportFragmentManager().getBackStackEntryAt(0);
             fContent = getSupportFragmentManager().findFragmentByTag(entry.getName());
             getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
@@ -694,15 +697,15 @@
         case 1:
             if (fContent instanceof AccountsManagementFragment)
                 break;
-            Log.i(TAG, "BackStackEntries: " + getSupportFragmentManager().getBackStackEntryCount());
+            
             fContent = new AccountsManagementFragment();
-            getSupportFragmentManager().beginTransaction().replace(R.id.main_frame, fContent, "Home").addToBackStack("Home").commit();
+            getSupportFragmentManager().beginTransaction().replace(R.id.main_frame, fContent, "Accounts").addToBackStack("Accounts").commit();
             break;
         case 2:
             if (fContent instanceof AboutFragment)
                 break;
             fContent = new AboutFragment();
-            getSupportFragmentManager().beginTransaction().replace(R.id.main_frame, fContent, "Home").addToBackStack("Home").commit();
+            getSupportFragmentManager().beginTransaction().replace(R.id.main_frame, fContent, "About").addToBackStack("About").commit();
             break;
         }
 
diff --git a/src/org/sflphone/fragments/AboutFragment.java b/src/org/sflphone/fragments/AboutFragment.java
index 97692ea..d2d3865 100644
--- a/src/org/sflphone/fragments/AboutFragment.java
+++ b/src/org/sflphone/fragments/AboutFragment.java
@@ -14,6 +14,12 @@
 public class AboutFragment extends Fragment {
 
     @Override
+    public void onResume() {
+        super.onResume();
+        getActivity().getActionBar().setTitle(R.string.menu_item_about);
+    }
+
+    @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
         View inflatedView = inflater.inflate(R.layout.frag_about, parent, false);
 
@@ -21,7 +27,7 @@
         String linkText = "<a href='http://sflphone.org/'>" + getResources().getString(R.string.web_site) + "</a>";
         link.setText(Html.fromHtml(linkText));
         link.setMovementMethod(LinkMovementMethod.getInstance());
-        getActivity().getActionBar().setTitle(R.string.menu_item_about);
+
         return inflatedView;
     }
 
diff --git a/src/org/sflphone/fragments/AccountsManagementFragment.java b/src/org/sflphone/fragments/AccountsManagementFragment.java
index 379f711..be69b00 100644
--- a/src/org/sflphone/fragments/AccountsManagementFragment.java
+++ b/src/org/sflphone/fragments/AccountsManagementFragment.java
@@ -146,7 +146,6 @@
 
         mShortAnimationDuration = getResources().getInteger(android.R.integer.config_shortAnimTime);
         Log.i(TAG, "anim time: " + mShortAnimationDuration);
-        getActivity().getActionBar().setTitle(R.string.menu_item_accounts);
 
     }
 
@@ -204,11 +203,9 @@
         intentFilter2.addAction(ConfigurationManagerCallback.ACCOUNTS_CHANGED);
         getActivity().registerReceiver(accountReceiver, intentFilter2);
         getActivity().getSupportLoaderManager().restartLoader(LoaderConstants.ACCOUNTS_LOADER, null, this);
-
+        getActivity().getActionBar().setTitle(R.string.menu_item_accounts);
     }
 
-
-
     @Override
     public void onCreateOptionsMenu(Menu m, MenuInflater inf) {
         super.onCreateOptionsMenu(m, inf);
@@ -433,16 +430,13 @@
 
     @Override
     public void onLoaderReset(android.support.v4.content.Loader<Bundle> arg0) {
-        // TODO Stub de la méthode généré automatiquement
-        
+
     }
 
     @Override
     public android.support.v4.content.Loader<Bundle> onCreateLoader(int arg0, Bundle arg1) {
         AccountsLoader l = new AccountsLoader(getActivity(), mCallbacks.getService());
-
         l.forceLoad();
-
         return l;
     }
 }
diff --git a/src/org/sflphone/fragments/HomeFragment.java b/src/org/sflphone/fragments/HomeFragment.java
index 4973792..51524eb 100644
--- a/src/org/sflphone/fragments/HomeFragment.java
+++ b/src/org/sflphone/fragments/HomeFragment.java
@@ -45,7 +45,7 @@
 
 public class HomeFragment extends Fragment {
     static final String TAG = HomeFragment.class.getSimpleName();
-    
+
     /**
      * The {@link ViewPager} that will host the section contents.
      */
@@ -53,6 +53,12 @@
     SectionsPagerAdapter mSectionsPagerAdapter = null;
 
     @Override
+    public void onResume() {
+        super.onResume();
+        getActivity().getActionBar().setTitle(R.string.menu_item_home);
+    }
+
+    @Override
     public void onAttach(Activity activity) {
         super.onAttach(activity);
     }
@@ -61,26 +67,21 @@
     public void onDetach() {
         super.onDetach();
     }
-    
+
     @Override
-    public void onCreate(Bundle savedBundle){
+    public void onCreate(Bundle savedBundle) {
         super.onCreate(savedBundle);
-        
-        //FIXME : getFragmentManager does not handle nested fragments, pages are not saved!
-        
         mSectionsPagerAdapter = new SectionsPagerAdapter(getActivity(), getChildFragmentManager());
-        getActivity().getActionBar().setTitle(R.string.menu_item_home);
     }
 
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
         ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.frag_home, container, false);
-        
-        
+
         // Set up the ViewPager with the sections adapter.
         mViewPager = (ViewPager) rootView.findViewById(R.id.pager);
         mViewPager.setPageTransformer(true, new ZoomOutPageTransformer(0.7f));
-        
+
         mViewPager.setOffscreenPageLimit(2);
         mViewPager.setAdapter(mSectionsPagerAdapter);
         mViewPager.setCurrentItem(1);
@@ -96,7 +97,7 @@
     public void onActivityResult(int requestCode, int resultCode, Intent data) {
         super.onActivityResult(requestCode, resultCode, data);
     }
-    
+
     public class ZoomOutPageTransformer implements ViewPager.PageTransformer {
         private static final float MIN_ALPHA = .6f;
 
diff --git a/src/org/sflphone/fragments/MenuFragment.java b/src/org/sflphone/fragments/MenuFragment.java
index 3bc51e4..b0fa2e1 100644
--- a/src/org/sflphone/fragments/MenuFragment.java
+++ b/src/org/sflphone/fragments/MenuFragment.java
@@ -84,14 +84,14 @@
 
         @Override
         public void onSectionSelected(int pos) {
-            
+
         }
     };
 
     public interface Callbacks {
 
         public ISipService getService();
-        
+
         public void onSectionSelected(int pos);
 
     }
@@ -111,7 +111,6 @@
         } catch (Exception e1) {
 
         }
-        
 
     }
 
@@ -154,7 +153,7 @@
         ((ListView) inflatedView.findViewById(R.id.listView)).setOnItemClickListener(new OnItemClickListener() {
 
             @Override
-            public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) {
+            public void onItemClick(AdapterView<?> arg0, View selected, int pos, long arg3) {
                 mCallbacks.onSectionSelected(pos);
             }
         });
@@ -192,24 +191,12 @@
     @Override
     public void onStart() {
         super.onStart();
-
     }
 
     public Account getSelectedAccount() {
         return mAccountAdapter.getSelectedAccount();
     }
 
-
-
-    /**
-     * Called by activity to pass a reference to sipservice to Fragment.
-     * 
-     * @param isip
-     */
-    public void onServiceSipBinded(ISipService isip) {
-
-    }
-
     public void updateAllAccounts() {
         if (getActivity() != null)
             getActivity().getSupportLoaderManager().restartLoader(LoaderConstants.ACCOUNTS_LOADER, null, this);
@@ -234,23 +221,23 @@
 
     @Override
     public android.support.v4.content.Loader<Bundle> onCreateLoader(int arg0, Bundle arg1) {
-      AccountsLoader l = new AccountsLoader(getActivity(), mCallbacks.getService());
-      l.forceLoad();
-      return l;
+        AccountsLoader l = new AccountsLoader(getActivity(), mCallbacks.getService());
+        l.forceLoad();
+        return l;
     }
 
     @Override
     public void onLoadFinished(android.support.v4.content.Loader<Bundle> arg0, Bundle bun) {
-      mAccountAdapter.removeAll();
-      ArrayList<Account> accounts = bun.getParcelableArrayList(AccountsLoader.ACCOUNTS);
-      mAccountAdapter.addAll(accounts);
-        
+        mAccountAdapter.removeAll();
+        ArrayList<Account> accounts = bun.getParcelableArrayList(AccountsLoader.ACCOUNTS);
+        mAccountAdapter.addAll(accounts);
+
     }
 
     @Override
     public void onLoaderReset(android.support.v4.content.Loader<Bundle> arg0) {
         // TODO Stub de la méthode généré automatiquement
-        
+
     }
 
 }
