private void sendDelayedMessage(TimeStampedMessage timeStampedMessage) {
		String destination = timeStampedMessage.getDestination();
		Connection connection = null;

		// LC1 & VC2: Just before timestamping event, increments local clock
		clockService.incrementTimeStamp();

		// LC2(a) & VC3: Includes the timestamp to the message
		timeStampedMessage.setTimeStamp(ClockFactory.getTimeStamp());

		/* Log the event */
		try {
			loggerOut.writeObject(timeStampedMessage);
			textArea.append("Logged send delay");
		} catch (IOException e1) {
			e1.printStackTrace();
		}

		if (!connectionPool.containsKey(timeStampedMessage.getDestination())) {
			connection = createConnection(timeStampedMessage.getDestination(), configurationFileReader.getProcesses());
			if (connection == null) {
				textArea.append("Cannot create connection, give up sending message!\n");
				return;
			}
		} else {
			connection = connectionPool.get(destination);
		}

		if (connection == null) {
			textArea.append("Connection doesn't exsit\n");
			return;
		}

		try {
			if (connection.getOutputStream() == null) {
				textArea.append("Connection's output stream doesn't exist\n");

				// remove this connection from connection pool
				Iterator<Entry<String, Connection>> iter = connectionPool.entrySet().iterator();
				while (iter.hasNext()) {
					Entry<String, Connection> entry = iter.next();
					if (entry.getValue() == connection) {
						connectionPool.remove(entry.getKey());
						entry.getValue().close();
						break;
					}
				}
				return;
			}
			connection.getOutputStream().writeObject(timeStampedMessage);

		} catch (IOException e) {
			textArea.append("Send message fail!\n");
		}
	}