docs: @Override
  	public void handleApplicationCommandRequest(SerialMessage serialMessage,
  			int offset, int endpoint) {
  		logger.trace("Handle Message Wake Up Request");
  		logger.debug(String.format("Received Wake Up Request for Node ID = %d", this.getNode().getNodeId()));
  		int command = serialMessage.getMessagePayloadByte(offset);
  
  		switch (command) {
  			case WAKE_UP_INTERVAL_SET:
  			case WAKE_UP_INTERVAL_GET:
  			case WAKE_UP_INTERVAL_CAPABILITIES_GET:
  			case WAKE_UP_NO_MORE_INFORMATION:
  				logger.warn(String.format("Command 0x%02X not implemented.", command));
  				return;
  			case WAKE_UP_INTERVAL_REPORT:
  				logger.trace("Process Wake Up Interval");
  				
  				// according to open-zwave: it seems that some devices send incorrect interval report messages. Don't know if they are spurious.
  				// if not we should advance the node stage.
                  if(serialMessage.getMessagePayload().length < offset + 4) {
                  		logger.error("Unusual response: WAKE_UP_INTERVAL_REPORT with length = {}. Ignored.", serialMessage.getMessagePayload().length);
                  		return;
                  }
                  
                  int targetNodeId = serialMessage.getMessagePayloadByte(offset +4);
                  int receivedInterval = ((serialMessage.getMessagePayloadByte(offset + 1)) << 16) | ((serialMessage.getMessagePayloadByte(offset + 2)) << 8) | (serialMessage.getMessagePayloadByte(offset + 3));
  				logger.debug(String.format("Wake up interval report for nodeId = %d, value = %d seconds, targetNodeId = %d", this.getNode().getNodeId(), receivedInterval, targetNodeId));
                  
  				if (targetNodeId != this.getController().getOwnNodeId())
  					return;
  				
  				this.interval = receivedInterval;
  				logger.debug("Wake up interval set for node {}", this.getNode().getNodeId());
  				
  				this.initializationComplete = true;
  				this.getNode().advanceNodeStage();
  				break;
  			case WAKE_UP_INTERVAL_CAPABILITIES_REPORT:
  				logger.trace("Process Wake Up Interval Capabilities");
  				
                  this.minInterval = ((serialMessage.getMessagePayloadByte(offset + 1)) << 16) | ((serialMessage.getMessagePayloadByte(offset + 2)) << 8) | (serialMessage.getMessagePayloadByte(offset + 3));
                  this.maxInterval = ((serialMessage.getMessagePayloadByte(offset + 4)) << 16) | ((serialMessage.getMessagePayloadByte(offset + 5)) << 8) | (serialMessage.getMessagePayloadByte(offset + 6));
                  this.defaultInterval = ((serialMessage.getMessagePayloadByte(offset + 7)) << 16) | ((serialMessage.getMessagePayloadByte(offset + 8)) << 8) | (serialMessage.getMessagePayloadByte(offset + 9));
                  this.intervalStep = ((serialMessage.getMessagePayloadByte(offset + 10)) << 16) | ((serialMessage.getMessagePayloadByte(offset + 11)) << 8) | (serialMessage.getMessagePayloadByte(offset + 12));
  				
  				logger.debug(String.format("Wake up interval capabilities report for nodeId = %d", this.getNode().getNodeId()));
  				logger.debug(String.format("Minimum interval = %d", this.minInterval));
  				logger.debug(String.format("Maximum interval = %d", this.maxInterval));
  				logger.debug(String.format("Default interval = %d", this.defaultInterval));
  				logger.debug(String.format("Interval step = %d", this.intervalStep));
                  
  				this.initializationComplete = true;
  				this.getNode().advanceNodeStage();
  				break;
  			case WAKE_UP_NOTIFICATION:
  				logger.trace("Process Wake Up Notification");
  				
  				logger.debug("Node {} is awake", this.getNode().getNodeId());
  				this.setAwake(true);
  				serialMessage.setTransActionCanceled(true);
  
  				// if this node has not gone through it's query stages yet, finish it.
  				if (this.getNode().getNodeStage() != NodeStage.NODEBUILDINFO_DONE && !this.initializationComplete) {
  					logger.info("Got Wake Up Notification from node {}, continuing initialization.", this.getNode().getNodeId());
  					this.getNode().setNodeStage(NodeStage.NODEBUILDINFO_WAKEUP);
  					this.getNode().advanceNodeStage();
  					return;
  				}
  
  				logger.debug("Sending {} messages from the wake-up queue of node {}", this.wakeUpQueue.size(), this.getNode().getNodeId());
  
  				// reset node stage, apparently we woke up again.
  				this.getNode().setNodeStage(NodeStage.NODEBUILDINFO_DONE);
  
  				// handle all messages in the wake-up queue for this node.
  				while (!this.wakeUpQueue.isEmpty()) {
  					serialMessage = this.wakeUpQueue.poll();
  					this.getController().sendData(serialMessage);
  				}
  				
  				// no more information. Go back to sleep.
  				logger.trace("No more messages, go back to sleep node {}", this.getNode().getNodeId());
  				this.getController().sendData(this.getNoMoreInformationMessage());
  				break;
  			default:
  				logger.warn(String.format("Unsupported Command 0x%02X for command class %s (0x%02X).", 
  					command, 
  					this.getCommandClass().getLabel(),
  					this.getCommandClass().getKey()));
  		}
  	}