public QueryHandler(SystemObject querySender, short simulationVariant, ConfigSimulationObject simulationObject) {
			_querySender = querySender;
			_isRequestFromApplication = _querySender instanceof ClientApplication;
			_debug.fine("QueryHandler für " + _querySender + ", isRequestFromApplication: " + _isRequestFromApplication);
			_simulationVariant = simulationVariant;
			_worker = new Thread(this);
			_worker.start();
			if(simulationVariant > 0 && simulationObject == null) throw new IllegalStateException("Für eine Simulation wurde kein Simulationsobjekt angegeben");
			_simulationObject = simulationObject;

			// Die Anfragen müssen identifiziert werden (über ihre Datenidentifikation), aus diesem Grund wird an dieser Stelle
			// die erwarteten/unterstützten Identifikationen erzeugt.
			if(simulationVariant > 0) {
				// Es handelt sich um eine Simulation, also müssen neue Datenidentifikationen erzeut werden
				_dataDescriptionReadLocal = new DataDescription(_dataDescriptionRead.getAttributeGroup(), _dataDescriptionRead.getAspect(), simulationVariant);
				_dataDescriptionWriteLocal = new DataDescription(
						_dataDescriptionWrite.getAttributeGroup(), _dataDescriptionWrite.getAspect(), simulationVariant
				);
				_dataDescriptionAreaLocal = new DataDescription(_dataDescriptionArea.getAttributeGroup(), _dataDescriptionArea.getAspect(), simulationVariant);
				_dataDescriptionUserLocal = new DataDescription(_dataDescriptionUser.getAttributeGroup(), _dataDescriptionUser.getAspect(), simulationVariant);
			}
			else {
				// Es handelt sich um keine Simulation, es können die normalen Datenidentifikationen benutzt werden
				_dataDescriptionReadLocal = _dataDescriptionRead;
				_dataDescriptionWriteLocal = _dataDescriptionWrite;
				_dataDescriptionAreaLocal = _dataDescriptionArea;
				_dataDescriptionUserLocal = _dataDescriptionUser;
			}

			try {
				// 4 Kanäle, die Antworten der Konfiguration zurückschicken

				// Auf welches Objekt soll sich angemeldet werden (_querySender)
				// Wer verschickt diese Nachricht (_localAuthority)
				_senderReplyWriteTasks = new ConfigurationAnswerWriteTasks(_connection, _querySender, _localAuthority, simulationVariant);

				// Auf welches Objekt soll sich angemeldet werden (_querySender)
				// Wer verschickt diese Nachricht (_localAuthority)
				_senderReplyReadTasks = new ConfigurationAnswerReadTasks(_connection, _querySender, _localAuthority, simulationVariant);

				// Simulationen dürfen weder Benutzer ändern noch Konfigurationsbereiche steuern. Aus diesem Grund werden keine Sender für
				// diesen Fall angemeldet.
				if(simulationVariant > 0) {
					// Auf die nicht initialisierten Objekte wird bei Simulationen nicht Zugegriffen, da die Simulation
					// über die Datenidentifikation identifiziert werden kann.
					_senderReplyUserAdministrationTask = null;
					_senderReplyAreaTasks = null;
				}
				else {
					// Auf welches Objekt soll sich angemeldet werden (_querySender)
					// Wer verschickt diese Nachricht (_localAuthority)
					_senderReplyUserAdministrationTask = new ConfigurationAnswerUserAdministrationTasks(_connection, _querySender, _localAuthority);

					// Auf welches Objekt soll sich angemeldet werden (_querySender)
					// Wer verschickt diese Nachricht (_localAuthority)
					_senderReplyAreaTasks = new ConfigurationAnswerAreaTasks(_connection, _querySender, _localAuthority);
				}

				// Die Konfiguration muss alle Änderungen an Objekten propagieren. Dafür werden alle Listener bei allen Typen angemeldet.

				// Alle dynamische Typen anfordern
				final List<SystemObject> allDynamicTypes = _localConfiguration.getType("typ.dynamischerTyp").getElements();

				for(SystemObject objectType : allDynamicTypes) {
					final DynamicObjectType dynamicObjectType = (DynamicObjectType)objectType;

					// Listener für "Objekte werden ungültig" anmelden
					// Änderungen werden über die "atg.konfigurationsAnfrageSchnittstelleLesend" propagiert
					final InvalidationListenerForTyps invalidationListenerForTyps = new InvalidationListenerForTyps(_senderReplyReadTasks, dynamicObjectType, _isRequestFromApplication);
					dynamicObjectType.addInvalidationListener(invalidationListenerForTyps);
					// Damit die Listener wieder entfernt werden können
					_invalidationListenerForAllTyps.put(dynamicObjectType, invalidationListenerForTyps);

					// Listener für "Der Name ändert sich" anmelden
					final NameChangedListenerForTyps nameChangedListenerForTyps = new NameChangedListenerForTyps(_senderReplyReadTasks, dynamicObjectType,
					                                                                                             _isRequestFromApplication
					);
					dynamicObjectType.addNameChangeListener(nameChangedListenerForTyps);
					_nameChangedListener.put(dynamicObjectType, nameChangedListenerForTyps);

					// Listener für "Neues Objekt" anmelden
					final ObjectCreatedListenerForTyps objectCreatedListenerForTyps = new ObjectCreatedListenerForTyps(
							_senderReplyReadTasks, dynamicObjectType
					);
					dynamicObjectType.addObjectCreationListener(objectCreatedListenerForTyps);
					_objectCreatedListener.put(dynamicObjectType, objectCreatedListenerForTyps);
				}
			}
			catch(ConfigurationException e) {
				e.printStackTrace();
				throw new RuntimeException(e);
			}
			catch(OneSubscriptionPerSendData oneSubscriptionPerSendData) {
				oneSubscriptionPerSendData.printStackTrace();
				throw new RuntimeException(oneSubscriptionPerSendData);
			}
		}