diff --git a/Server-Protocol-Buffer/src/main/proto/internal/v2/app_config_android.proto b/Server-Protocol-Buffer/src/main/proto/internal/v2/app_config_android.proto
new file mode 100644
index 0000000000000000000000000000000000000000..6f6d21c22cb69a428d9b4c98239c4a7c5a6e29fd
--- /dev/null
+++ b/Server-Protocol-Buffer/src/main/proto/internal/v2/app_config_android.proto
@@ -0,0 +1,50 @@
+syntax = "proto3";
+package de.rki.coronawarnapp.server.protocols.internal.v2;
+import "internal/v2/app_features.proto";
+import "internal/v2/risk_calculation_parameters.proto";
+import "internal/v2/key_download_parameters.proto";
+import "internal/v2/exposure_detection_parameters.proto";
+
+message ApplicationConfigurationAndroid {
+
+  // Android apps are versioned by Version Code and not by Semantic Versioning
+  int64 minVersionCode = 1;
+  int64 latestVersionCode = 2;
+
+  AppFeatures appFeatures = 3;
+
+  repeated string supportedCountries = 4;
+
+  KeyDownloadParametersAndroid keyDownloadParameters = 5;
+
+  ExposureDetectionParametersAndroid exposureDetectionParameters = 6;
+
+  RiskCalculationParameters riskCalculationParameters = 7;
+
+  DiagnosisKeysDataMapping diagnosisKeysDataMapping = 8;
+  DailySummariesConfig dailySummariesConfig = 9;
+}
+
+message DiagnosisKeysDataMapping {
+
+  map<int32, int32> daysSinceOnsetToInfectiousness = 1;
+
+  int32 infectiousnessWhenDaysSinceOnsetMissing = 2;
+
+  int32 reportTypeWhenMissing = 3;
+}
+
+message DailySummariesConfig {
+
+  repeated int32 attenuationBucketThresholdDb = 1;
+
+  repeated double attenuationBucketWeights = 2;
+
+  int32 daysSinceExposureThreshold = 3;
+
+  map<int32, double> infectiousnessWeights = 4;
+
+  double minimumWindowScore = 5;
+
+  map<int32, double> reportTypeWeights = 6;
+}
\ No newline at end of file
diff --git a/Server-Protocol-Buffer/src/main/proto/internal/v2/app_features.proto b/Server-Protocol-Buffer/src/main/proto/internal/v2/app_features.proto
new file mode 100644
index 0000000000000000000000000000000000000000..f53be3812f37d45a8d719b0585e4e839ca2068c1
--- /dev/null
+++ b/Server-Protocol-Buffer/src/main/proto/internal/v2/app_features.proto
@@ -0,0 +1,11 @@
+syntax = "proto3";
+package de.rki.coronawarnapp.server.protocols.internal.v2;
+
+message AppFeatures {
+  repeated AppFeature appFeatures = 1;
+}
+
+message AppFeature {
+  string label = 1;
+  int32 value = 2;
+}
\ No newline at end of file
diff --git a/Server-Protocol-Buffer/src/main/proto/internal/v2/exposure_detection_parameters.proto b/Server-Protocol-Buffer/src/main/proto/internal/v2/exposure_detection_parameters.proto
new file mode 100644
index 0000000000000000000000000000000000000000..754bd769abdec32ba1be1cf532668ee03dde19f5
--- /dev/null
+++ b/Server-Protocol-Buffer/src/main/proto/internal/v2/exposure_detection_parameters.proto
@@ -0,0 +1,14 @@
+syntax = "proto3";
+package de.rki.coronawarnapp.server.protocols.internal.v2;
+
+message ExpsureDetectionParametersIOS {
+
+  int32 maxExposureDetectionsPerInterval = 1;
+}
+
+message ExposureDetectionParametersAndroid {
+
+  int32 maxExposureDetectionsPerInterval = 1;
+
+  int32 overallTimeoutInSeconds = 2;
+}
\ No newline at end of file
diff --git a/Server-Protocol-Buffer/src/main/proto/internal/v2/key_download_parameters.proto b/Server-Protocol-Buffer/src/main/proto/internal/v2/key_download_parameters.proto
new file mode 100644
index 0000000000000000000000000000000000000000..4cf97b977589c0b7f8786ecb9d28acd627633331
--- /dev/null
+++ b/Server-Protocol-Buffer/src/main/proto/internal/v2/key_download_parameters.proto
@@ -0,0 +1,31 @@
+syntax = "proto3";
+package de.rki.coronawarnapp.server.protocols.internal.v2;
+
+message KeyDownloadParametersIOS {
+
+  repeated DayPackageMetadata cachedDayPackagesToUpdateOnETagMismatch = 1;
+  repeated HourPackageMetadata cachedHourPackagesToUpdateOnETagMismatch = 2;
+}
+
+message KeyDownloadParametersAndroid {
+
+  repeated DayPackageMetadata cachedDayPackagesToUpdateOnETagMismatch = 1;
+  repeated HourPackageMetadata cachedHourPackagesToUpdateOnETagMismatch = 2;
+
+  int32 downloadTimeoutInSeconds = 3;
+
+  int32 overallTimeoutInSeconds = 4;
+}
+
+message DayPackageMetadata {
+  string region = 1;
+  string date = 2;
+  string etag = 3;
+}
+
+message HourPackageMetadata {
+  string region = 1;
+  string date = 2;
+  int32 hour = 3;
+  string etag = 4;
+}
\ No newline at end of file
diff --git a/Server-Protocol-Buffer/src/main/proto/internal/v2/risk_calculation_parameters.proto b/Server-Protocol-Buffer/src/main/proto/internal/v2/risk_calculation_parameters.proto
new file mode 100644
index 0000000000000000000000000000000000000000..2618917a09169079503e8f8fa44243a47be64e8e
--- /dev/null
+++ b/Server-Protocol-Buffer/src/main/proto/internal/v2/risk_calculation_parameters.proto
@@ -0,0 +1,63 @@
+syntax = "proto3";
+package de.rki.coronawarnapp.server.protocols.internal.v2;
+
+message RiskCalculationParameters {
+
+  repeated MinutesAtAttenuationFilter minutesAtAttenuationFilters = 1;
+
+  repeated TrlFilter trlFilters = 2;
+
+  repeated MinutesAtAttenuationWeight minutesAtAttenuationWeights = 3;
+
+  repeated NormalizedTimeToRiskLevelMapping normalizedTimePerEWToRiskLevelMapping = 4;
+
+  repeated NormalizedTimeToRiskLevelMapping normalizedTimePerDayToRiskLevelMapping = 5;
+
+  TransmissionRiskLevelEncoding trlEncoding = 6;
+
+  double transmissionRiskLevelMultiplier = 7;
+}
+
+message Range {
+  // The lower limit of the range
+  double min = 1;
+  // True if `min` is not part of the range, false otherwise
+  bool minExclusive = 2;
+  // The upper limit of the range
+  double max = 3;
+  // True if `max` is not part of the range, false otherwise
+  bool maxExclusive = 4;
+}
+
+message MinutesAtAttenuationFilter {
+  Range attenuationRange = 1;
+  Range dropIfMinutesInRange = 2;
+}
+
+message TrlFilter {
+  Range dropIfTrlInRange = 1;
+}
+
+message MinutesAtAttenuationWeight {
+  Range attenuationRange = 1;
+  double weight = 2;
+}
+
+message NormalizedTimeToRiskLevelMapping {
+  Range normalizedTimeRange = 1;
+  enum RiskLevel {
+    UNSPECIFIED = 0;
+    LOW = 1;
+    HIGH = 2;
+  }
+  RiskLevel riskLevel = 2;
+}
+
+message TransmissionRiskLevelEncoding {
+  int32 infectiousnessOffsetStandard = 1;
+  int32 infectiousnessOffsetHigh = 2;
+  int32 reportTypeOffsetRecursive = 3;
+  int32 reportTypeOffsetSelfReport = 4;
+  int32 reportTypeOffsetConfirmedClinicalDiagnosis = 5;
+  int32 reportTypeOffsetConfirmedTest = 6;
+}
\ No newline at end of file
diff --git a/Server-Protocol-Buffer/src/main/proto/internal/v2/semantic_version.proto b/Server-Protocol-Buffer/src/main/proto/internal/v2/semantic_version.proto
new file mode 100644
index 0000000000000000000000000000000000000000..a5950c84435ab89bc4271d209a38a2632b617e4c
--- /dev/null
+++ b/Server-Protocol-Buffer/src/main/proto/internal/v2/semantic_version.proto
@@ -0,0 +1,8 @@
+syntax = "proto3";
+package de.rki.coronawarnapp.server.protocols.internal.v2;
+  
+message SemanticVersion {
+  uint32 major = 1;
+  uint32 minor = 2;
+  uint32 patch = 3;
+}
\ No newline at end of file