SystemObject directDuplicate(final ConfigurationObject object, ConfigurationObject duplicatedObject, final Map<String, String> substitudePids)
			throws ConfigurationChangeException {

		// das Objekt wird dupliziert (nur KonfigurationObjekte)
		if(duplicatedObject == null) {
			final String pid = substitudePids.get(object.getPid());
			duplicatedObject = getConfigurationArea().createConfigurationObject(
					(ConfigurationObjectType)object.getType(), pid == null ? object.getPid() : pid, object.getName(), null
			);
		}

		// Mengen werden dupliziert und dem Objekt hinzugefügt
		final List<ObjectSet> sets = object.getObjectSets();
		for(ObjectSet set : sets) {
			// neue Menge erstellen
			final String pid = substitudePids.get(set.getPid());
			final ObjectSet duplicatedSet = (ObjectSet)getConfigurationArea().createConfigurationObject(
					set.getObjectSetType(), pid == null ? set.getPid() : pid, set.getName(), null
			);
			if(set.getObjectSetType().getReferenceType() == ReferenceType.COMPOSITION) {
				// bei Komposition müssen die Elemente selber dupliziert werden
				final List<SystemObject> elements = set.getElements();
				for(SystemObject element : elements) {
					// jedes Element wird dupliziert
					duplicatedSet.add(directDuplicate((ConfigurationObject)element, null, substitudePids));
				}
			}
			else {
				// alle aktuellen Elemente aus der alten Menge nehmen und der neuen Menge hinzufügen
				final List<SystemObject> elements = set.getElements();
				duplicatedSet.add(elements.toArray(new SystemObject[elements.size()]));
			}
			// Menge dem Objekt hinzufügen
			duplicatedObject.addSet(duplicatedSet);
		}

		// Sans, STS, KonfigAss: lookup erstellen und benutzen
		ConfigDataModel dataModel = (ConfigDataModel)getDataModel();
		Map<ConfigurationArea, Short> configurationVersions = new HashMap<ConfigurationArea, Short>();
		Collection<ConfigurationArea> areas = dataModel.getAllConfigurationAreas().values();

		for (ConfigurationArea configurationArea: areas) {
			configurationVersions.put(configurationArea, configurationArea.getModifiableVersion());
		}

		ObjectLookup lookup = new VersionedView(dataModel, configurationVersions);

		// alle Datensätze prüfen
		final Collection<AttributeGroupUsage> atgUsages = object.getUsedAttributeGroupUsages();
		for(AttributeGroupUsage atgUsage : atgUsages) {
			final Data data = ((ConfigSystemObject)object).getConfigurationData(atgUsage, lookup);
			if(data != null) {
				final Data modifiableData = data.createModifiableCopy();
				// Kompositionen ersetzen
				duplicateDependentObjects(modifiableData, substitudePids);
				// geänderten Datensatz speichern
				duplicatedObject.setConfigurationData(atgUsage, modifiableData);
			}
		}
		return duplicatedObject;
	}