Index: applications/editors/josm/plugins/public_transport/src/public_transport/RoutePatternAction.java
===================================================================
--- applications/editors/josm/plugins/public_transport/src/public_transport/RoutePatternAction.java	(revision 20029)
+++ applications/editors/josm/plugins/public_transport/src/public_transport/RoutePatternAction.java	(revision 20030)
@@ -46,4 +46,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.JosmAction;
+import org.openstreetmap.josm.actions.mapmode.DeleteAction;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
@@ -486,4 +487,6 @@
   private static Vector< RelationMember > markedNodes = new Vector< RelationMember >();
   
+  private static Relation copy = null;
+  
   public RoutePatternAction() {
     super(tr("Route patterns ..."), null,
@@ -526,4 +529,5 @@
       layoutCons.gridx = 0;
       layoutCons.gridy = 0;
+      layoutCons.gridwidth = 3;
       layoutCons.weightx = 0.0;
       layoutCons.weighty = 0.0;
@@ -542,4 +546,5 @@
       layoutCons.gridx = 0;
       layoutCons.gridy = 1;
+      layoutCons.gridwidth = 3;
       layoutCons.weightx = 1.0;
       layoutCons.weighty = 1.0;
@@ -554,4 +559,6 @@
       layoutCons.gridx = 0;
       layoutCons.gridy = 2;
+      layoutCons.gridwidth = 1;
+      layoutCons.gridheight = 2;
       layoutCons.weightx = 1.0;
       layoutCons.weighty = 0.0;
@@ -560,4 +567,60 @@
       contentPane.add(bRefresh);
 	
+      JButton bNew = new JButton("New");
+      bNew.setActionCommand("routePattern.overviewNew");
+      bNew.addActionListener(this);
+	
+      layoutCons.gridx = 1;
+      layoutCons.gridy = 2;
+      layoutCons.gridwidth = 1;
+      layoutCons.gridheight = 1;
+      layoutCons.weightx = 1.0;
+      layoutCons.weighty = 0.0;
+      layoutCons.fill = GridBagConstraints.BOTH;
+      gridbag.setConstraints(bNew, layoutCons);
+      contentPane.add(bNew);
+	
+      JButton bDelete = new JButton("Delete");
+      bDelete.setActionCommand("routePattern.overviewDelete");
+      bDelete.addActionListener(this);
+	
+      layoutCons.gridx = 1;
+      layoutCons.gridy = 3;
+      layoutCons.gridwidth = 1;
+      layoutCons.gridheight = 1;
+      layoutCons.weightx = 1.0;
+      layoutCons.weighty = 0.0;
+      layoutCons.fill = GridBagConstraints.BOTH;
+      gridbag.setConstraints(bDelete, layoutCons);
+      contentPane.add(bDelete);
+      
+      JButton bDuplicate = new JButton("Duplicate");
+      bDuplicate.setActionCommand("routePattern.overviewDuplicate");
+      bDuplicate.addActionListener(this);
+	
+      layoutCons.gridx = 2;
+      layoutCons.gridy = 2;
+      layoutCons.gridwidth = 1;
+      layoutCons.gridheight = 1;
+      layoutCons.weightx = 1.0;
+      layoutCons.weighty = 0.0;
+      layoutCons.fill = GridBagConstraints.BOTH;
+      gridbag.setConstraints(bDuplicate, layoutCons);
+      contentPane.add(bDuplicate);
+	
+      JButton bReflect = new JButton("Reflect");
+      bReflect.setActionCommand("routePattern.overviewReflect");
+      bReflect.addActionListener(this);
+	
+      layoutCons.gridx = 2;
+      layoutCons.gridy = 3;
+      layoutCons.gridwidth = 1;
+      layoutCons.gridheight = 1;
+      layoutCons.weightx = 1.0;
+      layoutCons.weighty = 0.0;
+      layoutCons.fill = GridBagConstraints.BOTH;
+      gridbag.setConstraints(bReflect, layoutCons);
+      contentPane.add(bReflect);
+      
       //Tags Tab
       /*Container*/ contentPane = tabTags;
@@ -810,5 +873,5 @@
       contentPane.add(bAdd);
 	
-      JButton bDelete = new JButton("Delete");
+      /*JButton*/ bDelete = new JButton("Delete");
       bDelete.setActionCommand("routePattern.itineraryDelete");
       bDelete.addActionListener(this);
@@ -836,5 +899,5 @@
       contentPane.add(bSort);
 	
-      JButton bReflect = new JButton("Reflect");
+      /*JButton*/ bReflect = new JButton("Reflect");
       bReflect.setActionCommand("routePattern.itineraryReflect");
       bReflect.addActionListener(this);
@@ -1061,4 +1124,94 @@
     if ("routePattern.refresh".equals(event.getActionCommand()))
     {
+      refreshData();
+    }
+    else if ("routePattern.overviewNew".equals(event.getActionCommand()))
+    {
+      currentRoute = new Relation();
+      currentRoute.put("type", "route");
+      currentRoute.put("route", "bus");
+      mainDataSet.addPrimitive(currentRoute);
+      
+      refreshData();
+      
+      for (int i = 0; i < relsListModel.size(); ++i)
+      {
+	if (currentRoute == ((RouteReference)relsListModel.elementAt(i)).route)
+	  relsList.setSelectedIndex(i);
+      }
+    }
+    else if ("routePattern.overviewDuplicate".equals(event.getActionCommand()))
+    {
+      currentRoute = new Relation(currentRoute, true);
+      currentRoute.put("type", "route");
+      currentRoute.put("route", "bus");
+      mainDataSet.addPrimitive(currentRoute);
+      
+      refreshData();
+      	
+      for (int i = 0; i < relsListModel.size(); ++i)
+      {
+	if (currentRoute == ((RouteReference)relsListModel.elementAt(i)).route)
+	  relsList.setSelectedIndex(i);
+      }
+    }
+    else if ("routePattern.overviewReflect".equals(event.getActionCommand()))
+    {
+      currentRoute.setModified(true);
+      String tag_from = currentRoute.get("from");
+      String tag_to = currentRoute.get("to");
+      currentRoute.put("from", tag_to);
+      currentRoute.put("to", tag_from);
+      
+      Vector< RelationMember > itemsToReflect = new Vector< RelationMember >();
+      Vector< RelationMember > otherItems = new Vector< RelationMember >();
+      int insPos = itineraryTable.getSelectedRow();
+      
+      for (int i = 0; i < currentRoute.getMembersCount(); ++i)
+      {
+	RelationMember item = currentRoute.getMember(i);
+	
+	if (item.isWay())
+	{
+	  String role = item.getRole();
+	  if ("backward".equals(role))
+	    role = "forward";
+	  else if ("forward".equals(role))
+	    role = "backward";
+	  else
+	    role = "backward";
+	  
+	  itemsToReflect.add(new RelationMember(role, item.getWay()));
+	}
+	else if (item.isNode())
+	  itemsToReflect.add(item);
+	else
+	  otherItems.add(item);
+      }
+	
+      currentRoute.setMembers(null);
+      for (int i = itemsToReflect.size()-1; i >= 0; --i)
+	currentRoute.addMember(itemsToReflect.elementAt(i));
+      for (int i = 0; i < otherItems.size(); ++i)
+	currentRoute.addMember(otherItems.elementAt(i));
+      
+      refreshData();
+      
+      for (int i = 0; i < relsListModel.size(); ++i)
+      {
+	if (currentRoute == ((RouteReference)relsListModel.elementAt(i)).route)
+	  relsList.setSelectedIndex(i);
+      }
+    }
+    else if ("routePattern.overviewDelete".equals(event.getActionCommand()))
+    {
+      DeleteAction.deleteRelation(Main.main.getEditLayer(), currentRoute);
+      
+      currentRoute = null;
+      tabbedPane.setEnabledAt(1, false);
+      tabbedPane.setEnabledAt(2, false);
+      tabbedPane.setEnabledAt(3, false);
+      tabbedPane.setEnabledAt(4, false);
+      
       refreshData();
     }
@@ -1773,5 +1926,7 @@
   
   private void refreshData() {
+    Relation copy = currentRoute;
     relsListModel.clear();
+    currentRoute = copy;
 	
     DataSet mainDataSet = Main.main.getCurrentDataSet();
@@ -1785,19 +1940,22 @@
       {
 	Relation currentRel = relIter.next();
-	String routeVal = currentRel.get("route");
-	if ("bus".equals(routeVal))
-	  relRefs.add(new RouteReference(currentRel));
-	else if ("tram".equals(routeVal))
-	  relRefs.add(new RouteReference(currentRel));
-	else if ("light_rail".equals(routeVal))
-	  relRefs.add(new RouteReference(currentRel));
-	else if ("subway".equals(routeVal))
-	  relRefs.add(new RouteReference(currentRel));
-	else if ("rail".equals(routeVal))
-	  relRefs.add(new RouteReference(currentRel));
+	if (!currentRel.isDeleted())
+	{
+	  String routeVal = currentRel.get("route");
+	  if ("bus".equals(routeVal))
+	    relRefs.add(new RouteReference(currentRel));
+	  else if ("tram".equals(routeVal))
+	    relRefs.add(new RouteReference(currentRel));
+	  else if ("light_rail".equals(routeVal))
+	    relRefs.add(new RouteReference(currentRel));
+	  else if ("subway".equals(routeVal))
+	    relRefs.add(new RouteReference(currentRel));
+	  else if ("rail".equals(routeVal))
+	    relRefs.add(new RouteReference(currentRel));
+	}
       }
       
       Collections.sort(relRefs);
-      
+
       Iterator< RouteReference > iter = relRefs.iterator();
       while (iter.hasNext())
