diff --git a/src/com/savoirfairelinux/sflphone/client/BubblesViewActivity.java b/src/com/savoirfairelinux/sflphone/client/BubblesViewActivity.java
index bcd358f..c1d9e13 100644
--- a/src/com/savoirfairelinux/sflphone/client/BubblesViewActivity.java
+++ b/src/com/savoirfairelinux/sflphone/client/BubblesViewActivity.java
@@ -25,15 +25,12 @@
 
     BubbleModel model;
 
-    int num_bubble;
-
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.bubbleview_layout);
 
-        num_bubble = 0;
         model = new BubbleModel();
         DisplayMetrics metrics = getResources().getDisplayMetrics();
         screenCenter = new PointF(metrics.widthPixels / 2, metrics.heightPixels / 3);
@@ -41,17 +38,23 @@
         // model.listBubbles.add(new Bubble(this, metrics.widthPixels / 2, metrics.heightPixels / 4, 150, R.drawable.me));
         // model.listBubbles.add(new Bubble(this, metrics.widthPixels / 2, metrics.heightPixels / 4 * 3, 150, R.drawable.callee));
 
-        Button b = (Button) findViewById(R.id.add_bubble);
         view = (BubblesView) findViewById(R.id.main_view);
         view.setModel(model);
 
-        b.setOnClickListener(new OnClickListener() {
+        ((Button) findViewById(R.id.add_bubble)).setOnClickListener(new OnClickListener() {
             @Override
             public void onClick(View v) {
                 addBubble();
             }
         });
 
+        ((Button) findViewById(R.id.remove_bubble)).setOnClickListener(new OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                removeBubble();
+            }
+        });
+
     }
 
     public void addBubble() {
@@ -61,18 +64,50 @@
         DisplayMetrics metrics = getResources().getDisplayMetrics();
         Bubble b = new Bubble(this, metrics.widthPixels / 3, metrics.heightPixels / 4 * 3, 150, -1);
         model.listBubbles.add(b);
-        num_bubble++;
-        angle_part = 360 / num_bubble;
-        
+
+        angle_part = 360 / model.listBubbles.size();
+
         double dX = 0;
         double dY = 0;
-        for(int i = 0; i < model.listBubbles.size() ; ++i){
+        for (int i = 0; i < model.listBubbles.size(); ++i) {
             dX = Math.cos(Math.toRadians(angle_part * i)) * radiusCalls;
             dY = Math.sin(Math.toRadians(angle_part * i)) * radiusCalls;
-            Log.i(TAG,"dX "+dX+ " dY "+dY);
-            model.listBubbles.get(i).setAttractor(new PointF((int)dX + screenCenter.x, (int)dY + screenCenter.y));
+            Log.i(TAG, "dX " + dX + " dY " + dY);
+            model.listBubbles.get(i).setAttractor(new PointF((int) dX + screenCenter.x, (int) dY + screenCenter.y));
         }
-       
+
+        // listBubbles.get(listBubbles.size() - 1).setRegion(width, height);
+    }
+
+    public void removeBubble() {
+        
+        if (model.listBubbles.isEmpty()) {
+            return;
+        }
+        /*
+         * Bubble.Builder builder = new Bubble.Builder(getContext()); builder.setRadiusPixels(200).setX(200).setY(300);
+         */
+        // DisplayMetrics metrics = getResources().getDisplayMetrics();
+        // Bubble b = new Bubble(this, metrics.widthPixels / 3, metrics.heightPixels / 4 * 3, 150, -1);
+        synchronized (model) {
+            model.listBubbles.remove(model.listBubbles.size() - 1);
+        }
+
+        if (model.listBubbles.isEmpty()) {
+            return;
+        }
+
+        angle_part = 360 / model.listBubbles.size();
+
+        Log.i(TAG, "Angle:" + angle_part);
+        double dX = 0;
+        double dY = 0;
+        for (int i = 0; i < model.listBubbles.size(); ++i) {
+            dX = Math.cos(Math.toRadians(angle_part * i)) * radiusCalls;
+            dY = Math.sin(Math.toRadians(angle_part * i)) * radiusCalls;
+            Log.i(TAG, "dX " + dX + " dY " + dY);
+            model.listBubbles.get(i).setAttractor(new PointF((int) dX + screenCenter.x, (int) dY + screenCenter.y));
+        }
 
         // listBubbles.get(listBubbles.size() - 1).setRegion(width, height);
     }
diff --git a/src/com/savoirfairelinux/sflphone/model/BubblesView.java b/src/com/savoirfairelinux/sflphone/model/BubblesView.java
index 3ce9439..87d44fe 100644
--- a/src/com/savoirfairelinux/sflphone/model/BubblesView.java
+++ b/src/com/savoirfairelinux/sflphone/model/BubblesView.java
@@ -202,9 +202,11 @@
 		{
 			canvas.drawColor(Color.WHITE);
 
-			for(int i=0, n=model.listBubbles.size(); i<n; i++) {
-				Bubble b = model.listBubbles.get(i);
-				canvas.drawBitmap(b.getBitmap(), null, b.getBounds(), null);
+			for(int i=0 ; i<model.listBubbles.size(); i++) {
+			    synchronized (model) {
+			        Bubble b = model.listBubbles.get(i);
+	                canvas.drawBitmap(b.getBitmap(), null, b.getBounds(), null);
+                }
 			}
 		}
 	}
