public Updates createUpdates(boolean useRIBs,
			ArrayList<String> inputRIBsFilenames, boolean componentOnly,
			boolean correlated, T visibleASs,
			ArrayList<String> inputUpdatesFilenames, boolean synchronise) {

		Updates updates;

		// read Updates from visible/monitored ASs only
		// ////// ?????????????? And what with neighbours of visible ASs???????
		// And also with AS path including ONLY visible/monitored ASs
		// I want to find a root cause, so I want to analyse only prefixes
		// located in available graph of visible/monitored ASs
		if (useRIBs) { // if monitoring routers' RIBs are available
						// only updates with AS Path including only VisibleASs
						// will be loaded and analysed

			// prepare updates
			if (correlated) {
				// load OriginsASOnlyRIB for every monitor router
				logger.info("loading RIBs with origins ASes only...");
				ArrayList<OriginsOnlyRIB> allRIBs = new ArrayList<OriginsOnlyRIB>();
				for (String inputRIBfilename : inputRIBsFilenames) {
					allRIBs.add(new OriginsOnlyRIB(inputRIBfilename, visibleASs
							.getVisibleASsNames()));
				}
				logger.info("RIBs loaded.");
				
				updates = new UpdatesFromVisibleASsWithOriginAS(inputUpdatesFilenames,
						allRIBs, visibleASs.getVisibleASsNames(),
						synchronise);
			} else {
				
				// load RIB with full AS Path for every monitor router
				logger.info("loading RIBs...");
				ArrayList<RIB> allRIBs = new ArrayList<RIB>();
				for (String inputRIBfilename : inputRIBsFilenames) {
					allRIBs.add(new RIB(inputRIBfilename, visibleASs
							.getVisibleASsNames()));
				}
				logger.info("RIBs loaded.");
				
				if (componentOnly) {
					updates = new UpdatesWithVisibleAS_Path(
							inputUpdatesFilenames, allRIBs,
							new ArrayList<Integer>(visibleASs
									.getBiggestConnectedGraphComponent()
									.vertexSet()), synchronise);
				} else {
					updates = new UpdatesWithVisibleAS_Path(
							inputUpdatesFilenames, allRIBs,
							visibleASs.getVisibleASsNames(), synchronise);
				}
			}
		} else { // if RIBs are not available
					// currently I'm forced to use all updates coming from
					// Visible ASs,
					// without AS Path filtering
					//
					// The problem is to determine AS Path for prefix
					// withdrawals.
					// This problem could be solved without having a RIB,
					// just recreating one by tracing of all previous updates
					// for long enough time period.
					// However, at this step I'm not going to implement this
					// idea as it needs time which I think I don't have now.
			if (componentOnly) {
				updates = new UpdatesFromVisibleASs(inputUpdatesFilenames,
						new ArrayList<Integer>(visibleASs
								.getBiggestConnectedGraphComponent()
								.vertexSet()), synchronise);
			} else {
				updates = new UpdatesFromVisibleASs(inputUpdatesFilenames,
						visibleASs.getVisibleASsNames(), synchronise);
			}
		}
		
		// load updates
		updates.readUpdates();

		if (synchronise) {
			// print out stats
			int total = 0;
			for (SingleASspikes spikes : updates.getUpdateMap().values()) {
				total += spikes.getCurrentUpdateSum();
			}

			logger.info(total
					+ " update messages from "
					+ updates.getUpdateMap().keySet().size()
					+ " monitored ASs loaded before synchronisation. Syncing time...");

			updates.synchronise();
		}

		// print out stats
		int total = 0;
		for (SingleASspikes spikes : updates.getUpdateMap().values()) {
			total += spikes.getCurrentUpdateSum();
		}

		logger.info(total + " update messages from "
				+ updates.getUpdateMap().keySet().size()
				+ " monitored ASs loaded");

		return updates;
	}