Index: trunk/src/org/openstreetmap/josm/actions/ImageryAdjustAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/ImageryAdjustAction.java	(revision 13796)
+++ trunk/src/org/openstreetmap/josm/actions/ImageryAdjustAction.java	(revision 13797)
@@ -83,4 +83,5 @@
         tempOffset = new OffsetBookmark(
                 Main.getProjection().toCode(),
+                layer.getInfo().getId(),
                 layer.getInfo().getName(),
                 null,
Index: trunk/src/org/openstreetmap/josm/data/imagery/ImageryLayerInfo.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/imagery/ImageryLayerInfo.java	(revision 13796)
+++ trunk/src/org/openstreetmap/josm/data/imagery/ImageryLayerInfo.java	(revision 13797)
@@ -430,3 +430,13 @@
         return null;
     }
+
+    /**
+     * Returns imagery layer info for the given id.
+     * @param id imagery layer id.
+     * @return imagery layer info for the given id, or {@code null}
+     * @since 13797
+     */
+    public ImageryInfo getLayer(String id) {
+        return layerIds.get(id);
+    }
 }
Index: trunk/src/org/openstreetmap/josm/data/imagery/OffsetBookmark.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/imagery/OffsetBookmark.java	(revision 13796)
+++ trunk/src/org/openstreetmap/josm/data/imagery/OffsetBookmark.java	(revision 13797)
@@ -2,12 +2,11 @@
 package org.openstreetmap.josm.data.imagery;
 
-import static org.openstreetmap.josm.tools.I18n.tr;
-
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.ListIterator;
 import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
 
 import org.openstreetmap.josm.Main;
@@ -36,4 +35,6 @@
 
     @StructEntry private String projection_code;
+    @StructEntry private String imagery_id;
+    /** Imagery localized name. Locale insensitive {@link #imagery_id} is preferred. */
     @StructEntry private String imagery_name;
     @StructEntry private String name;
@@ -49,5 +50,6 @@
         if (projection_code == null) return false;
         if (!Main.getProjection().toCode().equals(projection_code) && !hasCenter()) return false;
-        return layer.getInfo().getName().equals(imagery_name);
+        ImageryInfo info = layer.getInfo();
+        return imagery_id != null ? Objects.equals(info.getId(), imagery_id) : Objects.equals(info.getName(), imagery_name);
     }
 
@@ -64,13 +66,15 @@
      * Create a new {@link OffsetBookmark} object using (0, 0) as center
      * <p>
-     * The use of the {@link #OffsetBookmark(String, String, String, EastNorth, ILatLon)} constructor is preferred.
+     * The use of the {@link #OffsetBookmark(String, String, String, String, EastNorth, ILatLon)} constructor is preferred.
      * @param projectionCode The projection for which this object was created
-     * @param imageryName The name of the imagery on the layer
+     * @param imageryId The id of the imagery on the layer (locale insensitive)
+     * @param imageryName The name of the imagery on the layer (locale sensitive)
      * @param name The name of the new bookmark
      * @param dx The x displacement
      * @param dy The y displacement
-     */
-    public OffsetBookmark(String projectionCode, String imageryName, String name, double dx, double dy) {
-        this(projectionCode, imageryName, name, dx, dy, 0, 0);
+     * @since 13797
+     */
+    public OffsetBookmark(String projectionCode, String imageryId, String imageryName, String name, double dx, double dy) {
+        this(projectionCode, imageryId, imageryName, name, dx, dy, 0, 0);
     }
 
@@ -78,12 +82,13 @@
      * Create a new {@link OffsetBookmark} object
      * @param projectionCode The projection for which this object was created
-     * @param imageryName The name of the imagery on the layer
+     * @param imageryId The id of the imagery on the layer (locale insensitive)
+     * @param imageryName The name of the imagery on the layer (locale sensitive)
      * @param name The name of the new bookmark
      * @param displacement The displacement in east/north space.
      * @param center The point on earth that was used as reference to align the image.
-     * @since 13243
-     */
-    public OffsetBookmark(String projectionCode, String imageryName, String name, EastNorth displacement, ILatLon center) {
-        this(projectionCode, imageryName, name, displacement.east(), displacement.north(), center.lon(), center.lat());
+     * @since 13797
+     */
+    public OffsetBookmark(String projectionCode, String imageryId, String imageryName, String name, EastNorth displacement, ILatLon center) {
+        this(projectionCode, imageryId, imageryName, name, displacement.east(), displacement.north(), center.lon(), center.lat());
     }
 
@@ -91,7 +96,8 @@
      * Create a new {@link OffsetBookmark} by specifying all values.
      * <p>
-     * The use of the {@link #OffsetBookmark(String, String, String, EastNorth, ILatLon)} constructor is preferred.
+     * The use of the {@link #OffsetBookmark(String, String, String, String, EastNorth, ILatLon)} constructor is preferred.
      * @param projectionCode The projection for which this object was created
-     * @param imageryName The name of the imagery on the layer
+     * @param imageryId The id of the imagery on the layer (locale insensitive)
+     * @param imageryName The name of the imagery on the layer (locale sensitive)
      * @param name The name of the new bookmark
      * @param dx The x displacement
@@ -99,7 +105,10 @@
      * @param centerLon The point on earth that was used as reference to align the image.
      * @param centerLat The point on earth that was used as reference to align the image.
-     */
-    public OffsetBookmark(String projectionCode, String imageryName, String name, double dx, double dy, double centerLon, double centerLat) {
+     * @since 13797
+     */
+    public OffsetBookmark(String projectionCode, String imageryId, String imageryName, String name,
+            double dx, double dy, double centerLon, double centerLat) {
         this.projection_code = projectionCode;
+        this.imagery_id = imageryId;
         this.imagery_name = imageryName;
         this.name = name;
@@ -111,24 +120,4 @@
 
     /**
-     * Loads an old bookmark. For backward compatibility with settings. Do not use.
-     * @param list The settings that were read
-     */
-    public OffsetBookmark(Collection<String> list) {
-        List<String> array = new ArrayList<>(list);
-        this.projection_code = array.get(0);
-        this.imagery_name = array.get(1);
-        this.name = array.get(2);
-        this.dx = Double.parseDouble(array.get(3));
-        this.dy = Double.parseDouble(array.get(4));
-        if (array.size() >= 7) {
-            this.center_lon = Double.parseDouble(array.get(5));
-            this.center_lat = Double.parseDouble(array.get(6));
-        }
-        if (projection_code == null) {
-            Logging.error(tr("Projection ''{0}'' is not found, bookmark ''{1}'' is not usable", projection_code, name));
-        }
-    }
-
-    /**
      * Get the projection code for which this bookmark was created.
      * @return The projection.
@@ -147,5 +136,15 @@
 
     /**
-     * Get the name of the imagery for which this bookmark was created. It is used to match the bookmark to the right layers.
+     * Get the id of the imagery for which this bookmark was created. It is used to match the bookmark to the right layers.
+     * @return The imagery identifier
+     * @since 13797
+     */
+    public String getImageryId() {
+        return imagery_id;
+    }
+
+    /**
+     * Get the name of the imagery for which this bookmark was created.
+     * It is used to match the bookmark to the right layers if id is missing.
      * @return The name
      */
@@ -233,4 +232,14 @@
 
     /**
+     * Sets the id of the imagery
+     * @param imageryId The identifier
+     * @see #getImageryId()
+     * @since xxx
+     */
+    public void setImageryId(String imageryId) {
+        this.imagery_id = imageryId;
+    }
+
+    /**
      * Update the displacement of this imagery.
      * @param displacement The displacement
@@ -248,16 +257,31 @@
                 Config.getPref(), "imagery.offsetbookmarks", null, OffsetBookmark.class);
         if (bookmarks == null) {
-            loadBookmarksOld();
             saveBookmarks();
         } else {
+            sanitizeBookmarks(bookmarks);
             allBookmarks.addAll(bookmarks);
         }
     }
 
-    // migration code - remove Nov. 2017
-    private static void loadBookmarksOld() {
-        for (Collection<String> c : Config.getPref().getListOfLists("imagery.offsets")) {
-            allBookmarks.add(new OffsetBookmark(c));
-        }
+    static void sanitizeBookmarks(List<OffsetBookmark> bookmarks) {
+        // Retrieve layer id from layer name (it was not available before #13937)
+        bookmarks.stream().filter(b -> b.getImageryId() == null).forEach(b -> {
+            List<ImageryInfo> candidates = ImageryLayerInfo.instance.getLayers().stream()
+                .filter(l -> Objects.equals(l.getName(), b.getImageryName()))
+                .collect(Collectors.toList());
+            // Make sure there is no ambiguity
+            if (candidates.size() == 1) {
+                b.setImageryId(candidates.get(0).getId());
+            } else {
+                Logging.warn("Not a single layer for the name '" + b.getImageryName() + "': " + candidates);
+            }
+        });
+        // Update layer name (locale sensitive) if the locale has changed
+        bookmarks.stream().filter(b -> b.getImageryId() != null).forEach(b -> {
+            ImageryInfo info = ImageryLayerInfo.instance.getLayer(b.getImageryId());
+            if (info != null && !Objects.equals(info.getName(), b.getImageryName())) {
+                b.setImageryName(info.getName());
+            }
+        });
     }
 
@@ -346,5 +370,5 @@
         }
         OffsetBookmark nb = new OffsetBookmark(
-                Main.getProjection().toCode(), layer.getInfo().getName(),
+                Main.getProjection().toCode(), layer.getInfo().getId(), layer.getInfo().getName(),
                 name, layer.getDisplaySettings().getDisplacement(), center);
         for (ListIterator<OffsetBookmark> it = allBookmarks.listIterator(); it.hasNext();) {
Index: trunk/src/org/openstreetmap/josm/gui/preferences/imagery/ImageryPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/imagery/ImageryPreference.java	(revision 13796)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/imagery/ImageryPreference.java	(revision 13797)
@@ -24,5 +24,7 @@
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 import javax.swing.AbstractAction;
@@ -853,5 +855,5 @@
             JButton add = new JButton(tr("Add"));
             buttonPanel.add(add, GBC.std().insets(0, 5, 0, 0));
-            add.addActionListener(e -> model.addRow(new OffsetBookmark(Main.getProjection().toCode(), "", "", 0, 0)));
+            add.addActionListener(e -> model.addRow(new OffsetBookmark(Main.getProjection().toCode(), "", "", "", 0, 0)));
 
             JButton delete = new JButton(tr("Delete"));
@@ -920,5 +922,5 @@
                     return info.getDisplacement().north();
                 default:
-                    throw new ArrayIndexOutOfBoundsException();
+                    throw new ArrayIndexOutOfBoundsException(column);
                 }
             }
@@ -929,5 +931,13 @@
                 switch (column) {
                 case 1:
-                    info.setImageryName(o.toString());
+                    String name = o.toString();
+                    info.setImageryName(name);
+                    List<ImageryInfo> layers = ImageryLayerInfo.instance.getLayers().stream()
+                            .filter(l -> Objects.equals(name, l.getName())).collect(Collectors.toList());
+                    if (layers.size() == 1) {
+                        info.setImageryId(layers.get(0).getId());
+                    } else {
+                        Logging.warn("Not a single layer for the name '" + info.getImageryName() + "': " + layers);
+                    }
                     break;
                 case 2:
@@ -943,5 +953,5 @@
                     break;
                 default:
-                    throw new ArrayIndexOutOfBoundsException();
+                    throw new ArrayIndexOutOfBoundsException(column);
                 }
             }
Index: trunk/test/unit/org/openstreetmap/josm/io/session/SessionWriterTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/io/session/SessionWriterTest.java	(revision 13796)
+++ trunk/test/unit/org/openstreetmap/josm/io/session/SessionWriterTest.java	(revision 13797)
@@ -144,5 +144,5 @@
         TMSLayer layer = new TMSLayer(new ImageryInfo("the name", "http://www.url.com/"));
         layer.getDisplaySettings().setOffsetBookmark(
-                new OffsetBookmark(Main.getProjection().toCode(), layer.getInfo().getName(), "", 12, 34));
+                new OffsetBookmark(Main.getProjection().toCode(), layer.getInfo().getId(), layer.getInfo().getName(), "", 12, 34));
         return layer;
     }
