diff --git a/rollup.config.js b/rollup.config.js
index 3b9fa2964de64f59105fdd2e540112bc5c8c038d..77895ef96270edca4752507e9c1fb5b869d8c096 100644
--- a/rollup.config.js
+++ b/rollup.config.js
@@ -183,7 +183,7 @@ Dependencies:
                 {src: 'assets/*-placeholder.png', dest: 'dist/' + await getDistPath(pkg.name)},
                 {src: 'assets/*.css', dest: 'dist/' + await getDistPath(pkg.name)},
                 {src: 'assets/*.ico', dest: 'dist/' + await getDistPath(pkg.name)},
-                {src: 'assets/*.metadata.json', dest: 'dist'},
+                {src: 'src/*.metadata.json', dest: 'dist'},
                 {src: 'assets/*.svg', dest: 'dist/' + await getDistPath(pkg.name)},
                 {src: 'assets/htaccess-shared', dest: 'dist/shared/', rename: '.htaccess'},
                 {src: 'assets/icon-*.png', dest: 'dist/' + await getDistPath(pkg.name)},
diff --git a/src/activity.js b/src/activity.js
new file mode 100644
index 0000000000000000000000000000000000000000..ddf7c89ca3122e2127f1506f800cb619508b8a30
--- /dev/null
+++ b/src/activity.js
@@ -0,0 +1,16 @@
+export class Activity {
+    constructor(data) {
+        this._data = data;
+        this._defaultLang = 'en';
+    }
+
+    getName(lang) {
+        let desc = this._data['name'];
+        return desc[lang] ?? desc['en'];
+    }
+
+    getDescription(lang) {
+        let desc = this._data['description'];
+        return desc[lang] ?? desc['en'];
+    }
+}
\ No newline at end of file
diff --git a/src/dbp-official-signature-pdf-upload.js b/src/dbp-official-signature-pdf-upload.js
index ffdf759c7327d6c726c237e0c3ac56fcb5d61829..729df962bedd97cfad44513eb208d5792a015d9b 100644
--- a/src/dbp-official-signature-pdf-upload.js
+++ b/src/dbp-official-signature-pdf-upload.js
@@ -17,6 +17,8 @@ import {name as pkgName} from './../package.json';
 import {getPDFSignatureCount} from './utils.js';
 import {send as notify} from '@dbp-toolkit/common/notification';
 import {OrganizationSelect} from "@dbp-toolkit/organization-select";
+import metadata from './dbp-official-signature-pdf-upload.metadata.json';
+import {Activity} from './activity.js';
 
 const i18n = createI18nInstance();
 
@@ -815,13 +817,14 @@ class OfficialSignaturePdfUpload extends ScopedElementsMixin(DBPSignatureLitElem
 
     render() {
         const placeholderUrl = commonUtils.getAssetURL(pkgName, 'official-signature-placeholder.png');
+        const activity = new Activity(metadata);
 
         return html`
             <div class="${classMap({hidden: !this.isLoggedIn() || !this.hasSignaturePermissions() || this.isLoading()})}">
                 <div class="field">
-                    <h2>${i18n.t('official-pdf-upload.upload-field-label')}</h2>
+                    <h2>${activity.getName(this.lang)}</h2>
                     <p class="subheadline">
-                        ${i18n.t('official-pdf-upload.sub-headline')}
+                        ${activity.getDescription(this.lang)}
                     </p>
                     <div class="control">
                        
diff --git a/assets/dbp-official-signature-pdf-upload.metadata.json b/src/dbp-official-signature-pdf-upload.metadata.json
similarity index 100%
rename from assets/dbp-official-signature-pdf-upload.metadata.json
rename to src/dbp-official-signature-pdf-upload.metadata.json
diff --git a/src/dbp-qualified-signature-pdf-upload.js b/src/dbp-qualified-signature-pdf-upload.js
index f6e3573abda36a01f1cfb7f04959b030245c74f9..62ad583afe79b6822ffedefecd6d79a10aee75dd 100644
--- a/src/dbp-qualified-signature-pdf-upload.js
+++ b/src/dbp-qualified-signature-pdf-upload.js
@@ -16,6 +16,8 @@ import {FileSink} from "@dbp-toolkit/file-handling";
 import {name as pkgName} from './../package.json';
 import {getPDFSignatureCount} from './utils.js';
 import {send as notify} from '@dbp-toolkit/common/notification';
+import metadata from './dbp-qualified-signature-pdf-upload.metadata.json';
+import {Activity} from './activity.js';
 
 const i18n = createI18nInstance();
 
@@ -935,13 +937,14 @@ class QualifiedSignaturePdfUpload extends ScopedElementsMixin(DBPSignatureLitEle
 
     render() {
         const placeholderUrl = commonUtils.getAssetURL(pkgName, 'qualified-signature-placeholder.png');
+        const activity = new Activity(metadata);
 
         return html`
             <div class="${classMap({hidden: !this.isLoggedIn() || !this.hasSignaturePermissions() || this.isLoading()})}">
                 <div class="field ${classMap({"is-disabled": this.isUserInterfaceDisabled()})}">
-                    <h2>${i18n.t('qualified-pdf-upload.upload-field-label')}</h2>
+                    <h2>${activity.getName(this.lang)}</h2>
                     <p class="subheadline">
-                        ${i18n.t('qualified-pdf-upload.sub-headline')}
+                        ${activity.getDescription(this.lang)}
                     </p>
                     <div class="control">
                         
diff --git a/assets/dbp-qualified-signature-pdf-upload.metadata.json b/src/dbp-qualified-signature-pdf-upload.metadata.json
similarity index 100%
rename from assets/dbp-qualified-signature-pdf-upload.metadata.json
rename to src/dbp-qualified-signature-pdf-upload.metadata.json
diff --git a/src/dbp-signature-verification-full.js b/src/dbp-signature-verification-full.js
index 674cecbbc10371be37d03ac250111c1524b24de3..e1fbf2a34a9eaf6551c9ff3a38cc6b6f0871ecdb 100644
--- a/src/dbp-signature-verification-full.js
+++ b/src/dbp-signature-verification-full.js
@@ -11,6 +11,8 @@ import {classMap} from 'lit-html/directives/class-map.js';
 import {FileSource} from '@dbp-toolkit/file-handling';
 import JSONLD from "@dbp-toolkit/common/jsonld";
 import {name as pkgName} from './../package.json';
+import metadata from './dbp-signature-verification-full.metadata.json';
+import {Activity} from './activity.js';
 
 const i18n = createI18nInstance();
 
@@ -690,13 +692,14 @@ class SignatureVerificationFull extends ScopedElementsMixin(DBPSignatureLitEleme
 
     render() {
         const placeholderUrl = commonUtils.getAssetURL(pkgName, 'official-signature-placeholder.png');
+        const activity = new Activity(metadata);
 
         return html`
             <div class="${classMap({hidden: !this.isLoggedIn() || !this.hasSignaturePermissions() || this.isLoading()})}">
                 <div class="field">
-                    <h2>${i18n.t('signature-verification.upload-field-label')}</h2>
+                    <h2>${activity.getName(this.lang)}</h2>
                     <p class="subheadline">
-                        ${i18n.t('signature-verification.sub-headline')}
+                        ${activity.getDescription(this.lang)}
                     </p>
                     <div class="control">
                         
diff --git a/assets/dbp-signature-verification-full.metadata.json b/src/dbp-signature-verification-full.metadata.json
similarity index 100%
rename from assets/dbp-signature-verification-full.metadata.json
rename to src/dbp-signature-verification-full.metadata.json
diff --git a/src/dbp-signature-verification.js b/src/dbp-signature-verification.js
index 41a7147e5bdb1148816afe7384c49d4547996bf8..fd1dbb27686cf22e2014004f1170420958ef3c68 100644
--- a/src/dbp-signature-verification.js
+++ b/src/dbp-signature-verification.js
@@ -4,6 +4,8 @@ import {ScopedElementsMixin} from '@open-wc/scoped-elements';
 import DBPSignatureLitElement from "./dbp-signature-lit-element";
 import * as commonUtils from '@dbp-toolkit/common/utils';
 import * as commonStyles from '@dbp-toolkit/common/styles';
+import metadata from './dbp-signature-verification.metadata.json';
+import {Activity} from './activity.js';
 
 const i18n = createI18nInstance();
 
@@ -102,10 +104,11 @@ class SignatureVerification extends ScopedElementsMixin(DBPSignatureLitElement)
     }
 
     render() {
+        const activity = new Activity(metadata);
         return html`
-            <h2>${i18n.t('signature-verification-extern.headline')}</h2>
+            <h2>${activity.getName(this.lang)}</h2>
             <p class="subheadline">
-                ${i18n.t('signature-verification.sub-headline')}
+                ${activity.getDescription(this.lang)}
             </p>
             <p>
                 ${i18n.t('signature-verification-extern.description-text')}
diff --git a/assets/dbp-signature-verification.metadata.json b/src/dbp-signature-verification.metadata.json
similarity index 100%
rename from assets/dbp-signature-verification.metadata.json
rename to src/dbp-signature-verification.metadata.json
diff --git a/src/i18n/de/translation.json b/src/i18n/de/translation.json
index 67032b126601dd6a59925b00af31d0b0f8ece232..1f2dc67b2d59824c8d49a55a6709f6f75a576055 100644
--- a/src/i18n/de/translation.json
+++ b/src/i18n/de/translation.json
@@ -1,7 +1,5 @@
 {
   "official-pdf-upload": {
-    "upload-field-label": "Dokumente amtssignieren",
-    "sub-headline": "Erlaubt das Hochladen von PDF-Dokumenten, um sie mit einer Amtssignatur zu versehen",
     "upload-text": "Sie können PDF-Dokumente mit einer Maximalgröße von bis zu 32MB pro Dokument hochladen. Die PDF-Dokumente dürfen sich auch in ZIP-Dateien befinden.",
     "upload-area-text": "Sie können in diesem Bereich PDF-Dokumente mit einer Maximalgröße von bis zu 32MB pro Dokument per Drag & Drop oder per Direktauswahl hochladen. Die PDF-Dokumente dürfen sich auch in ZIP-Dateien befinden.",
     "queued-files-label": "Dokumente in der Warteschlange",
@@ -33,8 +31,6 @@
     "add-annotation-title": "Dem PDF eine Kennzahl hinzufügen"
   },
   "qualified-pdf-upload": {
-    "upload-field-label": "Dokument persönlich signieren",
-    "sub-headline": "Erlaubt das Hochladen von PDF-Dokumenten, um sie mit einer persönlichen elektronischen Signatur zu versehen",
     "save-field-label": "{{count}} Datei speichern",
     "save-field-label_plural": "{{count}} Dateien speichern",
     "upload-text": "Sie können PDF-Dokumente mit einer Maximalgröße von bis zu 32MB pro Dokument hochladen. Die PDF-Dokumente dürfen sich auch in ZIP-Dateien befinden.",
@@ -68,8 +64,6 @@
     "file-picker-context": "PDF-Dokumente zum Signieren auswählen"
   },
   "signature-verification": {
-    "upload-field-label": "PDF-Dokumente zum Überprüfen der Signaturen hochladen",
-    "sub-headline": "Erlaubt das Verifizieren von signierten PDF-Dokumenten",
     "upload-text": "Sie können in diesem Bereich PDF-Dokumente mit einer Maximalgröße von bis zu 32MB pro Dokument hochladen. Die PDF-Dokumente dürfen sich auch in ZIP-Dateien befinden.",
     "upload-area-text": "Sie können in diesem Bereich PDF-Dokumente mit einer Maximalgröße von bis zu 32MB pro Dokument per Drag & Drop oder per Direktauswahl hochladen. Die PDF-Dokumente dürfen sich auch in ZIP-Dateien befinden.",
     "queued-files-label": "Dokumente in der Warteschlange",
@@ -99,7 +93,6 @@
     "file-picker-context": "PDF-Dokumente zum Verifizieren auswählen"
   },
   "signature-verification-extern": {
-    "headline": "Signierte Dokumente verifizieren",
     "description-text": "Um eine PDF-Signatur auf ihre Gültigkeit zu überprüfen, benutzen Sie bitte das Verifikationsservice der Rundfunk und Telekom Regulierungs-GmbH. Mit diesem Verifikationsservice können Sie überprüfen, ob das Dokument eine valide Signatur enthält.",
     "link-label": "Zum RTR Verifikationsservice wechseln",
     "adobe-reader-text": "Des Weiteren besteht auch die Möglichkeit, das Dokument lokal mit dem Adobe Reader zu überprüfen.",
diff --git a/src/i18n/en/translation.json b/src/i18n/en/translation.json
index 441d4c93fddc637da2d7c856a29564f866b5fe78..8781c41d2b3567e24950e5f4b1b73fed64497185 100644
--- a/src/i18n/en/translation.json
+++ b/src/i18n/en/translation.json
@@ -1,7 +1,5 @@
 {
   "official-pdf-upload": {
-    "upload-field-label": "Officially sign",
-    "sub-headline": "Allows upload of PDF-documents to officially sign them",
     "upload-text": "In this area you can upload PDF-documents up to a size of 32MB. The PDF-documents can also be located in a ZIP-file.",
     "upload-area-text": "In this area you can upload PDF-documents up to a size of 32MB via Drag & Drop or by selecting them directly. The PDF-documents can also be located in a ZIP-file.",
     "queued-files-label": "Queued documents",
@@ -33,8 +31,6 @@
     "add-annotation-title": "Add annotation to PDF"
   },
   "qualified-pdf-upload": {
-    "upload-field-label": "Personally Sign Document",
-    "sub-headline": "Allows upload of PDF-documents to personally sign them",
     "save-field-label": "Save {{count}} file",
     "save-field-label_plural": "Save {{count}} files",
     "upload-text": "In this area you can upload PDF-documents up to a size of 32MB. The PDF-documents can also be located in a ZIP-file.",
@@ -68,8 +64,6 @@
     "file-picker-context": "Upload PDF-documents to sign"
   },
   "signature-verification": {
-    "upload-field-label": "Verify signed documents",
-    "sub-headline": "Allows verification of signed PDF-documents",
     "upload-text": "In this area you can upload PDF-documents up to a size of 32MB. The PDF-documents can also be located in a ZIP-file.",
     "upload-area-text": "In this area you can upload PDF-documents up to a size of 32MB via Drag & Drop or by selecting them directly. The PDF-documents can also be located in a ZIP-file.",
     "queued-files-label": "Queued documents",
@@ -99,7 +93,6 @@
     "file-picker-context": "Upload PDF-documents to verify"
   },
   "signature-verification-extern": {
-    "headline": "Verify signed Documents",
     "description-text": "To check a PDF signature for validity, please use the verification service of the Rundfunk und Telekom Regulierungs-GmbH. This verification service allows you to check whether the document contains a valid signature.",
     "link-label": "Switch to the RTR verification service",
     "adobe-reader-text": "Furthermore, it is also possible to verify the signature locally with the Adobe Reader.",