diff --git a/uffd/default_config.cfg b/uffd/default_config.cfg
index 6a27760bb0c7fdc390f5c5b04e8fa89068bf2373..e7ee0d6276b569c79c4b56e3697d053e6ec42cbd 100644
--- a/uffd/default_config.cfg
+++ b/uffd/default_config.cfg
@@ -95,6 +95,7 @@ OAUTH2_CLIENTS={
 	# You can optionally restrict access to users with a certain group. Set 'required_group' to the name of an LDAP group name or a list of groups.
 	# ... 'required_group': 'test_access_group' ... only allows users with group "test_access_group" access
 	# ... 'required_group': ['groupa', ['groupb', 'groupc']] ... allows users with group "groupa" as well as users with both "groupb" and "groupc" access
+	# Set 'login_message' (or suffixed with a language code like 'login_message_de') to display a custom message on the login form.
 }
 
 API_CLIENTS={
diff --git a/uffd/oauth2/models.py b/uffd/oauth2/models.py
index 450edd9aadf0a183f17b97a4ce2e4e581cd0f762..5e27c5d78138952d30c2ac3adc7bdfe837c93d40 100644
--- a/uffd/oauth2/models.py
+++ b/uffd/oauth2/models.py
@@ -1,4 +1,5 @@
 from flask import current_app
+from flask_babel import get_locale, gettext as _
 from sqlalchemy import Column, Integer, String, DateTime, Text
 
 from uffd.ldapalchemy.dbutils import DBRelationship
@@ -7,7 +8,7 @@ from uffd.user.models import User
 from uffd.session.models import DeviceLoginInitiation, DeviceLoginType
 
 class OAuth2Client:
-	def __init__(self, client_id, client_secret, redirect_uris, required_group=None, logout_urls=None):
+	def __init__(self, client_id, client_secret, redirect_uris, required_group=None, logout_urls=None, **kwargs):
 		self.client_id = client_id
 		self.client_secret = client_secret
 		# We only support the Authorization Code Flow for confidential (server-side) clients
@@ -21,6 +22,12 @@ class OAuth2Client:
 				self.logout_urls.append(['GET', url])
 			else:
 				self.logout_urls.append(url)
+		self.kwargs = kwargs
+
+	@property
+	def login_message(self):
+		return self.kwargs.get('login_message_' + get_locale().language,
+		                       self.kwargs.pop('login_message', _('You need to login to access this service')))
 
 	@classmethod
 	def from_id(cls, client_id):
diff --git a/uffd/oauth2/views.py b/uffd/oauth2/views.py
index cb8037c957d823dc4948da540771467215ef7ca6..898d3d9be15130a4bee49a709e20cc82d62855cf 100644
--- a/uffd/oauth2/views.py
+++ b/uffd/oauth2/views.py
@@ -164,12 +164,13 @@ def authorize():
 		del session['devicelogin_secret']
 		del session['devicelogin_confirmation']
 		if not initiation or initiation.expired or not confirmation:
-			flash('Device login failed')
+			flash(_('Device login failed'))
 			return redirect(url_for('session.login', ref=request.full_path, devicelogin=True))
 		credentials['user'] = confirmation.user
 		db.session.delete(initiation)
 		db.session.commit()
 	else:
+		flash(client.login_message)
 		return redirect(url_for('session.login', ref=request.full_path, devicelogin=True))
 
 	# Here we would normally ask the user, if he wants to give the requesting
diff --git a/uffd/translations/de/LC_MESSAGES/messages.mo b/uffd/translations/de/LC_MESSAGES/messages.mo
index e58966921aed2726349395182b5de736f144f297..8732d8a30f74045b143df675da5ec4687b98356f 100644
Binary files a/uffd/translations/de/LC_MESSAGES/messages.mo and b/uffd/translations/de/LC_MESSAGES/messages.mo differ
diff --git a/uffd/translations/de/LC_MESSAGES/messages.po b/uffd/translations/de/LC_MESSAGES/messages.po
index bae852ddaffca378b3c2dd4a5f706f31bdc68363..89805c8fcbe12c13ec3e510b2da4d456802b979e 100644
--- a/uffd/translations/de/LC_MESSAGES/messages.po
+++ b/uffd/translations/de/LC_MESSAGES/messages.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PROJECT VERSION\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2021-08-30 23:22+0200\n"
+"POT-Creation-Date: 2021-09-04 21:18+0200\n"
 "PO-Revision-Date: 2021-05-25 21:18+0200\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language: de\n"
@@ -700,8 +700,12 @@ msgstr "Sekunden"
 msgid "Verify and complete setup"
 msgstr "Verifiziere und beende das Setup"
 
-#: uffd/oauth2/views.py:95 uffd/selfservice/views.py:76
-#: uffd/session/views.py:93
+#: uffd/oauth2/models.py:30
+msgid "You need to login to access this service"
+msgstr "Du musst dich anmelden, um auf diesen Dienst zugreifen zu können"
+
+#: uffd/oauth2/views.py:146 uffd/selfservice/views.py:76
+#: uffd/session/views.py:95
 #, python-format
 msgid ""
 "We received too many requests from your ip address/network! Please wait "
@@ -710,10 +714,14 @@ msgstr ""
 "Wir haben zu viele Anfragen von deiner IP-Adresses bzw. aus deinem "
 "Netzwerk empfangen! Bitte warte mindestens %(delay)s."
 
-#: uffd/oauth2/views.py:103
+#: uffd/oauth2/views.py:154
 msgid "Device login is currently not available. Try again later!"
 msgstr "Geräte-Login ist gerade nicht verfügbar. Versuche es später nochmal!"
 
+#: uffd/oauth2/views.py:167
+msgid "Device login failed"
+msgstr "Gerätelogin fehlgeschlagen"
+
 #: uffd/oauth2/templates/oauth2/logout.html:10 uffd/templates/base.html:99
 msgid "Logout"
 msgstr "Abmelden"
@@ -757,7 +765,7 @@ msgstr ""
 "versuchen?"
 
 #: uffd/role/views.py:44 uffd/rolemod/views.py:36 uffd/rolemod/views.py:45
-#: uffd/rolemod/views.py:60 uffd/session/views.py:130
+#: uffd/rolemod/views.py:60 uffd/session/views.py:132
 #: uffd/user/views_group.py:14 uffd/user/views_user.py:25
 msgid "Access denied"
 msgstr "Zugriff verweigert"
@@ -1163,7 +1171,7 @@ msgstr "Kein Zugriff"
 msgid "Close"
 msgstr "Schließen"
 
-#: uffd/session/views.py:91
+#: uffd/session/views.py:93
 #, python-format
 msgid ""
 "We received too many invalid login attempts for this user! Please wait at"
@@ -1172,27 +1180,27 @@ msgstr ""
 "Wir haben zu viele fehlgeschlagene Anmeldeversuche für diesen Account "
 "erhalten! Bitte warte mindestens %(delay)s."
 
-#: uffd/session/views.py:99
+#: uffd/session/views.py:101
 msgid "Login name or password is wrong"
 msgstr "Der Anmeldename oder das Passwort ist falsch"
 
-#: uffd/session/views.py:102
+#: uffd/session/views.py:104
 msgid "You do not have access to this service"
 msgstr "Du hast keinen Zugriff auf diesen Service"
 
-#: uffd/session/views.py:114 uffd/session/views.py:125
+#: uffd/session/views.py:116 uffd/session/views.py:127
 msgid "You need to login first"
 msgstr "Du musst dich erst anmelden"
 
-#: uffd/session/views.py:147 uffd/session/views.py:157
+#: uffd/session/views.py:149 uffd/session/views.py:159
 msgid "Initiation code is no longer valid"
 msgstr "Startcode ist nicht mehr gültig"
 
-#: uffd/session/views.py:161
+#: uffd/session/views.py:163
 msgid "Invalid confirmation code"
 msgstr "Ungültiger Bestätigungscode"
 
-#: uffd/session/views.py:173 uffd/session/views.py:184
+#: uffd/session/views.py:175 uffd/session/views.py:186
 msgid "Invalid initiation code"
 msgstr "Ungültiger Startcode"