Index: /trunk/src/org/openstreetmap/josm/actions/JoinNodeWayAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/JoinNodeWayAction.java	(revision 17895)
+++ /trunk/src/org/openstreetmap/josm/actions/JoinNodeWayAction.java	(revision 17896)
@@ -108,5 +108,5 @@
             for (WaySegment ws : wss) {
                 // Maybe cleaner to pass a "isSelected" predicate to getNearestWaySegments, but this is less invasive.
-                if (restrictToSelectedWays && !ws.way.isSelected()) {
+                if (restrictToSelectedWays && !ws.getWay().isSelected()) {
                     continue;
                 }
@@ -135,14 +135,14 @@
                     // only use the closest WaySegment of each way and ignore those that already contain the node
                     if (!ws.getFirstNode().equals(node) && !ws.getSecondNode().equals(node)
-                            && !seenWays.contains(ws.way)) {
+                            && !seenWays.contains(ws.getWay())) {
                         if (usedDist == null)
                             usedDist = entry.getKey();
-                        MultiMap<Integer, Node> innerMap = data.get(ws.way);
+                        MultiMap<Integer, Node> innerMap = data.get(ws.getWay());
                         if (innerMap == null) {
                             innerMap = new MultiMap<>();
-                            data.put(ws.way, innerMap);
+                            data.put(ws.getWay(), innerMap);
                         }
-                        innerMap.put(ws.lowerIndex, node);
-                        seenWays.add(ws.way);
+                        innerMap.put(ws.getLowerIndex(), node);
+                        seenWays.add(ws.getWay());
                     }
                 }
Index: /trunk/src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java	(revision 17895)
+++ /trunk/src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java	(revision 17896)
@@ -418,9 +418,9 @@
             return DeleteCommand.deleteWaySegment(parameters.nearestSegment);
         case way:
-            return DeleteCommand.delete(Collections.singleton(parameters.nearestSegment.way), false, silent);
+            return DeleteCommand.delete(Collections.singleton(parameters.nearestSegment.getWay()), false, silent);
         case way_with_nodes:
-            return DeleteCommand.delete(Collections.singleton(parameters.nearestSegment.way), true, silent);
+            return DeleteCommand.delete(Collections.singleton(parameters.nearestSegment.getWay()), true, silent);
         case way_with_references:
-            return DeleteCommand.deleteWithReferences(Collections.singleton(parameters.nearestSegment.way), true);
+            return DeleteCommand.deleteWithReferences(Collections.singleton(parameters.nearestSegment.getWay()), true);
         default:
             return null;
Index: /trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java	(revision 17895)
+++ /trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java	(revision 17896)
@@ -694,12 +694,12 @@
         for (WaySegment ws : wss) {
             List<Integer> is;
-            if (insertPoints.containsKey(ws.way)) {
-                is = insertPoints.get(ws.way);
+            if (insertPoints.containsKey(ws.getWay())) {
+                is = insertPoints.get(ws.getWay());
             } else {
                 is = new ArrayList<>();
-                insertPoints.put(ws.way, is);
-            }
-
-            is.add(ws.lowerIndex);
+                insertPoints.put(ws.getWay(), is);
+            }
+
+            is.add(ws.getLowerIndex());
         }
 
@@ -859,5 +859,5 @@
             List<WaySegment> wss = mv.getNearestWaySegments(mousePos, OsmPrimitive::isSelectable);
             for (WaySegment ws : wss) {
-                mouseOnExistingWays.add(ws.way);
+                mouseOnExistingWays.add(ws.getWay());
             }
         }
Index: /trunk/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java	(revision 17895)
+++ /trunk/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java	(revision 17896)
@@ -432,9 +432,9 @@
                 mode = Mode.create_new;
                 // create a new segment and then select and extrude the new segment
-                getLayerManager().getEditDataSet().setSelected(selectedSegment.way);
+                getLayerManager().getEditDataSet().setSelected(selectedSegment.getWay());
                 alwaysCreateNodes = true;
             } else {
                 mode = Mode.extrude;
-                getLayerManager().getEditDataSet().setSelected(selectedSegment.way);
+                getLayerManager().getEditDataSet().setSelected(selectedSegment.getWay());
                 alwaysCreateNodes = shift;
             }
@@ -591,9 +591,9 @@
             EastNorth b = ws.getSecondNode().getEastNorth();
             n.setEastNorth(Geometry.closestPointToSegment(a, b, n.getEastNorth()));
-            Way wnew = new Way(ws.way);
-            wnew.addNode(ws.lowerIndex+1, n);
-            DataSet ds = ws.way.getDataSet();
+            Way wnew = new Way(ws.getWay());
+            wnew.addNode(ws.getLowerIndex() +1, n);
+            DataSet ds = ws.getWay().getDataSet();
             UndoRedoHandler.getInstance().add(new SequenceCommand(tr("Add a new node to an existing way"),
-                    new AddCommand(ds, n), new ChangeNodesCommand(ds, ws.way, wnew.getNodes())));
+                    new AddCommand(ds, n), new ChangeNodesCommand(ds, ws.getWay(), wnew.getNodes())));
             wnew.setNodes(null); // see #19885
 
@@ -641,16 +641,16 @@
         // create extrusion
         Collection<Command> cmds = new LinkedList<>();
-        Way wnew = new Way(selectedSegment.way);
+        Way wnew = new Way(selectedSegment.getWay());
         boolean wayWasModified = false;
         boolean wayWasSingleSegment = wnew.getNodesCount() == 2;
-        int insertionPoint = selectedSegment.lowerIndex + 1;
+        int insertionPoint = selectedSegment.getUpperIndex();
 
         //find if the new points overlap existing segments (in case of 90 degree angles)
-        Node prevNode = getPreviousNode(selectedSegment.lowerIndex);
+        Node prevNode = getPreviousNode(selectedSegment.getLowerIndex());
         boolean nodeOverlapsSegment = prevNode != null && Geometry.segmentsParallel(initialN1en, prevNode.getEastNorth(), initialN1en, newN1en);
         // segmentAngleZero marks subset of nodeOverlapsSegment.
         // nodeOverlapsSegment is true if angle between segments is 0 or PI, segmentAngleZero only if angle is 0
         boolean segmentAngleZero = prevNode != null && Math.abs(Geometry.getCornerAngle(prevNode.getEastNorth(), initialN1en, newN1en)) < 1e-5;
-        boolean hasOtherWays = hasNodeOtherWays(selectedSegment.getFirstNode(), selectedSegment.way);
+        boolean hasOtherWays = hasNodeOtherWays(selectedSegment.getFirstNode(), selectedSegment.getWay());
         List<Node> changedNodes = new ArrayList<>();
         if (nodeOverlapsSegment && !alwaysCreateNodes && !hasOtherWays) {
@@ -679,8 +679,8 @@
 
         //find if the new points overlap existing segments (in case of 90 degree angles)
-        Node nextNode = getNextNode(selectedSegment.lowerIndex + 1);
+        Node nextNode = getNextNode(selectedSegment.getUpperIndex());
         nodeOverlapsSegment = nextNode != null && Geometry.segmentsParallel(initialN2en, nextNode.getEastNorth(), initialN2en, newN2en);
         segmentAngleZero = nextNode != null && Math.abs(Geometry.getCornerAngle(nextNode.getEastNorth(), initialN2en, newN2en)) < 1e-5;
-        hasOtherWays = hasNodeOtherWays(selectedSegment.getSecondNode(), selectedSegment.way);
+        hasOtherWays = hasNodeOtherWays(selectedSegment.getSecondNode(), selectedSegment.getWay());
 
         if (nodeOverlapsSegment && !alwaysCreateNodes && !hasOtherWays) {
@@ -714,5 +714,5 @@
         if (wayWasModified) {
             // we only need to change the way if its node list was really modified
-            cmds.add(new ChangeNodesCommand(selectedSegment.way, wnew.getNodes()));
+            cmds.add(new ChangeNodesCommand(selectedSegment.getWay(), wnew.getNodes()));
         }
         wnew.setNodes(null); // see #19885
@@ -824,5 +824,5 @@
 
         //add directions parallel to neighbor segments
-        Node prevNode = getPreviousNode(selectedSegment.lowerIndex);
+        Node prevNode = getPreviousNode(selectedSegment.getLowerIndex());
         if (prevNode != null) {
             EastNorth en = prevNode.getEastNorth();
@@ -833,5 +833,5 @@
         }
 
-        Node nextNode = getNextNode(selectedSegment.lowerIndex + 1);
+        Node nextNode = getNextNode(selectedSegment.getUpperIndex());
         if (nextNode != null) {
             EastNorth en = nextNode.getEastNorth();
@@ -871,6 +871,6 @@
      */
     private boolean checkDualAlignConditions() {
-        Node prevNode = getPreviousNode(selectedSegment.lowerIndex);
-        Node nextNode = getNextNode(selectedSegment.lowerIndex + 1);
+        Node prevNode = getPreviousNode(selectedSegment.getLowerIndex());
+        Node nextNode = getNextNode(selectedSegment.getUpperIndex());
         if (prevNode == null || nextNode == null) {
             return false;
@@ -906,5 +906,5 @@
 
         // set neighboring segments
-        Node prevNode = getPreviousNode(selectedSegment.lowerIndex);
+        Node prevNode = getPreviousNode(selectedSegment.getLowerIndex());
         if (prevNode != null) {
             EastNorth prevNodeEn = prevNode.getEastNorth();
@@ -915,5 +915,5 @@
         }
 
-        Node nextNode = getNextNode(selectedSegment.lowerIndex + 1);
+        Node nextNode = getNextNode(selectedSegment.getUpperIndex());
         if (nextNode != null) {
             EastNorth nextNodeEn = nextNode.getEastNorth();
@@ -975,6 +975,6 @@
         if (index > 0)
             return index - 1;
-        else if (selectedSegment.way.isClosed())
-            return selectedSegment.way.getNodesCount() - 2;
+        else if (selectedSegment.getWay().isClosed())
+            return selectedSegment.getWay().getNodesCount() - 2;
         else
             return -1;
@@ -989,5 +989,5 @@
         int indexPrev = getPreviousNodeIndex(index);
         if (indexPrev >= 0)
-            return selectedSegment.way.getNode(indexPrev);
+            return selectedSegment.getWay().getNode(indexPrev);
         else
             return null;
@@ -1000,8 +1000,8 @@
      */
     private int getNextNodeIndex(int index) {
-        int count = selectedSegment.way.getNodesCount();
+        int count = selectedSegment.getWay().getNodesCount();
         if (index < count - 1)
             return index + 1;
-        else if (selectedSegment.way.isClosed())
+        else if (selectedSegment.getWay().isClosed())
             return 1;
         else
@@ -1017,5 +1017,5 @@
         int indexNext = getNextNodeIndex(index);
         if (indexNext >= 0)
-            return selectedSegment.way.getNode(indexNext);
+            return selectedSegment.getWay().getNode(indexNext);
         else
             return null;
Index: /trunk/src/org/openstreetmap/josm/actions/mapmode/ImproveWayAccuracyAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/mapmode/ImproveWayAccuracyAction.java	(revision 17895)
+++ /trunk/src/org/openstreetmap/josm/actions/mapmode/ImproveWayAccuracyAction.java	(revision 17896)
@@ -463,7 +463,7 @@
                 // Adding the node to all segments found
                 for (WaySegment virtualSegment : virtualSegments) {
-                    Way w = virtualSegment.way;
+                    Way w = virtualSegment.getWay();
                     List<Node> modNodes = w.getNodes();
-                    modNodes.add(virtualSegment.lowerIndex + 1, virtualNode);
+                    modNodes.add(virtualSegment.getUpperIndex(), virtualNode);
                     virtualCmds.add(new ChangeNodesCommand(w, modNodes));
                 }
Index: /trunk/src/org/openstreetmap/josm/actions/mapmode/ParallelWayAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/mapmode/ParallelWayAction.java	(revision 17895)
+++ /trunk/src/org/openstreetmap/josm/actions/mapmode/ParallelWayAction.java	(revision 17896)
@@ -508,7 +508,7 @@
         sourceWays.removeIf(w -> w.isIncomplete() || w.isEmpty());
 
-        if (!sourceWays.contains(referenceSegment.way)) {
+        if (!sourceWays.contains(referenceSegment.getWay())) {
             clearSourceWays();
-            addSourceWay(referenceSegment.way);
+            addSourceWay(referenceSegment.getWay());
         }
 
@@ -517,5 +517,5 @@
             int i = 0;
             for (Way w : sourceWays) {
-                if (w == referenceSegment.way) {
+                if (w == referenceSegment.getWay()) {
                     referenceWayIndex = i;
                     break;
Index: /trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(revision 17895)
+++ /trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(revision 17896)
@@ -1215,8 +1215,8 @@
 
                 for (WaySegment ws : mv.getNearestWaySegments(p, mv.isSelectablePredicate)) {
-                    Way w = ws.way;
-
-                    wnp.a = w.getNode(ws.lowerIndex);
-                    wnp.b = w.getNode(ws.lowerIndex + 1);
+                    Way w = ws.getWay();
+
+                    wnp.a = w.getNode(ws.getLowerIndex());
+                    wnp.b = w.getNode(ws.getUpperIndex());
                     MapViewPoint p1 = mv.getState().getPointFor(wnp.a);
                     MapViewPoint p2 = mv.getState().getPointFor(wnp.b);
@@ -1257,7 +1257,7 @@
             virtualCmds.add(new AddCommand(ds, virtualNode));
             for (WaySegment virtualWay : virtualWays) {
-                Way w = virtualWay.way;
+                Way w = virtualWay.getWay();
                 List<Node> modNodes = w.getNodes();
-                modNodes.add(virtualWay.lowerIndex + 1, virtualNode);
+                modNodes.add(virtualWay.getUpperIndex(), virtualNode);
                 virtualCmds.add(new ChangeNodesCommand(ds, w, modNodes));
             }
Index: /trunk/src/org/openstreetmap/josm/command/DeleteCommand.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/command/DeleteCommand.java	(revision 17895)
+++ /trunk/src/org/openstreetmap/josm/command/DeleteCommand.java	(revision 17896)
@@ -479,16 +479,16 @@
      */
     public static Command deleteWaySegment(WaySegment ws) {
-        if (ws.way.getNodesCount() < 3)
-            return delete(Collections.singleton(ws.way), false);
-
-        if (ws.way.isClosed()) {
+        if (ws.getWay().getNodesCount() < 3)
+            return delete(Collections.singleton(ws.getWay()), false);
+
+        if (ws.getWay().isClosed()) {
             // If the way is circular (first and last nodes are the same), the way shouldn't be splitted
 
             List<Node> n = new ArrayList<>();
 
-            n.addAll(ws.way.getNodes().subList(ws.lowerIndex + 1, ws.way.getNodesCount() - 1));
-            n.addAll(ws.way.getNodes().subList(0, ws.lowerIndex + 1));
-
-            return new ChangeNodesCommand(ws.way, n);
+            n.addAll(ws.getWay().getNodes().subList(ws.getUpperIndex(), ws.getWay().getNodesCount() - 1));
+            n.addAll(ws.getWay().getNodes().subList(0, ws.getUpperIndex()));
+
+            return new ChangeNodesCommand(ws.getWay(), n);
         }
 
@@ -496,13 +496,13 @@
         List<Node> n2 = new ArrayList<>();
 
-        n1.addAll(ws.way.getNodes().subList(0, ws.lowerIndex + 1));
-        n2.addAll(ws.way.getNodes().subList(ws.lowerIndex + 1, ws.way.getNodesCount()));
+        n1.addAll(ws.getWay().getNodes().subList(0, ws.getUpperIndex()));
+        n2.addAll(ws.getWay().getNodes().subList(ws.getUpperIndex(), ws.getWay().getNodesCount()));
 
         if (n1.size() < 2) {
-            return new ChangeNodesCommand(ws.way, n2);
+            return new ChangeNodesCommand(ws.getWay(), n2);
         } else if (n2.size() < 2) {
-            return new ChangeNodesCommand(ws.way, n1);
+            return new ChangeNodesCommand(ws.getWay(), n1);
         } else {
-            return SplitWayCommand.splitWay(ws.way, Arrays.asList(n1, n2), Collections.<OsmPrimitive>emptyList());
+            return SplitWayCommand.splitWay(ws.getWay(), Arrays.asList(n1, n2), Collections.<OsmPrimitive>emptyList());
         }
     }
Index: /trunk/src/org/openstreetmap/josm/data/osm/IWaySegment.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/IWaySegment.java	(revision 17895)
+++ /trunk/src/org/openstreetmap/josm/data/osm/IWaySegment.java	(revision 17896)
@@ -19,14 +19,31 @@
 public class IWaySegment<N extends INode, W extends IWay<N>> implements Comparable<IWaySegment<N, W>> {
 
+    private final W way;
+    private final int lowerIndex;
+
     /**
      * The way.
      */
-    public final W way;
+    public W getWay() {
+        return way;
+    }
 
     /**
-     * The index of one of the 2 nodes in the way.  The other node has the
-     * index <code>lowerIndex + 1</code>.
+     * The index of the first of the 2 nodes in the way.
+     * @see #getUpperIndex()
+     * @see #getFirstNode()
      */
-    public final int lowerIndex;
+    public int getLowerIndex() {
+        return lowerIndex;
+    }
+
+    /**
+     * The index of the second of the 2 nodes in the way.
+     * @see #getLowerIndex()
+     * @see #getSecondNode()
+     */
+    public int getUpperIndex() {
+        return lowerIndex;
+    }
 
     /**
@@ -49,5 +66,5 @@
      */
     public N getFirstNode() {
-        return way.getNode(lowerIndex);
+        return way.getNode(getLowerIndex());
     }
 
@@ -57,5 +74,5 @@
      */
     public N getSecondNode() {
-        return way.getNode(lowerIndex + 1);
+        return way.getNode(getUpperIndex());
     }
 
Index: /trunk/src/org/openstreetmap/josm/data/osm/WaySegment.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/WaySegment.java	(revision 17895)
+++ /trunk/src/org/openstreetmap/josm/data/osm/WaySegment.java	(revision 17896)
@@ -100,5 +100,5 @@
     @Override
     public String toString() {
-        return "WaySegment [way=" + way.getUniqueId() + ", lowerIndex=" + lowerIndex + ']';
+        return "WaySegment [way=" + getWay().getUniqueId() + ", lowerIndex=" + getLowerIndex() + ']';
     }
 }
Index: /trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/AbstractMapRenderer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/AbstractMapRenderer.java	(revision 17895)
+++ /trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/AbstractMapRenderer.java	(revision 17896)
@@ -149,5 +149,5 @@
             path = new GeneralPath();
             for (WaySegment wseg: data.getHighlightedVirtualNodes()) {
-                if (wseg.way.isUsable() && !wseg.way.isDisabled()) {
+                if (wseg.getWay().isUsable() && !wseg.getWay().isDisabled()) {
                     Way tmpWay = wseg.toWay();
                     visitVirtual(path, tmpWay);
Index: /trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java	(revision 17895)
+++ /trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java	(revision 17896)
@@ -1291,5 +1291,5 @@
             MapViewPath highlightSegs = null;
             for (WaySegment ws : highlightWaySegments) {
-                if (ws.way != way || ws.lowerIndex < offset) {
+                if (ws.getWay() != way || ws.getLowerIndex() < offset) {
                     continue;
                 }
Index: /trunk/src/org/openstreetmap/josm/data/validation/tests/CrossingWays.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/validation/tests/CrossingWays.java	(revision 17895)
+++ /trunk/src/org/openstreetmap/josm/data/validation/tests/CrossingWays.java	(revision 17896)
@@ -366,12 +366,12 @@
 
                     if (!es1.intersects(es2)
-                            || (!findSelfCrossingOnly && ignoreWaySegmentCombination(es1.way, es2.way))) {
+                            || (!findSelfCrossingOnly && ignoreWaySegmentCombination(es1.getWay(), es2.getWay()))) {
                         continue;
                     }
 
                     prims = new ArrayList<>();
-                    prims.add(es1.way);
-                    if (es1.way != es2.way)
-                        prims.add(es2.way);
+                    prims.add(es1.getWay());
+                    if (es1.getWay() != es2.getWay())
+                        prims.add(es2.getWay());
                     if ((highlight = seenWays.get(prims)) == null) {
                         highlight = new ArrayList<>();
@@ -379,5 +379,5 @@
                         highlight.add(es2);
 
-                        final MessageHelper message = createMessage(es1.way, es2.way);
+                        final MessageHelper message = createMessage(es1.getWay(), es2.getWay());
                         errors.add(TestError.builder(this, Severity.WARNING, message.code)
                                 .message(message.message)
@@ -437,10 +437,10 @@
 
                     List<WaySegment> highlight;
-                    if (es2.way == w // reported by CrossingWays.SelfIntersection
+                    if (es2.getWay() == w // reported by CrossingWays.SelfIntersection
                             || (findSharedWaySegments && !es1.isSimilar(es2))
                             || (!findSharedWaySegments && !es1.intersects(es2)))
                         continue;
 
-                    List<Way> prims = Arrays.asList(es1.way, es2.way);
+                    List<Way> prims = Arrays.asList(es1.getWay(), es2.getWay());
                     if ((highlight = crossingWays.get(prims)) == null) {
                         highlight = new ArrayList<>();
Index: /trunk/src/org/openstreetmap/josm/data/validation/tests/LongSegment.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/validation/tests/LongSegment.java	(revision 17895)
+++ /trunk/src/org/openstreetmap/josm/data/validation/tests/LongSegment.java	(revision 17896)
@@ -107,5 +107,5 @@
             errors.add(TestError.builder(this, Severity.WARNING, LONG_SEGMENT)
                     .message(tr("Long segments"), marktr("Very long segment of {0} kilometers"), length.intValue())
-                    .primitives(waySegment.way)
+                    .primitives(waySegment.getWay())
                     .highlightWaySegments(Collections.singleton(waySegment))
                     .build());
Index: /trunk/src/org/openstreetmap/josm/data/validation/tests/OverlappingWays.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/validation/tests/OverlappingWays.java	(revision 17895)
+++ /trunk/src/org/openstreetmap/josm/data/validation/tests/OverlappingWays.java	(revision 17896)
@@ -107,5 +107,5 @@
                 for (WaySegment ws : duplicated) {
                     // order in set is important
-                    grouped.computeIfAbsent(OsmUtils.getLayer(ws.way), k -> new LinkedHashSet<>()).add(ws);
+                    grouped.computeIfAbsent(OsmUtils.getLayer(ws.getWay()), k -> new LinkedHashSet<>()).add(ws);
                 }
                 grouped.values().forEach(group -> analyseOverlaps(group, seenWays));
@@ -122,5 +122,5 @@
             return;
 
-        List<Way> currentWays = duplicated.stream().map(ws -> ws.way).collect(Collectors.toList());
+        List<Way> currentWays = duplicated.stream().map(ws -> ws.getWay()).collect(Collectors.toList());
         Collection<WaySegment> highlight;
         if ((highlight = seenWays.get(currentWays)) != null) {
@@ -134,21 +134,21 @@
             int numAreas = 0;
             for (WaySegment ws : duplicated) {
-                boolean isArea = ws.way.concernsArea();
-                if (ws.way.hasKey(HIGHWAY)) {
+                boolean isArea = ws.getWay().concernsArea();
+                if (ws.getWay().hasKey(HIGHWAY)) {
                     if (!isArea) {
                         countHighway++;
                     }
-                } else if (ws.way.hasKey(RAILWAY)) {
+                } else if (ws.getWay().hasKey(RAILWAY)) {
                     if (!isArea) {
                         countRailway++;
                     }
-                } else if (ws.way.hasKey(WATERWAY)) {
+                } else if (ws.getWay().hasKey(WATERWAY)) {
                     if (!isArea) {
                         countWaterway++;
                     }
                 } else {
-                    if (ws.way.getInterestingTags().isEmpty() && parentMultipolygonConcernsArea(ws.way))
+                    if (ws.getWay().getInterestingTags().isEmpty() && parentMultipolygonConcernsArea(ws.getWay()))
                         isArea = true;
-                    if (!isArea && isOtherLinear(ws.way)) {
+                    if (!isArea && isOtherLinear(ws.getWay())) {
                         countOther++;
                     }
Index: /trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java	(revision 17895)
+++ /trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java	(revision 17896)
@@ -1259,5 +1259,5 @@
             // makes the order of nearestList dependent on current selection state
             for (WaySegment ws : wss) {
-                (ws.way.isSelected() ? nearestList : unselected).add(ws);
+                (ws.getWay().isSelected() ? nearestList : unselected).add(ws);
             }
             nearestList.addAll(unselected);
@@ -1307,5 +1307,5 @@
                     wayseg = ws;
                 }
-                if (ntsel == null && ws.way.isSelected()) {
+                if (ntsel == null && ws.getWay().isSelected()) {
                     ntsel = ws;
                 }
@@ -1342,5 +1342,5 @@
                     wayseg = ws;
                 }
-                if (useSelected && ws.way.isSelected()) {
+                if (useSelected && ws.getWay().isSelected()) {
                     return ws;
                 }
@@ -1350,5 +1350,5 @@
                         return ws;
                     }
-                    Collection<OsmPrimitive> wayRefs = ws.way.getReferrers();
+                    Collection<OsmPrimitive> wayRefs = ws.getWay().getReferrers();
                     // prefer member of the given relations
                     for (OsmPrimitive ref: preferredRefs) {
@@ -1392,6 +1392,6 @@
         List<Way> nearestList = getNearestWaySegmentsImpl(p, predicate).values().stream()
                 .flatMap(Collection::stream)
-                .filter(ws -> wset.add(ws.way))
-                .map(ws -> ws.way)
+                .filter(ws -> wset.add(ws.getWay()))
+                .map(ws -> ws.getWay())
                 .collect(Collectors.toList());
         if (ignore != null) {
@@ -1428,5 +1428,5 @@
     public final Way getNearestWay(Point p, Predicate<OsmPrimitive> predicate) {
         WaySegment nearestWaySeg = getNearestWaySegment(p, predicate);
-        return (nearestWaySeg == null) ? null : nearestWaySeg.way;
+        return (nearestWaySeg == null) ? null : nearestWaySeg.getWay();
     }
 
@@ -1546,7 +1546,7 @@
         if (ws == null) return osm;
 
-        if ((ws.way.isSelected() && useSelected) || osm == null) {
+        if ((ws.getWay().isSelected() && useSelected) || osm == null) {
             // either (no _selected_ nearest node found, if desired) or no nearest node was found
-            osm = ws.way;
+            osm = ws.getWay();
         } else {
             int maxWaySegLenSq = 3*PROP_SNAP_DISTANCE.get();
@@ -1560,5 +1560,5 @@
             if (wp1.distanceSq(wp2) < maxWaySegLenSq &&
                     p.distanceSq(project(0.5, wp1, wp2)) < p.distanceSq(getPoint2D((Node) osm))) {
-                osm = ws.way;
+                osm = ws.getWay();
             }
         }
@@ -1603,6 +1603,6 @@
         List<OsmPrimitive> nearestList = getNearestWaySegmentsImpl(p, predicate).values().stream()
                 .flatMap(Collection::stream)
-                .filter(ws -> wset.add(ws.way))
-                .map(ws -> ws.way)
+                .filter(ws -> wset.add(ws.getWay()))
+                .map(ws -> ws.getWay())
                 .collect(Collectors.toList());
 
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java	(revision 17895)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java	(revision 17896)
@@ -562,5 +562,5 @@
         @Override
         public void visit(WaySegment ws) {
-            if (ws.lowerIndex < 0 || ws.lowerIndex + 1 >= ws.way.getNodesCount())
+            if (ws.getLowerIndex() < 0 || ws.getUpperIndex() >= ws.getWay().getNodesCount())
                 return;
             visit(ws.getFirstNode());
Index: /trunk/src/org/openstreetmap/josm/gui/layer/validation/PaintVisitor.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/validation/PaintVisitor.java	(revision 17895)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/validation/PaintVisitor.java	(revision 17896)
@@ -207,5 +207,5 @@
     @Override
     public void visit(WaySegment ws) {
-        if (ws.lowerIndex < 0 || ws.lowerIndex + 1 >= ws.way.getNodesCount())
+        if (ws.getLowerIndex() < 0 || ws.getUpperIndex() >= ws.getWay().getNodesCount())
             return;
         drawSegment(ws.getFirstNode(), ws.getSecondNode(), color);
Index: /trunk/test/unit/org/openstreetmap/josm/data/osm/WaySegmentTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/data/osm/WaySegmentTest.java	(revision 17895)
+++ /trunk/test/unit/org/openstreetmap/josm/data/osm/WaySegmentTest.java	(revision 17896)
@@ -42,10 +42,10 @@
         w.addNode(n4);
         w.addNode(n1);
-        Assert.assertEquals(WaySegment.forNodePair(w, n1, n2).lowerIndex, 0);
-        Assert.assertEquals(WaySegment.forNodePair(w, n1, n3).lowerIndex, 2);
-        Assert.assertEquals(WaySegment.forNodePair(w, n1, n4).lowerIndex, 4);
-        Assert.assertEquals(WaySegment.forNodePair(w, n4, n1).lowerIndex, 5);
+        Assert.assertEquals(WaySegment.forNodePair(w, n1, n2).getLowerIndex(), 0);
+        Assert.assertEquals(WaySegment.forNodePair(w, n1, n3).getLowerIndex(), 2);
+        Assert.assertEquals(WaySegment.forNodePair(w, n1, n4).getLowerIndex(), 4);
+        Assert.assertEquals(WaySegment.forNodePair(w, n4, n1).getLowerIndex(), 5);
         try {
-            Assert.assertEquals(WaySegment.forNodePair(w, n3, n4).lowerIndex, 5);
+            Assert.assertEquals(WaySegment.forNodePair(w, n3, n4).getLowerIndex(), 5);
             throw new IllegalStateException("Expecting IllegalArgumentException");
         } catch (IllegalArgumentException expected) {
