Index: /applications/editors/josm/plugins/utilsplugin2/src/utilsplugin2/UtilsPlugin2.java
===================================================================
--- /applications/editors/josm/plugins/utilsplugin2/src/utilsplugin2/UtilsPlugin2.java	(revision 26048)
+++ /applications/editors/josm/plugins/utilsplugin2/src/utilsplugin2/UtilsPlugin2.java	(revision 26049)
@@ -22,4 +22,5 @@
     JMenuItem adjNodes;
     JMenuItem unsNodes;
+    JMenuItem midNodes;
     JMenuItem adjWays;
     JMenuItem adjWaysAll;
@@ -55,4 +56,5 @@
         adjNodes = MainMenu.add(selectionMenu, new AdjacentNodesAction());
         unsNodes = MainMenu.add(selectionMenu, new UnselectNodesAction());
+        midNodes = MainMenu.add(selectionMenu, new MiddleNodesAction());
         adjWays = MainMenu.add(selectionMenu, new AdjacentWaysAction());
         adjWaysAll = MainMenu.add(selectionMenu, new ConnectedWaysAction());
@@ -81,4 +83,5 @@
         adjNodes.setEnabled(enabled);
         unsNodes.setEnabled(enabled);
+        midNodes.setEnabled(enabled);
         adjWays.setEnabled(enabled);
         adjWaysAll.setEnabled(enabled);
Index: /applications/editors/josm/plugins/utilsplugin2/src/utilsplugin2/selection/MiddleNodesAction.java
===================================================================
--- /applications/editors/josm/plugins/utilsplugin2/src/utilsplugin2/selection/MiddleNodesAction.java	(revision 26049)
+++ /applications/editors/josm/plugins/utilsplugin2/src/utilsplugin2/selection/MiddleNodesAction.java	(revision 26049)
@@ -0,0 +1,80 @@
+// License: GPL. Copyright 2011 by Alexei Kasatkin and others
+package utilsplugin2.selection;
+
+import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.KeyEvent;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+import javax.swing.JOptionPane;
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.JosmAction;
+import org.openstreetmap.josm.data.osm.*;
+
+import org.openstreetmap.josm.tools.Shortcut;
+
+/**
+ *    Selects nodes between two selected
+ */
+public class MiddleNodesAction extends JosmAction {
+
+    public static final boolean treeMode = false;
+
+    public MiddleNodesAction() {
+        super(tr("Middle nodes"), "midnodes", tr("Select middle nodes"),
+                Shortcut.registerShortcut("tools:midnodes", tr("Tool: {0}","Middle nodes"),
+                KeyEvent.VK_E,  Shortcut.GROUP_EDIT, KeyEvent.SHIFT_DOWN_MASK|KeyEvent.ALT_DOWN_MASK ), true);
+        putValue("help", ht("/Action/MiddleNodes"));
+    }
+
+    private  Set<Way> activeWays = new HashSet<Way>();
+
+    public void actionPerformed(ActionEvent e) {
+        Collection<OsmPrimitive> selection = getCurrentDataSet().getSelected();
+        Set<Node> selectedNodes = OsmPrimitive.getFilteredSet(selection, Node.class);
+
+        Set<Way> selectedWays = OsmPrimitive.getFilteredSet(getCurrentDataSet().getSelected(), Way.class);
+        
+        // if no 2 nodes and no ways are selected, do nothing
+        if (selectedNodes.size() != 2) {
+            JOptionPane.showMessageDialog(Main.parent,
+                    tr("Please select two nodes connected by way!"),
+                    tr("Warning"),
+                    JOptionPane.WARNING_MESSAGE);
+            return;
+        }
+
+        Set<Node> newNodes = new HashSet <Node>();
+        NodeWayUtils.addMiddle(selectedNodes, newNodes);
+        
+        // select only newly found nodes
+        newNodes.removeAll(selectedNodes);
+        getCurrentDataSet().addSelected(newNodes);
+        newNodes = null;
+
+    }
+
+    @Override
+    protected void updateEnabledState() {
+        if (getCurrentDataSet() == null) {
+            setEnabled(false);
+        } else {
+            updateEnabledState(getCurrentDataSet().getSelected());
+        }
+    }
+
+    @Override
+    protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
+        if (selection == null) {
+            setEnabled(false);
+            return;
+        }
+        setEnabled(!selection.isEmpty());
+    }
+
+
+
+}
Index: /applications/editors/josm/plugins/utilsplugin2/src/utilsplugin2/selection/NodeWayUtils.java
===================================================================
--- /applications/editors/josm/plugins/utilsplugin2/src/utilsplugin2/selection/NodeWayUtils.java	(revision 26048)
+++ /applications/editors/josm/plugins/utilsplugin2/src/utilsplugin2/selection/NodeWayUtils.java	(revision 26049)
@@ -2,4 +2,5 @@
 package utilsplugin2.selection;
 
+import java.util.Iterator;
 import java.util.Collection;
 import java.util.HashSet;
@@ -222,4 +223,46 @@
     }
 
+    static void addMiddle(Set<Node> selectedNodes, Set<Node> newNodes) {
+        Iterator<Node> it=selectedNodes.iterator();
+        Node n1 = it.next();
+        Node n2 = it.next();
+        Set<Way> ways=new HashSet<Way>();
+        ways.addAll(OsmPrimitive.getFilteredList(n1.getReferrers(), Way.class));
+        for (Way w: ways) {
+            System.out.println(w);
+            System.out.println("Node1"+n1);
+            System.out.println("Node2"+n2);
+
+            if (w.isUsable() && w.containsNode(n2) && w.containsNode(n1)) {
+                // Way w goes from n1 to n2
+                List <Node> nodes= w.getNodes();
+                int i1 = nodes.indexOf(n1);
+                int i2 = nodes.indexOf(n2);
+                int n = nodes.size();
+                if (i1>i2) { int p=i2; i2=i1; i1=p; } // now i1<i2
+                if (w.isClosed()) {
+                        if ((i2-i1)*2 <= n ) { // i1 ... i2
+                            for (int i=i1+1;i!=i2; i++) {
+                                newNodes.add(nodes.get(i));
+                            }
+                        } else { // i2 ... n-1 0 1 ... i1
+                            for (int i=i2+1;i!=i1; i=(i+1)%n) {
+                                newNodes.add(nodes.get(i));
+                            }
+                        }
+                    } else {
+                        for (int i=i1+1;i<i2;i++) {
+                            newNodes.add(nodes.get(i));
+                        }
+                    }
+            }
+            if (newNodes.size()==0) {
+                JOptionPane.showMessageDialog(Main.parent,
+                    tr("Please select two nodes connected by way!"),
+                    tr("Warning"),
+                    JOptionPane.WARNING_MESSAGE);
+            }
+        }
+    }
 
 
