diff --git a/src/com/savoirfairelinux/sflphone/client/CallActivity.java b/src/com/savoirfairelinux/sflphone/client/CallActivity.java
index 1306e73..1effb7b 100644
--- a/src/com/savoirfairelinux/sflphone/client/CallActivity.java
+++ b/src/com/savoirfairelinux/sflphone/client/CallActivity.java
@@ -41,6 +41,7 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.ServiceConnection;
+import android.graphics.PixelFormat;
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.Handler;
@@ -50,6 +51,7 @@
 import android.support.v4.widget.SlidingPaneLayout;
 import android.util.Log;
 import android.view.View;
+import android.view.Window;
 import android.widget.Toast;
 
 import com.savoirfairelinux.sflphone.R;
@@ -74,9 +76,9 @@
 
     CallPaneLayout slidingPaneLayout;
 
-//    CallListFragment mCallsFragment;
+    // CallListFragment mCallsFragment;
     CallFragment mCurrentCallFragment;
-    private boolean fragIsChanging;
+    // private boolean fragIsChanging;
 
     /* result code sent in case of call failure */
     public static int RESULT_FAILURE = -10;
@@ -88,9 +90,9 @@
 
         receiver = new CallReceiver(this);
 
-//        mCallsFragment = new CallListFragment();
+        // mCallsFragment = new CallListFragment();
 
-//        getFragmentManager().beginTransaction().replace(R.id.calllist_pane, mCallsFragment).commit();
+        // getFragmentManager().beginTransaction().replace(R.id.calllist_pane, mCallsFragment).commit();
 
         slidingPaneLayout = (CallPaneLayout) findViewById(R.id.slidingpanelayout);
 
@@ -116,20 +118,20 @@
             @Override
             public void onPanelClosed(View view) {
 
-//                switch (view.getId()) {
-//                case R.id.ongoingcall_pane:
-//                    if (fragIsChanging) {
-//                        getFragmentManager().beginTransaction().replace(R.id.ongoingcall_pane, mCurrentCallFragment).commit();
-//
-//                        fragIsChanging = false;
-//                    } else if (mCurrentCallFragment != null && mCurrentCallFragment.getBubbleView() != null) {
-//                        mCurrentCallFragment.getBubbleView().restartDrawing();
-//                    }
-//
-//                    break;
-//                default:
-//                    break;
-//                }
+                // switch (view.getId()) {
+                // case R.id.ongoingcall_pane:
+                // if (fragIsChanging) {
+                // getFragmentManager().beginTransaction().replace(R.id.ongoingcall_pane, mCurrentCallFragment).commit();
+                //
+                // fragIsChanging = false;
+                // } else if (mCurrentCallFragment != null && mCurrentCallFragment.getBubbleView() != null) {
+                // mCurrentCallFragment.getBubbleView().restartDrawing();
+                // }
+                //
+                // break;
+                // default:
+                // break;
+                // }
             }
         });
 
@@ -154,13 +156,20 @@
         super.onResume();
     }
 
+    @Override
+    public void onAttachedToWindow() {
+        super.onAttachedToWindow();
+        Window window = getWindow();
+        window.setFormat(PixelFormat.RGBA_8888);
+    }
+
     private Handler mHandler = new Handler();
     private Runnable mUpdateTimeTask = new Runnable() {
         @Override
         public void run() {
-            if(mCurrentCallFragment != null)
+            if (mCurrentCallFragment != null)
                 mCurrentCallFragment.updateTime();
-//            mCallsFragment.update();
+            // mCallsFragment.update();
 
             mHandler.postAtTime(this, SystemClock.uptimeMillis() + 1000);
         }
@@ -234,9 +243,9 @@
 
             }
 
-//            slidingPaneLayout.setCurFragment(mCurrentCallFragment);
+            // slidingPaneLayout.setCurFragment(mCurrentCallFragment);
             getIntent().getExtras();
-//            mCallsFragment.update();
+            // mCallsFragment.update();
             getFragmentManager().beginTransaction().replace(R.id.ongoingcall_pane, mCurrentCallFragment).commit();
 
         }
@@ -250,7 +259,7 @@
     public void incomingCall(Intent call) {
         Toast.makeText(this, "New Call incoming", Toast.LENGTH_LONG).show();
 
-//        mCallsFragment.update();
+        // mCallsFragment.update();
 
     }
 
@@ -262,7 +271,8 @@
 
     }
 
-    @SuppressWarnings("unchecked") // No proper solution with HashMap runtime cast
+    @SuppressWarnings("unchecked")
+    // No proper solution with HashMap runtime cast
     public void processCallStateChangedSignal(String callID, String newState) {
         /*
          * Bundle bundle = intent.getBundleExtra("com.savoirfairelinux.sflphone.service.newstate"); String callID = bundle.getString("CallID"); String
@@ -270,7 +280,7 @@
          */
         // CallFragment fr = mCurrentCallFragment;
 
-//        mCallsFragment.update();
+        // mCallsFragment.update();
 
         if (mCurrentCallFragment != null)
             mCurrentCallFragment.changeCallState(callID, newState);
@@ -284,8 +294,8 @@
             }
 
             if (callMap.size() > 0) {
-//                ArrayList<SipCall> calls = new ArrayList<SipCall>(callMap.values());
-//                HashMap<String, String> details = (HashMap<String, String>) service.getCallDetails(calls.get(0).getCallId());
+                // ArrayList<SipCall> calls = new ArrayList<SipCall>(callMap.values());
+                // HashMap<String, String> details = (HashMap<String, String>) service.getCallDetails(calls.get(0).getCallId());
 
             }
         } catch (RemoteException e) {
@@ -328,9 +338,9 @@
         // onCallResumed(calls.get(0));
         // }
 
-//        slidingPaneLayout.setCurFragment(mCurrentCallFragment);
+        // slidingPaneLayout.setCurFragment(mCurrentCallFragment);
         slidingPaneLayout.closePane();
-        fragIsChanging = true;
+        // fragIsChanging = true;
 
     }
 
@@ -373,6 +383,18 @@
 
     @Override
     public void onCallEnded(SipCall call) {
+
+        if (call.getContact().isUser()) {
+            Conference displayed = mCurrentCallFragment.getConference();
+            try {
+            if (displayed.hasMultipleParticipants())
+                service.hangUpConference(displayed.getId());
+            else
+                service.hangUp(displayed.getParticipants().get(0).getCallId());
+            } catch (RemoteException e) {
+                e.printStackTrace();
+            }
+        }
         try {
             if (call.getCallStateInt() == state.CALL_STATE_NONE || call.getCallStateInt() == state.CALL_STATE_CURRENT
                     || call.getCallStateInt() == state.CALL_STATE_HOLD) {
@@ -466,18 +488,18 @@
 
     @Override
     public void confCreated(Intent intent) {
-//        mCallsFragment.update();
+        // mCallsFragment.update();
 
     }
 
     @Override
     public void confRemoved(Intent intent) {
-//        mCallsFragment.update();
+        // mCallsFragment.update();
     }
 
     @Override
     public void confChanged(Intent intent) {
-//        mCallsFragment.update();
+        // mCallsFragment.update();
     }
 
     @Override
@@ -487,7 +509,7 @@
 
     @Override
     public void recordingChanged(Intent intent) {
-//        mCallsFragment.update();
+        // mCallsFragment.update();
     }
 
     @Override
diff --git a/src/com/savoirfairelinux/sflphone/fragments/CallFragment.java b/src/com/savoirfairelinux/sflphone/fragments/CallFragment.java
index bdbf740..919e1da 100644
--- a/src/com/savoirfairelinux/sflphone/fragments/CallFragment.java
+++ b/src/com/savoirfairelinux/sflphone/fragments/CallFragment.java
@@ -249,14 +249,14 @@
                     // TODO Auto-generated catch block
                     e.printStackTrace();
                 }
-                Toast.makeText(getActivity(), "Transfer complete", Toast.LENGTH_LONG).show();
+//                Toast.makeText(getActivity(), "Transfer complete", Toast.LENGTH_LONG).show();
                 break;
 
             case TransferDFragment.RESULT_TRANSFER_NUMBER:
                 String to = data.getStringExtra("to_number");
                 transfer = data.getParcelableExtra("transfer");
                 try {
-                    Toast.makeText(getActivity(), "Transferring " + transfer.getContact().getmDisplayName() + " to " + to, Toast.LENGTH_SHORT).show();
+//                    Toast.makeText(getActivity(), "Transferring " + transfer.getContact().getmDisplayName() + " to " + to, Toast.LENGTH_SHORT).show();
                     mCallbacks.getService().transfer(transfer.getCallId(), to);
                     mCallbacks.getService().hangUp(transfer.getCallId());
                 } catch (RemoteException e) {
@@ -315,40 +315,40 @@
         }
 
         model.clearAttractors();
-        model.addAttractor(new Attractor(new PointF(model.width * .2f, model.height * 0.9f), ATTRACTOR_SIZE, new Attractor.Callback() {
-            @Override
-            public boolean onBubbleSucked(Bubble b) {
-                Log.w(TAG, "Bubble sucked ! ");
+//        model.addAttractor(new Attractor(new PointF(model.width * .2f, model.height * 0.9f), ATTRACTOR_SIZE, new Attractor.Callback() {
+//            @Override
+//            public boolean onBubbleSucked(Bubble b) {
+//                Log.w(TAG, "Bubble sucked ! ");
+//
+//                if (b.associated_call.getContact().isUser()) {
+//
+//                    try {
+//                        if (conf.hasMultipleParticipants())
+//                            mCallbacks.getService().hangUpConference(conf.getId());
+//                        else
+//                            mCallbacks.onCallEnded(conf.getParticipants().get(0));
+//
+//                        model.clearAttractors();
+//                    } catch (RemoteException e) {
+//                        e.printStackTrace();
+//                    }
+//
+//                } else {
+//                    mCallbacks.onCallEnded(b.associated_call);
+//                }
+//                bubbleRemoved(b);
+//                return true;
+//            }
+//        }, hangup_icon));
 
-                if (b.associated_call.getContact().isUser()) {
-
-                    try {
-                        if (conf.hasMultipleParticipants())
-                            mCallbacks.getService().hangUpConference(conf.getId());
-                        else
-                            mCallbacks.onCallEnded(conf.getParticipants().get(0));
-
-                        model.clearAttractors();
-                    } catch (RemoteException e) {
-                        e.printStackTrace();
-                    }
-
-                } else {
-                    mCallbacks.onCallEnded(b.associated_call);
-                }
-                bubbleRemoved(b);
-                return true;
-            }
-        }, hangup_icon));
-
-        model.addAttractor(new Attractor(new PointF(model.width * .8f, model.height * 0.9f), ATTRACTOR_SIZE, new Attractor.Callback() {
-            @Override
-            public boolean onBubbleSucked(Bubble b) {
-                Log.w(TAG, "Bubble sucked ! ");
-                makeTransfer(b);
-                return true;
-            }
-        }, transfer_icon));
+//        model.addAttractor(new Attractor(new PointF(model.width * .8f, model.height * 0.9f), ATTRACTOR_SIZE, new Attractor.Callback() {
+//            @Override
+//            public boolean onBubbleSucked(Bubble b) {
+//                Log.w(TAG, "Bubble sucked ! ");
+//                makeTransfer(b);
+//                return true;
+//            }
+//        }, transfer_icon));
 
         // if (conf.hasMultipleParticipants()) {
         // model.addAttractor(new Attractor(new PointF(model.width / 1.1f, model.height * .9f), ATTRACTOR_SIZE, new Attractor.Callback() {
@@ -422,15 +422,15 @@
 
         model.clearAttractors();
 
-        model.addAttractor(new Attractor(new PointF(model.width / 2f, model.height * .9f), 40, new Attractor.Callback() {
-            @Override
-            public boolean onBubbleSucked(Bubble b) {
-                Log.w(TAG, "Bubble sucked ! ");
-                mCallbacks.onCallEnded(conf.getParticipants().get(0));
-                bubbleRemoved(b);
-                return true;
-            }
-        }, hangup_icon));
+//        model.addAttractor(new Attractor(new PointF(model.width / 2f, model.height * .9f), 40, new Attractor.Callback() {
+//            @Override
+//            public boolean onBubbleSucked(Bubble b) {
+//                Log.w(TAG, "Bubble sucked ! ");
+//                mCallbacks.onCallEnded(conf.getParticipants().get(0));
+//                bubbleRemoved(b);
+//                return true;
+//            }
+//        }, hangup_icon));
     }
 
     /**
@@ -596,4 +596,8 @@
         // Sensor.TYPE_PROXIMITY
 
     }
+
+    public Conference getConference() {
+        return conf;
+    }
 }
diff --git a/src/com/savoirfairelinux/sflphone/model/Bubble.java b/src/com/savoirfairelinux/sflphone/model/Bubble.java
index f71a385..843fe50 100644
--- a/src/com/savoirfairelinux/sflphone/model/Bubble.java
+++ b/src/com/savoirfairelinux/sflphone/model/Bubble.java
@@ -32,6 +32,8 @@
     public PointF attractor = null;
 
     public boolean dragged = false;
+    
+    public boolean markedToDie = false;
     public long last_drag;
     public boolean expanded; // determine if we draw the buttons around the bubble
     private Bitmap saved_photo;
@@ -181,7 +183,7 @@
         fatality.setStyle(Paint.Style.FILL);
 
         canvasf.drawOval(new RectF(0, 0, getRadius() * 2, getRadius() * 2), mPaintPath); // background with buttons
-        
+
         int[] allpixels = new int[internalBMP.getHeight() * internalBMP.getWidth()];
 
         internalBMP.getPixels(allpixels, 0, internalBMP.getWidth(), 0, 0, internalBMP.getWidth(), internalBMP.getHeight());
@@ -192,7 +194,7 @@
             }
         }
         internalBMP.setPixels(allpixels, 0, internalBMP.getWidth(), 0, 0, internalBMP.getWidth(), internalBMP.getHeight());
-        
+
         canvasf.drawBitmap(internalBMP, (float) (getRadius() - radius), (float) (getRadius() - radius), fatality);
 
     }
@@ -272,6 +274,10 @@
         return 0;
     }
 
+    public boolean isOnBorder(float w, float h) {
+        return (bounds.left < 0 || bounds.right > w || bounds.top < 0 || bounds.bottom > h);
+    }
+
     /**
      * Always return the normal radius of the bubble
      * 
diff --git a/src/com/savoirfairelinux/sflphone/model/BubbleModel.java b/src/com/savoirfairelinux/sflphone/model/BubbleModel.java
index b02b84f..8c68499 100644
--- a/src/com/savoirfairelinux/sflphone/model/BubbleModel.java
+++ b/src/com/savoirfairelinux/sflphone/model/BubbleModel.java
@@ -94,7 +94,10 @@
 		// to avoid garbage collection glitches caused by iterator objects.
 		for(int i=0, n=bubbles.size(); i<n; i++) {
 			Bubble b = bubbles.get(i);
-			//Log.w(TAG, "update b");
+			
+			if(b.markedToDie){
+			    continue;
+			}
 
 			if(!b.dragged) {
 				float bx=b.getPosX(), by=b.getPosY();
diff --git a/src/com/savoirfairelinux/sflphone/model/BubblesView.java b/src/com/savoirfairelinux/sflphone/model/BubblesView.java
index 845188e..9f61622 100644
--- a/src/com/savoirfairelinux/sflphone/model/BubblesView.java
+++ b/src/com/savoirfairelinux/sflphone/model/BubblesView.java
@@ -37,8 +37,11 @@
 import android.content.Context;
 import android.graphics.Canvas;
 import android.graphics.Color;
+import android.graphics.LinearGradient;
 import android.graphics.Paint;
 import android.graphics.Paint.Align;
+import android.graphics.RectF;
+import android.graphics.Shader.TileMode;
 import android.os.Handler;
 import android.os.Message;
 import android.util.AttributeSet;
@@ -52,6 +55,7 @@
 import android.view.View.OnTouchListener;
 import android.widget.Toast;
 
+import com.savoirfairelinux.sflphone.R;
 import com.savoirfairelinux.sflphone.client.CallActivity;
 import com.savoirfairelinux.sflphone.fragments.CallFragment;
 
@@ -253,11 +257,51 @@
          * @param canvas
          */
         private void doDraw(Canvas canvas) {
-            canvas.drawColor(Color.WHITE);
 
             synchronized (model) {
                 List<Bubble> bubbles = model.getBubbles();
                 List<Attractor> attractors = model.getAttractors();
+
+                Paint tryMe = new Paint();
+
+                canvas.drawColor(Color.WHITE);
+
+                if (dragging_bubble) {
+                    // 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);
+                    Paint p = new Paint();
+                    p.setDither(true);
+                    p.setShader(grTop);
+                    canvas.drawRect(new RectF(0, 0, model.width, 40), 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);
+                    // tryMe.setXfermode(new PorterDuffXfermode(Mode.SRC_OUT));
+                    // canvas.drawArc(new RectF(15, 30, model.width - 15, model.height - 30), 0, 360, false, tryMe);
+                }
+
+                tryMe.setStyle(Paint.Style.STROKE);
+                tryMe.setColor(getResources().getColor(R.color.darker_gray));
+                tryMe.setXfermode(null);
+                canvas.drawCircle(model.width / 2, model.height / 2, model.width / 2 - getResources().getDimension(R.dimen.bubble_size), tryMe);
+
                 try {
 
                     for (int i = 0, n = attractors.size(); i < n; i++) {
@@ -267,20 +311,21 @@
 
                     for (int i = 0, n = bubbles.size(); i < n; i++) {
                         Bubble b = bubbles.get(i);
-                        if(b.expanded){
+                        if (b.expanded) {
                             continue;
                         }
                         canvas.drawBitmap(b.getBitmap(), null, b.getBounds(), null);
-                        canvas.drawText(b.associated_call.getContact().getmDisplayName(), b.getPosX(),
-                                (float) (b.getPosY() - b.getRetractedRadius() * 1.2 * density), getNamePaint(b));
+                        canvas.drawText(b.associated_call.getContact().getmDisplayName(), b.getPosX(), (float) (b.getPosY() - b.getRetractedRadius()
+                                * 1.2 * density), getNamePaint(b));
                     }
+
                     Bubble first_plan = getExpandedBubble();
                     if (first_plan != null) {
                         canvas.drawBitmap(first_plan.getBitmap(), null, first_plan.getBounds(), null);
-                        
+
                         canvas.drawText(first_plan.associated_call.getContact().getmDisplayName(), first_plan.getPosX(),
                                 (float) (first_plan.getPosY() - first_plan.getRetractedRadius() * 1.2 * density), getNamePaint(first_plan));
-                        
+
                         canvas.drawText("Transfer", first_plan.getPosX(), (float) (first_plan.getPosY() + first_plan.getRetractedRadius() * 1.5
                                 * density), getNamePaint(first_plan));
 
@@ -330,6 +375,10 @@
                 if (b.dragged) {
                     b.dragged = false;
                     b.target_scale = 1.f;
+                    if (b.isOnBorder(model.width, model.height)){
+                        b.markedToDie = true;
+                        ((CallActivity) callback.getActivity()).onCallEnded(b.associated_call);
+                    }
                 }
             }
             dragging_bubble = false;
