diff --git a/src/org/openstreetmap/josm/actions/RedoAction.java b/src/org/openstreetmap/josm/actions/RedoAction.java
index 7979dd4..724c187 100644
--- a/src/org/openstreetmap/josm/actions/RedoAction.java
+++ b/src/org/openstreetmap/josm/actions/RedoAction.java
@@ -48,7 +48,7 @@ public class RedoAction extends JosmAction implements OsmDataLayer.CommandQueueL
         } else {
             putValue(NAME, tr("Redo ..."));
             setTooltip(tr("Redo {0}",
-                    Main.main.undoRedo.redoCommands.getFirst().getDescrpitionText()));
+                    Main.main.undoRedo.redoCommands.getFirst().getDescriptionText()));
         }
     }
 }
diff --git a/src/org/openstreetmap/josm/actions/UndoAction.java b/src/org/openstreetmap/josm/actions/UndoAction.java
index 960c69b..dc5b8f4 100644
--- a/src/org/openstreetmap/josm/actions/UndoAction.java
+++ b/src/org/openstreetmap/josm/actions/UndoAction.java
@@ -48,7 +48,7 @@ public class UndoAction extends JosmAction implements OsmDataLayer.CommandQueueL
         } else {
             putValue(NAME, tr("Undo ..."));
             setTooltip(tr("Undo {0}",
-                    Main.main.undoRedo.commands.getFirst().getDescrpitionText()));
+                    Main.main.undoRedo.commands.getFirst().getDescriptionText()));
         }
     }
 }
diff --git a/src/org/openstreetmap/josm/command/AddCommand.java b/src/org/openstreetmap/josm/command/AddCommand.java
index 10bb586..70b9899 100644
--- a/src/org/openstreetmap/josm/command/AddCommand.java
+++ b/src/org/openstreetmap/josm/command/AddCommand.java
@@ -7,7 +7,7 @@ import static org.openstreetmap.josm.tools.I18n.tr;
 import java.util.Collection;
 import java.util.Collections;
 
-import javax.swing.JLabel;
+import javax.swing.Icon;
 
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
@@ -59,7 +59,8 @@ public class AddCommand extends Command {
         added.add(osm);
     }
 
-    @Override public JLabel getDescription() {
+    @Override
+    public String getDescriptionText() {
         String msg;
         switch(OsmPrimitiveType.from(osm)) {
         case NODE: msg = marktr("Add node {0}"); break;
@@ -67,11 +68,12 @@ public class AddCommand extends Command {
         case RELATION: msg = marktr("Add relation {0}"); break;
         default: /* should not happen */msg = ""; break;
         }
+        return tr(msg, osm.getDisplayName(DefaultNameFormatter.getInstance()));
+    }
 
-        return new JLabel(
-                tr(msg, osm.getDisplayName(DefaultNameFormatter.getInstance())),
-                ImageProvider.get(OsmPrimitiveType.from(osm)),
-                JLabel.HORIZONTAL);
+    @Override
+    public Icon getDescriptionIcon() {
+        return ImageProvider.get(OsmPrimitiveType.from(osm));
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/command/AddPrimitivesCommand.java b/src/org/openstreetmap/josm/command/AddPrimitivesCommand.java
index f576e46..1f85d01 100644
--- a/src/org/openstreetmap/josm/command/AddPrimitivesCommand.java
+++ b/src/org/openstreetmap/josm/command/AddPrimitivesCommand.java
@@ -7,6 +7,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
+import javax.swing.Icon;
 
 import javax.swing.JLabel;
 
@@ -100,11 +101,15 @@ public class AddPrimitivesCommand extends Command {
         }
     }
 
-    @Override public JLabel getDescription() {
+    @Override
+    public String getDescriptionText() {
         int size = data != null ? data.size() : createdPrimitives.size();
-        return new JLabel(trn("Added {0} object", "Added {0} objects", size, size), null,
-                JLabel.HORIZONTAL
-        );
+        return trn("Added {0} object", "Added {0} objects", size, size);
+    }
+
+    @Override
+    public Icon getDescriptionIcon() {
+        return null;
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/command/ChangeCommand.java b/src/org/openstreetmap/josm/command/ChangeCommand.java
index 7eb4473..b7df87e 100644
--- a/src/org/openstreetmap/josm/command/ChangeCommand.java
+++ b/src/org/openstreetmap/josm/command/ChangeCommand.java
@@ -5,8 +5,7 @@ import static org.openstreetmap.josm.tools.I18n.marktr;
 import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.util.Collection;
-
-import javax.swing.JLabel;
+import javax.swing.Icon;
 
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
@@ -49,16 +48,19 @@ public class ChangeCommand extends Command {
         modified.add(osm);
     }
 
-    @Override public JLabel getDescription() {
+    @Override
+    public String getDescriptionText() {
         String msg = "";
         switch(OsmPrimitiveType.from(osm)) {
         case NODE: msg = marktr("Change node {0}"); break;
         case WAY: msg = marktr("Change way {0}"); break;
         case RELATION: msg = marktr("Change relation {0}"); break;
         }
-        return new JLabel(tr(msg,
-                    osm.getDisplayName(DefaultNameFormatter.getInstance())),
-                    ImageProvider.get(OsmPrimitiveType.from(osm)),
-                    JLabel.HORIZONTAL);
+        return tr(msg, osm.getDisplayName(DefaultNameFormatter.getInstance()));
+    }
+
+    @Override
+    public Icon getDescriptionIcon() {
+        return ImageProvider.get(OsmPrimitiveType.from(osm));
     }
 }
diff --git a/src/org/openstreetmap/josm/command/ChangeNodesCommand.java b/src/org/openstreetmap/josm/command/ChangeNodesCommand.java
index 7a1356a..46a7ec2 100644
--- a/src/org/openstreetmap/josm/command/ChangeNodesCommand.java
+++ b/src/org/openstreetmap/josm/command/ChangeNodesCommand.java
@@ -5,8 +5,7 @@ import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.util.Collection;
 import java.util.List;
-
-import javax.swing.JLabel;
+import javax.swing.Icon;
 
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.Way;
@@ -45,10 +44,13 @@ public class ChangeNodesCommand extends Command {
         modified.add(way);
     }
 
-    @Override public JLabel getDescription() {
-        String msg = tr("Changed nodes of {0}", way.getDisplayName(DefaultNameFormatter.getInstance()));
-        return new JLabel(msg,
-                        ImageProvider.get(OsmPrimitiveType.WAY),
-                        JLabel.HORIZONTAL);
+    @Override
+    public String getDescriptionText() {
+        return tr("Changed nodes of {0}", way.getDisplayName(DefaultNameFormatter.getInstance()));
+    }
+
+    @Override
+    public Icon getDescriptionIcon() {
+        return ImageProvider.get(OsmPrimitiveType.WAY);
     }
 }
diff --git a/src/org/openstreetmap/josm/command/ChangePropertyCommand.java b/src/org/openstreetmap/josm/command/ChangePropertyCommand.java
index 6a0c26e..1ffd2f2 100644
--- a/src/org/openstreetmap/josm/command/ChangePropertyCommand.java
+++ b/src/org/openstreetmap/josm/command/ChangePropertyCommand.java
@@ -13,8 +13,7 @@ import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
-
-import javax.swing.JLabel;
+import javax.swing.Icon;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -144,7 +143,8 @@ public class ChangePropertyCommand extends Command {
         modified.addAll(objects);
     }
 
-    @Override public JLabel getDescription() {
+    @Override
+    public String getDescriptionText() {
         String text;
         if (objects.size() == 1 && tags.size() == 1) {
             OsmPrimitive primitive = objects.iterator().next();
@@ -186,7 +186,12 @@ public class ChangePropertyCommand extends Command {
             } else
                 text = tr("Set {0} properties for {1} objects", tags.size(), objects.size());
         }
-        return new JLabel(text, ImageProvider.get("data", "key"), JLabel.HORIZONTAL);
+        return text;
+    }
+
+    @Override
+    public Icon getDescriptionIcon() {
+        return ImageProvider.get("data", "key");
     }
 
     @Override public Collection<PseudoCommand> getChildren() {
@@ -195,13 +200,14 @@ public class ChangePropertyCommand extends Command {
         List<PseudoCommand> children = new ArrayList<PseudoCommand>();
         for (final OsmPrimitive osm : objects) {
             children.add(new PseudoCommand() {
-                @Override public JLabel getDescription() {
-                    return new JLabel(
-                                osm.getDisplayName(DefaultNameFormatter.getInstance()),
-                                ImageProvider.get(OsmPrimitiveType.from(osm)),
-                                JLabel.HORIZONTAL);
+                @Override public String getDescriptionText() {
+                    return osm.getDisplayName(DefaultNameFormatter.getInstance());
+                }
 
+                @Override public Icon getDescriptionIcon() {
+                    return ImageProvider.get(OsmPrimitiveType.from(osm));
                 }
+
                 @Override public Collection<? extends OsmPrimitive> getParticipatingPrimitives() {
                     return Collections.singleton(osm);
                 }
diff --git a/src/org/openstreetmap/josm/command/ChangePropertyKeyCommand.java b/src/org/openstreetmap/josm/command/ChangePropertyKeyCommand.java
index bca899e..5719307 100644
--- a/src/org/openstreetmap/josm/command/ChangePropertyKeyCommand.java
+++ b/src/org/openstreetmap/josm/command/ChangePropertyKeyCommand.java
@@ -9,11 +9,8 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
+import javax.swing.Icon;
 
-import javax.swing.JLabel;
-
-import org.openstreetmap.josm.command.Command;
-import org.openstreetmap.josm.command.PseudoCommand;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.validation.util.NameVisitor;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -70,7 +67,7 @@ public class ChangePropertyKeyCommand extends Command {
     }
 
     @Override
-    public JLabel getDescription() {
+    public String getDescriptionText() {
         String text = tr( "Replace \"{0}\" by \"{1}\" for", key, newKey);
         if (objects.size() == 1) {
             NameVisitor v = new NameVisitor();
@@ -79,7 +76,12 @@ public class ChangePropertyKeyCommand extends Command {
         } else {
             text += " "+objects.size()+" "+trn("object","objects",objects.size());
         }
-        return new JLabel(text, ImageProvider.get("data", "key"), JLabel.HORIZONTAL);
+        return text;
+    }
+
+    @Override
+    public Icon getDescriptionIcon() {
+        return ImageProvider.get("data", "key");
     }
 
     @Override
@@ -93,8 +95,12 @@ public class ChangePropertyKeyCommand extends Command {
             osm.visit(v);
             children.add(new PseudoCommand() {
                 @Override
-                public JLabel getDescription() {
-                    return v.toLabel();
+                public String getDescriptionText() {
+                    return v.name;
+                }
+                @Override
+                public Icon getDescriptionIcon() {
+                    return v.icon;
                 }
                 @Override
                 public Collection<? extends OsmPrimitive> getParticipatingPrimitives() {
diff --git a/src/org/openstreetmap/josm/command/ChangeRelationMemberRoleCommand.java b/src/org/openstreetmap/josm/command/ChangeRelationMemberRoleCommand.java
index 38eb158..6cc60ed 100644
--- a/src/org/openstreetmap/josm/command/ChangeRelationMemberRoleCommand.java
+++ b/src/org/openstreetmap/josm/command/ChangeRelationMemberRoleCommand.java
@@ -5,9 +5,7 @@ import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.util.Collection;
 
-import javax.swing.JLabel;
-
-import org.openstreetmap.josm.Main;
+import javax.swing.Icon;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
 import org.openstreetmap.josm.data.osm.Relation;
@@ -63,14 +61,15 @@ public class ChangeRelationMemberRoleCommand extends Command {
         modified.add(relation);
     }
 
-    @Override public JLabel getDescription() {
-        return new JLabel(
-                        tr("Change relation member role for {0} {1}",
-                                OsmPrimitiveType.from(relation),
-                                relation.getDisplayName(DefaultNameFormatter.getInstance())
-                        ),
-                        ImageProvider.get(OsmPrimitiveType.from(relation)),
-                        JLabel.HORIZONTAL
-        );
+    @Override
+    public String getDescriptionText() {
+        return tr("Change relation member role for {0} {1}",
+                OsmPrimitiveType.from(relation),
+                relation.getDisplayName(DefaultNameFormatter.getInstance()));
+    }
+
+    @Override
+    public Icon getDescriptionIcon() {
+        return ImageProvider.get(OsmPrimitiveType.from(relation));
     }
 }
diff --git a/src/org/openstreetmap/josm/command/Command.java b/src/org/openstreetmap/josm/command/Command.java
index 3d4a21e..514ec5f 100644
--- a/src/org/openstreetmap/josm/command/Command.java
+++ b/src/org/openstreetmap/josm/command/Command.java
@@ -161,15 +161,6 @@ abstract public class Command extends PseudoCommand {
         return cloneMap.keySet();
     }
 
-    public String getDescrpitionText() {
-        Object o = getDescription();
-        if (o instanceof JLabel) {
-            return ((JLabel) o).getText();
-        } else {
-            return o.toString();
-        }
-    }
-
     /**
      * Check whether user is about to operate on data outside of the download area.
      * Request confirmation if he is.
diff --git a/src/org/openstreetmap/josm/command/ConflictAddCommand.java b/src/org/openstreetmap/josm/command/ConflictAddCommand.java
index 157c8d5..d49e3dd 100644
--- a/src/org/openstreetmap/josm/command/ConflictAddCommand.java
+++ b/src/org/openstreetmap/josm/command/ConflictAddCommand.java
@@ -4,8 +4,7 @@ package org.openstreetmap.josm.command;
 import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.util.Collection;
-
-import javax.swing.JLabel;
+import javax.swing.Icon;
 import javax.swing.JOptionPane;
 
 import org.openstreetmap.josm.Main;
@@ -62,13 +61,14 @@ public class ConflictAddCommand extends Command {
         // nothing to fill
     }
 
-    @Override public JLabel getDescription() {
-        return new JLabel(
-                tr("Add conflict for ''{0}''",
-                        conflict.getMy().getDisplayName(DefaultNameFormatter.getInstance())
-                ),
-                ImageProvider.get(OsmPrimitiveType.from(conflict.getMy())),
-                JLabel.HORIZONTAL
-        );
+    @Override
+    public String getDescriptionText() {
+        return tr("Add conflict for ''{0}''",
+                conflict.getMy().getDisplayName(DefaultNameFormatter.getInstance()));
+    }
+
+    @Override
+    public Icon getDescriptionIcon() {
+        return ImageProvider.get(OsmPrimitiveType.from(conflict.getMy()));
     }
 }
diff --git a/src/org/openstreetmap/josm/command/CoordinateConflictResolveCommand.java b/src/org/openstreetmap/josm/command/CoordinateConflictResolveCommand.java
index acc5119..a47edb4 100644
--- a/src/org/openstreetmap/josm/command/CoordinateConflictResolveCommand.java
+++ b/src/org/openstreetmap/josm/command/CoordinateConflictResolveCommand.java
@@ -4,8 +4,7 @@ package org.openstreetmap.josm.command;
 import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.util.Collection;
-
-import javax.swing.JLabel;
+import javax.swing.Icon;
 
 import org.openstreetmap.josm.data.conflict.Conflict;
 import org.openstreetmap.josm.data.osm.Node;
@@ -37,12 +36,14 @@ public class CoordinateConflictResolveCommand extends ConflictResolveCommand {
         this.decision = decision;
     }
 
-    @Override public JLabel getDescription() {
-        return new JLabel(
-                        tr("Resolve conflicts in coordinates in {0}",conflict.getMy().getId()),
-                        ImageProvider.get("data", "object"),
-                        JLabel.HORIZONTAL
-        );
+    @Override
+    public String getDescriptionText() {
+        return tr("Resolve conflicts in coordinates in {0}", conflict.getMy().getId());
+    }
+
+    @Override
+    public Icon getDescriptionIcon() {
+        return ImageProvider.get("data", "object");
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/command/DeleteCommand.java b/src/org/openstreetmap/josm/command/DeleteCommand.java
index ceb5e26..e6751cc 100644
--- a/src/org/openstreetmap/josm/command/DeleteCommand.java
+++ b/src/org/openstreetmap/josm/command/DeleteCommand.java
@@ -18,6 +18,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.Map.Entry;
+import javax.swing.Icon;
 
 import javax.swing.JLabel;
 
@@ -148,8 +149,17 @@ public class DeleteCommand extends Command {
             Collection<OsmPrimitive> added) {
     }
 
-    @Override public JLabel getDescription() {
-        if (toDelete.size() == 1) {
+    private Set<OsmPrimitiveType> getTypesToDelete() {
+        Set<OsmPrimitiveType> typesToDelete = new HashSet<OsmPrimitiveType>();
+        for (OsmPrimitive osm : toDelete) {
+            typesToDelete.add(OsmPrimitiveType.from(osm));
+        }
+        return typesToDelete;
+    }
+
+    @Override
+    public String getDescriptionText() {
+           if (toDelete.size() == 1) {
             OsmPrimitive primitive = toDelete.iterator().next();
             String msg = "";
             switch(OsmPrimitiveType.from(primitive)) {
@@ -158,27 +168,34 @@ public class DeleteCommand extends Command {
             case RELATION:msg = marktr("Delete relation {0}"); break;
             }
 
-            return new JLabel(tr(msg, primitive.getDisplayName(DefaultNameFormatter.getInstance())),
-                    ImageProvider.get(OsmPrimitiveType.from(primitive)), JLabel.HORIZONTAL);
+            return tr(msg, primitive.getDisplayName(DefaultNameFormatter.getInstance()));
         } else {
-            Set<OsmPrimitiveType> typesToDelete = new HashSet<OsmPrimitiveType>();
-            for (OsmPrimitive osm : toDelete) {
-                typesToDelete.add(OsmPrimitiveType.from(osm));
-            }
+            Set<OsmPrimitiveType> typesToDelete = getTypesToDelete();
             String msg = "";
-            String apiname = "object";
             if (typesToDelete.size() > 1) {
                 msg = trn("Delete {0} object", "Delete {0} objects", toDelete.size(), toDelete.size());
             } else {
                 OsmPrimitiveType t = typesToDelete.iterator().next();
-                apiname = t.getAPIName();
                 switch(t) {
                 case NODE: msg = trn("Delete {0} node", "Delete {0} nodes", toDelete.size(), toDelete.size()); break;
                 case WAY: msg = trn("Delete {0} way", "Delete {0} ways", toDelete.size(), toDelete.size()); break;
                 case RELATION: msg = trn("Delete {0} relation", "Delete {0} relations", toDelete.size(), toDelete.size()); break;
                 }
             }
-            return  new JLabel(msg, ImageProvider.get("data", apiname), JLabel.HORIZONTAL);
+            return msg;
+        }
+    }
+
+    @Override
+    public Icon getDescriptionIcon() {
+        if (toDelete.size() == 1) {
+            return ImageProvider.get(OsmPrimitiveType.from(toDelete.iterator().next()));
+        }
+        Set<OsmPrimitiveType> typesToDelete = getTypesToDelete();
+        if (typesToDelete.size() > 1) {
+            return ImageProvider.get("data", "object");
+        } else {
+            return ImageProvider.get(typesToDelete.iterator().next());
         }
     }
 
@@ -189,12 +206,15 @@ public class DeleteCommand extends Command {
             List<PseudoCommand> children = new ArrayList<PseudoCommand>();
             for (final OsmPrimitive osm : toDelete) {
                 children.add(new PseudoCommand() {
-                    @Override public JLabel getDescription() {
-                        return new JLabel(
-                                tr("Deleted ''{0}''",
-                                        osm.getDisplayName(DefaultNameFormatter.getInstance())),
-                                        ImageProvider.get(OsmPrimitiveType.from(osm)), JLabel.HORIZONTAL);
+
+                    @Override public String getDescriptionText() {
+                        return tr("Deleted ''{0}''", osm.getDisplayName(DefaultNameFormatter.getInstance()));
+                    }
+
+                    @Override public Icon getDescriptionIcon() {
+                        return ImageProvider.get(OsmPrimitiveType.from(osm));
                     }
+
                     @Override public Collection<? extends OsmPrimitive> getParticipatingPrimitives() {
                         return Collections.singleton(osm);
                     }
diff --git a/src/org/openstreetmap/josm/command/DeletedStateConflictResolveCommand.java b/src/org/openstreetmap/josm/command/DeletedStateConflictResolveCommand.java
index ed978da..de64008 100644
--- a/src/org/openstreetmap/josm/command/DeletedStateConflictResolveCommand.java
+++ b/src/org/openstreetmap/josm/command/DeletedStateConflictResolveCommand.java
@@ -5,9 +5,10 @@ import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.util.Collection;
 
-import javax.swing.JLabel;
+import javax.swing.Icon;
 
 import org.openstreetmap.josm.data.conflict.Conflict;
+import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.gui.conflict.pair.MergeDecisionType;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
@@ -37,12 +38,14 @@ public class DeletedStateConflictResolveCommand extends ConflictResolveCommand {
         this.decision = decision;
     }
 
-    @Override public JLabel getDescription() {
-        return new JLabel(
-                        tr("Resolve conflicts in deleted state in {0}",conflict.getMy().getId()),
-                        ImageProvider.get("data", "object"),
-                        JLabel.HORIZONTAL
-        );
+    @Override
+    public String getDescriptionText() {
+        return tr("Resolve conflicts in deleted state in {0}", conflict.getMy().getId());
+    }
+
+    @Override
+    public Icon getDescriptionIcon() {
+        return ImageProvider.get("data", "object");
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/command/ModifiedConflictResolveCommand.java b/src/org/openstreetmap/josm/command/ModifiedConflictResolveCommand.java
index 9d7ddbc..1c81cca 100644
--- a/src/org/openstreetmap/josm/command/ModifiedConflictResolveCommand.java
+++ b/src/org/openstreetmap/josm/command/ModifiedConflictResolveCommand.java
@@ -5,6 +5,7 @@ import static org.openstreetmap.josm.tools.I18n.marktr;
 import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.util.Collection;
+import javax.swing.Icon;
 
 import javax.swing.JLabel;
 
@@ -32,18 +33,20 @@ public class ModifiedConflictResolveCommand extends ConflictResolveCommand {
         this.conflict = conflict;
     }
 
-    @Override public JLabel getDescription() {
+    @Override
+    public String getDescriptionText() {
         String msg = "";
         switch(OsmPrimitiveType.from(conflict.getMy())) {
         case NODE: msg = marktr("Set the ''modified'' flag for node {0}"); break;
         case WAY: msg = marktr("Set the ''modified'' flag for way {0}"); break;
         case RELATION: msg = marktr("Set the ''modified'' flag for relation {0}"); break;
         }
-        return new JLabel(
-                        tr(msg,conflict.getMy().getId()),
-                        ImageProvider.get("data", "object"),
-                        JLabel.HORIZONTAL
-        );
+        return tr(msg,conflict.getMy().getId());
+    }
+
+    @Override
+    public Icon getDescriptionIcon() {
+        return ImageProvider.get("data", "object");
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/command/MoveCommand.java b/src/org/openstreetmap/josm/command/MoveCommand.java
index 43417d9..85bf24d 100644
--- a/src/org/openstreetmap/josm/command/MoveCommand.java
+++ b/src/org/openstreetmap/josm/command/MoveCommand.java
@@ -8,6 +8,7 @@ import java.util.Collections;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
+import javax.swing.Icon;
 
 import javax.swing.JLabel;
 
@@ -130,8 +131,14 @@ public class MoveCommand extends Command {
         }
     }
 
-    @Override public JLabel getDescription() {
-        return new JLabel(trn("Move {0} node", "Move {0} nodes", nodes.size(), nodes.size()), ImageProvider.get("data", "node"), JLabel.HORIZONTAL);
+    @Override
+    public String getDescriptionText() {
+        return trn("Move {0} node", "Move {0} nodes", nodes.size(), nodes.size());
+    }
+
+    @Override
+    public Icon getDescriptionIcon() {
+        return ImageProvider.get("data", "node");
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/command/PseudoCommand.java b/src/org/openstreetmap/josm/command/PseudoCommand.java
index 6c30120..4186327 100644
--- a/src/org/openstreetmap/josm/command/PseudoCommand.java
+++ b/src/org/openstreetmap/josm/command/PseudoCommand.java
@@ -2,6 +2,8 @@
 package org.openstreetmap.josm.command;
 
 import java.util.Collection;
+import javax.swing.Icon;
+import javax.swing.JLabel;
 
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 
@@ -13,8 +15,42 @@ import org.openstreetmap.josm.data.osm.OsmPrimitive;
 abstract public class PseudoCommand {
     /**
      * Provide a description that can be presented in a list or tree view.
+     * @deprecated This abstract method is deprecated.
+     * On 2012-03-01, this abstract method will be removed.
+     * At the same moment, the methods {@link #getDescrpitionText()} and {@link #getDescrpitionIcon()}
+     * will be made abstract.
+     * For a smooth transition, replace {@link #getDescription()} by implementations of
+     * {@link #getDescrpitionText()} and {@link #getDescrpitionIcon()} as early as possible.
+     * {@link #getDescription()} is no longer abstract and can therefore be removed.
      */
-    abstract public Object getDescription();
+    @Deprecated
+    public Object getDescription() {
+        return null;
+    }
+
+    /**
+     * Provides a description text representing this command.
+     */
+    public String getDescriptionText() {
+        Object o = getDescription();
+        if (o instanceof JLabel) {
+            return ((JLabel) o).getText();
+        } else {
+            return o.toString();
+        }
+    }
+
+    /**
+     * Provides a descriptive icon of this command.
+     */
+    public Icon getDescriptionIcon() {
+        Object o = getDescription();
+        if (o instanceof JLabel) {
+            return ((JLabel) o).getIcon();
+        } else {
+            return null;
+        }
+    }
 
     /**
      * Return the primitives that take part in this command.
diff --git a/src/org/openstreetmap/josm/command/PurgeCommand.java b/src/org/openstreetmap/josm/command/PurgeCommand.java
index b025813..afc3aad 100644
--- a/src/org/openstreetmap/josm/command/PurgeCommand.java
+++ b/src/org/openstreetmap/josm/command/PurgeCommand.java
@@ -12,7 +12,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-import javax.swing.JLabel;
+import javax.swing.Icon;
 
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Hash;
@@ -251,8 +251,13 @@ public class PurgeCommand extends Command {
     }
 
     @Override
-    public Object getDescription() {
-        return new JLabel(trn("Purged {0} object", "Purged {0} objects", toPurge.size(), toPurge.size()), ImageProvider.get("data", "purge"), JLabel.HORIZONTAL);
+    public String getDescriptionText() {
+        return trn("Purged {0} object", "Purged {0} objects", toPurge.size(), toPurge.size());
+    }
+
+    @Override
+    public Icon getDescriptionIcon() {
+        return ImageProvider.get("data", "purge");
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/command/RelationMemberConflictResolverCommand.java b/src/org/openstreetmap/josm/command/RelationMemberConflictResolverCommand.java
index 7a0fb89..1f1849d 100644
--- a/src/org/openstreetmap/josm/command/RelationMemberConflictResolverCommand.java
+++ b/src/org/openstreetmap/josm/command/RelationMemberConflictResolverCommand.java
@@ -6,7 +6,7 @@ import static org.openstreetmap.josm.tools.I18n.tr;
 import java.util.Collection;
 import java.util.List;
 
-import javax.swing.JLabel;
+import javax.swing.Icon;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -45,12 +45,14 @@ public class RelationMemberConflictResolverCommand extends Command {
         this.mergedMembers = mergedMembers;
     }
 
-    @Override public JLabel getDescription() {
-        return new JLabel(
-                        tr("Resolve conflicts in member list of relation {0}", my.getId()),
-                        ImageProvider.get("data", "object"),
-                        JLabel.HORIZONTAL
-        );
+    @Override
+    public String getDescriptionText() {
+        return tr("Resolve conflicts in member list of relation {0}", my.getId());
+    }
+
+    @Override
+    public Icon getDescriptionIcon() {
+        return ImageProvider.get("data", "object");
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/command/RotateCommand.java b/src/org/openstreetmap/josm/command/RotateCommand.java
index 288b96f..ad6603e 100644
--- a/src/org/openstreetmap/josm/command/RotateCommand.java
+++ b/src/org/openstreetmap/josm/command/RotateCommand.java
@@ -5,7 +5,7 @@ import static org.openstreetmap.josm.tools.I18n.trn;
 
 import java.util.Collection;
 
-import javax.swing.JLabel;
+import javax.swing.Icon;
 
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.osm.Node;
@@ -98,7 +98,12 @@ public class RotateCommand extends TransformNodesCommand {
     }
 
     @Override
-    public JLabel getDescription() {
-        return new JLabel(trn("Rotate {0} node", "Rotate {0} nodes", nodes.size(), nodes.size()), ImageProvider.get("data", "node"), JLabel.HORIZONTAL);
+    public String getDescriptionText() {
+        return trn("Rotate {0} node", "Rotate {0} nodes", nodes.size(), nodes.size());
+    }
+
+    @Override
+    public Icon getDescriptionIcon() {
+        return ImageProvider.get("data", "node");
     }
 }
diff --git a/src/org/openstreetmap/josm/command/ScaleCommand.java b/src/org/openstreetmap/josm/command/ScaleCommand.java
index 69f4403..b01a2a2 100644
--- a/src/org/openstreetmap/josm/command/ScaleCommand.java
+++ b/src/org/openstreetmap/josm/command/ScaleCommand.java
@@ -5,7 +5,7 @@ import static org.openstreetmap.josm.tools.I18n.trn;
 
 import java.util.Collection;
 
-import javax.swing.JLabel;
+import javax.swing.Icon;
 
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.osm.Node;
@@ -80,8 +80,12 @@ public class ScaleCommand extends TransformNodesCommand {
     }
 
     @Override
-    public JLabel getDescription() {
-        return new JLabel(trn("Scale {0} node", "Scale {0} nodes", nodes.size(), nodes.size()), ImageProvider.get("data", "node"), JLabel.HORIZONTAL);
+    public String getDescriptionText() {
+        return trn("Scale {0} node", "Scale {0} nodes", nodes.size(), nodes.size());
     }
 
+    @Override
+    public Icon getDescriptionIcon() {
+        return ImageProvider.get("data", "node");
+    }
 }
diff --git a/src/org/openstreetmap/josm/command/SequenceCommand.java b/src/org/openstreetmap/josm/command/SequenceCommand.java
index 3dae28c..c8af9f7 100644
--- a/src/org/openstreetmap/josm/command/SequenceCommand.java
+++ b/src/org/openstreetmap/josm/command/SequenceCommand.java
@@ -7,6 +7,7 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
+import javax.swing.Icon;
 
 import javax.swing.JLabel;
 
@@ -86,8 +87,14 @@ public class SequenceCommand extends Command {
         }
     }
 
-    @Override public JLabel getDescription() {
-        return new JLabel(tr("Sequence")+": "+name, ImageProvider.get("data", "sequence"), JLabel.HORIZONTAL);
+    @Override
+    public String getDescriptionText() {
+        return tr("Sequence: {0}", name);
+    }
+
+    @Override
+    public Icon getDescriptionIcon() {
+        return ImageProvider.get("data", "sequence");
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/command/TagConflictResolveCommand.java b/src/org/openstreetmap/josm/command/TagConflictResolveCommand.java
index 8739d8a..6f37ad9 100644
--- a/src/org/openstreetmap/josm/command/TagConflictResolveCommand.java
+++ b/src/org/openstreetmap/josm/command/TagConflictResolveCommand.java
@@ -6,8 +6,8 @@ import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.util.Collection;
 import java.util.List;
+import javax.swing.Icon;
 
-import javax.swing.JLabel;
 
 import org.openstreetmap.josm.data.conflict.Conflict;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -54,18 +54,20 @@ public class TagConflictResolveCommand extends ConflictResolveCommand {
         this.mergeItems = mergeItems;
     }
 
-    @Override public JLabel getDescription() {
+    @Override
+    public String getDescriptionText() {
         String msg = "";
         switch(OsmPrimitiveType.from(conflict.getMy())) {
         case NODE: msg = marktr("Resolve {0} tag conflicts in node {1}"); break;
         case WAY: msg = marktr("Resolve {0} tag conflicts in way {1}"); break;
         case RELATION: msg = marktr("Resolve {0} tag conflicts in relation {1}"); break;
         }
-        return new JLabel(
-                        tr(msg,getNumDecidedConflicts(), conflict.getMy().getId()),
-                        ImageProvider.get("data", "object"),
-                        JLabel.HORIZONTAL
-        );
+        return tr(msg,getNumDecidedConflicts(), conflict.getMy().getId());
+    }
+
+    @Override
+    public Icon getDescriptionIcon() {
+        return ImageProvider.get("data", "object");
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/command/TransformNodesCommand.java b/src/org/openstreetmap/josm/command/TransformNodesCommand.java
index edafc44..d50dca1 100644
--- a/src/org/openstreetmap/josm/command/TransformNodesCommand.java
+++ b/src/org/openstreetmap/josm/command/TransformNodesCommand.java
@@ -8,7 +8,7 @@ import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.Map;
 
-import javax.swing.JLabel;
+import javax.swing.Icon;
 
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.coor.LatLon;
@@ -122,8 +122,13 @@ public abstract class TransformNodesCommand extends Command {
     }
 
     @Override
-    public JLabel getDescription() {
-        return new JLabel(trn("Transform {0} node", "Transform {0} nodes", nodes.size(), nodes.size()), ImageProvider.get("data", "node"), JLabel.HORIZONTAL);
+    public String getDescriptionText() {
+        return trn("Transform {0} node", "Transform {0} nodes", nodes.size(), nodes.size());
+    }
+
+    @Override
+    public Icon getDescriptionIcon() {
+        return ImageProvider.get("data", "node");
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/command/VersionConflictResolveCommand.java b/src/org/openstreetmap/josm/command/VersionConflictResolveCommand.java
index 319af03..6188d33 100644
--- a/src/org/openstreetmap/josm/command/VersionConflictResolveCommand.java
+++ b/src/org/openstreetmap/josm/command/VersionConflictResolveCommand.java
@@ -5,8 +5,7 @@ import static org.openstreetmap.josm.tools.I18n.marktr;
 import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.util.Collection;
-
-import javax.swing.JLabel;
+import javax.swing.Icon;
 
 import org.openstreetmap.josm.data.conflict.Conflict;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -32,18 +31,20 @@ public class VersionConflictResolveCommand extends ConflictResolveCommand {
         this.conflict = conflict;
     }
 
-    @Override public JLabel getDescription() {
+    @Override
+    public String getDescriptionText() {
         String msg = "";
         switch(OsmPrimitiveType.from(conflict.getMy())) {
         case NODE: msg = marktr("Resolve version conflict for node {0}"); break;
         case WAY: msg = marktr("Resolve version conflict for way {0}"); break;
         case RELATION: msg = marktr("Resolve version conflict for relation {0}"); break;
         }
-        return new JLabel(
-                        tr(msg,conflict.getMy().getId()),
-                        ImageProvider.get("data", "object"),
-                        JLabel.HORIZONTAL
-        );
+        return tr(msg, conflict.getMy().getId());
+    }
+
+    @Override
+    public Icon getDescriptionIcon() {
+        return ImageProvider.get("data", "object");
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/command/WayNodesConflictResolverCommand.java b/src/org/openstreetmap/josm/command/WayNodesConflictResolverCommand.java
index cb4f319..ce3beb9 100644
--- a/src/org/openstreetmap/josm/command/WayNodesConflictResolverCommand.java
+++ b/src/org/openstreetmap/josm/command/WayNodesConflictResolverCommand.java
@@ -6,7 +6,7 @@ import static org.openstreetmap.josm.tools.I18n.tr;
 import java.util.Collection;
 import java.util.List;
 
-import javax.swing.JLabel;
+import javax.swing.Icon;
 
 import org.openstreetmap.josm.data.conflict.Conflict;
 import org.openstreetmap.josm.data.osm.Node;
@@ -39,13 +39,14 @@ public class WayNodesConflictResolverCommand extends ConflictResolveCommand {
         this.conflict = (Conflict<Way>) conflict;
         this.mergedNodeList = mergedNodeList;
     }
+    @Override
+    public String getDescriptionText() {
+        return tr("Resolve conflicts in node list of way {0}", conflict.getMy().getId());
+    }
 
-    @Override public JLabel getDescription() {
-        return new JLabel(
-                        tr("Resolve conflicts in node list of way {0}", conflict.getMy().getId()),
-                        ImageProvider.get("data", "object"),
-                        JLabel.HORIZONTAL
-        );
+    @Override
+    public Icon getDescriptionIcon() {
+        return ImageProvider.get("data", "object");
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/gui/dialogs/CommandListMutableTreeNode.java b/src/org/openstreetmap/josm/gui/dialogs/CommandListMutableTreeNode.java
index 78d7363..c44bc91 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/CommandListMutableTreeNode.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/CommandListMutableTreeNode.java
@@ -1,6 +1,7 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.gui.dialogs;
 
+import javax.swing.JLabel;
 import javax.swing.tree.DefaultMutableTreeNode;
 
 import org.openstreetmap.josm.command.PseudoCommand;
@@ -14,7 +15,7 @@ public class CommandListMutableTreeNode extends DefaultMutableTreeNode {
     protected int idx;
 
     public CommandListMutableTreeNode(PseudoCommand cmd, int idx) {
-        super(cmd.getDescription());
+        super(new JLabel(cmd.getDescriptionText(), cmd.getDescriptionIcon(), JLabel.HORIZONTAL));
         this.cmd = cmd;
         this.idx = idx;
     }
