code: @Override
  	public Promise ping(long timeoutMillis, String nodeID) {
  
  		// Local node?
  		if (this.nodeID.equals(nodeID)) {
  			Tree rsp = new Tree();
  			long time = System.currentTimeMillis();
  			rsp.put("time", time);
  			rsp.put("arrived", time);
  			return Promise.resolve(rsp);
  		}
  
  		// Do we have a transporter?
  		if (transporter == null) {
  			return Promise.reject(new ServiceNotAvailableError(nodeID, "ping"));
  		}
  
  		// Create new promise
  		Promise promise = new Promise();
  
  		// Set timeout
  		long timeoutAt;
  		if (timeoutMillis > 0) {
  			timeoutAt = System.currentTimeMillis() + timeoutMillis;
  		} else {
  			timeoutAt = 0;
  		}
  
  		// Register promise (timeout and response handling)
  		String id = uid.nextUID();
  		register(id, promise, timeoutAt, nodeID, "ping");
  
  		// Send request via transporter
  		Tree message = transporter.createPingPacket(id);
  		transporter.publish(PACKET_PING, nodeID, message);
  
  		// Return promise
  		return promise;
  	}
docs: --- PING / PONG HANDLING ---