Index: trunk/src/org/openstreetmap/josm/data/osm/DataIntegrityProblemException.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/DataIntegrityProblemException.java	(revision 16545)
+++ trunk/src/org/openstreetmap/josm/data/osm/DataIntegrityProblemException.java	(revision 16546)
@@ -1,4 +1,12 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.data.osm;
+
+import java.util.Arrays;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import org.openstreetmap.josm.command.Command;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 
 /**
@@ -22,7 +30,8 @@
      * @param message the detail message
      * @param htmlMessage HTML-formatted error message. Can be null
+     * @param p the primitive involved in this integrity problem (used for constructing a detailed message)
      */
-    public DataIntegrityProblemException(String message, String htmlMessage) {
-        super(message);
+    public DataIntegrityProblemException(String message, String htmlMessage, OsmPrimitive... p) {
+        super(message + relevantCommands(p));
         this.htmlMessage = htmlMessage;
     }
@@ -35,3 +44,18 @@
         return htmlMessage;
     }
+
+    private static String relevantCommands(OsmPrimitive... p) {
+        if (p == null || p.length == 0) {
+            return "";
+        }
+        Predicate<Command> isParticipating = c -> Arrays.stream(p).anyMatch(c.getParticipatingPrimitives()::contains);
+        Stream<String> undo = UndoRedoHandler.getInstance().getUndoCommands().stream()
+                .filter(isParticipating)
+                .map(c -> "[" + c.getDescriptionText() + "]");
+        Stream<String> redo = UndoRedoHandler.getInstance().getRedoCommands().stream()
+                .filter(isParticipating)
+                .map(c -> "[" + c.getDescriptionText() + " (undone)]");
+        return Stream.concat(undo, redo)
+                .collect(Collectors.joining(", ", " (changed by the following commands: ", ")"));
+    }
 }
Index: trunk/src/org/openstreetmap/josm/data/osm/DataSet.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 16545)
+++ trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 16546)
@@ -496,6 +496,6 @@
             if (getPrimitiveById(primitive) != null)
                 throw new DataIntegrityProblemException(
-                        tr("Unable to add primitive {0} to the dataset because it is already included",
-                                primitive.toString()));
+                        tr("Unable to add primitive {0} to the dataset because it is already included", primitive.toString()),
+                        null, primitive);
 
             allPrimitives.add(primitive);
Index: trunk/src/org/openstreetmap/josm/data/osm/Relation.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Relation.java	(revision 16545)
+++ trunk/src/org/openstreetmap/josm/data/osm/Relation.java	(revision 16546)
@@ -484,10 +484,11 @@
                     throw new DataIntegrityProblemException(
                             String.format("Relation member must be part of the same dataset as relation(%s, %s)",
-                                    getPrimitiveId(), rm.getMember().getPrimitiveId()));
+                                    getPrimitiveId(), rm.getMember().getPrimitiveId()),
+                            null, this, rm.getMember());
             }
             if (Config.getPref().getBoolean("debug.checkDeleteReferenced", true)) {
                 for (RelationMember rm: members) {
                     if (rm.getMember().isDeleted())
-                        throw new DataIntegrityProblemException("Deleted member referenced: " + toString());
+                        throw new DataIntegrityProblemException("Deleted member referenced: " + toString(), null, this, rm.getMember());
                 }
             }
Index: trunk/src/org/openstreetmap/josm/data/osm/Way.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Way.java	(revision 16545)
+++ trunk/src/org/openstreetmap/josm/data/osm/Way.java	(revision 16546)
@@ -536,5 +536,6 @@
                     throw new DataIntegrityProblemException("Deleted node referenced: " + toString(),
                             "<html>" + tr("Deleted node referenced by {0}",
-                                    DefaultNameFormatter.getInstance().formatAsHtmlUnorderedList(this)) + "</html>");
+                                    DefaultNameFormatter.getInstance().formatAsHtmlUnorderedList(this)) + "</html>",
+                            this, n);
             }
             if (Config.getPref().getBoolean("debug.checkNullCoor", true)) {
@@ -543,6 +544,7 @@
                         throw new DataIntegrityProblemException("Complete visible node with null coordinates: " + toString(),
                                 "<html>" + tr("Complete node {0} with null coordinates in way {1}",
-                                DefaultNameFormatter.getInstance().formatAsHtmlUnorderedList(n),
-                                DefaultNameFormatter.getInstance().formatAsHtmlUnorderedList(this)) + "</html>");
+                                        DefaultNameFormatter.getInstance().formatAsHtmlUnorderedList(n),
+                                        DefaultNameFormatter.getInstance().formatAsHtmlUnorderedList(this)) + "</html>",
+                                this, n);
                 }
             }
