public ConfigurationQueryManager(
			ClientDavInterface connection,
			ConfigDataModel localConfiguration,
			ConfigurationAuthority localAuthority,
			Authentication authentication,
			final File foreignObjectCacheFile) {
		_connection = connection;
		_localConfiguration = localConfiguration;

		// Die alte ConfigApp setzt diesen Wert. Die neue ConfigurationApp kann den Wert aus dem Datenmodell beziehen.
		if(localAuthority != null) {
			// Aufruf alte ConfigApp
			_localAuthority = localAuthority;
		}
		else {
			// Aufruf neue ConfigurationApp
			_localAuthority = _localConfiguration.getConfigurationAuthority();
		}
		_foreignObjectManager = new ForeignObjectManager(connection, localConfiguration, _localAuthority, foreignObjectCacheFile);

		// 4 Kanäle, auf die sich die Konfiguration als Senke anmeldet
		_dataDescriptionWrite = getDataDescription(localConfiguration, "atg.konfigurationsAnfrageSchnittstelleSchreibend", "asp.anfrage");
		_dataDescriptionRead = getDataDescription(localConfiguration, "atg.konfigurationsAnfrageSchnittstelleLesend", "asp.anfrage");
		_dataDescriptionUser = getDataDescription(localConfiguration, "atg.konfigurationsBenutzerverwaltungsAnfrageSchnittstelle", "asp.anfrage");
		_dataDescriptionArea = getDataDescription(localConfiguration, "atg.konfigurationsBereichsverwaltungsAnfrageSchnittstelle", "asp.anfrage");

		_authentication = authentication;

		// 1) Alle Simulationen anfordern und entsprechende Simulationsobjekte erzeugen
		final MutableSet mutableSet = _connection.getLocalConfigurationAuthority().getMutableSet("Simulationen");
		final List<SystemObject> simulations = mutableSet.getElements();

		for(SystemObject simulationSystemObject : simulations) {
			synchronized(_simulationObjects) {
				if(simulationSystemObject.isValid() && !_simulationObjects.containsKey(simulationSystemObject) &&
				   (simulationSystemObject.isOfType("typ.onlineSimulation") || simulationSystemObject.isOfType("typ.offlineSimulation"))) {
					final ConfigSimulationObject newSimulationObject;
					try {
						newSimulationObject = createNewSimulationObject(simulationSystemObject);
					}
					catch(RuntimeException e) {
						_debug.warning("Fehler beim Zugriff auf die Simulation " + simulationSystemObject + " (Objekt wird ignoriert)", e);
						continue;
					}
					catch(OneSubscriptionPerSendData oneSubscriptionPerSendData) {
						// Eine Doppelanmeldung wird verhindert, da es für jede Simulation nur einen Sender pro Simulationsvariante
						// geben kann.
						oneSubscriptionPerSendData.printStackTrace();
						_debug.error("Fehler beim Anmelden einer Simulation", oneSubscriptionPerSendData);
						throw new IllegalStateException(oneSubscriptionPerSendData);
					}
					_simulationObjects.put(simulationSystemObject, newSimulationObject);
					_simulations.put(new Short(newSimulationObject.getSimulationVariant()), newSimulationObject);
				}
			}
		}

		// 2) Auf Änderungen dieser Menge anmelden, damit bei neuen Simulationen ein neues Objekt angelegt werden kann. Wird eine
		// Simulation aus der Menge entfernt, so muss auch das Objekt benachrichtigt und entfernt werden
		_simulationListener = new SimulationListener();
		mutableSet.addChangeListener(_simulationListener);
	}