diff --git a/client/src/main/java/envoy/client/Main.java b/client/src/main/java/envoy/client/Main.java index 842e37d..d64d075 100644 --- a/client/src/main/java/envoy/client/Main.java +++ b/client/src/main/java/envoy/client/Main.java @@ -9,16 +9,17 @@ import envoy.client.ui.Startup; *
* To allow Maven shading, the main method has to be separated from the * {@link Startup} class which extends {@link Application}. - *
- * Project: envoy-client
- * File: Main.java
- * Created: 05.07.2020
  *
  * @author Kai S. K. Engelbart
  * @since Envoy Client v0.1-beta
  */
 public final class Main {
 
+	/**
+	 * A funny debug switch put in by {@code delvh} to enable easy debugging.
+	 *
+	 * @since Envoy Client v0.2-beta
+	 */
 	private static final boolean debug = false;
 
 	/**
diff --git a/client/src/main/java/envoy/client/data/Cache.java b/client/src/main/java/envoy/client/data/Cache.java
index 0c37f5f..e638f7b 100644
--- a/client/src/main/java/envoy/client/data/Cache.java
+++ b/client/src/main/java/envoy/client/data/Cache.java
@@ -9,10 +9,6 @@ import envoy.util.EnvoyLog;
 
 /**
  * Stores elements in a queue to process them later.
- * 
- * Project: envoy-client 
- * Project: envoy-client 
- * Project: envoy-client 
- * Project: envoy-client 
- * Project: client 
- * Project: envoy-client 
  * The managed objects are stored inside a folder in the local file system.
- *  
- * Project: envoy-client 
- * Project: envoy-client 
- * Project: envoy-client 
- * Project: envoy-client 
- * Project: envoy-client 
- * Project: envoy-client 
- * Project: envoy-client 
- * Project: envoy-client 
- * Project: envoy-client 
- * Project: envoy-client 
- * Project: envoy-client 
- * Project: client 
- * Project: envoy-client 
- * Project: envoy-client 
- * Project: envoy-client 
- * Project: envoy-client 
-	 * The default is
-	 *  
- * Project: envoy-client 
-	 * While it does work, it is not the most efficient algorithm possible.
-	 *
-	 * @param toRefresh the listView to refresh
-	 * @param  
- * Project: envoy-client 
  * When a scene is loaded, the style sheet for the current theme is applied to
  * it.
- *  
- * Project: envoy-client 
- * Project: envoy-client 
- * Project: envoy-client 
- * Project: envoy-client 
- * Project: envoy-client 
- * Project: envoy-client 
- * Project: envoy-client 
- * Project: client 
  * To create a group, a button is available that loads the
  * {@link GroupCreationTab}.
- *  
- * Project: envoy-client 
- * Project: envoy-client 
- * Project: client 
- * Project: envoy-client 
- * Project: envoy-client 
- * Project: envoy-client 
- * Project: envoy-client 
- * Project: envoy-client 
- * Project: envoy-client 
- * Project: envoy-client 
- * Project: client 
- * Project: envoy-client 
- * Project: client 
- * Project: envoy-client 
- * Project: envoy-client 
- * Project: client 
 	 * (i.e. can get all {@code JComponents} (Swing) or {@code Nodes} (JavaFX) in a
 	 * GUI class).
 	 *  
@@ -41,13 +36,11 @@ public final class ReflectionUtil {
 		return Arrays.stream(instance.getClass().getDeclaredFields()).filter(field -> typeToReturn.isAssignableFrom(field.getType())).map(field -> {
 			try {
 				field.setAccessible(true);
-				final var value = field.get(instance);
-				return value;
+				return typeToReturn.cast(field.get(instance));
 			} catch (IllegalArgumentException | IllegalAccessException e) {
 				throw new RuntimeException(e);
 			}
-		}).map(typeToReturn::cast);// field ->
-		// typeToReturn.isAssignableFrom(field.getClass())).map(typeToReturn::cast);
+		});
 	}
 
 	/**
diff --git a/client/src/main/java/envoy/client/util/package-info.java b/client/src/main/java/envoy/client/util/package-info.java
index c6b342e..77db956 100644
--- a/client/src/main/java/envoy/client/util/package-info.java
+++ b/client/src/main/java/envoy/client/util/package-info.java
@@ -1,9 +1,5 @@
 /**
  * This package contains utility classes for use in envoy-client.
- *  
- * Project: envoy-client 
- * Project: envoy-common 
- * Project: envoy-client 
  * All {@code ConfigItem}s are automatically mandatory.
- *  
- * Project: envoy-clientChess 
  * If the authentication is performed with a token, the token is stored instead
  * of the password.
- *  
- * Project: envoy-common 
  * These can be: {@link ElementOperation#ADD} or
- * {@link ElementOperation#REMOVE}. 
- * Project: envoy-common 
- * Project: common 
  * Possible actions are adding or removing certain {@link User}s to or from a
  * certain {@link Group}.
- *  
- * Project: envoy-common 
- * Project: envoy-client 
 	 * Currently set to 3.5 seconds.
 	 *
 	 * @since Envoy Common v0.2-beta
@@ -28,8 +25,8 @@ public final class IsTyping extends Event 
- * Project: common 
  * a) the server of the name change of a user or a group.
  * b) another user of this users name change.
  *
- * Project: envoy-common 
- * Project: envoy-common 
- * Project: common 
- * Project: envoy-common 
- * Project: envoy-common 
- * Project: envoy-common 
- * Project: envoy-common 
- * Project: envoy-client 
- * Project: envoy-client 
- * Project: envoy-server-standalone 
- * Project: envoy-server-standalone 
- * Project: server 
- * Project: envoy-server-standalone 
- * Project: envoy-server-standalone 
- * Project: envoy-server 
- * Project: envoy-server-standalone 
- * Project: envoy-server-standalone 
- * Project: envoy-server-standalone
- * File: Cache.java
- * Created: 6 Feb 2020
  *
  * @param 
- * File: CacheMap.java
- * Created: 09.07.2020
  *
  * @author Kai S. K. Engelbart
  * @since Envoy Client v0.1-beta
@@ -50,8 +46,10 @@ public final class CacheMap implements Serializable {
 	 */
 	public 
- * File: Chat.java
- * Created: 19 Oct 2019
  *
  * @author Maximilian Käfer
  * @author Leon Hofmeister
@@ -28,8 +21,9 @@ import envoy.event.MessageStatusChange;
  */
 public class Chat implements Serializable {
 
-	protected final Contact			recipient;
-	protected final List
- * File: ClientConfig.java
- * Created: 01.03.2020
  *
  * @author Kai S. K. Engelbart
  * @since Envoy Client v0.1-beta
diff --git a/client/src/main/java/envoy/client/data/Context.java b/client/src/main/java/envoy/client/data/Context.java
index a692f2e..a022ac3 100644
--- a/client/src/main/java/envoy/client/data/Context.java
+++ b/client/src/main/java/envoy/client/data/Context.java
@@ -2,16 +2,11 @@ package envoy.client.data;
 
 import javafx.stage.Stage;
 
-import envoy.client.net.Client;
-import envoy.client.net.WriteProxy;
+import envoy.client.net.*;
 import envoy.client.ui.SceneContext;
 
 /**
  * Provides access to commonly used objects.
- * 
- * File: Context.java
- * Created: 01.09.2020
  *
  * @author Leon Hofmeister
  * @since Envoy Client v0.2-beta
diff --git a/client/src/main/java/envoy/client/data/GroupChat.java b/client/src/main/java/envoy/client/data/GroupChat.java
index 39f5bd7..188709c 100644
--- a/client/src/main/java/envoy/client/data/GroupChat.java
+++ b/client/src/main/java/envoy/client/data/GroupChat.java
@@ -1,22 +1,15 @@
 package envoy.client.data;
 
-import java.io.IOException;
 import java.time.Instant;
 
 import envoy.client.net.WriteProxy;
-import envoy.data.Contact;
-import envoy.data.GroupMessage;
+import envoy.data.*;
 import envoy.data.Message.MessageStatus;
-import envoy.data.User;
 import envoy.event.GroupMessageStatusChange;
 
 /**
  * Represents a chat between a user and a group
  * as a list of messages.
- * 
- * File: GroupChat.java
- * Created: 05.07.2020
  *
  * @author Maximilian Käfer
  * @since Envoy Client v0.1-beta
@@ -38,7 +31,7 @@ public final class GroupChat extends Chat {
 	}
 
 	@Override
-	public void read(WriteProxy writeProxy) throws IOException {
+	public void read(WriteProxy writeProxy) {
 		for (int i = messages.size() - 1; i >= 0; --i) {
 			final GroupMessage gmsg = (GroupMessage) messages.get(i);
 			if (gmsg.getSenderID() != sender.getID()) if (gmsg.getMemberStatuses().get(sender.getID()) == MessageStatus.READ) break;
diff --git a/client/src/main/java/envoy/client/data/LocalDB.java b/client/src/main/java/envoy/client/data/LocalDB.java
index 82c007c..0e0da55 100644
--- a/client/src/main/java/envoy/client/data/LocalDB.java
+++ b/client/src/main/java/envoy/client/data/LocalDB.java
@@ -5,10 +5,13 @@ import java.nio.channels.*;
 import java.nio.file.StandardOpenOption;
 import java.time.Instant;
 import java.util.*;
-import java.util.logging.Level;
+import java.util.logging.*;
+
+import javafx.collections.*;
 
 import envoy.client.event.*;
 import envoy.data.*;
+import envoy.data.Message.MessageStatus;
 import envoy.event.*;
 import envoy.exception.EnvoyException;
 import envoy.util.*;
@@ -22,10 +25,6 @@ import dev.kske.eventbus.EventListener;
  * For message ID generation a {@link IDGenerator} is stored as well.
  * 
- * File: LocalDB.java
- * Created: 3 Feb 2020
  *
  * @author Kai S. K. Engelbart
  * @since Envoy Client v0.3-alpha
@@ -33,12 +32,12 @@ import dev.kske.eventbus.EventListener;
 public final class LocalDB implements EventListener {
 
 	// Data
-	private User				user;
-	private Map
- * File: Settings.java
- * Created: 11 Nov 2019
  *
  * @author Leon Hofmeister
  * @author Maximilian Käfer
diff --git a/client/src/main/java/envoy/client/data/SettingsItem.java b/client/src/main/java/envoy/client/data/SettingsItem.java
index 9261242..3837071 100644
--- a/client/src/main/java/envoy/client/data/SettingsItem.java
+++ b/client/src/main/java/envoy/client/data/SettingsItem.java
@@ -8,10 +8,6 @@ import javax.swing.JComponent;
 /**
  * Encapsulates a persistent value that is directly or indirectly mutable by the
  * user.
- * 
- * File: SettingsItem.java
- * Created: 23.12.2019
  *
  * @param 
- * File: AudioPlayer.java
- * Created: 05.07.2020
  *
  * @author Kai S. K. Engelbart
  * @since Envoy Client v0.1-beta
diff --git a/client/src/main/java/envoy/client/data/audio/AudioRecorder.java b/client/src/main/java/envoy/client/data/audio/AudioRecorder.java
index 251041a..38475ab 100644
--- a/client/src/main/java/envoy/client/data/audio/AudioRecorder.java
+++ b/client/src/main/java/envoy/client/data/audio/AudioRecorder.java
@@ -1,8 +1,7 @@
 package envoy.client.data.audio;
 
 import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
+import java.nio.file.*;
 
 import javax.sound.sampled.*;
 
@@ -10,10 +9,6 @@ import envoy.exception.EnvoyException;
 
 /**
  * Records audio and exports it as a byte array.
- * 
- * File: AudioRecorder.java
- * Created: 02.07.2020
  *
  * @author Kai S. K. Engelbart
  * @since Envoy Client v0.1-beta
diff --git a/client/src/main/java/envoy/client/data/audio/package-info.java b/client/src/main/java/envoy/client/data/audio/package-info.java
index 3a172be..5e80e64 100644
--- a/client/src/main/java/envoy/client/data/audio/package-info.java
+++ b/client/src/main/java/envoy/client/data/audio/package-info.java
@@ -1,9 +1,5 @@
 /**
  * Contains classes related to recording and playing back audio clips.
- * 
- * File: package-info.java
- * Created: 05.07.2020
  * 
  * @author Kai S. K. Engelbart
  * @since Envoy Client v0.1-beta
diff --git a/client/src/main/java/envoy/client/data/commands/OnCall.java b/client/src/main/java/envoy/client/data/commands/OnCall.java
index dc9c015..941b4fa 100644
--- a/client/src/main/java/envoy/client/data/commands/OnCall.java
+++ b/client/src/main/java/envoy/client/data/commands/OnCall.java
@@ -5,10 +5,6 @@ import java.util.function.Supplier;
 /**
  * This interface defines an action that should be performed when a system
  * command gets called.
- * 
- * File: OnCall.java
- * Created: 23.07.2020
  *
  * @author Leon Hofmeister
  * @since Envoy Client v0.2-beta
diff --git a/client/src/main/java/envoy/client/data/commands/SystemCommand.java b/client/src/main/java/envoy/client/data/commands/SystemCommand.java
index be13c83..a09bd69 100644
--- a/client/src/main/java/envoy/client/data/commands/SystemCommand.java
+++ b/client/src/main/java/envoy/client/data/commands/SystemCommand.java
@@ -1,10 +1,7 @@
 package envoy.client.data.commands;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-import java.util.function.Consumer;
-import java.util.function.Supplier;
+import java.util.*;
+import java.util.function.*;
 
 /**
  * This class is the base class of all {@code SystemCommands} and contains an
@@ -16,10 +13,6 @@ import java.util.function.Supplier;
  * function. This approach has one limitation:
  * Order matters! Changing the order of arguments will likely result in
  * unexpected behavior.
- * 
- * File: SystemCommand.java
- * Created: 16.07.2020
  *
  * @author Leon Hofmeister
  * @since Envoy Client v0.2-beta
diff --git a/client/src/main/java/envoy/client/data/commands/SystemCommandBuilder.java b/client/src/main/java/envoy/client/data/commands/SystemCommandBuilder.java
index 9623444..0768b5f 100644
--- a/client/src/main/java/envoy/client/data/commands/SystemCommandBuilder.java
+++ b/client/src/main/java/envoy/client/data/commands/SystemCommandBuilder.java
@@ -5,10 +5,6 @@ import java.util.function.Consumer;
 
 /**
  * This class acts as a builder for {@link SystemCommand}s.
- * 
- * File: SystemCommandBuilder.java
- * Created: 23.07.2020
  *
  * @author Leon Hofmeister
  * @since Envoy Client v0.2-beta
diff --git a/client/src/main/java/envoy/client/data/commands/SystemCommandMap.java b/client/src/main/java/envoy/client/data/commands/SystemCommandMap.java
index 35ff216..915807b 100644
--- a/client/src/main/java/envoy/client/data/commands/SystemCommandMap.java
+++ b/client/src/main/java/envoy/client/data/commands/SystemCommandMap.java
@@ -10,10 +10,6 @@ import envoy.util.EnvoyLog;
 
 /**
  * This class stores all {@link SystemCommand}s used.
- * 
- * File: SystemCommandMap.java
- * Created: 17.07.2020
  *
  * @author Leon Hofmeister
  * @since Envoy Client v0.2-beta
diff --git a/client/src/main/java/envoy/client/data/commands/package-info.java b/client/src/main/java/envoy/client/data/commands/package-info.java
index b3f2b4f..0be1b13 100644
--- a/client/src/main/java/envoy/client/data/commands/package-info.java
+++ b/client/src/main/java/envoy/client/data/commands/package-info.java
@@ -1,10 +1,6 @@
 /**
  * This package contains all classes that can be used as system commands.
  * Every system command can be called using a specific syntax:"/<command>"
- * 
- * File: package-info.java
- * Created: 16.07.2020
  *
  * @author Leon Hofmeister
  * @since Envoy Client v0.2-beta
diff --git a/client/src/main/java/envoy/client/event/BackEvent.java b/client/src/main/java/envoy/client/event/BackEvent.java
index 202e80f..ab40768 100644
--- a/client/src/main/java/envoy/client/event/BackEvent.java
+++ b/client/src/main/java/envoy/client/event/BackEvent.java
@@ -3,12 +3,8 @@ package envoy.client.event;
 import envoy.event.Event.Valueless;
 
 /**
- * This event serves the purpose to trigger the tab change to tab 0 in
+ * This event serves the purpose of triggering the tab change to tab 0 in
  * {@link envoy.client.ui.controller.ChatScene}.
- * 
- * File: BackEvent.java
- * Created: 23.08.2020
  *
  * @author Maximilian Käfer
  * @since Envoy Client v0.2-beta
diff --git a/client/src/main/java/envoy/client/event/EnvoyCloseEvent.java b/client/src/main/java/envoy/client/event/EnvoyCloseEvent.java
index cb9be17..dfe15ec 100644
--- a/client/src/main/java/envoy/client/event/EnvoyCloseEvent.java
+++ b/client/src/main/java/envoy/client/event/EnvoyCloseEvent.java
@@ -3,9 +3,9 @@ package envoy.client.event;
 import envoy.event.Event.Valueless;
 
 /**
- * This event will be sent once Envoy is really closed.
- * Its purpose is to forcefully stop other threads peacefully so that the VM can
- * shutdown too.
+ * This event notifies various Envoy components of the application being about
+ * to shut down. This allows the graceful closing of connections, persisting
+ * local data etc.
  *
  * @author Leon Hofmeister
  * @since Envoy Client v0.2-beta
diff --git a/client/src/main/java/envoy/client/event/SendEvent.java b/client/src/main/java/envoy/client/event/SendEvent.java
deleted file mode 100644
index f93e1d6..0000000
--- a/client/src/main/java/envoy/client/event/SendEvent.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package envoy.client.event;
-
-import envoy.event.Event;
-
-/**
- * Project: envoy-client
- * File: SendEvent.java
- * Created: 11.02.2020
- *
- * @author: Maximilian Käfer
- * @since Envoy Client v0.3-alpha
- */
-public final class SendEvent extends Event
- * File: ThemeChangeEvent.java
- * Created: 15 Dec 2019
+ * Notifies UI components of a theme change.
  *
  * @author Kai S. K. Engelbart
  * @since Envoy Client v0.2-alpha
diff --git a/client/src/main/java/envoy/client/net/Client.java b/client/src/main/java/envoy/client/net/Client.java
index 63a3e3b..0db43ef 100644
--- a/client/src/main/java/envoy/client/net/Client.java
+++ b/client/src/main/java/envoy/client/net/Client.java
@@ -6,22 +6,17 @@ import java.util.concurrent.TimeoutException;
 import java.util.logging.*;
 
 import envoy.client.data.*;
-import envoy.client.event.*;
+import envoy.client.event.EnvoyCloseEvent;
 import envoy.data.*;
 import envoy.event.*;
-import envoy.event.Event;
-import envoy.event.contact.*;
 import envoy.util.*;
 
 import dev.kske.eventbus.*;
+import dev.kske.eventbus.Event;
 
 /**
  * Establishes a connection to the server, performs a handshake and delivers
  * certain objects to the server.
- * 
- * File: Client.java
- * Created: 28 Sep 2019
  *
  * @author Kai S. K. Engelbart
  * @author Maximilian Käfer
@@ -79,8 +74,6 @@ public final class Client implements EventListener, Closeable {
 		// authentication token
 		receiver.registerProcessor(User.class, sender -> this.sender = sender);
 		receiver.registerProcessors(cacheMap.getMap());
-		receiver.registerProcessor(HandshakeRejection.class, evt -> { rejected = true; eventBus.dispatch(evt); });
-		receiver.registerProcessor(NewAuthToken.class, eventBus::dispatch);
 
 		rejected = false;
 
@@ -107,7 +100,6 @@ public final class Client implements EventListener, Closeable {
 		}
 
 		online = true;
-
 		logger.log(Level.INFO, "Handshake completed.");
 	}
 
@@ -128,56 +120,11 @@ public final class Client implements EventListener, Closeable {
 		// Remove all processors as they are only used during the handshake
 		receiver.removeAllProcessors();
 
-		// Process incoming messages
-		final var	receivedMessageProcessor			= new ReceivedMessageProcessor();
-		final var	receivedGroupMessageProcessor		= new ReceivedGroupMessageProcessor();
-		final var	messageStatusChangeProcessor		= new MessageStatusChangeProcessor();
-		final var	groupMessageStatusChangeProcessor	= new GroupMessageStatusChangeProcessor();
-
-		receiver.registerProcessor(GroupMessage.class, receivedGroupMessageProcessor);
-		receiver.registerProcessor(Message.class, receivedMessageProcessor);
-		receiver.registerProcessor(MessageStatusChange.class, messageStatusChangeProcessor);
-		receiver.registerProcessor(GroupMessageStatusChange.class, groupMessageStatusChangeProcessor);
-
 		// Relay cached messages and message status changes
-		cacheMap.get(Message.class).setProcessor(receivedMessageProcessor);
-		cacheMap.get(GroupMessage.class).setProcessor(receivedGroupMessageProcessor);
-		cacheMap.get(MessageStatusChange.class).setProcessor(messageStatusChangeProcessor);
-		cacheMap.get(GroupMessageStatusChange.class).setProcessor(groupMessageStatusChangeProcessor);
-
-		// Process user status changes
-		receiver.registerProcessor(UserStatusChange.class, eventBus::dispatch);
-
-		// Process message ID generation
-		receiver.registerProcessor(IDGenerator.class, localDB::setIDGenerator);
-
-		// Process name changes
-		receiver.registerProcessor(NameChange.class, evt -> { localDB.replaceContactName(evt); eventBus.dispatch(evt); });
-
-		// Process contact searches
-		receiver.registerProcessor(UserSearchResult.class, eventBus::dispatch);
-
-		// Process contact operations
-		receiver.registerProcessor(ContactOperation.class, eventBus::dispatch);
-
-		// Process group size changes
-		receiver.registerProcessor(GroupResize.class, evt -> { localDB.updateGroup(evt); eventBus.dispatch(evt); });
-
-		// Process IsTyping events
-		receiver.registerProcessor(IsTyping.class, eventBus::dispatch);
-
-		// Process PasswordChangeResults
-		receiver.registerProcessor(PasswordChangeResult.class, eventBus::dispatch);
-
-		// Process ProfilePicChanges
-		receiver.registerProcessor(ProfilePicChange.class, eventBus::dispatch);
-
-		// Process requests to not send any more attachments as they will not be shown
-		// to other users
-		receiver.registerProcessor(NoAttachments.class, eventBus::dispatch);
-
-		// Process group creation results - they might have been disabled on the server
-		receiver.registerProcessor(GroupCreationResult.class, eventBus::dispatch);
+		cacheMap.get(Message.class).setProcessor(eventBus::dispatch);
+		cacheMap.get(GroupMessage.class).setProcessor(eventBus::dispatch);
+		cacheMap.get(MessageStatusChange.class).setProcessor(eventBus::dispatch);
+		cacheMap.get(GroupMessageStatusChange.class).setProcessor(eventBus::dispatch);
 
 		// Request a generator if none is present or the existing one is consumed
 		if (!localDB.hasIDGenerator() || !localDB.getIDGenerator().hasNext()) requestIDGenerator();
@@ -186,56 +133,51 @@ public final class Client implements EventListener, Closeable {
 		cacheMap.getMap().values().forEach(Cache::relay);
 	}
 
+	/**
+	 * Sends an object to the server.
+	 *
+	 * @param obj the object to send
+	 * @throws IllegalStateException if the client is not online
+	 * @throws RuntimeException      if the object serialization failed
+	 * @since Envoy Client v0.2-beta
+	 */
+	public void send(Serializable obj) throws IllegalStateException, RuntimeException {
+		checkOnline();
+		logger.log(Level.FINE, "Sending " + obj);
+		try {
+			SerializationUtils.writeBytesWithLength(obj, socket.getOutputStream());
+		} catch (IOException e) {
+			throw new RuntimeException(e);
+		}
+	}
+
 	/**
 	 * Sends a message to the server. The message's status will be incremented once
 	 * it was delivered successfully.
 	 *
 	 * @param message the message to send
-	 * @throws IOException if the message does not reach the server
 	 * @since Envoy Client v0.3-alpha
 	 */
-	public void sendMessage(Message message) throws IOException {
-		writeObject(message);
+	public void sendMessage(Message message) {
+		send(message);
 		message.nextStatus();
 	}
 
-	/**
-	 * Sends an event to the server.
-	 *
-	 * @param evt the event to send
-	 * @throws IOException if the event did not reach the server
-	 * @since Envoy Client v0.3-alpha
-	 */
-	public void sendEvent(Event> evt) throws IOException { if (online) writeObject(evt); }
-
 	/**
 	 * Requests a new {@link IDGenerator} from the server.
 	 *
-	 * @throws IOException if the request does not reach the server
 	 * @since Envoy Client v0.3-alpha
 	 */
-	public void requestIDGenerator() throws IOException {
+	public void requestIDGenerator() {
 		logger.log(Level.INFO, "Requesting new id generator...");
-		writeObject(new IDGeneratorRequest());
+		send(new IDGeneratorRequest());
 	}
 
-	/**
-	 * Sends the value of a send event to the server.
-	 *
-	 * @param evt the send event to extract the value from
-	 * @since Envoy Client v0.2-beta
-	 */
-	@dev.kske.eventbus.Event
-	private void onSendEvent(SendEvent evt) {
-		try {
-			sendEvent(evt.get());
-		} catch (final IOException e) {
-			logger.log(Level.WARNING, "An error occurred when trying to send " + evt, e);
-		}
-	}
+	@Event(eventType = HandshakeRejection.class, priority = 1000)
+	private void onHandshakeRejection() { rejected = true; }
 
 	@Override
-	@dev.kske.eventbus.Event(eventType = EnvoyCloseEvent.class, priority = 800)
+	@Event(eventType = EnvoyCloseEvent.class, priority = 800)
 	public void close() {
 		if (online) {
 			logger.log(Level.INFO, "Closing connection...");
@@ -251,13 +193,13 @@ public final class Client implements EventListener, Closeable {
 		}
 	}
 
-	private void writeObject(Object obj) throws IOException {
-		checkOnline();
-		logger.log(Level.FINE, "Sending " + obj);
-		SerializationUtils.writeBytesWithLength(obj, socket.getOutputStream());
-	}
-
-	private void checkOnline() { if (!online) throw new IllegalStateException("Client is not online"); }
+	/**
+	 * Ensured that the client is online.
+	 *
+	 * @throws IllegalStateException if the client is not online
+	 * @since Envoy Client v0.3-alpha
+	 */
+	private void checkOnline() throws IllegalStateException { if (!online) throw new IllegalStateException("Client is not online"); }
 
 	/**
 	 * @return the {@link User} as which this client is logged in
diff --git a/client/src/main/java/envoy/client/net/GroupMessageStatusChangeProcessor.java b/client/src/main/java/envoy/client/net/GroupMessageStatusChangeProcessor.java
deleted file mode 100644
index cd365d7..0000000
--- a/client/src/main/java/envoy/client/net/GroupMessageStatusChangeProcessor.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package envoy.client.net;
-
-import java.util.function.Consumer;
-import java.util.logging.Logger;
-
-import envoy.data.Message.MessageStatus;
-import envoy.event.GroupMessageStatusChange;
-import envoy.util.EnvoyLog;
-
-import dev.kske.eventbus.EventBus;
-
-/**
- * Project: envoy-client
- * File: GroupMessageStatusChangePocessor.java
- * Created: 03.07.2020
- *
- * @author Maximilian Käfer
- * @since Envoy Client v0.1-beta
- */
-public final class GroupMessageStatusChangeProcessor implements Consumer
- * File: MessageStatusChangeProcessor.java
- * Created: 4 Feb 2020
- *
- * @author Kai S. K. Engelbart
- * @since Envoy Client v0.3-alpha
- */
-public final class MessageStatusChangeProcessor implements Consumer
- * File: ReceivedGroupMessageProcessor.java
- * Created: 13.06.2020
- *
- * @author Maximilian Käfer
- * @since Envoy Client v0.1-beta
- */
-public final class ReceivedGroupMessageProcessor implements Consumer
- * File: ReceivedMessageProcessor.java
- * Created: 31.12.2019
- *
- * @author Kai S. K. Engelbart
- * @since Envoy Client v0.3-alpha
- */
-public final class ReceivedMessageProcessor implements Consumer
- * File: Receiver.java
- * Created: 30.12.2019
  *
  * @author Kai S. K. Engelbart
  * @since Envoy Client v0.3-alpha
@@ -26,7 +24,8 @@ public final class Receiver extends Thread {
 	private final InputStream					in;
 	private final Map
- * File: WriteProxy.java
- * Created: 6 Feb 2020
  *
  * @author Kai S. K. Engelbart
  * @since Envoy Client v0.3-alpha
@@ -44,20 +37,12 @@ public final class WriteProxy {
 
 		// Initialize cache processors for messages and message status change events
 		localDB.getCacheMap().get(Message.class).setProcessor(msg -> {
-			try {
-				logger.log(Level.FINER, "Sending cached " + msg);
-				client.sendMessage(msg);
-			} catch (final IOException e) {
-				logger.log(Level.SEVERE, "Could not send cached message: ", e);
-			}
+			logger.log(Level.FINER, "Sending cached " + msg);
+			client.sendMessage(msg);
 		});
 		localDB.getCacheMap().get(MessageStatusChange.class).setProcessor(evt -> {
 			logger.log(Level.FINER, "Sending cached " + evt);
-			try {
-				client.sendEvent(evt);
-			} catch (final IOException e) {
-				logger.log(Level.SEVERE, "Could not send cached message status change event: ", e);
-			}
+			client.send(evt);
 		});
 	}
 
@@ -74,10 +59,9 @@ public final class WriteProxy {
 	 * inside the local database.
 	 *
 	 * @param message the message to send
-	 * @throws IOException if the message could not be sent
 	 * @since Envoy Client v0.3-alpha
 	 */
-	public void writeMessage(Message message) throws IOException {
+	public void writeMessage(Message message) {
 		if (client.isOnline()) client.sendMessage(message);
 		else localDB.getCacheMap().getApplicable(Message.class).accept(message);
 	}
@@ -87,11 +71,10 @@ public final class WriteProxy {
 	 * event is cached inside the local database.
 	 *
 	 * @param evt the event to send
-	 * @throws IOException if the event could not be sent
 	 * @since Envoy Client v0.3-alpha
 	 */
-	public void writeMessageStatusChange(MessageStatusChange evt) throws IOException {
-		if (client.isOnline()) client.sendEvent(evt);
+	public void writeMessageStatusChange(MessageStatusChange evt) {
+		if (client.isOnline()) client.send(evt);
 		else localDB.getCacheMap().getApplicable(MessageStatusChange.class).accept(evt);
 	}
 }
diff --git a/client/src/main/java/envoy/client/ui/ClearableTextField.java b/client/src/main/java/envoy/client/ui/ClearableTextField.java
deleted file mode 100644
index 9568629..0000000
--- a/client/src/main/java/envoy/client/ui/ClearableTextField.java
+++ /dev/null
@@ -1,169 +0,0 @@
-package envoy.client.ui;
-
-import javafx.beans.property.BooleanProperty;
-import javafx.beans.property.ObjectProperty;
-import javafx.beans.property.StringProperty;
-import javafx.event.ActionEvent;
-import javafx.event.EventHandler;
-import javafx.scene.control.*;
-import javafx.scene.image.ImageView;
-import javafx.scene.layout.Background;
-import javafx.scene.layout.ColumnConstraints;
-import javafx.scene.layout.GridPane;
-
-/**
- * This class offers a text field that is automatically equipped with a clear
- * button.
- * 
- * File: ClearableTextField.java
- * Created: 25.06.2020
- *
- * @author Leon Hofmeister
- * @since Envoy Client v0.1-beta
- */
-public final class ClearableTextField extends GridPane {
-
-	private final TextField textField;
-
-	private final Button clearButton;
-
-	/**
-	 * Constructs a new {@code ClearableTextField} with no initial text and icon
-	 * size 16.
-	 *
-	 * @since Envoy Client v0.1-beta
-	 */
-	public ClearableTextField() { this("", 16); }
-
-	/**
-	 * Constructs a new {@code ClearableTextField} with initial text and a
-	 * predetermined icon size.
-	 *
-	 * @param text the text that should be displayed by default
-	 * @param size the size of the icon
-	 * @since Envoy Client v0.1-beta
-	 */
-	public ClearableTextField(String text, int size) {
-		// initializing the textField and the button
-		textField	= new TextField(text);
-		clearButton	= new Button("", new ImageView(IconUtil.loadIconThemeSensitive("clear_button", size)));
-		clearButton.setOnAction(e -> textField.clear());
-		clearButton.setFocusTraversable(false);
-		clearButton.getStyleClass().clear();
-		clearButton.setBackground(Background.EMPTY);
-		// Adding the two elements to the GridPane
-		add(textField, 0, 0, 2, 1);
-		add(clearButton, 1, 0, 1, 1);
-		// Setting the percent - widths of the two columns.
-		// Used to locate the button on the right.
-		final var columnConstraints = new ColumnConstraints();
-		columnConstraints.setPercentWidth(90);
-		getColumnConstraints().add(columnConstraints);
-		final var columnConstraints2 = new ColumnConstraints();
-		columnConstraints2.setPercentWidth(10);
-		getColumnConstraints().add(columnConstraints2);
-	}
-
-	/**
-	 * @return the underlying {@code textField}
-	 * @since Envoy Client v0.1-beta
-	 */
-	public TextField getTextField() { return textField; }
-
-	/**
-	 * This method offers the freedom to perform custom actions when the
-	 * {@code clearButton} has been pressed.
-	 *   e -> {clearableTextField.getTextField().clear();}
-	 *
-	 * @param onClearButtonAction the action that should be performed
-	 * @since Envoy Client v0.1-beta
-	 */
-	public void setClearButtonListener(EventHandler
- * File: ListViewRefresh.java
- * Created: 16.07.2020
- *
- * @author Leon Hofmeister
- * @since Envoy Client v0.1-beta
- */
-public final class ListViewRefresh {
-
-	private ListViewRefresh() {}
-
-	/**
-	 * Deeply refreshes a {@code listview}, meaning it recomputes every single of
-	 * its {@link ListCell}s.
-	 * 
- * File: Restorable.java
- * Created: 03.07.2020
  *
  * @author Leon Hofmeister
  * @since Envoy Client v0.1-beta
diff --git a/client/src/main/java/envoy/client/ui/SceneContext.java b/client/src/main/java/envoy/client/ui/SceneContext.java
index 67dcc20..30a02cb 100644
--- a/client/src/main/java/envoy/client/ui/SceneContext.java
+++ b/client/src/main/java/envoy/client/ui/SceneContext.java
@@ -24,10 +24,6 @@ import dev.kske.eventbus.*;
  * 
- * File: SceneContext.java
- * Created: 06.06.2020
  *
  * @author Kai S. K. Engelbart
  * @since Envoy Client v0.1-beta
diff --git a/client/src/main/java/envoy/client/ui/Startup.java b/client/src/main/java/envoy/client/ui/Startup.java
index 9411644..61ee954 100644
--- a/client/src/main/java/envoy/client/ui/Startup.java
+++ b/client/src/main/java/envoy/client/ui/Startup.java
@@ -15,6 +15,7 @@ import envoy.client.helper.ShutdownHelper;
 import envoy.client.net.Client;
 import envoy.client.ui.SceneContext.SceneInfo;
 import envoy.client.ui.controller.LoginScene;
+import envoy.client.util.IconUtil;
 import envoy.data.*;
 import envoy.data.User.UserStatus;
 import envoy.event.*;
@@ -23,10 +24,6 @@ import envoy.util.EnvoyLog;
 
 /**
  * Handles application startup.
- * 
- * File: Startup.java
- * Created: 26.03.2020
  *
  * @author Kai S. K. Engelbart
  * @author Maximilian Käfer
diff --git a/client/src/main/java/envoy/client/ui/StatusTrayIcon.java b/client/src/main/java/envoy/client/ui/StatusTrayIcon.java
index 53859dc..7fbbe40 100644
--- a/client/src/main/java/envoy/client/ui/StatusTrayIcon.java
+++ b/client/src/main/java/envoy/client/ui/StatusTrayIcon.java
@@ -7,16 +7,13 @@ import javafx.application.Platform;
 import javafx.stage.Stage;
 
 import envoy.client.helper.ShutdownHelper;
+import envoy.client.util.IconUtil;
 import envoy.data.Message;
 
 import dev.kske.eventbus.*;
 import dev.kske.eventbus.Event;
 
 /**
- * Project: envoy-client
- * File: StatusTrayIcon.java
- * Created: 3 Dec 2019
- *
  * @author Kai S. K. Engelbart
  * @since Envoy Client v0.2-alpha
  */
@@ -33,7 +30,7 @@ public final class StatusTrayIcon implements EventListener {
 	 * A received {@link Message} is only displayed as a system tray notification if
 	 * this variable is set to {@code true}.
 	 */
-	private boolean displayMessages = false;
+	private boolean displayMessages;
 
 	/**
 	 * @return {@code true} if the status tray icon is supported on this platform
@@ -91,10 +88,10 @@ public final class StatusTrayIcon implements EventListener {
 	public void hide() { SystemTray.getSystemTray().remove(trayIcon); }
 
 	@Event
-	private void onMessage(Message evt) {
+	private void onMessage(Message message) {
 		if (displayMessages) trayIcon.displayMessage(
-				evt.hasAttachment() ? "New " + evt.getAttachment().getType().toString().toLowerCase() + " message received" : "New message received",
-				evt.getText(),
+				message.hasAttachment() ? "New " + message.getAttachment().getType().toString().toLowerCase() + " message received" : "New message received",
+				message.getText(),
 				MessageType.INFO);
 	}
 }
diff --git a/client/src/main/java/envoy/client/ui/AudioControl.java b/client/src/main/java/envoy/client/ui/control/AudioControl.java
similarity index 76%
rename from client/src/main/java/envoy/client/ui/AudioControl.java
rename to client/src/main/java/envoy/client/ui/control/AudioControl.java
index d82fd24..fc2263b 100644
--- a/client/src/main/java/envoy/client/ui/AudioControl.java
+++ b/client/src/main/java/envoy/client/ui/control/AudioControl.java
@@ -1,11 +1,9 @@
-package envoy.client.ui;
+package envoy.client.ui.control;
 
-import java.util.logging.Level;
-import java.util.logging.Logger;
+import java.util.logging.*;
 
-import javafx.scene.control.Alert;
+import javafx.scene.control.*;
 import javafx.scene.control.Alert.AlertType;
-import javafx.scene.control.Button;
 import javafx.scene.layout.HBox;
 
 import envoy.client.data.audio.AudioPlayer;
@@ -14,10 +12,6 @@ import envoy.util.EnvoyLog;
 
 /**
  * Enables the play back of audio clips through a button.
- * 
- * File: AudioControl.java
- * Created: 05.07.2020
  *
  * @author Kai S. K. Engelbart
  * @since Envoy Client v0.1-beta
diff --git a/client/src/main/java/envoy/client/ui/listcell/ChatControl.java b/client/src/main/java/envoy/client/ui/control/ChatControl.java
similarity index 64%
rename from client/src/main/java/envoy/client/ui/listcell/ChatControl.java
rename to client/src/main/java/envoy/client/ui/control/ChatControl.java
index 402ef5d..eca5cb5 100644
--- a/client/src/main/java/envoy/client/ui/listcell/ChatControl.java
+++ b/client/src/main/java/envoy/client/ui/control/ChatControl.java
@@ -1,23 +1,17 @@
-package envoy.client.ui.listcell;
+package envoy.client.ui.control;
 
-import javafx.geometry.Insets;
-import javafx.geometry.Pos;
+import javafx.geometry.*;
 import javafx.scene.control.Label;
-import javafx.scene.image.ImageView;
+import javafx.scene.image.*;
 import javafx.scene.layout.*;
 import javafx.scene.shape.Rectangle;
 
-import envoy.client.data.Chat;
-import envoy.client.ui.IconUtil;
-import envoy.data.Group;
+import envoy.client.data.*;
+import envoy.client.util.IconUtil;
 
 /**
  * Displays a chat using a contact control for the recipient and a label for the
  * unread message count.
- * 
- * File: ContactControl.java
- * Created: 01.07.2020
  *
  * @see ContactControl
  * @author Leon Hofmeister
@@ -25,6 +19,9 @@ import envoy.data.Group;
  */
 public final class ChatControl extends HBox {
 
+	private static final Image userIcon = IconUtil.loadIconThemeSensitive("user_icon", 32),
+			groupIcon = IconUtil.loadIconThemeSensitive("group_icon", 32);
+
 	/**
 	 * @param chat the chat to display
 	 * @since Envoy Client v0.1-beta
@@ -32,10 +29,9 @@ public final class ChatControl extends HBox {
 	public ChatControl(Chat chat) {
 		setAlignment(Pos.CENTER_LEFT);
 		setPadding(new Insets(0, 0, 3, 0));
-		// profile pic
-		ImageView contactProfilePic;
-		if (chat.getRecipient() instanceof Group) contactProfilePic = new ImageView(IconUtil.loadIconThemeSensitive("group_icon", 32));
-		else contactProfilePic = new ImageView(IconUtil.loadIconThemeSensitive("user_icon", 32));
+
+		// Profile picture
+		ImageView	contactProfilePic	= new ImageView(chat instanceof GroupChat ? groupIcon : userIcon);
 		final var clip = new Rectangle();
 		clip.setWidth(32);
 		clip.setHeight(32);
@@ -43,14 +39,17 @@ public final class ChatControl extends HBox {
 		clip.setArcWidth(32);
 		contactProfilePic.setClip(clip);
 		getChildren().add(contactProfilePic);
-		// spacing
+
+		// Spacing
 		final var leftSpacing = new Region();
 		leftSpacing.setPrefSize(8, 0);
 		leftSpacing.setMinSize(8, 0);
 		leftSpacing.setMaxSize(8, 0);
 		getChildren().add(leftSpacing);
+
 		// Contact control
 		getChildren().add(new ContactControl(chat.getRecipient()));
+
 		// Unread messages
 		if (chat.getUnreadAmount() != 0) {
 			final var spacing = new Region();
@@ -58,12 +57,12 @@ public final class ChatControl extends HBox {
 			getChildren().add(spacing);
 			final var unreadMessagesLabel = new Label(Integer.toString(chat.getUnreadAmount()));
 			unreadMessagesLabel.setMinSize(15, 15);
-			final var vBox2 = new VBox();
-			vBox2.setAlignment(Pos.CENTER_RIGHT);
+			final var vbox = new VBox();
+			vbox.setAlignment(Pos.CENTER_RIGHT);
 			unreadMessagesLabel.setAlignment(Pos.CENTER);
 			unreadMessagesLabel.getStyleClass().add("unread-messages-amount");
-			vBox2.getChildren().add(unreadMessagesLabel);
-			getChildren().add(vBox2);
+			vbox.getChildren().add(unreadMessagesLabel);
+			getChildren().add(vbox);
 		}
 		getStyleClass().add("list-element");
 	}
diff --git a/client/src/main/java/envoy/client/ui/listcell/ContactControl.java b/client/src/main/java/envoy/client/ui/control/ContactControl.java
similarity index 81%
rename from client/src/main/java/envoy/client/ui/listcell/ContactControl.java
rename to client/src/main/java/envoy/client/ui/control/ContactControl.java
index f7a8999..8a85739 100644
--- a/client/src/main/java/envoy/client/ui/listcell/ContactControl.java
+++ b/client/src/main/java/envoy/client/ui/control/ContactControl.java
@@ -1,19 +1,14 @@
-package envoy.client.ui.listcell;
+package envoy.client.ui.control;
 
 import javafx.scene.control.Label;
 import javafx.scene.layout.VBox;
 
-import envoy.data.Contact;
-import envoy.data.User;
+import envoy.data.*;
 
 /**
  * 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).
- * 
- * File: ContactControl.java
- * Created: 13.07.2020
  *
  * @author Kai S. K. Engelbart
  * @since Envoy Client v0.2-beta
diff --git a/client/src/main/java/envoy/client/ui/listcell/MessageControl.java b/client/src/main/java/envoy/client/ui/control/MessageControl.java
similarity index 88%
rename from client/src/main/java/envoy/client/ui/listcell/MessageControl.java
rename to client/src/main/java/envoy/client/ui/control/MessageControl.java
index ff4674e..11f5681 100644
--- a/client/src/main/java/envoy/client/ui/listcell/MessageControl.java
+++ b/client/src/main/java/envoy/client/ui/control/MessageControl.java
@@ -1,4 +1,4 @@
-package envoy.client.ui.listcell;
+package envoy.client.ui.control;
 
 import java.awt.Toolkit;
 import java.awt.datatransfer.StringSelection;
@@ -6,37 +6,23 @@ import java.io.*;
 import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
 import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+import java.util.logging.*;
 
-import javafx.geometry.Insets;
-import javafx.geometry.Pos;
-import javafx.scene.control.ContextMenu;
-import javafx.scene.control.Label;
-import javafx.scene.control.MenuItem;
-import javafx.scene.image.Image;
-import javafx.scene.image.ImageView;
+import javafx.geometry.*;
+import javafx.scene.control.*;
+import javafx.scene.image.*;
 import javafx.scene.layout.*;
 import javafx.stage.FileChooser;
 
-import envoy.client.data.Context;
-import envoy.client.data.LocalDB;
-import envoy.client.data.Settings;
-import envoy.client.ui.AudioControl;
-import envoy.client.ui.IconUtil;
-import envoy.client.ui.SceneContext;
-import envoy.data.GroupMessage;
-import envoy.data.Message;
+import envoy.client.data.*;
+import envoy.client.ui.*;
+import envoy.client.util.IconUtil;
+import envoy.data.*;
 import envoy.data.Message.MessageStatus;
-import envoy.data.User;
 import envoy.util.EnvoyLog;
 
 /**
- * This class formats a single {@link Message} into a UI component.
- * 
- * File: MessageControl.java
- * Created: 01.07.2020
+ * This class transforms a single {@link Message} into a UI component.
  *
  * @author Leon Hofmeister
  * @author Maximilian Käfer
@@ -95,6 +81,7 @@ public final class MessageControl extends Label {
 		contextMenu.getItems().addAll(copyMenuItem, deleteMenuItem, forwardMenuItem, quoteMenuItem, infoMenuItem);
 
 		// Handling message attachment display
+		// TODO: Add missing attachment types
 		if (message.hasAttachment()) {
 			switch (message.getAttachment().getType()) {
 				case PICTURE:
diff --git a/client/src/main/java/envoy/client/ui/custom/ProfilePicImageView.java b/client/src/main/java/envoy/client/ui/control/ProfilePicImageView.java
similarity index 85%
rename from client/src/main/java/envoy/client/ui/custom/ProfilePicImageView.java
rename to client/src/main/java/envoy/client/ui/control/ProfilePicImageView.java
index 4708974..778b026 100644
--- a/client/src/main/java/envoy/client/ui/custom/ProfilePicImageView.java
+++ b/client/src/main/java/envoy/client/ui/control/ProfilePicImageView.java
@@ -1,15 +1,10 @@
-package envoy.client.ui.custom;
+package envoy.client.ui.control;
 
-import javafx.scene.image.Image;
-import javafx.scene.image.ImageView;
+import javafx.scene.image.*;
 import javafx.scene.shape.Rectangle;
 
 /**
  * Provides a set of convenience constructors for images that are displayed as profile pictures.
- * 
- * File: ProfilePicImageView.java
- * Created: 30.07.2020
  *
  * @author Leon Hofmeister
  * @since Envoy Client v0.2-beta
diff --git a/client/src/main/java/envoy/client/ui/custom/TextInputContextMenu.java b/client/src/main/java/envoy/client/ui/control/TextInputContextMenu.java
similarity index 95%
rename from client/src/main/java/envoy/client/ui/custom/TextInputContextMenu.java
rename to client/src/main/java/envoy/client/ui/control/TextInputContextMenu.java
index 02b1889..9925f7d 100644
--- a/client/src/main/java/envoy/client/ui/custom/TextInputContextMenu.java
+++ b/client/src/main/java/envoy/client/ui/control/TextInputContextMenu.java
@@ -1,4 +1,4 @@
-package envoy.client.ui.custom;
+package envoy.client.ui.control;
 
 import java.util.function.Consumer;
 
@@ -21,10 +21,6 @@ import javafx.scene.input.Clipboard;
  * 
- * File: TextInputContextMenu.java
- * Created: 20.09.2020
  *
  * @author Leon Hofmeister
  * @since Envoy Client v0.2-beta
diff --git a/client/src/main/java/envoy/client/ui/control/package-info.java b/client/src/main/java/envoy/client/ui/control/package-info.java
new file mode 100644
index 0000000..6a091d0
--- /dev/null
+++ b/client/src/main/java/envoy/client/ui/control/package-info.java
@@ -0,0 +1,9 @@
+/**
+ * Defines custom UI controls.
+ *
+ * @author Kai S. K. Engelbart
+ * @author Leon Hofmeister
+ * @author Maximilian Käfer
+ * @since Envoy Client v0.2-beta
+ */
+package envoy.client.ui.control;
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 f7f5b35..0aa705d 100644
--- a/client/src/main/java/envoy/client/ui/controller/ChatScene.java
+++ b/client/src/main/java/envoy/client/ui/controller/ChatScene.java
@@ -11,7 +11,7 @@ import java.util.logging.*;
 
 import javafx.animation.RotateTransition;
 import javafx.application.Platform;
-import javafx.collections.*;
+import javafx.collections.ObservableList;
 import javafx.collections.transformation.FilteredList;
 import javafx.fxml.*;
 import javafx.scene.control.*;
@@ -32,9 +32,9 @@ import envoy.client.helper.ShutdownHelper;
 import envoy.client.net.*;
 import envoy.client.ui.*;
 import envoy.client.ui.SceneContext.SceneInfo;
-import envoy.client.ui.custom.TextInputContextMenu;
+import envoy.client.ui.control.*;
 import envoy.client.ui.listcell.*;
-import envoy.client.util.ReflectionUtil;
+import envoy.client.util.*;
 import envoy.data.*;
 import envoy.data.Attachment.AttachmentType;
 import envoy.data.Message.MessageStatus;
@@ -47,9 +47,7 @@ import dev.kske.eventbus.*;
 import dev.kske.eventbus.Event;
 
 /**
- * Project: envoy-client
- * File: ChatSceneController.java
- * Created: 26.03.2020
+ * Controller for the chat scene.
  *
  * @author Kai S. K. Engelbart
  * @since Envoy Client v0.1-beta
@@ -171,7 +169,8 @@ public final class ChatScene implements EventListener, Restorable {
 		messageList.setCellFactory(MessageListCell::new);
 		chatList.setCellFactory(new ListCellFactory<>(ChatControl::new));
 
-		// JavaFX provides an internal way of populating the context menu of a textarea.
+		// JavaFX provides an internal way of populating the context menu of a text
+		// area.
 		// We, however, need additional functionality.
 		messageTextArea.setContextMenu(new TextInputContextMenu(messageTextArea, e -> checkKeyCombination(null)));
 
@@ -190,7 +189,7 @@ public final class ChatScene implements EventListener, Restorable {
 		clip.setArcWidth(43);
 		clientProfilePic.setClip(clip);
 
-		chatList.setItems(chats = new FilteredList<>(FXCollections.observableList(localDB.getChats())));
+		chatList.setItems(chats = new FilteredList<>(localDB.getChats()));
 		contactLabel.setText(localDB.getUser().getName());
 
 		initializeSystemCommandsMap();
@@ -205,8 +204,8 @@ public final class ChatScene implements EventListener, Restorable {
 				Tooltip.uninstall(contactSpecificOnlineOperations, onlyIfOnlineTooltip);
 				contactSearchTab.setContent(new FXMLLoader().load(getClass().getResourceAsStream("/fxml/ContactSearchTab.fxml")));
 				groupCreationTab.setContent(new FXMLLoader().load(getClass().getResourceAsStream("/fxml/GroupCreationTab.fxml")));
-			} catch (final IOException e2) {
-				logger.log(Level.SEVERE, "An error occurred when attempting to load tabs: ", e2);
+			} catch (final IOException e) {
+				logger.log(Level.SEVERE, "An error occurred when attempting to load tabs: ", e);
 			}
 			else {
 				Tooltip.install(contactSpecificOnlineOperations, onlyIfOnlineTooltip);
@@ -232,12 +231,8 @@ public final class ChatScene implements EventListener, Restorable {
 
 			// Read current chat or increment unread amount
 			if (chat.equals(currentChat)) {
-				try {
-					currentChat.read(writeProxy);
-				} catch (final IOException e) {
-					logger.log(Level.WARNING, "Could not read current chat: ", e);
-				}
-				Platform.runLater(() -> { ListViewRefresh.deepRefresh(messageList); scrollToMessageListEnd(); });
+				currentChat.read(writeProxy);
+				Platform.runLater(this::scrollToMessageListEnd);
 			} else if (!ownMessage && message.getStatus() != MessageStatus.READ) chat.incrementUnreadAmount();
 
 			// Move chat with most recent unread messages to the top
@@ -252,33 +247,16 @@ public final class ChatScene implements EventListener, Restorable {
 
 	@Event
 	private void onMessageStatusChange(MessageStatusChange evt) {
-		localDB.getMessage(evt.getID()).ifPresent(message -> {
-			message.setStatus(evt.get());
-			// Update UI if in current chat and the current user was the sender of the
-			// message
-			if (currentChat != null && message.getSenderID() == client.getSender().getID()) Platform.runLater(messageList::refresh);
-		});
+
+		// Update UI if in current chat and the current user was the sender of the
+		// message
+		if (currentChat != null) localDB.getMessage(evt.getID())
+			.filter(msg -> msg.getSenderID() == client.getSender().getID())
+			.ifPresent(msg -> Platform.runLater(messageList::refresh));
 	}
 
-	@Event
-	private void onGroupMessageStatusChange(GroupMessageStatusChange evt) {
-		localDB.getMessage(evt.getID()).ifPresent(groupMessage -> {
-			((GroupMessage) groupMessage).getMemberStatuses().replace(evt.getMemberID(), evt.get());
-
-			// Update UI if in current chat
-			if (currentChat != null && groupMessage.getRecipientID() == currentChat.getRecipient().getID()) Platform.runLater(messageList::refresh);
-		});
-	}
-
-	@Event
-	private void onUserStatusChange(UserStatusChange evt) {
-		chats.getSource()
-			.stream()
-			.filter(c -> c.getRecipient().getID() == evt.getID())
-			.findAny()
-			.map(Chat::getRecipient)
-			.ifPresent(u -> { ((User) u).setStatus(evt.get()); Platform.runLater(() -> ListViewRefresh.deepRefresh(chatList)); });
-	}
+	@Event(eventType = UserStatusChange.class)
+	private void onUserStatusChange() { Platform.runLater(chatList::refresh); }
 
 	@Event
 	private void onContactOperation(ContactOperation operation) {
@@ -322,6 +300,7 @@ public final class ChatScene implements EventListener, Restorable {
 		clientProfilePic.setImage(IconUtil.loadIconThemeSensitive("user_icon", 43));
 		chatList.setCellFactory(new ListCellFactory<>(ChatControl::new));
 		messageList.setCellFactory(MessageListCell::new);
+		// TODO: cache image
 		if (currentChat.getRecipient() instanceof User) recipientProfilePic.setImage(IconUtil.loadIconThemeSensitive("user_icon", 43));
 		else recipientProfilePic.setImage(IconUtil.loadIconThemeSensitive("group_icon", 43));
 	}
@@ -379,18 +358,14 @@ public final class ChatScene implements EventListener, Restorable {
 			// Load the chat
 			currentChat = localDB.getChat(user.getID()).get();
 
-			messageList.setItems(FXCollections.observableList(currentChat.getMessages()));
+			messageList.setItems(currentChat.getMessages());
 			final var scrollIndex = messageList.getItems().size() - currentChat.getUnreadAmount();
 			messageList.scrollTo(scrollIndex);
 			logger.log(Level.FINEST, "Loading chat with " + user + " at index " + scrollIndex);
 			deleteContactMenuItem.setText("Delete " + user.getName());
 
 			// Read the current chat
-			try {
-				currentChat.read(writeProxy);
-			} catch (final IOException e) {
-				logger.log(Level.WARNING, "Could not read current chat.", e);
-			}
+			currentChat.read(writeProxy);
 
 			// Discard the pending attachment
 			if (recorder.isRecording()) {
@@ -574,8 +549,8 @@ public final class ChatScene implements EventListener, Restorable {
 
 		// Sending an IsTyping event if none has been sent for
 		// IsTyping#millisecondsActive
-		if (currentChat.getLastWritingEvent() + IsTyping.millisecondsActive <= System.currentTimeMillis()) {
-			eventBus.dispatch(new SendEvent(new IsTyping(getChatID(), currentChat.getRecipient().getID())));
+		if (client.isOnline() && currentChat.getLastWritingEvent() + IsTyping.millisecondsActive <= System.currentTimeMillis()) {
+			client.send(new IsTyping(getChatID(), currentChat.getRecipient().getID()));
 			currentChat.lastWritingEventWasNow();
 		}
 
@@ -684,7 +659,7 @@ public final class ChatScene implements EventListener, Restorable {
 			return;
 		}
 		final var text = messageTextArea.getText().strip();
-		if (!messageTextAreaCommands.executeIfAnyPresent(text)) try {
+		if (!messageTextAreaCommands.executeIfAnyPresent(text)) {
 			// Creating the message and its metadata
 			final var builder = new MessageBuilder(localDB.getUser().getID(), currentChat.getRecipient().getID(), localDB.getIDGenerator())
 				.setText(text);
@@ -711,15 +686,10 @@ public final class ChatScene implements EventListener, Restorable {
 				localDB.getChats().remove(currentChat);
 				localDB.getChats().add(0, currentChat);
 			});
-			ListViewRefresh.deepRefresh(messageList);
 			scrollToMessageListEnd();
 
 			// Request a new ID generator if all IDs were used
 			if (!localDB.getIDGenerator().hasNext() && client.isOnline()) client.requestIDGenerator();
-
-		} catch (final IOException e) {
-			logger.log(Level.SEVERE, "Error while sending message: ", e);
-			new Alert(AlertType.ERROR, "An error occured while sending the message!").showAndWait();
 		}
 
 		// Clear text field and disable post button
diff --git a/client/src/main/java/envoy/client/ui/controller/ContactSearchTab.java b/client/src/main/java/envoy/client/ui/controller/ContactSearchTab.java
index a6aec3e..b573345 100644
--- a/client/src/main/java/envoy/client/ui/controller/ContactSearchTab.java
+++ b/client/src/main/java/envoy/client/ui/controller/ContactSearchTab.java
@@ -7,9 +7,12 @@ import javafx.fxml.FXML;
 import javafx.scene.control.*;
 import javafx.scene.control.Alert.AlertType;
 
-import envoy.client.event.*;
+import envoy.client.data.Context;
+import envoy.client.event.BackEvent;
 import envoy.client.helper.AlertHelper;
-import envoy.client.ui.listcell.*;
+import envoy.client.net.Client;
+import envoy.client.ui.control.ContactControl;
+import envoy.client.ui.listcell.ListCellFactory;
 import envoy.data.User;
 import envoy.event.ElementOperation;
 import envoy.event.contact.*;
@@ -26,10 +29,6 @@ import dev.kske.eventbus.*;
  * 
- * File: ContactSearchScene.java
- * Created: 07.06.2020
  *
  * @author Leon Hofmeister
  * @author Maximilian Käfer
@@ -47,6 +46,7 @@ public class ContactSearchTab implements EventListener {
 
 	private final Alert alert = new Alert(AlertType.CONFIRMATION);
 
+	private static final Client		client		= Context.getInstance().getClient();
 	private static final EventBus	eventBus	= EventBus.getInstance();
 	private static final Logger		logger		= EnvoyLog.getLogger(ChatScene.class);
 
@@ -79,7 +79,7 @@ public class ContactSearchTab implements EventListener {
 	@FXML
 	private void sendRequest() {
 		final var text = searchBar.getText().strip();
-		if (!text.isBlank()) eventBus.dispatch(new SendEvent(new UserSearchRequest(text)));
+		if (!text.isBlank()) client.send(new UserSearchRequest(text));
 		else userList.getItems().clear();
 	}
 
@@ -115,7 +115,7 @@ public class ContactSearchTab implements EventListener {
 
 		// Sends the event to the server
 		final var event = new ContactOperation(currentlySelectedUser, ElementOperation.ADD);
-		eventBus.dispatch(new SendEvent(event));
+		client.send(event);
 
 		// Removes the chosen user and updates the UI
 		userList.getItems().remove(currentlySelectedUser);
diff --git a/client/src/main/java/envoy/client/ui/controller/GroupCreationTab.java b/client/src/main/java/envoy/client/ui/controller/GroupCreationTab.java
index d2f61a6..4243ce4 100644
--- a/client/src/main/java/envoy/client/ui/controller/GroupCreationTab.java
+++ b/client/src/main/java/envoy/client/ui/controller/GroupCreationTab.java
@@ -10,8 +10,9 @@ import javafx.scene.control.*;
 import javafx.scene.layout.HBox;
 
 import envoy.client.data.*;
-import envoy.client.event.*;
-import envoy.client.ui.listcell.*;
+import envoy.client.event.BackEvent;
+import envoy.client.ui.control.ContactControl;
+import envoy.client.ui.listcell.ListCellFactory;
 import envoy.data.*;
 import envoy.event.GroupCreation;
 import envoy.event.contact.ContactOperation;
@@ -27,10 +28,6 @@ import dev.kske.eventbus.*;
  * 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).
- * 
- * File: GroupCreationScene.java
- * Created: 07.06.2020
  *
  * @author Maximilian Käfer
  * @since Envoy Client v0.1-beta
@@ -137,8 +134,9 @@ public class GroupCreationTab implements EventListener {
 	 * @since Envoy Client v0.1-beta
 	 */
 	private void createGroup(String name) {
-		eventBus.dispatch(new SendEvent(
-				new GroupCreation(name, userList.getSelectionModel().getSelectedItems().stream().map(User::getID).collect(Collectors.toSet()))));
+		Context.getInstance()
+			.getClient()
+			.send(new GroupCreation(name, userList.getSelectionModel().getSelectedItems().stream().map(User::getID).collect(Collectors.toSet())));
 	}
 
 	/**
@@ -150,12 +148,7 @@ public class GroupCreationTab implements EventListener {
 	 * @since Envoy Client v0.1-beta
 	 */
 	public boolean groupNameAlreadyPresent(String newName) {
-		return localDB.getChats()
-			.stream()
-			.map(Chat::getRecipient)
-			.filter(Group.class::isInstance)
-			.map(Contact::getName)
-			.anyMatch(newName::equals);
+		return localDB.getChats().stream().map(Chat::getRecipient).filter(Group.class::isInstance).map(Contact::getName).anyMatch(newName::equals);
 	}
 
 	@FXML
@@ -211,7 +204,7 @@ public class GroupCreationTab implements EventListener {
 					userList.getItems().add((User) operation.get());
 					break;
 				case REMOVE:
-					userList.getItems().removeIf(u -> u.equals(operation.get()));
+					userList.getItems().removeIf(operation.get()::equals);
 					break;
 			}
 		});
diff --git a/client/src/main/java/envoy/client/ui/controller/LoginScene.java b/client/src/main/java/envoy/client/ui/controller/LoginScene.java
index 30cb205..6176f8c 100644
--- a/client/src/main/java/envoy/client/ui/controller/LoginScene.java
+++ b/client/src/main/java/envoy/client/ui/controller/LoginScene.java
@@ -12,6 +12,7 @@ import javafx.scene.image.ImageView;
 
 import envoy.client.data.ClientConfig;
 import envoy.client.ui.*;
+import envoy.client.util.IconUtil;
 import envoy.data.LoginCredentials;
 import envoy.event.HandshakeRejection;
 import envoy.util.*;
@@ -19,9 +20,7 @@ import envoy.util.*;
 import dev.kske.eventbus.*;
 
 /**
- * Project: envoy-client
- * File: LoginDialog.java
- * Created: 03.04.2020
+ * Controller for the login scene.
  *
  * @author Kai S. K. Engelbart
  * @author Maximilian Käfer
@@ -101,20 +100,21 @@ public final class LoginScene implements EventListener {
 
 	@FXML
 	private void registerSwitchPressed() {
+
+		// Update button text and register switch
 		if (!registration) {
-			// case if the current mode is login
 			loginButton.setText("Register");
 			loginButton.setPadding(new Insets(2, 116, 2, 116));
 			registerTextLabel.setText("Already an account?");
 			registerSwitch.setText("Login");
 		} else {
-			// case if the current mode is registration
 			loginButton.setText("Login");
 			loginButton.setPadding(new Insets(2, 125, 2, 125));
 			registerTextLabel.setText("No account yet?");
 			registerSwitch.setText("Register");
 		}
 		registration = !registration;
+
 		// Make repeat password field and label visible / invisible
 		repeatPasswordField.setVisible(registration);
 		offlineModeButton.setDisable(registration);
diff --git a/client/src/main/java/envoy/client/ui/controller/SettingsScene.java b/client/src/main/java/envoy/client/ui/controller/SettingsScene.java
index bd3a237..f69475a 100644
--- a/client/src/main/java/envoy/client/ui/controller/SettingsScene.java
+++ b/client/src/main/java/envoy/client/ui/controller/SettingsScene.java
@@ -1,20 +1,14 @@
 package envoy.client.ui.controller;
 
 import javafx.fxml.FXML;
-import javafx.scene.control.Label;
-import javafx.scene.control.ListView;
-import javafx.scene.control.TitledPane;
+import javafx.scene.control.*;
 
 import envoy.client.data.Context;
-import envoy.client.net.Client;
-import envoy.client.ui.SceneContext;
-import envoy.client.ui.listcell.AbstractListCell;
+import envoy.client.ui.listcell.ListCellFactory;
 import envoy.client.ui.settings.*;
 
 /**
- * Project: envoy-client
- * File: SettingsSceneController.java
- * Created: 10.04.2020
+ * Controller for the settings scene.
  *
  * @author Kai S. K. Engelbart
  * @since Envoy Client v0.1-beta
@@ -27,20 +21,10 @@ public final class SettingsScene {
 	@FXML
 	private TitledPane titledPane;
 
-	private final Client		client			= Context.getInstance().getClient();
-	private final SceneContext	sceneContext	= Context.getInstance().getSceneContext();
-
 	@FXML
 	private void initialize() {
-		settingsList.setCellFactory(listView -> new AbstractListCell<>(listView) {
-
-			@Override
-			protected Label renderItem(SettingsPane item) { return new Label(item.getTitle()); }
-		});
-		settingsList.getItems().add(new GeneralSettingsPane());
-		settingsList.getItems().add(new UserSettingsPane(sceneContext, client.getSender(), client.isOnline()));
-		settingsList.getItems().add(new DownloadSettingsPane(sceneContext));
-		settingsList.getItems().add(new BugReportPane(client.getSender(), client.isOnline()));
+		settingsList.setCellFactory(new ListCellFactory<>(pane -> new Label(pane.getTitle())));
+		settingsList.getItems().addAll(new GeneralSettingsPane(), new UserSettingsPane(), new DownloadSettingsPane(), new BugReportPane());
 	}
 
 	@FXML
@@ -53,5 +37,5 @@ public final class SettingsScene {
 	}
 
 	@FXML
-	private void backButtonClicked() { sceneContext.pop(); }
+	private void backButtonClicked() { Context.getInstance().getSceneContext().pop(); }
 }
diff --git a/client/src/main/java/envoy/client/ui/controller/Tabs.java b/client/src/main/java/envoy/client/ui/controller/Tabs.java
index 0940cd3..9889e3d 100644
--- a/client/src/main/java/envoy/client/ui/controller/Tabs.java
+++ b/client/src/main/java/envoy/client/ui/controller/Tabs.java
@@ -2,10 +2,6 @@ package envoy.client.ui.controller;
 
 /**
  * Provides options to select different tabs.
- * 
- * File: Tabs.java
- * Created: 30.8.2020
  *
  * @author Maximilian Käfer
  * @since Envoy Client v0.2-beta
diff --git a/client/src/main/java/envoy/client/ui/controller/package-info.java b/client/src/main/java/envoy/client/ui/controller/package-info.java
index 7989b8f..fcd4b35 100644
--- a/client/src/main/java/envoy/client/ui/controller/package-info.java
+++ b/client/src/main/java/envoy/client/ui/controller/package-info.java
@@ -1,11 +1,9 @@
 /**
  * Contains JavaFX scene controllers.
- * 
- * File: package-info.java
- * Created: 08.06.2020
  *
  * @author Kai S. K. Engelbart
+ * @author Leon Hofmeister
+ * @author Maximilian Käfer
  * @since Envoy Client v0.1-beta
  */
 package envoy.client.ui.controller;
diff --git a/client/src/main/java/envoy/client/ui/custom/package-info.java b/client/src/main/java/envoy/client/ui/custom/package-info.java
deleted file mode 100644
index 97a8f58..0000000
--- a/client/src/main/java/envoy/client/ui/custom/package-info.java
+++ /dev/null
@@ -1,14 +0,0 @@
-/**
- * This package stores custom components for use in JavaFX.
- * These components are also expected to be used via FXML.
- * 
- * File: package-info.java
- * Created: 30.07.2020
- *
- * @author Leon Hofmeister
- * @author Maximilian Käfer
- * @author Kai S. K. Engelbart
- * @since Envoy Client v0.2-beta
- */
-package envoy.client.ui.custom;
diff --git a/client/src/main/java/envoy/client/ui/listcell/AbstractListCell.java b/client/src/main/java/envoy/client/ui/listcell/AbstractListCell.java
index a763981..1e12021 100644
--- a/client/src/main/java/envoy/client/ui/listcell/AbstractListCell.java
+++ b/client/src/main/java/envoy/client/ui/listcell/AbstractListCell.java
@@ -1,17 +1,10 @@
 package envoy.client.ui.listcell;
 
-import javafx.scene.Cursor;
-import javafx.scene.Node;
-import javafx.scene.control.ContentDisplay;
-import javafx.scene.control.ListCell;
-import javafx.scene.control.ListView;
+import javafx.scene.*;
+import javafx.scene.control.*;
 
 /**
  * Provides a convenience frame for list cell creation.
- * 
- * File: AbstractListCell.java
- * Created: 18.07.2020
  *
  * @author Kai S. K. Engelbart
  * @param 
- * File: GenericListCell.java
- * Created: 18.07.2020
  *
  * @author Kai S. K. Engelbart
  * @param 
- * File: ListCellFactory.java
- * Created: 13.07.2020
  *
  * @author Kai S. K. Engelbart
  * @param 
- * File: MessageListCell.java
- * Created: 18.07.2020
  *
  * @author Kai S. K. Engelbart
  * @since Envoy Client v0.1-beta
diff --git a/client/src/main/java/envoy/client/ui/listcell/package-info.java b/client/src/main/java/envoy/client/ui/listcell/package-info.java
index ab0788e..dd5dd33 100644
--- a/client/src/main/java/envoy/client/ui/listcell/package-info.java
+++ b/client/src/main/java/envoy/client/ui/listcell/package-info.java
@@ -1,12 +1,9 @@
 /**
  * This package contains custom list cells that are used to display certain
  * things.
- * 
- * File: package-info.java
- * Created: 30.06.2020
  *
  * @author Leon Hofmeister
+ * @author Kai S. K. Engelbart
  * @since Envoy Client v0.1-beta
  */
 package envoy.client.ui.listcell;
diff --git a/client/src/main/java/envoy/client/ui/settings/BugReportPane.java b/client/src/main/java/envoy/client/ui/settings/BugReportPane.java
index 88b0397..1f2e98f 100644
--- a/client/src/main/java/envoy/client/ui/settings/BugReportPane.java
+++ b/client/src/main/java/envoy/client/ui/settings/BugReportPane.java
@@ -4,25 +4,17 @@ import javafx.event.EventHandler;
 import javafx.scene.control.*;
 import javafx.scene.input.InputEvent;
 
-import envoy.client.event.SendEvent;
 import envoy.client.util.IssueUtil;
-import envoy.data.User;
 import envoy.event.IssueProposal;
 
-import dev.kske.eventbus.EventBus;
-
 /**
  * This class offers the option for users to submit a bug report. Only the title
  * of a bug is needed to be sent.
- * 
- * File: BugReportPane.java
- * Created: Aug 4, 2020
  *
  * @author Leon Hofmeister
  * @since Envoy Client v0.2-beta
  */
-public final class BugReportPane extends OnlyIfOnlineSettingsPane {
+public final class BugReportPane extends OnlineOnlySettingsPane {
 
 	private final Label		titleLabel				= new Label("Suggest a title for the bug:");
 	private final TextField	titleTextField			= new TextField();
@@ -36,12 +28,10 @@ public final class BugReportPane extends OnlyIfOnlineSettingsPane {
 	/**
 	 * Creates a new {@code BugReportPane}.
 	 *
-	 * @param user   the user whose details to use
-	 * @param online whether this user is currently online
 	 * @since Envoy Client v0.2-beta
 	 */
-	public BugReportPane(User user, boolean online) {
-		super("Report a bug", online);
+	public BugReportPane() {
+		super("Report a bug");
 		setSpacing(10);
 		setToolTipText("A bug can only be reported while being online");
 
@@ -68,12 +58,8 @@ public final class BugReportPane extends OnlyIfOnlineSettingsPane {
 
 		// Displaying the submitReportButton
 		submitReportButton.setDisable(true);
-		submitReportButton.setOnAction(e -> {
-			EventBus.getInstance()
-				.dispatch(new SendEvent(new IssueProposal(titleTextField.getText(),
-						IssueUtil.sanitizeIssueDescription(errorDetailArea.getText(), showUsernameInBugReport.isSelected() ? user.getName() : null),
-						true)));
-		});
+		submitReportButton.setOnAction(e -> client.send(new IssueProposal(titleTextField.getText(), IssueUtil
+			.sanitizeIssueDescription(errorDetailArea.getText(), showUsernameInBugReport.isSelected() ? client.getSender().getName() : null), true)));
 		getChildren().add(submitReportButton);
 	}
 }
diff --git a/client/src/main/java/envoy/client/ui/settings/DownloadSettingsPane.java b/client/src/main/java/envoy/client/ui/settings/DownloadSettingsPane.java
index fe358c1..4bcb1d8 100644
--- a/client/src/main/java/envoy/client/ui/settings/DownloadSettingsPane.java
+++ b/client/src/main/java/envoy/client/ui/settings/DownloadSettingsPane.java
@@ -5,14 +5,10 @@ import javafx.scene.control.*;
 import javafx.scene.layout.HBox;
 import javafx.stage.DirectoryChooser;
 
-import envoy.client.ui.SceneContext;
+import envoy.client.data.Context;
 
 /**
  * Displays options for downloading {@link envoy.data.Attachment}s.
- * 
- * File: DownloadSettingsPane.java
- * Created: 27.07.2020
  *
  * @author Leon Hofmeister
  * @since Envoy Client v0.2-beta
@@ -22,15 +18,14 @@ public final class DownloadSettingsPane extends SettingsPane {
 	/**
 	 * Constructs a new {@code DownloadSettingsPane}.
 	 *
-	 * @param sceneContext the {@code SceneContext} used to block input to the
-	 *                     {@link javafx.stage.Stage} used in Envoy
 	 * @since Envoy Client v0.2-beta
 	 */
-	public DownloadSettingsPane(SceneContext sceneContext) {
+	public DownloadSettingsPane() {
 		super("Download");
 		setSpacing(15);
 		setPadding(new Insets(15));
-		// checkbox to disable asking
+
+		// Checkbox to disable asking
 		final var checkBox = new CheckBox(settings.getItems().get("autoSaveDownloads").getUserFriendlyName());
 		checkBox.setSelected(settings.isDownloadSavedWithoutAsking());
 		checkBox.setTooltip(new Tooltip("Determines whether a \"Select save location\" - dialogue will be shown when saving attachments."));
@@ -52,7 +47,7 @@ public final class DownloadSettingsPane extends SettingsPane {
 			final var directoryChooser = new DirectoryChooser();
 			directoryChooser.setTitle("Select the directory where attachments should be saved to");
 			directoryChooser.setInitialDirectory(settings.getDownloadLocation());
-			final var selectedDirectory = directoryChooser.showDialog(sceneContext.getStage());
+			final var selectedDirectory = directoryChooser.showDialog(Context.getInstance().getSceneContext().getStage());
 
 			if (selectedDirectory != null) {
 				currentPath.setText(selectedDirectory.getAbsolutePath());
diff --git a/client/src/main/java/envoy/client/ui/settings/GeneralSettingsPane.java b/client/src/main/java/envoy/client/ui/settings/GeneralSettingsPane.java
index e0bf1a5..bc8cba6 100644
--- a/client/src/main/java/envoy/client/ui/settings/GeneralSettingsPane.java
+++ b/client/src/main/java/envoy/client/ui/settings/GeneralSettingsPane.java
@@ -10,10 +10,6 @@ import envoy.data.User.UserStatus;
 import dev.kske.eventbus.EventBus;
 
 /**
- * Project: envoy-client
- * File: GeneralSettingsPane.java
- * Created: 18.04.2020
- *
  * @author Kai S. K. Engelbart
  * @since Envoy Client v0.1-beta
  */
diff --git a/client/src/main/java/envoy/client/ui/settings/OnlyIfOnlineSettingsPane.java b/client/src/main/java/envoy/client/ui/settings/OnlineOnlySettingsPane.java
similarity index 65%
rename from client/src/main/java/envoy/client/ui/settings/OnlyIfOnlineSettingsPane.java
rename to client/src/main/java/envoy/client/ui/settings/OnlineOnlySettingsPane.java
index 95e375c..592b31b 100644
--- a/client/src/main/java/envoy/client/ui/settings/OnlyIfOnlineSettingsPane.java
+++ b/client/src/main/java/envoy/client/ui/settings/OnlineOnlySettingsPane.java
@@ -1,40 +1,39 @@
 package envoy.client.ui.settings;
 
 import javafx.geometry.Insets;
-import javafx.scene.control.Label;
-import javafx.scene.control.Tooltip;
-import javafx.scene.layout.Background;
-import javafx.scene.layout.BackgroundFill;
-import javafx.scene.layout.CornerRadii;
+import javafx.scene.control.*;
+import javafx.scene.layout.*;
 import javafx.scene.paint.Color;
 
+import envoy.client.data.Context;
+import envoy.client.net.Client;
+
 /**
  * Inheriting from this class signifies that options should only be available if
  * the {@link envoy.data.User} is currently online. If the user is currently
  * offline, all {@link javafx.scene.Node} variables will be disabled and a
  * {@link Tooltip} will be displayed for the whole node.
- * 
- * File: OnlyIfOnlineSettingsPane.java
- * Created: 04.08.2020
  *
  * @author Leon Hofmeister
+ * @author Kai S. K. Engelbart
  * @since Envoy Client v0.2-beta
  */
-public abstract class OnlyIfOnlineSettingsPane extends SettingsPane {
+public abstract class OnlineOnlySettingsPane extends SettingsPane {
+
+	protected final Client client = Context.getInstance().getClient();
 
 	private final Tooltip beOnlineReminder = new Tooltip("You need to be online to modify your account.");
 
 	/**
-	 * @param title
+	 * @param title the title of this pane
 	 * @since Envoy Client v0.2-beta
 	 */
-	protected OnlyIfOnlineSettingsPane(String title, boolean online) {
+	protected OnlineOnlySettingsPane(String title) {
 		super(title);
 
-		setDisable(!online);
+		setDisable(!client.isOnline());
 
-		if (!online) {
+		if (!client.isOnline()) {
 			final var infoLabel = new Label("You shall not pass!\n(... Unless you would happen to be online)");
 			infoLabel.setId("info-label-warning");
 			infoLabel.setWrapText(true);
@@ -45,5 +44,11 @@ public abstract class OnlyIfOnlineSettingsPane extends SettingsPane {
 		} else Tooltip.uninstall(this, beOnlineReminder);
 	}
 
+	/**
+	 * Sets the text of the tooltip displayed for this pane.
+	 *
+	 * @param text the text to display
+	 * @since Envoy Client v0.2-beta
+	 */
 	protected void setToolTipText(String text) { beOnlineReminder.setText(text); }
 }
diff --git a/client/src/main/java/envoy/client/ui/settings/SettingsCheckbox.java b/client/src/main/java/envoy/client/ui/settings/SettingsCheckbox.java
index b672d5a..b171d07 100644
--- a/client/src/main/java/envoy/client/ui/settings/SettingsCheckbox.java
+++ b/client/src/main/java/envoy/client/ui/settings/SettingsCheckbox.java
@@ -6,10 +6,6 @@ import javafx.scene.control.CheckBox;
 import envoy.client.data.SettingsItem;
 
 /**
- * Project: envoy-client
- * File: SettingsToggleButton.java
- * Created: 18.04.2020
- *
  * @author Kai S. K. Engelbart
  * @since Envoy Client v0.1-beta
  */
diff --git a/client/src/main/java/envoy/client/ui/settings/SettingsPane.java b/client/src/main/java/envoy/client/ui/settings/SettingsPane.java
index be63f26..5dc9796 100644
--- a/client/src/main/java/envoy/client/ui/settings/SettingsPane.java
+++ b/client/src/main/java/envoy/client/ui/settings/SettingsPane.java
@@ -5,10 +5,6 @@ import javafx.scene.layout.VBox;
 import envoy.client.data.Settings;
 
 /**
- * Project: envoy-client
- * File: SettingsPane.java
- * Created: 18.04.2020
- *
  * @author Kai S. K. Engelbart
  * @since Envoy Client v0.1-beta
  */
diff --git a/client/src/main/java/envoy/client/ui/settings/UserSettingsPane.java b/client/src/main/java/envoy/client/ui/settings/UserSettingsPane.java
index 498a940..5c6e730 100644
--- a/client/src/main/java/envoy/client/ui/settings/UserSettingsPane.java
+++ b/client/src/main/java/envoy/client/ui/settings/UserSettingsPane.java
@@ -14,24 +14,19 @@ import javafx.scene.input.InputEvent;
 import javafx.scene.layout.HBox;
 import javafx.stage.FileChooser;
 
-import envoy.client.event.SendEvent;
-import envoy.client.ui.*;
-import envoy.client.ui.custom.ProfilePicImageView;
-import envoy.data.User;
+import envoy.client.data.Context;
+import envoy.client.ui.control.ProfilePicImageView;
+import envoy.client.util.IconUtil;
 import envoy.event.*;
 import envoy.util.*;
 
 import dev.kske.eventbus.EventBus;
 
 /**
- * Project: envoy-client
- * File: UserSettingsPane.java
- * Created: 31.07.2020
- *
  * @author Leon Hofmeister
  * @since Envoy Client v0.2-beta
  */
-public final class UserSettingsPane extends OnlyIfOnlineSettingsPane {
+public final class UserSettingsPane extends OnlineOnlySettingsPane {
 
 	private boolean	profilePicChanged, usernameChanged, validPassword;
 	private byte[]	currentImageBytes;
@@ -50,13 +45,10 @@ public final class UserSettingsPane extends OnlyIfOnlineSettingsPane {
 	/**
 	 * Creates a new {@code UserSettingsPane}.
 	 *
-	 * @param sceneContext the {@code SceneContext} to block input to Envoy
-	 * @param user         the user who wants to customize his profile
-	 * @param online       whether this user is currently online
 	 * @since Envoy Client v0.2-beta
 	 */
-	public UserSettingsPane(SceneContext sceneContext, User user, boolean online) {
-		super("User", online);
+	public UserSettingsPane() {
+		super("User");
 		setSpacing(10);
 
 		// Display of profile pic change mechanism
@@ -67,18 +59,19 @@ public final class UserSettingsPane extends OnlyIfOnlineSettingsPane {
 		profilePic.setFitWidth(60);
 		profilePic.setFitHeight(60);
 		profilePic.setOnMouseClicked(e -> {
-			if (!online) return;
+			if (!client.isOnline()) return;
 			final var pictureChooser = new FileChooser();
 
 			pictureChooser.setTitle("Select a new profile pic");
 			pictureChooser.setInitialDirectory(new File(System.getProperty("user.home")));
 			pictureChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("Pictures", "*.png", "*.jpg", "*.bmp", "*.gif"));
 
-			final var file = pictureChooser.showOpenDialog(sceneContext.getStage());
+			final var file = pictureChooser.showOpenDialog(Context.getInstance().getSceneContext().getStage());
 
 			if (file != null) {
 
 				// Check max file size
+				// TODO: Move to config
 				if (file.length() > 5E6) {
 					new Alert(AlertType.WARNING, "The selected file exceeds the size limit of 5MB!").showAndWait();
 					return;
@@ -96,7 +89,7 @@ public final class UserSettingsPane extends OnlyIfOnlineSettingsPane {
 		hbox.getChildren().add(profilePic);
 
 		// Displaying the username change mechanism
-		final var username = user.getName();
+		final var username = client.getSender().getName();
 		newUsername = username;
 		usernameTextField.setText(username);
 		final EventHandler super InputEvent> textChanged = e -> {
@@ -133,7 +126,7 @@ public final class UserSettingsPane extends OnlyIfOnlineSettingsPane {
 		}
 
 		// Displaying the save button
-		saveButton.setOnAction(e -> save(user.getID(), currentPasswordField.getText()));
+		saveButton.setOnAction(e -> save(client.getSender().getID(), currentPasswordField.getText()));
 		saveButton.setAlignment(Pos.BOTTOM_RIGHT);
 		getChildren().add(saveButton);
 	}
@@ -150,7 +143,7 @@ public final class UserSettingsPane extends OnlyIfOnlineSettingsPane {
 		if (profilePicChanged) {
 			final var profilePicChangeEvent = new ProfilePicChange(currentImageBytes, userID);
 			eventBus.dispatch(profilePicChangeEvent);
-			eventBus.dispatch(new SendEvent(profilePicChangeEvent));
+			client.send(profilePicChangeEvent);
 			logger.log(Level.INFO, "The user just changed his profile pic.");
 		}
 
@@ -158,8 +151,8 @@ public final class UserSettingsPane extends OnlyIfOnlineSettingsPane {
 		final var validContactName = Bounds.isValidContactName(newUsername);
 		if (usernameChanged && validContactName) {
 			final var nameChangeEvent = new NameChange(userID, newUsername);
-			eventBus.dispatch(new SendEvent(nameChangeEvent));
 			eventBus.dispatch(nameChangeEvent);
+			client.send(nameChangeEvent);
 			logger.log(Level.INFO, "The user just changed his name to " + newUsername + ".");
 		} else if (!validContactName) {
 			final var alert = new Alert(AlertType.ERROR);
@@ -172,14 +165,13 @@ public final class UserSettingsPane extends OnlyIfOnlineSettingsPane {
 
 		// The password was changed
 		if (validPassword) {
-			eventBus.dispatch(new SendEvent(new PasswordChangeRequest(newPassword, oldPassword, userID)));
+			client.send(new PasswordChangeRequest(newPassword, oldPassword, userID));
 			logger.log(Level.INFO, "The user just tried to change his password!");
 		} else if (!(validPassword || newPassword.isBlank())) {
 			final var alert = new Alert(AlertType.ERROR);
 			alert.setTitle("Unequal Password");
 			alert.setContentText("Repeated password is unequal to the chosen new password");
 			alert.showAndWait();
-			return;
 		}
 	}
 }
diff --git a/client/src/main/java/envoy/client/ui/settings/package-info.java b/client/src/main/java/envoy/client/ui/settings/package-info.java
index e908b93..ea3fdb6 100644
--- a/client/src/main/java/envoy/client/ui/settings/package-info.java
+++ b/client/src/main/java/envoy/client/ui/settings/package-info.java
@@ -1,10 +1,6 @@
 /**
  * This package contains classes used for representing the settings
  * visually.
- * 
- * File: package-info.java
- * Created: 19 Apr 2020
  *
  * @author Leon Hofmeister
  * @author Kai S. K. Engelbart
diff --git a/client/src/main/java/envoy/client/ui/IconUtil.java b/client/src/main/java/envoy/client/util/IconUtil.java
similarity index 87%
rename from client/src/main/java/envoy/client/ui/IconUtil.java
rename to client/src/main/java/envoy/client/util/IconUtil.java
index 2da4d35..42a8554 100644
--- a/client/src/main/java/envoy/client/ui/IconUtil.java
+++ b/client/src/main/java/envoy/client/util/IconUtil.java
@@ -1,9 +1,8 @@
-package envoy.client.ui;
+package envoy.client.util;
 
 import java.awt.image.BufferedImage;
 import java.io.IOException;
-import java.util.EnumMap;
-import java.util.EnumSet;
+import java.util.*;
 import java.util.logging.Level;
 
 import javax.imageio.ImageIO;
@@ -16,10 +15,6 @@ import envoy.util.EnvoyLog;
 /**
  * Provides static utility methods for loading icons from the resource
  * folder.
- * 
- * File: IconUtil.java
- * Created: 16.03.2020
  *
  * @author Kai S. K. Engelbart
  * @since Envoy Client v0.1-beta
@@ -35,15 +30,7 @@ public final class IconUtil {
 	 * @return the loaded image
 	 * @since Envoy Client v0.1-beta
 	 */
-	public static Image load(String path) {
-		Image image = null;
-		try {
-			image = new Image(IconUtil.class.getResource(path).toExternalForm());
-		} catch (final NullPointerException e) {
-			EnvoyLog.getLogger(IconUtil.class).log(Level.WARNING, String.format("Could not load image at path %s: ", path), e);
-		}
-		return image;
-	}
+	public static Image load(String path) { return new Image(IconUtil.class.getResource(path).toExternalForm()); }
 
 	/**
 	 * Loads an image from the resource folder and scales it to the given size.
@@ -54,13 +41,7 @@ public final class IconUtil {
 	 * @since Envoy Client v0.1-beta
 	 */
 	public static Image load(String path, int size) {
-		Image image = null;
-		try {
-			image = new Image(IconUtil.class.getResource(path).toExternalForm(), size, size, true, true);
-		} catch (final NullPointerException e) {
-			EnvoyLog.getLogger(IconUtil.class).log(Level.WARNING, String.format("Could not load image at path %s: ", path), e);
-		}
-		return image;
+		return new Image(IconUtil.class.getResource(path).toExternalForm(), size, size, true, true);
 	}
 
 	/**
diff --git a/client/src/main/java/envoy/client/util/IssueUtil.java b/client/src/main/java/envoy/client/util/IssueUtil.java
index 6c6e165..8933a67 100644
--- a/client/src/main/java/envoy/client/util/IssueUtil.java
+++ b/client/src/main/java/envoy/client/util/IssueUtil.java
@@ -2,39 +2,34 @@ package envoy.client.util;
 
 /**
  * Provides methods to handle outgoing issues.
- * 
- * File: IssueUtil.java
- * Created: 20.08.2020
  *
  * @author Leon Hofmeister
+ * @author Kai S. K. Engelbart
  * @since Envoy Client v0.2-beta
  */
 public final class IssueUtil {
 
-	/**
-	 *
-	 * @since Envoy Client v0.2-beta
-	 */
 	private IssueUtil() {}
 
 	/**
-	 * Performs actions to ensure the description of an issue will be displayed as
-	 * intended by the user.
+	 * Normalizes line breaks and appends the user name to the issue description if
+	 * requested.
 	 *
-	 * @param rawDescription the description to sanitize
-	 * @param username       the user who submitted the issue. Should be
-	 *                       {@code null} if he does not want to be named.
+	 * @param description the description to sanitize
+	 * @param username    the user who submitted the issue. Should be
+	 *                    {@code null} if he does not want to be named.
 	 * @return the sanitized description
 	 * @since Envoy Client v0.2-beta
 	 */
-	public static String sanitizeIssueDescription(String rawDescription, String username) {
-		// Appending the submitter name, if this option was enabled
-		rawDescription += username != null
-				? (rawDescription.endsWith("\n") || rawDescription.endsWith("
") ? "" : "
") + String.format("Submitted by user %s.", username)
-				: "";
-		// Markdown does not support "normal" line breaks. It uses "
"
-		rawDescription = rawDescription.replaceAll(System.getProperty("line.separator", "\r?\n"), "
");
-		return rawDescription;
+	public static String sanitizeIssueDescription(String description, String username) {
+
+		// Trim and replace line breaks by 
 tags
+		description = description.trim().replaceAll(System.getProperty("line.separator"), "
");
+
+		// Append user name if requested
+		if (username != null)
+			description += String.format("
Submitted by user %s.", username);
+
+		return description;
 	}
 }
diff --git a/client/src/main/java/envoy/client/util/ReflectionUtil.java b/client/src/main/java/envoy/client/util/ReflectionUtil.java
index abdfd51..49273f8 100644
--- a/client/src/main/java/envoy/client/util/ReflectionUtil.java
+++ b/client/src/main/java/envoy/client/util/ReflectionUtil.java
@@ -1,17 +1,11 @@
 package envoy.client.util;
 
-import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
+import java.util.*;
+import java.util.stream.*;
 
 import javafx.scene.Node;
 
 /**
- * Project: envoy-client
- * File: ReflectionUtil.java
- * Created: 02.08.2020
- *
  * @author Leon Hofmeister
  * @since Envoy Client v0.2-beta
  */
@@ -20,8 +14,9 @@ public final class ReflectionUtil {
 	private ReflectionUtil() {}
 
 	/**
-	 * Gets all declared variables of the given instance that have the specified
-	 * class
+	 * Gets all declared variable values of the given instance that have the
+	 * specified class.
+	 * 
- * File: package-info.java
- * Created: 02.08.2020
  *
  * @author Leon Hofmeister
  * @since Envoy Client v0.2-beta
diff --git a/client/src/main/java/module-info.java b/client/src/main/java/module-info.java
index 4382521..e0f86ba 100644
--- a/client/src/main/java/module-info.java
+++ b/client/src/main/java/module-info.java
@@ -20,7 +20,7 @@ module envoy.client {
 
 	opens envoy.client.ui to javafx.graphics, javafx.fxml, dev.kske.eventbus;
 	opens envoy.client.ui.controller to javafx.graphics, javafx.fxml, envoy.client.util, dev.kske.eventbus;
-	opens envoy.client.ui.custom to javafx.graphics, javafx.fxml;
+	opens envoy.client.ui.control to javafx.graphics, javafx.fxml;
 	opens envoy.client.ui.settings to envoy.client.util;
 	opens envoy.client.net to dev.kske.eventbus;
 	opens envoy.client.data to dev.kske.eventbus;
diff --git a/common/src/main/java/envoy/data/Attachment.java b/common/src/main/java/envoy/data/Attachment.java
index 292284a..31e83fb 100644
--- a/common/src/main/java/envoy/data/Attachment.java
+++ b/common/src/main/java/envoy/data/Attachment.java
@@ -5,10 +5,6 @@ import java.io.Serializable;
 /**
  * This interface should be used for any type supposed to be a {@link Message}
  * attachment (i.e. images or sound).
- * 
- * File: Attachment.java
- * Created: 30 Dec 2019
  *
  * @author Leon Hofmeister
  * @author Kai S. K. Engelbart
diff --git a/common/src/main/java/envoy/data/Config.java b/common/src/main/java/envoy/data/Config.java
index 7b7c097..74798fb 100644
--- a/common/src/main/java/envoy/data/Config.java
+++ b/common/src/main/java/envoy/data/Config.java
@@ -1,7 +1,6 @@
 package envoy.data;
 
-import java.io.File;
-import java.io.IOException;
+import java.io.*;
 import java.util.*;
 import java.util.function.Function;
 import java.util.logging.Level;
@@ -19,10 +18,6 @@ import envoy.util.EnvoyLog;
  * default value or over command line argument. Developers that fail to provide
  * default values will be greeted with an error message the next time they try
  * to start Envoy...
- * 
- * File: Config.java
- * Created: 12 Oct 2019
  *
  * @author Kai S. K. Engelbart
  * @since Envoy Common v0.1-beta
@@ -104,6 +99,7 @@ public class Config {
 	public void loadAll(Class> declaringClass, String propertiesFilePath, String[] args) {
 		if (modificationDisabled)
 			throw new IllegalStateException("Cannot change config after isInitialized has been called");
+
 		// Load the defaults from the given .properties file first
 		final var properties = new Properties();
 		try {
@@ -120,6 +116,7 @@ public class Config {
 
 		// Check if all configuration values have been initialized
 		isInitialized();
+
 		// Disable further editing of the config
 		modificationDisabled = true;
 	}
@@ -130,10 +127,9 @@ public class Config {
 	 * @since Envoy Common v0.1-beta
 	 */
 	private void isInitialized() {
-		if (items.values().stream().map(ConfigItem::get).anyMatch(Objects::isNull))
-			throw new IllegalStateException("config item(s) has/ have not been initialized:"
-					+ items.values().stream().filter(configItem -> configItem.get() == null)
-							.map(ConfigItem::getCommandLong).collect(Collectors.toSet()));
+		String uninitialized = items.values().stream().filter(c -> c.get() == null).map(ConfigItem::getCommandLong).collect(Collectors.joining(", "));
+		if(!uninitialized.isEmpty())
+			throw new IllegalStateException("Config items uninitialized: " + uninitialized);
 	}
 
 	/**
diff --git a/common/src/main/java/envoy/data/ConfigItem.java b/common/src/main/java/envoy/data/ConfigItem.java
index 5f61750..e3bdc42 100644
--- a/common/src/main/java/envoy/data/ConfigItem.java
+++ b/common/src/main/java/envoy/data/ConfigItem.java
@@ -7,10 +7,6 @@ import java.util.function.Function;
  * line arguments and its default value.
  * 
- * File: ConfigItem.javaEvent.java
- * Created: 21.12.2019
  *
  * @author Kai S. K. Engelbart
  * @param 
  * It provides an id and a name for each user and group.
- * 
- * Project: envoy-common
- * File: Contact.java
- * Created: 24 Mar 2020
  *
  * @author Leon Hofmeister
  * @since Envoy v0.1-beta
diff --git a/common/src/main/java/envoy/data/Group.java b/common/src/main/java/envoy/data/Group.java
index fd7d074..40a0cb1 100644
--- a/common/src/main/java/envoy/data/Group.java
+++ b/common/src/main/java/envoy/data/Group.java
@@ -1,15 +1,9 @@
 package envoy.data;
 
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.util.HashSet;
-import java.util.Set;
+import java.io.*;
+import java.util.*;
 
 /**
- * Project: envoy-common
- * File: Group.java
- * Created: 24 Mar 2020
- *
  * @author Leon Hofmeister
  * @since Envoy Common v0.1-beta
  */
diff --git a/common/src/main/java/envoy/data/GroupMessage.java b/common/src/main/java/envoy/data/GroupMessage.java
index 93b8658..fec27f8 100644
--- a/common/src/main/java/envoy/data/GroupMessage.java
+++ b/common/src/main/java/envoy/data/GroupMessage.java
@@ -1,14 +1,9 @@
 package envoy.data;
 
 import java.time.Instant;
-import java.util.Collections;
-import java.util.Map;
+import java.util.*;
 
 /**
- * Project: envoy-common
- * File: GroupMessage.java
- * Created: 26.03.2020
- *
  * @author Maximilian Käfer
  * @since Envoy Common v0.1-beta
  */
diff --git a/common/src/main/java/envoy/data/IDGenerator.java b/common/src/main/java/envoy/data/IDGenerator.java
index 45d6966..774c348 100644
--- a/common/src/main/java/envoy/data/IDGenerator.java
+++ b/common/src/main/java/envoy/data/IDGenerator.java
@@ -2,17 +2,15 @@ package envoy.data;
 
 import java.io.Serializable;
 
+import dev.kske.eventbus.IEvent;
+
 /**
- * Generates increasing IDs between two numbers.
- * 
- * Project: envoy-common
- * File: IDGenerator.java
- * Created: 31.12.2019
+ * Generates increasing IDs between two numbers.
  *
  * @author Kai S. K. Engelbart
  * @since Envoy Common v0.2-alpha
  */
-public final class IDGenerator implements Serializable {
+public final class IDGenerator implements IEvent, Serializable {
 
 	private final long	end;
 	private long		current;
diff --git a/common/src/main/java/envoy/data/LoginCredentials.java b/common/src/main/java/envoy/data/LoginCredentials.java
index e4edd72..3848989 100644
--- a/common/src/main/java/envoy/data/LoginCredentials.java
+++ b/common/src/main/java/envoy/data/LoginCredentials.java
@@ -9,10 +9,6 @@ import java.time.Instant;
  * 
- * File: LoginCredentials.java
- * Created: 29.12.2019
  *
  * @author Kai S. K. Engelbart
  * @since Envoy Common v0.2-alpha
diff --git a/common/src/main/java/envoy/data/Message.java b/common/src/main/java/envoy/data/Message.java
index 3258e34..e642566 100644
--- a/common/src/main/java/envoy/data/Message.java
+++ b/common/src/main/java/envoy/data/Message.java
@@ -9,10 +9,6 @@ import dev.kske.eventbus.IEvent;
  * Represents a unique message with a unique, numeric ID. Further metadata
  * includes the sender and recipient {@link User}s, as well as the creation
  * date and the current {@link MessageStatus}.
- * 
- * Project: envoy-common
- * File: Message.java
- * Created: 28.12.2019
  *
  * @author Kai S. K. Engelbart
  * @author Leon Hofmeister
@@ -28,23 +24,22 @@ public class Message implements Serializable, IEvent {
 	public enum MessageStatus {
 
 		/**
-		 * is selected, if a message was sent but not received by the server yet.
+		 * The message has not yet been sent to the server
 		 */
 		WAITING,
 
 		/**
-		 * is selected, if a sent message was received by the server.
+		 * The message has been sent to the server.
 		 */
 		SENT,
 
 		/**
-		 * is selected, if a message was delivered from the server to the recipient, but
-		 * has not been read yet.
+		 * The message has been received by its recipient.
 		 */
 		RECEIVED,
 
 		/**
-		 * is selected, if a recipient opened the corresponding chat of said message.
+		 * The message has been read by its recipient.
 		 */
 		READ
 	}
diff --git a/common/src/main/java/envoy/data/MessageBuilder.java b/common/src/main/java/envoy/data/MessageBuilder.java
index b1a3f74..9c5eb95 100644
--- a/common/src/main/java/envoy/data/MessageBuilder.java
+++ b/common/src/main/java/envoy/data/MessageBuilder.java
@@ -7,10 +7,6 @@ import envoy.data.Message.MessageStatus;
 
 /**
  * Provides a method of constructing the {@link Message} class.
- * 
- * Project: envoy-common
- * File: MessageBuilder.java
- * Created: 31.12.2019
  *
  * @author Kai S. K. Engelbart
  * @since Envoy Common v0.2-alpha
diff --git a/common/src/main/java/envoy/data/User.java b/common/src/main/java/envoy/data/User.java
index a423934..ab83070 100644
--- a/common/src/main/java/envoy/data/User.java
+++ b/common/src/main/java/envoy/data/User.java
@@ -1,17 +1,11 @@
 package envoy.data;
 
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.util.HashSet;
-import java.util.Set;
+import java.io.*;
+import java.util.*;
 
 /**
  * Represents a unique user with a unique, numeric ID, a name and a current
  * {@link UserStatus}.
- * 
- * Project: envoy-common
- * File: User.java
- * Created: 28.12.2019
  *
  * @author Kai S. K. Engelbart
  * @since Envoy Common v0.2-alpha
@@ -32,7 +26,7 @@ public final class User extends Contact {
 	 *
 	 * @since Envoy Common v0.2-alpha
 	 */
-	public static enum UserStatus {
+	public enum UserStatus {
 
 		/**
 		 * select this, if a user is online and can be interacted with
diff --git a/common/src/main/java/envoy/data/package-info.java b/common/src/main/java/envoy/data/package-info.java
index 39df4f5..10865d0 100644
--- a/common/src/main/java/envoy/data/package-info.java
+++ b/common/src/main/java/envoy/data/package-info.java
@@ -1,6 +1,6 @@
 /**
  * This package contains all data objects that are used both by Envoy Client and
- * by Envoy Server Standalone.
+ * by Envoy Server.
  *
  * @author Leon Hofmeister
  * @author Maximilian Käfer
diff --git a/common/src/main/java/envoy/event/ElementOperation.java b/common/src/main/java/envoy/event/ElementOperation.java
index b7d4c10..e585a84 100644
--- a/common/src/main/java/envoy/event/ElementOperation.java
+++ b/common/src/main/java/envoy/event/ElementOperation.java
@@ -1,13 +1,10 @@
 package envoy.event;
 
 /**
- * This enum declares all modification possibilities for a given container.
+ * This enum declares all modification possibilities for a given container.
+ * 
- * 
- * Project: envoy-common
- * File: ElementOperation.java
- * Created: 25 Mar 2020
+ * {@link ElementOperation#REMOVE}.
  *
  * @author Leon Hofmeister
  * @since Envoy Common v0.1-beta
diff --git a/common/src/main/java/envoy/event/Event.java b/common/src/main/java/envoy/event/Event.java
index 33ccc24..da3bc72 100644
--- a/common/src/main/java/envoy/event/Event.java
+++ b/common/src/main/java/envoy/event/Event.java
@@ -8,10 +8,6 @@ import dev.kske.eventbus.IEvent;
  * This class serves as a convenience base class for all events. It implements
  * the {@link IEvent} interface and provides a generic value. For events without
  * a value there also is {@link envoy.event.Event.Valueless}.
- * 
- * File: Event.java
- * Created: 04.12.2019
  *
  * @author Kai S. K. Engelbart
  * @param 
-	 * 
-	 * Project: envoy-common
-	 * File: Event.java
-	 * Created: 11 Feb 2020
+	 * Serves as a super class for events that do not carry a value.
 	 *
 	 * @author Kai S. K. Engelbart
 	 * @since Envoy Common v0.2-alpha
diff --git a/common/src/main/java/envoy/event/GroupCreation.java b/common/src/main/java/envoy/event/GroupCreation.java
index e7a8a2c..02270ee 100644
--- a/common/src/main/java/envoy/event/GroupCreation.java
+++ b/common/src/main/java/envoy/event/GroupCreation.java
@@ -1,16 +1,11 @@
 package envoy.event;
 
-import java.util.HashSet;
-import java.util.Set;
+import java.util.*;
 
 import envoy.data.User;
 
 /**
- * This event creates a group with the given name.
- * 
- * Project: envoy-common
- * File: GroupCreation.java
- * Created: 25 Mar 2020
+ * This event creates a group with the given name.
  *
  * @author Leon Hofmeister
  * @since Envoy Common v0.1-beta
@@ -30,7 +25,7 @@ public final class GroupCreation extends Event
- * File: GroupCreationResult.java
- * Created: 22.08.2020
  *
  * @author Leon Hofmeister
  * @since Envoy Common v0.2-beta
diff --git a/common/src/main/java/envoy/event/GroupMessageStatusChange.java b/common/src/main/java/envoy/event/GroupMessageStatusChange.java
index 50f6ae3..30d286e 100644
--- a/common/src/main/java/envoy/event/GroupMessageStatusChange.java
+++ b/common/src/main/java/envoy/event/GroupMessageStatusChange.java
@@ -6,10 +6,6 @@ import envoy.data.GroupMessage;
 import envoy.data.Message.MessageStatus;
 
 /**
- * Project: envoy-common
- * File: GroupMessageStatusChange.java
- * Created: 18.04.2020
- * 
  * @author Maximilian Käfer
  * @since Envoy Common v0.1-beta
  */
diff --git a/common/src/main/java/envoy/event/GroupResize.java b/common/src/main/java/envoy/event/GroupResize.java
index 6aec843..c8e8c76 100644
--- a/common/src/main/java/envoy/event/GroupResize.java
+++ b/common/src/main/java/envoy/event/GroupResize.java
@@ -1,18 +1,15 @@
 package envoy.event;
 
-import envoy.data.Contact;
-import envoy.data.Group;
-import envoy.data.User;
+import static envoy.event.ElementOperation.*;
+
+import envoy.data.*;
 
 /**
  * This event is used to communicate changes in the group size between client
- * and server.
+ * and server.
+ * 
- * Project: envoy-common
- * File: GroupResize.java
- * Created: 25 Mar 2020
  *
  * @author Leon Hofmeister
  * @since Envoy Common v0.1-beta
@@ -36,13 +33,13 @@ public final class GroupResize extends Event
- * File: HandshakeRejection.java
- * Created: 28 Jan 2020
  *
  * @author Kai S. K. Engelbart
  * @since Envoy Common v0.3-alpha
diff --git a/common/src/main/java/envoy/event/IDGeneratorRequest.java b/common/src/main/java/envoy/event/IDGeneratorRequest.java
index 70b49bd..09e8265 100644
--- a/common/src/main/java/envoy/event/IDGeneratorRequest.java
+++ b/common/src/main/java/envoy/event/IDGeneratorRequest.java
@@ -2,11 +2,7 @@ package envoy.event;
 
 /**
  * Signifies to the server that the client needs a new
- * {@link envoy.data.IDGenerator} instance.
- * 
- * Project: envoy-common
- * File: IDGeneratorRequest.java
- * Created: 28 Jan 2020
+ * {@link envoy.data.IDGenerator} instance.
  *
  * @author Kai S. K. Engelbart
  * @since Envoy Common v0.3-alpha
diff --git a/common/src/main/java/envoy/event/IsTyping.java b/common/src/main/java/envoy/event/IsTyping.java
index bb2d2c3..0b6f544 100644
--- a/common/src/main/java/envoy/event/IsTyping.java
+++ b/common/src/main/java/envoy/event/IsTyping.java
@@ -3,10 +3,6 @@ package envoy.event;
 /**
  * This event should be sent when a user is currently typing something in a
  * chat.
- * 
- * File: IsTyping.java
- * Created: 24.07.2020
  *
  * @author Leon Hofmeister
  * @since Envoy Client v0.2-beta
@@ -18,7 +14,8 @@ public final class IsTyping extends Event
+	 * The number of milliseconds that this event will be active.
+	 * 
- * File: IssueProposal.java
- * Created: 05.08.2020
+ * not disabled by its administrator, will forward it directly to Gitea.
  *
  * @author Leon Hofmeister
  * @since Envoy Common v0.2-beta
diff --git a/common/src/main/java/envoy/event/MessageStatusChange.java b/common/src/main/java/envoy/event/MessageStatusChange.java
index aa94e6d..33e2cb3 100644
--- a/common/src/main/java/envoy/event/MessageStatusChange.java
+++ b/common/src/main/java/envoy/event/MessageStatusChange.java
@@ -5,10 +5,6 @@ import java.time.Instant;
 import envoy.data.Message;
 
 /**
- * Project: envoy-common
- * File: MessageStatusChange.java
- * Created: 6 Jan 2020
- *
  * @author Kai S. K. Engelbart
  * @since Envoy Common v0.2-alpha
  */
diff --git a/common/src/main/java/envoy/event/NameChange.java b/common/src/main/java/envoy/event/NameChange.java
index b4558a7..368f4bc 100644
--- a/common/src/main/java/envoy/event/NameChange.java
+++ b/common/src/main/java/envoy/event/NameChange.java
@@ -3,14 +3,11 @@ package envoy.event;
 import envoy.data.Contact;
 
 /**
- * This event informs
+ * This event informs
+ * 
- * File: NameChange.java
- * Created: 25 Mar 2020
- *
  * @author Leon Hofmeister
  * @since Envoy Common v0.1-beta
  */
diff --git a/common/src/main/java/envoy/event/NewAuthToken.java b/common/src/main/java/envoy/event/NewAuthToken.java
index 81af7b6..82dccca 100644
--- a/common/src/main/java/envoy/event/NewAuthToken.java
+++ b/common/src/main/java/envoy/event/NewAuthToken.java
@@ -2,10 +2,6 @@ package envoy.event;
 
 /**
  * This event can be used to transmit a new authentication token to a client.
- * 
- * File: NewAuthToken.java
- * Created: 19.09.2020
  *
  * @author Kai S. K. Engelbart
  * @since Envoy Common v0.2-beta
diff --git a/common/src/main/java/envoy/event/NoAttachments.java b/common/src/main/java/envoy/event/NoAttachments.java
index aace460..3622569 100644
--- a/common/src/main/java/envoy/event/NoAttachments.java
+++ b/common/src/main/java/envoy/event/NoAttachments.java
@@ -3,10 +3,6 @@ package envoy.event;
 /**
  * This event is used so that the server can tell the client that attachments
  * will be filtered out.
- * 
- * File: NoAttachments.java
- * Created: 22.08.2020
  *
  * @author Leon Hofmeister
  * @since Envoy Common v0.2-beta
diff --git a/common/src/main/java/envoy/event/PasswordChangeRequest.java b/common/src/main/java/envoy/event/PasswordChangeRequest.java
index 0556e25..59ec8fb 100644
--- a/common/src/main/java/envoy/event/PasswordChangeRequest.java
+++ b/common/src/main/java/envoy/event/PasswordChangeRequest.java
@@ -3,10 +3,6 @@ package envoy.event;
 import envoy.data.Contact;
 
 /**
- * Project: envoy-common
- * File: PasswordChangeRequest.java
- * Created: 31.07.2020
- *
  * @author Leon Hofmeister
  * @since Envoy Common v0.2-beta
  */
diff --git a/common/src/main/java/envoy/event/PasswordChangeResult.java b/common/src/main/java/envoy/event/PasswordChangeResult.java
index 363e416..716404c 100644
--- a/common/src/main/java/envoy/event/PasswordChangeResult.java
+++ b/common/src/main/java/envoy/event/PasswordChangeResult.java
@@ -3,10 +3,6 @@ package envoy.event;
 /**
  * This class acts as a notice to the user whether his
  * {@link envoy.event.PasswordChangeRequest} was successful.
- * 
- * File: PasswordChangeResult.java
- * Created: 01.08.2020
  *
  * @author Leon Hofmeister
  * @since Envoy Common v0.2-beta
diff --git a/common/src/main/java/envoy/event/ProfilePicChange.java b/common/src/main/java/envoy/event/ProfilePicChange.java
index ceb2eff..3400dc4 100644
--- a/common/src/main/java/envoy/event/ProfilePicChange.java
+++ b/common/src/main/java/envoy/event/ProfilePicChange.java
@@ -1,10 +1,6 @@
 package envoy.event;
 
 /**
- * Project: envoy-common
- * File: ProfilePicChange.java
- * Created: 31.07.2020
- *
  * @author Leon Hofmeister
  * @since Envoy Common v0.2-beta
  */
diff --git a/common/src/main/java/envoy/event/UserStatusChange.java b/common/src/main/java/envoy/event/UserStatusChange.java
index e8c1f94..5a26f50 100644
--- a/common/src/main/java/envoy/event/UserStatusChange.java
+++ b/common/src/main/java/envoy/event/UserStatusChange.java
@@ -4,10 +4,6 @@ import envoy.data.User;
 import envoy.data.User.UserStatus;
 
 /**
- * Project: envoy-common
- * File: UserStatusChange.java
- * Created: 1 Feb 2020
- *
  * @author Leon Hofmeister
  * @since Envoy Common v0.2-alpha
  */
diff --git a/common/src/main/java/envoy/event/contact/ContactOperation.java b/common/src/main/java/envoy/event/contact/ContactOperation.java
index 48427d5..a31d147 100644
--- a/common/src/main/java/envoy/event/contact/ContactOperation.java
+++ b/common/src/main/java/envoy/event/contact/ContactOperation.java
@@ -1,15 +1,10 @@
 package envoy.event.contact;
 
 import envoy.data.Contact;
-import envoy.event.ElementOperation;
-import envoy.event.Event;
+import envoy.event.*;
 
 /**
- * Signifies the modification of a contact list.
- * 
- * Project: envoy-common
- * File: ContactOperation.java
- * Created: 05.02.2020
+ * Signifies the modification of a contact list.
  *
  * @author Maximilian Käfer
  * @since Envoy Common v0.2-alpha
diff --git a/common/src/main/java/envoy/event/contact/UserSearchRequest.java b/common/src/main/java/envoy/event/contact/UserSearchRequest.java
index f615f0c..6eb1925 100644
--- a/common/src/main/java/envoy/event/contact/UserSearchRequest.java
+++ b/common/src/main/java/envoy/event/contact/UserSearchRequest.java
@@ -4,10 +4,6 @@ import envoy.event.Event;
 
 /**
  * Requests a user search from the server.
- * 
- * File: UserSearchRequest.java
- * Created: 05.02.2020
  *
  * @author Maximilian Käfer
  * @since Envoy Common v0.2-alpha
diff --git a/common/src/main/java/envoy/event/contact/UserSearchResult.java b/common/src/main/java/envoy/event/contact/UserSearchResult.java
index 86b4c09..6b1358b 100644
--- a/common/src/main/java/envoy/event/contact/UserSearchResult.java
+++ b/common/src/main/java/envoy/event/contact/UserSearchResult.java
@@ -7,10 +7,6 @@ import envoy.event.Event;
 
 /**
  * Contains a list of users for which a search has been requested.
- * 
- * File: UserSearchResult.java
- * Created: 11 Feb 2020
  *
  * @author Kai S. K. Engelbart
  * @since Envoy Common v0.2-alpha
diff --git a/common/src/main/java/envoy/event/contact/package-info.java b/common/src/main/java/envoy/event/contact/package-info.java
index 375ea89..e1abec1 100644
--- a/common/src/main/java/envoy/event/contact/package-info.java
+++ b/common/src/main/java/envoy/event/contact/package-info.java
@@ -1,9 +1,5 @@
 /**
- * This package contains all contact-related events.
- * 
- * Project: envoy-common
- * File: package-info.java
- * Created: 28 Mar 2020
+ * This package contains all contact-related events.
  *
  * @author Leon Hofmeister
  * @author Maximilian Käfer
diff --git a/common/src/main/java/envoy/exception/EnvoyException.java b/common/src/main/java/envoy/exception/EnvoyException.java
index 0c02a52..a09b460 100644
--- a/common/src/main/java/envoy/exception/EnvoyException.java
+++ b/common/src/main/java/envoy/exception/EnvoyException.java
@@ -1,10 +1,6 @@
 package envoy.exception;
 
 /**
- * Project: envoy-common
- * File: EnvoyException.java
- * Created: 27 Oct 2019
- *
  * @author Kai S. K. Engelbart
  * @since Envoy v0.1-alpha
  */
diff --git a/common/src/main/java/envoy/util/Bounds.java b/common/src/main/java/envoy/util/Bounds.java
index c5575e0..8f8f381 100644
--- a/common/src/main/java/envoy/util/Bounds.java
+++ b/common/src/main/java/envoy/util/Bounds.java
@@ -4,10 +4,6 @@ import java.util.regex.Pattern;
 
 /**
  * Implements contact name validation.
- * 
- * File: Bounds.java
- * Created: 25.06.2020
  *
  * @author Kai S. K. Engelbart
  * @since Envoy Common v0.1-beta
diff --git a/common/src/main/java/envoy/util/EnvoyLog.java b/common/src/main/java/envoy/util/EnvoyLog.java
index e28189e..55f3a42 100644
--- a/common/src/main/java/envoy/util/EnvoyLog.java
+++ b/common/src/main/java/envoy/util/EnvoyLog.java
@@ -1,7 +1,6 @@
 package envoy.util;
 
-import java.io.File;
-import java.io.IOException;
+import java.io.*;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.logging.*;
@@ -11,10 +10,6 @@ import envoy.data.Config;
 /**
  * Configures the {@link java.util.logging} API to output the log into the
  * console and a log file.
- * 
- * File: EnvoyLogger.java
- * Created: 14.12.2019
  *
  * @author Leon Hofmeister
  * @author Kai S. K. Engelbart
diff --git a/common/src/main/java/envoy/util/SerializationUtils.java b/common/src/main/java/envoy/util/SerializationUtils.java
index 54fca82..f556657 100644
--- a/common/src/main/java/envoy/util/SerializationUtils.java
+++ b/common/src/main/java/envoy/util/SerializationUtils.java
@@ -4,10 +4,6 @@ import java.io.*;
 
 /**
  * Defines utility methods related to serialization.
- * 
- * File: SerializationUtils.java
- * Created: 23.12.2019
  *
  * @author Kai S. K. Engelbart
  * @since Envoy Common v0.2-alpha
@@ -34,8 +30,8 @@ public final class SerializationUtils {
 	 * @since Envoy Common v0.2-alpha
 	 */
 	public static int bytesToInt(byte[] bytes, int offset) {
-		return ((bytes[offset] & 0xFF) << 24) | ((bytes[offset + 1] & 0xFF) << 16) | ((bytes[offset + 2] & 0xFF) << 8)
-				| ((bytes[offset + 3] & 0xFF) << 0);
+		return (bytes[offset] & 0xFF) << 24 | (bytes[offset + 1] & 0xFF) << 16 | (bytes[offset + 2] & 0xFF) << 8
+				| (bytes[offset + 3] & 0xFF) << 0;
 	}
 
 	/**
diff --git a/server/src/main/java/envoy/server/Startup.java b/server/src/main/java/envoy/server/Startup.java
index 4f3f0d1..6beafee 100755
--- a/server/src/main/java/envoy/server/Startup.java
+++ b/server/src/main/java/envoy/server/Startup.java
@@ -6,20 +6,13 @@ import java.util.logging.Level;
 
 import com.jenkov.nioserver.Server;
 
-import envoy.server.data.PersistenceManager;
-import envoy.server.data.ServerConfig;
-import envoy.server.net.ConnectionManager;
-import envoy.server.net.ObjectMessageProcessor;
-import envoy.server.net.ObjectMessageReader;
+import envoy.server.data.*;
+import envoy.server.net.*;
 import envoy.server.processors.*;
 import envoy.util.EnvoyLog;
 
 /**
- * Starts the server.
- * 
- * Project: envoy-server-standalone
- * File: Startup.java
- * Created: 24.12.2019
+ * Starts the server.
  *
  * @author Kai S. K. Engelbart
  * @since Envoy Server Standalone v0.1-alpha
diff --git a/server/src/main/java/envoy/server/data/ConfigItem.java b/server/src/main/java/envoy/server/data/ConfigItem.java
index ba8a2fe..ba3fff5 100755
--- a/server/src/main/java/envoy/server/data/ConfigItem.java
+++ b/server/src/main/java/envoy/server/data/ConfigItem.java
@@ -1,14 +1,8 @@
 package envoy.server.data;
 
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
+import javax.persistence.*;
 
 /**
- * Project: envoy-server-standalone
- * File: ConfigItem.java
- * Created: 28 Jan 2020
- *
  * @author Kai S. K. Engelbart
  * @since Envoy Server Standalone v0.1-alpha
  */
diff --git a/server/src/main/java/envoy/server/data/Contact.java b/server/src/main/java/envoy/server/data/Contact.java
index a1e626d..36a302f 100644
--- a/server/src/main/java/envoy/server/data/Contact.java
+++ b/server/src/main/java/envoy/server/data/Contact.java
@@ -7,11 +7,7 @@ import javax.persistence.*;
 
 /**
  * This class acts as a superclass for all contacts, being {@link User}s and
- * {@link Group}s. 
- * 
- * Project: envoy-server-standalone
- * File: Contact.java
- * Created: 24.03.2020
+ * {@link Group}s.
  *
  * @author Maximilian Käfer
  * @since Envoy Server Standalone v0.1-alpha
diff --git a/server/src/main/java/envoy/server/data/Group.java b/server/src/main/java/envoy/server/data/Group.java
index 232c13e..f0ccb50 100644
--- a/server/src/main/java/envoy/server/data/Group.java
+++ b/server/src/main/java/envoy/server/data/Group.java
@@ -2,17 +2,11 @@ package envoy.server.data;
 
 import java.util.stream.Collectors;
 
-import javax.persistence.Entity;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
+import javax.persistence.*;
 
 /**
  * Represents a group inside the database. Referred to as "server group" as
- * opposed to "group" from Envoy Common.
- * 
- * Project: envoy-server-standalone
- * File: Group.java
- * Created: 24.03.2020
+ * opposed to "group" from Envoy Common.
  *
  * @author Maximilian Käfer
  * @since Envoy Server Standalone v0.1-alpha
@@ -32,14 +26,14 @@ public final class Group extends Contact {
 
 	/**
 	 * Named query retrieving a group by name (parameter {@code :name}).
-	 * 
+	 *
 	 * @since Envoy Server Standalone v0.1-beta
 	 */
 	public static final String findByName = "Group.findByName";
-	
+
 	/**
 	 * Named query retrieving all pending groups for a specific user (parameter {@code :user}, {@code :lastSeen}).
-	 * 
+	 *
 	 * @since Envoy Server Standalone v0.1-beta
 	 */
 	public static final String findPendingGroups = "Group.findPendingGroups";
diff --git a/server/src/main/java/envoy/server/data/GroupMessage.java b/server/src/main/java/envoy/server/data/GroupMessage.java
index 0bcd4e3..444a935 100644
--- a/server/src/main/java/envoy/server/data/GroupMessage.java
+++ b/server/src/main/java/envoy/server/data/GroupMessage.java
@@ -1,18 +1,13 @@
 package envoy.server.data;
 
 import java.time.Instant;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.*;
 
 import javax.persistence.*;
 
 import envoy.data.Group;
 
 /**
- * Project: envoy-server-standalone
- * File: GroupMessage.java
- * Created: 18.04.2020
- * 
  * @author Maximilian Käfer
  * @since Envoy Server Standalone v0.1-beta
  */
diff --git a/server/src/main/java/envoy/server/data/Message.java b/server/src/main/java/envoy/server/data/Message.java
index 2468fe6..bd5f006 100755
--- a/server/src/main/java/envoy/server/data/Message.java
+++ b/server/src/main/java/envoy/server/data/Message.java
@@ -7,10 +7,9 @@ import java.time.Instant;
 
 import javax.persistence.*;
 
-import envoy.data.Attachment;
+import envoy.data.*;
 import envoy.data.Attachment.AttachmentType;
 import envoy.data.Message.MessageStatus;
-import envoy.data.MessageBuilder;
 
 /**
  * This JPA entity, which will be referred to as database message, stores the
@@ -21,10 +20,6 @@ import envoy.data.MessageBuilder;
  * {@link Message#Message(envoy.data.Message)} constructor. A database message
  * can be converted to a regular message using the {@link Message#toCommon()}
  * method. In both cases, the objects will not contain references to each other.
- * 
- * File: Message.java
- * Created: 02.01.2020
  *
  * @author Kai S. K. Engelbart
  * @since Envoy Server Standalone v0.1-alpha
diff --git a/server/src/main/java/envoy/server/data/PersistenceManager.java b/server/src/main/java/envoy/server/data/PersistenceManager.java
index fbadbb9..f601fe5 100755
--- a/server/src/main/java/envoy/server/data/PersistenceManager.java
+++ b/server/src/main/java/envoy/server/data/PersistenceManager.java
@@ -9,10 +9,6 @@ import envoy.data.User.UserStatus;
 import envoy.server.net.ConnectionManager;
 
 /**
- * Project: envoy-server-standalone
- * File: PersistenceManager.java
- * Created: 1 Jan 2020
- *
  * @author Leon Hofmeister
  * @author Maximilian Käfer
  * @since Envoy Server Standalone v0.1-alpha
diff --git a/server/src/main/java/envoy/server/data/ServerConfig.java b/server/src/main/java/envoy/server/data/ServerConfig.java
index b16733d..96f4d01 100644
--- a/server/src/main/java/envoy/server/data/ServerConfig.java
+++ b/server/src/main/java/envoy/server/data/ServerConfig.java
@@ -5,10 +5,6 @@ import static java.util.function.Function.identity;
 import envoy.data.Config;
 
 /**
- * Project: server
- * File: ServerConfig.java
- * Created: 21.08.2020
- *
  * @author Leon Hofmeister
  * @since Envoy Server v0.2-beta
  */
diff --git a/server/src/main/java/envoy/server/data/User.java b/server/src/main/java/envoy/server/data/User.java
index 341ebd4..e4c0829 100755
--- a/server/src/main/java/envoy/server/data/User.java
+++ b/server/src/main/java/envoy/server/data/User.java
@@ -11,11 +11,7 @@ import envoy.data.User.UserStatus;
 /**
  * This class enables the storage of user specific data inside a database using
  * Hibernate. Its objects will be referred to as database users as opposed to
- * the common user objects present on both the client and the server.
- * 
- * Project: envoy-server-standalone
- * File: User.java
- * Created: 02.01.2020
+ * the common user objects present on both the client and the server.
  *
  * @author Kai S. K. Engelbart
  * @author Maximilian Käfer
diff --git a/server/src/main/java/envoy/server/net/ConnectionManager.java b/server/src/main/java/envoy/server/net/ConnectionManager.java
index a43b357..2dc7d2d 100755
--- a/server/src/main/java/envoy/server/net/ConnectionManager.java
+++ b/server/src/main/java/envoy/server/net/ConnectionManager.java
@@ -7,15 +7,10 @@ import java.util.stream.Collectors;
 import com.jenkov.nioserver.ISocketIdListener;
 
 import envoy.data.User.UserStatus;
-import envoy.server.data.Group;
-import envoy.server.data.PersistenceManager;
+import envoy.server.data.*;
 import envoy.server.processors.UserStatusChangeProcessor;
 
 /**
- * Project: envoy-server-standalone
- * File: ConnectionManager.java
- * Created: 03.01.2020
- *
  * @author Kai S. K. Engelbart
  * @since Envoy Server Standalone v0.1-alpha
  */
@@ -110,6 +105,6 @@ public final class ConnectionManager implements ISocketIdListener {
 	 * @since Envoy Server Standalone v0.1-beta
 	 */
 	public Set
- * 
- * Project: envoy-server-standalone
- * File: ObjectMessageProcessor.java
- * Created: 28.12.2019
+ * Handles incoming objects.
  *
  * @author Kai S. K. Engelbart
  * @since Envoy Server Standalone v0.1-alpha
@@ -55,14 +46,13 @@ public final class ObjectMessageProcessor implements IMessageProcessor {
 			for (@SuppressWarnings("rawtypes")
 			ObjectProcessor p : processors) {
 				Class> c = (Class>) ((ParameterizedType) p.getClass().getGenericInterfaces()[0]).getActualTypeArguments()[0];
-				if (c.equals(obj.getClass())) {
+				if (c.equals(obj.getClass()))
 					try {
 						p.process(c.cast(obj), message.socketId, new ObjectWriteProxy(writeProxy));
 						break;
 					} catch (IOException e) {
 						logger.log(Level.SEVERE, "Exception during processor execution: ", e);
 					}
-				}
 			}
 		} catch (IOException | ClassNotFoundException e) {
 			e.printStackTrace();
diff --git a/server/src/main/java/envoy/server/net/ObjectMessageReader.java b/server/src/main/java/envoy/server/net/ObjectMessageReader.java
index ddd2dca..a86c589 100755
--- a/server/src/main/java/envoy/server/net/ObjectMessageReader.java
+++ b/server/src/main/java/envoy/server/net/ObjectMessageReader.java
@@ -2,19 +2,14 @@ package envoy.server.net;
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.*;
 
 import com.jenkov.nioserver.*;
 
 import envoy.util.SerializationUtils;
 
 /**
- * This {@link IMessageReader} decodes serialized Java objects.
- * 
- * Project: envoy-server-standalone
- * File: ObjectMessageReader.java
- * Created: 28.12.2019
+ * This {@link IMessageReader} decodes serialized Java objects.
  *
  * @author Kai S. K. Engelbart
  * @since Envoy Server Standalone v0.1-alpha
diff --git a/server/src/main/java/envoy/server/net/ObjectWriteProxy.java b/server/src/main/java/envoy/server/net/ObjectWriteProxy.java
index 4e8229e..53f12fc 100755
--- a/server/src/main/java/envoy/server/net/ObjectWriteProxy.java
+++ b/server/src/main/java/envoy/server/net/ObjectWriteProxy.java
@@ -5,19 +5,13 @@ import java.util.Set;
 import java.util.logging.Logger;
 import java.util.stream.Stream;
 
-import com.jenkov.nioserver.Message;
-import com.jenkov.nioserver.WriteProxy;
+import com.jenkov.nioserver.*;
 
 import envoy.server.data.Contact;
-import envoy.util.EnvoyLog;
-import envoy.util.SerializationUtils;
+import envoy.util.*;
 
 /**
- * This class defines methods to send an object to a client.
- * 
- * Project: envoy-server-standalone
- * File: ObjectWriteProxy.java
- * Created: 04.01.2020
+ * This class defines methods to send an object to a client.
  *
  * @author Kai S. K. Engelbart
  * @since Envoy Server Standalone v0.1-alpha
@@ -67,8 +61,8 @@ public final class ObjectWriteProxy {
 	}
 
 	/**
-	 * Sends an object to all contact in a set that are online.
-	 * 
+	 * Sends an object to all contacts in a set that are online.
+	 *
 	 * @param contacts the contacts to send the object to
 	 * @param message  the object to send
 	 * @since Envoy Server Standalone v0.1-beta
@@ -76,8 +70,8 @@ public final class ObjectWriteProxy {
 	public void writeToOnlineContacts(Set extends Contact> contacts, Object message) { writeToOnlineContacts(contacts.stream(), message); }
 
 	/**
-	 * Sends an object to all contact in a set that are online.
-	 * 
+	 * Sends an object to all contacts in a set that are online.
+	 *
 	 * @param contacts the contacts to send the object to
 	 * @param message  the object to send
 	 * @since Envoy Server Standalone v0.1-beta
diff --git a/server/src/main/java/envoy/server/processors/ContactOperationProcessor.java b/server/src/main/java/envoy/server/processors/ContactOperationProcessor.java
index ba4f240..178bff4 100755
--- a/server/src/main/java/envoy/server/processors/ContactOperationProcessor.java
+++ b/server/src/main/java/envoy/server/processors/ContactOperationProcessor.java
@@ -5,15 +5,10 @@ import java.util.logging.Logger;
 import envoy.event.ElementOperation;
 import envoy.event.contact.ContactOperation;
 import envoy.server.data.PersistenceManager;
-import envoy.server.net.ConnectionManager;
-import envoy.server.net.ObjectWriteProxy;
+import envoy.server.net.*;
 import envoy.util.EnvoyLog;
 
 /**
- * Project: envoy-server-standalone
- * File: ContactOperationProcessor.java
- * Created: 08.02.2020
- *
  * @author Kai S. K. Engelbart
  * @since Envoy Server Standalone v0.1-alpha
  */
diff --git a/server/src/main/java/envoy/server/processors/GroupCreationProcessor.java b/server/src/main/java/envoy/server/processors/GroupCreationProcessor.java
index 2839aeb..8f40af2 100644
--- a/server/src/main/java/envoy/server/processors/GroupCreationProcessor.java
+++ b/server/src/main/java/envoy/server/processors/GroupCreationProcessor.java
@@ -4,20 +4,12 @@ import static envoy.server.Startup.config;
 
 import java.util.HashSet;
 
-import envoy.event.ElementOperation;
-import envoy.event.GroupCreation;
-import envoy.event.GroupCreationResult;
+import envoy.event.*;
 import envoy.event.contact.ContactOperation;
-import envoy.server.data.Contact;
-import envoy.server.data.PersistenceManager;
-import envoy.server.net.ConnectionManager;
-import envoy.server.net.ObjectWriteProxy;
+import envoy.server.data.*;
+import envoy.server.net.*;
 
 /**
- * Project: envoy-server-standalone
- * File: GroupCreationProcessor.java
- * Created: 26.03.2020
- *
  * @author Maximilian Käfer
  * @since Envoy Server Standalone v0.1-beta
  */
diff --git a/server/src/main/java/envoy/server/processors/GroupMessageProcessor.java b/server/src/main/java/envoy/server/processors/GroupMessageProcessor.java
index 4cb7c2c..77ab232 100644
--- a/server/src/main/java/envoy/server/processors/GroupMessageProcessor.java
+++ b/server/src/main/java/envoy/server/processors/GroupMessageProcessor.java
@@ -10,18 +10,12 @@ import java.util.logging.Logger;
 import javax.persistence.EntityExistsException;
 
 import envoy.data.GroupMessage;
-import envoy.event.MessageStatusChange;
-import envoy.event.NoAttachments;
+import envoy.event.*;
 import envoy.server.data.PersistenceManager;
-import envoy.server.net.ConnectionManager;
-import envoy.server.net.ObjectWriteProxy;
+import envoy.server.net.*;
 import envoy.util.EnvoyLog;
 
 /**
- * Project: envoy-server-standalone
- * File: GroupMessageProcessor.java
- * Created: 18.04.2020
- *
  * @author Maximilian Käfer
  * @since Envoy Server Standalone v0.1-beta
  */
diff --git a/server/src/main/java/envoy/server/processors/GroupMessageStatusChangeProcessor.java b/server/src/main/java/envoy/server/processors/GroupMessageStatusChangeProcessor.java
index 515639b..2604698 100644
--- a/server/src/main/java/envoy/server/processors/GroupMessageStatusChangeProcessor.java
+++ b/server/src/main/java/envoy/server/processors/GroupMessageStatusChangeProcessor.java
@@ -4,23 +4,15 @@ import static envoy.data.Message.MessageStatus.READ;
 
 import java.time.Instant;
 import java.util.Collections;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+import java.util.logging.*;
 
 import envoy.data.Message.MessageStatus;
-import envoy.event.GroupMessageStatusChange;
-import envoy.event.MessageStatusChange;
-import envoy.server.data.GroupMessage;
-import envoy.server.data.PersistenceManager;
-import envoy.server.net.ConnectionManager;
-import envoy.server.net.ObjectWriteProxy;
+import envoy.event.*;
+import envoy.server.data.*;
+import envoy.server.net.*;
 import envoy.util.EnvoyLog;
 
 /**
- * Project: envoy-server-standalone
- * File: GroupMessageStatusChangeProcessor.java
- * Created: 03.07.2020
- * 
  * @author Maximilian Käfer
  * @since Envoy Server Standalone v0.1-beta
  */
diff --git a/server/src/main/java/envoy/server/processors/GroupResizeProcessor.java b/server/src/main/java/envoy/server/processors/GroupResizeProcessor.java
index 86ec875..0a5b697 100644
--- a/server/src/main/java/envoy/server/processors/GroupResizeProcessor.java
+++ b/server/src/main/java/envoy/server/processors/GroupResizeProcessor.java
@@ -1,16 +1,10 @@
 package envoy.server.processors;
 
 import envoy.event.GroupResize;
-import envoy.server.data.Contact;
-import envoy.server.data.PersistenceManager;
-import envoy.server.net.ConnectionManager;
-import envoy.server.net.ObjectWriteProxy;
+import envoy.server.data.*;
+import envoy.server.net.*;
 
 /**
- * Project: envoy-server-standalone
- * File: GroupResizeProcessor.java
- * Created: 03.04.2020
- *
  * @author Maximilian Käfer
  * @since Envoy Server Standalone v0.1-beta
  */
diff --git a/server/src/main/java/envoy/server/processors/IDGeneratorRequestProcessor.java b/server/src/main/java/envoy/server/processors/IDGeneratorRequestProcessor.java
index edd6e7b..0cf9823 100755
--- a/server/src/main/java/envoy/server/processors/IDGeneratorRequestProcessor.java
+++ b/server/src/main/java/envoy/server/processors/IDGeneratorRequestProcessor.java
@@ -4,15 +4,10 @@ import java.io.IOException;
 
 import envoy.data.IDGenerator;
 import envoy.event.IDGeneratorRequest;
-import envoy.server.data.ConfigItem;
-import envoy.server.data.PersistenceManager;
+import envoy.server.data.*;
 import envoy.server.net.ObjectWriteProxy;
 
 /**
- * Project: envoy-server-standalone
- * File: IDGeneratorRequestProcessor.java
- * Created: 28 Jan 2020
- *
  * @author Kai S. K. Engelbart
  * @author Maximilian Käfer
  * @since Envoy Server Standalone v0.1-alpha
diff --git a/server/src/main/java/envoy/server/processors/IsTypingProcessor.java b/server/src/main/java/envoy/server/processors/IsTypingProcessor.java
index a147ed1..aaf2987 100644
--- a/server/src/main/java/envoy/server/processors/IsTypingProcessor.java
+++ b/server/src/main/java/envoy/server/processors/IsTypingProcessor.java
@@ -3,17 +3,11 @@ package envoy.server.processors;
 import java.io.IOException;
 
 import envoy.event.IsTyping;
-import envoy.server.data.PersistenceManager;
-import envoy.server.data.User;
-import envoy.server.net.ConnectionManager;
-import envoy.server.net.ObjectWriteProxy;
+import envoy.server.data.*;
+import envoy.server.net.*;
 
 /**
  * This processor handles incoming {@link IsTyping} events.
- * 
- * File: IsTypingProcessor.java
- * Created: 24.07.2020
  *
  * @author Leon Hofmeister
  * @since Envoy Server v0.2-beta
diff --git a/server/src/main/java/envoy/server/processors/IssueProposalProcessor.java b/server/src/main/java/envoy/server/processors/IssueProposalProcessor.java
index 78feb21..aa00ff1 100644
--- a/server/src/main/java/envoy/server/processors/IssueProposalProcessor.java
+++ b/server/src/main/java/envoy/server/processors/IssueProposalProcessor.java
@@ -3,10 +3,8 @@ package envoy.server.processors;
 import static envoy.server.Startup.config;
 
 import java.io.IOException;
-import java.net.HttpURLConnection;
-import java.net.URL;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+import java.net.*;
+import java.util.logging.*;
 
 import envoy.event.IssueProposal;
 import envoy.server.net.ObjectWriteProxy;
@@ -15,10 +13,6 @@ import envoy.util.EnvoyLog;
 /**
  * This processor handles incoming {@link IssueProposal}s and automatically
  * creates a new issue on the gitea site, if not disabled by its administrator.
- * 
- * File: IssueProposalProcessor.java
- * Created: 05.08.2020
  *
  * @author Leon Hofmeister
  * @since Envoy Server v0.2-beta
diff --git a/server/src/main/java/envoy/server/processors/LoginCredentialProcessor.java b/server/src/main/java/envoy/server/processors/LoginCredentialProcessor.java
index b14346f..b6c362b 100755
--- a/server/src/main/java/envoy/server/processors/LoginCredentialProcessor.java
+++ b/server/src/main/java/envoy/server/processors/LoginCredentialProcessor.java
@@ -19,11 +19,7 @@ import envoy.server.util.*;
 import envoy.util.*;
 
 /**
- * This {@link ObjectProcessor} handles {@link LoginCredentials}.
- * 
- * Project: envoy-server-standalone
- * File: LoginCredentialProcessor.java
- * Created: 30.12.2019
+ * This {@link ObjectProcessor} handles {@link LoginCredentials}.
  *
  * @author Kai S. K. Engelbart
  * @author Maximilian Käfer
diff --git a/server/src/main/java/envoy/server/processors/MessageProcessor.java b/server/src/main/java/envoy/server/processors/MessageProcessor.java
index 5b03007..e7605d6 100755
--- a/server/src/main/java/envoy/server/processors/MessageProcessor.java
+++ b/server/src/main/java/envoy/server/processors/MessageProcessor.java
@@ -2,25 +2,18 @@ package envoy.server.processors;
 
 import static envoy.server.Startup.config;
 
-import java.util.logging.Level;
-import java.util.logging.Logger;
+import java.util.logging.*;
 
 import javax.persistence.EntityExistsException;
 
 import envoy.data.Message;
-import envoy.event.MessageStatusChange;
-import envoy.event.NoAttachments;
+import envoy.event.*;
 import envoy.server.data.PersistenceManager;
-import envoy.server.net.ConnectionManager;
-import envoy.server.net.ObjectWriteProxy;
+import envoy.server.net.*;
 import envoy.util.EnvoyLog;
 
 /**
  * This {@link ObjectProcessor} handles incoming {@link Message}s.
- * 
- * File: MessageProcessor.java
- * Created: 30.12.2019
  *
  * @author Kai S. K. Engelbart
  * @author Maximilian Käfer
diff --git a/server/src/main/java/envoy/server/processors/MessageStatusChangeProcessor.java b/server/src/main/java/envoy/server/processors/MessageStatusChangeProcessor.java
index 950f0c2..83f08fe 100755
--- a/server/src/main/java/envoy/server/processors/MessageStatusChangeProcessor.java
+++ b/server/src/main/java/envoy/server/processors/MessageStatusChangeProcessor.java
@@ -1,21 +1,15 @@
 package envoy.server.processors;
 
 import java.io.IOException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+import java.util.logging.*;
 
 import envoy.data.Message.MessageStatus;
 import envoy.event.MessageStatusChange;
 import envoy.server.data.PersistenceManager;
-import envoy.server.net.ConnectionManager;
-import envoy.server.net.ObjectWriteProxy;
+import envoy.server.net.*;
 import envoy.util.EnvoyLog;
 
 /**
- * Project: envoy-server-standalone
- * File: MessageStatusChangeProcessor.java
- * Created: 10 Jan 2020
- *
  * @author Leon Hofmeister
  * @since Envoy Server Standalone v0.1-alpha
  */
diff --git a/server/src/main/java/envoy/server/processors/NameChangeProcessor.java b/server/src/main/java/envoy/server/processors/NameChangeProcessor.java
index aa6897f..7914c37 100644
--- a/server/src/main/java/envoy/server/processors/NameChangeProcessor.java
+++ b/server/src/main/java/envoy/server/processors/NameChangeProcessor.java
@@ -3,15 +3,10 @@ package envoy.server.processors;
 import java.io.IOException;
 
 import envoy.event.NameChange;
-import envoy.server.data.Contact;
-import envoy.server.data.PersistenceManager;
+import envoy.server.data.*;
 import envoy.server.net.ObjectWriteProxy;
 
 /**
- * Project: envoy-server-standalone
- * File: NameChangeProcessor.java
- * Created: 26 Mar 2020
- *
  * @author Leon Hofmeister
  * @since Envoy Server Standalone v0.1-beta
  */
diff --git a/server/src/main/java/envoy/server/processors/ObjectProcessor.java b/server/src/main/java/envoy/server/processors/ObjectProcessor.java
index ab6666e..cebd1f2 100755
--- a/server/src/main/java/envoy/server/processors/ObjectProcessor.java
+++ b/server/src/main/java/envoy/server/processors/ObjectProcessor.java
@@ -6,11 +6,7 @@ import envoy.server.net.ObjectWriteProxy;
 
 /**
  * This interface defines methods for processing objects of a specific
- * type incoming from a client.
- * 
- * Project: envoy-server-standalone
- * File: ObjectProcessor.java
- * Created: 30.12.2019
+ * type incoming from a client.
  *
  * @author Kai S. K. Engelbart
  * @param 
- * File: PasswordChangeRequestProcessor.java
- * Created: 31.07.2020
- *
  * @author Leon Hofmeister
  * @since Envoy Server v0.2-beta
  */
diff --git a/server/src/main/java/envoy/server/processors/ProfilePicChangeProcessor.java b/server/src/main/java/envoy/server/processors/ProfilePicChangeProcessor.java
index f777ed8..112170c 100644
--- a/server/src/main/java/envoy/server/processors/ProfilePicChangeProcessor.java
+++ b/server/src/main/java/envoy/server/processors/ProfilePicChangeProcessor.java
@@ -6,10 +6,6 @@ import envoy.event.ProfilePicChange;
 import envoy.server.net.ObjectWriteProxy;
 
 /**
- * Project: envoy-server-standalone
- * File: ProfilePicChangeProcessor.java
- * Created: 01.08.2020
- *
  * @author Leon Hofmeister
  * @since Envoy Server v0.2-beta
  */
diff --git a/server/src/main/java/envoy/server/processors/UserSearchProcessor.java b/server/src/main/java/envoy/server/processors/UserSearchProcessor.java
index 3504217..7166d6a 100755
--- a/server/src/main/java/envoy/server/processors/UserSearchProcessor.java
+++ b/server/src/main/java/envoy/server/processors/UserSearchProcessor.java
@@ -4,18 +4,11 @@ import java.io.IOException;
 import java.util.stream.Collectors;
 
 import envoy.data.Contact;
-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;
-import envoy.server.net.ObjectWriteProxy;
+import envoy.event.contact.*;
+import envoy.server.data.*;
+import envoy.server.net.*;
 
 /**
- * Project: envoy-server-standalone
- * File: UserSearchProcessor.java
- * Created: 08.02.2020
- *
  * @author Kai S. K. Engelbart
  * @author Maximilian Käfer
  * @since Envoy Server Standalone v0.1-alpha
diff --git a/server/src/main/java/envoy/server/processors/UserStatusChangeProcessor.java b/server/src/main/java/envoy/server/processors/UserStatusChangeProcessor.java
index 57a9b25..9350af0 100755
--- a/server/src/main/java/envoy/server/processors/UserStatusChangeProcessor.java
+++ b/server/src/main/java/envoy/server/processors/UserStatusChangeProcessor.java
@@ -4,17 +4,12 @@ import java.util.logging.Logger;
 
 import envoy.data.User.UserStatus;
 import envoy.event.UserStatusChange;
-import envoy.server.data.PersistenceManager;
-import envoy.server.data.User;
+import envoy.server.data.*;
 import envoy.server.net.ObjectWriteProxy;
 import envoy.util.EnvoyLog;
 
 /**
  * This processor handles incoming {@link UserStatusChange}.
- * 
- * File: UserStatusChangeProcessor.java
- * Created: 1 Feb 2020
  *
  * @author Leon Hofmeister
  * @since Envoy Server Standalone v0.1-alpha
diff --git a/server/src/main/java/envoy/server/util/AuthTokenGenerator.java b/server/src/main/java/envoy/server/util/AuthTokenGenerator.java
index b74c77a..c6fc928 100644
--- a/server/src/main/java/envoy/server/util/AuthTokenGenerator.java
+++ b/server/src/main/java/envoy/server/util/AuthTokenGenerator.java
@@ -4,10 +4,6 @@ import java.security.SecureRandom;
 
 /**
  * Provides a secure token generation algorithm.
- * 
- * File: AuthTokenGenerator.java
- * Created: 19.09.2020
  *
  * @author Kai S. K. Engelbart
  * @since Envoy Server v0.2-beta
diff --git a/server/src/main/java/envoy/server/util/PasswordUtil.java b/server/src/main/java/envoy/server/util/PasswordUtil.java
index f3e3b3e..80ba6c1 100644
--- a/server/src/main/java/envoy/server/util/PasswordUtil.java
+++ b/server/src/main/java/envoy/server/util/PasswordUtil.java
@@ -1,9 +1,7 @@
 package envoy.server.util;
 
 import java.math.BigInteger;
-import java.security.GeneralSecurityException;
-import java.security.NoSuchAlgorithmException;
-import java.security.SecureRandom;
+import java.security.*;
 
 import javax.crypto.SecretKeyFactory;
 import javax.crypto.spec.PBEKeySpec;
@@ -11,10 +9,6 @@ import javax.crypto.spec.PBEKeySpec;
 /**
  * Provides a password hashing and comparison mechanism using the
  * {@code PBKDF2WithHmacSHA1} algorithm.
- * 
- * File: PasswordUtil.java
- * Created: 10.07.2020
  * 
  * @author Kai S. K. Engelbart
  * @since Envoy Server Standalone v0.1-beta
diff --git a/server/src/main/java/envoy/server/util/VersionUtil.java b/server/src/main/java/envoy/server/util/VersionUtil.java
index 2d50796..aa1d661 100644
--- a/server/src/main/java/envoy/server/util/VersionUtil.java
+++ b/server/src/main/java/envoy/server/util/VersionUtil.java
@@ -5,10 +5,6 @@ import java.util.regex.Pattern;
 /**
  * Implements a comparison algorithm between Envoy versions and defines minimal
  * and maximal client versions compatible with this server.
- * 
- * File: VersionUtil.java
- * Created: 23.06.2020
  * 
  * @author Kai S. K. Engelbart
  * @since Envoy Server Standalone v0.1-beta
diff --git a/server/src/main/java/envoy/server/util/package-info.java b/server/src/main/java/envoy/server/util/package-info.java
index f052882..3cfc809 100644
--- a/server/src/main/java/envoy/server/util/package-info.java
+++ b/server/src/main/java/envoy/server/util/package-info.java
@@ -1,9 +1,5 @@
 /**
  * This package contains utility classes used in Envoy Server.
- * 
- * File: package-info.java
- * Created: 23.06.2020
  * 
  * @author Kai S. K. Engelbart
  * @since Envoy Server Standalone v0.1-beta