diff --git a/gen/de/gultsch/chat/R.java b/gen/de/gultsch/chat/R.java
index cdd36a905..f59f53e1a 100644
--- a/gen/de/gultsch/chat/R.java
+++ b/gen/de/gultsch/chat/R.java
@@ -76,7 +76,8 @@ public final class R {
         public static final int conversation_list_row=0x7f030002;
         public static final int fragment_conversation=0x7f030003;
         public static final int fragment_conversations_overview=0x7f030004;
-        public static final int message_sent=0x7f030005;
+        public static final int message_recieved=0x7f030005;
+        public static final int message_sent=0x7f030006;
     }
     public static final class menu {
         public static final int conversations=0x7f090000;
diff --git a/res/layout/conversation_list_row.xml b/res/layout/conversation_list_row.xml
index 303fdd1d2..41747240e 100644
--- a/res/layout/conversation_list_row.xml
+++ b/res/layout/conversation_list_row.xml
@@ -22,7 +22,6 @@
 	        android:id="@+id/conversation_name"
 	        android:layout_width="wrap_content"
 	        android:layout_height="wrap_content"
-	        android:text="Mein Contact"
 	        android:textColor="#636363"
 	        android:textSize="20sp"
 	        android:typeface="sans" />
@@ -34,7 +33,8 @@
 	        android:layout_below="@id/conversation_name"
 	        android:textColor="#636363"
 	        android:textSize="14sp"
-	        android:text="This is my last message"
+	        android:singleLine="true"
+	        android:scrollHorizontally="false"
 	        android:paddingTop="3dp"/>
 
 	    <TextView
@@ -44,7 +44,6 @@
 	        android:layout_alignBaseline="@+id/conversation_name"
 	        android:layout_alignParentRight="true"
 	        android:gravity="right"
-	        android:text="2 min"
 	        android:textColor="#636363"
 	        android:textSize="12sp" />
 
diff --git a/res/layout/fragment_conversation.xml b/res/layout/fragment_conversation.xml
index 11859573c..3b965af28 100644
--- a/res/layout/fragment_conversation.xml
+++ b/res/layout/fragment_conversation.xml
@@ -49,7 +49,9 @@
         android:background="#e5e5e5"
         tools:listitem="@layout/message_sent"
         android:divider="@null"
-		android:dividerHeight="0dp">
+		android:dividerHeight="0dp"
+		android:transcriptMode="alwaysScroll"
+		android:listSelector="@android:color/transparent">
     </ListView>
 
 </RelativeLayout>
\ No newline at end of file
diff --git a/res/layout/message_recieved.xml b/res/layout/message_recieved.xml
new file mode 100644
index 000000000..bde702aee
--- /dev/null
+++ b/res/layout/message_recieved.xml
@@ -0,0 +1,52 @@
+<?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="wrap_content"
+    android:orientation="vertical"
+    android:padding="8dp">
+
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:background="@drawable/message_border"
+        android:layout_toRightOf="@+id/message_photo"
+     	android:layout_alignParentBottom="true"
+     	android:minHeight="48dp"
+     	>
+<LinearLayout
+    android:layout_width="wrap_content"
+    android:layout_height="fill_parent"
+    android:orientation="vertical"
+    android:background="#ededed"
+    android:padding="5dp">   
+
+    <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="Hi, how are you?"
+        android:textSize="16sp"
+        android:id="@+id/message_body"
+        android:textColor="#333333"/>
+    <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:paddingTop="1dp"
+        android:text="@string/sending"
+        android:textColor="#8e8e8e"
+        android:textSize="12sp"
+        android:id="@+id/message_time"/>
+
+	</LinearLayout>
+</LinearLayout>
+    <ImageView
+        android:id="@+id/message_photo"
+        android:layout_width="48dp"
+        android:layout_height="48dp"
+        android:layout_alignParentTop="true"
+        android:layout_alignParentLeft="true"
+        android:layout_marginRight="-1.5dp"
+        android:padding="0dp"
+        android:src="@drawable/ic_profile"
+        android:scaleType="fitXY"/>
+	
+</RelativeLayout>
diff --git a/res/layout/message_sent.xml b/res/layout/message_sent.xml
index c690c2173..c3136a55e 100644
--- a/res/layout/message_sent.xml
+++ b/res/layout/message_sent.xml
@@ -10,12 +10,11 @@
         android:layout_height="wrap_content"
         android:background="@drawable/message_border"
         android:layout_toLeftOf="@+id/message_photo"
-     	android:layout_alignParentLeft="true"
      	android:layout_alignParentBottom="true"
      	android:minHeight="48dp"
      	>
 <LinearLayout
-    android:layout_width="fill_parent"
+    android:layout_width="wrap_content"
     android:layout_height="fill_parent"
     android:orientation="vertical"
     android:background="#ededed"
diff --git a/res/menu/conversations.xml b/res/menu/conversations.xml
index 39c36a533..a6cdd8857 100644
--- a/res/menu/conversations.xml
+++ b/res/menu/conversations.xml
@@ -24,7 +24,7 @@
         android:id="@+id/action_archive"
         android:orderInCategory="50"
         android:showAsAction="never"
-        android:title="@string/action_archive" />
+        android:title="@string/action_archive"/>
     
     <item
         android:id="@+id/action_accounts"
diff --git a/src/de/gultsch/chat/entities/Conversation.java b/src/de/gultsch/chat/entities/Conversation.java
index 413e3d626..a00dd476a 100644
--- a/src/de/gultsch/chat/entities/Conversation.java
+++ b/src/de/gultsch/chat/entities/Conversation.java
@@ -53,8 +53,31 @@ public class Conversation extends AbstractEntity {
 
 	public List<Message> getMessages() {
 		if (messages == null) this.messages = new ArrayList<Message>(); //prevent null pointer
+		
+		//populate with Conversation (this)
+		
+		for(Message msg : messages) {
+			msg.setConversation(this);
+		}
+		
 		return messages;
 	}
+	
+	public String getLatestMessage() {
+		if ((this.messages == null)||(this.messages.size()==0)) {
+			return null;
+		} else {
+			return this.messages.get(this.messages.size() - 1).getBody();
+		}
+	}
+	
+	public long getLatestMessageDate() {
+		if ((this.messages == null)||(this.messages.size()==0)) {
+			return this.getCreated();
+		} else {
+			return this.messages.get(this.messages.size() - 1).getTimeSent();
+		}
+	}
 
 	public void setMessages(List<Message> msgs) {
 		this.messages = msgs;
@@ -112,4 +135,8 @@ public class Conversation extends AbstractEntity {
 				cursor.getLong(cursor.getColumnIndex(CREATED)),
 				cursor.getInt(cursor.getColumnIndex(STATUS)));
 	}
+
+	public void setStatus(int status) {
+		this.status = status;
+	}
 }
diff --git a/src/de/gultsch/chat/entities/Message.java b/src/de/gultsch/chat/entities/Message.java
index 26e646ff4..b52e44b4e 100644
--- a/src/de/gultsch/chat/entities/Message.java
+++ b/src/de/gultsch/chat/entities/Message.java
@@ -35,8 +35,9 @@ public class Message extends AbstractEntity {
 
 	public Message(Conversation conversation, String body, int encryption) {
 		this(java.util.UUID.randomUUID().toString(), conversation.getUuid(),
-				conversation.getContactJid(), body, 0, encryption,
+				conversation.getContactJid(), body, System.currentTimeMillis(), encryption,
 				Message.STATUS_UNSEND);
+		this.conversation = conversation;
 	}
 
 	public Message(String uuid, String conversationUUid, String counterpart,
@@ -66,6 +67,10 @@ public class Message extends AbstractEntity {
 	public String getConversationUuid() {
 		return conversationUuid;
 	}
+	
+	public Conversation getConversation() {
+		return this.conversation;
+	}
 
 	public String getCounterpart() {
 		return counterpart;
@@ -97,4 +102,8 @@ public class Message extends AbstractEntity {
 				cursor.getInt(cursor.getColumnIndex(STATUS)));
 	}
 
+	public void setConversation(Conversation conv) {
+		this.conversation = conv;
+	}
+
 }
diff --git a/src/de/gultsch/chat/persistance/DatabaseBackend.java b/src/de/gultsch/chat/persistance/DatabaseBackend.java
index 06b9af16f..0689851fa 100644
--- a/src/de/gultsch/chat/persistance/DatabaseBackend.java
+++ b/src/de/gultsch/chat/persistance/DatabaseBackend.java
@@ -3,6 +3,8 @@ package de.gultsch.chat.persistance;
 import java.util.ArrayList;
 import java.util.List;
 
+import de.gultsch.chat.entities.Account;
+import de.gultsch.chat.entities.Contact;
 import de.gultsch.chat.entities.Conversation;
 import de.gultsch.chat.entities.Message;
 import android.content.Context;
@@ -24,12 +26,16 @@ public class DatabaseBackend extends SQLiteOpenHelper {
 	@Override
 	public void onCreate(SQLiteDatabase db) {
 		db.execSQL("create table " + Conversation.TABLENAME + " ("
-				+ Conversation.UUID + " TEXT, " + Conversation.NAME + " TEXT, "
-				+ Conversation.PHOTO_URI + " TEXT, " + Conversation.ACCOUNT
-				+ " TEXT, " + Conversation.CONTACT + " TEXT, "
-				+ Conversation.CREATED + " NUMBER, " + Conversation.STATUS
+				+ Conversation.UUID + " TEXT PRIMARY KEY, " + Conversation.NAME
+				+ " TEXT, " + Conversation.PHOTO_URI + " TEXT, "
+				+ Conversation.ACCOUNT + " TEXT, " + Conversation.CONTACT
+				+ " TEXT, " + Conversation.CREATED + " NUMBER, "
+				+ Conversation.STATUS + " NUMBER)");
+		db.execSQL("create table " + Message.TABLENAME + "( " + Message.UUID
+				+ " TEXT PRIMARY KEY, " + Message.CONVERSATION + " TEXT, " + Message.TIME_SENT +" NUMBER, "
+				+ Message.COUNTERPART + " TEXT, " + Message.BODY + " TEXT, "
+				+ Message.ENCRYPTION + " NUMBER, " + Message.STATUS
 				+ " NUMBER)");
-		db.execSQL("create table "+Message.TABLENAME+ "()");
 	}
 
 	@Override
@@ -45,15 +51,20 @@ public class DatabaseBackend extends SQLiteOpenHelper {
 		return instance;
 	}
 
-	public void addConversation(Conversation conversation) {
+	public void createConversation(Conversation conversation) {
 		SQLiteDatabase db = this.getWritableDatabase();
-		db.insert("conversations", null, conversation.getContentValues());
+		db.insert(Conversation.TABLENAME, null, conversation.getContentValues());
+	}
+
+	public void createMessage(Message message) {
+		SQLiteDatabase db = this.getWritableDatabase();
+		db.insert(Message.TABLENAME, null, message.getContentValues());
 	}
 
 	public int getConversationCount() {
 		SQLiteDatabase db = this.getReadableDatabase();
 		Cursor cursor = db.rawQuery(
-				"select count(uuid) as count from conversations", null);
+				"select count(uuid) as count from "+Conversation.TABLENAME+" where "+Conversation.STATUS+"="+Conversation.STATUS_AVAILABLE, null);
 		cursor.moveToFirst();
 		return cursor.getInt(0);
 	}
@@ -62,14 +73,43 @@ public class DatabaseBackend extends SQLiteOpenHelper {
 		List<Conversation> list = new ArrayList<Conversation>();
 		SQLiteDatabase db = this.getReadableDatabase();
 		String[] selectionArgs = { "" + status };
-		Cursor cursor = db
-				.rawQuery(
-						"select * from conversations where status = ? order by created desc",
-						selectionArgs);
+		Cursor cursor = db.rawQuery("select * from " + Conversation.TABLENAME
+				+ " where " + Conversation.STATUS + " = ? order by "
+				+ Conversation.CREATED + " desc", selectionArgs);
 		while (cursor.moveToNext()) {
 			list.add(Conversation.fromCursor(cursor));
 		}
 		return list;
 	}
 
+	public List<Message> getMessages(Conversation conversation, int limit) {
+		List<Message> list = new ArrayList<Message>();
+		SQLiteDatabase db = this.getReadableDatabase();
+		String[] selectionArgs = { conversation.getUuid() };
+		Cursor cursor = db.query(Message.TABLENAME, null,Message.CONVERSATION +"=?", selectionArgs, null, null,
+				Message.TIME_SENT+" DESC",String.valueOf(limit));
+		if (cursor.getCount() > 0 ) {
+			cursor.moveToLast();
+			do {
+				list.add(Message.fromCursor(cursor));
+			} while (cursor.moveToPrevious());
+		}
+		return list;
+	}
+
+	public Conversation findConversation(Account account, Contact contact) {
+		SQLiteDatabase db = this.getReadableDatabase();
+		String[] selectionArgs = { account.getUuid() , contact.getJid() };
+		Cursor cursor = db.query(Conversation.TABLENAME, null,Conversation.ACCOUNT+"=? AND "+Conversation.CONTACT+"=?", selectionArgs, null, null, null);
+		if (cursor.getCount() == 0) return null;
+		cursor.moveToFirst();
+		return Conversation.fromCursor(cursor);
+	}
+
+	public void updateConversation(Conversation conversation) {
+		SQLiteDatabase db = this.getReadableDatabase();
+		String[] args = {conversation.getUuid()};
+		db.update(Conversation.TABLENAME, conversation.getContentValues(),Conversation.UUID+"=?",args);
+	}
+
 }
diff --git a/src/de/gultsch/chat/services/XmppConnectionService.java b/src/de/gultsch/chat/services/XmppConnectionService.java
index 67e3901e7..20af97420 100644
--- a/src/de/gultsch/chat/services/XmppConnectionService.java
+++ b/src/de/gultsch/chat/services/XmppConnectionService.java
@@ -2,6 +2,8 @@ package de.gultsch.chat.services;
 
 import java.util.List;
 
+import de.gultsch.chat.entities.Account;
+import de.gultsch.chat.entities.Contact;
 import de.gultsch.chat.entities.Conversation;
 import de.gultsch.chat.entities.Message;
 import de.gultsch.chat.persistance.DatabaseBackend;
@@ -35,15 +37,39 @@ public class XmppConnectionService extends Service {
     }
     
     public void sendMessage(Message message) {
-    	Log.d(LOGTAG,"sending message");
+    	databaseBackend.createMessage(message);
     }
     
     public void addConversation(Conversation conversation) {
-    	databaseBackend.addConversation(conversation);
+    	databaseBackend.createConversation(conversation);
     }
     
     public List<Conversation> getConversations(int status) {
     	return databaseBackend.getConversations(status);
     }
+    
+    public List<Message> getMessages(Conversation conversation) {
+    	return databaseBackend.getMessages(conversation, 100);
+    }
 
+    public Conversation findOrCreateConversation(Account account, Contact contact) {
+    	Conversation conversation = databaseBackend.findConversation(account, contact);
+    	if (conversation!=null) {
+    		Log.d("gultsch","found one. unarchive it");
+    		conversation.setStatus(Conversation.STATUS_AVAILABLE);
+    		this.databaseBackend.updateConversation(conversation);
+    	} else {
+    		conversation = new Conversation(contact.getDisplayName(), contact.getProfilePhoto(), account, contact.getJid());
+    		this.databaseBackend.createConversation(conversation);
+    	}
+    	return conversation;
+    }
+    
+    public void updateConversation(Conversation conversation) {
+    	this.databaseBackend.updateConversation(conversation);
+    }
+    
+    public int getConversationCount() {
+    	return this.databaseBackend.getConversationCount();
+    }
 }
diff --git a/src/de/gultsch/chat/ui/ConversationActivity.java b/src/de/gultsch/chat/ui/ConversationActivity.java
index 4f76e9c12..959e39a9c 100644
--- a/src/de/gultsch/chat/ui/ConversationActivity.java
+++ b/src/de/gultsch/chat/ui/ConversationActivity.java
@@ -1,14 +1,13 @@
 package de.gultsch.chat.ui;
 
 import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
 
 import de.gultsch.chat.R;
 import de.gultsch.chat.R.id;
-import de.gultsch.chat.entities.Account;
-import de.gultsch.chat.entities.Contact;
 import de.gultsch.chat.entities.Conversation;
-import de.gultsch.chat.persistance.DatabaseBackend;
 import de.gultsch.chat.utils.Beautifier;
 import android.os.Bundle;
 import android.app.FragmentTransaction;
@@ -34,13 +33,56 @@ import android.widget.ImageView;
 public class ConversationActivity extends XmppActivity {
 
 	public static final String VIEW_CONVERSATION = "viewConversation";
-	private static final String LOGTAG = "secureconversation";
 	protected static final String CONVERSATION = "conversationUuid";
 
 	protected SlidingPaneLayout spl;
 
-	final List<Conversation> conversationList = new ArrayList<Conversation>();
+	private List<Conversation> conversationList = new ArrayList<Conversation>();
+	private int selectedConversation = 0;
+	private ListView listView;
+	
+	private boolean paneShouldBeOpen = true;
+	
+	
+	public List<Conversation> getConversationList() {
+		return this.conversationList;
+	}
 
+	public int getSelectedConversation() {
+		return this.selectedConversation;
+	}
+	
+	public ListView getConversationListView() {
+		return this.listView;
+	}
+	
+	public SlidingPaneLayout getSlidingPaneLayout() {
+		return this.spl;
+	}
+	
+	public boolean shouldPaneBeOpen() {
+		return paneShouldBeOpen;
+	}
+	
+	public void updateConversationList() {
+		if (conversationList.size() >= 1) {
+			Conversation currentConv = conversationList.get(selectedConversation);
+			Collections.sort(this.conversationList, new Comparator<Conversation>() {
+				@Override
+				public int compare(Conversation lhs, Conversation rhs) {
+					return (int) (rhs.getLatestMessageDate() - lhs.getLatestMessageDate());
+				}
+			});
+			for(int i = 0; i < conversationList.size(); ++i) {
+				if (currentConv == conversationList.get(i)) {
+					selectedConversation = i;
+					break;
+				}
+			}
+		}
+		this.listView.invalidateViews();
+	}
+	
 	@Override
 	protected void onCreate(Bundle savedInstanceState) {
 
@@ -48,7 +90,7 @@ public class ConversationActivity extends XmppActivity {
 
 		setContentView(R.layout.fragment_conversations_overview);
 
-		final ListView listView = (ListView) findViewById(R.id.list);
+		listView = (ListView) findViewById(R.id.list);
 
 		listView.setAdapter(new ArrayAdapter<Conversation>(this,
 				R.layout.conversation_list_row, conversationList) {
@@ -61,8 +103,9 @@ public class ConversationActivity extends XmppActivity {
 				}
 				((TextView) view.findViewById(R.id.conversation_name))
 						.setText(getItem(position).getName());
+				((TextView) view.findViewById(R.id.conversation_lastmsg)).setText(getItem(position).getLatestMessage());
 				((TextView) view.findViewById(R.id.conversation_lastupdate))
-				.setText(Beautifier.readableTimeDifference(getItem(position).getCreated()));
+				.setText(Beautifier.readableTimeDifference(getItem(position).getLatestMessageDate()));
 				((ImageView) view.findViewById(R.id.conversation_image))
 						.setImageURI(getItem(position).getProfilePhotoUri());
 				return view;
@@ -75,11 +118,13 @@ public class ConversationActivity extends XmppActivity {
 			@Override
 			public void onItemClick(AdapterView<?> arg0, View clickedView,
 					int position, long arg3) {
-				Log.d(LOGTAG, "List view was klicked on position " + position);
-				swapConversationFragment(conversationList.get(position));
-				getActionBar().setTitle(
-						conversationList.get(position).getName());
-				spl.closePane();
+				paneShouldBeOpen = false;
+				if (selectedConversation != position) {
+					selectedConversation = position;
+					swapConversationFragment(); //.onBackendConnected(conversationList.get(position));
+				} else {
+					spl.closePane();
+				}
 			}
 		});
 		spl = (SlidingPaneLayout) findViewById(id.slidingpanelayout);
@@ -91,6 +136,7 @@ public class ConversationActivity extends XmppActivity {
 
 			@Override
 			public void onPanelOpened(View arg0) {
+				paneShouldBeOpen = true;
 				getActionBar().setDisplayHomeAsUpEnabled(false);
 				getActionBar().setTitle(R.string.app_name);
 				invalidateOptionsMenu();
@@ -105,21 +151,13 @@ public class ConversationActivity extends XmppActivity {
 							focus.getWindowToken(),
 							InputMethodManager.HIDE_NOT_ALWAYS);
 				}
-				listView.requestFocus();
 			}
 
 			@Override
 			public void onPanelClosed(View arg0) {
 				if (conversationList.size() > 0) {
 					getActionBar().setDisplayHomeAsUpEnabled(true);
-					ConversationFragment convFrag = (ConversationFragment) getFragmentManager()
-							.findFragmentById(R.id.selected_conversation);
-					if (convFrag == null) {
-						Log.d(LOGTAG, "conversation fragment was not found.");
-						return; // just do nothing. at least dont crash
-					}
-					getActionBar().setTitle(
-							convFrag.getConversation().getName());
+					getActionBar().setTitle(conversationList.get(selectedConversation).getName());
 					invalidateOptionsMenu();
 				}
 			}
@@ -134,7 +172,6 @@ public class ConversationActivity extends XmppActivity {
 
 	@Override
 	public boolean onCreateOptionsMenu(Menu menu) {
-		// Inflate the menu; this adds items to the action bar if it is present.
 		getMenuInflater().inflate(R.menu.conversations, menu);
 
 		if (spl.isOpen()) {
@@ -161,8 +198,23 @@ public class ConversationActivity extends XmppActivity {
 			break;
 		case R.id.action_add:
 			startActivity(new Intent(this, NewConversationActivity.class));
+			break;
 		case R.id.action_archive:
-
+			Conversation conv = getConversationList().get(selectedConversation);
+			conv.setStatus(Conversation.STATUS_ARCHIVED);
+			xmppConnectionService.updateConversation(conv);
+			conversationList.remove(selectedConversation);
+			selectedConversation = 0;
+			if (conversationList.size() >= 1) {
+				paneShouldBeOpen = true;
+				swapConversationFragment();
+				((ArrayAdapter) listView.getAdapter()).notifyDataSetChanged();
+				spl.openPane();
+			} else {
+				startActivity(new Intent(this, NewConversationActivity.class));
+				finish();
+			}
+			//goto new 
 			break;
 		default:
 			break;
@@ -170,14 +222,14 @@ public class ConversationActivity extends XmppActivity {
 		return super.onOptionsItemSelected(item);
 	}
 
-	protected void swapConversationFragment(Conversation conv) {
-		Log.d(LOGTAG, "swap conversation fragment to " + conv.getName());
+	protected ConversationFragment swapConversationFragment() {
 		ConversationFragment selectedFragment = new ConversationFragment();
-		selectedFragment.setConversation(conv);
+		
 		FragmentTransaction transaction = getFragmentManager()
 				.beginTransaction();
-		transaction.replace(R.id.selected_conversation, selectedFragment);
+		transaction.replace(R.id.selected_conversation, selectedFragment,"conversation");
 		transaction.commit();
+		return selectedFragment;
 	}
 
 	@Override
@@ -202,25 +254,31 @@ public class ConversationActivity extends XmppActivity {
 	}
 
 	@Override
-	void servConnected() {
+	void onBackendConnected() {
 		conversationList.clear();
 		conversationList.addAll(xmppConnectionService
 				.getConversations(Conversation.STATUS_AVAILABLE));
+		
+		for(Conversation conversation : conversationList) {
+			conversation.setMessages(xmppConnectionService.getMessages(conversation));
+		}
 
-		//spl.openPane();
+		this.updateConversationList();
 
 		if ((getIntent().getAction().equals(Intent.ACTION_VIEW) && (!handledViewIntent))) {
 			if (getIntent().getType().equals(
 					ConversationActivity.VIEW_CONVERSATION)) {
 				handledViewIntent = true;
 
-				swapConversationFragment(conversationList.get(0));
-				spl.closePane();
-
-				// why do i even need this
-				getActionBar().setDisplayHomeAsUpEnabled(true);
-				getActionBar().setTitle(conversationList.get(0).getName());
+				String convToView = (String) getIntent().getExtras().get(CONVERSATION);
 
+				for(int i = 0; i < conversationList.size(); ++i) {
+					if (conversationList.get(i).getUuid().equals(convToView)) {
+						selectedConversation = i;
+					}
+				}
+				paneShouldBeOpen = false;
+				swapConversationFragment();
 			}
 		} else {
 			if (conversationList.size() <= 0) {
@@ -228,7 +286,16 @@ public class ConversationActivity extends XmppActivity {
 				startActivity(new Intent(this, NewConversationActivity.class));
 				finish();
 			} else {
-				swapConversationFragment(conversationList.get(0));
+				//find currently loaded fragment
+				ConversationFragment selectedFragment = (ConversationFragment) getFragmentManager().findFragmentByTag("conversation");
+				if (selectedFragment!=null) {
+					Log.d("gultsch","ConversationActivity. found old fragment.");
+					selectedFragment.onBackendConnected();
+				} else {
+					Log.d("gultsch","conversationactivity. no old fragment found. creating new one");
+					Log.d("gultsch","selected conversation is #"+selectedConversation);
+					swapConversationFragment();
+				}
 			}
 		}
 	}
diff --git a/src/de/gultsch/chat/ui/ConversationFragment.java b/src/de/gultsch/chat/ui/ConversationFragment.java
index fca5202a7..5ba58bbff 100644
--- a/src/de/gultsch/chat/ui/ConversationFragment.java
+++ b/src/de/gultsch/chat/ui/ConversationFragment.java
@@ -1,11 +1,13 @@
 package de.gultsch.chat.ui;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import de.gultsch.chat.R;
 import de.gultsch.chat.entities.Conversation;
 import de.gultsch.chat.entities.Message;
 import de.gultsch.chat.utils.Beautifier;
 import android.app.Fragment;
-import android.content.Context;
 import android.database.Cursor;
 import android.graphics.Typeface;
 import android.net.Uri;
@@ -18,85 +20,118 @@ import android.view.View.OnClickListener;
 import android.view.ViewGroup;
 import android.widget.ArrayAdapter;
 import android.widget.EditText;
-import android.widget.ListAdapter;
 import android.widget.ListView;
 import android.widget.ImageButton;
 import android.widget.ImageView;
 import android.widget.TextView;
 
 public class ConversationFragment extends Fragment {
-
-	Conversation conversation;
-
-	public void setConversation(Conversation conv) {
-		this.conversation = conv;
-	}
+	
+	protected Conversation conversation;
+	protected ListView messagesView;
+	protected LayoutInflater inflater;
+	protected List<Message> messageList = new ArrayList<Message>();
 
 	@Override
-	public View onCreateView(final LayoutInflater inflater, ViewGroup container,
-			Bundle savedInstanceState) {
-		
-		String[] mProjection = new String[]
-			    {
-			        Profile._ID,
-			        Profile.PHOTO_THUMBNAIL_URI
-			    };
-			Cursor mProfileCursor = getActivity().getContentResolver().query(
-			        Profile.CONTENT_URI,
-			        mProjection ,
-			        null,
-			        null,
-			        null);
-			
-		mProfileCursor.moveToFirst();
-		final Uri profilePicture = Uri.parse(mProfileCursor.getString(1));
-		
-		Log.d("gultsch","found user profile pic "+profilePicture.toString());
-		
-		final View view = inflater.inflate(R.layout.fragment_conversation, container,
-				false);
+	public View onCreateView(final LayoutInflater inflater,
+			ViewGroup container, Bundle savedInstanceState) {
+
+		this.inflater = inflater;
+
+
+
+		final View view = inflater.inflate(R.layout.fragment_conversation,
+				container, false);
 		((ImageButton) view.findViewById(R.id.textSendButton))
 				.setOnClickListener(new OnClickListener() {
 
 					@Override
 					public void onClick(View v) {
-						EditText chatMsg = (EditText) view.findViewById(R.id.textinput);
-						if (chatMsg.getText().length() < 1) return;
-						Message message = new Message(conversation,chatMsg.getText().toString(),
-								Message.ENCRYPTION_NONE);
-						XmppActivity activity = (XmppActivity) getActivity();
+						ConversationActivity activity = (ConversationActivity) getActivity();
+						EditText chatMsg = (EditText) view
+								.findViewById(R.id.textinput);
+						if (chatMsg.getText().length() < 1)
+							return;
+						Message message = new Message(conversation, chatMsg
+								.getText().toString(), Message.ENCRYPTION_NONE);
 						activity.xmppConnectionService.sendMessage(message);
 						conversation.getMessages().add(message);
 						chatMsg.setText("");
 						
-						ListView messagesView = (ListView) view.findViewById(R.id.messages_view);
-						ArrayAdapter<Message> adapter = (ArrayAdapter<Message>) messagesView.getAdapter();
-						adapter.notifyDataSetChanged();
+						messageList.add(message);
 						
-						messagesView.setSelection(conversation.getMessages().size() -1);
+						activity.updateConversationList();
+						
+						messagesView.setSelection(messageList.size() - 1);
 					}
 				});
 
-		ListView messagesView = (ListView) view
-				.findViewById(R.id.messages_view);
+		messagesView = (ListView) view.findViewById(R.id.messages_view);
+		
+		String[] mProjection = new String[] { Profile._ID,
+				Profile.PHOTO_THUMBNAIL_URI };
+		Cursor mProfileCursor = getActivity().getContentResolver().query(
+				Profile.CONTENT_URI, mProjection, null, null, null);
+
+		mProfileCursor.moveToFirst();
+		final Uri profilePicture = Uri.parse(mProfileCursor.getString(1));
+		
 		messagesView.setAdapter(new ArrayAdapter<Message>(this.getActivity()
-				.getApplicationContext(), R.layout.message_sent,
-				this.conversation.getMessages()) {
+				.getApplicationContext(), R.layout.message_sent, this.messageList) {
+
+			private static final int SENT = 0;
+			private static final int RECIEVED = 1;
+			
+			@Override
+			public int getViewTypeCount() {
+				return 2;
+			}
+
+			@Override
+			public int getItemViewType(int position) {
+				if (getItem(position).getStatus() == Message.STATUS_RECIEVED) {
+					return RECIEVED;
+				} else {
+					return SENT;
+				}
+			}
 
 			@Override
 			public View getView(int position, View view, ViewGroup parent) {
 				Message item = getItem(position);
-				if ((item.getStatus() != Message.STATUS_RECIEVED)
-						|| (item.getStatus() == Message.STATUS_SEND)) {
-					view = (View) inflater.inflate(R.layout.message_sent, null);
-					((ImageView) view.findViewById(R.id.message_photo)).setImageURI(profilePicture);
+				int type = getItemViewType(position);
+				if (view == null) {
+					switch (type) {
+					case SENT:
+						view = (View) inflater.inflate(R.layout.message_sent,
+								null);
+						Log.d("gultsch", "inflated new message_sent view");
+						break;
+					case RECIEVED:
+						view = (View) inflater.inflate(
+								R.layout.message_recieved, null);
+						Log.d("gultsch", "inflated new message_recieved view");
+						break;
+					}
+				} else {
+					Log.d("gultsch", "recylecd a view");
 				}
-				((TextView) view.findViewById(R.id.message_body)).setText(item.getBody());
+				if (type == RECIEVED) {
+					((ImageView) view.findViewById(R.id.message_photo))
+							.setImageURI(item.getConversation()
+									.getProfilePhotoUri());
+				} else {
+					((ImageView) view.findViewById(R.id.message_photo))
+							.setImageURI(profilePicture);
+				}
+				((TextView) view.findViewById(R.id.message_body)).setText(item
+						.getBody());
 				TextView time = (TextView) view.findViewById(R.id.message_time);
 				if (item.getStatus() == Message.STATUS_UNSEND) {
 					time.setTypeface(null, Typeface.ITALIC);
 				} else {
-					time.setText(Beautifier.readableTimeDifference(item.getTimeSent()));
+					time.setText(Beautifier.readableTimeDifference(item
+							.getTimeSent()));
 				}
 				return view;
 			}
@@ -105,7 +140,37 @@ public class ConversationFragment extends Fragment {
 		return view;
 	}
 
-	public Conversation getConversation() {
-		return conversation;
+	@Override
+	public void onStart() {
+		super.onStart();
+		
+		Log.d("gultsch","conversationfragment onStart");
+
+		final ConversationActivity activity = (ConversationActivity) getActivity();
+		
+		// TODO check if bond and get data back
+		
+		if (activity.xmppConnectionServiceBound) {
+			this.conversation = activity.getConversationList().get(activity.getSelectedConversation());
+			this.messageList.clear();
+			this.messageList.addAll(this.conversation.getMessages());
+		}
+		
+		
+		// rendering complete. now go tell activity to close pane
+		if (!activity.shouldPaneBeOpen()) {
+			activity.getSlidingPaneLayout().closePane();
+		}
+		
+		int size = this.messageList.size();
+		if (size >= 1)
+			messagesView.setSelection(size - 1);
+	}
+	
+	public void onBackendConnected() {
+		final ConversationActivity activity = (ConversationActivity) getActivity();
+		this.conversation = activity.getConversationList().get(activity.getSelectedConversation());
+		this.messageList.clear();
+		this.messageList.addAll(this.conversation.getMessages());
 	}
 }
diff --git a/src/de/gultsch/chat/ui/NewConversationActivity.java b/src/de/gultsch/chat/ui/NewConversationActivity.java
index 917b4c627..d3a3aa00a 100644
--- a/src/de/gultsch/chat/ui/NewConversationActivity.java
+++ b/src/de/gultsch/chat/ui/NewConversationActivity.java
@@ -85,9 +85,7 @@ public class NewConversationActivity extends XmppActivity {
 				
 				Account account = new Account();
 				
-				Conversation conversation = new Conversation(clickedContact.getDisplayName(), clickedContact.getProfilePhoto(), account, clickedContact.getJid());
-			
-				xmppConnectionService.addConversation(conversation);
+				Conversation conversation = xmppConnectionService.findOrCreateConversation(account, clickedContact);
 				
 				Intent viewConversationIntent = new Intent(v.getContext(),ConversationActivity.class);
 				viewConversationIntent.setAction(Intent.ACTION_VIEW);
@@ -218,9 +216,10 @@ public class NewConversationActivity extends XmppActivity {
 	}
 
 	@Override
-	void servConnected() {
-		// TODO Auto-generated method stub
+	void onBackendConnected() {
 		
+		getActionBar().setDisplayHomeAsUpEnabled(false);
+		getActionBar().setHomeButtonEnabled(false);
 	}
 	
 	@Override
diff --git a/src/de/gultsch/chat/ui/XmppActivity.java b/src/de/gultsch/chat/ui/XmppActivity.java
index c15482ac4..ce65ab5ec 100644
--- a/src/de/gultsch/chat/ui/XmppActivity.java
+++ b/src/de/gultsch/chat/ui/XmppActivity.java
@@ -20,7 +20,7 @@ public abstract class XmppActivity extends Activity {
 			XmppConnectionBinder binder = (XmppConnectionBinder) service;
 			xmppConnectionService = binder.getService();
 			xmppConnectionServiceBound = true;
-			servConnected();
+			onBackendConnected();
 		}
 
 		@Override
@@ -47,5 +47,5 @@ public abstract class XmppActivity extends Activity {
 		}
 	}
 	
-	abstract void servConnected();
+	abstract void onBackendConnected();
 }