diff --git a/client/.settings/org.eclipse.jdt.ui.prefs b/client/.settings/org.eclipse.jdt.ui.prefs
index f6a7cc1..1d718a1 100644
--- a/client/.settings/org.eclipse.jdt.ui.prefs
+++ b/client/.settings/org.eclipse.jdt.ui.prefs
@@ -6,4 +6,4 @@ org.eclipse.jdt.ui.importorder=java;javax;javafx;org;com;envoy;
 org.eclipse.jdt.ui.javadoc=true
 org.eclipse.jdt.ui.ondemandthreshold=4
 org.eclipse.jdt.ui.staticondemandthreshold=2
-org.eclipse.jdt.ui.text.custom_code_templates=/**\n * @return the ${bare_field_name}\n * @since Envoy Client v0.1-beta\n *//**\n * @param ${param} the ${bare_field_name} to set\n * @since Envoy Client v0.1-beta\n *//**\n * ${tags}\n * @since Envoy Client v0.1-beta\n *//**\n * Project\: <strong>${project_name}</strong><br>\n * File\: <strong>${file_name}</strong><br>\n * Created\: <strong>${date}</strong><br>\n * \n * @author ${user}\n * @since Envoy Client v0.1-beta\n *//**\n * ${tags}\n * @since Envoy Client v0.1-beta\n *//**\n * @author ${user}\n *\n * ${tags}\n * @since Envoy Client v0.1-beta\n *//**\n * {@inheritDoc}\n *//**\n * ${tags}\n * ${see_to_target}\n * @since Envoy Client v0.1-beta\n */${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}\n\n\n\n${exception_var}.printStackTrace();${body_statement}${body_statement}return ${field};${field} \= ${param};
+org.eclipse.jdt.ui.text.custom_code_templates=/**\r\n * @return the ${bare_field_name}\r\n * @since Envoy Client v0.1-beta\r\n *//**\r\n * @param ${param} the ${bare_field_name} to set\r\n * @since Envoy Client v0.1-beta\r\n *//**\r\n * ${tags}\r\n * @since Envoy Client v0.1-beta\r\n *//**\r\n * Project\: <strong>${project_name}</strong><br>\r\n * File\: <strong>${file_name}</strong><br>\r\n * Created\: <strong>${date}</strong><br>\r\n *\r\n * @author ${user}\r\n * @since Envoy Client v0.1-beta\r\n *//**\r\n * ${tags}\r\n * @since Envoy Client v0.1-beta\r\n *//**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n * @since Envoy Client v0.1-beta\r\n *//**\r\n * {@inheritDoc}\r\n *//**\r\n * ${tags}\r\n * ${see_to_target}\r\n * @since Envoy Client v0.1-beta\r\n */${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}\r\n\r\n\r\n\r\n${exception_var}.printStackTrace();${body_statement}${body_statement}return ${field};${field} \= ${param};
diff --git a/client/src/main/java/envoy/client/net/Client.java b/client/src/main/java/envoy/client/net/Client.java
index afa423a..a01468f 100644
--- a/client/src/main/java/envoy/client/net/Client.java
+++ b/client/src/main/java/envoy/client/net/Client.java
@@ -12,7 +12,7 @@ import envoy.client.event.SendEvent;
 import envoy.data.*;
 import envoy.event.*;
 import envoy.event.contact.ContactOperation;
-import envoy.event.contact.ContactSearchResult;
+import envoy.event.contact.UserSearchResult;
 import envoy.util.EnvoyLog;
 import envoy.util.SerializationUtils;
 
@@ -147,7 +147,7 @@ public class Client implements Closeable {
 		receiver.registerProcessor(NameChange.class, evt -> { localDB.replaceContactName(evt); eventBus.dispatch(evt); });
 
 		// Process contact searches
-		receiver.registerProcessor(ContactSearchResult.class, eventBus::dispatch);
+		receiver.registerProcessor(UserSearchResult.class, eventBus::dispatch);
 
 		// Process contact operations
 		receiver.registerProcessor(ContactOperation.class, eventBus::dispatch);
diff --git a/client/src/main/java/envoy/client/ui/controller/ChatScene.java b/client/src/main/java/envoy/client/ui/controller/ChatScene.java
index fd0e5c8..920d93f 100644
--- a/client/src/main/java/envoy/client/ui/controller/ChatScene.java
+++ b/client/src/main/java/envoy/client/ui/controller/ChatScene.java
@@ -34,9 +34,9 @@ import envoy.client.net.WriteProxy;
 import envoy.client.ui.IconUtil;
 import envoy.client.ui.Restorable;
 import envoy.client.ui.SceneContext;
-import envoy.client.ui.listcell.ContactListCellFactory;
+import envoy.client.ui.listcell.ChatControl;
+import envoy.client.ui.listcell.ListCellFactory;
 import envoy.client.ui.listcell.MessageControl;
-import envoy.client.ui.listcell.MessageListCellFactory;
 import envoy.data.*;
 import envoy.data.Attachment.AttachmentType;
 import envoy.event.*;
@@ -124,8 +124,8 @@ public final class ChatScene implements Restorable {
 	private void initialize() {
 
 		// Initialize message and user rendering
-		messageList.setCellFactory(MessageListCellFactory::new);
-		chatList.setCellFactory(ContactListCellFactory::new);
+		messageList.setCellFactory(new ListCellFactory<>(MessageControl::new));
+		chatList.setCellFactory(new ListCellFactory<>(ChatControl::new));
 
 		settingsButton.setGraphic(new ImageView(IconUtil.loadIconThemeSensitive("settings", DEFAULT_ICON_SIZE)));
 		voiceButton.setGraphic(new ImageView(IconUtil.loadIconThemeSensitive("microphone", DEFAULT_ICON_SIZE)));
@@ -151,8 +151,6 @@ public final class ChatScene implements Restorable {
 					chatList.getItems().remove(chat);
 					chatList.getItems().add(0, chat);
 					if (chat.equals(currentChat)) chatList.getSelectionModel().select(0);
-					localDB.getChats().remove(chat);
-					localDB.getChats().add(0, chat);
 				});
 			});
 		});
@@ -187,13 +185,11 @@ public final class ChatScene implements Restorable {
 				case ADD:
 					localDB.getUsers().put(contact.getName(), contact);
 					Chat chat = contact instanceof User ? new Chat(contact) : new GroupChat(client.getSender(), contact);
-					localDB.getChats().add(chat);
 					Platform.runLater(() -> chatList.getItems().add(chat));
 					break;
 				case REMOVE:
 					localDB.getUsers().remove(contact.getName());
-					localDB.getChats().removeIf(c -> c.getRecipient().getID() == contact.getID());
-					Platform.runLater(() -> chatList.getItems().removeIf(c -> c.getRecipient().getID() == contact.getID()));
+					Platform.runLater(() -> chatList.getItems().removeIf(c -> c.getRecipient().equals(contact)));
 					break;
 			}
 		});
@@ -233,6 +229,8 @@ public final class ChatScene implements Restorable {
 	 */
 	@FXML
 	private void chatListClicked() {
+		if (chatList.getSelectionModel().isEmpty()) return;
+
 		final Contact user = chatList.getSelectionModel().getSelectedItem().getRecipient();
 		if (user != null && (currentChat == null || !user.equals(currentChat.getRecipient()))) {
 
diff --git a/client/src/main/java/envoy/client/ui/controller/ContactSearchScene.java b/client/src/main/java/envoy/client/ui/controller/ContactSearchScene.java
index a86d79d..5b5c448 100644
--- a/client/src/main/java/envoy/client/ui/controller/ContactSearchScene.java
+++ b/client/src/main/java/envoy/client/ui/controller/ContactSearchScene.java
@@ -2,7 +2,6 @@ package envoy.client.ui.controller;
 
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import java.util.stream.Collectors;
 
 import javafx.application.Platform;
 import javafx.fxml.FXML;
@@ -11,22 +10,32 @@ import javafx.scene.control.Alert.AlertType;
 import javafx.scene.control.ButtonType;
 import javafx.scene.control.ListView;
 
-import envoy.client.data.Chat;
 import envoy.client.data.LocalDB;
 import envoy.client.event.SendEvent;
 import envoy.client.ui.ClearableTextField;
 import envoy.client.ui.SceneContext;
-import envoy.client.ui.listcell.ContactListCellFactory;
+import envoy.client.ui.listcell.ContactControl;
+import envoy.client.ui.listcell.ListCellFactory;
+import envoy.data.User;
 import envoy.event.ElementOperation;
 import envoy.event.EventBus;
 import envoy.event.contact.ContactOperation;
-import envoy.event.contact.ContactSearchRequest;
-import envoy.event.contact.ContactSearchResult;
+import envoy.event.contact.UserSearchRequest;
+import envoy.event.contact.UserSearchResult;
 import envoy.util.EnvoyLog;
 
 /**
+ * Provides a search bar in which a user name (substring) can be entered. The
+ * users with a matching name are then displayed inside a list view. A
+ * {@link UserSearchRequest} is sent on every keystroke.
+ * 
+ * The actual search algorithm is implemented on the server.
+ * 
+ * To create a group, a button is available that loads the
+ * {@link GroupCreationScene}.
+ * 
  * Project: envoy-client
- * File: ContactSearchSceneController.java
+ * File: ContactSearchScene.java
  * Created: 07.06.2020
  *
  * @author Leon Hofmeister
@@ -38,7 +47,7 @@ public class ContactSearchScene {
 	private ClearableTextField searchBar;
 
 	@FXML
-	private ListView chatList;
+	private ListView userList;
 
 	private SceneContext sceneContext;
 
@@ -59,13 +68,10 @@ public class ContactSearchScene {
 
 	@FXML
 	private void initialize() {
-		chatList.setCellFactory(ContactListCellFactory::new);
-		searchBar.setClearButtonListener(e -> { searchBar.getTextField().clear(); chatList.getItems().clear(); });
-		eventBus.register(ContactSearchResult.class,
-				response -> Platform.runLater(() -> {
-					chatList.getItems().clear();
-					chatList.getItems().addAll(response.get().stream().map(Chat::new).collect(Collectors.toList()));
-				}));
+		userList.setCellFactory(new ListCellFactory<>(ContactControl::new));
+		searchBar.setClearButtonListener(e -> { searchBar.getTextField().clear(); userList.getItems().clear(); });
+		eventBus.register(UserSearchResult.class,
+				response -> Platform.runLater(() -> { userList.getItems().clear(); userList.getItems().addAll(response.get()); }));
 	}
 
 	/**
@@ -76,8 +82,8 @@ public class ContactSearchScene {
 	@FXML
 	private void sendRequest() {
 		final var text = searchBar.getTextField().getText().strip();
-		if (!text.isBlank()) eventBus.dispatch(new SendEvent(new ContactSearchRequest(text)));
-		else chatList.getItems().clear();
+		if (!text.isBlank()) eventBus.dispatch(new SendEvent(new UserSearchRequest(text)));
+		else userList.getItems().clear();
 	}
 
 	/**
@@ -89,32 +95,32 @@ public class ContactSearchScene {
 	@FXML
 	private void clear() {
 		searchBar.getTextField().setText(null);
-		chatList.getItems().clear();
+		userList.getItems().clear();
 	}
 
 	/**
-	 * Sends an {@link ContactOperation} for every selected contact to the
+	 * Sends an {@link ContactOperation} for the selected user to the
 	 * server.
 	 *
 	 * @since Envoy Client v0.1-beta
 	 */
 	@FXML
-	private void chatListClicked() {
-		final var chat = chatList.getSelectionModel().getSelectedItem();
-		if (chat != null) {
+	private void userListClicked() {
+		final var user = userList.getSelectionModel().getSelectedItem();
+		if (user != null) {
 			final var alert = new Alert(AlertType.CONFIRMATION);
 			alert.setTitle("Add Contact to Contact List");
-			alert.setHeaderText("Add the user " + chat.getRecipient().getName() + " to your contact list?");
+			alert.setHeaderText("Add the user " + user.getName() + " to your contact list?");
 			// Normally, this would be total BS (we are already on the FX Thread), however
 			// it could be proven that the creation of this dialog wrapped in
 			// Platform.runLater is less error-prone than without it
 			Platform.runLater(() -> alert.showAndWait().filter(btn -> btn == ButtonType.OK).ifPresent(btn -> {
-				final var event = new ContactOperation(chat.getRecipient(), ElementOperation.ADD);
+				final var event = new ContactOperation(user, ElementOperation.ADD);
 				// Sends the event to the server
 				eventBus.dispatch(new SendEvent(event));
 				// Updates the UI
 				eventBus.dispatch(event);
-				logger.log(Level.INFO, "Added contact " + chat.getRecipient());
+				logger.log(Level.INFO, "Added user " + user);
 			}));
 		}
 	}
diff --git a/client/src/main/java/envoy/client/ui/controller/GroupCreationScene.java b/client/src/main/java/envoy/client/ui/controller/GroupCreationScene.java
index e7bbf93..e6ca29a 100644
--- a/client/src/main/java/envoy/client/ui/controller/GroupCreationScene.java
+++ b/client/src/main/java/envoy/client/ui/controller/GroupCreationScene.java
@@ -1,5 +1,7 @@
 package envoy.client.ui.controller;
 
+import static java.util.function.Predicate.not;
+
 import java.util.stream.Collectors;
 
 import javafx.application.Platform;
@@ -12,15 +14,24 @@ import envoy.client.data.LocalDB;
 import envoy.client.event.SendEvent;
 import envoy.client.ui.ClearableTextField;
 import envoy.client.ui.SceneContext;
-import envoy.client.ui.listcell.ContactListCellFactory;
-import envoy.data.Group;
+import envoy.client.ui.listcell.ContactControl;
+import envoy.client.ui.listcell.ListCellFactory;
+import envoy.data.User;
 import envoy.event.EventBus;
 import envoy.event.GroupCreation;
 import envoy.util.Bounds;
 
 /**
+ * Provides a group creation interface. A group name can be entered in the text
+ * field at the top. Available users (local chat recipients) are displayed
+ * inside a list and can be selected (multiple selection available).
+ * 
+ * When the group creation button is pressed, a {@link GroupCreation} is sent to
+ * the server. This controller enforces a valid group name and a non-empty
+ * member list (excluding the client user).
+ * 
  * Project: envoy-client
- * File: ContactSearchSceneController.java
+ * File: GroupCreationScene.java
  * Created: 07.06.2020
  *
  * @author Maximilian Käfer
@@ -35,7 +46,7 @@ public class GroupCreationScene {
 	private ClearableTextField groupNameField;
 
 	@FXML
-	private ListView chatList;
+	private ListView userList;
 
 	private SceneContext sceneContext;
 
@@ -43,8 +54,8 @@ public class GroupCreationScene {
 
 	@FXML
 	private void initialize() {
-		chatList.setCellFactory(ContactListCellFactory::new);
-		chatList.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
+		userList.setCellFactory(new ListCellFactory<>(ContactControl::new));
+		userList.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
 		groupNameField.setClearButtonListener(e -> { groupNameField.getTextField().clear(); createButton.setDisable(true); });
 	}
 
@@ -56,11 +67,13 @@ public class GroupCreationScene {
 	 */
 	public void initializeData(SceneContext sceneContext, LocalDB localDB) {
 		this.sceneContext = sceneContext;
-		Platform.runLater(() -> chatList.getItems()
+		Platform.runLater(() -> userList.getItems()
 			.addAll(localDB.getChats()
 				.stream()
-				.filter(c -> !(c.getRecipient() instanceof Group))
-				.filter(c -> c.getRecipient().getID() != localDB.getUser().getID())
+				.map(Chat::getRecipient)
+				.filter(User.class::isInstance)
+				.filter(not(localDB.getUser()::equals))
+				.map(User.class::cast)
 				.collect(Collectors.toList())));
 	}
 
@@ -70,13 +83,13 @@ public class GroupCreationScene {
 	 * @since Envoy Client v0.1-beta
 	 */
 	@FXML
-	private void chatListClicked() {
-		createButton.setDisable(chatList.getSelectionModel().isEmpty() || groupNameField.getTextField().getText().isBlank());
+	private void userListClicked() {
+		createButton.setDisable(userList.getSelectionModel().isEmpty() || groupNameField.getTextField().getText().isBlank());
 	}
 
 	/**
 	 * Checks, whether the {@code createButton} can be enabled because text is
-	 * present in the textfield.
+	 * present in the text field.
 	 *
 	 * @since Envoy Client v0.1-beta
 	 */
@@ -97,8 +110,8 @@ public class GroupCreationScene {
 			new Alert(AlertType.ERROR, "The entered group name is not valid (" + Bounds.CONTACT_NAME_PATTERN + ")").showAndWait();
 			groupNameField.getTextField().clear();
 		} else {
-			eventBus.dispatch(new SendEvent(new GroupCreation(name,
-					chatList.getSelectionModel().getSelectedItems().stream().map(c -> c.getRecipient().getID()).collect(Collectors.toSet()))));
+			eventBus.dispatch(new SendEvent(
+					new GroupCreation(name, userList.getSelectionModel().getSelectedItems().stream().map(User::getID).collect(Collectors.toSet()))));
 			new Alert(AlertType.INFORMATION, String.format("Group '%s' successfully created.", name)).showAndWait();
 			sceneContext.pop();
 		}
diff --git a/client/src/main/java/envoy/client/ui/listcell/ChatControl.java b/client/src/main/java/envoy/client/ui/listcell/ChatControl.java
index 98294a7..c2e942c 100644
--- a/client/src/main/java/envoy/client/ui/listcell/ChatControl.java
+++ b/client/src/main/java/envoy/client/ui/listcell/ChatControl.java
@@ -5,17 +5,16 @@ import javafx.scene.control.Label;
 import javafx.scene.layout.*;
 
 import envoy.client.data.Chat;
-import envoy.data.Contact;
-import envoy.data.Group;
-import envoy.data.User;
 
 /**
- * This class formats a single {@link Contact} into a UI component.
+ * Displays a chat using a contact control for the recipient and a label for the
+ * unread message count.
  * 
  * Project: envoy-client
  * File: ContactControl.java
  * Created: 01.07.2020
  *
+ * @see ContactControl
  * @author Leon Hofmeister
  * @since Envoy Client v0.1-beta
  */
@@ -26,21 +25,11 @@ public class ChatControl extends HBox {
 	 * @since Envoy Client v0.1-beta
 	 */
 	public ChatControl(Chat chat) {
-		// Container with contact name
-		final var	vBox		= new VBox();
-		final var	nameLabel	= new Label(chat.getRecipient().getName());
-		nameLabel.setWrapText(true);
-		vBox.getChildren().add(nameLabel);
-		if (chat.getRecipient() instanceof User) {
-			// Online status
-			final var	user		= (User) chat.getRecipient();
-			final var	statusLabel	= new Label(user.getStatus().toString());
-			statusLabel.getStyleClass().add(user.getStatus().toString().toLowerCase());
-			vBox.getChildren().add(statusLabel);
-		} else // Member count
-			vBox.getChildren().add(new Label(((Group) chat.getRecipient()).getContacts().size() + " members"));
-				
-		getChildren().add(vBox);
+
+		// Contact control
+		getChildren().add(new ContactControl(chat.getRecipient()));
+
+		// Unread messages
 		if (chat.getUnreadAmount() != 0) {
 			Region spacing = new Region();
 			setHgrow(spacing, Priority.ALWAYS);
diff --git a/client/src/main/java/envoy/client/ui/listcell/ContactControl.java b/client/src/main/java/envoy/client/ui/listcell/ContactControl.java
new file mode 100644
index 0000000..c8f9107
--- /dev/null
+++ b/client/src/main/java/envoy/client/ui/listcell/ContactControl.java
@@ -0,0 +1,43 @@
+package envoy.client.ui.listcell;
+
+import javafx.scene.control.Label;
+import javafx.scene.layout.VBox;
+
+import envoy.data.Contact;
+import envoy.data.User;
+
+/**
+ * Displays information about a contact in two rows. The first row contains the
+ * name. The second row contains the online status (user) or the member count
+ * (group).
+ * 
+ * Project: envoy-client
+ * File: ContactControl.java
+ * Created: 13.07.2020
+ *
+ * @author Kai S. K. Engelbart
+ * @since Envoy Client v0.2-beta
+ */
+public class ContactControl extends VBox {
+
+	/**
+	 * @param contact the contact to display
+	 * @since Envoy Client v0.2-beta
+	 */
+	public ContactControl(Contact contact) {
+
+		// Name label
+		final var nameLabel = new Label(contact.getName());
+		getChildren().add(nameLabel);
+
+		// Online status (user) or member count (group)
+		if (contact instanceof User) {
+			final var	status		= ((User) contact).getStatus().toString();
+			final var	statusLabel	= new Label(status);
+			statusLabel.getStyleClass().add(status.toLowerCase());
+			getChildren().add(statusLabel);
+		} else {
+			getChildren().add(new Label(contact.getContacts().size() + " members"));
+		}
+	}
+}
diff --git a/client/src/main/java/envoy/client/ui/listcell/ContactListCellFactory.java b/client/src/main/java/envoy/client/ui/listcell/ContactListCellFactory.java
deleted file mode 100644
index 3d34aa9..0000000
--- a/client/src/main/java/envoy/client/ui/listcell/ContactListCellFactory.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package envoy.client.ui.listcell;
-
-import javafx.scene.control.ListCell;
-import javafx.scene.control.ListView;
-
-import envoy.client.data.Chat;
-
-/**
- * Project: envoy-client
- * File: UserListCell.java
- * Created: 28.03.2020
- *
- * @author Kai S. K. Engelbart
- * @since Envoy Client v0.1-beta
- */
-public class ContactListCellFactory extends ListCell {
-
-	private final ListView listView;
-
-	/**
-	 * @param listView the list view inside which this cell is contained
-	 * @since Envoy Client v0.1-beta
-	 */
-	public ContactListCellFactory(ListView listView) { this.listView = listView; }
-
-	/**
-	 * Displays the name of a contact. If the contact is a user, their online status
-	 * is displayed as well.
-	 *
-	 * @since Envoy Client v0.1-beta
-	 */
-	@Override
-	protected void updateItem(Chat chat, boolean empty) {
-		super.updateItem(chat, empty);
-		if (empty || chat.getRecipient() == null) {
-			setText(null);
-			setGraphic(null);
-		} else {
-			final var control = new ChatControl(chat);
-			prefWidthProperty().bind(listView.widthProperty().subtract(40));
-			setGraphic(control);
-		}
-	}
-}
diff --git a/client/src/main/java/envoy/client/ui/listcell/ListCellFactory.java b/client/src/main/java/envoy/client/ui/listcell/ListCellFactory.java
new file mode 100644
index 0000000..86270ce
--- /dev/null
+++ b/client/src/main/java/envoy/client/ui/listcell/ListCellFactory.java
@@ -0,0 +1,54 @@
+package envoy.client.ui.listcell;
+
+import java.util.function.Function;
+
+import javafx.scene.Node;
+import javafx.scene.control.ListCell;
+import javafx.scene.control.ListView;
+import javafx.util.Callback;
+
+/**
+ * Provides a creation mechanism for generic list cells given a list view and a
+ * conversion function.
+ * 
+ * Project: envoy-client
+ * File: ListCellFactory.java
+ * Created: 13.07.2020
+ *
+ * @author Kai S. K. Engelbart
+ * @param  the type of object to display
+ * @since Envoy Client v0.1-beta
+ */
+public final class ListCellFactory implements Callback, ListCell> {
+
+	private final class GenericListCell extends ListCell {
+
+		private ListView extends T> listView;
+
+		private GenericListCell(ListView extends T> listView) { this.listView = listView; }
+
+		@Override
+		protected void updateItem(T item, boolean empty) {
+			super.updateItem(item, empty);
+			if (empty || item == null) {
+				setText(null);
+				setGraphic(null);
+			} else {
+				final var control = converter.apply(item);
+				prefWidthProperty().bind(listView.widthProperty().subtract(40));
+				setGraphic(control);
+			}
+		}
+	}
+
+	private final Function super T, ? extends Node> converter;
+
+	/**
+	 * @param converter a function converting the type to display into a node
+	 * @since Envoy Client v0.1-beta
+	 */
+	public ListCellFactory(Function super T, ? extends Node> converter) { this.converter = converter; }
+
+	@Override
+	public ListCell call(ListView listView) { return new GenericListCell(listView); }
+}
diff --git a/client/src/main/java/envoy/client/ui/listcell/MessageListCellFactory.java b/client/src/main/java/envoy/client/ui/listcell/MessageListCellFactory.java
deleted file mode 100644
index f8e4fa2..0000000
--- a/client/src/main/java/envoy/client/ui/listcell/MessageListCellFactory.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package envoy.client.ui.listcell;
-
-import javafx.scene.control.ListCell;
-import javafx.scene.control.ListView;
-import javafx.scene.control.Tooltip;
-import javafx.stage.PopupWindow.AnchorLocation;
-
-import envoy.data.Message;
-
-/**
- * Displays a single message inside the message list.
- * 
- * Project: envoy-client
- * File: MessageListCellFactory.java
- * Created: 28.03.2020
- *
- * @author Kai S. K. Engelbart
- * @since Envoy Client v0.1-beta
- */
-public class MessageListCellFactory extends ListCell {
-
-	private final ListView listView;
-
-	/**
-	 * @param listView the list view inside which this cell is contained
-	 * @since Envoy Client v0.1-beta
-	 */
-	public MessageListCellFactory(ListView listView) { this.listView = listView; }
-
-	/**
-	 * Displays the text, the data of creation and the status of a message.
-	 *
-	 * @since Envoy v0.1-beta
-	 */
-	@Override
-	protected void updateItem(Message message, boolean empty) {
-		super.updateItem(message, empty);
-		if (empty || message == null) {
-			setText(null);
-			setGraphic(null);
-		} else {
-			final var control = new MessageControl(message);
-			control.prefWidthProperty().bind(listView.widthProperty().subtract(40));
-			// Creating the Tooltip to deselect a message
-			final var tooltip = new Tooltip("You can select a message by clicking on it \nand deselect it by pressing \"ctrl\" and clicking on it");
-			tooltip.setWrapText(true);
-			tooltip.setAnchorLocation(AnchorLocation.WINDOW_TOP_LEFT);
-			setTooltip(tooltip);
-			setGraphic(control);
-		}
-	}
-}
diff --git a/client/src/main/resources/fxml/ContactSearchScene.fxml b/client/src/main/resources/fxml/ContactSearchScene.fxml
index a88430c..70f5fe5 100644
--- a/client/src/main/resources/fxml/ContactSearchScene.fxml
+++ b/client/src/main/resources/fxml/ContactSearchScene.fxml
@@ -46,9 +46,8 @@
 				
 			
 		
-		
+		
 			
 				
 			
diff --git a/client/src/main/resources/fxml/GroupCreationScene.fxml b/client/src/main/resources/fxml/GroupCreationScene.fxml
index 0085b03..a8c7472 100644
--- a/client/src/main/resources/fxml/GroupCreationScene.fxml
+++ b/client/src/main/resources/fxml/GroupCreationScene.fxml
@@ -20,9 +20,9 @@
 		
 			
 				
-					
+					
 					
 						
 					
@@ -45,9 +45,8 @@
 				
 			
 		
-		
+		
 			
 				
 			
diff --git a/common/src/main/java/envoy/event/contact/ContactSearchRequest.java b/common/src/main/java/envoy/event/contact/ContactSearchRequest.java
deleted file mode 100644
index e7c4f22..0000000
--- a/common/src/main/java/envoy/event/contact/ContactSearchRequest.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package envoy.event.contact;
-
-import envoy.event.Event;
-
-/**
- * Requests a contact search from the server.
- * 
- * Project: envoy-common
- * File: ContactSearchRequest.java
- * Created: 05.02.2020
- *
- * @author Maximilian Käfer
- * @since Envoy Common v0.2-alpha
- */
-public class ContactSearchRequest extends Event {
-
-	private static final long serialVersionUID = 0L;
-
-	/**
-	 * Initializes a {@link ContactSearchRequest}.
-	 *
-	 * @param searchPhrase the search phrase to use in the contact search
-	 * @since Envoy Common v0.2-alpha
-	 */
-	public ContactSearchRequest(String searchPhrase) { super(searchPhrase); }
-}
diff --git a/common/src/main/java/envoy/event/contact/UserSearchRequest.java b/common/src/main/java/envoy/event/contact/UserSearchRequest.java
new file mode 100644
index 0000000..51889d7
--- /dev/null
+++ b/common/src/main/java/envoy/event/contact/UserSearchRequest.java
@@ -0,0 +1,26 @@
+package envoy.event.contact;
+
+import envoy.event.Event;
+
+/**
+ * Requests a user search from the server.
+ * 
+ * Project: envoy-common
+ * File: UserSearchRequest.java
+ * Created: 05.02.2020
+ *
+ * @author Maximilian Käfer
+ * @since Envoy Common v0.2-alpha
+ */
+public class UserSearchRequest extends Event {
+
+	private static final long serialVersionUID = 0L;
+
+	/**
+	 * Initializes a {@link UserSearchRequest}.
+	 *
+	 * @param searchPhrase the search phrase to use in the user search
+	 * @since Envoy Common v0.2-alpha
+	 */
+	public UserSearchRequest(String searchPhrase) { super(searchPhrase); }
+}
diff --git a/common/src/main/java/envoy/event/contact/ContactSearchResult.java b/common/src/main/java/envoy/event/contact/UserSearchResult.java
similarity index 53%
rename from common/src/main/java/envoy/event/contact/ContactSearchResult.java
rename to common/src/main/java/envoy/event/contact/UserSearchResult.java
index aed8b12..a2aa4f7 100644
--- a/common/src/main/java/envoy/event/contact/ContactSearchResult.java
+++ b/common/src/main/java/envoy/event/contact/UserSearchResult.java
@@ -2,28 +2,28 @@ package envoy.event.contact;
 
 import java.util.List;
 
-import envoy.data.Contact;
+import envoy.data.User;
 import envoy.event.Event;
 
 /**
- * Contains a list of {@link Contact}s for which a search was performed.
- * 
+ * Contains a list of users for which a search has been requested.
+ * 
  * Project: envoy-common
- * File: ContactSearchResult.java
+ * File: UserSearchResult.java
  * Created: 11 Feb 2020
  *
  * @author Kai S. K. Engelbart
  * @since Envoy Common v0.2-alpha
  */
-public class ContactSearchResult extends Event> {
+public class UserSearchResult extends Event> {
 
 	private static final long serialVersionUID = 0L;
 
 	/**
-	 * Creates an instance of {@link ContactSearchResult}.
+	 * Creates an instance of {@link UserSearchResult}.
 	 *
 	 * @param users the users found during the search
 	 * @since Envoy Common v0.2-alpha
 	 */
-	public ContactSearchResult(List users) { super(users); }
+	public UserSearchResult(List users) { super(users); }
 }
diff --git a/server/src/main/java/envoy/server/Startup.java b/server/src/main/java/envoy/server/Startup.java
index 5128d15..489a060 100755
--- a/server/src/main/java/envoy/server/Startup.java
+++ b/server/src/main/java/envoy/server/Startup.java
@@ -68,7 +68,7 @@ public class Startup {
 						new GroupMessageStatusChangeProcessor(),
 						new UserStatusChangeProcessor(),
 						new IDGeneratorRequestProcessor(),
-						new ContactSearchProcessor(),
+						new UserSearchProcessor(),
 						new ContactOperationProcessor())));
 
 		// Initialize the current message ID
diff --git a/server/src/main/java/envoy/server/processors/ContactSearchProcessor.java b/server/src/main/java/envoy/server/processors/UserSearchProcessor.java
similarity index 66%
rename from server/src/main/java/envoy/server/processors/ContactSearchProcessor.java
rename to server/src/main/java/envoy/server/processors/UserSearchProcessor.java
index 6118276..73d9558 100755
--- a/server/src/main/java/envoy/server/processors/ContactSearchProcessor.java
+++ b/server/src/main/java/envoy/server/processors/UserSearchProcessor.java
@@ -4,8 +4,8 @@ import java.io.IOException;
 import java.util.stream.Collectors;
 
 import envoy.data.Contact;
-import envoy.event.contact.ContactSearchRequest;
-import envoy.event.contact.ContactSearchResult;
+import envoy.event.contact.UserSearchRequest;
+import envoy.event.contact.UserSearchResult;
 import envoy.server.data.PersistenceManager;
 import envoy.server.data.User;
 import envoy.server.net.ConnectionManager;
@@ -13,14 +13,14 @@ import envoy.server.net.ObjectWriteProxy;
 
 /**
  * Project: envoy-server-standalone
- * File: ContactSearchProcessor.java
+ * File: UserSearchProcessor.java
  * Created: 08.02.2020
  *
  * @author Kai S. K. Engelbart
  * @author Maximilian Käfer
  * @since Envoy Server Standalone v0.1-alpha
  */
-public class ContactSearchProcessor implements ObjectProcessor {
+public class UserSearchProcessor implements ObjectProcessor {
 
 	/**
 	 * Writes a list of contacts to the client containing all {@link Contact}s
@@ -30,9 +30,9 @@ public class ContactSearchProcessor implements ObjectProcessor getInputClass() { return ContactSearchRequest.class; }
+	public Class getInputClass() { return UserSearchRequest.class; }
 }