diff --git a/src/com/savoirfairelinux/sflphone/client/CallActivity.java b/src/com/savoirfairelinux/sflphone/client/CallActivity.java
index 1effb7b..1cf7e55 100644
--- a/src/com/savoirfairelinux/sflphone/client/CallActivity.java
+++ b/src/com/savoirfairelinux/sflphone/client/CallActivity.java
@@ -184,23 +184,8 @@
 
     @Override
     protected void onDestroy() {
-
         unregisterReceiver(receiver);
-
-        try {
-            service.createNotification();
-        } catch (RemoteException e) {
-            Log.e(TAG, e.toString());
-        }
-        // Log.i(TAG, "Destroying Call Activity for call " + mCall.getCallId());
-        // LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
-        try {
-            service.destroyNotification();
-        } catch (RemoteException e) {
-            Log.e(TAG, e.toString());
-        }
         unbindService(mConnection);
-
         super.onDestroy();
     }
 
diff --git a/src/com/savoirfairelinux/sflphone/client/SFLPhoneHomeActivity.java b/src/com/savoirfairelinux/sflphone/client/SFLPhoneHomeActivity.java
index c976eb6..f8814f8 100644
--- a/src/com/savoirfairelinux/sflphone/client/SFLPhoneHomeActivity.java
+++ b/src/com/savoirfairelinux/sflphone/client/SFLPhoneHomeActivity.java
@@ -116,13 +116,13 @@
     @Override
     protected void onSaveInstanceState(Bundle bundle) {
         super.onSaveInstanceState(bundle);
-        for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
-            try {
-                getFragmentManager().putFragment(bundle, mSectionsPagerAdapter.getClassName(i), mSectionsPagerAdapter.getItem(i));
-            } catch (IllegalStateException e) {
-                Log.e(TAG, "fragment=" + mSectionsPagerAdapter.getItem(i));
-            }
-        }
+//        for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
+//            try {
+//                getFragmentManager().putFragment(bundle, mSectionsPagerAdapter.getClassName(i), mSectionsPagerAdapter.getItem(i));
+//            } catch (IllegalStateException e) {
+//                Log.e(TAG, "fragment=" + mSectionsPagerAdapter.getItem(i));
+//            }
+//        }
 
         getFragmentManager().putFragment(bundle, "ContactsListFragment", mContactsFragment);
         Log.w(TAG, "onSaveInstanceState()");
@@ -146,6 +146,9 @@
             bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
         }
         
+        if(savedInstanceState != null){
+            mContactsFragment = (ContactListFragment) getFragmentManager().getFragment(savedInstanceState, "ContactsListFragment");
+        }
         if (mContactsFragment == null) {
             mContactsFragment = new ContactListFragment();
             Log.w(TAG, "Recreated mContactListFragment=" + mContactsFragment);
@@ -298,12 +301,12 @@
     @Override
     protected void onDestroy() {
         /* stop the service, if no other bound user, no need to check if it is running */
-        try {
-            service.createNotification();
-
-        } catch (RemoteException e) {
-            Log.e(TAG, e.toString());
-        }
+//        try {
+//            service.createNotification();
+//
+//        } catch (RemoteException e) {
+//            Log.e(TAG, e.toString());
+//        }
         if (mBound) {
             Log.i(TAG, "onDestroy: Unbinding service...");
 
diff --git a/src/com/savoirfairelinux/sflphone/fragments/CallFragment.java b/src/com/savoirfairelinux/sflphone/fragments/CallFragment.java
index 919e1da..f7a75fd 100644
--- a/src/com/savoirfairelinux/sflphone/fragments/CallFragment.java
+++ b/src/com/savoirfairelinux/sflphone/fragments/CallFragment.java
@@ -315,7 +315,7 @@
         }
 
         model.clearAttractors();
-//        model.addAttractor(new Attractor(new PointF(model.width * .2f, model.height * 0.9f), ATTRACTOR_SIZE, new Attractor.Callback() {
+//        model.addAttractor(new Attractor(new PointF(model.width * 0.9f, model.height * 0.1f), ATTRACTOR_SIZE, new Attractor.Callback() {
 //            @Override
 //            public boolean onBubbleSucked(Bubble b) {
 //                Log.w(TAG, "Bubble sucked ! ");
@@ -378,10 +378,13 @@
 
         mCallbacks.startTimer();
 
-        getBubbleFor(conf.getParticipants().get(0), model.width / 2, model.height / 2);
+        int radiusCalls = (int) (model.width / 2 - BUBBLE_SIZE);
+        getBubbleFor(myself, model.width / 2, model.height / 2 + radiusCalls);
+        getBubbleFor(conf.getParticipants().get(0), model.width / 2, model.height / 2 - radiusCalls);
+        
 
         model.clearAttractors();
-        model.addAttractor(new Attractor(new PointF(4 * model.width / 5, model.height / 2), ATTRACTOR_SIZE, new Attractor.Callback() {
+        model.addAttractor(new Attractor(new PointF(model.width / 2, model.height / 2), ATTRACTOR_SIZE, new Attractor.Callback() {
             @Override
             public boolean onBubbleSucked(Bubble b) {
 
@@ -392,14 +395,6 @@
                 return false;
             }
         }, call_icon));
-        model.addAttractor(new Attractor(new PointF(model.width / 5, model.height / 2), ATTRACTOR_SIZE, new Attractor.Callback() {
-            @Override
-            public boolean onBubbleSucked(Bubble b) {
-                mCallbacks.onCallRejected(conf.getParticipants().get(0));
-                bubbleRemoved(b);
-                return true;
-            }
-        }, hangup_icon));
     }
 
     private void initOutGoingCallDisplay() {
diff --git a/src/com/savoirfairelinux/sflphone/fragments/DialingFragment.java b/src/com/savoirfairelinux/sflphone/fragments/DialingFragment.java
index b9d38a6..f3399c1 100644
--- a/src/com/savoirfairelinux/sflphone/fragments/DialingFragment.java
+++ b/src/com/savoirfairelinux/sflphone/fragments/DialingFragment.java
@@ -104,9 +104,7 @@
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
-        Log.i(TAG,"Create History Fragment");
         super.onCreate(savedInstanceState);
-
     }
 
     @Override
diff --git a/src/com/savoirfairelinux/sflphone/model/BubbleModel.java b/src/com/savoirfairelinux/sflphone/model/BubbleModel.java
index 8c68499..1ad013e 100644
--- a/src/com/savoirfairelinux/sflphone/model/BubbleModel.java
+++ b/src/com/savoirfairelinux/sflphone/model/BubbleModel.java
@@ -95,11 +95,12 @@
 		for(int i=0, n=bubbles.size(); i<n; i++) {
 			Bubble b = bubbles.get(i);
 			
-			if(b.markedToDie){
+            if (b.markedToDie){
 			    continue;
 			}
 
 			if(!b.dragged) {
+			    
 				float bx=b.getPosX(), by=b.getPosY();
 
 				Attractor attractor = null;
@@ -171,8 +172,10 @@
 				//	Log.w(TAG, "update dx="+dt+" dy="+dy);
 				b.setPos((float)(bx+dx), (float)(by+dy));
 
+//				Log.i(TAG,"Model:");
 				if(attractor != null && attractor_dist < attractor_dist_suck*attractor_dist_suck) {
 					b.dragged = false;
+					Log.i(TAG,"Model:Sucking");
 					if(attractor.callback.onBubbleSucked(b)) {
 						bubbles.remove(b);
 						n--;
diff --git a/src/com/savoirfairelinux/sflphone/model/BubblesView.java b/src/com/savoirfairelinux/sflphone/model/BubblesView.java
index 9f61622..573013e 100644
--- a/src/com/savoirfairelinux/sflphone/model/BubblesView.java
+++ b/src/com/savoirfairelinux/sflphone/model/BubblesView.java
@@ -40,8 +40,12 @@
 import android.graphics.LinearGradient;
 import android.graphics.Paint;
 import android.graphics.Paint.Align;
+import android.graphics.Paint.Style;
+import android.graphics.PorterDuffXfermode;
+import android.graphics.RadialGradient;
 import android.graphics.RectF;
 import android.graphics.Shader.TileMode;
+import android.graphics.Xfermode;
 import android.os.Handler;
 import android.os.Message;
 import android.util.AttributeSet;
@@ -270,26 +274,35 @@
                     // Draw red gradient around to hang up call
                     // canvas.drawColor(Color.RED);
 
-                    LinearGradient grTop = new LinearGradient(0, 0, 0, 40, Color.RED, Color.WHITE, TileMode.CLAMP);
+                    // LinearGradient grTop = new LinearGradient(0, 0, 0, 40, Color.RED, Color.WHITE, TileMode.CLAMP);
+                    // RadialGradient gr = new RadialGradient(model.width/2, model.height/2, model.width/2, Color.WHITE, Color.RED, TileMode.CLAMP);
                     Paint p = new Paint();
                     p.setDither(true);
-                    p.setShader(grTop);
-                    canvas.drawRect(new RectF(0, 0, model.width, 40), p);
+                    // p.setShader(gr);
+                    p.setColor(getResources().getColor(R.color.holo_red_light));
+                    // p.setXfermode(new PorterDuffXfermode(Mode.))
+                    p.setStyle(Style.STROKE);
+                    // canvas.drawRect(new RectF(0, 0, model.width, 40), p);
+                    p.setStrokeWidth(20);
 
-                    LinearGradient grBottom = new LinearGradient(0, model.height, 0, model.height - 40, Color.RED, Color.WHITE, TileMode.CLAMP);
-                    p.setDither(true);
-                    p.setShader(grBottom);
-                    canvas.drawRect(new RectF(0, model.height - 40, model.width, model.height), p);
+                    canvas.drawRect(new RectF(10, 10, model.width - 10, model.height - 10), p);
 
-                    LinearGradient grLeft = new LinearGradient(0, 0, 40, 0, Color.RED, Color.WHITE, TileMode.CLAMP);
-                    p.setDither(true);
-                    p.setShader(grLeft);
-                    canvas.drawRect(new RectF(0, 0, 40, model.height), p);
+                    // canvas.drawRoundRect(new RectF(0,0,model.width, model.height), 200, 200, p);
 
-                    LinearGradient grRight = new LinearGradient(model.width, 0, model.width - 40, 0, Color.RED, Color.WHITE, TileMode.CLAMP);
-                    p.setDither(true);
-                    p.setShader(grRight);
-                    canvas.drawRect(new RectF(model.width - 40, 0, model.width, model.height), p);
+                    // LinearGradient grBottom = new LinearGradient(0, model.height, 0, model.height - 40, Color.RED, Color.WHITE, TileMode.CLAMP);
+                    // p.setDither(true);
+                    // p.setShader(grBottom);
+                    // canvas.drawRect(new RectF(0, model.height - 40, model.width, model.height), p);
+                    //
+                    // LinearGradient grLeft = new LinearGradient(0, 0, 40, 0, Color.RED, Color.WHITE, TileMode.CLAMP);
+                    // p.setDither(true);
+                    // p.setShader(grLeft);
+                    // canvas.drawRect(new RectF(0, 0, 40, model.height), p);
+                    //
+                    // LinearGradient grRight = new LinearGradient(model.width, 0, model.width - 40, 0, Color.RED, Color.WHITE, TileMode.CLAMP);
+                    // p.setDither(true);
+                    // p.setShader(grRight);
+                    // canvas.drawRect(new RectF(model.width - 40, 0, model.width, model.height), p);
 
                     // tryMe.setColor(getResources().getColor(R.color.lighter_gray));
                     // tryMe.setStyle(Paint.Style.FILL);
@@ -358,7 +371,7 @@
 
     @Override
     public boolean onTouch(View v, MotionEvent event) {
-        Log.w(TAG, "onTouch " + event.getAction());
+//        Log.w(TAG, "onTouch " + event.getAction());
 
         int action = event.getActionMasked();
 
@@ -375,7 +388,7 @@
                 if (b.dragged) {
                     b.dragged = false;
                     b.target_scale = 1.f;
-                    if (b.isOnBorder(model.width, model.height)){
+                    if (b.isOnBorder(model.width, model.height)) {
                         b.markedToDie = true;
                         ((CallActivity) callback.getActivity()).onCallEnded(b.associated_call);
                     }
@@ -435,7 +448,7 @@
                 if (!expand.intersects(event.getX(), event.getY())) {
                     expand.retract();
                 } else {
-                    Log.d("Main", "getAction");
+//                    Log.d("Main", "getAction");
                     switch (expand.getAction(event.getX(), event.getY())) {
                     case 0:
                         expand.retract();
@@ -460,7 +473,7 @@
                 }
                 return true;
             }
-            Log.d("Main", "onDown");
+//            Log.d("Main", "onDown");
             for (int i = 0; i < n_bubbles; i++) {
                 Bubble b = bubbles.get(i);
                 if (b.intersects(event.getX(), event.getY()) && !b.expanded) {
@@ -476,13 +489,13 @@
 
         @Override
         public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
-            Log.d("Main", "onFling");
+//            Log.d("Main", "onFling");
             return true;
         }
 
         @Override
         public void onLongPress(MotionEvent e) {
-            Log.d("Main", "onLongPress");
+//            Log.d("Main", "onLongPress");
             if (isDraggingBubble()) {
                 Bubble b = getDraggedBubble(e);
                 b.expand();
@@ -503,7 +516,7 @@
 
         @Override
         public boolean onScroll(MotionEvent e1, MotionEvent event, float distanceX, float distanceY) {
-            Log.d("Main", "onScroll");
+//            Log.d("Main", "onScroll");
             List<Bubble> bubbles = model.getBubbles();
             final int n_bubbles = bubbles.size();
             long now = System.nanoTime();
@@ -526,13 +539,13 @@
 
         @Override
         public void onShowPress(MotionEvent e) {
-            Log.d("Main", "onShowPress");
+//            Log.d("Main", "onShowPress");
 
         }
 
         @Override
         public boolean onSingleTapUp(MotionEvent e) {
-            Log.d("Main", "onSingleTapUp");
+//            Log.d("Main", "onSingleTapUp");
             return true;
         }
     }
