diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/attributes/OzgCloudAccessPermission.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/attributes/OzgCloudAccessPermission.java
new file mode 100644
index 0000000000000000000000000000000000000000..101c88f6e22db23c808fbed7a4c969af9212a96a
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/attributes/OzgCloudAccessPermission.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+
+package de.ozgcloud.apilib.attributes;
+
+public enum OzgCloudAccessPermission {
+	PRIVATE, READ_ONLY, READ_WRITE
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/attributes/OzgCloudAttributesService.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/attributes/OzgCloudAttributesService.java
new file mode 100644
index 0000000000000000000000000000000000000000..5ae843d5ed82c701697ee42b0deac5a9327feeb1
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/attributes/OzgCloudAttributesService.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+
+package de.ozgcloud.apilib.attributes;
+
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId;
+
+public interface OzgCloudAttributesService {
+
+	void setClientAttribute(OzgCloudBooleanClientAttribute clientAttribute, OzgCloudVorgangId vorgangId);
+
+	void setClientAttribute(OzgCloudStringClientAttribute clientAttribute, OzgCloudVorgangId vorgangId);
+
+	void setClientAttribute(OzgCloudLongClientAttribute clientAttribute, OzgCloudVorgangId vorgangId);
+
+	void setClientAttribute(OzgCloudDoubleClientAttribute clientAttribute, OzgCloudVorgangId vorgangId);
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/attributes/OzgCloudBooleanClientAttribute.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/attributes/OzgCloudBooleanClientAttribute.java
new file mode 100644
index 0000000000000000000000000000000000000000..4c2eb6f7e8972e08ee160844b15510ade63cdb09
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/attributes/OzgCloudBooleanClientAttribute.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+
+package de.ozgcloud.apilib.attributes;
+
+import lombok.experimental.SuperBuilder;
+
+@SuperBuilder
+public final class OzgCloudBooleanClientAttribute extends OzgCloudClientAttribute<Boolean> {
+
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/attributes/OzgCloudClientAttribute.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/attributes/OzgCloudClientAttribute.java
new file mode 100644
index 0000000000000000000000000000000000000000..0c85dc9f2d47eb66a84ae074680961be8f33bebc
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/attributes/OzgCloudClientAttribute.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.attributes;
+
+import lombok.Builder;
+import lombok.Getter;
+import lombok.experimental.SuperBuilder;
+
+@SuperBuilder
+@Getter
+abstract sealed class OzgCloudClientAttribute<T> permits OzgCloudBooleanClientAttribute, OzgCloudStringClientAttribute,
+	OzgCloudLongClientAttribute, OzgCloudDoubleClientAttribute {
+
+	private String clientName;
+	private String attributeName;
+	@Builder.Default
+	private OzgCloudAccessPermission access = OzgCloudAccessPermission.PRIVATE;
+	private T value;
+
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/attributes/OzgCloudDoubleClientAttribute.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/attributes/OzgCloudDoubleClientAttribute.java
new file mode 100644
index 0000000000000000000000000000000000000000..27af41557b73033fe8e6fd2fc6195e54aa80cbda
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/attributes/OzgCloudDoubleClientAttribute.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+
+package de.ozgcloud.apilib.attributes;
+
+import lombok.experimental.SuperBuilder;
+
+@SuperBuilder
+public final class OzgCloudDoubleClientAttribute extends OzgCloudClientAttribute<Double> {
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/attributes/OzgCloudLongClientAttribute.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/attributes/OzgCloudLongClientAttribute.java
new file mode 100644
index 0000000000000000000000000000000000000000..9e3f99f521c8146722a990dc594f08758e9a3028
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/attributes/OzgCloudLongClientAttribute.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+
+package de.ozgcloud.apilib.attributes;
+
+import lombok.experimental.SuperBuilder;
+
+@SuperBuilder
+public final class OzgCloudLongClientAttribute extends OzgCloudClientAttribute<Long> {
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/attributes/OzgCloudStringClientAttribute.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/attributes/OzgCloudStringClientAttribute.java
new file mode 100644
index 0000000000000000000000000000000000000000..b33498fcc920aa7674e0d20ae5972ac70cc70d4b
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/attributes/OzgCloudStringClientAttribute.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+
+package de.ozgcloud.apilib.attributes;
+
+import lombok.experimental.SuperBuilder;
+
+@SuperBuilder
+public final class OzgCloudStringClientAttribute extends OzgCloudClientAttribute<String> {
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/attributes/grpc/GrpcOzgCloudAttributesService.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/attributes/grpc/GrpcOzgCloudAttributesService.java
new file mode 100644
index 0000000000000000000000000000000000000000..247ccc7c6e2641c3a575d93fca1b75ffc35380aa
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/attributes/grpc/GrpcOzgCloudAttributesService.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+
+package de.ozgcloud.apilib.attributes.grpc;
+
+import de.ozgcloud.apilib.attributes.OzgCloudAttributesService;
+import de.ozgcloud.apilib.attributes.OzgCloudBooleanClientAttribute;
+import de.ozgcloud.apilib.attributes.OzgCloudDoubleClientAttribute;
+import de.ozgcloud.apilib.attributes.OzgCloudLongClientAttribute;
+import de.ozgcloud.apilib.attributes.OzgCloudStringClientAttribute;
+import de.ozgcloud.apilib.common.callcontext.OzgCloudCallContextAttachingInterceptor;
+import de.ozgcloud.apilib.common.callcontext.OzgCloudCallContextProvider;
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId;
+import de.ozgcloud.vorgang.grpc.clientAttribute.ClientAttributeServiceGrpc.ClientAttributeServiceBlockingStub;
+import de.ozgcloud.vorgang.grpc.clientAttribute.GrpcClientAttribute;
+import de.ozgcloud.vorgang.grpc.clientAttribute.GrpcSetClientAttributeRequest;
+import lombok.RequiredArgsConstructor;
+
+@RequiredArgsConstructor
+public class GrpcOzgCloudAttributesService implements OzgCloudAttributesService {
+
+	private final ClientAttributeServiceBlockingStub serviceBlockingStub;
+	private final OzgCloudClientAttributeMapper clientAttributeMapper;
+	private final OzgCloudCallContextProvider contextProvider;
+
+	@Override
+	public void setClientAttribute(final OzgCloudBooleanClientAttribute clientAttribute, OzgCloudVorgangId vorgangId) {
+		setClientAttribute(clientAttributeMapper.toGrpc(clientAttribute), vorgangId);
+	}
+
+	@Override
+	public void setClientAttribute(final OzgCloudStringClientAttribute clientAttribute, OzgCloudVorgangId vorgangId) {
+		setClientAttribute(clientAttributeMapper.toGrpc(clientAttribute), vorgangId);
+	}
+
+	@Override
+	public void setClientAttribute(final OzgCloudLongClientAttribute clientAttribute, OzgCloudVorgangId vorgangId) {
+		setClientAttribute(clientAttributeMapper.toGrpc(clientAttribute), vorgangId);
+	}
+
+	@Override
+	public void setClientAttribute(final OzgCloudDoubleClientAttribute clientAttribute, OzgCloudVorgangId vorgangId) {
+		setClientAttribute(clientAttributeMapper.toGrpc(clientAttribute), vorgangId);
+	}
+
+	void setClientAttribute(GrpcClientAttribute clientAttribute, OzgCloudVorgangId vorgangId) {
+		getAttributesServiceStub().set(buildRequest(clientAttribute, vorgangId.toString()));
+	}
+
+	GrpcSetClientAttributeRequest buildRequest(GrpcClientAttribute attribute, String vorgangId) {
+		return GrpcSetClientAttributeRequest.newBuilder().setVorgangId(vorgangId).setAttribute(attribute).build();
+	}
+
+	ClientAttributeServiceBlockingStub getAttributesServiceStub() {
+		return serviceBlockingStub.withInterceptors(new OzgCloudCallContextAttachingInterceptor(contextProvider));
+	}
+
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/attributes/grpc/OzgCloudClientAttributeMapper.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/attributes/grpc/OzgCloudClientAttributeMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..449f98141b1fc1f467aa317faef97bf25fe78768
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/attributes/grpc/OzgCloudClientAttributeMapper.java
@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+
+package de.ozgcloud.apilib.attributes.grpc;
+
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.NullValueCheckStrategy;
+import org.mapstruct.ReportingPolicy;
+
+import de.ozgcloud.apilib.attributes.OzgCloudBooleanClientAttribute;
+import de.ozgcloud.apilib.attributes.OzgCloudDoubleClientAttribute;
+import de.ozgcloud.apilib.attributes.OzgCloudLongClientAttribute;
+import de.ozgcloud.apilib.attributes.OzgCloudStringClientAttribute;
+import de.ozgcloud.vorgang.grpc.clientAttribute.GrpcClientAttribute;
+import de.ozgcloud.vorgang.grpc.clientAttribute.GrpcClientAttributeValue;
+
+@Mapper(nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS, unmappedTargetPolicy = ReportingPolicy.WARN)
+public interface OzgCloudClientAttributeMapper {
+
+	@Mapping(target = "valueOrBuilder", ignore = true)
+	@Mapping(target = "unknownFields", ignore = true)
+	@Mapping(target = "mergeValue", ignore = true)
+	@Mapping(target = "mergeUnknownFields", ignore = true)
+	@Mapping(target = "mergeFrom", ignore = true)
+	@Mapping(target = "defaultInstanceForType", ignore = true)
+	@Mapping(target = "clientNameBytes", ignore = true)
+	@Mapping(target = "clearOneof", ignore = true)
+	@Mapping(target = "clearField", ignore = true)
+	@Mapping(target = "attributeNameBytes", ignore = true)
+	@Mapping(target = "allFields", ignore = true)
+	@Mapping(target = "accessValue", ignore = true)
+	GrpcClientAttribute toGrpc(OzgCloudBooleanClientAttribute attribute);
+
+	@Mapping(target = "unknownFields", ignore = true)
+	@Mapping(target = "stringValueBytes", ignore = true)
+	@Mapping(target = "stringValue", ignore = true)
+	@Mapping(target = "mergeUnknownFields", ignore = true)
+	@Mapping(target = "mergeFrom", ignore = true)
+	@Mapping(target = "intValue", ignore = true)
+	@Mapping(target = "doubleValue", ignore = true)
+	@Mapping(target = "defaultInstanceForType", ignore = true)
+	@Mapping(target = "clearOneof", ignore = true)
+	@Mapping(target = "clearField", ignore = true)
+	@Mapping(target = "allFields", ignore = true)
+
+	@Mapping(target = "boolValue", source = "value")
+	GrpcClientAttributeValue toValue(Boolean value);
+
+	@Mapping(target = "valueOrBuilder", ignore = true)
+	@Mapping(target = "unknownFields", ignore = true)
+	@Mapping(target = "mergeValue", ignore = true)
+	@Mapping(target = "mergeUnknownFields", ignore = true)
+	@Mapping(target = "mergeFrom", ignore = true)
+	@Mapping(target = "defaultInstanceForType", ignore = true)
+	@Mapping(target = "clientNameBytes", ignore = true)
+	@Mapping(target = "clearOneof", ignore = true)
+	@Mapping(target = "clearField", ignore = true)
+	@Mapping(target = "attributeNameBytes", ignore = true)
+	@Mapping(target = "allFields", ignore = true)
+	@Mapping(target = "accessValue", ignore = true)
+	GrpcClientAttribute toGrpc(OzgCloudStringClientAttribute attribute);
+
+	@Mapping(target = "unknownFields", ignore = true)
+	@Mapping(target = "stringValueBytes", ignore = true)
+	@Mapping(target = "mergeUnknownFields", ignore = true)
+	@Mapping(target = "mergeFrom", ignore = true)
+	@Mapping(target = "intValue", ignore = true)
+	@Mapping(target = "doubleValue", ignore = true)
+	@Mapping(target = "defaultInstanceForType", ignore = true)
+	@Mapping(target = "clearOneof", ignore = true)
+	@Mapping(target = "clearField", ignore = true)
+	@Mapping(target = "boolValue", ignore = true)
+	@Mapping(target = "allFields", ignore = true)
+
+	@Mapping(target = "stringValue", source = "value")
+	GrpcClientAttributeValue toValue(String value);
+
+	@Mapping(target = "valueOrBuilder", ignore = true)
+	@Mapping(target = "unknownFields", ignore = true)
+	@Mapping(target = "mergeValue", ignore = true)
+	@Mapping(target = "mergeUnknownFields", ignore = true)
+	@Mapping(target = "mergeFrom", ignore = true)
+	@Mapping(target = "defaultInstanceForType", ignore = true)
+	@Mapping(target = "clientNameBytes", ignore = true)
+	@Mapping(target = "clearOneof", ignore = true)
+	@Mapping(target = "clearField", ignore = true)
+	@Mapping(target = "attributeNameBytes", ignore = true)
+	@Mapping(target = "allFields", ignore = true)
+	@Mapping(target = "accessValue", ignore = true)
+	GrpcClientAttribute toGrpc(OzgCloudLongClientAttribute attribute);
+
+	@Mapping(target = "unknownFields", ignore = true)
+	@Mapping(target = "stringValueBytes", ignore = true)
+	@Mapping(target = "stringValue", ignore = true)
+	@Mapping(target = "mergeUnknownFields", ignore = true)
+	@Mapping(target = "mergeFrom", ignore = true)
+	@Mapping(target = "doubleValue", ignore = true)
+	@Mapping(target = "defaultInstanceForType", ignore = true)
+	@Mapping(target = "clearOneof", ignore = true)
+	@Mapping(target = "clearField", ignore = true)
+	@Mapping(target = "boolValue", ignore = true)
+	@Mapping(target = "allFields", ignore = true)
+
+	@Mapping(target = "intValue", source = "value")
+	GrpcClientAttributeValue toValue(Long value);
+
+	@Mapping(target = "valueOrBuilder", ignore = true)
+	@Mapping(target = "unknownFields", ignore = true)
+	@Mapping(target = "mergeValue", ignore = true)
+	@Mapping(target = "mergeUnknownFields", ignore = true)
+	@Mapping(target = "mergeFrom", ignore = true)
+	@Mapping(target = "defaultInstanceForType", ignore = true)
+	@Mapping(target = "clientNameBytes", ignore = true)
+	@Mapping(target = "clearOneof", ignore = true)
+	@Mapping(target = "clearField", ignore = true)
+	@Mapping(target = "attributeNameBytes", ignore = true)
+	@Mapping(target = "allFields", ignore = true)
+	@Mapping(target = "accessValue", ignore = true)
+	GrpcClientAttribute toGrpc(OzgCloudDoubleClientAttribute attribute);
+
+	@Mapping(target = "unknownFields", ignore = true)
+	@Mapping(target = "stringValueBytes", ignore = true)
+	@Mapping(target = "stringValue", ignore = true)
+	@Mapping(target = "mergeUnknownFields", ignore = true)
+	@Mapping(target = "mergeFrom", ignore = true)
+	@Mapping(target = "intValue", ignore = true)
+	@Mapping(target = "defaultInstanceForType", ignore = true)
+	@Mapping(target = "clearOneof", ignore = true)
+	@Mapping(target = "clearField", ignore = true)
+	@Mapping(target = "boolValue", ignore = true)
+	@Mapping(target = "allFields", ignore = true)
+
+	@Mapping(target = "doubleValue", source = "value")
+	GrpcClientAttributeValue toValue(Double value);
+}
diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/attributes/OzgCloudClientAttributeTestFactory.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/attributes/OzgCloudClientAttributeTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..244bbcd451af95c261302ef23de176597a3099f5
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/attributes/OzgCloudClientAttributeTestFactory.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+
+package de.ozgcloud.apilib.attributes;
+
+import com.thedeanda.lorem.LoremIpsum;
+
+import de.ozgcloud.apilib.attributes.OzgCloudBooleanClientAttribute.OzgCloudBooleanClientAttributeBuilder;
+import de.ozgcloud.apilib.attributes.OzgCloudDoubleClientAttribute.OzgCloudDoubleClientAttributeBuilder;
+import de.ozgcloud.apilib.attributes.OzgCloudLongClientAttribute.OzgCloudLongClientAttributeBuilder;
+import de.ozgcloud.apilib.attributes.OzgCloudStringClientAttribute.OzgCloudStringClientAttributeBuilder;
+
+public class OzgCloudClientAttributeTestFactory {
+
+	public static final String CLIENT = LoremIpsum.getInstance().getWords(1) + "-Client";
+	public static final String ATTRIBUTE_NAME = LoremIpsum.getInstance().getWords(1);
+	public static final OzgCloudAccessPermission ACCESS_PERMISSION = OzgCloudAccessPermission.READ_ONLY;
+	public static final Boolean BOOLEAN_VALUE = true;
+	public static final String STRING_VALUE = LoremIpsum.getInstance().getWords(1);
+	public static final Long LONG_VALUE = 100L;
+	public static final Double DOUBLE_VALUE = 2.4;
+
+	public static OzgCloudBooleanClientAttribute createBoolean() {
+		return createBooleanBuilder().build();
+	}
+
+	public static OzgCloudBooleanClientAttributeBuilder createBooleanBuilder() {
+		return OzgCloudBooleanClientAttribute.builder()
+				.clientName(CLIENT)
+				.attributeName(ATTRIBUTE_NAME)
+				.access(ACCESS_PERMISSION)
+				.value(BOOLEAN_VALUE);
+	}
+
+	public static  OzgCloudStringClientAttribute createString() {
+		return createStringBuilder().build();
+	}
+
+	public static OzgCloudStringClientAttributeBuilder createStringBuilder() {
+		return OzgCloudStringClientAttribute.builder()
+				.clientName(CLIENT)
+				.attributeName(ATTRIBUTE_NAME)
+				.access(ACCESS_PERMISSION)
+				.value(STRING_VALUE);
+	}
+
+	public static OzgCloudLongClientAttribute createLong() {
+		return createLongBuilder().build();
+	}
+
+	public static OzgCloudLongClientAttributeBuilder createLongBuilder() {
+		return OzgCloudLongClientAttribute.builder()
+				.clientName(CLIENT)
+				.attributeName(ATTRIBUTE_NAME)
+				.access(ACCESS_PERMISSION)
+				.value(LONG_VALUE);
+	}
+
+	public static OzgCloudDoubleClientAttribute createDouble() {
+		return createDoubleBuilder().build();
+	}
+
+	public static OzgCloudDoubleClientAttributeBuilder createDoubleBuilder() {
+		return OzgCloudDoubleClientAttribute.builder()
+				.clientName(CLIENT)
+				.attributeName(ATTRIBUTE_NAME)
+				.access(ACCESS_PERMISSION)
+				.value(DOUBLE_VALUE);
+	}
+}
diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/attributes/grpc/GrpcOzgCloudAttributesServiceTest.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/attributes/grpc/GrpcOzgCloudAttributesServiceTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..dbd0a7462a0994ed3efea91e3cc726ef0fbefbc4
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/attributes/grpc/GrpcOzgCloudAttributesServiceTest.java
@@ -0,0 +1,262 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+
+package de.ozgcloud.apilib.attributes.grpc;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Spy;
+import org.springframework.test.util.ReflectionTestUtils;
+
+import de.ozgcloud.apilib.attributes.OzgCloudBooleanClientAttribute;
+import de.ozgcloud.apilib.attributes.OzgCloudClientAttributeTestFactory;
+import de.ozgcloud.apilib.attributes.OzgCloudDoubleClientAttribute;
+import de.ozgcloud.apilib.attributes.OzgCloudLongClientAttribute;
+import de.ozgcloud.apilib.attributes.OzgCloudStringClientAttribute;
+import de.ozgcloud.apilib.common.callcontext.OzgCloudCallContextAttachingInterceptor;
+import de.ozgcloud.apilib.common.callcontext.OzgCloudCallContextProvider;
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangTestFactory;
+import de.ozgcloud.vorgang.grpc.clientAttribute.ClientAttributeServiceGrpc.ClientAttributeServiceBlockingStub;
+import de.ozgcloud.vorgang.grpc.clientAttribute.GrpcClientAttribute;
+import de.ozgcloud.vorgang.grpc.clientAttribute.GrpcSetClientAttributeRequest;
+
+class GrpcOzgCloudAttributesServiceTest {
+
+	@Spy
+	@InjectMocks
+	private GrpcOzgCloudAttributesService service;
+
+	@Mock
+	private ClientAttributeServiceBlockingStub serviceBlockingStub;
+	@Mock
+	private OzgCloudClientAttributeMapper clientAttributeMapper;
+	@Mock
+	private OzgCloudCallContextProvider contextProvider;
+	@Mock
+	private GrpcClientAttribute grpcClientAttribute;
+
+	@Nested
+	class TestSetClientAttribute {
+
+		@BeforeEach
+		void init() {
+			doNothing().when(service).setClientAttribute(any(GrpcClientAttribute.class), any());
+		}
+
+		@Nested
+		class TestBoolean {
+
+			private static final OzgCloudBooleanClientAttribute CLIENT_ATTRIBUTE = OzgCloudClientAttributeTestFactory.createBoolean();
+
+			@BeforeEach
+			void init() {
+				doReturn(grpcClientAttribute).when(clientAttributeMapper).toGrpc(any(OzgCloudBooleanClientAttribute.class));
+			}
+
+			@Test
+			void shouldCallClientAttributeMapper() {
+				service.setClientAttribute(CLIENT_ATTRIBUTE, OzgCloudVorgangTestFactory.ID);
+
+				verify(clientAttributeMapper).toGrpc(CLIENT_ATTRIBUTE);
+			}
+
+			@Test
+			void shouldCallServiceBlockingStub() {
+				service.setClientAttribute(CLIENT_ATTRIBUTE, OzgCloudVorgangTestFactory.ID);
+
+				verify(service).setClientAttribute(grpcClientAttribute, OzgCloudVorgangTestFactory.ID);
+			}
+		}
+
+		@Nested
+		class TestString {
+
+			private static final OzgCloudStringClientAttribute CLIENT_ATTRIBUTE = OzgCloudClientAttributeTestFactory.createString();
+
+			@BeforeEach
+			void init() {
+				doReturn(grpcClientAttribute).when(clientAttributeMapper).toGrpc(any(OzgCloudStringClientAttribute.class));
+			}
+
+			@Test
+			void shouldCallClientAttributeMapper() {
+				service.setClientAttribute(CLIENT_ATTRIBUTE, OzgCloudVorgangTestFactory.ID);
+
+				verify(clientAttributeMapper).toGrpc(CLIENT_ATTRIBUTE);
+			}
+
+			@Test
+			void shouldCallServiceBlockingStub() {
+				service.setClientAttribute(CLIENT_ATTRIBUTE, OzgCloudVorgangTestFactory.ID);
+
+				verify(service).setClientAttribute(grpcClientAttribute, OzgCloudVorgangTestFactory.ID);
+			}
+		}
+
+		@Nested
+		class TestLong {
+
+			private static final OzgCloudLongClientAttribute CLIENT_ATTRIBUTE = OzgCloudClientAttributeTestFactory.createLong();
+
+			@BeforeEach
+			void init() {
+				doReturn(grpcClientAttribute).when(clientAttributeMapper).toGrpc(any(OzgCloudLongClientAttribute.class));
+			}
+
+			@Test
+			void shouldCallClientAttributeMapper() {
+				service.setClientAttribute(CLIENT_ATTRIBUTE, OzgCloudVorgangTestFactory.ID);
+
+				verify(clientAttributeMapper).toGrpc(CLIENT_ATTRIBUTE);
+			}
+
+			@Test
+			void shouldCallServiceBlockingStub() {
+				service.setClientAttribute(CLIENT_ATTRIBUTE, OzgCloudVorgangTestFactory.ID);
+
+				verify(service).setClientAttribute(grpcClientAttribute, OzgCloudVorgangTestFactory.ID);
+			}
+		}
+
+		@Nested
+		class TestDouble {
+
+			private static final OzgCloudDoubleClientAttribute CLIENT_ATTRIBUTE = OzgCloudClientAttributeTestFactory.createDouble();
+
+			@BeforeEach
+			void init() {
+				doReturn(grpcClientAttribute).when(clientAttributeMapper).toGrpc(any(OzgCloudDoubleClientAttribute.class));
+			}
+
+			@Test
+			void shouldCallClientAttributeMapper() {
+				service.setClientAttribute(CLIENT_ATTRIBUTE, OzgCloudVorgangTestFactory.ID);
+
+				verify(clientAttributeMapper).toGrpc(CLIENT_ATTRIBUTE);
+			}
+
+			@Test
+			void shouldCallServiceBlockingStub() {
+				service.setClientAttribute(CLIENT_ATTRIBUTE, OzgCloudVorgangTestFactory.ID);
+
+				verify(service).setClientAttribute(grpcClientAttribute, OzgCloudVorgangTestFactory.ID);
+			}
+		}
+	}
+
+	@Nested
+	class TestSetClientAttributeGrpc {
+
+		@Mock
+		private ClientAttributeServiceBlockingStub stubWithInterceptor;
+		@Mock
+		private GrpcSetClientAttributeRequest grpcRequest;
+
+		@BeforeEach
+		void init() {
+			doReturn(stubWithInterceptor).when(service).getAttributesServiceStub();
+			doReturn(grpcRequest).when(service).buildRequest(any(), any());
+		}
+
+		@Test
+		void shouldCallBuildRequest() {
+			service.setClientAttribute(grpcClientAttribute, OzgCloudVorgangTestFactory.ID);
+
+			verify(service).buildRequest(grpcClientAttribute, OzgCloudVorgangTestFactory.ID.toString());
+		}
+
+		@Test
+		void shouldCallGetServiceBlockingStub() {
+			service.setClientAttribute(grpcClientAttribute, OzgCloudVorgangTestFactory.ID);
+
+			verify(service).getAttributesServiceStub();
+		}
+
+		@Test
+		void shouldCallSet() {
+			service.setClientAttribute(grpcClientAttribute, OzgCloudVorgangTestFactory.ID);
+
+			verify(stubWithInterceptor).set(grpcRequest);
+		}
+	}
+
+	@Nested
+	class TestBuildRequest {
+
+		private static final String VORGANG_ID = OzgCloudVorgangTestFactory.ID.toString();
+
+		@Test
+		void shouldBuildSetClientAttribute() {
+			var request = service.buildRequest(grpcClientAttribute, VORGANG_ID);
+
+			assertThat(request.getAttribute()).isSameAs(grpcClientAttribute);
+		}
+
+		@Test
+		void shouldBuildSetVorgangId() {
+			var request = service.buildRequest(grpcClientAttribute, VORGANG_ID);
+
+			assertThat(request.getVorgangId()).isEqualTo(VORGANG_ID);
+		}
+	}
+
+	@Nested
+	class TestGetAttributesServiceStub {
+
+		@Mock
+		private ClientAttributeServiceBlockingStub stubWithInterceptor;
+
+		@Captor
+		private ArgumentCaptor<OzgCloudCallContextAttachingInterceptor> interceptorCaptor;
+
+		@Test
+		void shouldSetContextProvider() {
+			service.getAttributesServiceStub();
+
+			verify(serviceBlockingStub).withInterceptors(interceptorCaptor.capture());
+			assertThat(getContextProvider()).isSameAs(contextProvider);
+		}
+
+		@Test
+		void shouldReturnServiceBlockingStub() {
+			when(serviceBlockingStub.withInterceptors(any())).thenReturn(stubWithInterceptor);
+
+			var stub = service.getAttributesServiceStub();
+
+			assertThat(stub).isSameAs(stubWithInterceptor);
+		}
+
+		private OzgCloudCallContextProvider getContextProvider() {
+			return (OzgCloudCallContextProvider) ReflectionTestUtils.getField(interceptorCaptor.getValue(), "callContextProvider");
+		}
+	}
+}
\ No newline at end of file
diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/attributes/grpc/OzgCloudClientAttributeMapperTest.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/attributes/grpc/OzgCloudClientAttributeMapperTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..df16c7ed127bd0804fbaecdcd143b531ed43380e
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/attributes/grpc/OzgCloudClientAttributeMapperTest.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+
+package de.ozgcloud.apilib.attributes.grpc;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class OzgCloudClientAttributeMapperTest {
+
+}
\ No newline at end of file