diff --git a/src/org/sflphone/model/Bubble.java b/src/org/sflphone/model/Bubble.java
index 1f8c405..ad534dd 100644
--- a/src/org/sflphone/model/Bubble.java
+++ b/src/org/sflphone/model/Bubble.java
@@ -40,6 +40,7 @@
     protected Bitmap saved_photo;
 
     public interface actions {
+        int OUT_OF_BOUNDS = -1;
         int NOTHING = 0;
         int HOLD = 1;
         int RECORD = 2;
@@ -224,7 +225,7 @@
 
         public abstract void generateBitmap();
 
-        public RectF getBounds() {
+        public RectF getDrawerBounds() {
             return bounds;
         }
 
diff --git a/src/org/sflphone/model/BubbleContact.java b/src/org/sflphone/model/BubbleContact.java
index 1650a93..2bbbd2e 100644
--- a/src/org/sflphone/model/BubbleContact.java
+++ b/src/org/sflphone/model/BubbleContact.java
@@ -79,6 +79,7 @@
 
         int direction;
         RectF boundsHoldButton, boundsMsgButton, boundsTransferButton, boundsHangUpButton;
+        private String TAG = ActionDrawer.class.getSimpleName();
 
         public ActionDrawer(int w, int h, int dir) {
             super(w, h);
@@ -88,29 +89,39 @@
         @Override
         public int getAction(float x, float y) {
 
-            float relativeX = x - getBounds().left;
-            float relativeY = y - getBounds().top;
+            float relativeX = x - getDrawerBounds().left;
+            float relativeY = y - getDrawerBounds().top;
+            
+            
+            int result = actions.NOTHING;
+            
+            if(!getDrawerBounds().contains(x, y) && !getBounds().contains(x, y)){
+                return actions.OUT_OF_BOUNDS;
+            }
 
             if (boundsHoldButton.contains(relativeX, relativeY)) {
                 Log.i("Bubble", "Holding");
-                return actions.HOLD;
+                result =  actions.HOLD;
             }
 
             if (boundsMsgButton.contains(relativeX, relativeY)) {
                 Log.i("Bubble", "Msg");
-                return actions.MESSAGE;
+                result =  actions.MESSAGE;
             }
 
             if (boundsHangUpButton.contains(relativeX, relativeY)) {
                 Log.i("Bubble", "hangUp");
-                return actions.HANGUP;
+                result =  actions.HANGUP;
             }
 
             if (boundsTransferButton.contains(relativeX, relativeY)) {
                 Log.i("Bubble", "Transfer");
-                return actions.TRANSFER;
+                result = actions.TRANSFER;
             }
-            return 0;
+            
+            
+            
+            return result;
 
         }
 
@@ -309,7 +320,7 @@
     }
 
     public RectF getDrawerBounds() {
-        return act.getBounds();
+        return act.getDrawerBounds();
     }
 
     @Override
diff --git a/src/org/sflphone/model/BubbleUser.java b/src/org/sflphone/model/BubbleUser.java
index d38a116..df58458 100644
--- a/src/org/sflphone/model/BubbleUser.java
+++ b/src/org/sflphone/model/BubbleUser.java
@@ -1,6 +1,7 @@
 package org.sflphone.model;
 
 import org.sflphone.R;
+import org.sflphone.model.Bubble.actions;
 
 import android.content.Context;
 import android.graphics.Bitmap;
@@ -147,20 +148,12 @@
         @Override
         public int getAction(float x, float y) {
 
-            float relativeX = x - getBounds().left;
-            float relativeY = y - getBounds().top;
+            float relativeX = x - getDrawerBounds().left;
+            float relativeY = y - getDrawerBounds().top;
 
-            Log.i("Bubble", "relativeX:" + relativeX);
-            Log.i("Bubble", "relativeY:" + relativeY);
-
-            Log.i("Bubble", "pos.x:" + pos.x);
-            Log.i("Bubble", "pos.y:" + pos.y);
-            //
-            // Log.i("Bubble", getBounds().toShortString());
-            //
-            Log.i("boundsHoldButton", boundsHoldButton.toShortString());
-            Log.i("boundsMicButton", boundsMicButton.toShortString());
-            Log.i("boundsHangUpButton", boundsHangUpButton.toShortString());
+            if(!getDrawerBounds().contains(x, y) && !getBounds().contains(x, y)){
+                return actions.OUT_OF_BOUNDS;
+            }
 
             if (boundsHoldButton.contains(relativeX, relativeY)) {
                 Log.i("Bubble", "Holding");
diff --git a/src/org/sflphone/model/BubblesView.java b/src/org/sflphone/model/BubblesView.java
index d9c61d6..df85f60 100644
--- a/src/org/sflphone/model/BubblesView.java
+++ b/src/org/sflphone/model/BubblesView.java
@@ -56,6 +56,7 @@
 import android.view.SurfaceView;
 import android.view.View;
 import android.view.View.OnTouchListener;
+import android.widget.Toast;
 
 public class BubblesView extends SurfaceView implements SurfaceHolder.Callback, OnTouchListener {
     private static final String TAG = BubblesView.class.getSimpleName();
@@ -337,6 +338,68 @@
                 thread.setPaused(false);
             }
 
+            Bubble expand = getExpandedBubble();
+            if (expand != null) {
+                
+                switch (expand.getDrawer().getAction(event.getX(), event.getY())) {
+                case Bubble.actions.OUT_OF_BOUNDS:
+                    expand.retract();
+                    break;
+                case Bubble.actions.HOLD:
+
+                    try {
+                        if (expand.getHoldStatus()) {
+
+                            if (expand.isConference())
+                                callback.mCallbacks.getService().unholdConference(expand.getCallID());
+                            else
+                                callback.mCallbacks.getService().unhold(expand.getCallID());
+                        } else {
+                            if (expand.isConference())
+                                callback.mCallbacks.getService().holdConference(expand.getCallID());
+                            else
+                                callback.mCallbacks.getService().hold(expand.getCallID());
+
+                        }
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+
+                    return true;
+                case Bubble.actions.RECORD:
+                    try {
+                        callback.mCallbacks.getService().toggleRecordingCall(expand.getCallID());
+                    } catch (RemoteException e1) {
+                        e1.printStackTrace();
+                    }
+                    return true;
+                case Bubble.actions.MESSAGE:
+                    // TODO
+                    return true;
+
+                case Bubble.actions.HANGUP:
+                    try {
+                        if (expand.isConference())
+                            callback.mCallbacks.getService().hangUpConference(expand.getCallID());
+                        else
+                            callback.mCallbacks.getService().hangUp(expand.getCallID());
+                    } catch (RemoteException e) {
+                        e.printStackTrace();
+                    }
+                    return true;
+
+                case Bubble.actions.TRANSFER:
+                    callback.makeTransfer((BubbleContact) expand);
+                    return true;
+                case Bubble.actions.NOTHING:
+                    break;
+                }
+                
+                
+            }
+
+            
+
             List<Bubble> bubbles = model.getBubbles();
             final int n_bubbles = bubbles.size();
             for (int i = 0; i < n_bubbles; i++) {
@@ -407,65 +470,7 @@
         public boolean onDown(MotionEvent event) {
             List<Bubble> bubbles = model.getBubbles();
             final int n_bubbles = bubbles.size();
-            Bubble expand = getExpandedBubble();
-            Log.d("Main", "onDown");
-            if (expand != null) {
-                Log.d("Main", "getAction");
-                switch (expand.getDrawer().getAction(event.getX(), event.getY())) {
-                case Bubble.actions.NOTHING:
-                    expand.retract();
-                    break;
-                case Bubble.actions.HOLD:
 
-                    try {
-                        if (expand.getHoldStatus()) {
-
-                            if (expand.isConference())
-                                callback.mCallbacks.getService().unholdConference(expand.getCallID());
-                            else
-                                callback.mCallbacks.getService().unhold(expand.getCallID());
-                        } else {
-                            if (expand.isConference())
-                                callback.mCallbacks.getService().holdConference(expand.getCallID());
-                            else
-                                callback.mCallbacks.getService().hold(expand.getCallID());
-
-                        }
-                    } catch (Exception e) {
-                        e.printStackTrace();
-                    }
-
-                    break;
-                case Bubble.actions.RECORD:
-                    try {
-                        callback.mCallbacks.getService().toggleRecordingCall(expand.getCallID());
-                    } catch (RemoteException e1) {
-                        e1.printStackTrace();
-                    }
-                    break;
-                case Bubble.actions.MESSAGE:
-                    // TODO
-                    break;
-
-                case Bubble.actions.HANGUP:
-                    try {
-                        if (expand.isConference())
-                            callback.mCallbacks.getService().hangUpConference(expand.getCallID());
-                        else
-                            callback.mCallbacks.getService().hangUp(expand.getCallID());
-                    } catch (RemoteException e) {
-                        e.printStackTrace();
-                    }
-                    break;
-
-                case Bubble.actions.TRANSFER:
-                    callback.makeTransfer((BubbleContact) expand);
-                    break;
-                }
-                return true;
-            }
-
-            // 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) {
