public void changeElements(
			ObjectSet set, SystemObject[] addElements, SystemObject[] removeElements
	) throws RequestException, ConfigurationException, ConfigurationChangeException {
		int requestIndex;

		// Der erwartete Antworttyp. Bei der Änderung einer dynamischen Menge wird eine andere antwort verschickt als bei der Änderung einer
		// konfigurierenden Menge.
		final String replyType;
		try {
			ByteArrayOutputStream byteArrayStream = new ByteArrayOutputStream();
			Serializer serializer = SerializingFactory.createSerializer(byteArrayStream);
			// Datensatz zusammensetzen
			serializer.writeObjectReference(set);	// 8 Byte
			if(addElements == null) {
				serializer.writeInt(0);
			}
			else {
				serializer.writeInt(addElements.length);
				for(int i = 0; i < addElements.length; i++) {
					SystemObject element = addElements[i];
					serializer.writeObjectReference(element);
				}
			}
			if(removeElements == null) {
				serializer.writeInt(0);
			}
			else {
				serializer.writeInt(removeElements.length);
				for(int i = 0; i < removeElements.length; i++) {
					SystemObject element = removeElements[i];
					serializer.writeObjectReference(element);
				}
			}

			// Die Informationen für dynamische und konfigurierende Mengen sind gleich, der Pakettyp entscheidet
			// darüber wie das Paket auf der Konfigurationsseite behandelt wird.

			if(set instanceof MutableSet) {
				requestIndex = _senderWriteConfigObjects.sendData("DynamischeMengeElementeÄndern", byteArrayStream.toByteArray());
				replyType = "DynamischeMengeElementeAntwort";
			}
			else {
				requestIndex = _senderWriteConfigObjects.sendData("KonfigurierendeMengeElementeÄndern", byteArrayStream.toByteArray());
				replyType = "KonfigurierendeMengeElementeAntwort";
			}
		}
		catch(Exception ex) {
			ex.printStackTrace();
			throw new RequestException(ex);
		}
		Data reply = _senderWriteConfigObjects.waitForReply(requestIndex);
		// Antwort erhalten - wird jetzt ausgelesen
		Deserializer deserializer = null;
		try {
			deserializer = getMessageDeserializer2(reply, replyType);
		}
		catch(ConfigurationTaskException e) {
			// Die TaskException wird in eine Change Exception umgewandelt, weil die Konfiguration sich weigert die Konfigurationsdaten zu ändern
			throw new ConfigurationChangeException(e);
		}
		try {
			boolean successful = deserializer.readBoolean();
			if(!successful) {
				String errorMessage = deserializer.readString();
				throw new ConfigurationException(errorMessage);
			}
		}
		catch(IOException ex) {
			throw new RequestException("Fehlerhafte Antwort - DynamischeMengeElementeAntwort - erhalten", ex);
		}
	}