diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableLinkedCellRenderer.java b/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableLinkedCellRenderer.java
index 5344a6e..6a25ec7 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableLinkedCellRenderer.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableLinkedCellRenderer.java
@@ -1,11 +1,9 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.gui.dialogs.relation;
 
-import java.awt.BasicStroke;
 import java.awt.Color;
 import java.awt.Component;
 import java.awt.Graphics;
-import java.awt.Graphics2D;
 import java.awt.Image;
 
 import javax.swing.JTable;
@@ -41,11 +39,7 @@ public class MemberTableLinkedCellRenderer extends MemberTableCellRenderer {
             return;
 
         int ymax=this.getSize().height - 1;
-        int xloop = 10;
-        int xowloop = 0;
-        if(value.isOnewayLoopForwardPart) xowloop = -3;
-        if(value.isOnewayLoopBackwardPart) xowloop = 3;
-        
+        int xloop = 8;
         int xoff = this.getSize().width / 2;
         if (value.isLoop) {
             xoff -= xloop / 2 - 1;
@@ -57,10 +51,7 @@ public class MemberTableLinkedCellRenderer extends MemberTableCellRenderer {
 
         if (value.linkPrev) {
             g.setColor(Color.black);
-            if(value.isOnewayHead)
-                g.fillRect(xoff - 1, 0, 3, 1);
-            else
-                g.fillRect(xoff - 1 + xowloop, 0, 3, 1);
+            g.fillRect(xoff - 1, 0, 3, 1);
             y1 = 0;
         } else {
             if (value.isLoop) {
@@ -72,20 +63,14 @@ public class MemberTableLinkedCellRenderer extends MemberTableCellRenderer {
             }
             else {
                 g.setColor(Color.red);
-                if(value.isOnewayHead)
-                    g.drawRect(xoff-1, p - 3 - w, w, w);
-                else
-                    g.drawRect(xoff-1 + xowloop, p - 1 - w, w, w);
+                g.drawRect(xoff-1, p - 1 - w, w, w);
                 y1 = p;
             }
         }
 
         if (value.linkNext) {
             g.setColor(Color.black);
-            if(value.isOnewayTail)
-                g.fillRect(xoff - 1, ymax, 3, 1);
-            else
-                g.fillRect(xoff - 1 + xowloop, ymax, 3, 1);
+            g.fillRect(xoff - 1, ymax, 3, 1);
             y2 = ymax;
         } else {
             if (value.isLoop) {
@@ -98,55 +83,18 @@ public class MemberTableLinkedCellRenderer extends MemberTableCellRenderer {
             }
             else {
                 g.setColor(Color.red);
-                if(value.isOnewayTail)
-                    g.drawRect(xoff-1, ymax - p + 3, w, w);
-                else
-                    g.drawRect(xoff-1 + xowloop, ymax - p + 1, w, w);
-//                g.drawRect(xoff-1, ymax - p + 1, ssw, w);
+                g.drawRect(xoff-1, ymax - p + 1, w, w);
                 y2 = ymax - p;
             }
         }
 
         /* vertical lines */
         g.setColor(Color.black);
+        g.drawLine(xoff, y1, xoff, y2);
         if (value.isLoop) {
             g.drawLine(xoff+xloop, y1, xoff+xloop, y2);
         }
 
-        if (value.isOnewayHead) {
-            setDotted(g);
-            y1 = 7;
-
-            int xValues [] = {xoff - xowloop + 1, xoff - xowloop + 1, xoff};
-            int yValues [] = {ymax, y1+1, 1};
-            g.drawPolyline(xValues, yValues, 3);
-            unsetDotted(g);
-            g.drawLine(xoff + xowloop, y1+1, xoff, 1);
-        }
-
-        if(value.isOnewayTail){
-            setDotted(g);
-            y2 = ymax - 7;
-
-            int xValues [] = {xoff+1, xoff - xowloop + 1, xoff - xowloop + 1};
-            int yValues [] = {ymax-1, y2, y1};
-            g.drawPolyline(xValues, yValues, 3);
-            unsetDotted(g);
-            g.drawLine(xoff + xowloop, y2, xoff, ymax-1);
-        }
-
-        if ((value.isOnewayLoopForwardPart || value.isOnewayLoopBackwardPart) && !value.isOnewayTail && !value.isOnewayHead) {
-            setDotted(g);
-            g.drawLine(xoff - xowloop+1, y1, xoff - xowloop+1, y2 + 1);
-            unsetDotted(g);
-        }
-
-        if (!value.isOnewayLoopForwardPart && !value.isOnewayLoopBackwardPart){
-            g.drawLine(xoff, y1, xoff, y2);
-        }
-        
-        g.drawLine(xoff+xowloop, y1, xoff+xowloop, y2);
-      
         /* special icons */
         Image arrow = null;
         switch (value.direction) {
@@ -157,42 +105,13 @@ public class MemberTableLinkedCellRenderer extends MemberTableCellRenderer {
             arrow = arrowUp;
             break;
         }
-        if (value.direction == Direction.ROUNDABOUT_LEFT) {
+        if ((arrow != null) && (value.linkPrev || value.linkNext)) {
+            g.drawImage(arrow, xoff-3, (y1 + y2) / 2 - 2, null);
+        }
+        else if (value.direction == Direction.ROUNDABOUT_LEFT) {
             g.drawImage(roundabout_left, xoff-6, 1, null);
         } else if (value.direction == Direction.ROUNDABOUT_RIGHT) {
             g.drawImage(roundabout_right, xoff-6, 1, null);
         }
-
-        if (!value.isOnewayLoopForwardPart && !value.isOnewayLoopBackwardPart &&
-                (arrow != null)) {
-            g.drawImage(arrow, xoff-3, (y1 + y2) / 2 - 2, null);
-        }
-
-        if (value.isOnewayLoopBackwardPart) {
-            if(value.isOnewayLoopForwardPart) {
-                if(arrow == arrowDown)
-                    arrow = arrowUp;
-                else if (arrow == arrowUp)
-                    arrow = arrowDown;
-            }
-        }
-
-        if ((arrow != null)) {
-            g.drawImage(arrow, xoff+xowloop-3, (y1 + y2) / 2 - 2, null);
-        }
-    }
-
-    private void setDotted(Graphics g) {
-        ((Graphics2D)g).setStroke(new BasicStroke(
-              1f,
-              BasicStroke.CAP_BUTT,
-              BasicStroke.CAP_BUTT,
-              5f,
-              new float[] {1f, 2f},
-              0f));
-    }
-
-    private void unsetDotted(Graphics g) {
-        ((Graphics2D)g).setStroke(new BasicStroke());
     }
 }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java b/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java
index b254ef3..beb01aa 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java
@@ -57,8 +57,6 @@ public class MemberTableModel extends AbstractTableModel implements TableModelLi
     private CopyOnWriteArrayList<IMemberModelListener> listeners;
     private OsmDataLayer layer;
 
-    private final int UNCONNECTED = Integer.MIN_VALUE;
-
     /**
      * constructor
      */
@@ -788,9 +786,6 @@ public class MemberTableModel extends AbstractTableModel implements TableModelLi
         setSelectedMembers(sortedMembers);
     }
 
-    private Direction determineDirection(int ref_i, Direction ref_direction, int k) {
-        return determineDirection(ref_i, ref_direction, k, false);
-    }
     /**
      * Determines the direction of way k with respect to the way ref_i.
      * The way ref_i is assumed to have the direction ref_direction and
@@ -800,10 +795,10 @@ public class MemberTableModel extends AbstractTableModel implements TableModelLi
      *
      * Else the direction is given as follows:
      * Let the relation be a route of oneway streets, and someone travels them in the given order.
-     * Direction is FORWARD if it is legal and BACKWARD if it is illegal to do so for the given way.
+     * Direction is FORWARD if it is legel and BACKWARD if it is illegal to do so for the given way.
      *
      **/
-    private Direction determineDirection(int ref_i, Direction ref_direction, int k, boolean reversed) {
+    private Direction determineDirection(int ref_i,Direction ref_direction, int k) {
         if (ref_i < 0 || k < 0 || ref_i >= members.size() || k >= members.size())
             return NONE;
         if (ref_direction == NONE)
@@ -829,10 +824,10 @@ public class MemberTableModel extends AbstractTableModel implements TableModelLi
 
         switch (ref_direction) {
         case FORWARD:
-                refNodes.add(way_ref.lastNode());
+            refNodes.add(way_ref.lastNode());
             break;
         case BACKWARD:
-                refNodes.add(way_ref.firstNode());
+            refNodes.add(way_ref.firstNode());
             break;
         case ROUNDABOUT_LEFT:
         case ROUNDABOUT_RIGHT:
@@ -852,19 +847,6 @@ public class MemberTableModel extends AbstractTableModel implements TableModelLi
                     if (n == nn)
                         return roundaboutType(k);
                 }
-            } else if(isOneway(m)) {
-                if (n == RelationNodeMap.firstOnewayNode(m) && !reversed) {
-                    if(m.getRole().equals("backward"))
-                        return BACKWARD;
-                    else
-                        return FORWARD;
-                }
-                if (n == RelationNodeMap.lastOnewayNode(m) && reversed) {
-                    if(m.getRole().equals("backward"))
-                        return FORWARD;
-                    else
-                        return BACKWARD;
-                }
             } else {
                 if (n == way.firstNode())
                     return FORWARD;
@@ -949,7 +931,7 @@ public class MemberTableModel extends AbstractTableModel implements TableModelLi
      */
     public void updateLinks() {
         connectionType = null;
-        List<WayConnectionType> con = new ArrayList<WayConnectionType>();
+        ArrayList<WayConnectionType> con = new ArrayList<WayConnectionType>();
 
         for (int i=0; i<members.size(); ++i) {
             con.add(null);
@@ -958,10 +940,6 @@ public class MemberTableModel extends AbstractTableModel implements TableModelLi
         int firstGroupIdx=0;
         boolean resetFirstGoupIdx=false;
 
-        int lastForwardWay = UNCONNECTED;
-        int lastBackwardWay = UNCONNECTED;
-        boolean onewayBeginning = false;
-
         for (int i=0; i<members.size(); ++i) {
             if (resetFirstGoupIdx) {
                 firstGroupIdx = i;
@@ -983,97 +961,13 @@ public class MemberTableModel extends AbstractTableModel implements TableModelLi
             }
 
             boolean linkPrev = (i != firstGroupIdx);
-            boolean linkNext = false;
-
-            con.set(i, new WayConnectionType(false));
-
-            if(isOneway(m) || roundaboutType(i) != NONE){
-                if(i>0 && con.get(i-1).isOnewayTail)
-                    con.get(i).isOnewayHead = true;
-                if(lastBackwardWay == UNCONNECTED && lastForwardWay == UNCONNECTED){ //Beginning of new oneway
-                    con.get(i).isOnewayHead = true;
-                    lastForwardWay = i-1;
-                    lastBackwardWay = i;
-                    onewayBeginning = true;
-                }
+            boolean linkNext;
+            Direction dir;
+            if (linkPrev) {
+                dir = determineDirection(i-1, con.get(i-1).direction, i);
+                linkNext = (determineDirection(i, dir, i+1) != NONE);
             }
-
-            Direction dir = NONE;
-            if (linkPrev) {     
-                if(lastBackwardWay != UNCONNECTED && lastForwardWay != UNCONNECTED) {
-                    Direction dirFW = determineDirection(lastForwardWay, con.get(lastForwardWay).direction, i);
-                    Direction dirBW = NONE;
-                    if(onewayBeginning) {
-                        if(lastBackwardWay != i)
-                            dirBW = determineDirection(lastBackwardWay, reverse(con.get(lastBackwardWay).direction), i, true);
-                        if(dirBW != NONE)
-                            onewayBeginning = false;
-                    } else
-                        dirBW = determineDirection(lastBackwardWay, con.get(lastBackwardWay).direction, i, true);
-
-                    if(isOneway(m) || roundaboutType(i) != NONE) {
-                        if(dirBW != NONE){
-                            dir = dirBW;
-                            lastBackwardWay = i;
-                            con.get(i).isOnewayLoopBackwardPart = true;
-                        }
-                        if(dirFW != NONE){
-                            dir = dirFW;
-                            lastForwardWay = i;
-                            con.get(i).isOnewayLoopForwardPart = true;
-                        }
-                        if(dirFW == NONE && dirBW == NONE) {
-    //                        unconnectPreviousLink(con, i, true);
-    //                        unconnectPreviousLink(con, i, false);
-                            if(i>0) con.get(i-1).linkNext = false;
-                            if(isOneway(m)){
-                                lastForwardWay = i-1;
-                                lastBackwardWay = i;
-                            } else {
-                                lastForwardWay = UNCONNECTED;
-                                lastBackwardWay = UNCONNECTED;
-                            }
-                            firstGroupIdx = i;
-                            linkPrev = false;
-                        }
-
-                        if(dirFW != NONE && dirBW != NONE) {
-                            if(i+1<members.size() && determineDirection(i, dirFW, i+1) != NONE) {
-                                con.get(i).isOnewayLoopBackwardPart = false;
-                                dirBW = NONE;
-                                dir = dirFW;
-                            } else {
-                                con.get(i).isOnewayLoopForwardPart = false;
-                                dirFW = NONE;
-                                dir = dirBW;
-                            }
-
-                            con.get(i).isOnewayTail = true;
-                        }
-
-                        linkNext = (i+1!=members.size());
-                    } else {
-                        lastForwardWay = UNCONNECTED;
-                        lastBackwardWay = UNCONNECTED;
-                        if(dirFW == NONE | dirBW == NONE) {
-                            linkPrev = false;
-                        }
-                    }
-                }
-
-                if(!isOneway(m)) {
-                    dir = determineDirection(i-1, con.get(i-1).direction, i);
-                    linkNext = (determineDirection(i, dir, i+1) != NONE);
-                }                   
-            }
-            
-            if (!linkPrev) {
-                if (isOneway(m)){
-                    if(m.getRole().equals("backward")) dir = BACKWARD;
-                    else dir = FORWARD;
-                    con.get(i).isOnewayLoopForwardPart = true;
-                    lastForwardWay = i;
-                } else
+            else {
                 if (roundaboutType(i) != NONE) {
                     dir = determineDirection(i, roundaboutType(i), i+1) != NONE ? roundaboutType(i) : NONE;
                 } else { /** guess the direction and see if it fits with the next member */
@@ -1091,17 +985,14 @@ public class MemberTableModel extends AbstractTableModel implements TableModelLi
 
             }
 
-            con.get(i).direction = dir;
-            con.get(i).linkNext = linkNext;
-            con.get(i).linkPrev = linkPrev;
+            con.set(i, new WayConnectionType(linkPrev, linkNext, dir));
 
             if (! linkNext) {
                 boolean loop;
-                int lastGroupIdx = i;
-                if (lastGroupIdx == firstGroupIdx) { //is primitive loop
-                    loop = determineDirection(lastGroupIdx, FORWARD, lastGroupIdx) == FORWARD;
-               } else {
-                    loop = determineDirection(lastGroupIdx, con.get(lastGroupIdx).direction, firstGroupIdx) == con.get(firstGroupIdx).direction;
+                if (i == firstGroupIdx) {
+                    loop = determineDirection(i, FORWARD, i) == FORWARD;
+                } else {
+                    loop = determineDirection(i, dir, firstGroupIdx) == con.get(firstGroupIdx).direction;
                 }
                 if (loop) {
                     for (int j=firstGroupIdx; j <= i; ++j) {
@@ -1111,30 +1002,9 @@ public class MemberTableModel extends AbstractTableModel implements TableModelLi
                 resetFirstGoupIdx = true;
             }
         }
-
         connectionType = con;
         //        for (int i=0; i<con.size(); ++i) {
         //            System.err.println(con.get(i));
         //        }
     }
-
-//    private static void unconnectPreviousLink(List<WayConnectionType> con, int beg, boolean backward){
-//        int i = beg;
-//        while(true){
-//            WayConnectionType t = con.get(i--);
-//            t.isOnewayOppositeConnected = false;
-//            if(backward && t.isOnewayLoopBackwardPart) break;
-//            if(!backward && t.isOnewayLoopForwardPart) break;
-//        }
-//    }
-
-    private static Direction reverse(Direction dir){
-        if(dir == FORWARD) return BACKWARD;
-        if(dir == BACKWARD) return FORWARD;
-        return dir;
-    }
-
-    public static boolean isOneway(RelationMember m){
-        return m.getRole().equals("forward") || m.getRole().equals("backward");
-    }
 }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/RelationNodeMap.java b/src/org/openstreetmap/josm/gui/dialogs/relation/RelationNodeMap.java
index 1f4b388..d6e1d8d 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/RelationNodeMap.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/RelationNodeMap.java
@@ -4,9 +4,9 @@ package org.openstreetmap.josm.gui.dialogs.relation;
 import static org.openstreetmap.josm.gui.dialogs.relation.WayConnectionType.Direction.NONE;
 
 import java.util.ArrayList;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import java.util.TreeMap;
 import java.util.TreeSet;
 
@@ -29,330 +29,125 @@ import org.openstreetmap.josm.data.osm.Way;
  *
  */
 public class RelationNodeMap {
-    private class NodesWays{
-        public Map<Node, Set<Integer>> nodes = new TreeMap<Node, Set<Integer>>();
-        public Map<Integer, Set<Node>> ways = new TreeMap<Integer, Set<Node>>();
-        public boolean oneWay;
-        public NodesWays(boolean oneWay){
-            this.oneWay = oneWay;
-        }
-    }
-
     /*
      * the maps. (Need TreeMap for efficiency.)
      */
-    private NodesWays map = new NodesWays(false);
-    /*
-     * Maps for oneways (forward/backward roles)
-     */
-
-    private NodesWays onewayMap = new NodesWays(true);
-    private NodesWays onewayReverseMap = new NodesWays(true);
+    private TreeMap<Node, TreeSet<Integer>> nodesMap;
+    private TreeMap<Integer, TreeSet<Node>> waysMap;
     /*
      * Used to keep track of what members are done.
      */
-    private Set<Integer> remaining;
-    private Map<Integer, Set<Node>> remainingOneway = new TreeMap<Integer, Set<Node>>();;
+    private TreeSet<Integer> remaining;
 
     /**
      * All members that are incomplete or not a way
      */
     private List<Integer> notSortable = new ArrayList<Integer>();
 
-    public static Node firstOnewayNode(RelationMember m){
-        if(!m.isWay()) return null;
-        if(m.getRole().equals("backward")) return m.getWay().lastNode();
-        return m.getWay().firstNode();
-    }
-
-    public static Node lastOnewayNode(RelationMember m){
-        if(!m.isWay()) return null;
-        if(m.getRole().equals("backward")) return m.getWay().firstNode();
-        return m.getWay().lastNode();
-    }
-
     RelationNodeMap(List<RelationMember> members) {
-        map.nodes = new TreeMap<Node, Set<Integer>>();
-        map.ways = new TreeMap<Integer, Set<Node>>();
+        nodesMap = new TreeMap<Node, TreeSet<Integer>>();
+        waysMap = new TreeMap<Integer, TreeSet<Node>>();
 
         for (int i = 0; i < members.size(); ++i) {
             RelationMember m = members.get(i);
-            if (m.getMember().isIncomplete() || !m.isWay()) {
+            if (m.getMember().isIncomplete() || !m.isWay())
+            {
                 notSortable.add(i);
-                continue;
             }
-
-            Way w = m.getWay();
-            if ((MemberTableModel.roundaboutType(w) != NONE)) {
-                for (Node nd : w.getNodes()) {
-                    addPair(nd, i);
+            else {
+                Way w = m.getWay();
+                if (MemberTableModel.roundaboutType(w) != NONE) {
+                    for (Node nd : w.getNodes()) {
+                        addPair(nd, i);
+                    }
+                } else {
+                    addPair(w.firstNode(), i);
+                    addPair(w.lastNode(), i);
                 }
-            } else if(MemberTableModel.isOneway(m)) {
-                addNodeWayMap(firstOnewayNode(m), i);
-                addWayNodeMap(lastOnewayNode(m), i);
-                addNodeWayMapReverse(lastOnewayNode(m), i);
-                addWayNodeMapReverse(firstOnewayNode(m), i);
-                addRemainingForward(firstOnewayNode(m), i);
-                addRemainingForward(lastOnewayNode(m), i);
-            } else {
-                addPair(w.firstNode(), i);
-                addPair(w.lastNode(), i);
             }
         }
 
         remaining = new TreeSet<Integer>();
-        remaining.addAll(map.ways.keySet());
+        for (Integer k : waysMap.keySet()) {
+            remaining.add(k);
+        }
 
         /*
          * Clean up the maps, i.e. remove nodes from roundabouts and dead ends that
          * cannot be used in future. (only for performance)
          */
-//        Iterator<Map.Entry<Node,TreeSet<Integer>>> it = map.nodes.entrySet().iterator();
-//        while (it.hasNext()) {
-//            Map.Entry<Node,TreeSet<Integer>> nodeLinks = it.next();
-//
-//            if (nodeLinks.getValue().size() < 2) {
-//                if (nodeLinks.getValue().size() != 1) throw new AssertionError();
-//
-//                Integer d_way = nodeLinks.getValue().iterator().next();
-//                TreeSet<Node> d_way_nodes = map.ways.get(d_way);
-//                d_way_nodes.remove(nodeLinks.getKey());
-//
-//                it.remove();
-//                continue;
-//            }
-//        }
-            }
+        Iterator<Map.Entry<Node,TreeSet<Integer>>> it = nodesMap.entrySet().iterator();
+        while (it.hasNext()) {
+            Map.Entry<Node,TreeSet<Integer>> nodeLinks = it.next();
 
-    private void addPair(Node n, int i) {
-        Set<Integer> ts = map.nodes.get(n);
-        if (ts == null) {
-            ts = new TreeSet<Integer>();
-            map.nodes.put(n, ts);
-        }
-        ts.add(i);
+            if (nodeLinks.getValue().size() < 2) {
+                if (nodeLinks.getValue().size() != 1) throw new AssertionError();
 
-        Set<Node> ts2 = map.ways.get(i);
-        if (ts2 == null) {
-            ts2 = new TreeSet<Node>();
-            map.ways.put(i, ts2);
-        }
-        ts2.add(n);
-    }
+                Integer d_way = nodeLinks.getValue().iterator().next();
+                TreeSet<Node> d_way_nodes = waysMap.get(d_way);
+                d_way_nodes.remove(nodeLinks.getKey());
 
-    private void addNodeWayMap(Node n, int i) {
-        Set<Integer> ts = onewayMap.nodes.get(n);
-        if (ts == null) {
-            ts = new TreeSet<Integer>();
-            onewayMap.nodes.put(n, ts);
-        }
-        ts.add(i);
-    }
-
-    private void addWayNodeMap(Node n, int i) {
-        Set<Node> ts2 = onewayMap.ways.get(i);
-        if (ts2 == null) {
-            ts2 = new TreeSet<Node>();
-            onewayMap.ways.put(i, ts2);
+                it.remove();
+                continue;
+            }
         }
-        ts2.add(n);
     }
 
-    private void addNodeWayMapReverse(Node n, int i) {
-        Set<Integer> ts = onewayReverseMap.nodes.get(n);
+    private void addPair(Node n, int i) {
+        TreeSet<Integer> ts = nodesMap.get(n);
         if (ts == null) {
             ts = new TreeSet<Integer>();
-            onewayReverseMap.nodes.put(n, ts);
+            nodesMap.put(n, ts);
         }
         ts.add(i);
-    }
 
-    private void addWayNodeMapReverse(Node n, int i) {
-        Set<Node> ts2 = onewayReverseMap.ways.get(i);
+        TreeSet<Node> ts2 = waysMap.get(i);
         if (ts2 == null) {
             ts2 = new TreeSet<Node>();
-            onewayReverseMap.ways.put(i, ts2);
+            waysMap.put(i, ts2);
         }
         ts2.add(n);
     }
 
-    private void addRemainingForward(Node n, int i) {
-        Set<Node> ts2 = remainingOneway.get(i);
-        if (ts2 == null) {
-            ts2 = new TreeSet<Node>();
-            remainingOneway.put(i, ts2);
-        }
-        ts2.add(n);
-    }
-
-    Integer firstOneway = null;
-    Node lastOnewayNode = null;
-    Node firstCircular = null;
-
     /**
      * Return a relation member that is linked to the
-     * member 'i', but has not been popped yet.
+     * member 'i', but has not been popped jet.
      * Return null if there is no such member left.
      */
-    public Integer popAdjacent(Integer way) {
-        if (lastOnewayNode != null) return popBackwardOnewayPart(way);
-        if (firstOneway != null) return popForwardOnewayPart(way);
-
-        if (map.ways.containsKey(way)){
-            for (Node n : map.ways.get(way)) {
-                Integer i = deleteAndGetAdjacentNode(map, n);
-                if(i != null) return i;
-
-                Integer j = deleteAndGetAdjacentNode(onewayMap, n);
-                if(j != null) {
-                    firstOneway = j;
-                    return j;
-                }
-            }
-        }
-        
-        firstOneway = way;
-        return popForwardOnewayPart(way);
-    }
-
-    private Integer popForwardOnewayPart(Integer way) {
-        if(onewayMap.ways.containsKey(way)) {
-            for (Node n : onewayMap.ways.get(way)) {
-                Integer i = findAdjacentWay(onewayMap, n);
-                if(i == null) continue;
-
-                lastOnewayNode = processBackwardIfEndOfLoopReached(i);
-                if(lastOnewayNode != null){
-                    return popBackwardOnewayPart(firstOneway);
-                }
-
-                deleteWayNode(onewayMap, i, n);
-                return i;
-            }
-        }
-        
-        firstOneway = null;
-        return null;
-    }
-
-    private Node processBackwardIfEndOfLoopReached(Integer way) { //find if we didn't reach end of the loop (and process backward part)
-        if (onewayReverseMap.ways.containsKey(way)) {
-            for (Node n : onewayReverseMap.ways.get(way)) {
-                if((map.nodes.containsKey(n))
-                        || (onewayMap.nodes.containsKey(n) && onewayMap.nodes.get(n).size() > 1)) {
-                    return n;
-                }
-                if(firstCircular != null && firstCircular == n) {
-                    return firstCircular;
-                }
-            }
-        }
-        return null;
-    }
-    
-    private Integer popBackwardOnewayPart(int way){
-        if (lastOnewayNode != null) {
-            TreeSet<Node> nodes = new TreeSet<Node>();
-            if (onewayReverseMap.ways.containsKey(way)) nodes.addAll(onewayReverseMap.ways.get(way));
-            if (map.ways.containsKey(way)) nodes.addAll(map.ways.get(way));
-            for (Node n : nodes) {
-                if(n == lastOnewayNode) { //if oneway part ends
-                    firstOneway = null;
-                    lastOnewayNode = null;
-                    Integer j = deleteAndGetAdjacentNode(map, n);
-                    if(j != null) return j;
-
-                    Integer k = deleteAndGetAdjacentNode(onewayMap, n);
-                    if(k != null) {
-                        firstOneway = k;
-                        return k;
-                    }
-                }
-
-                Integer j = deleteAndGetAdjacentNode(onewayReverseMap, n);
-                if(j != null) return j;
+    public Integer popAdjacent(Integer i) {
+        TreeSet<Node> nodes = waysMap.get(i);
+        for (Node n : nodes) {
+            TreeSet<Integer> adj = nodesMap.get(n);
+            if (!adj.isEmpty()) {
+                Integer j = adj.iterator().next();
+                done(j);
+                waysMap.get(j).remove(n);
+                return j;
             }
         }
-
-        firstOneway = null;
-        lastOnewayNode = null;
-        
         return null;
     }
 
     /**
-     * find next node in nw NodeWays structure, if the node is found delete and return it
-     * @param nw
-     * @param n
-     * @return node next to n
-     */
-    private Integer deleteAndGetAdjacentNode(NodesWays nw, Node n){
-        Integer j = findAdjacentWay(nw, n);
-        if(j == null) return null;
-        deleteWayNode(nw, j, n);
-        return j;
-    }
-
-    private Integer findAdjacentWay(NodesWays nw, Node n) {
-        Set<Integer> adj = nw.nodes.get(n);
-        if (adj == null || adj.isEmpty()) return null;
-        Integer j = adj.iterator().next();
-        return j;
-    }
-
-    private void deleteWayNode(NodesWays nw, Integer way, Node n){
-        if(nw.oneWay)
-            doneOneway(way);
-        else
-            done(way);
-        nw.ways.get(way).remove(n);
-    }
-
-    /**
      * Returns some remaining member or null if
      * every sortable member has been processed.
      */
     public Integer pop() {
-        if (!remaining.isEmpty()){
-            Integer i = remaining.iterator().next();
-            done(i);
-            return i;
-        }
-
-        if (remainingOneway.isEmpty()) return null;
-        for(Integer i :remainingOneway.keySet()){ //find oneway, whic is connected to more than one way (is between two oneway loops)
-            for(Node n : onewayReverseMap.ways.get(i)){
-                if(onewayReverseMap.nodes.containsKey(n) && onewayReverseMap.nodes.get(n).size() > 1) {
-                    doneOneway(i);
-                    firstCircular = n;
-                    return i;
-                }
-            }
-        }
-
-        Integer i = remainingOneway.keySet().iterator().next();
-        doneOneway(i);
+        if (remaining.isEmpty()) return null;
+        Integer i = remaining.iterator().next();
+        done(i);
         return i;
     }
 
     /**
      * This relation member has been processed.
-     * Remove references in the map.nodes.
+     * Remove references in the nodesMap.
      */
-    private void doneOneway(Integer i) {
-        Set<Node> nodesForward = remainingOneway.get(i);
-        for (Node n : nodesForward) {
-            if(onewayMap.nodes.containsKey(n)) onewayMap.nodes.get(n).remove(i);
-            if(onewayReverseMap.nodes.containsKey(n)) onewayReverseMap.nodes.get(n).remove(i);
-        }
-        remainingOneway.remove(i);
-    }
-
     private void done(Integer i) {
         remaining.remove(i);
-        Set<Node> nodes = map.ways.get(i);
+        TreeSet<Node> nodes = waysMap.get(i);
         for (Node n : nodes) {
-            boolean result = map.nodes.get(n).remove(i);
+            boolean result = nodesMap.get(n).remove(i);
             if (!result) throw new AssertionError();
         }
     }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/WayConnectionType.java b/src/org/openstreetmap/josm/gui/dialogs/relation/WayConnectionType.java
index 5beb882..347c722 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/WayConnectionType.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/WayConnectionType.java
@@ -10,8 +10,8 @@ public class WayConnectionType {
     private final boolean invalid;
 
     /** True, if linked to the previous / next member.  */
-    public boolean linkPrev;
-    public boolean linkNext;
+    public final boolean linkPrev;
+    public final boolean linkNext;
 
     /**
      * direction is FORWARD if the first node of this way is connected to the previous way
@@ -22,7 +22,7 @@ public class WayConnectionType {
      * If there is no connection to the previous or next member, then
      * direction has the value NONE.
      */
-    public Direction direction;
+    public final Direction direction;
 
     public enum Direction {
         FORWARD, BACKWARD, ROUNDABOUT_LEFT, ROUNDABOUT_RIGHT, NONE;
@@ -35,12 +35,6 @@ public class WayConnectionType {
     /** True, if the element is part of a closed loop of ways. */
     public boolean isLoop;
 
-    public boolean isOnewayLoopForwardPart = false;
-    public boolean isOnewayLoopBackwardPart = false;
-    public boolean isOnewayHead = false;
-    public boolean isOnewayTail = false;
-//    public boolean isOnewayOppositeConnected = true;
-
     public boolean isRoundabout = false;
 
     public WayConnectionType(boolean linkPrev, boolean linkNext, Direction direction) {
@@ -51,10 +45,6 @@ public class WayConnectionType {
         invalid = false;
     }
 
-    public WayConnectionType(boolean invalid){
-        this.invalid = invalid;
-    }
-
     /** construct invalid instance */
     public WayConnectionType() {
         this.linkPrev = false;
