diff --git a/res/layout/frag_imessaging.xml b/res/layout/frag_imessaging.xml
index ab75024..e7d69ba 100644
--- a/res/layout/frag_imessaging.xml
+++ b/res/layout/frag_imessaging.xml
@@ -1,33 +1,41 @@
 <?xml version="1.0" encoding="utf-8"?>
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:orientation="vertical" >
+    android:layout_width="match_parent"
+    android:layout_height="match_parent" >
 
     <ListView
         android:id="@+id/message_list"
         android:layout_width="match_parent"
-        android:layout_height="wrap_content"
+        android:layout_height="match_parent"
         android:layout_above="@+id/form"
+        android:background="@color/sfl_dark_blue"
         android:layout_alignParentTop="true" >
     </ListView>
 
-    <RelativeLayout
+    <LinearLayout
         android:id="@+id/form"
-        android:layout_width="fill_parent"
+        android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_alignParentBottom="true"
-        android:layout_alignParentLeft="true"
-        android:orientation="vertical" >
+        android:background="@color/darker_gray"
+        android:weightSum="4" >
 
         <EditText
-            android:id="@+id/editText1"
-            android:layout_width="wrap_content"
+            android:id="@+id/send_im_edittext"
+            android:layout_width="0dp"
+            android:layout_weight="3"
             android:layout_height="wrap_content"
-            android:layout_alignParentLeft="true"
-            android:layout_alignParentRight="true"
+            android:imeOptions="actionSend"
             android:ems="10"
-            android:inputType="text" />
-    </RelativeLayout>
+            android:inputType="textCapSentences|textImeMultiLine" />
+        
+        <Button 
+            android:id="@+id/send_im_button"
+             android:layout_width="0dp"
+            android:layout_weight="1"
+            android:layout_height="wrap_content"
+            android:text="Send"
+            android:background="@drawable/item_generic_selector"/>
+    </LinearLayout>
 
 </RelativeLayout>
\ No newline at end of file
diff --git a/res/layout/item_message.xml b/res/layout/item_message.xml
index da513cc..a9042a3 100644
--- a/res/layout/item_message.xml
+++ b/res/layout/item_message.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="fill_parent"
+    android:layout_width="match_parent"
     android:layout_height="wrap_content" >
 
     <LinearLayout
         android:id="@+id/wrapper"
-        android:layout_width="fill_parent"
+        android:layout_width="match_parent"
         android:layout_height="wrap_content" >
 
         <TextView
@@ -16,7 +16,7 @@
             android:layout_margin="5dip"
             android:background="@drawable/item_generic_selector"
             android:paddingLeft="10dip"
-            android:text="Hello bubbles!"
+            android:autoLink="all"
             android:textColor="@android:color/primary_text_light" />
     </LinearLayout>
 
diff --git a/src/org/sflphone/adapters/DiscussArrayAdapter.java b/src/org/sflphone/adapters/DiscussArrayAdapter.java
index 8312c2a..9dc1730 100644
--- a/src/org/sflphone/adapters/DiscussArrayAdapter.java
+++ b/src/org/sflphone/adapters/DiscussArrayAdapter.java
@@ -6,10 +6,10 @@
 import org.sflphone.R;
 import org.sflphone.model.SipMessage;
 
-import android.app.Activity;
 import android.content.Context;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
+import android.os.Bundle;
 import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -25,8 +25,14 @@
     private LinearLayout wrapper;
     private Context mContext;
 
-    public DiscussArrayAdapter(Context context) {
+    public DiscussArrayAdapter(Context context, Bundle args) {
         mContext = context;
+        
+        if(args == null)
+            messages = new ArrayList<SipMessage>();
+        else
+            messages = args.getParcelableArrayList("messages");
+        
     }
 
     public void add(SipMessage object) {
diff --git a/src/org/sflphone/client/CallActivity.java b/src/org/sflphone/client/CallActivity.java
index 955b584..fa1e6fa 100644
--- a/src/org/sflphone/client/CallActivity.java
+++ b/src/org/sflphone/client/CallActivity.java
@@ -33,6 +33,7 @@
 
 package org.sflphone.client;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 
 import org.sflphone.R;
@@ -191,6 +192,7 @@
             service = ISipService.Stub.asInterface(binder);
 
             mCurrentCallFragment = new CallFragment();
+            mIMFragment = new IMFragment();
 
             Uri u = getIntent().getData();
             if (u != null) {
@@ -198,7 +200,7 @@
                 try {
                     service.destroyNotification();
 
-                    String accountID = (String) service.getAccountList().get(1);
+                    String accountID = (String) service.getAccountList().get(1); // We use the first account to place outgoing calls
                     Account acc = new Account(accountID, (HashMap<String, String>) service.getAccountDetails(accountID));
 
                     SipCall call = SipCall.SipCallBuilder.getInstance().startCallCreation().setContact(c).setAccount(acc)
@@ -217,15 +219,24 @@
                 if (getIntent().getBooleanExtra("resuming", false)) {
 
                     Bundle b = new Bundle();
+                    Conference resumed = getIntent().getParcelableExtra("conference");
                     b.putParcelable("conference", getIntent().getParcelableExtra("conference"));
                     mCurrentCallFragment.setArguments(b);
 
+                    Bundle IMBundle = new Bundle();
+                    IMBundle.putParcelableArrayList("messages", resumed.getMessages());
+                    mIMFragment.setArguments(IMBundle);
+
                 } else {
                     mCurrentCallFragment.setArguments(getIntent().getExtras());
+                    
+                    Bundle IMBundle = new Bundle();
+                    IMBundle.putParcelableArrayList("messages", new ArrayList<SipMessage>());
+                    mIMFragment.setArguments(IMBundle);
                 }
 
             }
-            mIMFragment = new IMFragment();
+
             slidingPaneLayout.setCurFragment(mCurrentCallFragment);
             getIntent().getExtras();
             // mCallsFragment.update();
@@ -249,7 +260,6 @@
         mCurrentCallFragment.setArguments(b);
         getFragmentManager().beginTransaction().replace(R.id.ongoingcall_pane, mCurrentCallFragment).commit();
         slidingPaneLayout.setCurFragment(mCurrentCallFragment);
-        // mCallsFragment.update();
 
     }
 
@@ -264,13 +274,6 @@
     @SuppressWarnings("unchecked")
     // No proper solution with HashMap runtime cast
     public void processCallStateChangedSignal(String callID, String newState) {
-        /*
-         * Bundle bundle = intent.getBundleExtra("com.savoirfairelinux.sflphone.service.newstate"); String callID = bundle.getString("CallID"); String
-         * newState = bundle.getString("State");
-         */
-        // CallFragment fr = mCurrentCallFragment;
-
-        // mCallsFragment.update();
 
         if (mCurrentCallFragment != null) {
             mCurrentCallFragment.changeCallState(callID, newState);
@@ -282,17 +285,6 @@
             HashMap<String, SipCall> callMap = (HashMap<String, SipCall>) service.getCallList();
             HashMap<String, Conference> confMap = (HashMap<String, Conference>) service.getConferenceList();
 
-            // Log.i(TAG, "call size"+callMap.size());
-            // Log.i(TAG, "call size"+confMap.size());
-            // if (callMap.size() == 0 && confMap.size() == 0) {
-            // finish();
-            // }
-            //
-            // if (callMap.size() > 0) {
-            // // ArrayList<SipCall> calls = new ArrayList<SipCall>(callMap.values());
-            // // HashMap<String, String> details = (HashMap<String, String>) service.getCallDetails(calls.get(0).getCallId());
-            //
-            // }
         } catch (RemoteException e) {
 
             Log.e(TAG, e.toString());
@@ -305,8 +297,8 @@
     @Override
     public void incomingText(Intent in) {
         Bundle b = in.getBundleExtra("com.savoirfairelinux.sflphone.service.newtext");
-        
-        if(mIMFragment != null){
+
+        if (mIMFragment != null) {
             SipMessage msg = new SipMessage(true, b.getString("Msg"));
             mIMFragment.putMessage(msg);
         }
@@ -318,30 +310,6 @@
         return service;
     }
 
-    // @Override
-    // public void {
-    //
-    // if (mCurrentCallFragment == null || mCurrentCallFragment.getBubbleView() == null) {
-    // return;
-    // }
-    // mHandler.removeCallbacks(mUpdateTimeTask);
-    // mCurrentCallFragment.getBubbleView().stopThread();
-    // mCurrentCallFragment = new CallFragment();
-    // Bundle b = new Bundle();
-    //
-    // b.putParcelable("conference", conf);
-    // mCurrentCallFragment.setArguments(b);
-    //
-    // // if (calls.size() == 1) {
-    // // onCallResumed(calls.get(0));
-    // // }
-    //
-    // // slidingPaneLayout.setCurFragment(mCurrentCallFragment);
-    // slidingPaneLayout.closePane();
-    // // fragIsChanging = true;
-    //
-    // }
-
     @Override
     public void onBackPressed() {
         super.onBackPressed();
@@ -383,6 +351,19 @@
     }
 
     @Override
+    public boolean sendIM(SipMessage msg) {
+
+        try {
+            service.sendTextMessage(mCurrentCallFragment.getConference().getId(), msg);
+        } catch (RemoteException e) {
+            e.printStackTrace();
+            return false;
+        }
+
+        return true;
+    }
+
+    @Override
     public void startTimer() {
         mHandler.postDelayed(mUpdateTimeTask, 0);
     }
diff --git a/src/org/sflphone/fragments/CallFragment.java b/src/org/sflphone/fragments/CallFragment.java
index c738e6d..beaf2ad 100644
--- a/src/org/sflphone/fragments/CallFragment.java
+++ b/src/org/sflphone/fragments/CallFragment.java
@@ -357,7 +357,7 @@
     }
 
     private Bubble getBubbleForUser(Conference conf, float x, float y) {
-        Bubble contact_bubble = model.getBubble(conf.getId());
+        Bubble contact_bubble = model.getUser();
         if (contact_bubble != null) {
             contact_bubble.attractor.set(x, y);
             ((BubbleUser) contact_bubble).setConference(conf);
diff --git a/src/org/sflphone/fragments/IMFragment.java b/src/org/sflphone/fragments/IMFragment.java
index 2cf02ea..6f6ddb2 100644
--- a/src/org/sflphone/fragments/IMFragment.java
+++ b/src/org/sflphone/fragments/IMFragment.java
@@ -1,8 +1,9 @@
 package org.sflphone.fragments;
 
+import java.util.ArrayList;
+
 import org.sflphone.R;
 import org.sflphone.adapters.DiscussArrayAdapter;
-import org.sflphone.model.Conference;
 import org.sflphone.model.SipMessage;
 import org.sflphone.service.ISipService;
 
@@ -10,10 +11,18 @@
 import android.app.Fragment;
 import android.content.Intent;
 import android.os.Bundle;
+import android.util.Log;
+import android.view.KeyEvent;
 import android.view.LayoutInflater;
 import android.view.View;
+import android.view.View.OnClickListener;
 import android.view.ViewGroup;
+import android.view.inputmethod.EditorInfo;
+import android.widget.Button;
+import android.widget.EditText;
 import android.widget.ListView;
+import android.widget.TextView;
+import android.widget.TextView.OnEditorActionListener;
 
 public class IMFragment extends Fragment {
     static final String TAG = CallListFragment.class.getSimpleName();
@@ -23,6 +32,8 @@
     DiscussArrayAdapter mAdapter;
     ListView list;
 
+    private EditText sendTextField;
+
     public static final int REQUEST_TRANSFER = 10;
     public static final int REQUEST_CONF = 20;
 
@@ -30,7 +41,7 @@
     public void onCreate(Bundle savedBundle) {
         super.onCreate(savedBundle);
 
-        mAdapter = new DiscussArrayAdapter(getActivity());
+        mAdapter = new DiscussArrayAdapter(getActivity(), getArguments());
 
     }
 
@@ -44,6 +55,11 @@
             return null;
         }
 
+        @Override
+        public boolean sendIM(SipMessage msg) {
+            return false;
+        }
+
     };
 
     /**
@@ -53,6 +69,7 @@
     public interface Callbacks {
         public ISipService getService();
 
+        public boolean sendIM(SipMessage msg);
     }
 
     @Override
@@ -72,8 +89,6 @@
         mCallbacks = sDummyCallbacks;
     }
 
-    
-
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
         ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.frag_imessaging, container, false);
@@ -81,15 +96,48 @@
         list = (ListView) rootView.findViewById(R.id.message_list);
         list.setAdapter(mAdapter);
 
+        sendTextField = (EditText) rootView.findViewById(R.id.send_im_edittext);
+
+        sendTextField.setOnEditorActionListener(new OnEditorActionListener() {
+
+            @Override
+            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
+
+                if (actionId == EditorInfo.IME_ACTION_SEND) {
+                    if (sendTextField.getText().toString().length() > 0) {
+                        SipMessage toSend = new SipMessage(false, sendTextField.getText().toString());
+                        putMessage(toSend);
+                        sendTextField.setText("");
+                        mCallbacks.sendIM(toSend);
+                    }
+                }
+                return true;
+            }
+        });
+
+        ((Button) rootView.findViewById(R.id.send_im_button)).setOnClickListener(new OnClickListener() {
+
+            @Override
+            public void onClick(View v) {
+                if (sendTextField.getText().toString().length() > 0) {
+                    SipMessage toSend = new SipMessage(false, sendTextField.getText().toString());
+                    putMessage(toSend);
+                    sendTextField.setText("");
+                    mCallbacks.sendIM(toSend);
+                }
+            }
+        });
+
         return rootView;
     }
-    
+
     @Override
     public void onActivityResult(int requestCode, int resultCode, Intent data) {
-        super.onActivityResult(requestCode, resultCode, data);       
+        super.onActivityResult(requestCode, resultCode, data);
     }
 
     public void putMessage(SipMessage msg) {
         mAdapter.add(msg);
+        Log.i(TAG, "Messages" + mAdapter.getCount());
     }
 }
diff --git a/src/org/sflphone/model/Bubble.java b/src/org/sflphone/model/Bubble.java
index b76feca..1f8c405 100644
--- a/src/org/sflphone/model/Bubble.java
+++ b/src/org/sflphone/model/Bubble.java
@@ -62,6 +62,7 @@
         saved_photo = getContactPhoto(context, contact, (int) size);
         generateBitmap();
         attractor = new PointF(x, y);
+        isUser = false;
     }
 
     protected void generateBitmap() {
diff --git a/src/org/sflphone/model/BubbleContact.java b/src/org/sflphone/model/BubbleContact.java
index 3670f3c..1650a93 100644
--- a/src/org/sflphone/model/BubbleContact.java
+++ b/src/org/sflphone/model/BubbleContact.java
@@ -27,7 +27,6 @@
     public BubbleContact(Context context, SipCall call, float x, float y, float size) {
         super(context, call.getContact(), x, y, size);
         associated_call = call;
-        isUser = false;
         setDrawer(new ActionDrawer(0, 0, drawerPosition.UNDEFINED));
         buttonMsg = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.ic_action_chat);
         buttonHold = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.ic_action_pause_over_video);
diff --git a/src/org/sflphone/model/BubbleModel.java b/src/org/sflphone/model/BubbleModel.java
index ee5cb30..ff69792 100644
--- a/src/org/sflphone/model/BubbleModel.java
+++ b/src/org/sflphone/model/BubbleModel.java
@@ -6,192 +6,188 @@
 import android.graphics.PointF;
 import android.util.Log;
 
-public class BubbleModel
-{
-	private static final String TAG = BubbleModel.class.getSimpleName();
+public class BubbleModel {
+    private static final String TAG = BubbleModel.class.getSimpleName();
 
-	private long lastUpdate = 0;
-	public int width, height;
-	private ArrayList<Bubble> bubbles = new ArrayList<Bubble>();
-	private ArrayList<Attractor> attractors = new ArrayList<Attractor>();
+    private long lastUpdate = 0;
+    public int width, height;
+    private ArrayList<Bubble> bubbles = new ArrayList<Bubble>();
+    private ArrayList<Attractor> attractors = new ArrayList<Attractor>();
 
-	private static final double BUBBLE_RETURN_TIME_HALF_LIFE = .3;
-	private static final double BUBBLE_RETURN_TIME_LAMBDA = Math.log(2)/BUBBLE_RETURN_TIME_HALF_LIFE;
+    private static final double BUBBLE_RETURN_TIME_HALF_LIFE = .3;
+    private static final double BUBBLE_RETURN_TIME_LAMBDA = Math.log(2) / BUBBLE_RETURN_TIME_HALF_LIFE;
 
-	private static final double FRICTION_VISCOUS = Math.log(2)/.2f;		// Viscous friction factor
+    private static final double FRICTION_VISCOUS = Math.log(2) / .2f; // Viscous friction factor
 
-	private static final float BUBBLE_MAX_SPEED = 2500.f;	// px.s-1 : Max target speed in px/sec
-	private static final float ATTRACTOR_SMOOTH_DIST = 50.f; // px : Size of the "gravity hole" around the attractor
-	private static final float ATTRACTOR_STALL_DIST = 15.f; // px : Size of the "gravity hole" flat bottom
-	private static final float ATTRACTOR_DIST_SUCK = 20.f; // px
+    private static final float BUBBLE_MAX_SPEED = 2500.f; // px.s-1 : Max target speed in px/sec
+    private static final float ATTRACTOR_SMOOTH_DIST = 50.f; // px : Size of the "gravity hole" around the attractor
+    private static final float ATTRACTOR_STALL_DIST = 15.f; // px : Size of the "gravity hole" flat bottom
+    private static final float ATTRACTOR_DIST_SUCK = 20.f; // px
 
-	private static final float BORDER_REPULSION = 60000; // px.s^-2
+    private static final float BORDER_REPULSION = 60000; // px.s^-2
 
-	private final float border_repulsion;
-	private final float bubble_max_speed;
-	private final float attractor_smooth_dist;
-	private final float attractor_stall_dist;
-	private final float attractor_dist_suck;
+    private final float border_repulsion;
+    private final float bubble_max_speed;
+    private final float attractor_smooth_dist;
+    private final float attractor_stall_dist;
+    private final float attractor_dist_suck;
 
-	private float density = 1.f;
+    private float density = 1.f;
 
-	public BubbleModel(float screen_density) {
-	    Log.d(TAG, "Creating BubbleModel");
-		this.density = screen_density;
-		attractor_dist_suck = ATTRACTOR_DIST_SUCK*density;
-		bubble_max_speed = BUBBLE_MAX_SPEED*density;
-		attractor_smooth_dist = ATTRACTOR_SMOOTH_DIST*density;
-		attractor_stall_dist = ATTRACTOR_STALL_DIST*density;
-		border_repulsion = BORDER_REPULSION*density;
-	}
+    public BubbleModel(float screen_density) {
+        Log.d(TAG, "Creating BubbleModel");
+        this.density = screen_density;
+        attractor_dist_suck = ATTRACTOR_DIST_SUCK * density;
+        bubble_max_speed = BUBBLE_MAX_SPEED * density;
+        attractor_smooth_dist = ATTRACTOR_SMOOTH_DIST * density;
+        attractor_stall_dist = ATTRACTOR_STALL_DIST * density;
+        border_repulsion = BORDER_REPULSION * density;
+    }
 
-	public void addBubble(Bubble b) {
-		b.setDensity(density);
-		bubbles.add(b);
-	}
+    public void addBubble(Bubble b) {
+        b.setDensity(density);
+        bubbles.add(b);
+    }
 
-	public List<Bubble> getBubbles()
-	{
-		return bubbles;
-	}
+    public List<Bubble> getBubbles() {
+        return bubbles;
+    }
 
-	public void addAttractor(Attractor a) {
-		a.setDensity(density);
-		attractors.add(a);
-	}
+    public void addAttractor(Attractor a) {
+        a.setDensity(density);
+        attractors.add(a);
+    }
 
-	public List<Attractor> getAttractors()
-	{
-		return attractors;
-	}
+    public List<Attractor> getAttractors() {
+        return attractors;
+    }
 
-	public void clearAttractors() {
-		attractors.clear();
-	}
+    public void clearAttractors() {
+        attractors.clear();
+    }
 
-	public void clear() {
-		clearAttractors();
-		bubbles.clear();
-	}
+    public void clear() {
+        clearAttractors();
+        bubbles.clear();
+    }
 
-	public void update()
-	{
-		long now = System.nanoTime();
+    public void update() {
+        long now = System.nanoTime();
 
-		// Do nothing if lastUpdate is in the future.
-		if (lastUpdate > now)
-			return;
+        // Do nothing if lastUpdate is in the future.
+        if (lastUpdate > now)
+            return;
 
-		double ddt = Math.min((now - lastUpdate) / 1000000000.0, .2);
-		lastUpdate = now;
+        double ddt = Math.min((now - lastUpdate) / 1000000000.0, .2);
+        lastUpdate = now;
 
-		float dt = (float)ddt;
-		//Log.w(TAG, "update dt="+dt);
+        float dt = (float) ddt;
+        // Log.w(TAG, "update dt="+dt);
 
-		int attr_n = attractors.size();
+        int attr_n = attractors.size();
 
-		// Iterators should not be used in frequently called methods
-		// to avoid garbage collection glitches caused by iterator objects.
-		for(int i=0, n=bubbles.size(); i<n; i++) {
-			Bubble b = bubbles.get(i);
-			
-            if (b.markedToDie){
-			    continue;
-			}
+        // Iterators should not be used in frequently called methods
+        // to avoid garbage collection glitches caused by iterator objects.
+        for (int i = 0, n = bubbles.size(); i < n; i++) {
+            Bubble b = bubbles.get(i);
 
-			if(!b.dragged) {
-			    
-				float bx=b.getPosX(), by=b.getPosY();
+            if (b.markedToDie) {
+                continue;
+            }
 
-				Attractor attractor = null;
-				PointF attractor_pos = b.attractor;
-				float attractor_dist = (attractor_pos.x-bx)*(attractor_pos.x-bx) + (attractor_pos.y-by)*(attractor_pos.x-by);
+            if (!b.dragged) {
 
-				for(int j=0; j<attr_n; j++) {
-				    try{
-					Attractor t = attractors.get(j);
-				    
-					float dx = t.pos.x-bx, dy = t.pos.y-by;
-					float adist = dx*dx + dy*dy;
-					if(adist < attractor_dist) {
-						attractor = t;
-						attractor_pos = t.pos;
-						attractor_dist = adist;
-					}
-				    } catch (IndexOutOfBoundsException e){
+                float bx = b.getPosX(), by = b.getPosY();
+
+                Attractor attractor = null;
+                PointF attractor_pos = b.attractor;
+                float attractor_dist = (attractor_pos.x - bx) * (attractor_pos.x - bx) + (attractor_pos.y - by) * (attractor_pos.x - by);
+
+                for (int j = 0; j < attr_n; j++) {
+                    try {
+                        Attractor t = attractors.get(j);
+
+                        float dx = t.pos.x - bx, dy = t.pos.y - by;
+                        float adist = dx * dx + dy * dy;
+                        if (adist < attractor_dist) {
+                            attractor = t;
+                            attractor_pos = t.pos;
+                            attractor_dist = adist;
+                        }
+                    } catch (IndexOutOfBoundsException e) {
                         // Try to update when layout was changing
                     }
-				}
+                }
 
-				//float friction_coef = 1.f-FRICTION_VISCOUS*dt;
-				double friction_coef = 1+Math.expm1(-FRICTION_VISCOUS*ddt);
-				b.speed.x *= friction_coef;
-				b.speed.y *= friction_coef;
+                // float friction_coef = 1.f-FRICTION_VISCOUS*dt;
+                double friction_coef = 1 + Math.expm1(-FRICTION_VISCOUS * ddt);
+                b.speed.x *= friction_coef;
+                b.speed.y *= friction_coef;
 
-				//if(attractor != null) {
-				float target_speed;
-				float tdx = attractor_pos.x - bx, tdy = attractor_pos.y - by;
-				float dist = Math.max(1.f, (float) Math.sqrt(tdx*tdx + tdy*tdy));
-				if(dist > attractor_smooth_dist)
-					target_speed = bubble_max_speed;
-				else if(dist < attractor_stall_dist)
-					target_speed = 0;
-				else {
-					float a = (dist-attractor_stall_dist)/(attractor_smooth_dist-attractor_stall_dist);
-					target_speed = bubble_max_speed*a;
-				}
-				if(attractor != null) {
-					if(dist > attractor_smooth_dist)
-						b.target_scale = 1.f;
-					else if(dist < attractor_stall_dist)
-						b.target_scale = .2f;
-					else {
-						float a = (dist-attractor_stall_dist)/(attractor_smooth_dist-attractor_stall_dist);
-						b.target_scale = a*.8f+.2f;
-					}
-				}
+                // if(attractor != null) {
+                float target_speed;
+                float tdx = attractor_pos.x - bx, tdy = attractor_pos.y - by;
+                float dist = Math.max(1.f, (float) Math.sqrt(tdx * tdx + tdy * tdy));
+                if (dist > attractor_smooth_dist)
+                    target_speed = bubble_max_speed;
+                else if (dist < attractor_stall_dist)
+                    target_speed = 0;
+                else {
+                    float a = (dist - attractor_stall_dist) / (attractor_smooth_dist - attractor_stall_dist);
+                    target_speed = bubble_max_speed * a;
+                }
+                if (attractor != null) {
+                    if (dist > attractor_smooth_dist)
+                        b.target_scale = 1.f;
+                    else if (dist < attractor_stall_dist)
+                        b.target_scale = .2f;
+                    else {
+                        float a = (dist - attractor_stall_dist) / (attractor_smooth_dist - attractor_stall_dist);
+                        b.target_scale = a * .8f + .2f;
+                    }
+                }
 
-				// border repulsion
-				if(bx < 0 && b.speed.x < 0) {
-					b.speed.x += dt * border_repulsion;
-				} else if(bx > width && b.speed.x > 0) {
-					b.speed.x -= dt * border_repulsion;
-				}
-				if(by < 0 && b.speed.y < 0) {
-					b.speed.y += dt * border_repulsion;
-				} else if(by > height && b.speed.y > 0) {
-					b.speed.y -= dt * border_repulsion;
-				}
+                // border repulsion
+                if (bx < 0 && b.speed.x < 0) {
+                    b.speed.x += dt * border_repulsion;
+                } else if (bx > width && b.speed.x > 0) {
+                    b.speed.x -= dt * border_repulsion;
+                }
+                if (by < 0 && b.speed.y < 0) {
+                    b.speed.y += dt * border_repulsion;
+                } else if (by > height && b.speed.y > 0) {
+                    b.speed.y -= dt * border_repulsion;
+                }
 
-				b.speed.x += dt * target_speed * tdx/dist;
-				b.speed.y += dt * target_speed * tdy/dist;
+                b.speed.x += dt * target_speed * tdx / dist;
+                b.speed.y += dt * target_speed * tdy / dist;
 
-				double edt = -Math.expm1(-BUBBLE_RETURN_TIME_LAMBDA*ddt);
-				double dx = (attractor_pos.x - bx) * edt + Math.min(bubble_max_speed, b.speed.x) * dt;
-				double dy = (attractor_pos.y - by) * edt + Math.min(bubble_max_speed, b.speed.y) * dt;
-				//	Log.w(TAG, "update dx="+dt+" dy="+dy);
-				b.setPos((float)(bx+dx), (float)(by+dy));
+                double edt = -Math.expm1(-BUBBLE_RETURN_TIME_LAMBDA * ddt);
+                double dx = (attractor_pos.x - bx) * edt + Math.min(bubble_max_speed, b.speed.x) * dt;
+                double dy = (attractor_pos.y - by) * edt + Math.min(bubble_max_speed, b.speed.y) * dt;
+                // Log.w(TAG, "update dx="+dt+" dy="+dy);
+                b.setPos((float) (bx + dx), (float) (by + dy));
 
-//				Log.i(TAG,"Model:");
-				if(attractor != null && attractor_dist < attractor_dist_suck*attractor_dist_suck) {
-					b.dragged = false;
-					if(attractor.callback.onBubbleSucked(b)) {
-						bubbles.remove(b);
-						n--;
-					} else {
-						b.target_scale = 1.f;
-					}
-				}
-			}
+                // Log.i(TAG,"Model:");
+                if (attractor != null && attractor_dist < attractor_dist_suck * attractor_dist_suck) {
+                    b.dragged = false;
+                    if (attractor.callback.onBubbleSucked(b)) {
+                        bubbles.remove(b);
+                        n--;
+                    } else {
+                        b.target_scale = 1.f;
+                    }
+                }
+            }
 
-			b.setScale(b.getScale() + (b.target_scale-b.getScale())*dt*10.f);
+            b.setScale(b.getScale() + (b.target_scale - b.getScale()) * dt * 10.f);
 
-		}
-	}
+        }
+    }
 
     public Bubble getBubble(String call) {
-        for(Bubble b : bubbles){
-            if(b.callIDEquals(call))
+        for (Bubble b : bubbles) {
+            if (!b.isUser && b.callIDEquals(call))
                 return b;
         }
         return null;
@@ -199,8 +195,15 @@
 
     public void removeBubble(SipCall sipCall) {
         bubbles.remove(getBubble(sipCall.getCallId()));
-        
+
     }
 
+    public Bubble getUser() {
+        for (Bubble b : bubbles) {
+            if (b.isUser)
+                return b;
+        }
+        return null;
+    }
 
 }
diff --git a/src/org/sflphone/model/Conference.java b/src/org/sflphone/model/Conference.java
index 08cb850..465a307 100644
--- a/src/org/sflphone/model/Conference.java
+++ b/src/org/sflphone/model/Conference.java
@@ -11,6 +11,7 @@
     private String state = "";
     private ArrayList<SipCall> participants;
     private boolean recording;
+    private ArrayList<SipMessage> messages;
 
     public interface state {
         int ACTIVE_ATTACHED = 0;
@@ -31,6 +32,8 @@
         out.writeString(id);
         out.writeString(state);
         out.writeTypedList(participants);
+        out.writeByte((byte) (recording ? 1 : 0));
+        out.writeTypedList(messages);
     }
 
     public static final Parcelable.Creator<Conference> CREATOR = new Parcelable.Creator<Conference>() {
@@ -48,6 +51,9 @@
         id = in.readString();
         state = in.readString();
         in.readTypedList(participants, SipCall.CREATOR);
+        recording = in.readByte() == 1 ? true : false;
+        messages = new ArrayList<SipMessage>();
+        in.readTypedList(messages, SipMessage.CREATOR);
     }
 
     public Conference(String cID) {
@@ -63,11 +69,10 @@
     }
 
     public String getId() {
-        return id;
-    }
-
-    public void setId(String id) {
-        this.id = id;
+        if(hasMultipleParticipants())
+            return id;
+        else
+            return participants.get(0).getCallId();
     }
 
     public String getState() {
@@ -100,17 +105,17 @@
         }
         return null;
     }
-    
+
     /**
      * Compare conferences based on confID/participants
      */
     @Override
     public boolean equals(Object c) {
         if (c instanceof Conference) {
-            if(((Conference) c).id.contentEquals(id) && !id.contentEquals("-1")){
+            if (((Conference) c).id.contentEquals(id) && !id.contentEquals("-1")) {
                 return true;
             } else {
-                if(((Conference) c).id.contentEquals(id)){
+                if (((Conference) c).id.contentEquals(id)) {
                     for (int i = 0; i < participants.size(); ++i) {
                         if (!((Conference) c).contains(participants.get(i).getCallId()))
                             return false;
@@ -151,4 +156,12 @@
         return false;
     }
 
+    public ArrayList<SipMessage> getMessages() {
+        if (hasMultipleParticipants())
+            return messages;
+        else
+            return participants.get(0).getMessages();
+
+    }
+
 }
diff --git a/src/org/sflphone/model/SipCall.java b/src/org/sflphone/model/SipCall.java
index 8aa381c..63989f5 100644
--- a/src/org/sflphone/model/SipCall.java
+++ b/src/org/sflphone/model/SipCall.java
@@ -52,20 +52,20 @@
     private boolean isRecording = false;
     private long timestamp_start = 0;
 
-    public static final String USER_ID = "user_id";
 
     private int mCallType = state.CALL_TYPE_UNDETERMINED;
     private int mCallState = state.CALL_STATE_NONE;
     private int mMediaState = state.MEDIA_STATE_NONE;
+    
+    ArrayList<SipMessage> messages;
 
     /************************
      * Construtors
      ***********************/
 
     private SipCall(Parcel in) {
-        ArrayList<String> list = in.createStringArrayList();
 
-        mCallID = list.get(0);
+        mCallID = in.readString();
         mAccount = in.readParcelable(Account.class.getClassLoader());
         contact = in.readParcelable(CallContact.class.getClassLoader());
         isRecording = in.readByte() == 1;
@@ -73,6 +73,9 @@
         mCallState = in.readInt();
         mMediaState = in.readInt();
         timestamp_start = in.readLong();
+        
+        messages = new ArrayList<SipMessage>();
+        in.readTypedList(messages, SipMessage.CREATOR);
     }
 
     public SipCall(String id, Account account, int call_type, int call_state, int media_state, CallContact c) {
@@ -82,6 +85,7 @@
         mCallState = call_state;
         mMediaState = media_state;
         contact = c;
+        messages = new ArrayList<SipMessage>();
     }
 
     public interface state {
@@ -113,11 +117,8 @@
 
     @Override
     public void writeToParcel(Parcel out, int flags) {
-        ArrayList<String> list = new ArrayList<String>();
 
-        list.add(mCallID);
-
-        out.writeStringList(list);
+        out.writeString(mCallID);
         out.writeParcelable(mAccount, 0);
 
         out.writeParcelable(contact, 0);
@@ -126,6 +127,8 @@
         out.writeInt(mCallState);
         out.writeInt(mMediaState);
         out.writeLong(timestamp_start);
+        
+        out.writeTypedList(messages);
     }
 
     public static final Parcelable.Creator<SipCall> CREATOR = new Parcelable.Creator<SipCall>() {
@@ -420,4 +423,12 @@
         return mCallState == state.CALL_STATE_CURRENT;
     }
 
+    public void addSipMessage(SipMessage message) {
+        messages.add(message);
+    }
+
+    public ArrayList<SipMessage> getMessages() {
+        return messages;
+    }
+
 }
diff --git a/src/org/sflphone/model/SipMessage.aidl b/src/org/sflphone/model/SipMessage.aidl
new file mode 100644
index 0000000..467cf80
--- /dev/null
+++ b/src/org/sflphone/model/SipMessage.aidl
@@ -0,0 +1,4 @@
+package org.sflphone.model;
+
+
+parcelable SipMessage;
\ No newline at end of file
diff --git a/src/org/sflphone/model/SipMessage.java b/src/org/sflphone/model/SipMessage.java
index 5d1c188..63609ea 100644
--- a/src/org/sflphone/model/SipMessage.java
+++ b/src/org/sflphone/model/SipMessage.java
@@ -1,13 +1,44 @@
 package org.sflphone.model;
 
-public class SipMessage {
-	public boolean left;
-	public String comment;
+import java.util.ArrayList;
 
-	public SipMessage(boolean left, String comment) {
-		super();
-		this.left = left;
-		this.comment = comment;
-	}
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class SipMessage implements Parcelable {
+    public boolean left;
+    public String comment;
+
+    public SipMessage(boolean left, String comment) {
+        super();
+        this.left = left;
+        this.comment = comment;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel out, int flags) {
+        out.writeByte((byte) (left ? 1 : 0));
+        out.writeString(comment);
+    }
+
+    public static final Parcelable.Creator<SipMessage> CREATOR = new Parcelable.Creator<SipMessage>() {
+        public SipMessage createFromParcel(Parcel in) {
+            return new SipMessage(in);
+        }
+
+        public SipMessage[] newArray(int size) {
+            return new SipMessage[size];
+        }
+    };
+
+    private SipMessage(Parcel in) {
+        left = (in.readByte() == 1) ? true : false;
+        comment = in.readString();
+    }
 
 }
\ No newline at end of file
diff --git a/src/org/sflphone/receivers/IncomingReceiver.java b/src/org/sflphone/receivers/IncomingReceiver.java
index 1c81e82..2734da2 100644
--- a/src/org/sflphone/receivers/IncomingReceiver.java
+++ b/src/org/sflphone/receivers/IncomingReceiver.java
@@ -9,6 +9,7 @@
 import org.sflphone.model.CallContact;
 import org.sflphone.model.Conference;
 import org.sflphone.model.SipCall;
+import org.sflphone.model.SipMessage;
 import org.sflphone.service.CallManagerCallBack;
 import org.sflphone.service.ConfigurationManagerCallback;
 import org.sflphone.service.ServiceConstants;
@@ -53,7 +54,9 @@
 
         } else if (intent.getAction().contentEquals(CallManagerCallBack.INCOMING_TEXT)) {
 
+            Bundle extra = intent.getBundleExtra("com.savoirfairelinux.sflphone.service.newtext");
             Log.i(TAG, "Received" + intent.getAction());
+            callback.getCurrent_calls().get(extra.get("CallID")).addSipMessage(new SipMessage(true, extra.getString("Msg")));
             callback.sendBroadcast(intent);
 
         } else if (intent.getAction().contentEquals(CallManagerCallBack.INCOMING_CALL)) {
diff --git a/src/org/sflphone/service/ISipService.aidl b/src/org/sflphone/service/ISipService.aidl
index 1ebfc8d..572bf55 100644
--- a/src/org/sflphone/service/ISipService.aidl
+++ b/src/org/sflphone/service/ISipService.aidl
@@ -2,6 +2,7 @@
 
 import org.sflphone.model.SipCall;
 import org.sflphone.model.Conference;
+import org.sflphone.model.SipMessage;
 
 interface ISipService {
     
@@ -46,7 +47,7 @@
 	void playDtmf(in String key);
     
     /* IM */
-    void sendTextMessage(in String callID, in String message, in String from);
+    void sendTextMessage(in String callID, in SipMessage message);
         
     void transfer(in String callID, in String to);
     void attendedTransfer(in String transferID, in String targetID);
diff --git a/src/org/sflphone/service/SipService.java b/src/org/sflphone/service/SipService.java
index 0eb71ac..29f8df6 100644
--- a/src/org/sflphone/service/SipService.java
+++ b/src/org/sflphone/service/SipService.java
@@ -42,6 +42,7 @@
 import org.sflphone.model.Codec;
 import org.sflphone.model.Conference;
 import org.sflphone.model.SipCall;
+import org.sflphone.model.SipMessage;
 import org.sflphone.receivers.IncomingReceiver;
 import org.sflphone.utils.MediaManager;
 import org.sflphone.utils.SipNotifications;
@@ -1015,12 +1016,13 @@
         }
 
         @Override
-        public void sendTextMessage(final String callID, final String message, final String from) throws RemoteException {
+        public void sendTextMessage(final String callID, final SipMessage message) throws RemoteException {
             getExecutor().execute(new SipRunnable() {
                 @Override
                 protected void doRun() throws SameThreadException, RemoteException {
                     Log.i(TAG, "SipService.sendTextMessage() thread running...");
-                    callManagerJNI.sendTextMessage(callID, message);
+                    callManagerJNI.sendTextMessage(callID, message.comment);
+                    getCurrent_calls().get(callID).addSipMessage(message);
                 }
             });
 
