public void run()
		{
			final byte[] buf = PacketHelper.toPacket(new ConnectionstateRequest(channelId,
					new HPAI(HPAI.IPV4_UDP, useNat ? null : (InetSocketAddress) socket
							.getLocalSocketAddress())));
			final DatagramPacket p = new DatagramPacket(buf, buf.length, ctrlEndpt.getAddress(),
					ctrlEndpt.getPort());
			try {
				while (true) {
					Thread.sleep(HEARTBEAT_INTERVAL * 1000);
					int i = 0;
					for (; i < MAX_REQUEST_ATTEMPTS; i++) {
						logger.trace("sending connection state request, attempt " + (i + 1));
						synchronized (this) {
							received = false;
							socket.send(p);

							long remaining = CONNECTIONSTATE_REQ_TIMEOUT * 1000;
							final long end = System.currentTimeMillis() + remaining;
							while (!received && remaining > 0) {
								wait(remaining);
								remaining = end - System.currentTimeMillis();
							}
							if (received)
								break;
						}
					}
					// disconnect on no reply
					if (i == MAX_REQUEST_ATTEMPTS) {
						close(CloseEvent.INTERNAL, "no heartbeat response", LogLevel.WARN, null);
						break;
					}
				}
			}
			catch (final InterruptedException e) {
				// simply let this thread exit
			}
			catch (final IOException e) {
				close(CloseEvent.INTERNAL, "heartbeat communication failure", LogLevel.ERROR, e);
			}
		}