diff --git a/app/lang/de/cachet.php b/app/lang/de/cachet.php
new file mode 100644
index 00000000..79d45249
--- /dev/null
+++ b/app/lang/de/cachet.php
@@ -0,0 +1,47 @@
+ [
+ 'status' => [
+ 1 => 'Funktionsfähig',
+ 2 => 'Performance Probleme',
+ 3 => 'Teilweise Ausfall',
+ 4 => 'größerer Ausfall',
+ ],
+ ],
+
+ // Incidents
+ 'incidents' => [
+ 'none' => 'keine Vorfälle.',
+ 'past' => 'vergangene Vorfälle',
+ 'previous_week' => 'letzte Woche',
+ 'next_week' => 'nächste Woche',
+ 'none' => 'keine Vorfälle',
+ 'status' => [
+ 1 => 'Untersuchung läuft',
+ 2 => 'Problem identifiziert',
+ 3 => 'Problem unter Beobachtung',
+ 4 => 'Problem behoben',
+ ],
+ ],
+
+ // Service Status
+ 'service' => [
+ 'good' => 'Alle Systeme laufen.',
+ 'bad' => 'Bei einigen System sind Fehler aufgetreten.',
+ ],
+
+ 'api' => [
+ 'regenerate' => 'API-Schlüssel generieren',
+ 'revoke' => 'API-Schlüssel löschen',
+ ],
+
+ // Other
+ 'powered_by' => ':app Status-Seite via Cachet.',
+ 'about_this_site' => 'Über diese Seite',
+ 'rss-feed' => 'RSS Feed',
+ 'atom-feed' => 'Atom Feed',
+ 'feed' => 'Status Feed',
+
+];
diff --git a/app/lang/de/dashboard.php b/app/lang/de/dashboard.php
new file mode 100644
index 00000000..0b696e5a
--- /dev/null
+++ b/app/lang/de/dashboard.php
@@ -0,0 +1,129 @@
+ 'Dashboard',
+
+ // Incidents
+ 'incidents' => [
+ 'incidents' => 'Vorfälle',
+ 'logged' => '{0} Es gibt keine Vorfälle, gute Arbeit.|Sie haben ein Vorfall eingetragen.|Es gibt :count Vorfälle.',
+ 'incident-create-template' => 'Template anlegen',
+ 'add' => [
+ 'title' => 'Vorfall hinzufügen',
+ 'success' => 'Vorfall hinzugefügt.',
+ 'failure' => 'Es ist ein Fehler bei dem Erstellen eines Vorfälles aufgetreten.',
+ ],
+ 'edit' => [
+ 'title' => 'Vorfall aktualisieren',
+ 'success' => 'Vorfall aktualisiert.',
+ 'failure' => 'Es ist ein Fehler bei der Aktualisierung des Vorfälles aufgetreten.',
+ ],
+
+ // Incident templates
+ 'templates' => [
+ 'add' => [
+ 'title' => 'Vorfall-Template anlegen',
+ 'success' => 'Template angelegt.',
+ 'failure' => 'Es ist ein Fehler bei der Erstellung eines Templates aufgetreten.',
+ ],
+ ],
+ ],
+
+ // Components
+ 'components' => [
+ 'components' => 'Komponente|Komponenten',
+ 'component_statuses' => 'Komponenten-Statuus', # this is not a typo (statuus=plural)
+ 'add' => [
+ 'title' => 'Komponente hinzufügen',
+ 'message' => 'Sie sollten eine Komponente hinzufügen.',
+ 'success' => 'Komponente hinzugefügt.',
+ 'failure' => 'Es ist ein Fehler bei der Erstellung der Komponente aufgetreten.',
+ ],
+ 'edit' => [
+ 'title' => 'Komponente aktualisieren',
+ 'success' => 'Komponente aktualisiert.',
+ 'failure' => 'Es ist ein Fehler bei der Aktualisierung der Komponente aufgetreten.',
+ ],
+
+ // Component groups
+ 'groups' => [
+ 'groups' => 'Komponenten-Gruppe|Komponenten-Gruppen',
+ 'add' => [
+ 'title' => 'Komponenten-Gruppe hinzufügen',
+ 'success' => 'Komponenten-Gruppe hinzugefügt.',
+ 'failure' => 'Es ist ein Fehler bei der Erstellung einer Komponenten-Gruppe aufgetreten.',
+ ],
+ ],
+ ],
+
+ // Metrics
+ 'metrics' => [
+ 'metrics' => 'Metrics',
+ 'add' => [
+ 'title' => 'Einen Metrik-Punkt anlegen',
+ 'success' => 'Metrik-Punkt angelegt.',
+ 'failure' => 'Es ist ein Fehler bei der Erstellung eines Metrik-Punktes aufgetreten.',
+ ],
+ ],
+
+ // Team
+ 'team' => [
+ 'team' => 'Team',
+ 'member' => 'Mitglied',
+ 'profile' => 'Profil',
+ 'description' => 'Team-Mitgleider können Komponenten und Vorfälle hinzufügen und modifizieren.',
+ 'add' => [
+ 'title' => 'Team-Mitglied hinzufügen',
+ 'success' => 'Team-Mitglied hinzugefügt.',
+ 'failure' => 'Es ist ein Fehler bei der Erstellung eines neuen Team-Mitglieds aufgetreten.',
+ ],
+ 'edit' => [
+ 'title' => 'Profil aktualisieren',
+ 'success' => 'Profile aktualisiert.',
+ 'failure' => 'Es ist ein Fehler bei der Aktualisierung des Profils aufgetreten.',
+ ],
+ ],
+
+ // Settings
+ 'settings' => [
+ 'settings' => 'Einstellungen',
+ 'app-setup' => [
+ 'app-setup' => 'Setup',
+ ],
+ 'security' => [
+ 'security' => 'Sicherheit',
+ ],
+ 'stylesheet' => [
+ 'stylesheet' => 'Stylesheet',
+ ],
+ 'theme' => [
+ 'theme' => 'Theme',
+ ],
+ 'edit' => [
+ 'success' => 'Einstellungen gespeichert.',
+ 'failure' => 'Einstellungen konnten nicht gespeichert werden.',
+ ],
+ ],
+
+ // Login
+ 'login' => [
+ 'login' => 'Login',
+ 'logged_in' => 'Sie sind angemeldet.',
+ 'welcome' => 'Willkommen zurück!',
+ 'two-factor' => 'Bitte geben Sie den Wert Ihres Authentifikations-Tokens ein.',
+ ],
+
+ // Sidebar footer
+ 'help' => 'Hilfe',
+ 'status_page' => 'Status-Seite',
+ 'logout' => 'Logout',
+
+ // Notifications
+ 'notifications' => [
+ 'notifications' => 'Benachrichtigungen',
+ 'awesome' => 'Großartig.',
+ 'whoops' => 'Oops.',
+ ],
+
+];
diff --git a/app/lang/de/errors.php b/app/lang/de/errors.php
new file mode 100644
index 00000000..4243b9bb
--- /dev/null
+++ b/app/lang/de/errors.php
@@ -0,0 +1,10 @@
+ [
+ 'code' => '404',
+ 'title' => 'Die Seite konnte nicht gefunden werden!',
+ 'message' => 'Entschuldigung, aber die Seite konnte nicht gefunden werden. Überprüfen Sie die URL und versuchen Sie es erneut.',
+ 'link' => 'Zurück zur Startseite',
+ ]
+];
diff --git a/app/lang/de/forms.php b/app/lang/de/forms.php
new file mode 100644
index 00000000..63141c2e
--- /dev/null
+++ b/app/lang/de/forms.php
@@ -0,0 +1,100 @@
+ [
+ 'email' => 'E-Mail-Adresse',
+ 'username' => 'Username',
+ 'password' => 'Passwort',
+ 'site_name' => 'Name der Seite',
+ 'site_domain' => 'Domain der Seite',
+ 'site_timezone' => 'Wählen Sie Ihre Zeitzone',
+ 'site_locale' => 'Wählen Sie Ihre Sprache',
+ 'enable_google2fa' => 'Aktivieren Sie Google Two Factor Authentication',
+ ],
+
+ // Login form fields
+ 'login' => [
+ 'email' => 'Email',
+ 'password' => 'Passwort',
+ '2fauth' => 'Authentifikations-Code',
+ ],
+
+ // Incidents form fields
+ 'incidents' => [
+ 'name' => 'Name',
+ 'status' => 'Status',
+ 'message' => 'Nachricht',
+ 'message-help' => 'Sie können auch Markdown benutzen.',
+
+ 'templates' => [
+ 'name' => 'Name',
+ 'template' => 'Template',
+ ],
+ ],
+
+ // Components form fields
+ 'components' => [
+ 'name' => 'Name',
+ 'status' => 'Status',
+ 'group' => 'Gruppe',
+ 'description' => 'Beschreibung',
+ 'link' => 'Link',
+ 'tags' => 'Tags',
+ 'tags-help' => 'Bitte als Komma-separierte Liste angeben.',
+
+ 'groups' => [
+ 'name' => 'Name',
+ ],
+ ],
+
+ // Settings
+ 'settings' => [
+ /// Application setup
+ 'app-setup' => [
+ 'site-name' => 'Name der Seite',
+ 'site-url' => 'URL der Seite',
+ 'site-timezone' => 'Wählen Sie Ihre Zeitzone',
+ 'site-locale' => 'Wählen Sie Ihre Sprache',
+ 'about-this-page' => 'Über diese Seite',
+ 'days-of-incidents' => 'Wie viele (vergangene) Tage sollen angezeigt werden?',
+ 'banner' => 'Banner-Bild',
+ 'banner-help' => "Wählen Sie möglichst ein Bild mit 930 px Breite.",
+ 'google-analytics' => "Google Analytics Code",
+ ],
+ 'security' => [
+ 'allowed-domains' => 'Erlaubte Domains',
+ 'allowed-domains-help' => 'Komma-Separiert. Die Domain die oben gesetzt ist, ist per Default erlaubt.',
+ ],
+ 'stylesheet' => [
+ 'custom-css' => 'Eigenes Stylesheet',
+ ],
+ 'theme' => [
+ 'background-color' => 'Hintergrund-Farbe',
+ 'text-color' => 'Text-Farbe',
+ ],
+ ],
+
+ 'user' => [
+ 'username' => 'Username',
+ 'email' => 'E-Mail-Adresse',
+ 'password' => 'Passwort',
+ 'api-key' => 'API-Schlüssel',
+ 'api-key-help' => 'Eine Regenerierung Ihres API-Schlüssels verhindert den Zugriff für alle vorhandenen Anwendungen.',
+ '2fa' => [
+ 'help' => 'Zwei-Faktor-Authentifikation erhöht die Sicherheit Ihres Accounts. Sie müssen Google Authenticator, FreeOTP oder andere OTP-Programme installieren. Wenn sie sich anschließend anmelden müssen Sie den in der App angezeigten Code eingeben.',
+ ],
+ ],
+
+ // Buttons
+ 'add' => 'Hinzufügen',
+ 'save' => 'Speichern',
+ 'update' => 'Aktualsieren',
+ 'create' => 'Erstellen',
+ 'edit' => 'Editieren',
+ 'delete' => 'Löschen',
+ 'submit' => 'Speichern',
+ 'cancel' => 'Abbrechen',
+ 'remove' => 'Entfernen'
+];
diff --git a/app/lang/de/pagination.php b/app/lang/de/pagination.php
new file mode 100644
index 00000000..6ed0e30f
--- /dev/null
+++ b/app/lang/de/pagination.php
@@ -0,0 +1,19 @@
+ '« Vorherige',
+ 'next' => 'Nächste »',
+
+];
diff --git a/app/lang/de/reminders.php b/app/lang/de/reminders.php
new file mode 100644
index 00000000..fc7d20bf
--- /dev/null
+++ b/app/lang/de/reminders.php
@@ -0,0 +1,22 @@
+ 'Passwörter müssen mindestens 6 Zeichen lang sein; beide Eingaben müssen übereinstimmen.',
+ 'user' => 'Es wurde kein Benutzer mit dieser E-Mail-Adresse gefunden.',
+ 'token' => 'Dieser Passwort-Reset-Token ist nicht valide.',
+ 'sent' => 'E-Mail zum Rücksetzen des Passworts verschickt!',
+ 'reset' => 'Passwort wurde zurückgesetzt!',
+
+];
diff --git a/app/lang/de/setup.php b/app/lang/de/setup.php
new file mode 100644
index 00000000..9b60680e
--- /dev/null
+++ b/app/lang/de/setup.php
@@ -0,0 +1,13 @@
+ 'Setup',
+ 'title' => 'Setup Cachet',
+ 'service_details' => 'Service Details',
+ 'status_page_setup' => 'Setup der Status-Seite',
+ 'show_support' => 'Möchten Sie Cachet unterstützen? Dies zeigt einen kleinen Text und Link im Footer an.',
+ 'admin_account' => 'Administrator-Account',
+ 'complete_setup' => 'Setup abschließen',
+ 'completed' => 'Cachet wurde erfolgreich eingerichtet!',
+ 'finish_setup' => 'Zum Dashboard',
+];
diff --git a/app/lang/de/validation.php b/app/lang/de/validation.php
new file mode 100644
index 00000000..8c839cf0
--- /dev/null
+++ b/app/lang/de/validation.php
@@ -0,0 +1,106 @@
+ ":attribute muss akzeptiert werden.",
+ "active_url" => ":attribute ist keine valide URL.",
+ "after" => ":attribute muss nach :date liegen.",
+ "alpha" => ":attribute darf nur Buchstaben enthalten.",
+ "alpha_dash" => ":attribute darf nur Nummern, Buchstaben und Slashes enthalten.",
+ "alpha_num" => ":attribute darf nur Nummern und Buchstaben enthalten.",
+ "array" => ":attribute muss ein Array sein.",
+ "before" => ":attribute muss vor :date liegen.",
+ "between" => [
+ "numeric" => ":attribute muss zwichen :min und :max liegen.",
+ "file" => ":attribute muss zwischen :min und :max kilobyte liegen.",
+ "string" => ":attribute muss zwischen :min und :max Zeichen lang sein.",
+ "array" => ":attribute muss zwischen :min und :max Werte enthalten.",
+ ],
+ "boolean" => ":attribute Feld muss 'true' oder 'false' sein.",
+ "confirmed" => "Die Bestätigung/Wiederholung von :attribute stimmt nicht überein.",
+ "date" => ":attribute ist kein valides Datum.",
+ "date_format" => ":attribute passt nicht zu folgendem Format :format.",
+ "different" => ":attribute und :other müssen sich unterscheiden.",
+ "digits" => ":attribute muss :digits Zeichen lang sein.",
+ "digits_between" => ":attribute muss zwischen :min und :max Zeichen lang sein.",
+ "email" => ":attribute muss eine valide E-Mail-Adresse sein.",
+ "exists" => "Das gewählte :attribute ist nicht korrekt.",
+ "image" => ":attribute muss ein Bild sein.",
+ "in" => "Das ausgewählte :attribute ist nicht korrekt.",
+ "integer" => ":attribute muss eine Zahl sein.",
+ "ip" => ":attribute muss eine valide IP sein.", # IPv4?
+ "max" => [
+ "numeric" => ":attribute darf nicht größer als :max sein.",
+ "file" => ":attribute darf nicht größer als :max kilobyte sein.",
+ "string" => ":attribute darf nicht mehr als :max Zeichen lang sein.",
+ "array" => ":attribute darf nicht mehr als :max Werte enthalten.",
+ ],
+ "mimes" => ":attribute muss eine Datei vom Typ :values sein.",
+ "min" => [
+ "numeric" => ":attribute muss mindestens :min sein.",
+ "file" => ":attribute muss mindestens :min kilobyte groß sein.",
+ "string" => ":attribute muss mindestens :min Zeichen lang sein.",
+ "array" => ":attribute muss mindestens :min Werte enthalten.",
+ ],
+ "not_in" => "Das ausgewählte :attribute ist nicht korrekt.",
+ "numeric" => ":attribute muss eine Nummer sein.",
+ "regex" => "Das Format von :attribute ist nicht korrekt.",
+ "required" => ":attribute wird benötigt.",
+ "required_if" => ":attribute wird benötigt wenn :other den Wert :value hat.",
+ "required_with" => ":attribute ist erforderlich wenn :values vorhanden ist.",
+ "required_with_all" => ":attribute ist erforderlich wenn :values vorhanden ist.",
+ "required_without" => ":attribute ist erforderlich wenn :values nicht vorhanden ist.",
+ "required_without_all" => ":attribute ist erforderlich wenn keines der Werte :values vorhanden sind.",
+ "same" => ":attribute und :other müssen übereinstimmen.",
+ "size" => [
+ "numeric" => ":attribute muss :size sein.",
+ "file" => ":attribute muss :size kilobyte groß sein.",
+ "string" => ":attribute muss :size Zeichen lang sein.",
+ "array" => ":attribute muss :size Werte enthalten.",
+ ],
+ "unique" => ":attribute wurde beirets gewählt.",
+ "url" => "Das Format von :attribute ist nicht korrekt.",
+ "timezone" => ":attribute muss eine valide Zeitzone sein.",
+
+ /*
+ |--------------------------------------------------------------------------
+ | Custom Validation Language Lines
+ |--------------------------------------------------------------------------
+ |
+ | Here you may specify custom validation messages for attributes using the
+ | convention "attribute.rule" to name the lines. This makes it quick to
+ | specify a specific custom language line for a given attribute rule.
+ |
+ */
+
+ 'custom' => [
+ 'attribute-name' => [
+ 'rule-name' => 'custom-message',
+ ],
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Custom Validation Attributes
+ |--------------------------------------------------------------------------
+ |
+ | The following language lines are used to swap attribute place-holders
+ | with something more reader friendly such as E-Mail Address instead
+ | of "email". This simply helps us make messages a little cleaner.
+ |
+ */
+
+ 'attributes' => [],
+
+];