Index: /applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/actions/EdgeSelectionAction.java
===================================================================
--- /applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/actions/EdgeSelectionAction.java	(revision 34182)
+++ /applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/actions/EdgeSelectionAction.java	(revision 34183)
@@ -41,4 +41,5 @@
     private Cursor selectionCursor;
     private Cursor waySelectCursor;
+    private List<Way> edgeList;
 
     public EdgeSelectionAction() {
@@ -47,4 +48,5 @@
                 ImageProvider.getCursor("normal", "selection"));
         highlighted = new HashSet<>();
+        edgeList = new ArrayList<>();
 
         selectionCursor = ImageProvider.getCursor("normal", "selection");
@@ -133,17 +135,72 @@
 
     @Override
-    public void mouseClicked(MouseEvent e) {
+	public void mouseClicked(MouseEvent e) {
 
         DataSet ds = MainApplication.getLayerManager().getEditDataSet();
         Way initial = MainApplication.getMap().mapView.getNearestWay(e.getPoint(), OsmPrimitive::isUsable);
-        if (initial != null) {
-            List<Way> edge = getEdgeFromWay(initial, getModeOfTravel());
-            ds.setSelected(edge);
-            AutoScaleAction.zoomTo(
+        updateKeyModifiers(e);
+        if(!shift && !ctrl) {
+        			/*
+        			 * remove all previous selection and just add the latest selection
+        			 */
+        			edgeList.clear();
+        		    ds.clearSelection();
+        		    if (initial != null) {
+        	            List<Way> edge = getEdgeFromWay(initial, getModeOfTravel());
+        	            for(Way way:edge) {
+        	            		if (!edgeList.contains(way))
+        	            			edgeList.add(way);
+        	            }
+        	            edgeList.addAll(edge);
+        	            ds.setSelected(edgeList);
+        	            AutoScaleAction.zoomTo(
+        	                    edge.stream()
+        	                    .map(w -> (OsmPrimitive) w)
+        	                    .collect(Collectors.toList()));
+        	        }
+
+        } else if (!shift && ctrl) {
+        	    /*
+        	     * toggle mode where we can individually select and deselect the edges
+        	     */
+            	List<Way> edge = getEdgeFromWay(initial, getModeOfTravel());
+			if (edgeList.containsAll(edge)) {
+				System.out.println(edgeList.size());
+				for(Way way:edge) {
+            		if (edgeList.contains(way))
+            			edgeList.remove(way);
+                }
+			} else {
+				for(Way way:edge) {
+            		if (!edgeList.contains(way))
+            			edgeList.add(way);
+                }
+			}
+			ds.clearSelection();
+			ds.setSelected(edgeList);
+			AutoScaleAction.zoomTo(
                     edge.stream()
                     .map(w -> (OsmPrimitive) w)
-                    .collect(Collectors.toList()));
-        } else
-            ds.clearSelection();
+                    .collect(Collectors.toList())
+                    );
+        } else if (shift && !ctrl) {
+        		/*
+        		 * add new selection to existing edges
+        		 */
+        	    if (initial != null) {
+                List<Way> edge = getEdgeFromWay(initial, getModeOfTravel());
+                for(Way way:edge) {
+                		if (!edgeList.contains(way))
+                			edgeList.add(way);
+                }
+                edgeList.addAll(edge);
+                ds.setSelected(edgeList);
+                AutoScaleAction.zoomTo(
+                        edge.stream()
+                        .map(w -> (OsmPrimitive) w)
+                        .collect(Collectors.toList()));
+            }
+        }
+
     }
 
@@ -183,3 +240,4 @@
         MainApplication.getMap().mapView.removeMouseMotionListener(this);
     }
+
 }
