docs: private void handleIdentifyNodeResponse(SerialMessage incomingMessage) {
  		logger.trace("Handle Message Get Node ProtocolInfo Response");
  		
  		int nodeId = lastSentMessage.getMessagePayloadByte(0);
  		logger.debug("ProtocolInfo for Node = " + nodeId);
  		
  		boolean listening = (incomingMessage.getMessagePayloadByte(0) & 0x80)!=0 ? true : false;
  		boolean routing = (incomingMessage.getMessagePayloadByte(0) & 0x40)!=0 ? true : false;
  		int version = (incomingMessage.getMessagePayloadByte(0) & 0x07) + 1;
  		logger.debug("Listening = " + listening);
  		logger.debug("Routing = " + routing);
  		logger.debug("Version = " + version);
  		
  		this.zwaveNodes.get(nodeId).setListening(listening);
  		this.zwaveNodes.get(nodeId).setRouting(routing);
  		this.zwaveNodes.get(nodeId).setVersion(version);
  
  		ZWaveDeviceClass.Basic basic = ZWaveDeviceClass.Basic.getBasic(incomingMessage.getMessagePayloadByte(3));
  		if (basic == null) {
  			logger.error(String.format("Basic device class 0x%02x not found", incomingMessage.getMessagePayloadByte(3)));
  			return;
  		}
  		ZWaveDeviceClass.Generic generic = ZWaveDeviceClass.Generic.getGeneric(incomingMessage.getMessagePayloadByte(4));
  		if (generic == null) {
  			logger.error(String.format("Generic device class 0x%02x not found", incomingMessage.getMessagePayloadByte(4)));
  			return;
  		}
  		ZWaveDeviceClass.Specific specific = ZWaveDeviceClass.Specific.getSpecific(generic, incomingMessage.getMessagePayloadByte(5));
  		if (specific == null) {
  			logger.error(String.format("Specific device class 0x%02x not found", incomingMessage.getMessagePayloadByte(5)));
  			return;
  		}
  		logger.debug(String.format("Basic = %s 0x%02x", basic.getLabel(), basic.getKey()));
  		logger.debug(String.format("Generic = %s 0x%02x", generic.getLabel(), generic.getKey()));
  		logger.debug(String.format("Specific = %s 0x%02x", specific.getLabel(), specific.getKey()));
  		
  		ZWaveDeviceClass deviceClass = this.zwaveNodes.get(nodeId).getDeviceClass();
  		deviceClass.setBasicDeviceClass(basic);
  		deviceClass.setGenericDeviceClass(generic);
  		deviceClass.setSpecificDeviceClass(specific);
  		
  		// Add mandatory command classes as specified by it's generic device class.
  		for (ZWaveCommandClass.CommandClass commandClass : generic.getMandatoryCommandClasses()) {
  			ZWaveCommandClass zwaveCommandClass = ZWaveCommandClass.getInstance(commandClass.getKey(), this.zwaveNodes.get(nodeId), this);
  			if (zwaveCommandClass != null)
  				this.zwaveNodes.get(nodeId).addCommandClass(zwaveCommandClass);
  		}
  
  		// Add mandatory command classes as specified by it's specific device class.
  		for (ZWaveCommandClass.CommandClass commandClass : specific.getMandatoryCommandClasses()) {
  			ZWaveCommandClass zwaveCommandClass = ZWaveCommandClass.getInstance(commandClass.getKey(), this.zwaveNodes.get(nodeId), this);
  			if (zwaveCommandClass != null)
  				this.zwaveNodes.get(nodeId).addCommandClass(zwaveCommandClass);
  		}
  		
  		// Add the WAKE_UP command class to this node, since it's not listening.
  		if (!listening) {
  			ZWaveCommandClass zwaveCommandClass = ZWaveCommandClass.getInstance(ZWaveCommandClass.CommandClass.WAKE_UP.getKey(), this.zwaveNodes.get(nodeId), this);
  			if (zwaveCommandClass != null)
  				this.zwaveNodes.get(nodeId).addCommandClass(zwaveCommandClass);
  		}
  
      	// advance node stage of the current node.
  		this.getNode(nodeId).advanceNodeStage();
  	}