code: public void checkForDeadOrSleepingNodes(){
  		int completeCount = 0;
  		
  		if (zwaveNodes.isEmpty())
  			return;
  		
  		// There are still nodes waiting to get a ping.
  		// So skip the dead node checking.
  		for (SerialMessage serialMessage : sendQueue) {
  			if (serialMessage.getPriority() == SerialMessage.SerialMessagePriority.Low)
  				return;
  		}
  		
  		logger.trace("Checking for Dead or Sleeping Nodes.");
  		for (Map.Entry<Integer, ZWaveNode> entry : zwaveNodes.entrySet()){
  			if (entry.getValue().getNodeStage() == ZWaveNode.NodeStage.NODEBUILDINFO_EMPTYNODE)
  				continue;
  			
  			logger.debug(String.format("Node %d has been in Stage %s since %s", entry.getKey(), entry.getValue().getNodeStage().getLabel(), entry.getValue().getQueryStageTimeStamp().toString()));
  			
  			if(entry.getValue().getNodeStage() == ZWaveNode.NodeStage.NODEBUILDINFO_DONE || !entry.getValue().isListening()) {
  				completeCount++;
  				continue;
  			}
  			
  			logger.trace("Checking if {} miliseconds have passed in current stage.", QUERY_STAGE_TIMEOUT);
  			
  			if(Calendar.getInstance().getTimeInMillis() < (entry.getValue().getQueryStageTimeStamp().getTime() + QUERY_STAGE_TIMEOUT))
  				continue;
  			
  			logger.warn(String.format("Node %d may be dead, setting stage to DEAD.", entry.getKey()));
  			entry.getValue().setNodeStage(ZWaveNode.NodeStage.NODEBUILDINFO_DEAD);
  
  			completeCount++;
  		}
  		
  		if(this.zwaveNodes.size() == completeCount){
  			ZWaveEvent zEvent = new ZWaveEvent(ZWaveEventType.NETWORK_EVENT, 1, 0, "INIT_DONE");
  			this.notifyEventListeners(zEvent);
  		}
  	}
docs: Checks for dead or sleeping nodes during Node initialization.
  JwS: merged checkInitComplete and checkForDeadOrSleepingNodes to prevent possibly looping nodes multiple times.