Index: trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java	(revision 13607)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java	(revision 13608)
@@ -43,4 +43,6 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.MergeLayerAction;
+import org.openstreetmap.josm.data.coor.EastNorth;
+import org.openstreetmap.josm.data.imagery.OffsetBookmark;
 import org.openstreetmap.josm.data.preferences.AbstractProperty;
 import org.openstreetmap.josm.gui.MainApplication;
@@ -57,4 +59,5 @@
 import org.openstreetmap.josm.gui.dialogs.layer.MoveUpAction;
 import org.openstreetmap.josm.gui.dialogs.layer.ShowHideLayerAction;
+import org.openstreetmap.josm.gui.layer.AbstractTileSourceLayer;
 import org.openstreetmap.josm.gui.layer.JumpToMarkerActions;
 import org.openstreetmap.josm.gui.layer.Layer;
@@ -67,4 +70,6 @@
 import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
 import org.openstreetmap.josm.gui.layer.NativeScaleLayer;
+import org.openstreetmap.josm.gui.layer.imagery.TileSourceDisplaySettings.DisplaySettingsChangeEvent;
+import org.openstreetmap.josm.gui.layer.imagery.TileSourceDisplaySettings.DisplaySettingsChangeListener;
 import org.openstreetmap.josm.gui.util.MultikeyActionsHandler;
 import org.openstreetmap.josm.gui.util.MultikeyShortcutAction.MultikeyInfo;
@@ -86,5 +91,5 @@
  * @since 17
  */
-public class LayerListDialog extends ToggleDialog {
+public class LayerListDialog extends ToggleDialog implements DisplaySettingsChangeListener {
     /** the unique instance of the dialog */
     private static volatile LayerListDialog instance;
@@ -206,12 +211,18 @@
         layerList.getColumnModel().getColumn(1).setResizable(false);
 
-        layerList.getColumnModel().getColumn(2).setCellRenderer(new LayerVisibleCellRenderer());
-        layerList.getColumnModel().getColumn(2).setCellEditor(new LayerVisibleCellEditor(new LayerVisibleCheckBox()));
+        layerList.getColumnModel().getColumn(2).setCellRenderer(new OffsetLayerCellRenderer());
+        layerList.getColumnModel().getColumn(2).setCellEditor(new DefaultCellEditor(new OffsetLayerCheckBox()));
         layerList.getColumnModel().getColumn(2).setMaxWidth(16);
         layerList.getColumnModel().getColumn(2).setPreferredWidth(16);
         layerList.getColumnModel().getColumn(2).setResizable(false);
 
-        layerList.getColumnModel().getColumn(3).setCellRenderer(new LayerNameCellRenderer());
-        layerList.getColumnModel().getColumn(3).setCellEditor(new LayerNameCellEditor(new DisableShortcutsOnFocusGainedTextField()));
+        layerList.getColumnModel().getColumn(3).setCellRenderer(new LayerVisibleCellRenderer());
+        layerList.getColumnModel().getColumn(3).setCellEditor(new LayerVisibleCellEditor(new LayerVisibleCheckBox()));
+        layerList.getColumnModel().getColumn(3).setMaxWidth(16);
+        layerList.getColumnModel().getColumn(3).setPreferredWidth(16);
+        layerList.getColumnModel().getColumn(3).setResizable(false);
+
+        layerList.getColumnModel().getColumn(4).setCellRenderer(new LayerNameCellRenderer());
+        layerList.getColumnModel().getColumn(4).setCellEditor(new LayerNameCellEditor(new DisableShortcutsOnFocusGainedTextField()));
         // Disable some default JTable shortcuts to use JOSM ones (see #5678, #10458)
         for (KeyStroke ks : new KeyStroke[] {
@@ -442,4 +453,14 @@
     }
 
+    private static class OffsetLayerCheckBox extends JCheckBox {
+        OffsetLayerCheckBox() {
+            setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
+            ImageIcon blank = ImageProvider.get("dialogs/layerlist", "blank");
+            ImageIcon withOffset = ImageProvider.get("dialogs/layerlist", "offset");
+            setIcon(blank);
+            setSelectedIcon(withOffset);
+        }
+    }
+
     private static class ActiveLayerCellRenderer implements TableCellRenderer {
         private final JCheckBox cb;
@@ -518,4 +539,38 @@
                 cb.setSelected(false);
                 cb.setToolTipText(tr("this layer has no native resolution"));
+            }
+            return cb;
+        }
+    }
+
+    private static class OffsetLayerCellRenderer implements TableCellRenderer {
+        private final JCheckBox cb;
+
+        /**
+         * Constructs a new {@code OffsetLayerCellRenderer}.
+         */
+        OffsetLayerCellRenderer() {
+            cb = new OffsetLayerCheckBox();
+            cb.setEnabled(false);
+        }
+
+        @Override
+        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
+            Layer layer = (Layer) value;
+            if (layer instanceof AbstractTileSourceLayer<?>) {
+                if (EastNorth.ZERO.equals(((AbstractTileSourceLayer<?>) layer).getDisplaySettings().getDisplacement())) {
+                    cb.setSelected(false);
+                    cb.setEnabled(false); // TODO: allow reselecting checkbox and thereby setting the old offset again
+                    cb.setToolTipText(tr("layer is without a user-defined offset"));
+                } else {
+                    cb.setSelected(true);
+                    cb.setEnabled(true);
+                    cb.setToolTipText(tr("layer has a user-defined offset (click to remove offset)"));
+                }
+
+            } else {
+                cb.setSelected(false);
+                cb.setEnabled(false);
+                cb.setToolTipText(tr("this layer can not have an offset"));
             }
             return cb;
@@ -781,4 +836,7 @@
             selectionModel.setSelectionInterval(idx, idx);
             ensureSelectedIsVisible();
+            if (layer instanceof AbstractTileSourceLayer<?>) {
+                ((AbstractTileSourceLayer<?>) layer).getDisplaySettings().addSettingsChangeListener(LayerListDialog.getInstance());
+            }
         }
 
@@ -965,5 +1023,5 @@
         @Override
         public int getColumnCount() {
-            return 4;
+            return 5;
         }
 
@@ -976,5 +1034,6 @@
                 case 1:
                 case 2:
-                case 3: return layers.get(row);
+                case 3:
+                case 4: return layers.get(row);
                 default: // Do nothing
                 }
@@ -1005,6 +1064,6 @@
                     } else if (l instanceof NativeScaleLayer) {
                         map.mapView.setNativeScaleLayer((NativeScaleLayer) l);
-                        if (oldLayer != null) {
-                            int idx = getLayers().indexOf(oldLayer);
+                        if (oldLayer instanceof Layer) {
+                            int idx = getLayers().indexOf((Layer) oldLayer);
                             if (idx >= 0) {
                                 fireTableCellUpdated(idx, col);
@@ -1014,7 +1073,18 @@
                     break;
                 case 2:
+                    // reset layer offset
+                    if (l instanceof AbstractTileSourceLayer<?>) {
+                        AbstractTileSourceLayer<?> abstractTileSourceLayer = (AbstractTileSourceLayer<?>) l;
+                        OffsetBookmark offsetBookmark = abstractTileSourceLayer.getDisplaySettings().getOffsetBookmark();
+                        if (offsetBookmark != null) {
+                            offsetBookmark.setDisplacement(EastNorth.ZERO);
+                            abstractTileSourceLayer.getDisplaySettings().setOffsetBookmark(offsetBookmark);
+                        }
+                    }
+                    break;
+                case 3:
                     l.setVisible((Boolean) value);
                     break;
-                case 3:
+                case 4:
                     l.rename((String) value);
                     break;
@@ -1214,3 +1284,10 @@
         return new MultikeyInfo(index, l.getName());
     }
+
+    @Override
+    public void displaySettingsChanged(DisplaySettingsChangeEvent e) {
+        if ("displacement".equals(e.getChangedSetting())) {
+            layerList.repaint();
+        }
+    }
 }
