diff --git a/src/org/sflphone/model/Bubble.java b/src/org/sflphone/model/Bubble.java
index ad534dd..63b7d83 100644
--- a/src/org/sflphone/model/Bubble.java
+++ b/src/org/sflphone/model/Bubble.java
@@ -13,6 +13,7 @@
 import android.graphics.PointF;
 import android.graphics.RectF;
 import android.graphics.Shader;
+import android.view.MotionEvent;
 
 public abstract class Bubble {
 
@@ -223,7 +224,7 @@
             bounds.set(f, y, g, h);
         }
 
-        public abstract void generateBitmap();
+        public abstract void generateBitmap(int action);
 
         public RectF getDrawerBounds() {
             return bounds;
@@ -269,4 +270,6 @@
         return false;
     }
 
+    public abstract boolean onDown(MotionEvent event);
+
 }
diff --git a/src/org/sflphone/model/BubbleContact.java b/src/org/sflphone/model/BubbleContact.java
index 6741099..62c6439 100644
--- a/src/org/sflphone/model/BubbleContact.java
+++ b/src/org/sflphone/model/BubbleContact.java
@@ -10,6 +10,7 @@
 import android.graphics.Paint;
 import android.graphics.RectF;
 import android.util.Log;
+import android.view.MotionEvent;
 
 public class BubbleContact extends Bubble {
 
@@ -46,13 +47,13 @@
             // Left
             act = new ActionDrawer(width * 2 / 3, (int) (getRadius() * 1.5f), drawerPosition.LEFT);
             act.adjustBounds(pos.x, pos.y);
-            act.generateBitmap();
+            act.generateBitmap(actions.NOTHING);
 
         } else if (pos.x > 2 * width / 3) {
             // Right
             act = new ActionDrawer(width * 2 / 3, (int) (getRadius() * 1.5f), drawerPosition.RIGHT);
             act.adjustBounds(pos.x, pos.y);
-            act.generateBitmap();
+            act.generateBitmap(actions.NOTHING);
 
         } else {
             // Middle of the screen
@@ -61,14 +62,14 @@
 
                 act = new ActionDrawer((int) (getRadius() * 1.5f), height / 2, drawerPosition.TOP);
                 act.adjustBounds(pos.x, pos.y);
-                act.generateBitmap();
+                act.generateBitmap(actions.NOTHING);
 
             } else if (pos.y > 2 * height / 3) {
                 // Middle Bottom
 
                 act = new ActionDrawer((int) (getRadius() * 1.5f), height / 2, drawerPosition.BOTTOM);
                 act.adjustBounds(pos.x, pos.y);
-                act.generateBitmap();
+                act.generateBitmap(actions.NOTHING);
 
             }
         }
@@ -125,7 +126,7 @@
 
         }
 
-        public void generateBitmap() {
+        public void generateBitmap(int action) {
 
             img = Bitmap.createBitmap(mWidth, mHeight, Config.ARGB_8888);
             Paint paint = new Paint();
@@ -366,7 +367,7 @@
     public void setCall(SipCall call) {
         associated_call = call;
         if (expanded) {
-            act.generateBitmap();
+            act.generateBitmap(actions.NOTHING);
         }
 
     }
@@ -385,5 +386,17 @@
     public String getCallID() {
         return associated_call.getCallId();
     }
+    
+    @Override
+    public boolean onDown(MotionEvent event) {
+        if (intersects(event.getX(), event.getY()) && !expanded) {
+            dragged = true;
+            last_drag = System.nanoTime();
+            setPos(event.getX(), event.getY());
+            target_scale = .8f;
+            return true;
+        }
+        return false;
+    }
 
 }
diff --git a/src/org/sflphone/model/BubbleUser.java b/src/org/sflphone/model/BubbleUser.java
index 58942d6..080bd7e 100644
--- a/src/org/sflphone/model/BubbleUser.java
+++ b/src/org/sflphone/model/BubbleUser.java
@@ -1,16 +1,18 @@
 package org.sflphone.model;
 
 import org.sflphone.R;
-import org.sflphone.model.Bubble.actions;
 
 import android.content.Context;
 import android.graphics.Bitmap;
 import android.graphics.Bitmap.Config;
+import android.graphics.Paint.Style;
 import android.graphics.BitmapFactory;
 import android.graphics.Canvas;
 import android.graphics.Paint;
 import android.graphics.RectF;
 import android.util.Log;
+import android.view.MotionEvent;
+import android.widget.Toast;
 
 public class BubbleUser extends Bubble {
 
@@ -55,19 +57,19 @@
         setDrawer(new ActionDrawer((int) getExpandedRadius() * 2, (int) getExpandedRadius() * 2));
 
         act.setBounds(pos.x - getExpandedRadius(), pos.y - getExpandedRadius(), pos.x + getExpandedRadius(), pos.y + getExpandedRadius());
-        act.generateBitmap();
+        act.generateBitmap(actions.NOTHING);
 
     }
 
     @Override
     public int getRadius() {
-        if(expanded)
+        if (expanded)
             return (int) (radius * density);
         return (int) (radius * scale * density);
     }
 
     public int getExpandedRadius() {
-        return (int) (expanded_radius * scale * density);
+        return (int) (expanded_radius * density);
     }
 
     @Override
@@ -100,7 +102,7 @@
         }
 
         @Override
-        public void generateBitmap() {
+        public void generateBitmap(int action) {
             img = Bitmap.createBitmap(mWidth, mHeight, Config.ARGB_8888);
             Paint paint = new Paint();
             paint.setColor(mContext.getResources().getColor(R.color.sfl_blue_9));
@@ -115,16 +117,30 @@
             boundsHangUpButton = new RectF(mWidth / 2 - getRadius(), 0, mWidth / 2 + getRadius(), mHeight / 2 - getRadius());
             wHang = buttonHangUp.getWidth();
             hHang = buttonHangUp.getHeight();
-            c.drawBitmap(buttonHangUp, null,
-                    new RectF((int) boundsHangUpButton.centerX() - wHang / 2, (int) boundsHangUpButton.centerY() - hHang / 2,
-                            (int) boundsHangUpButton.centerX() + wHang / 2, (int) boundsHangUpButton.centerY() + hHang / 2), test4);
-            // c.drawBitmap(buttonHangUp, null, boundsHangUpButton, test4);
+
+            RectF boundsHangUpIcon = new RectF((int) boundsHangUpButton.centerX() - wHang / 2, (int) boundsHangUpButton.centerY() - hHang / 2,
+                    (int) boundsHangUpButton.centerX() + wHang / 2, (int) boundsHangUpButton.centerY() + hHang / 2);
+
+            if (action == actions.HANGUP) {
+                Paint selector = new Paint();
+                selector.setStyle(Style.FILL);
+                selector.setColor(mContext.getResources().getColor(R.color.sfl_light_blue));
+                c.drawCircle(boundsHangUpButton.centerX(), boundsHangUpButton.centerY(), boundsHangUpButton.width() / 2, selector);
+            }
+
+            c.drawBitmap(buttonHangUp, null, boundsHangUpIcon, test4);
 
             boundsHoldButton = new RectF(0, mHeight / 2 - getRadius(), mWidth / 2 - getRadius(), mHeight / 2 + getRadius());
-            // c.drawBitmap(buttonHold, null, boundsHoldButton, test4);
-
             wHold = buttonHold.getWidth();
             hHold = buttonHold.getHeight();
+
+            if (action == actions.HOLD) {
+                Paint selector = new Paint();
+                selector.setStyle(Style.FILL);
+                selector.setColor(mContext.getResources().getColor(R.color.sfl_light_blue));
+                c.drawCircle(boundsHoldButton.centerX(), boundsHoldButton.centerY(), boundsHoldButton.width() / 2, selector);
+            }
+
             if (associated_call.isOnHold()) {
                 c.drawBitmap(buttonUnhold, null, new RectF((int) boundsHoldButton.centerX() - wHold / 2,
                         (int) boundsHoldButton.centerY() - hHold / 2, (int) boundsHoldButton.centerX() + wHold / 2, (int) boundsHoldButton.centerY()
@@ -134,15 +150,40 @@
                         (int) boundsHoldButton.centerX() + wHold / 2, (int) boundsHoldButton.centerY() + hHold / 2), test4);
             }
 
+            boundsMicButton = new RectF(mWidth / 2 + getRadius(), mHeight / 2 - getRadius(), mWidth, mHeight / 2 + getRadius());
             wMic = buttonMic.getWidth();
             hMic = buttonMic.getHeight();
-            boundsMicButton = new RectF(mWidth / 2 + getRadius(), mHeight / 2 - getRadius(), mWidth, mHeight / 2 + getRadius());
+            
+            if (action == actions.MUTE) {
+                Paint selector = new Paint();
+                selector.setStyle(Style.FILL);
+                selector.setColor(mContext.getResources().getColor(R.color.sfl_light_blue));
+                c.drawCircle(boundsMicButton.centerX(), boundsMicButton.centerY(), boundsMicButton.width() / 2, selector);
+            }
+
             c.drawBitmap(buttonMic, null, new RectF((int) boundsMicButton.centerX() - wMic / 2, (int) boundsMicButton.centerY() - hMic / 2,
                     (int) boundsMicButton.centerX() + wMic / 2, (int) boundsMicButton.centerY() + hMic / 2), test4);
-            // c.drawBitmap(buttonMic, null, boundsMicButton, test4);
-            // //
+            
+            
             boundsRecordButton = new RectF(mWidth / 2 - getRadius(), mHeight / 2 + getRadius(), mWidth / 2 + getRadius(), mHeight);
             // c.drawBitmap(buttonRecord, null, boundsRecordButton, test4);
+
+            // float startAngle = ;
+            // float sweepAngle = 60;
+            //
+            // float startX = mHeight / 2;
+            // float startY = mWidth / 2;
+            //
+            // float angle = (float) ((startAngle + sweepAngle / 2) * Math.PI / 180);
+            // float stopX = (float) (startX + getRadius() * Math.cos(angle));
+            // float stopY = (float) (startY + getRadius() * Math.sin(angle));
+            //
+            // Toast.makeText(mContext, "startX:" + startX + " startY:" + startY, Toast.LENGTH_SHORT).show();
+            // Toast.makeText(mContext, "stopX:" + stopX + " stopY:" + stopY, Toast.LENGTH_SHORT).show();
+            //
+            // Paint mPaint = new Paint();
+            // mPaint.setColor(Color.RED);
+            // c.drawLine(startX, startY, stopX, stopY, mPaint);
         }
 
         @Override
@@ -151,7 +192,7 @@
             float relativeX = x - getDrawerBounds().left;
             float relativeY = y - getDrawerBounds().top;
 
-            if(!getDrawerBounds().contains(x, y) && !getBounds().contains(x, y)){
+            if (!getDrawerBounds().contains(x, y) && !getBounds().contains(x, y)) {
                 return actions.OUT_OF_BOUNDS;
             }
 
@@ -175,7 +216,7 @@
                 return actions.HANGUP;
             }
 
-            return 0;
+            return actions.NOTHING;
 
         }
 
@@ -194,7 +235,7 @@
     public void setConference(Conference c) {
         associated_call = c;
         if (expanded) {
-            act.generateBitmap();
+            act.generateBitmap(actions.NOTHING);
         }
     }
 
@@ -215,10 +256,26 @@
         else
             return associated_call.getParticipants().get(0).getCallId();
     }
-    
+
     @Override
-    public boolean isConference(){
+    public boolean isConference() {
         return associated_call.hasMultipleParticipants();
     }
 
+    @Override
+    public boolean onDown(MotionEvent event) {
+        if (expanded) {
+            act.generateBitmap(act.getAction(event.getX(), event.getY()));
+            return false;
+        }
+
+        if (intersects(event.getX(), event.getY())) {
+            dragged = true;
+            last_drag = System.nanoTime();
+            setPos(event.getX(), event.getY());
+            target_scale = .8f;
+            return true;
+        }
+        return false;
+    }
 }
diff --git a/src/org/sflphone/model/BubblesView.java b/src/org/sflphone/model/BubblesView.java
index df85f60..35a054a 100644
--- a/src/org/sflphone/model/BubblesView.java
+++ b/src/org/sflphone/model/BubblesView.java
@@ -340,7 +340,7 @@
 
             Bubble expand = getExpandedBubble();
             if (expand != null) {
-                
+
                 switch (expand.getDrawer().getAction(event.getX(), event.getY())) {
                 case Bubble.actions.OUT_OF_BOUNDS:
                     expand.retract();
@@ -376,7 +376,9 @@
                 case Bubble.actions.MESSAGE:
                     // TODO
                     return true;
-
+                case Bubble.actions.MUTE:
+                    
+                    return true;
                 case Bubble.actions.HANGUP:
                     try {
                         if (expand.isConference())
@@ -394,11 +396,8 @@
                 case Bubble.actions.NOTHING:
                     break;
                 }
-                
-                
-            }
 
-            
+            }
 
             List<Bubble> bubbles = model.getBubbles();
             final int n_bubbles = bubbles.size();
@@ -469,18 +468,13 @@
         @Override
         public boolean onDown(MotionEvent event) {
             List<Bubble> bubbles = model.getBubbles();
-            final int n_bubbles = bubbles.size();
 
-            for (int i = 0; i < n_bubbles; i++) {
+            for (int i = 0; i < bubbles.size(); i++) {
                 Bubble b = bubbles.get(i);
-                if (b.intersects(event.getX(), event.getY()) && !b.expanded) {
-                    b.dragged = true;
-                    b.last_drag = System.nanoTime();
-                    b.setPos(event.getX(), event.getY());
-                    b.target_scale = .8f;
-                    dragging_bubble = true;
-                }
+                if(b.onDown(event))
+                    dragging_bubble= true;
             }
+
             return true;
         }
 
@@ -493,7 +487,7 @@
         @Override
         public void onLongPress(MotionEvent e) {
             // Log.d("Main", "onLongPress");
-            if (isDraggingBubble()) {
+            if (isDraggingBubble() && callback.getConference().isOnGoing()) {
                 Bubble b = getDraggedBubble(e);
                 b.expand(model.width, model.height);
             }
@@ -515,9 +509,9 @@
         public boolean onScroll(MotionEvent e1, MotionEvent event, float distanceX, float distanceY) {
             // Log.d("Main", "onScroll");
             List<Bubble> bubbles = model.getBubbles();
-            final int n_bubbles = bubbles.size();
+
             long now = System.nanoTime();
-            for (int i = 0; i < n_bubbles; i++) {
+            for (int i = 0; i < bubbles.size(); i++) {
                 Bubble b = bubbles.get(i);
                 if (b.dragged) {
                     float x = event.getX(), y = event.getY();
@@ -527,7 +521,7 @@
                     b.setPos(event.getX(), event.getY());
                     b.speed.x = dx / dt;
                     b.speed.y = dy / dt;
-                    // }
+
                     return true;
                 }
             }
