diff --git a/api/src/main/java/fitconnect/api/domain/metadata/data/EidasAdesProfile.java b/api/src/main/java/fitconnect/api/domain/metadata/data/EidasAdesProfile.java
index 0fd71a987508c907262c061cba264c1a0b66d41e..3e19a0aa2274ba1bf16f4d2c2b2f161ab35bca9f 100644
--- a/api/src/main/java/fitconnect/api/domain/metadata/data/EidasAdesProfile.java
+++ b/api/src/main/java/fitconnect/api/domain/metadata/data/EidasAdesProfile.java
@@ -18,6 +18,7 @@ public enum EidasAdesProfile {
     HTTP_URI_ETSI_ORG_ADES_191_X_2_LEVEL_BASELINE_B_T("http://uri.etsi.org/ades/191x2/level/baseline/B-T#"),
     HTTP_URI_ETSI_ORG_ADES_191_X_2_LEVEL_BASELINE_B_LT("http://uri.etsi.org/ades/191x2/level/baseline/B-LT#"),
     HTTP_URI_ETSI_ORG_ADES_191_X_2_LEVEL_BASELINE_B_LTA("http://uri.etsi.org/ades/191x2/level/baseline/B-LTA#");
+
     private final String value;
     private final static Map<String, EidasAdesProfile> CONSTANTS = new HashMap<>();
 
diff --git a/api/src/main/java/fitconnect/api/metadata/MetadataService.java b/api/src/main/java/fitconnect/api/metadata/MetadataService.java
index e9d674575c767d7e038856084d835fe7a00cd2ff..94a847f081723404cbaf8b00ce5e3914d20f1603 100644
--- a/api/src/main/java/fitconnect/api/metadata/MetadataService.java
+++ b/api/src/main/java/fitconnect/api/metadata/MetadataService.java
@@ -1,8 +1,23 @@
 package fitconnect.api.metadata;
 
+import com.nimbusds.jose.jwk.RSAKey;
 import fitconnect.api.domain.metadata.Metadata;
+import fitconnect.api.domain.metadata.attachment.Attachment;
+import fitconnect.api.domain.metadata.data.Data;
 
+import java.util.List;
+
+/**
+ * Provides the generation of correct and valid {@link Metadata} for a submission
+ */
 public interface MetadataService {
 
-    Metadata createMetadata();
+    /**
+     *
+     * @param data the actual data payload (json or xml)
+     * @param attachments list of 0..n attachments as binary data
+     * @param publicKey the publicKey the data and attachments are encrypted with
+     * @return Metadata with hashes of the data and attachments to send
+     */
+    Metadata createMetadata(final Data data, final List<Attachment> attachments, final RSAKey publicKey);
 }
diff --git a/api/src/main/java/fitconnect/api/validation/CertificateValidator.java b/api/src/main/java/fitconnect/api/validation/CertificateValidator.java
new file mode 100644
index 0000000000000000000000000000000000000000..af35996defdaace136c8a5dad31a7e1128633d0e
--- /dev/null
+++ b/api/src/main/java/fitconnect/api/validation/CertificateValidator.java
@@ -0,0 +1,12 @@
+package fitconnect.api.validation;
+
+import com.nimbusds.jose.jwk.RSAKey;
+
+/**
+ *
+ * See <a>https://docs.fitko.de/fit-connect/docs/sending/encrypt/#certificateValidation</a>
+ */
+public interface CertificateValidator {
+
+    ValidationResult validatePublicKey(final RSAKey publicKey);
+}
diff --git a/api/src/main/java/fitconnect/api/validation/MetadataValidator.java b/api/src/main/java/fitconnect/api/validation/MetadataValidator.java
new file mode 100644
index 0000000000000000000000000000000000000000..6c1e3776a30bb950d49a6977a2e8c4936b4cd92a
--- /dev/null
+++ b/api/src/main/java/fitconnect/api/validation/MetadataValidator.java
@@ -0,0 +1,31 @@
+package fitconnect.api.validation;
+
+import fitconnect.api.domain.metadata.Metadata;
+import fitconnect.api.domain.metadata.attachment.Attachment;
+import fitconnect.api.domain.metadata.data.Data;
+
+/**
+ * A validator that ensure the integrity of the transferred metadata of a submission
+ */
+public interface MetadataValidator {
+
+    /**
+     * Validated the metdata against a given schema
+     *
+     * @param metadata the current metadata object that is validated
+     * @param jsonSchema the schema that is used to validate against
+     *
+     * @return a validation result with an optional error list
+     */
+    ValidationResult validateMetadataSchema(final Metadata metadata, String jsonSchema);
+
+    /**
+     * Checks if the message digest hashes of the metadatas {@link Data} and {@link Attachment}
+     * are correct after transmission
+     *
+     * @param metadata the current metadata object that is validated
+     *
+     * @return a validation result with an optional error list
+     */
+    ValidationResult validateMetadataHashValues(final Metadata metadata);
+}
diff --git a/api/src/main/java/fitconnect/api/validation/ValidationResult.java b/api/src/main/java/fitconnect/api/validation/ValidationResult.java
index d2a0e7fccce8d57dd39d7772a524ddaad76dcdc5..08bb6eef68a76ee1b7fec6f8faeefce6cb5ee2cf 100644
--- a/api/src/main/java/fitconnect/api/validation/ValidationResult.java
+++ b/api/src/main/java/fitconnect/api/validation/ValidationResult.java
@@ -1,4 +1,8 @@
 package fitconnect.api.validation;
 
-public class ValidationResult {
-}
+import java.util.List;
+
+/**
+ * Wrapper for validations including errors that occurred
+ */
+public record ValidationResult(boolean isValid, List<Exception> errors) { }
diff --git a/impl/src/main/java/fitconnect/impl/SubmissionSender.java b/impl/src/main/java/fitconnect/impl/SubmissionSender.java
index 7bdcde0f639912dae211f0310cebe38a4b994a0b..4275afff815c747483b93f539dea16cf9717db7b 100644
--- a/impl/src/main/java/fitconnect/impl/SubmissionSender.java
+++ b/impl/src/main/java/fitconnect/impl/SubmissionSender.java
@@ -5,15 +5,20 @@ import fitconnect.api.auth.OAuthService;
 import fitconnect.api.auth.OAuthToken;
 import fitconnect.api.crypto.EncryptionService;
 import fitconnect.api.domain.metadata.Metadata;
+import fitconnect.api.domain.metadata.attachment.Attachment;
+import fitconnect.api.domain.metadata.data.Data;
 import fitconnect.api.metadata.MetadataService;
 import fitconnect.api.problems.EncryptionProblem;
+import fitconnect.api.validation.CertificateValidator;
+import fitconnect.api.validation.ValidationResult;
 
+import java.util.List;
 import java.util.Optional;
 
 /**
  * A technical system that creates a submission via the FIT-Co Submission API.
  */
-public class SubmissionSender implements OAuthService, EncryptionService, MetadataService {
+public class SubmissionSender implements OAuthService, EncryptionService, MetadataService, CertificateValidator {
 
     private final OAuthService authService;
     private final EncryptionService encryptionService;
@@ -39,7 +44,13 @@ public class SubmissionSender implements OAuthService, EncryptionService, Metada
     }
 
     @Override
-    public Metadata createMetadata() {
+    public Metadata createMetadata(Data data, List<Attachment> attachments, RSAKey publicKey) {
         throw new UnsupportedOperationException("not yet implemented");
     }
+
+    @Override
+    public ValidationResult validatePublicKey(final RSAKey publicKey) {
+        throw new UnsupportedOperationException("not yet implemented");
+    }
+
 }
diff --git a/impl/src/main/java/fitconnect/impl/SubmissionSubscriber.java b/impl/src/main/java/fitconnect/impl/SubmissionSubscriber.java
index e4e1e2f4349f3c16e13631e6586d62048e5a3c7d..e271f2cbd234a44ba3894c85d4f198c14767c573 100644
--- a/impl/src/main/java/fitconnect/impl/SubmissionSubscriber.java
+++ b/impl/src/main/java/fitconnect/impl/SubmissionSubscriber.java
@@ -4,14 +4,17 @@ import com.nimbusds.jose.jwk.RSAKey;
 import fitconnect.api.auth.OAuthService;
 import fitconnect.api.auth.OAuthToken;
 import fitconnect.api.crypto.DecryptionService;
+import fitconnect.api.domain.metadata.Metadata;
 import fitconnect.api.problems.DecryptionProblem;
+import fitconnect.api.validation.MetadataValidator;
+import fitconnect.api.validation.ValidationResult;
 
 import java.util.Optional;
 
 /**
  * The technical system that accepts submissions on the administration side.
  */
-public class SubmissionSubscriber implements OAuthService, DecryptionService {
+public class SubmissionSubscriber implements OAuthService, DecryptionService, MetadataValidator {
 
     private final OAuthService authService;
     private final DecryptionService decryptionService;
@@ -36,4 +39,14 @@ public class SubmissionSubscriber implements OAuthService, DecryptionService {
         return decryptionService.decryptBytes(privateKey, encryptedData);
 
     }
+
+    @Override
+    public ValidationResult validateMetadataSchema(Metadata metadata, String jsonSchema) {
+        throw new UnsupportedOperationException("not yet implemented");
+    }
+
+    @Override
+    public ValidationResult validateMetadataHashValues(Metadata metadata) {
+        throw new UnsupportedOperationException("not yet implemented");
+    }
 }