Index: src/org/openstreetmap/josm/actions/FollowLineAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/FollowLineAction.java	(revision 4914)
+++ src/org/openstreetmap/josm/actions/FollowLineAction.java	(working copy)
@@ -7,12 +7,16 @@
 import java.awt.event.KeyEvent;
 import java.util.Collection;
 import java.util.Iterator;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.mapmode.DrawAction;
 import org.openstreetmap.josm.command.ChangeCommand;
+import org.openstreetmap.josm.command.Command;
+import org.openstreetmap.josm.command.SelectCommand;
+import org.openstreetmap.josm.command.SequenceCommand;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
@@ -38,8 +42,8 @@
                 "followline.png",
                 tr("Continues drawing a line that shares nodes with another line."),
                 Shortcut.registerShortcut("tools:followline", tr(
-                "Tool: {0}", tr("Follow")),
-                KeyEvent.VK_F, Shortcut.GROUP_EDIT), true);
+                        "Tool: {0}", tr("Follow")),
+                        KeyEvent.VK_F, Shortcut.GROUP_EDIT), true);
     }
 
     @Override
@@ -62,12 +66,12 @@
         if (osmLayer == null)
             return;
         if (!(Main.map.mapMode instanceof DrawAction)) return; // We are not on draw mode
-        
+
         Collection<Node> selectedPoints = osmLayer.data.getSelectedNodes();
         Collection<Way> selectedLines = osmLayer.data.getSelectedWays();
         if ((selectedPoints.size() > 1) || (selectedLines.size() != 1)) // Unsuitable selection
             return;
-        
+
         Node last = ((DrawAction) Main.map.mapMode).getCurrentBaseNode();
         if (last == null)
             return;
@@ -82,8 +86,8 @@
         }
         List<OsmPrimitive> referrers = last.getReferrers();
         if (referrers.size() < 2) return; // There's nothing to follow
-        
-        Node newPoint = null;        
+
+        Node newPoint = null;
         Iterator<OsmPrimitive> i = referrers.iterator();
         while (i.hasNext()) {
             OsmPrimitive referrer = i.next();
@@ -95,8 +99,9 @@
                 continue;
             }
             Set<Node> points = toFollow.getNeighbours(last);
-            if (!points.remove(prev) || (points.size() == 0))
+            if (!points.remove(prev) || (points.size() == 0)) {
                 continue;
+            }
             if (points.size() > 1)    // Ambiguous junction?
                 return;
 
@@ -114,12 +119,21 @@
             } else {
                 newFollower.addNode(newPoint);
             }
-            Main.main.undoRedo.add(new ChangeCommand(follower, newFollower));
-            osmLayer.data.clearSelection();
-            osmLayer.data.addSelected(newFollower);
-            osmLayer.data.addSelected(newPoint);
-            // "viewport following" mode for tracing long features 
-            // from aerial imagery or GPS tracks. 
+
+            Collection<OsmPrimitive> newSelection = new LinkedList<OsmPrimitive>();
+
+            newSelection.add(newFollower);
+            newSelection.add(newPoint);
+
+            Collection<Command> cmds = new LinkedList<Command>();
+
+            cmds.add(new ChangeCommand(follower, newFollower));
+            cmds.add(new SelectCommand(newSelection));
+
+            Main.main.undoRedo.add(new SequenceCommand(tr("Follow line"), cmds));
+
+            // "viewport following" mode for tracing long features
+            // from aerial imagery or GPS tracks.
             if (Main.map.mapView.viewportFollowing) {
                 Main.map.mapView.smoothScrollTo(newPoint.getEastNorth());
             };
Index: src/org/openstreetmap/josm/command/SelectCommand.java
===================================================================
--- src/org/openstreetmap/josm/command/SelectCommand.java	(revision 0)
+++ src/org/openstreetmap/josm/command/SelectCommand.java	(revision 0)
@@ -0,0 +1,51 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.command;
+
+import static org.openstreetmap.josm.tools.I18n.trn;
+
+import java.util.Collection;
+
+import javax.swing.JLabel;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+
+/**
+ * Command that selects OSM primitives
+ *
+ * @author Landwirt
+ */
+public class SelectCommand extends Command {
+
+    private final Collection<OsmPrimitive> osm;
+
+    private Collection<OsmPrimitive> oldSelection;
+
+    public SelectCommand(Collection<OsmPrimitive> osm) {
+        this.osm = osm;
+    }
+
+    @Override
+    public void fillModifiedData(Collection<OsmPrimitive> modified, Collection<OsmPrimitive> deleted,
+            Collection<OsmPrimitive> added) {
+    }
+
+    @Override
+    public void undoCommand() {
+        Main.map.mapView.getEditLayer().data.setSelected(oldSelection);
+    }
+
+    @Override public boolean executeCommand() {
+        oldSelection = Main.map.mapView.getEditLayer().data.getSelected();
+
+        Main.map.mapView.getEditLayer().data.setSelected(osm);
+        return true;
+    }
+
+    @Override public JLabel getDescription() {
+        int size = osm != null ? osm.size() : 0;
+        return new JLabel(trn("Selected {0} object", "Selected {0} objects", size, size), null,
+                JLabel.HORIZONTAL
+                );
+    }
+}
