private void run() {
		try {
		    this.serverUI.updateTextArea("[Waiting for connection]");
			this.connection = this.providerSocket.accept();
			this.serverUI.updateTextArea("[Connection Received] : " + this.connection.getInetAddress().getHostAddress());

			// Initialize the input and output streams in preparation for
			// communication with the client
			this.out = new ObjectOutputStream(this.connection.getOutputStream());
			this.out.flush();
			this.in = new ObjectInputStream(this.connection.getInputStream());

			// Acknowledge the client's connection.
			sendMessage(this.response);

			do {
				try {
					// Read the Request and log it
					this.request = (Request) this.in.readObject();
					this.serverUI.updateTextArea("[Request] : " + this.request.getAction().getType().toString());

					if (this.request.getAction().getType() != ActionType.CLOSE) {
						// Throw out Requests with no credentials
						if (this.request.getSession() != null) {
							this.response = Authenticator.authenticateUser(this.request);
						} else {
							this.response = new Response(ResponseStatus.FAILURE);
						}

						if (this.request.getAction().getType() != ActionType.CLOSE) {
							sendMessage(this.response);
						}
					} 

				} catch (ClassNotFoundException classnot) {
				    this.serverUI.updateTextArea("[Error] : " + "Data received in unknown format");
				}
			} while (this.request.getAction().getType() != ActionType.CLOSE);
		} catch (IOException ioException) {
			ioException.printStackTrace();
		} finally {
			// Cleanup
			try {
				this.in.close();
				this.out.close();
			} catch (IOException ioException) {
			    this.serverUI.updateTextArea("[Error] : " + ioException.getMessage());
			}
		}
	}