diff --git a/src/com/savoirfairelinux/sflphone/model/BubblesView.java b/src/com/savoirfairelinux/sflphone/model/BubblesView.java
new file mode 100644
index 0000000..4c35710
--- /dev/null
+++ b/src/com/savoirfairelinux/sflphone/model/BubblesView.java
@@ -0,0 +1,100 @@
+package com.savoirfairelinux.sflphone.model; // 41 Post - Created by DimasTheDriver on May/24/2012 . Part of the 'Android - rendering a Path with a Bitmap fill' post. http://www.41post.com/?p=4766
+
+import java.util.ArrayList;
+
+import com.savoirfairelinux.sflphone.R;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.MotionEvent;
+import android.view.View;
+
+public class BubblesView extends View {
+
+    private static final String TAG = BubblesView.class.getSimpleName();
+
+    ArrayList<Bubble> listBubbles;
+
+    Paint paint;
+
+    private int width;
+
+    private int height;
+
+    public BubblesView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+
+        listBubbles = new ArrayList<Bubble>();
+        Bubble.Builder builder = new Bubble.Builder(getContext());
+        builder.setRadiusPixels(200).setX(200).setY(300).setResID(R.drawable.me);
+        listBubbles.add(builder.create());
+
+        builder.setRadiusPixels(200).setX(200).setY(700).setResID(R.drawable.callee);
+        listBubbles.add(builder.create());
+        // This View can receive focus, so it can react to touch events.
+        this.setFocusable(true);
+
+        paint = new Paint();
+
+        paint.setStyle(Paint.Style.FILL);
+        paint.setColor(Color.BLACK);
+        paint.setAntiAlias(true);
+        paint.setStrokeWidth(3);
+
+    }
+
+    @Override
+    public boolean onTouchEvent(MotionEvent event) {
+        // Store the position of the touch event at 'posX' and 'posY'
+        if (event.getAction() == MotionEvent.ACTION_MOVE) {
+
+            for (Bubble b : listBubbles) {
+                if (b.isPointWithin(event.getX(), event.getY())) {
+                    b.setPosX(event.getX());
+                    b.setPosY(event.getY());
+                    invalidate();
+                    return true;
+                }
+            }
+
+        }
+        return true;
+    }
+
+    @Override
+    public void onSizeChanged(int w, int h, int oldw, int oldh) {
+        super.onSizeChanged(w, h, oldw, oldh);
+        width = w;
+        height = h;
+        Log.i(TAG, "New Width " + w);
+        Log.i(TAG, "New Heigth " + h);
+        for (Bubble b : listBubbles) {
+            b.setRegion(w, h);
+        }
+        invalidate();
+    }
+
+    @Override
+    protected void onDraw(Canvas canvas) {
+
+        canvas.drawColor(Color.GRAY);
+        // canvas.drawLine(a.getPosX(), a.getPosY(), b.getPosX(), b.getPosY(), paint);
+
+        for (Bubble b : listBubbles) {
+            canvas.drawBitmap(b.getExternalBMP(), null, b.getBounds(), null);
+        }
+
+    }
+
+    public void addBubble() {
+        Bubble.Builder builder = new Bubble.Builder(getContext());
+        builder.setRadiusPixels(200).setX(200).setY(300);
+        listBubbles.add(builder.create());
+        listBubbles.get(listBubbles.size()-1).setRegion(width, height);
+        invalidate();
+    }
+}
