Index: src/org/openstreetmap/josm/gui/MainFrame.java
===================================================================
--- src/org/openstreetmap/josm/gui/MainFrame.java	(revision 15713)
+++ src/org/openstreetmap/josm/gui/MainFrame.java	(working copy)
@@ -20,6 +20,7 @@
 import javax.swing.JFrame;
 import javax.swing.JPanel;
 
+import org.openstreetmap.josm.data.UserIdentityManager;
 import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
 import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
 import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
@@ -28,6 +29,7 @@
 import org.openstreetmap.josm.gui.layer.OsmDataLayer.LayerStateChangeListener;
 import org.openstreetmap.josm.gui.util.WindowGeometry;
 import org.openstreetmap.josm.spi.preferences.Config;
+import org.openstreetmap.josm.spi.preferences.PreferenceChangedListener;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Logging;
 
@@ -47,6 +49,12 @@
         }
     };
 
+    private final transient PreferenceChangedListener updateTitleUserChange = evt -> {
+        if ("osm-server.username".equals(evt.getKey()) || "draw.show-user".equals(evt.getKey())) {
+            refreshTitle();
+        }
+    };
+
     protected transient WindowGeometry geometry;
     protected int windowState = JFrame.NORMAL;
     private final MainPanel panel;
@@ -102,6 +110,7 @@
         // This listener is never removed, since the main frame exists forever.
         MainApplication.getLayerManager().addActiveLayerChangeListener(e -> refreshTitle());
         MainApplication.getLayerManager().addAndFireLayerChangeListener(new ManageLayerListeners());
+        Config.getPref().addPreferenceChangeListener(updateTitleUserChange);
 
         refreshTitle();
 
@@ -165,7 +174,12 @@
         OsmDataLayer editLayer = MainApplication.getLayerManager().getEditLayer();
         boolean dirty = editLayer != null && (editLayer.requiresSaveToFile()
                 || (editLayer.requiresUploadToServer() && !editLayer.isUploadDiscouraged()));
-        setTitle((dirty ? "* " : "") + tr("Java OpenStreetMap Editor"));
+        String user = UserIdentityManager.getInstance().getUserName();
+        if (user != null && Config.getPref().getBoolean("draw.show-user", false))
+            user = tr(" ({0})", "@"  + user);
+        else
+            user = "";
+        setTitle((dirty ? "* " : "") + tr("Java OpenStreetMap Editor") + user);
         getRootPane().putClientProperty("Window.documentModified", dirty);
     }
 
Index: src/org/openstreetmap/josm/gui/preferences/display/LafPreference.java
===================================================================
--- src/org/openstreetmap/josm/gui/preferences/display/LafPreference.java	(revision 15713)
+++ src/org/openstreetmap/josm/gui/preferences/display/LafPreference.java	(working copy)
@@ -80,6 +80,7 @@
     private JosmComboBox<LookAndFeelInfo> lafCombo;
     VerticallyScrollablePanel panel;
     private final JCheckBox showSplashScreen = new JCheckBox(tr("Show splash screen at startup"));
+    private final JCheckBox showUser = new JCheckBox(tr("Show user name in title"));
     private final JCheckBox showID = new JCheckBox(tr("Show object ID in selection lists"));
     private final JCheckBox showVersion = new JCheckBox(tr("Show object version in selection lists"));
     private final JCheckBox showCoor = new JCheckBox(tr("Show node coordinates in selection lists"));
@@ -129,6 +130,10 @@
         showSplashScreen.setSelected(Config.getPref().getBoolean("draw.splashscreen", true));
         panel.add(showSplashScreen, GBC.eop().insets(20, 0, 0, 0));
 
+        // Show user name in title
+        showUser.setToolTipText(tr("Show user name in title"));
+        showUser.setSelected(Config.getPref().getBoolean("draw.show-user", false));
+
         // Show ID in selection
         showID.setToolTipText(tr("Show object ID in selection lists"));
         showID.setSelected(Config.getPref().getBoolean("osm-primitives.showid", false));
@@ -150,6 +155,7 @@
         modeless.setSelected(MapFrame.MODELESS.get());
         ExpertToggleAction.addVisibilitySwitcher(modeless);
 
+        panel.add(showUser, GBC.eop().insets(20, 0, 0, 0));
         panel.add(showID, GBC.eop().insets(20, 0, 0, 0));
         panel.add(showVersion, GBC.eop().insets(20, 0, 0, 0));
         panel.add(showCoor, GBC.eop().insets(20, 0, 0, 0));
@@ -215,6 +221,7 @@
     public boolean ok() {
         boolean mod = false;
         Config.getPref().putBoolean("draw.splashscreen", showSplashScreen.isSelected());
+        Config.getPref().putBoolean("draw.show-user", showUser.isSelected());
         Config.getPref().putBoolean("osm-primitives.showid", showID.isSelected());
         Config.getPref().putBoolean("osm-primitives.showversion", showVersion.isSelected());
         Config.getPref().putBoolean("osm-primitives.showcoor", showCoor.isSelected());
