Index: trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManager.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManager.java	(revision 12494)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManager.java	(revision 12495)
@@ -635,17 +635,12 @@
         public void actionPerformed(ActionEvent e) {
             Window parent = GuiHelper.getWindowAncestorFor(e);
-            JosmUserIdentityManager im = JosmUserIdentityManager.getInstance();
-            if (im.isAnonymous()) {
+            try {
+                ChangesetQuery query = ChangesetQuery.forCurrentUser();
+                if (!GraphicsEnvironment.isHeadless()) {
+                    ChangesetCacheManager.getInstance().runDownloadTask(new ChangesetQueryTask(parent, query));
+                }
+            } catch (IllegalStateException ex) {
                 alertAnonymousUser(parent);
-                return;
-            }
-            ChangesetQuery query = new ChangesetQuery();
-            if (im.isFullyIdentified()) {
-                query = query.forUser(im.getUserId());
-            } else {
-                query = query.forUser(im.getUserName());
-            }
-            if (!GraphicsEnvironment.isHeadless()) {
-                ChangesetCacheManager.getInstance().runDownloadTask(new ChangesetQueryTask(parent, query));
+                Main.trace(ex);
             }
         }
@@ -695,4 +690,13 @@
 
     /**
+     * Returns the changeset cache model.
+     * @return the changeset cache model
+     * @since 12495
+     */
+    public ChangesetCacheManagerModel getModel() {
+        return model;
+    }
+
+    /**
      * Selects the changesets  in <code>changests</code>, provided the
      * respective changesets are already present in the local changeset cache.
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManagerModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManagerModel.java	(revision 12494)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManagerModel.java	(revision 12495)
@@ -139,5 +139,5 @@
 
     @Override
-    public Object getValueAt(int row, int column) {
+    public Changeset getValueAt(int row, int column) {
         return data.get(row);
     }
Index: trunk/src/org/openstreetmap/josm/gui/download/BookmarkList.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/download/BookmarkList.java	(revision 12494)
+++ trunk/src/org/openstreetmap/josm/gui/download/BookmarkList.java	(revision 12495)
@@ -5,8 +5,10 @@
 
 import java.awt.Component;
+import java.awt.GraphicsEnvironment;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.LinkedList;
 import java.util.List;
@@ -15,4 +17,5 @@
 
 import javax.swing.DefaultListModel;
+import javax.swing.ImageIcon;
 import javax.swing.JLabel;
 import javax.swing.JList;
@@ -21,6 +24,20 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.downloadtasks.ChangesetQueryTask;
 import org.openstreetmap.josm.data.Bounds;
+import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.osm.Changeset;
+import org.openstreetmap.josm.data.osm.UserInfo;
+import org.openstreetmap.josm.data.preferences.IntegerProperty;
+import org.openstreetmap.josm.data.projection.Projection;
+import org.openstreetmap.josm.data.projection.Projections;
+import org.openstreetmap.josm.gui.JosmUserIdentityManager;
+import org.openstreetmap.josm.gui.MapViewState;
+import org.openstreetmap.josm.gui.dialogs.changeset.ChangesetCacheManager;
+import org.openstreetmap.josm.gui.mappaint.mapcss.Selector;
+import org.openstreetmap.josm.gui.util.GuiHelper;
+import org.openstreetmap.josm.io.ChangesetQuery;
 import org.openstreetmap.josm.tools.ImageProvider;
+import org.openstreetmap.josm.tools.ImageProvider.ImageSizes;
 
 /**
@@ -31,4 +48,10 @@
 
     /**
+     * The maximum number of changeset bookmarks to maintain in list.
+     * @since 12495
+     */
+    public static final IntegerProperty MAX_CHANGESET_BOOKMARKS = new IntegerProperty("bookmarks.changesets.max-entries", 15);
+
+    /**
      * Class holding one bookmarkentry.
      */
@@ -36,4 +59,5 @@
         private String name;
         private Bounds area;
+        private ImageIcon icon;
 
         /**
@@ -48,4 +72,5 @@
             if (array.size() < 5)
                 throw new IllegalArgumentException(tr("Wrong number of arguments for bookmark"));
+            icon = ImageProvider.get("dialogs", "bookmark");
             name = array.get(0);
             area = new Bounds(Double.parseDouble(array.get(1)), Double.parseDouble(array.get(2)),
@@ -57,6 +82,5 @@
          */
         public Bookmark() {
-            area = null;
-            name = null;
+            this(null, null);
         }
 
@@ -66,8 +90,21 @@
          */
         public Bookmark(Bounds area) {
+            this(null, area);
+        }
+
+        /**
+         * Constructs a new {@code Bookmark} for the given name and area.
+         * @param name The bookmark name
+         * @param area The bookmark area
+         * @since 12495
+         */
+        protected Bookmark(String name, Bounds area) {
+            this.icon = ImageProvider.get("dialogs", "bookmark");
+            this.name = name;
             this.area = area;
         }
 
-        @Override public String toString() {
+        @Override
+        public String toString() {
             return name;
         }
@@ -89,5 +126,5 @@
             Bookmark bookmark = (Bookmark) obj;
             return Objects.equals(name, bookmark.name) &&
-                    Objects.equals(area, bookmark.area);
+                   Objects.equals(area, bookmark.area);
         }
 
@@ -122,4 +159,73 @@
         public void setArea(Bounds area) {
             this.area = area;
+        }
+
+        /**
+         * Returns the bookmark icon.
+         * @return the bookmark icon
+         * @since 12495
+         */
+        public ImageIcon getIcon() {
+            return icon;
+        }
+
+        /**
+         * Sets the bookmark icon.
+         * @param icon the bookmark icon
+         * @since 12495
+         */
+        public void setIcon(ImageIcon icon) {
+            this.icon = icon;
+        }
+    }
+
+    /**
+     * A specific optional bookmark for the "home location" configured on osm.org website.
+     * @since 12495
+     */
+    public static class HomeLocationBookmark extends Bookmark {
+        /**
+         * Constructs a new {@code HomeLocationBookmark}.
+         */
+        public HomeLocationBookmark() {
+            setName(tr("Home location"));
+            setIcon(ImageProvider.get("help", "home", ImageSizes.SMALLICON));
+            UserInfo info = JosmUserIdentityManager.getInstance().getUserInfo();
+            if (info == null) {
+                throw new IllegalStateException("User not identified");
+            }
+            LatLon home = info.getHome();
+            if (home == null) {
+                throw new IllegalStateException("User home location not set");
+            }
+            int zoom = info.getHomeZoom();
+            if (zoom <= 3) {
+                // 3 is the default zoom level in OSM database, but the real zoom level was not correct
+                // for a long time, see https://github.com/openstreetmap/openstreetmap-website/issues/1592
+                zoom = 12;
+            }
+            Projection mercator = Projections.getProjectionByCode("EPSG:3857");
+            setArea(MapViewState.createDefaultState(430, 400) // Size of map on osm.org user profile settings
+                    .usingProjection(mercator)
+                    .usingScale(Selector.GeneralSelector.level2scale(zoom) / 100)
+                    .usingCenter(mercator.latlon2eastNorth(home))
+                    .getViewArea()
+                    .getLatLonBoundsBox());
+        }
+    }
+
+    /**
+     * A specific optional bookmark for the boundaries of recent changesets.
+     * @since 12495
+     */
+    public static class ChangesetBookmark extends Bookmark {
+        /**
+         * Constructs a new {@code ChangesetBookmark}.
+         * @param cs changeset
+         */
+        public ChangesetBookmark(Changeset cs) {
+            setName(String.format("%d - %tF - %s", cs.getId(), cs.getCreatedAt(), cs.getComment()));
+            setIcon(ImageProvider.get("data", "changeset", ImageSizes.SMALLICON));
+            setArea(cs.getBounds());
         }
     }
@@ -136,9 +242,22 @@
 
     /**
-     * Loads the bookmarks from file.
+     * Loads the home location bookmark from OSM API,
+     *       the manual bookmarks from preferences file,
+     *       the changeset bookmarks from changeset cache.
      */
     public final void load() {
-        DefaultListModel<Bookmark> model = (DefaultListModel<Bookmark>) getModel();
+        final DefaultListModel<Bookmark> model = (DefaultListModel<Bookmark>) getModel();
         model.removeAllElements();
+        JosmUserIdentityManager im = JosmUserIdentityManager.getInstance();
+        // Add home location bookmark first, if user fully identified
+        if (im.isFullyIdentified()) {
+            try {
+                model.addElement(new HomeLocationBookmark());
+            } catch (IllegalStateException e) {
+                Main.info(e.getMessage());
+                Main.trace(e);
+            }
+        }
+        // Then add manual bookmarks previously saved in local preferences
         Collection<Collection<String>> args = Main.pref.getArray("bookmarks", null);
         if (args != null) {
@@ -156,12 +275,29 @@
             }
         }
-    }
-
-    /**
-     * Saves all bookmarks to the preferences file
+        // Finally add recent changeset bookmarks, if user name is known
+        final int n = MAX_CHANGESET_BOOKMARKS.get();
+        if (n > 0 && !im.isAnonymous()) {
+            final ChangesetCacheManager ccm = ChangesetCacheManager.getInstance();
+            final int userId = im.getUserInfo().getId();
+            int found = 0;
+            for (int i = 0; i < ccm.getModel().getRowCount() && found < n; i++) {
+                Changeset cs = ccm.getModel().getValueAt(i, 0);
+                if (cs.getUser().getId() == userId && cs.getBounds() != null) {
+                    model.addElement(new ChangesetBookmark(cs));
+                    found++;
+                }
+            }
+        }
+    }
+
+    /**
+     * Saves all manual bookmarks to the preferences file.
      */
     public final void save() {
         List<Collection<String>> coll = new LinkedList<>();
         for (Object o : ((DefaultListModel<Bookmark>) getModel()).toArray()) {
+            if (o instanceof HomeLocationBookmark || o instanceof ChangesetBookmark) {
+                continue;
+            }
             String[] array = new String[5];
             Bookmark b = (Bookmark) o;
@@ -177,4 +313,34 @@
     }
 
+    /**
+     * Refreshes the changeset bookmarks.
+     * @since 12495
+     */
+    public void refreshChangesetBookmarks() {
+        final int n = MAX_CHANGESET_BOOKMARKS.get();
+        if (n > 0) {
+            final DefaultListModel<Bookmark> model = (DefaultListModel<Bookmark>) getModel();
+            for (int i = model.getSize() - 1; i >= 0; i--) {
+                if (model.get(i) instanceof ChangesetBookmark) {
+                    model.remove(i);
+                }
+            }
+            ChangesetQuery query = ChangesetQuery.forCurrentUser();
+            if (!GraphicsEnvironment.isHeadless()) {
+                final ChangesetQueryTask task = new ChangesetQueryTask(this, query);
+                ChangesetCacheManager.getInstance().runDownloadTask(task);
+                Main.worker.submit(() -> {
+                    if (task.isCanceled() || task.isFailed())
+                        return;
+                    GuiHelper.runInEDT(() -> task.getDownloadedData().stream()
+                            .filter(cs -> cs.getBounds() != null)
+                            .sorted(Comparator.reverseOrder())
+                            .limit(n)
+                            .forEachOrdered(cs -> model.addElement(new ChangesetBookmark(cs))));
+                });
+            }
+        }
+    }
+
     static class BookmarkCellRenderer extends JLabel implements ListCellRenderer<BookmarkList.Bookmark> {
 
@@ -184,5 +350,4 @@
         BookmarkCellRenderer() {
             setOpaque(true);
-            setIcon(ImageProvider.get("dialogs", "bookmark"));
         }
 
@@ -200,9 +365,11 @@
             Bounds area = b.getArea();
             StringBuilder sb = new StringBuilder(128);
-            sb.append("<html>min[latitude,longitude]=<strong>[")
-              .append(area.getMinLat()).append(',').append(area.getMinLon()).append("]</strong>"+
-                      "<br>max[latitude,longitude]=<strong>[")
-              .append(area.getMaxLat()).append(',').append(area.getMaxLon()).append("]</strong>"+
-                      "</html>");
+            if (area != null) {
+                sb.append("<html>min[latitude,longitude]=<strong>[")
+                  .append(area.getMinLat()).append(',').append(area.getMinLon()).append("]</strong>"+
+                          "<br>max[latitude,longitude]=<strong>[")
+                  .append(area.getMaxLat()).append(',').append(area.getMaxLon()).append("]</strong>"+
+                          "</html>");
+            }
             return sb.toString();
         }
@@ -212,4 +379,5 @@
                 boolean cellHasFocus) {
             renderColor(isSelected);
+            setIcon(value.getIcon());
             setText(value.getName());
             setToolTipText(buildToolTipText(value));
Index: trunk/src/org/openstreetmap/josm/gui/download/BookmarkSelection.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/download/BookmarkSelection.java	(revision 12494)
+++ trunk/src/org/openstreetmap/josm/gui/download/BookmarkSelection.java	(revision 12495)
@@ -24,4 +24,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.Bounds;
+import org.openstreetmap.josm.gui.JosmUserIdentityManager;
 import org.openstreetmap.josm.gui.download.BookmarkList.Bookmark;
 import org.openstreetmap.josm.gui.widgets.JMultilineLabel;
@@ -69,4 +70,8 @@
         bookmarks.addListSelectionListener(renameAction);
         pnl.add(new JButton(renameAction), gc);
+
+        gc.gridy = 2;
+        RefreshAction refreshAction = new RefreshAction();
+        pnl.add(new JButton(refreshAction), gc);
 
         gc.fill = GridBagConstraints.BOTH;
@@ -278,4 +283,20 @@
     }
 
+    class RefreshAction extends AbstractAction {
+        /**
+         * Constructs a new {@code RefreshAction}.
+         */
+        RefreshAction() {
+            putValue(SMALL_ICON, ImageProvider.get("dialogs/changeset", "downloadchangeset"));
+            putValue(SHORT_DESCRIPTION, tr("Download bookmarks for my {0} last changesets", BookmarkList.MAX_CHANGESET_BOOKMARKS.get()));
+            setEnabled(!JosmUserIdentityManager.getInstance().isAnonymous());
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            bookmarks.refreshChangesetBookmarks();
+        }
+    }
+
     class DoubleClickAdapter extends MouseAdapter {
         @Override
