* @param property          die Eigenschaften der Attributgruppe
	 *
	 * @throws ConfigurationChangeException Falls die Attributgruppenverwendungen nicht an der Attributgruppe gespeichert werden konnten.
	 */
	private void setAttributeGroupUsagesObjectSet(ConfigurationArea configurationArea, AttributeGroup atg, AttributeGroupProperties property)
			throws ConfigurationChangeException {
		// Merken, welche Attributgruppenverwendungen es an der Attributgruppe gibt
		final Map<Aspect, AttributeGroupUsage> atgUsageMap = new HashMap<Aspect, AttributeGroupUsage>();

		NonMutableSet atgUsageSet = atg.getNonMutableSet("AttributgruppenVerwendungen");
		if(atgUsageSet != null) {
			for(SystemObject systemObject : atgUsageSet.getElementsInModifiableVersion()) {
				final AttributeGroupUsage usage = (AttributeGroupUsage)systemObject;
				atgUsageMap.put(usage.getAspect(), usage);
			}
			setSystemObjectKeeping(atgUsageSet);
		}
		else {
			// Die Menge der Attributgruppenverwendungen gibt es noch nicht, muss also neu angelegt werden
			final ConfigurationObjectType setType = (ConfigurationObjectType)_dataModel.getType(Pid.SetType.ATTRIBUTE_GROUP_USAGES);
			atgUsageSet = (NonMutableSet)configurationArea.createConfigurationObject(setType, "", "AttributgruppenVerwendungen", null);
			atg.addSet(atgUsageSet);
			_debug.finer("Eine Menge der Attributgruppenverwendungen an der Attributgruppe '" + atg.getPid() + "' wurde erstellt.");
		}

		// enthält alle ATGVs, die in der nächsten Version aktiv sein sollen
		final Collection<AttributeGroupUsage> nextCurrentAtgUsageList = new ArrayList<AttributeGroupUsage>();

		// für jeden Aspekt wird eine Attributgruppenverwendung erstellt, wenn sie noch nicht vorhanden ist
		final ConfigurationObjectType type = (ConfigurationObjectType)_dataModel.getType(Pid.Type.ATTRIBUTE_GROUP_USAGE);
		final String atgvStr = "atgv." + atg.getPid() + ".";	// erster Teil der Pid einer Attributgruppenverwendung

		// handelt es sich um eine parametrierbare Attributgruppe, dann dürfen folgende drei Aspekte nicht fehlen:
		if(property.isParameter()) {
			// Aspekt "ParameterSoll" wird verarbeitet
			{
				final Aspect asp = _dataModel.getAspect("asp.parameterSoll");
				AttributeGroupUsage attributeGroupUsage = atgUsageMap.get(asp);
				if(attributeGroupUsage != null) {
					// prüfen, ob auch die ATGV korrekt ist.
					if(!attributeGroupUsage.isExplicitDefined() || !(attributeGroupUsage.getUsage() == AttributeGroupUsage.Usage.OnlineDataAsSourceReceiver
					                                                 || attributeGroupUsage.getUsage() == AttributeGroupUsage.Usage
							.OnlineDataAsSourceReceiverOrSenderDrain)) {
						setAttributeGroupUsageProperties(attributeGroupUsage, atg, asp, AttributeGroupUsage.Usage.OnlineDataAsSourceReceiver, true);
					}
					setSystemObjectKeeping(attributeGroupUsage);
				}
				else {
					// Die Attributgruppenverwendung ist nicht vorhanden -> erstellen
					attributeGroupUsage = (AttributeGroupUsage)configurationArea.createConfigurationObject(type, atgvStr + asp.getPid(), "", null);
					setAttributeGroupUsageProperties(attributeGroupUsage, atg, asp, AttributeGroupUsage.Usage.OnlineDataAsSourceReceiver, true);
					atgUsageSet.add(attributeGroupUsage);	// ATGV hinzufügen
				}
				nextCurrentAtgUsageList.add(attributeGroupUsage);
			}
			// Aspekt "ParameterVorgabe" wird verarbeitet
			{
				final Aspect asp = _dataModel.getAspect("asp.parameterVorgabe");
				AttributeGroupUsage attributeGroupUsage = atgUsageMap.get(asp);
				if(attributeGroupUsage != null) {
					// prüfen, ob auch die ATGV korrekt ist.
					if(!attributeGroupUsage.isExplicitDefined() || !(attributeGroupUsage.getUsage() == AttributeGroupUsage.Usage.OnlineDataAsSenderDrain
					                                                 || attributeGroupUsage.getUsage() == AttributeGroupUsage.Usage
							.OnlineDataAsSourceReceiverOrSenderDrain)) {
						setAttributeGroupUsageProperties(attributeGroupUsage, atg, asp, AttributeGroupUsage.Usage.OnlineDataAsSenderDrain, true);
					}
					setSystemObjectKeeping(attributeGroupUsage);
				}
				else {
					// Neue ATGV wird erstellt.
					attributeGroupUsage = (AttributeGroupUsage)configurationArea.createConfigurationObject(type, atgvStr + asp.getPid(), "", null);
					setAttributeGroupUsageProperties(attributeGroupUsage, atg, asp, AttributeGroupUsage.Usage.OnlineDataAsSenderDrain, true);
					atgUsageSet.add(attributeGroupUsage);	// ATGV hinzufügen
				}
				nextCurrentAtgUsageList.add(attributeGroupUsage);
			}
			// Aspekt "ParameterIst" wird verarbeitet
			{
				final Aspect asp = _dataModel.getAspect("asp.parameterIst");
				AttributeGroupUsage attributeGroupUsage = atgUsageMap.get(asp);
				if(attributeGroupUsage != null) {
					// prüfen, ob auch die ATGV korrekt ist.
					if(!attributeGroupUsage.isExplicitDefined() || !(attributeGroupUsage.getUsage() == AttributeGroupUsage.Usage.OnlineDataAsSourceReceiver
					                                                 || attributeGroupUsage.getUsage() == AttributeGroupUsage.Usage
							.OnlineDataAsSourceReceiverOrSenderDrain)) {
						setAttributeGroupUsageProperties(attributeGroupUsage, atg, asp, AttributeGroupUsage.Usage.OnlineDataAsSourceReceiver, true);
					}
					setSystemObjectKeeping(attributeGroupUsage);
				}
				else {
					// Neue ATGV wird erstellt.
					attributeGroupUsage = (AttributeGroupUsage)configurationArea.createConfigurationObject(type, atgvStr + asp.getPid(), "", null);
					setAttributeGroupUsageProperties(attributeGroupUsage, atg, asp, AttributeGroupUsage.Usage.OnlineDataAsSourceReceiver, true);
					atgUsageSet.add(attributeGroupUsage);	// ATGV hinzufügen
				}
				nextCurrentAtgUsageList.add(attributeGroupUsage);
			}
			// Aspekt "ParameterDefault" wird verarbeitet
			{
				final Aspect asp = _dataModel.getAspect("asp.parameterDefault");
				if(asp == null) {
					throw new IllegalStateException(
							"Der Aspekt 'asp.parameterDefault' ist nicht vorhanden. Die Konfigurationsdateien passen nicht zum Stand der Kernsoftware."
					);
				}
				AttributeGroupUsage attributeGroupUsage = atgUsageMap.get(asp);
				if(attributeGroupUsage != null) {
					// prüfen, ob auch die ATGV korrekt ist.
					if(!attributeGroupUsage.isExplicitDefined()
					   || attributeGroupUsage.getUsage() != AttributeGroupUsage.Usage.ChangeableOptionalConfigurationData) {
						setAttributeGroupUsageProperties(attributeGroupUsage, atg, asp, AttributeGroupUsage.Usage.ChangeableOptionalConfigurationData, true);
					}
					setSystemObjectKeeping(attributeGroupUsage);
				}
				else {
					// Neue ATGV wird erstellt.
					attributeGroupUsage = (AttributeGroupUsage)configurationArea.createConfigurationObject(type, atgvStr + asp.getPid(), "", null);
					setAttributeGroupUsageProperties(attributeGroupUsage, atg, asp, AttributeGroupUsage.Usage.ChangeableOptionalConfigurationData, true);
					atgUsageSet.add(attributeGroupUsage); // ATGV hinzufügen
				}
				nextCurrentAtgUsageList.add(attributeGroupUsage);
			}
		}

		// alle explizit angegebene Aspekte werden abgearbeitet
		for(ConfigurationAspect configurationAspect : property.getConfigurationAspect()) {
			final String aspPid = configurationAspect.getPid();
			if(property.isParameter() && (aspPid.equals("asp.parameterSoll") || aspPid.equals("asp.parameterVorgabe") || aspPid.equals("asp.parameterIst")
			                              || aspPid.equals("asp.parameterDefault"))) {
				// diese Aspekte ignorieren, wenn es sich um eine Parameter-Atg handelt - die Aspekte werden durch die Methode isParameter() geprüft
				_debug.warning(
						"Aspekt " + aspPid
						+ " wurde explizit angegeben und wird ignoriert. Da es sich um eine Parameter-Attributgruppe handelt, wird er implizit gesetzt."
				);
			}
			else {
				final Aspect asp = (Aspect)getObject(aspPid);
				if(asp == null) throwNoObjectException(aspPid);
				// Gibt es die ATGV bereits?
//				AttributeGroupUsage attributeGroupUsage = atg.getAttributeGroupUsage(asp);
				AttributeGroupUsage attributeGroupUsage = atgUsageMap.get(asp);
				if(attributeGroupUsage != null) {
					// prüfen, ob die ATGV korrekt ist.
					if(_objectDiffs.isInfoDifferent(configurationAspect.getInfo(), attributeGroupUsage.getInfo())) {
						setInfo(attributeGroupUsage, configurationAspect.getInfo());
					}
					if(!attributeGroupUsage.isExplicitDefined() || attributeGroupUsage.getUsage() != configurationAspect.getUsage()) {
						setAttributeGroupUsageProperties(attributeGroupUsage, atg, asp, configurationAspect.getUsage(), true);
					}
					nextCurrentAtgUsageList.add(attributeGroupUsage);
					setSystemObjectKeeping(attributeGroupUsage);
				}
				else {
					// Neue ATGV wird erstellt.
					final AttributeGroupUsage atgUsage = (AttributeGroupUsage)configurationArea.createConfigurationObject(
							type, atgvStr + configurationAspect.getPid(), "", null
					);
					// konfigurierende Datensätze hinzufügen
					setInfo(atgUsage, configurationAspect.getInfo());
					setAttributeGroupUsageProperties(atgUsage, atg, asp, configurationAspect.getUsage(), true);
					nextCurrentAtgUsageList.add(atgUsage);
					atgUsageSet.add(atgUsage);
				}
			}
		}

		if(property.getConfiguring()) {
			// Attributgruppenverwendung asp.eigenschaften hinzufügen, falls sie noch nicht vorhanden ist und sie die einzige Verwendung ist und das Attribut
			// konfigurierend ist.
			if(atgUsageSet.getElementsInModifiableVersion().isEmpty()) {
				// ATGV asp.eigenschaften hinzufügen
				final Aspect asp = _dataModel.getAspect("asp.eigenschaften");
				// neue Attributgruppenverwendung erstellen
				final AttributeGroupUsage atgUsage = (AttributeGroupUsage)configurationArea.createConfigurationObject(
						type, atgvStr + "asp.eigenschaften", "", null
				);
				setAttributeGroupUsageProperties(atgUsage, atg, asp, AttributeGroupUsage.Usage.ChangeableOptionalConfigurationData, true);
				nextCurrentAtgUsageList.add(atgUsage);
				atgUsageSet.add(atgUsage);
			}
			else if(atgUsageSet.getElementsInModifiableVersion().size() == 1) {
				final AttributeGroupUsage atgUsage = (AttributeGroupUsage)atgUsageSet.getElementsInModifiableVersion().get(0);
				if(atgUsage.getAspect().getPid().equals("asp.eigenschaften")) {
					nextCurrentAtgUsageList.add(atgUsage);
					setSystemObjectKeeping(atgUsage);
				}
			}
		}

		// alte nicht mehr verwendete ATGVs löschen
		for(AttributeGroupUsage atgUsage : atgUsageMap.values()) {  // bisheriger Inhalt der Menge der ATGVs
			if(!nextCurrentAtgUsageList.contains(atgUsage)) {
				atgUsageSet.remove(atgUsage);
			}
		}
	}