docs: private void handleMultiChannelCapabilityReportResponse(SerialMessage serialMessage, int offset) {
  		logger.debug("Process Multi-channel capability Report");
  		int receivedEndpointId = serialMessage.getMessagePayloadByte(offset) & 0x7F;
  		boolean dynamic = ((serialMessage.getMessagePayloadByte(offset) & 0x80) != 0);
  		int genericDeviceClass = serialMessage.getMessagePayloadByte(offset + 1);
  		int specificDeviceClass = serialMessage.getMessagePayloadByte(offset + 2);
  		
  		logger.debug("Endpoints are the same device class = {}", endpointsAreTheSameDeviceClass ? "true" : false);
  
  		// Loop either all endpoints, or just set command classes on one, depending on whether
  		// all endpoints have the same device class.
  		int startId = this.endpointsAreTheSameDeviceClass ? 1 : receivedEndpointId;
  		int endId = this.endpointsAreTheSameDeviceClass ? this.endpoints.size() : receivedEndpointId;
  		
  		boolean supportsBasicCommandClass = this.getNode().supportsCommandClass(CommandClass.BASIC);
  		
  		for (int endpointId = startId; endpointId <= endId; endpointId++) {
  			ZWaveEndpoint endpoint = this.endpoints.get(endpointId);
  			
  			if (endpoint == null){
  				logger.error("Endpoint {} not found on node {}. Cannot set command classes.", endpoint, this.getNode().getNodeId());
  				continue;
  			}
  	
  			ZWaveDeviceClass.Basic basic = this.getNode().getDeviceClass().getBasicDeviceClass();
  			ZWaveDeviceClass.Generic generic = ZWaveDeviceClass.Generic.getGeneric(genericDeviceClass);
  			if (generic == null) {
  				logger.error(String.format("Endpoint %d has invalid device class. generic = 0x%02x, specific = 0x%02x.", 
  						endpoint, genericDeviceClass, specificDeviceClass));
  				continue;
  			}
  			ZWaveDeviceClass.Specific specific = ZWaveDeviceClass.Specific.getSpecific(generic, specificDeviceClass);
  			if (specific == null) {
  				logger.error(String.format("Endpoint %d has invalid device class. generic = 0x%02x, specific = 0x%02x.", 
  						endpoint, genericDeviceClass, specificDeviceClass));
  				continue;
  			}
  			
  			logger.debug("Endpoint Id = {}", endpointId);
  			logger.debug("Endpoints is dynamic = {}", dynamic ? "true" : false);
  			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 = endpoint.getDeviceClass();
  			deviceClass.setBasicDeviceClass(basic);
  			deviceClass.setGenericDeviceClass(generic);
  			deviceClass.setSpecificDeviceClass(specific);
  			
  			// add basic command class, if it's also supported by the parent node.
  			if (supportsBasicCommandClass) {
  				ZWaveCommandClass commandClass = new ZWaveBasicCommandClass(this.getNode(), this.getController(), endpoint);
  				endpoint.addCommandClass(commandClass);
  			}
  			
  			for (int i = 0; i < serialMessage.getMessagePayload().length - offset - 3; i++) {
  				int data = serialMessage.getMessagePayloadByte(offset + 3 + i);
  				if(data == 0xef )  {
  					// TODO: Implement control command classes
  					break;
  				}
  				logger.debug(String.format("Adding command class 0x%02X to the list of supported command classes.", data));
  				ZWaveCommandClass commandClass = ZWaveCommandClass.getInstance(data, this.getNode(), this.getController(), endpoint);
  				if (commandClass == null) {
  					continue;
  				}
  
  				endpoint.addCommandClass(commandClass);
  				ZWaveCommandClass parentClass = this.getNode().getCommandClass(commandClass.getCommandClass());
  
  				// copy version info to endpoint classes.
  				if (parentClass != null) {
  					commandClass.setVersion(parentClass.getVersion());
  				}
  			}
  		}
  		
  		if (this.endpointsAreTheSameDeviceClass)
  			// advance node stage.
  			this.getNode().advanceNodeStage();
  		else {
  			for (ZWaveEndpoint ep : this.endpoints.values())
  			{
  				if (ep.getDeviceClass().getBasicDeviceClass() == ZWaveDeviceClass.Basic.NOT_KNOWN) // only advance node stage when all endpoints are known.
  					return;
  			}
  			// advance node stage.
  			this.getNode().advanceNodeStage();
  		}
  	}