diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/client_attribute/OzgCloudAccessPermission.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/client_attribute/OzgCloudAccessPermission.java
new file mode 100644
index 0000000000000000000000000000000000000000..221b16b3754cc39ea7668248c7230e0e9d73dd94
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/client_attribute/OzgCloudAccessPermission.java
@@ -0,0 +1,28 @@
+/*
+ * 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.client_attribute;
+
+public enum OzgCloudAccessPermission {
+	PRIVATE, READ_ONLY, READ_WRITE
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/client_attribute/OzgCloudBooleanClientAttribute.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/client_attribute/OzgCloudBooleanClientAttribute.java
new file mode 100644
index 0000000000000000000000000000000000000000..f56023c90a3055144bde68b72e0542ff91ea5f57
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/client_attribute/OzgCloudBooleanClientAttribute.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.client_attribute;
+
+import lombok.experimental.SuperBuilder;
+
+@SuperBuilder
+public final class OzgCloudBooleanClientAttribute extends OzgCloudClientAttribute<Boolean> {
+
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/client_attribute/OzgCloudClientAttribute.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/client_attribute/OzgCloudClientAttribute.java
new file mode 100644
index 0000000000000000000000000000000000000000..db60c3a1d2089d84d3201cc159018d9cb5a86b70
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/client_attribute/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.client_attribute;
+
+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/client_attribute/OzgCloudClientAttributeService.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/client_attribute/OzgCloudClientAttributeService.java
new file mode 100644
index 0000000000000000000000000000000000000000..b85b7da07147d17505fdae82bcecd42753f46561
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/client_attribute/OzgCloudClientAttributeService.java
@@ -0,0 +1,37 @@
+/*
+ * 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.client_attribute;
+
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId;
+
+public interface OzgCloudClientAttributeService {
+
+	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/client_attribute/OzgCloudDoubleClientAttribute.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/client_attribute/OzgCloudDoubleClientAttribute.java
new file mode 100644
index 0000000000000000000000000000000000000000..992021fef5c446efffa5dbb5a8cec0fdf2a1cd15
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/client_attribute/OzgCloudDoubleClientAttribute.java
@@ -0,0 +1,30 @@
+/*
+ * 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.client_attribute;
+
+import lombok.experimental.SuperBuilder;
+
+@SuperBuilder
+public final class OzgCloudDoubleClientAttribute extends OzgCloudClientAttribute<Double> {
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/client_attribute/OzgCloudLongClientAttribute.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/client_attribute/OzgCloudLongClientAttribute.java
new file mode 100644
index 0000000000000000000000000000000000000000..bdaff47f87cbab65f3bdd6caf79cb298c5e21abe
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/client_attribute/OzgCloudLongClientAttribute.java
@@ -0,0 +1,30 @@
+/*
+ * 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.client_attribute;
+
+import lombok.experimental.SuperBuilder;
+
+@SuperBuilder
+public final class OzgCloudLongClientAttribute extends OzgCloudClientAttribute<Long> {
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/client_attribute/OzgCloudStringClientAttribute.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/client_attribute/OzgCloudStringClientAttribute.java
new file mode 100644
index 0000000000000000000000000000000000000000..1fa54dde11655597b06b77469bcec6f12bfffb35
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/client_attribute/OzgCloudStringClientAttribute.java
@@ -0,0 +1,30 @@
+/*
+ * 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.client_attribute;
+
+import lombok.experimental.SuperBuilder;
+
+@SuperBuilder
+public final class OzgCloudStringClientAttribute extends OzgCloudClientAttribute<String> {
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/client_attribute/grpc/OzgCloudClientAttributeGrpcService.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/client_attribute/grpc/OzgCloudClientAttributeGrpcService.java
new file mode 100644
index 0000000000000000000000000000000000000000..cebaf6360285e9b87d9a95452fc0ef85ea010fb0
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/client_attribute/grpc/OzgCloudClientAttributeGrpcService.java
@@ -0,0 +1,78 @@
+/*
+ * 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.client_attribute.grpc;
+
+import de.ozgcloud.apilib.client_attribute.OzgCloudClientAttributeService;
+import de.ozgcloud.apilib.client_attribute.OzgCloudBooleanClientAttribute;
+import de.ozgcloud.apilib.client_attribute.OzgCloudDoubleClientAttribute;
+import de.ozgcloud.apilib.client_attribute.OzgCloudLongClientAttribute;
+import de.ozgcloud.apilib.client_attribute.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 OzgCloudClientAttributeGrpcService implements OzgCloudClientAttributeService {
+
+	private final ClientAttributeServiceBlockingStub serviceBlockingStub;
+	private final OzgCloudClientAttributeMapper clientAttributeMapper;
+	private final OzgCloudCallContextProvider contextProvider;
+
+	@Override
+	public void setClientAttribute(OzgCloudBooleanClientAttribute clientAttribute, OzgCloudVorgangId vorgangId) {
+		doSetClientAttribute(clientAttributeMapper.toGrpc(clientAttribute), vorgangId);
+	}
+
+	@Override
+	public void setClientAttribute(OzgCloudStringClientAttribute clientAttribute, OzgCloudVorgangId vorgangId) {
+		doSetClientAttribute(clientAttributeMapper.toGrpc(clientAttribute), vorgangId);
+	}
+
+	@Override
+	public void setClientAttribute(OzgCloudLongClientAttribute clientAttribute, OzgCloudVorgangId vorgangId) {
+		doSetClientAttribute(clientAttributeMapper.toGrpc(clientAttribute), vorgangId);
+	}
+
+	@Override
+	public void setClientAttribute(OzgCloudDoubleClientAttribute clientAttribute, OzgCloudVorgangId vorgangId) {
+		doSetClientAttribute(clientAttributeMapper.toGrpc(clientAttribute), vorgangId);
+	}
+
+	void doSetClientAttribute(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/client_attribute/grpc/OzgCloudClientAttributeMapper.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/client_attribute/grpc/OzgCloudClientAttributeMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..7297235c5c8c06259dff2663868939d7b5fb5996
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/client_attribute/grpc/OzgCloudClientAttributeMapper.java
@@ -0,0 +1,156 @@
+/*
+ * 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.client_attribute.grpc;
+
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.NullValueCheckStrategy;
+import org.mapstruct.ReportingPolicy;
+
+import de.ozgcloud.apilib.client_attribute.OzgCloudBooleanClientAttribute;
+import de.ozgcloud.apilib.client_attribute.OzgCloudDoubleClientAttribute;
+import de.ozgcloud.apilib.client_attribute.OzgCloudLongClientAttribute;
+import de.ozgcloud.apilib.client_attribute.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/client_attribute/GrpcClientAttributeTestFactory.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/client_attribute/GrpcClientAttributeTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..6692210025c286bb91c5f88812ace24e0081e045
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/client_attribute/GrpcClientAttributeTestFactory.java
@@ -0,0 +1,69 @@
+/*
+ * 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.client_attribute;
+
+import de.ozgcloud.vorgang.grpc.clientAttribute.GrpcAccessPermission;
+import de.ozgcloud.vorgang.grpc.clientAttribute.GrpcClientAttribute;
+import de.ozgcloud.vorgang.grpc.clientAttribute.GrpcClientAttributeValue;
+
+public class GrpcClientAttributeTestFactory {
+
+	public static final GrpcAccessPermission ACCESS_PERMISSION = GrpcAccessPermission.READ_ONLY;
+
+	public static final GrpcClientAttributeValue BOOLEAN_VALUE =
+		GrpcClientAttributeValue.newBuilder().setBoolValue(OzgCloudClientAttributeTestFactory.BOOLEAN_VALUE).build();
+
+	public static final GrpcClientAttributeValue STRING_VALUE =
+		GrpcClientAttributeValue.newBuilder().setStringValue(OzgCloudClientAttributeTestFactory.STRING_VALUE).build();
+
+	public static final GrpcClientAttributeValue LONG_VALUE = GrpcClientAttributeValue.newBuilder().setIntValue(
+		OzgCloudClientAttributeTestFactory.LONG_VALUE).build();
+
+	public static final GrpcClientAttributeValue DOUBLE_VALUE =
+		GrpcClientAttributeValue.newBuilder().setDoubleValue(OzgCloudClientAttributeTestFactory.DOUBLE_VALUE).build();
+
+	public static GrpcClientAttribute createBoolean() {
+		return createBuilder().setValue(BOOLEAN_VALUE).build();
+	}
+
+	public static GrpcClientAttribute createString() {
+		return createBuilder().setValue(STRING_VALUE).build();
+	}
+
+	public static GrpcClientAttribute createLong() {
+		return createBuilder().setValue(LONG_VALUE).build();
+	}
+
+	public static GrpcClientAttribute createDouble() {
+		return createBuilder().setValue(DOUBLE_VALUE).build();
+	}
+
+	public static GrpcClientAttribute.Builder createBuilder() {
+		return GrpcClientAttribute.newBuilder()
+			.setClientName(OzgCloudClientAttributeTestFactory.CLIENT)
+			.setAttributeName(OzgCloudClientAttributeTestFactory.ATTRIBUTE_NAME)
+			.setAccess(ACCESS_PERMISSION);
+	}
+}
diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/client_attribute/OzgCloudClientAttributeTestFactory.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/client_attribute/OzgCloudClientAttributeTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..9b7e435c8c0a42e45b2d99e8b2a04357f0d88813
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/client_attribute/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.client_attribute;
+
+import com.thedeanda.lorem.LoremIpsum;
+
+import de.ozgcloud.apilib.client_attribute.OzgCloudBooleanClientAttribute.OzgCloudBooleanClientAttributeBuilder;
+import de.ozgcloud.apilib.client_attribute.OzgCloudDoubleClientAttribute.OzgCloudDoubleClientAttributeBuilder;
+import de.ozgcloud.apilib.client_attribute.OzgCloudLongClientAttribute.OzgCloudLongClientAttributeBuilder;
+import de.ozgcloud.apilib.client_attribute.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/client_attribute/grpc/OzgCloudClientAttributeGrpcServiceTest.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/client_attribute/grpc/OzgCloudClientAttributeGrpcServiceTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..e9341c3d72ca55c6f9edec2dd088c8197ae84234
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/client_attribute/grpc/OzgCloudClientAttributeGrpcServiceTest.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.client_attribute.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.client_attribute.OzgCloudBooleanClientAttribute;
+import de.ozgcloud.apilib.client_attribute.OzgCloudClientAttributeTestFactory;
+import de.ozgcloud.apilib.client_attribute.OzgCloudDoubleClientAttribute;
+import de.ozgcloud.apilib.client_attribute.OzgCloudLongClientAttribute;
+import de.ozgcloud.apilib.client_attribute.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 OzgCloudClientAttributeGrpcServiceTest {
+
+	@Spy
+	@InjectMocks
+	private OzgCloudClientAttributeGrpcService 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).doSetClientAttribute(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 shouldCallSetClientAttribute() {
+				service.setClientAttribute(CLIENT_ATTRIBUTE, OzgCloudVorgangTestFactory.ID);
+
+				verify(service).doSetClientAttribute(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 shouldCallSetClientAttribute() {
+				service.setClientAttribute(CLIENT_ATTRIBUTE, OzgCloudVorgangTestFactory.ID);
+
+				verify(service).doSetClientAttribute(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 shouldCallSetClientAttribute() {
+				service.setClientAttribute(CLIENT_ATTRIBUTE, OzgCloudVorgangTestFactory.ID);
+
+				verify(service).doSetClientAttribute(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 shouldCallSetClientAttribute() {
+				service.setClientAttribute(CLIENT_ATTRIBUTE, OzgCloudVorgangTestFactory.ID);
+
+				verify(service).doSetClientAttribute(grpcClientAttribute, OzgCloudVorgangTestFactory.ID);
+			}
+		}
+	}
+
+	@Nested
+	class TestDoSetClientAttribute {
+
+		@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.doSetClientAttribute(grpcClientAttribute, OzgCloudVorgangTestFactory.ID);
+
+			verify(service).buildRequest(grpcClientAttribute, OzgCloudVorgangTestFactory.ID.toString());
+		}
+
+		@Test
+		void shouldCallGetServiceBlockingStub() {
+			service.doSetClientAttribute(grpcClientAttribute, OzgCloudVorgangTestFactory.ID);
+
+			verify(service).getAttributesServiceStub();
+		}
+
+		@Test
+		void shouldCallSet() {
+			service.doSetClientAttribute(grpcClientAttribute, OzgCloudVorgangTestFactory.ID);
+
+			verify(stubWithInterceptor).set(grpcRequest);
+		}
+	}
+
+	@Nested
+	class TestBuildRequest {
+
+		private static final String VORGANG_ID = OzgCloudVorgangTestFactory.ID.toString();
+
+		@Test
+		void shouldSetClientAttribute() {
+			var request = service.buildRequest(grpcClientAttribute, VORGANG_ID);
+
+			assertThat(request.getAttribute()).isSameAs(grpcClientAttribute);
+		}
+
+		@Test
+		void shouldSetVorgangId() {
+			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/client_attribute/grpc/OzgCloudClientAttributeMapperTest.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/client_attribute/grpc/OzgCloudClientAttributeMapperTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..965f50f793147421b7eb9a546c3cb2c8b8874f74
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/client_attribute/grpc/OzgCloudClientAttributeMapperTest.java
@@ -0,0 +1,66 @@
+/*
+ * 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.client_attribute.grpc;
+
+import static org.assertj.core.api.Assertions.*;
+
+import org.junit.jupiter.api.Test;
+import org.mapstruct.factory.Mappers;
+
+import de.ozgcloud.apilib.client_attribute.GrpcClientAttributeTestFactory;
+import de.ozgcloud.apilib.client_attribute.OzgCloudClientAttributeTestFactory;
+
+class OzgCloudClientAttributeMapperTest {
+
+	private OzgCloudClientAttributeMapper mapper = Mappers.getMapper(OzgCloudClientAttributeMapper.class);
+
+	@Test
+	void shouldMapBooleanAttribute() {
+		var result = mapper.toGrpc(OzgCloudClientAttributeTestFactory.createBoolean());
+
+		assertThat(result).usingRecursiveComparison().isEqualTo(GrpcClientAttributeTestFactory.createBoolean());
+	}
+
+	@Test
+	void shouldMapStringAttribute() {
+		var result = mapper.toGrpc(OzgCloudClientAttributeTestFactory.createString());
+
+		assertThat(result).usingRecursiveComparison().isEqualTo(GrpcClientAttributeTestFactory.createString());
+	}
+
+	@Test
+	void shouldMapLongAttribute() {
+		var result = mapper.toGrpc(OzgCloudClientAttributeTestFactory.createLong());
+
+		assertThat(result).usingRecursiveComparison().isEqualTo(GrpcClientAttributeTestFactory.createLong());
+	}
+
+	@Test
+	void shouldMapDoubleAttribute() {
+		var result = mapper.toGrpc(OzgCloudClientAttributeTestFactory.createDouble());
+
+		assertThat(result).usingRecursiveComparison().isEqualTo(GrpcClientAttributeTestFactory.createDouble());
+	}
+}
\ No newline at end of file