diff --git a/src/com/savoirfairelinux/sflphone/fragments/CallFragment.java b/src/com/savoirfairelinux/sflphone/fragments/CallFragment.java
index 13baa15..95d01e9 100644
--- a/src/com/savoirfairelinux/sflphone/fragments/CallFragment.java
+++ b/src/com/savoirfairelinux/sflphone/fragments/CallFragment.java
@@ -81,7 +81,9 @@
         Bundle b = getArguments();
         conf = new Conference((Conference) b.getParcelable("conference"));
         model = new BubbleModel(getResources().getDisplayMetrics().density);
-        BUBBLE_SIZE = 50 * getResources().getDisplayMetrics().density;
+        BUBBLE_SIZE = getResources().getDimension(R.dimen.bubble_size);
+        Log.e(TAG,"BUBBLE_SIZE "+BUBBLE_SIZE);
+
     }
 
     /**
diff --git a/src/com/savoirfairelinux/sflphone/model/Bubble.java b/src/com/savoirfairelinux/sflphone/model/Bubble.java
index 7d9bf2c..927f446 100644
--- a/src/com/savoirfairelinux/sflphone/model/Bubble.java
+++ b/src/com/savoirfairelinux/sflphone/model/Bubble.java
@@ -35,7 +35,7 @@
     public long last_drag;
     public boolean expanded; // determine if we draw the buttons around the bubble
     private Bitmap saved_photo;
-    private float expanded_radius = 250;
+    private float expanded_radius;
 
     public void setAttractor(PointF attractor) {
         this.attractor = attractor;
@@ -56,6 +56,7 @@
         associated_call = call;
         pos.set(x, y);
         radius = internalBMP.getWidth() / 2;
+        expanded_radius = (float) (size * 1.5);
         bounds = new RectF(pos.x - radius, pos.y - radius, pos.x + radius, pos.y + radius);
         attractor = new PointF(x, y);
 
@@ -142,9 +143,8 @@
         this.density = density;
     }
 
-    public void expand(int i) {
+    public void expand() {
 
-        expanded_radius = i;
         expanded = true;
         internalBMP = Bitmap.createScaledBitmap(saved_photo, (int) (2 * radius), (int) (2 * radius), false);
 
@@ -260,4 +260,26 @@
         }
         return 0;
     }
+
+    /**
+     * Always return the normal radius of the bubble
+     * @return
+     */
+    public float getRetractedRadius() {
+        return radius;
+    }
+
+    public int getHoldStatus() {
+        if(associated_call.isOnHold())
+            return R.string.action_call_unhold;
+        else
+            return R.string.action_call_hold;
+    }
+
+    public int getRecordStatus() {
+        if(associated_call.isRecording())
+            return R.string.action_call_stop_record;
+        else
+            return R.string.action_call_record;
+    }
 }
diff --git a/src/com/savoirfairelinux/sflphone/model/BubblesView.java b/src/com/savoirfairelinux/sflphone/model/BubblesView.java
index d019a7b..077f1bf 100644
--- a/src/com/savoirfairelinux/sflphone/model/BubblesView.java
+++ b/src/com/savoirfairelinux/sflphone/model/BubblesView.java
@@ -268,25 +268,26 @@
                     for (int i = 0, n = bubbles.size(); i < n; i++) {
                         Bubble b = bubbles.get(i);
                         canvas.drawBitmap(b.getBitmap(), null, b.getBounds(), null);
-                        canvas.drawText(b.associated_call.getContact().getmDisplayName(), b.getPosX(), b.getPosY() - 40 * density, getNamePaint(b));
+                        canvas.drawText(b.associated_call.getContact().getmDisplayName(), b.getPosX(),
+                                (float) (b.getPosY() - b.getRetractedRadius() * 1.5 * 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(), first_plan.getPosY() - 50
-                                * density, getNamePaint(first_plan));
-                        canvas.drawText("Transfer", first_plan.getPosX(), first_plan.getPosY() + 70 * density, getNamePaint(first_plan));
-                        if (first_plan.associated_call.isOnHold()) {
-                            canvas.drawText("Unhold", first_plan.getPosX() - 70 * density, first_plan.getPosY(), getNamePaint(first_plan));
-                        } else {
-                            canvas.drawText("Hold", first_plan.getPosX() - 70 * density, first_plan.getPosY(), getNamePaint(first_plan));
-                        }
-                        if (first_plan.associated_call.isRecording()) {
-                            canvas.drawText("Stop\nRecording", first_plan.getPosX() + 70 * density, first_plan.getPosY(), getNamePaint(first_plan));
-                        } else {
-                            canvas.drawText("Record", first_plan.getPosX() + 70 * density, first_plan.getPosY(), getNamePaint(first_plan));
+                        
+                        canvas.drawText(first_plan.associated_call.getContact().getmDisplayName(), first_plan.getPosX(),
+                                (float) (first_plan.getPosY() - first_plan.getRetractedRadius() * 1.5 * density), getNamePaint(first_plan));
+                        
+                        canvas.drawText("Transfer", first_plan.getPosX(), (float) (first_plan.getPosY() + first_plan.getRetractedRadius() * 1.5
+                                * density), getNamePaint(first_plan));
 
-                        }
+                        canvas.drawText(getResources().getString(first_plan.getHoldStatus()),
+                                (float) (first_plan.getPosX() - first_plan.getRetractedRadius() * 1.5 * density), first_plan.getPosY(),
+                                getNamePaint(first_plan));
+
+                        canvas.drawText(getResources().getString(first_plan.getRecordStatus()),
+                                (float) (first_plan.getPosX() + first_plan.getRetractedRadius() * 1.5 * density), first_plan.getPosY(),
+                                getNamePaint(first_plan));
 
                     }
 
@@ -431,7 +432,7 @@
             Log.d("Main", "onLongPress");
             if (isDraggingBubble()) {
                 Bubble b = getDraggedBubble(e);
-                b.expand((int) (100 * getResources().getDisplayMetrics().density));
+                b.expand();
             }
         }
 
