diff --git a/xwiki-platform-core/xwiki-platform-flamingo/xwiki-platform-flamingo-skin/xwiki-platform-flamingo-skin-resources/src/main/resources/flamingo/htmlheader.vm b/xwiki-platform-core/xwiki-platform-flamingo/xwiki-platform-flamingo-skin/xwiki-platform-flamingo-skin-resources/src/main/resources/flamingo/htmlheader.vm
index 09dab5797bf0..32041f990596 100644
--- a/xwiki-platform-core/xwiki-platform-flamingo/xwiki-platform-flamingo-skin/xwiki-platform-flamingo-skin-resources/src/main/resources/flamingo/htmlheader.vm
+++ b/xwiki-platform-core/xwiki-platform-flamingo/xwiki-platform-flamingo-skin/xwiki-platform-flamingo-skin-resources/src/main/resources/flamingo/htmlheader.vm
@@ -129,7 +129,30 @@
#if($xcontext.action == "admin" || $xcontext.action == "import" || $xcontext.action == "export")
#set($bodyAction = "view")
#end
+## Query user preferences for UI customization
+## Get the legacy preference for backward compatibility
+#set ($a11y = "$!{xwiki.getUserPreference('accessibility')}")
+#set ($underlining = "$!{xwiki.getUserPreference('underline')}")
+## Underlining of links
+## This preference will take the values: preference-underlining-yes, preference-underlining-only-inline-links and
+## preference-underlining-no
+#set ($preferenceUnderlining = "preference-underlining-")
+#if ($underlining == 'Yes' || $a11y == '1')
+ #set ($preferenceUnderlining = $preferenceUnderlining + "yes")
+#elseif($underlining == 'No')
+ ## The legacy a11y preference is never ON when reaching here
+ #set ($preferenceUnderlining = $preferenceUnderlining + "no")
+#else
+ ## The default value `OnlyInlineLinks` has the same behavior as the fallback
+ #set ($preferenceUnderlining = $preferenceUnderlining + "only-inline-links")
+#end
## These elements will be closed in the htmlfooter.vm file
-<$bodyTagName id="body" class="skin-flamingo wiki-${xcontext.database} #if("$!doc.space" != "")space-${escapetool.xml($doc.space.replaceAll(' ', '_'))}#end ${bodyAction}body #if($showLeftPanels == "0")hideleft#end#if($showRightPanels == "0")hideright#end#if($hidecolumns && ($!hidecolumns == 1))hidelefthideright#end #if($showLeftPanels != "0" && $showRightPanels != "0" && $!hidecolumns != 1)content#end panel-left-width-${leftPanelsWidth} panel-right-width-${rightPanelsWidth} drawer drawer--right">
+## We put a space before each class added in #if, to avoid losing them because of velocity line stripping
+<$bodyTagName id="body" class="skin-flamingo wiki-${xcontext.database} ${bodyAction}body panel-left-width-${leftPanelsWidth} panel-right-width-${rightPanelsWidth} drawer drawer--right ${preferenceUnderlining}
+ #if("$!doc.space" != "") space-${escapetool.xml($doc.space.replaceAll(' ', '_'))}#end
+ #if($showLeftPanels == "0") hideleft#end
+ #if($showRightPanels == "0") hideright#end
+ #if($hidecolumns && ($!hidecolumns == 1)) hidelefthideright#end
+ #if($showLeftPanels != "0" && $showRightPanels != "0" && $!hidecolumns != 1) content#end">
diff --git a/xwiki-platform-core/xwiki-platform-flamingo/xwiki-platform-flamingo-skin/xwiki-platform-flamingo-skin-resources/src/main/resources/flamingo/less/general.less b/xwiki-platform-core/xwiki-platform-flamingo/xwiki-platform-flamingo-skin/xwiki-platform-flamingo-skin-resources/src/main/resources/flamingo/less/general.less
index fbf17a1eeee5..a4cb24d114e5 100644
--- a/xwiki-platform-core/xwiki-platform-flamingo/xwiki-platform-flamingo-skin/xwiki-platform-flamingo-skin-resources/src/main/resources/flamingo/less/general.less
+++ b/xwiki-platform-core/xwiki-platform-flamingo/xwiki-platform-flamingo-skin/xwiki-platform-flamingo-skin-resources/src/main/resources/flamingo/less/general.less
@@ -131,4 +131,64 @@ img {
-moz-hyphens: auto;
-webkit-hyphens: auto;
hyphens: auto;
+}
+
+// User preferences ===========================================================
+body.content {
+ /* We apply various user preference related styles to the content of the page.
+ We use classes that are added to the body itself in htmlheader.vm */
+ // Link underlining preference
+ &.preference-underlining-yes {
+ a {
+ text-decoration: underline;
+ }
+ }
+
+ &.preference-underlining-only-inline-links {
+ // Main rule for the content
+ #xwikicontent a {
+ text-decoration: underline;
+ }
+
+ // UIs where we want to underline outside of content.
+ .xdocLastModification,
+ .panel.HelpTipsPanel,
+ .commentauthor {
+ & a {
+ text-decoration: underline;
+ }
+ }
+
+ /* UIs in content where we want to not underline by default.
+ Those elements usually contain only links that are not inline (and a lot of links). */
+ #xwikicontent {
+ &.xwiki-livetable-container,
+ &.xtree,
+ &.xwikitabbar,
+ &.buttonwrapper {
+ & a {
+ text-decoration: none;
+ // Make sure we don't take over the default behaviour on hover with too much specificity.
+ &:hover, &:focus {
+ text-decoration: underline
+ }
+ }
+ }
+ }
+
+ // Helper classes for easier content customization. Note that those only work for this preference.
+ #xwikicontent .force-no-underline a {
+ text-decoration: none;
+ }
+
+ .force-underline a {
+ text-decoration: underline;
+ }
+ }
+
+ &.preference-underlining-no {
+ a {
+ text-decoration: none;
+ }
+ }
}
\ No newline at end of file
diff --git a/xwiki-platform-core/xwiki-platform-oldcore/src/main/java/com/xpn/xwiki/internal/mandatory/XWikiUsersDocumentInitializer.java b/xwiki-platform-core/xwiki-platform-oldcore/src/main/java/com/xpn/xwiki/internal/mandatory/XWikiUsersDocumentInitializer.java
index 39875ebc7ebb..5a077b9ebaae 100644
--- a/xwiki-platform-core/xwiki-platform-oldcore/src/main/java/com/xpn/xwiki/internal/mandatory/XWikiUsersDocumentInitializer.java
+++ b/xwiki-platform-core/xwiki-platform-oldcore/src/main/java/com/xpn/xwiki/internal/mandatory/XWikiUsersDocumentInitializer.java
@@ -101,7 +101,7 @@ protected void createClass(BaseClass xclass)
xclass.addTextField("imaccount", "imaccount", 30);
xclass.addStaticListField("editor", "Default Editor", "Text|Wysiwyg");
xclass.addStaticListField("usertype", "User type", "Simple|Advanced", "Simple");
- xclass.addBooleanField("accessibility", "Enable extra accessibility features", "yesno");
+ xclass.addStaticListField("underline", "Underline links", "OnlyInlineLinks|Yes|No", "OnlyInlineLinks");
xclass.addBooleanField("displayHiddenDocuments", "Display Hidden Documents", "yesno");
xclass.addTimezoneField(TIMEZONE_FIELD, "Time Zone", 30);
diff --git a/xwiki-platform-core/xwiki-platform-oldcore/src/main/resources/ApplicationResources.properties b/xwiki-platform-core/xwiki-platform-oldcore/src/main/resources/ApplicationResources.properties
index 8f8d4ddfca53..5a1a9e2f5803 100644
--- a/xwiki-platform-core/xwiki-platform-oldcore/src/main/resources/ApplicationResources.properties
+++ b/xwiki-platform-core/xwiki-platform-oldcore/src/main/resources/ApplicationResources.properties
@@ -702,10 +702,10 @@ platform.core.profile.phone=Phone
platform.core.profile.address=Address
platform.core.profile.editor=Default editor to use
platform.core.profile.userType=User Type
-platform.core.profile.enableAccessibility=Enable extra accessibility features
platform.core.profile.displayHiddenDocuments=Display hidden pages
platform.core.profile.timezone=Timezone
platform.core.profile.extensionConflictSetup=Enable extension conflict setup
+platform.core.profile.accessibility.underline=Underline links
platform.core.profile.category.settings=Settings
platform.core.profile.category.profile=Profile
@@ -728,6 +728,7 @@ platform.core.profile.section.sendMessage=Send Message
platform.core.profile.section.activity=My Activity Stream
platform.core.profile.section.activityof=Activity stream of {0}
platform.core.profile.section.displayPreferences=Display Preferences
+platform.core.profile.section.accessibilityPreferences=Accessibility preferences
platform.core.profile.section.localizationPreferences=Localization Preferences
platform.core.profile.section.editorPreferences=Editor Preferences
platform.core.profile.section.extensionPreferences=Extensions Preferences
@@ -3456,6 +3457,10 @@ XWiki.XWikiUsers_usertype_Advanced=Advanced
XWiki.XWikiUsers_phone=Phone
XWiki.XWikiUsers_address=Address
XWiki.XWikiUsers_extensionConflictSetup=Enable extension conflict setup
+XWiki.XWikiUsers_underline=Underline links
+XWiki.XWikiUsers_underline_Yes=Yes
+XWiki.XWikiUsers_underline_OnlyInlineLinks=Only Inline Links
+XWiki.XWikiUsers_underline_No=No
### XWiki.XWikiSkins (core)
XWiki.XWikiSkins_name=Name
@@ -5638,6 +5643,7 @@ core.viewers.diff.previousChange=Previous change
## until 16.3.0RC1
#######################################
xe.admin.passwordReset.step2.error.wrongParameters=Wrong parameters! Another link was already sent or this one was already accessed!
+platform.core.profile.enableAccessibility=Enable extra accessibility features
## Used to indicate where deprecated keys end
#@deprecatedend
diff --git a/xwiki-platform-core/xwiki-platform-user/xwiki-platform-user-profile/xwiki-platform-user-profile-ui/src/main/resources/XWiki/UserProfileTranslations.xml b/xwiki-platform-core/xwiki-platform-user/xwiki-platform-user-profile/xwiki-platform-user-profile-ui/src/main/resources/XWiki/UserProfileTranslations.xml
index 67a20d33f6cc..6d3c617a4b6c 100644
--- a/xwiki-platform-core/xwiki-platform-user/xwiki-platform-user-profile/xwiki-platform-user-profile-ui/src/main/resources/XWiki/UserProfileTranslations.xml
+++ b/xwiki-platform-core/xwiki-platform-user/xwiki-platform-user-profile/xwiki-platform-user-profile-ui/src/main/resources/XWiki/UserProfileTranslations.xml
@@ -37,7 +37,7 @@
plain/1.0trueXWiki.XWikiUsers_displayHiddenDocuments.hint=The wiki contains documents that are not displayed by default. These hidden documents represent technical content, like application classes, configuration pages, macros, styles, scripts, etc.
-XWiki.XWikiUsers_accessibility.hint=Extra accessibility will enable various visual enhancements like: bigger fonts, underlined links, etc.
+XWiki.XWikiUsers_underline.hint=Choose if links should be underlined.
XWiki.XWikiUsers_timezone.hint=Use a specific timezone so that the dates reflect your current location.
XWiki.XWikiUsers_editor.hint=Choose what editor will be the default one, overriding the default editor set globally. If not defined, a default editor is chosen, depending on what is being edited.
XWiki.XWikiUsers_usertype.hint=Choose what type of user will be the default one. Advanced users will have access to multiple editing features, terminal page creation, etc.
@@ -60,7 +60,16 @@ user.profile.network.saving=Saving...
user.profile.network.error=Error saving the notification setting
user.profile.status.done=Done
user.profile.status.saving=Saving...
-user.profile.status.error=Error saving the user status
+user.profile.status.error=Error saving the user status
+
+## Used to indicate where deprecated keys start
+#@deprecatedstart
+
+## Deprecated since 16.3.0RC1
+XWiki.XWikiUsers_accessibility.hint=Extra accessibility will enable various visual enhancements like: bigger fonts, underlined links, etc.
+
+## Used to indicate where deprecated keys end
+#@deprecatedend