[routino] 01/03: Imported Upstream version 2.7.2

Uwe Steinmann steinm-guest at moszumanska.debian.org
Fri Oct 31 08:14:00 UTC 2014


This is an automated email from the git hooks/post-receive script.

steinm-guest pushed a commit to branch master
in repository routino.

commit 615634af9442ff43f29fc8372e75b9c3cd2806b8
Author: Uwe Steinmann <steinm at debian.org>
Date:   Thu Oct 30 06:39:11 2014 +0100

    Imported Upstream version 2.7.2
---
 ChangeLog                                          | 350 +++++++++++++++++++++
 doc/INSTALL.txt                                    |  17 +-
 doc/NEWS.txt                                       |  61 +++-
 doc/README.txt                                     |   9 +-
 doc/TAGGING.txt                                    |  14 +-
 doc/USAGE.txt                                      |   3 +-
 doc/html/installation.html                         |  16 +-
 doc/html/readme.html                               |  82 ++++-
 doc/html/tagging.html                              |  25 +-
 doc/html/usage.html                                |   4 +-
 src/cache.h                                        |   4 +-
 src/errorlogx.c                                    |   2 +-
 src/fakes.c                                        |  29 +-
 src/fakes.h                                        |   4 +-
 src/filedumper.c                                   |  24 +-
 src/optimiser.c                                    | 108 ++++---
 src/osmparser.c                                    |  21 +-
 src/output.c                                       | 126 ++++++--
 src/prunex.c                                       |  35 ++-
 src/router.c                                       | 194 +++++++-----
 src/segments.c                                     |   2 +-
 src/segments.h                                     |   6 +-
 src/superx.c                                       |  24 +-
 src/test/Makefile                                  |   2 +-
 src/test/a-b-c-d.sh                                | 105 +++++++
 src/test/coincident-waypoint.osm                   | 101 ++++++
 src/test/coincident-waypoint.sh                    |   1 +
 src/test/cycle-both-ways.osm                       | 107 +++++++
 src/test/cycle-both-ways.sh                        |   1 +
 src/test/cycle-drive.sh                            | 105 +++++++
 src/test/expected/coincident-waypoint-WP01.txt     |  12 +
 src/test/expected/coincident-waypoint-WP02.txt     |  11 +
 src/test/expected/coincident-waypoint-WP03.txt     |  12 +
 src/test/expected/coincident-waypoint-WP04.txt     |  10 +
 src/test/expected/cycle-both-ways-WP01.txt         |  16 +
 src/test/expected/cycle-both-ways-WP02.txt         |  16 +
 src/test/expected/fake-node-with-loop-WP01.txt     |  19 ++
 src/test/expected/fake-node-with-loop-WP02.txt     |  18 ++
 src/test/expected/loops-WP01.txt                   |  11 +-
 src/test/expected/loops-WP02.txt                   |  13 +-
 src/test/expected/loops-WP06.txt                   |   9 +-
 src/test/expected/loops-WP07.txt                   |  11 +-
 src/test/expected/roundabout-waypoints-WP01.txt    |  12 +
 src/test/expected/roundabout-waypoints-WP02.txt    |  13 +
 src/test/expected/roundabout-waypoints-WP03.txt    |  12 +
 src/test/expected/roundabout-waypoints-WP04.txt    |  13 +
 src/test/expected/roundabout-waypoints-WP05.txt    |  12 +
 src/test/expected/roundabout-waypoints-WP06.txt    |  13 +
 src/test/expected/roundabout-waypoints-WP07.txt    |  12 +
 src/test/fake-node-with-loop.osm                   | 102 ++++++
 src/test/fake-node-with-loop.sh                    |   1 +
 src/test/prune-straight.osm                        |   2 +-
 src/test/roundabout-waypoints.osm                  | 105 +++++++
 src/test/roundabout-waypoints.sh                   |   1 +
 src/types.c                                        |  10 +-
 src/types.h                                        |  13 +-
 src/visualiser.c                                   |  76 ++---
 src/visualiser.h                                   |   4 +-
 web/Makefile                                       |  24 +-
 web/translations/router.html                       |  22 +-
 web/translations/translate.pl                      | 235 +++++++++-----
 web/translations/translation.de.txt                | 168 +++++++++-
 web/translations/translation.en.txt                | 111 ++++++-
 web/translations/translation.fr.txt                | 112 ++++++-
 web/translations/translation.nl.txt                |  99 +++++-
 web/translations/translation.ru.txt                | 168 ++++++++++
 web/translations/translations-body.xml             |  93 ++++++
 web/translations/translations-head.xml             |  18 ++
 web/translations/translations-tail.xml             |   1 +
 web/translations/visualiser.html                   |  64 ++--
 web/www/routino/router.css                         |  26 +-
 web/www/routino/router.html.de                     | 162 +++++-----
 web/www/routino/router.html.en                     |   8 +-
 web/www/routino/router.html.fr                     | 184 +++++------
 web/www/routino/router.html.nl                     |  16 +-
 web/www/routino/{router.html.en => router.html.ru} |  70 ++---
 web/www/routino/router.leaflet.js                  |  52 ++-
 web/www/routino/router.openlayers.js               |  52 ++-
 web/www/routino/search.cgi                         |   2 +-
 web/www/routino/search.pl                          |   5 +-
 web/www/routino/visualiser.cgi                     |   5 +-
 web/www/routino/visualiser.html.de                 | 108 ++++---
 web/www/routino/visualiser.html.en                 |  32 +-
 web/www/routino/visualiser.html.fr                 |  56 ++--
 web/www/routino/visualiser.html.nl                 |  32 +-
 .../{visualiser.html.en => visualiser.html.ru}     | 110 ++++---
 web/www/routino/visualiser.leaflet.js              |  18 +-
 web/www/routino/visualiser.openlayers.js           |  18 +-
 xml/routino-profiles.xml                           |  10 -
 xml/routino-translations.xml                       | 176 +++++------
 xml/scripts/drive.pl                               |   7 +-
 xml/scripts/walk.pl                                |   3 +-
 92 files changed, 3454 insertions(+), 954 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index d38e42c..fd2e42f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,353 @@
+2014-06-26  Andrew M. Bishop <amb>
+
+	Version 2.7.2 released.
+
+2014-06-26 [r1584]  Andrew M. Bishop <amb>
+
+	* FILES, doc/NEWS.txt, doc/README.txt, doc/html/readme.html:
+	  Updated for version 2.7.2 release.
+
+2014-06-25 [r1583]  Andrew M. Bishop <amb>
+
+	* doc/INSTALL.txt, doc/html/installation.html: Add a note about
+	  another Perl module required if compiling from subversion.
+
+2014-06-25 [r1582]  Andrew M. Bishop <amb>
+
+	* src/router.c: Clarify the reason for the unreachable code (#if 0)
+	  and fix bug in it.
+
+2014-06-25 [r1581]  Andrew M. Bishop <amb>
+
+	* src/errorlogx.c: Fix for compiler warning on 64-bit systems but
+	  not 32-bit systems.
+
+2014-06-24 [r1580]  Andrew M. Bishop <amb>
+
+	* src/output.c: Fix for revision r1565 that crashes on 64-bit
+	  systems but not 32-bit systems.
+
+2014-06-24 [r1579]  Andrew M. Bishop <amb>
+
+	* src/optimiser.c: Fix for revision r1553 that crashes on 64-bit
+	  systems but not 32-bit systems.
+
+2014-06-09 [r1578]  Andrew M. Bishop <amb>
+
+	* src/cache.h: Increase the size of the caches for the slim
+	  programs by a factor of four (gives a large speed-up on virtual
+	  machines with low memory and slow disks even though it makes
+	  little difference on machines with lots of memory and fast
+	  disks).
+
+2014-06-07 [r1577]  Andrew M. Bishop <amb>
+
+	* doc/TAGGING.txt, doc/html/tagging.html: Document the default
+	  assumptions about allowed transport types on ferry routes (none).
+
+2014-06-05 [r1576]  Andrew M. Bishop <amb>
+
+	* web/translations/translate.pl: When creating the translated HTML
+	  and XML files give the statistics for each file separately.
+
+2014-05-26 [r1575]  Andrew M. Bishop <amb>
+
+	* web/translations/translation.de.txt: Add updated German
+	  translations submitted via http://www.routino.org/translations/
+	  on 2014-05-25.
+
+2014-05-21 [r1574]  Andrew M. Bishop <amb>
+
+	* web/translations/translation.ru.txt: Add updated Russian
+	  translations submitted via http://www.routino.org/translations/
+	  around 2014-05-20.
+
+2014-05-20 [r1573]  Andrew M. Bishop <amb>
+
+	* src/visualiser.c: When visualising segments include all of the
+	  ones that overlap the selected region (not missing a few that
+	  cross the edges).
+
+2014-05-19 [r1572]  Andrew M. Bishop <amb>
+
+	* web/translations/translation.de.txt,
+	  web/translations/translation.fr.txt,
+	  web/translations/translation.nl.txt,
+	  web/translations/translation.ru.txt,
+	  web/translations/translations-body.xml,
+	  xml/routino-translations.xml: Remove un-needed whitespace in
+	  translations files.
+
+2014-05-17  Andrew M. Bishop <amb>
+
+	Version 2.7.1 released.
+
+2014-05-17 [r1570]  Andrew M. Bishop <amb>
+
+	* FILES, doc/NEWS.txt, doc/README.txt, doc/html/readme.html: Update
+	  documentation for version 2.7.1.
+
+2014-05-17 [r1569]  Andrew M. Bishop <amb>
+
+	* web/Makefile: Re-create the xml/routino-translations.xml file if
+	  the translations are updated or the file is deleted.
+
+2014-05-17 [r1568]  Andrew M. Bishop <amb>
+
+	* xml/routino-translations.xml: Add updated German translations
+	  submitted via http://www.routino.org/translations/ around
+	  2014-04-11 and 2014-05-02.
+
+2014-05-12 [r1567]  Andrew M. Bishop <amb>
+
+	* src/prunex.c: When pruning short segments take the highway types
+	  into account when sharing the pruned segment length between the
+	  two neighbouring segments.
+
+2014-05-10 [r1565-1566]  Andrew M. Bishop <amb>
+
+	* src/test, src/test/a-b-c-d.sh (added),
+	  src/test/coincident-waypoint.osm (added),
+	  src/test/coincident-waypoint.sh (added),
+	  src/test/expected/coincident-waypoint-WP01.txt (added),
+	  src/test/expected/coincident-waypoint-WP02.txt (added),
+	  src/test/expected/coincident-waypoint-WP03.txt (added),
+	  src/test/expected/coincident-waypoint-WP04.txt (added): Add test
+	  cases for routes with contain two consecutive coincident
+	  waypoints.
+
+	* src/fakes.c, src/fakes.h, src/output.c, src/router.c: Don't crash
+	  if the specified route contains two consecutive coincident
+	  waypoints (route instructions at those points may not be
+	  perfect).
+
+2014-05-09 [r1564]  Andrew M. Bishop <amb>
+
+	* src/output.c, src/test/expected/loops-WP01.txt,
+	  src/test/expected/loops-WP02.txt,
+	  src/test/expected/loops-WP06.txt,
+	  src/test/expected/loops-WP07.txt: Fix bug with results output
+	  that would miss a segment and get the distance/time wrong if a
+	  waypoint node was passed again on the way to the next waypoint.
+
+2014-05-05 [r1563]  Andrew M. Bishop <amb>
+
+	* src/optimiser.c: Remove some left-over debugging print
+	  statements.
+
+2014-05-03 [r1562]  Andrew M. Bishop <amb>
+
+	* web/translations/translation.de.txt: Add updated German
+	  translations submitted via http://www.routino.org/translations/
+	  around 2014-05-02. (Some of the changes from the 2014-04-11
+	  submission were not merged last time, they have been included
+	  this time).
+
+2014-05-02 [r1561]  Andrew M. Bishop <amb>
+
+	* web/translations/translation.de.txt: Add updated German
+	  translations submitted via http://www.routino.org/translations/
+	  around 2014-04-11.
+
+2014-04-30 [r1560]  Andrew M. Bishop <amb>
+
+	* doc/USAGE.txt, doc/html/usage.html, src/filedumper.c,
+	  src/osmparser.c, src/visualiser.c, src/visualiser.h,
+	  web/translations/translation.en.txt,
+	  web/translations/visualiser.html, web/www/routino/visualiser.cgi,
+	  web/www/routino/visualiser.leaflet.js,
+	  web/www/routino/visualiser.openlayers.js: Update the visualiser
+	  web page to allow displaying the "cyclebothways" highway type and
+	  the "roundabout" highway type. Also "cyclebothways" is no longer
+	  a property so removed from that part of the visualiser.
+
+2014-04-29 [r1559]  Andrew M. Bishop <amb>
+
+	* src/filedumper.c, src/optimiser.c, src/osmparser.c, src/output.c,
+	  src/segments.c, src/types.c, src/types.h,
+	  xml/routino-profiles.xml: Remove the "cyclebothways" property and
+	  replace it with a "cyclebothways" highway type. This means that
+	  it is no longer possible to choose a preference for this type of
+	  highway when calculating a route. There was never really any
+	  reason for allowing users to do this since they can't specify a
+	  preference for oneway streets. It does however mean that the
+	  broken Javascript in the router web page (no entry field for this
+	  property) is fixed. Unfortunately this means that a database
+	  created by previous versions are not compatible with this one.
+
+2014-04-28 [r1558]  Andrew M. Bishop <amb>
+
+	* doc/TAGGING.txt, doc/html/tagging.html: Add some missing items
+	  into the documentation related to cycling both ways.
+
+2014-04-28 [r1557]  Andrew M. Bishop <amb>
+
+	* web/Makefile: Fix bug with updating XML files in web/data
+	  directory (Makefile error).
+
+2014-04-28 [r1556]  Andrew M. Bishop <amb>
+
+	* src/test, src/test/cycle-both-ways.osm (added),
+	  src/test/cycle-both-ways.sh (added), src/test/cycle-drive.sh
+	  (added), src/test/expected/cycle-both-ways-WP01.txt (added),
+	  src/test/expected/cycle-both-ways-WP02.txt (added): Add a test
+	  case for the ability to cycle both ways on highways that allow
+	  it. Tests the roundabout exit naming as well as shortest route.
+
+2014-04-28 [r1555]  Andrew M. Bishop <amb>
+
+	* src/test/fake-node-with-loop.osm, src/test/prune-straight.osm,
+	  src/test/roundabout-waypoints.osm: Remove unneeded tag from <osm>
+	  XML element.
+
+2014-04-27 [r1553-1554]  Andrew M. Bishop <amb>
+
+	* src/test, src/test/expected/fake-node-with-loop-WP01.txt (added),
+	  src/test/expected/fake-node-with-loop-WP02.txt (added),
+	  src/test/fake-node-with-loop.osm (added),
+	  src/test/fake-node-with-loop.sh (added): Add test case for the
+	  bug with particular arrangement of a fake node (waypoint in
+	  middle of segment) and a roundabout.
+
+	* src/optimiser.c, src/segments.h: Fix bug with particular
+	  arrangement of a fake node (waypoint in middle of segment) and a
+	  roundabout. The FindFinishRoutes() function was invalidly
+	  allowing a U-turn which the later parts of the route calculation
+	  didn't and therefore failed to find a route.
+
+2014-04-26 [r1552]  Andrew M. Bishop <amb>
+
+	* doc/INSTALL.txt, doc/html/installation.html,
+	  web/www/routino/search.cgi, web/www/routino/search.pl: Correct
+	  the list of Perl modules required to be installed to use the
+	  search function.
+
+2014-04-24 [r1551]  Andrew M. Bishop <amb>
+
+	* xml/scripts/drive.pl, xml/scripts/walk.pl: Omit some more
+	  properties from the special case tagging rules.
+
+2014-04-14 [r1550]  Andrew M. Bishop <amb>
+
+	* src/optimiser.c: Revert r1462 which makes no noticeable
+	  difference to the speed in normal operation but makes a lot of
+	  difference for databases created with the special "drive" tagging
+	  rules.
+
+2014-04-14 [r1549]  Andrew M. Bishop <amb>
+
+	* src/router.c: Check the number of waypoints after considering the
+	  --help and --help-profile options.
+
+2014-04-12 [r1548]  Andrew M. Bishop <amb>
+
+	* web/www/routino/router.leaflet.js,
+	  web/www/routino/router.openlayers.js: Disable the route
+	  calculation buttons if fewer than two waypoints are active (more
+	  cases).
+
+2014-04-12 [r1545-1547]  Andrew M. Bishop <amb>
+
+	* web/Makefile: Automatically update the translated files if the
+	  translation files or HTML templates change.
+
+	* web/translations/router.html, web/www/routino/router.css,
+	  web/www/routino/router.leaflet.js,
+	  web/www/routino/router.openlayers.js: Disable the route
+	  calculation buttons if fewer than two waypoints are active.
+
+	* src/router.c: Refuse to calculate a route if fewer than two
+	  waypoints are specified.
+
+2014-04-08 [r1544]  Andrew M. Bishop <amb>
+
+	* web/translations/translate.pl: Make script work with older
+	  versions of Perl.
+
+2014-04-06 [r1543]  Andrew M. Bishop <amb>
+
+	* src/output.c: Change routing instructions if on a bicycle and
+	  cyclebothways is enabled on the highways at the junctions (e.g.
+	  different count of roundabout exits).
+
+2014-04-05 [r1540-1542]  Andrew M. Bishop <amb>
+
+	* src/test, src/test/expected/roundabout-waypoints-WP01.txt
+	  (added), src/test/expected/roundabout-waypoints-WP02.txt (added),
+	  src/test/expected/roundabout-waypoints-WP03.txt (added),
+	  src/test/expected/roundabout-waypoints-WP04.txt (added),
+	  src/test/expected/roundabout-waypoints-WP05.txt (added),
+	  src/test/expected/roundabout-waypoints-WP06.txt (added),
+	  src/test/expected/roundabout-waypoints-WP07.txt (added),
+	  src/test/roundabout-waypoints.osm (added),
+	  src/test/roundabout-waypoints.sh (added): Add test case for
+	  router error when waypoint is on a roundabout. [Test case also
+	  unintentionally detected the super-segment merging bug.]
+
+	* src/test/Makefile: Compile programs before running tests (fix
+	  Makefile bug).
+
+	* src/superx.c: Fix bug with merging super-segments and segments -
+	  an improvement on fix that was applied in version 2.7.
+
+2014-04-04 [r1539]  Andrew M. Bishop <amb>
+
+	* src/output.c: Fix router error when waypoint is on a roundabout
+	  (stops crash).
+
+2014-04-02 [r1537-1538]  Andrew M. Bishop <amb>
+
+	* web/translations/translate.pl: Don't use HTML character entity
+	  encoding for UTF-8 characters in the HTML.
+
+	* web/translations/translation.de.txt,
+	  web/translations/translation.fr.txt,
+	  web/translations/translation.nl.txt,
+	  web/translations/translation.ru.txt: Trivial changes to the
+	  translation files to put them all into the same order.
+
+2014-04-01 [r1536]  Andrew M. Bishop <amb>
+
+	* web/translations/router.html, web/translations/translate.pl,
+	  web/translations/translation.ru.txt,
+	  web/translations/translations-body.xml,
+	  web/translations/visualiser.html: Use '~~' delimiters in the
+	  templates for the special-case replacement strings (like the
+	  language name).
+
+2014-03-31 [r1535]  Andrew M. Bishop <amb>
+
+	* web/translations/router.html, web/translations/translate.pl,
+	  web/translations/visualiser.html: Use '$$' delimiters in the
+	  templates for the multi-line replacement strings (to match the
+	  files of translation phrases).
+
+2014-03-25 [r1534]  Andrew M. Bishop <amb>
+
+	* web/translations/translation.ru.txt, web/www/routino,
+	  xml/routino-translations.xml: Add Russian translations submitted
+	  via http://www.routino.org/translations/ around 2014-03-23.
+
+2014-03-24 [r1533]  Andrew M. Bishop <amb>
+
+	* web/translations/translate.pl,
+	  web/translations/translation.de.txt,
+	  web/translations/translation.en.txt,
+	  web/translations/translation.fr.txt,
+	  web/translations/translation.nl.txt,
+	  web/translations/translation.ru.txt (added),
+	  web/translations/translations-body.xml (added),
+	  web/translations/translations-head.xml (added),
+	  web/translations/translations-tail.xml (added): Create the
+	  routino-translations.xml file from the translated language files
+	  in the same way as the HTML. Reverse engineer the existing XML
+	  file into the translation files for the languages.
+
+2014-03-23 [r1532]  Andrew M. Bishop <amb>
+
+	* doc/README.txt, doc/html/readme.html: Fixed typo in subversion
+	  command line example.
+
 2014-03-22  Andrew M. Bishop <amb>
 
 	Version 2.7 released.
diff --git a/doc/INSTALL.txt b/doc/INSTALL.txt
index 18e6bd9..b92ef90 100644
--- a/doc/INSTALL.txt
+++ b/doc/INSTALL.txt
@@ -53,9 +53,9 @@ Quick Start Guide
         sh -x install.sh
 
    To make full use of the location search feature on the Routino web page
-   you will need to install one extra perl package.
+   you will need to install some extra perl packages.
 
-        apt-get install libjson-pp-perl
+       apt-get install libwww-perl liburi-perl libjson-pp-perl
 
    Finally to make the web pages work you will need to add the extra lines
    to the Apache configuration file as described in the Configuration of
@@ -111,13 +111,20 @@ Pre-Requisites
    called liblzma-dev). The xz function is not enabled by default but can
    be enabled by uncommenting two lines in the file 'Makefile.conf'.
 
+   To compile the source code from subversion requires the Perl
+   Graphics::Magick module to generate the web page icons (on Linux this
+   might be in a package called libgraphics-magick-perl). The released
+   source code packages contains the icons so this package is not required
+   for compilation.
+
    To use the web page interface an http server is required. Instructions
    below are for Apache but any server that supports CGIs should work.
 
    The web pages use the Perl scripting language and a number of the
    default Perl modules. To use the search function on the router web page
-   the additional Perl module "JSON::PP" must be installed.
-
+   the Perl module JSON::PP must be installed (on Linux this might be in a
+   package called libjson-pp-perl if not part of the standard Perl
+   installation).
 
 Compilation
 -----------
@@ -274,7 +281,7 @@ Configuration of web files
    the Routino documentation.
 
 
-Configuration of web server
+Configuration of Web Server
 ---------------------------
 
    The file 'www/routino/.htaccess' contains all of the Apache
diff --git a/doc/NEWS.txt b/doc/NEWS.txt
index fce77bc..7046f46 100644
--- a/doc/NEWS.txt
+++ b/doc/NEWS.txt
@@ -1,3 +1,61 @@
+Version 2.7.2 of Routino released : Thu May 26 2014
+---------------------------------------------------
+
+Bug fixes:
+  Make the visualiser display all segments including those crossing the border.
+  Fix two errors that cause crashes only on 64-bit systems.
+
+planetsplitter / router:
+  Increase the size of the caches for the slim programs by a factor of four.
+
+Translations:
+  Updated Russian translations.
+  Updated German translations.
+
+
+Note: This version is compatible with databases from version 2.7.1.
+
+
+Version 2.7.1 of Routino released : Sat May 17 2014
+---------------------------------------------------
+
+Bug fixes:
+  Fix typo in documentation for command to get SVN version.
+  Fix router crash when waypoint is on roundabout.
+  Don't duplicate super-segments when merging them with normal segments.
+  Change routing instructions for bicycle if highways allow cycling both ways.
+  Make translation script work with older versions of Perl.
+  Fix router crash if fewer than two waypoints are specified.
+  Revert router speed decrease with special-case tagging rules.
+  Fix web page search function when it returns non-ASCII text.
+  Fix router failure due to invalid assumption about allowed U-turn.
+  Fix bug with updating XML files in web/data directory (Makefile error).
+  Fix router web page error due to absence of cyclebothways property entry.
+  Fix results error if a waypoint node was passed again on way to next waypoint.
+  Fix router crash when route contains consecutive coincident waypoints.
+  Fix bug with slightly incorrect distances when pruning short segments.
+
+Test cases:
+  Create new test case for roundabout waypoint bug fixed in this version.
+  Create new test case for invalid U-turn assumption bug fixed in this version.
+  Create new test case for cycling both ways.
+  Create new test case for consecutive coincident waypoints.
+
+router:
+  Remove cyclebothways as a property that can be used as a routing preference.
+
+Web pages:
+  Disallow route calculation if fewer than two waypoints are selected.
+  Update visualiser for change of cyclebothways handling.
+
+Translations:
+  Updated Russian translations.
+  Updated German translations.
+
+
+Note: This version is not compatible with databases from previous versions.
+
+
 Version 2.7 of Routino released : Sat Mar 22 2014
 -------------------------------------------------
 
@@ -43,7 +101,8 @@ Web pages:
 
 Note: This version has removed specific support for IE6 and IE7 browsers.
 
-Note: This version is compatible with databases from version 2.6.
+Note: This version is compatible with databases from version 2.6 (although
+      cycling both ways on one-way highways requires a database update).
 
 
 Version 2.6 of Routino released : Sat Jul 6 2013
diff --git a/doc/README.txt b/doc/README.txt
index 4a8b99b..4a9b2df 100644
--- a/doc/README.txt
+++ b/doc/README.txt
@@ -71,11 +71,10 @@ Demonstration
 
    A live demonstration of the router for the UK is available on the
    internet in both OpenLayers and Leaflet versions:
+
    http://www.routino.org/uk-leaflet/
    http://www.routino.org/uk-openlayers/
 
-   http://www.routino.org/uk/
-
    The source code download available below also includes a set of files
    that can be used to create your own interactive map.
 
@@ -127,6 +126,8 @@ Status
    Version 2.5.1 of Routino was released on 20th April 2013.
    Version 2.6 of Routino was released on 6th July 2013.
    Version 2.7 of Routino was released on 22nd March 2014.
+   Version 2.7.1 of Routino was released on 17th May 2014.
+   Version 2.7.2 of Routino was released on 26th June 2014.
 
    The full version history is available in the NEWS.txt file.
 
@@ -154,7 +155,7 @@ Copyright
 Homepage
 --------
 
-   The latest information about the program can be found on the homepage:
+   The Routino homepage has the latest news about the program:
 
    http://www.routino.org/
 
@@ -172,7 +173,7 @@ Subversion
    The source code can also be downloaded from the Subversion repository
    with a command like the following:
 
-   svn co http://gedanken.org.uk/svn/cxref/trunk cxref
+   svn co http://routino.org/svn/trunk routino
 
    The source code can also be browsed in the Subversion viewer which also
    has a list of the latest changes:
diff --git a/doc/TAGGING.txt b/doc/TAGGING.txt
index 2161848..e8c7b2d 100644
--- a/doc/TAGGING.txt
+++ b/doc/TAGGING.txt
@@ -387,11 +387,14 @@ Highway Defaults
    cycleway     yes   no     yes        yes     no    no         no       no    no  no
    path         yes   yes(2) yes        yes(2)  no    no         no       no    no  no
    steps        yes   no     no         no      no    no         no       no    no  no
+   ferry (3)    no    no     no         no      no    no         no       no    no  no
 
    Note 1: A trunk road may legally allow foot, horse or wheelchair access
    but in the absence of other tags is considered to be too dangerous.
    Note 2: A path allows bicycle or horse access by default only if
    actually labelled as a highway of type "bridleway".
+   Note 3: Ferry routes must be explicitly tagged with the allowed
+   transport types, it is not sensible to try to guess.
 
    Finally for the highway tag a number of default properties are added
    depending on the highway type.
@@ -410,6 +413,7 @@ Highway Defaults
    cycleway     paved
    path         paved (3)
    steps
+   ferry
 
    Note 1: A highway of this type has the multilane property by default if
    it is oneway.
@@ -462,8 +466,12 @@ Other Access Permissions
    type would not normally do so.
 
    A highway that is tagged as cycleway with one of several values will
-   allow bicycle access. If the value of the cycleway tag is opposite_lane
-   then the cyclebothways tag is set.
+   allow bicycle access. If the value of the cycleway tag is
+   opposite_lane, opposite_track or opposite then the cyclebothways tag is
+   set.
+
+   A highway that is tagged as oneway:bicycle with the value no will also
+   cause the cyclebothways tag to be set.
 
 Specific Access Permissions
 - - - - - - - - - - - - - -
@@ -545,4 +553,4 @@ Turn Restrictions
 
 --------
 
-Copyright 2008-2013 Andrew M. Bishop.
+Copyright 2008-2014 Andrew M. Bishop.
diff --git a/doc/USAGE.txt b/doc/USAGE.txt
index 376e809..6979740 100644
--- a/doc/USAGE.txt
+++ b/doc/USAGE.txt
@@ -504,7 +504,8 @@ filedumper
 
                o junctions = segment count at each junction.
                o super = super-node and super-segments.
-               o oneway = oneway segments.
+               o waytype-* = segments of oneway, cyclebothways or
+                 roundabout type.
                o highway-* = segments of the specified highway type (e.g.
                  highway-primary to display segments ofprimary roads).
                o transport-* = segments allowing the specified transport
diff --git a/doc/html/installation.html b/doc/html/installation.html
index a49a336..ccaac7a 100644
--- a/doc/html/installation.html
+++ b/doc/html/installation.html
@@ -113,10 +113,10 @@ sh -x install.sh
 </pre>
 
 To make full use of the location search feature on the Routino web page you will
-need to install one extra perl package.
+need to install some extra perl packages.
 
 <pre class="boxed">
-apt-get install libjson-pp-perl
+apt-get install libwww-perl liburi-perl libjson-pp-perl
 </pre>
 
 Finally to make the web pages work you will need to add the extra lines to the
@@ -188,14 +188,22 @@ two lines in the file <tt>Makefile.conf</tt>.
 
 <p>
 
+To compile the source code from subversion requires the Perl Graphics::Magick
+module to generate the web page icons (on Linux this might be in a package
+called libgraphics-magick-perl).  The released source code packages contains the
+icons so this package is not required for compilation.
+
+<p>
+
 To use the web page interface an http server is required.  Instructions below
 are for Apache but any server that supports CGIs should work.
 
 <p>
 
 The web pages use the Perl scripting language and a number of the default Perl
-modules.  To use the search function on the router web page the additional Perl
-module "JSON::PP" must be installed.
+modules.  To use the search function on the router web page the Perl module
+JSON::PP must be installed (on Linux this might be in a package called
+libjson-pp-perl if not part of the standard Perl installation).
 
 
 <h2 id="H_1_3">Compilation</h2>
diff --git a/doc/html/readme.html b/doc/html/readme.html
index f84c153..446129f 100644
--- a/doc/html/readme.html
+++ b/doc/html/readme.html
@@ -202,13 +202,17 @@ Version 2.5.1 of Routino was released on 20th April 2013.
 Version 2.6 of Routino was released on 6th July 2013.
 <br>
 Version 2.7 of Routino was released on 22nd March 2014.
+<br>
+Version 2.7.1 of Routino was released on 17th May 2014.
+<br>
+Version 2.7.2 of Routino was released on 26th June 2014.
 
 <p>
 
 The full version history is available in the NEWS.txt file.
 
 
-<h3 id="H_1_5_1" title="Changes">Changes in Versions 2.7</h3>
+<h3 id="H_1_5_1" title="Changes_2.7">Changes in Versions 2.7</h3>
 
 Version 2.7 - mostly web page usability improvements.
 
@@ -258,8 +262,72 @@ Version 2.7 - mostly web page usability improvements.
 <p>
 <b>Note:</b> Note: This version is compatible with databases from version 2.6.
 
+<h3 id="H_1_5_2" title="Changes_2.7.1">Changes in Versions 2.7.1</h3>
+
+Version 2.7.1 - mostly bug fixes (some from version 2.7, but mostly older ones).
+
+<dl>
+  <dt>Bug fixes:
+    <dd>Fix typo in documentation for command to get SVN version.
+    <br>Fix router crash when waypoint is on roundabout.
+    <br>Don't duplicate super-segments when merging them with normal segments.
+    <br>Change routing instructions for bicycle if highways allow cycling both ways.
+    <br>Make translation script work with older versions of Perl.
+    <br>Fix router crash if fewer than two waypoints are specified.
+    <br>Revert router speed decrease with special-case tagging rules.
+    <br>Fix web page search function when it returns non-ASCII text.
+    <br>Fix router failure due to invalid assumption about allowed U-turn.
+    <br>Fix bug with updating XML files in web/data directory (Makefile error).
+    <br>Fix router web page error due to absence of cyclebothways property entry.
+    <br>Fix results error if a waypoint node was passed again on way to next waypoint.
+    <br>Fix router crash when route contains consecutive coincident waypoints.
+    <br>Fix bug with slightly incorrect distances when pruning short segments.
+
+  <dt>Test cases:
+    <dd>Create new test case for roundabout waypoint bug fixed in this version.
+    <br>Create new test case for invalid U-turn assumption bug fixed in this version.
+    <br>Create new test case for cycling both ways.
+    <br>Create new test case for consecutive coincident waypoints.
+
+  <dt>router:
+    <dd>Remove cyclebothways as a property that can be used as a routing preference.
+
+  <dt>Web pages:
+    <dd>Disallow route calculation if fewer than two waypoints are selected.
+    <br>Update visualiser for change of cyclebothways handling.
+
+  <dt>Translations:
+    <dd>Updated Russian translations.
+    <br>Updated German translations.
+</dl>
+
+<p>
+<b>Note:</b> This version is not compatible with databases from previous versions.
+
+
+<h3 id="H_1_5_3" title="Changes_2.7.2">Changes in Versions 2.7.2</h3>
+
+Version 2.7.2 - mostly bug fixes introduced in version 2.7.1 on 64-bit systems.
+
+<dl>
+  <dt>Bug fixes:
+    <dd>Make the visualiser display all segments including those crossing the border.
+    <br>Fix two errors that cause crashes only on 64-bit systems.
+
+  <dt>planetsplitter / router:
+    <dd>Increase the size of the caches for the slim programs by a factor of four.
+
+  <dt>Translations:
+    <dd>Updated Russian translations.
+    <br>Updated German translations.
+</dl>
+
+<p>
+<b>Note:</b> This version is compatible with databases from version 2.7.1.
+
+
 
-<h3 id="H_1_5_2">License</h3>
+<h2 id="H_1_6">License</h2>
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the
@@ -275,30 +343,30 @@ additional requirements to anybody who provides a networked service using this
 software.
 
 
-<h3 id="H_1_5_3">Copyright</h3>
+<h3 id="H_1_7">Copyright</h3>
 
 Routino is copyright Andrew M. Bishop 2008-2014.
 
 
-<h2 id="H_1_6">Homepage</h2>
+<h2 id="H_1_8">Homepage</h2>
 
 The <a title="Homepage" href="http://www.routino.org/">Routino homepage</a>
 has the latest news about the program.
 
 
-<h2 id="H_1_7">Download</h2>
+<h2 id="H_1_9">Download</h2>
 
 The <a title="Download directory" href="http://www.routino.org/download/">download directory</a>
 contains the latest version of the source code.
 
-<h3 id="H_1_7_2">Subversion</h3>
+<h3 id="H_1_9_1">Subversion</h3>
 
 The source code can also be downloaded from the
 <a title="SVN Repository" href="http://routino.org/svn/trunk/">Subversion repository</a>
 with a command like the following:
 
 <pre class="boxed">
-svn co http://gedanken.org.uk/svn/cxref/trunk cxref
+svn co http://routino.org/svn/trunk routino
 </pre>
 
 <p>
diff --git a/doc/html/tagging.html b/doc/html/tagging.html
index a482430..50617d3 100644
--- a/doc/html/tagging.html
+++ b/doc/html/tagging.html
@@ -698,6 +698,18 @@ below.
     <td class="center">no
     <td class="center">no
     <td class="center">no
+  <tr>
+    <td class="left">ferry (3)
+    <td class="center">no
+    <td class="center">no
+    <td class="center">no
+    <td class="center">no
+    <td class="center">no
+    <td class="center">no
+    <td class="center">no
+    <td class="center">no
+    <td class="center">no
+    <td class="center">no
 </table>
 
 <p>
@@ -708,6 +720,9 @@ below.
   <br>
   Note 2: A path allows bicycle or horse access by default only if actually
   labelled as a highway of type "bridleway".
+  <br>
+  Note 3: Ferry routes must be explicitly tagged with the allowed transport
+  types, it is not sensible to try to guess.
 </i>
 
 <p>
@@ -757,6 +772,9 @@ on the highway type.
   <tr>
     <td class="center">steps
     <td class="center">
+  <tr>
+    <td class="center">ferry
+    <td class="center">
 </table>
 
 <p>
@@ -832,7 +850,12 @@ type would not normally do so.
 <p>
 A highway that is tagged as <em>cycleway</em> with one of several values will
 allow bicycle access.  If the value of the <em>cycleway</em> tag
-is <em>opposite_lane</em> then the <em>cyclebothways</em> tag is set.
+is <em>opposite_lane</em>, <em>opposite_track</em> or <em>opposite</em> then
+the <em>cyclebothways</em> tag is set.
+
+<p>
+A highway that is tagged as <em>oneway:bicycle</em> with the value <em>no</em>
+will also cause the <em>cyclebothways</em> tag to be set.
 
 
 <h4 id="H_1_3_2_4" title="Specific access">Specific Access Permissions</h4>
diff --git a/doc/html/usage.html b/doc/html/usage.html
index ea148b9..cc70195 100644
--- a/doc/html/usage.html
+++ b/doc/html/usage.html
@@ -489,8 +489,8 @@ Usage: filedumper [--help]
         <ul>
           <li>junctions   = segment count at each junction.
           <li>super       = super-node and super-segments.
-          <li>oneway      = oneway segments.
-          <li>highway-* = segments of the specified highway type
+          <li>waytype-*   = segments of oneway, cyclebothways or roundabout type.
+          <li>highway-*   = segments of the specified highway type
           (e.g. highway-primary to display segments ofprimary roads).
           <li>transport-* = segments allowing the specified transport type
           (e.g. transport-foot to display segments accessible on foot).
diff --git a/src/cache.h b/src/cache.h
index 88d6a77..a10bb65 100644
--- a/src/cache.h
+++ b/src/cache.h
@@ -3,7 +3,7 @@
 
  Part of the Routino routing software.
  ******************/ /******************
- This file Copyright 2013 Andrew M. Bishop
+ This file Copyright 2013-2014 Andrew M. Bishop
 
  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU Affero General Public License as published by
@@ -33,7 +33,7 @@
 
 /* Macros for constants */
 
-#define CACHEWIDTH 2048         /*+ The width of the cache. +*/
+#define CACHEWIDTH 8192         /*+ The width of the cache. +*/
 #define CACHEDEPTH   16         /*+ The depth of the cache. +*/
 
 
diff --git a/src/errorlogx.c b/src/errorlogx.c
index 08e5028..c7c9508 100644
--- a/src/errorlogx.c
+++ b/src/errorlogx.c
@@ -930,7 +930,7 @@ void SaveErrorLogs(ErrorLogsX *errorlogsx,char *filename)
    {
     int i;
     char buffer[4096];
-    off_t chunksize=(size>sizeof(buffer)?sizeof(buffer):size);
+    off_t chunksize=(size>(off_t)sizeof(buffer)?(off_t)sizeof(buffer):size);
 
     ReadFileBuffered(oldfd,buffer,chunksize);
 
diff --git a/src/fakes.c b/src/fakes.c
index 9fb0cef..863066f 100644
--- a/src/fakes.c
+++ b/src/fakes.c
@@ -3,7 +3,7 @@
 
  Part of the Routino routing software.
  ******************/ /******************
- This file Copyright 2008-2013 Andrew M. Bishop
+ This file Copyright 2008-2014 Andrew M. Bishop
 
  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU Affero General Public License as published by
@@ -204,6 +204,33 @@ index_t CreateFakes(Nodes *nodes,Segments *segments,int point,Segment *segmentp,
 
 
 /*++++++++++++++++++++++++++++++++++++++
+  Create a fake segment connecting a node to itself.
+
+  index_t CreateFakeNullSegment Returns the index of a fake segment.
+
+  Segments *segments The list of segments to use.
+
+  index_t node The node that is to be linked.
+
+  index_t segment The segment that is to be emulated.
+
+  int point The waypoint number.
+  ++++++++++++++++++++++++++++++++++++++*/
+
+index_t CreateFakeNullSegment(Segments *segments,index_t node,index_t segment,int point)
+{
+ Segment *segmentp=LookupSegment(segments,segment,1);
+
+ fake_segments[4*point-2].node1=node;
+ fake_segments[4*point-2].node2=node;
+ fake_segments[4*point-2].way=segmentp->way;
+ fake_segments[4*point-2].distance=0;
+
+ return(4*point-2+SEGMENT_FAKE);
+}
+
+
+/*++++++++++++++++++++++++++++++++++++++
   Lookup the latitude and longitude of a fake node.
 
   index_t fakenode The fake node to lookup.
diff --git a/src/fakes.h b/src/fakes.h
index 211e2bf..26a138f 100644
--- a/src/fakes.h
+++ b/src/fakes.h
@@ -3,7 +3,7 @@
 
  Part of the Routino routing software.
  ******************/ /******************
- This file Copyright 2008-2012 Andrew M. Bishop
+ This file Copyright 2008-2014 Andrew M. Bishop
 
  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU Affero General Public License as published by
@@ -39,6 +39,8 @@
 
 index_t CreateFakes(Nodes *nodes,Segments *segments,int point,Segment *segmentp,index_t node1,index_t node2,distance_t dist1,distance_t dist2);
 
+index_t CreateFakeNullSegment(Segments *segments,index_t node,index_t segment,int point);
+
 void GetFakeLatLong(index_t fakenode, double *latitude,double *longitude);
 
 Segment *FirstFakeSegment(index_t fakenode);
diff --git a/src/filedumper.c b/src/filedumper.c
index 6e614a0..9aded19 100644
--- a/src/filedumper.c
+++ b/src/filedumper.c
@@ -3,7 +3,7 @@
 
  Part of the Routino routing software.
  ******************/ /******************
- This file Copyright 2008-2013 Andrew M. Bishop
+ This file Copyright 2008-2014 Andrew M. Bishop
 
  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU Affero General Public License as published by
@@ -170,8 +170,12 @@ int main(int argc,char** argv)
        OutputJunctions(OSMNodes,OSMSegments,OSMWays,OSMRelations,latmin,latmax,lonmin,lonmax);
     else if(!strcmp(option_data,"super"))
        OutputSuper(OSMNodes,OSMSegments,OSMWays,OSMRelations,latmin,latmax,lonmin,lonmax);
-    else if(!strcmp(option_data,"oneway"))
-       OutputOneway(OSMNodes,OSMSegments,OSMWays,OSMRelations,latmin,latmax,lonmin,lonmax);
+    else if(!strcmp(option_data,"waytype-oneway"))
+       OutputWaytype(OSMNodes,OSMSegments,OSMWays,OSMRelations,latmin,latmax,lonmin,lonmax,Highway_OneWay);
+    else if(!strcmp(option_data,"waytype-cyclebothways"))
+       OutputWaytype(OSMNodes,OSMSegments,OSMWays,OSMRelations,latmin,latmax,lonmin,lonmax,Highway_CycleBothWays);
+    else if(!strcmp(option_data,"waytype-roundabout"))
+       OutputWaytype(OSMNodes,OSMSegments,OSMWays,OSMRelations,latmin,latmax,lonmin,lonmax,Highway_Roundabout);
     else if(!strncmp(option_data,"highway",7) && option_data[7]=='-' && (highway=HighwayType(option_data+8))!=Highway_None)
        OutputHighway(OSMNodes,OSMSegments,OSMWays,OSMRelations,latmin,latmax,lonmin,lonmax,highway);
     else if(!strncmp(option_data,"transport",9) && option_data[9]=='-' && (transport=TransportType(option_data+10))!=Transport_None)
@@ -553,7 +557,11 @@ static void print_way(Ways *ways,index_t item)
  printf("Way %"Pindex_t"\n",item);
  if(*name)
     printf("  name=%s\n",name);
- printf("  type=%02x (%s%s%s)\n",wayp->type,HighwayName(HIGHWAY(wayp->type)),wayp->type&Highway_OneWay?",One-Way":"",wayp->type&Highway_Roundabout?",Roundabout":"");
+ printf("  type=%02x (%s%s%s%s)\n",wayp->type,
+                                   HighwayName(HIGHWAY(wayp->type)),
+                                   wayp->type&Highway_OneWay?",One-Way":"",
+                                   wayp->type&Highway_CycleBothWays?",Cycle-Both-Ways":"",
+                                   wayp->type&Highway_Roundabout?",Roundabout":"");
  printf("  allow=%02x (%s)\n",wayp->allow,AllowedNameList(wayp->allow));
  if(wayp->props)
     printf("  props=%02x (%s)\n",wayp->props,PropertiesNameList(wayp->props));
@@ -854,6 +862,9 @@ static void print_segment_osm(Segments *segments,index_t item,Ways *ways)
  if(wayp->type & Highway_OneWay)
     printf("    <tag k='oneway' v='yes' />\n");
 
+ if(wayp->type & Highway_CycleBothWays)
+    printf("    <tag k='cyclebothways' v='yes' />\n");
+
  if(wayp->type & Highway_Roundabout)
     printf("    <tag k='roundabout' v='yes' />\n");
 
@@ -1026,6 +1037,9 @@ static void print_segment_visualiser(Segments *segments,index_t item,Ways *ways)
  if(wayp->type & Highway_OneWay)
     printf("   <tag k='oneway' v='yes' />\n");
 
+ if(wayp->type & Highway_CycleBothWays)
+    printf("   <tag k='cyclebothways' v='yes' />\n");
+
  if(wayp->type & Highway_Roundabout)
     printf("   <tag k='roundabout' v='yes' />\n");
 
@@ -1227,7 +1241,7 @@ static void print_usage(int detail,const char *argerr,const char *err)
             "  <data-type> can be selected from:\n"
             "      junctions   = segment count at each junction.\n"
             "      super       = super-node and super-segments.\n"
-            "      oneway      = oneway segments.\n"
+            "      waytype-*   = segments of oneway, cyclebothways or roundabout type.\n"
             "      highway-*   = segments of the specified highway type.\n"
             "      transport-* = segments allowing the specified transport type.\n"
             "      barrier-*   = nodes disallowing the specified transport type.\n"
diff --git a/src/optimiser.c b/src/optimiser.c
index 1e8dfa3..7c766a4 100644
--- a/src/optimiser.c
+++ b/src/optimiser.c
@@ -176,7 +176,7 @@ Results *FindNormalRoute(Nodes *nodes,Segments *segments,Ways *ways,Relations *r
 
           wayp=LookupWay(ways,segmentp->way,1);
 
-          if(!(wayp->props&Properties_CycleBothWays))
+          if(!(wayp->type&Highway_CycleBothWays))
              goto endloop;
          }
 
@@ -236,10 +236,13 @@ Results *FindNormalRoute(Nodes *nodes,Segments *segments,Ways *ways,Relations *r
           goto endloop;
 
        for(i=1;i<Property_Count;i++)
-          if(wayp->props & PROPERTIES(i))
-             segment_pref*=profile->props_yes[i];
-          else
-             segment_pref*=profile->props_no[i];
+          if(ways->file.props & PROPERTIES(i))
+            {
+             if(wayp->props & PROPERTIES(i))
+                segment_pref*=profile->props_yes[i];
+             else
+                segment_pref*=profile->props_no[i];
+            }
 
        /* profile preferences must allow this highway */
        if(segment_pref==0)
@@ -411,7 +414,7 @@ Results *FindMiddleRoute(Nodes *nodes,Segments *segments,Ways *ways,Relations *r
  while(result3)
    {
     if((results->start_node!=result3->node || results->prev_segment!=result3->segment) &&
-       !IsFakeNode(result3->node) && IsSuperNode(LookupNode(nodes,result3->node,5)))
+       !IsFakeNode(result3->node) && IsSuperNode(LookupNode(nodes,result3->node,3)))
       {
        Result *result5=result1;
        index_t superseg=FindSuperSegment(nodes,segments,ways,relations,profile,result3->node,result3->segment);
@@ -420,6 +423,8 @@ Results *FindMiddleRoute(Nodes *nodes,Segments *segments,Ways *ways,Relations *r
          {
           result5=InsertResult(results,result3->node,result3->segment);
 
+          result5->score=result3->score;
+
           result5->prev=result1;
          }
 
@@ -505,7 +510,7 @@ Results *FindMiddleRoute(Nodes *nodes,Segments *segments,Ways *ways,Relations *r
 
           wayp=LookupWay(ways,segmentp->way,1);
 
-          if(!(wayp->props&Properties_CycleBothWays))
+          if(!(wayp->type&Highway_CycleBothWays))
              goto endloop;
          }
 
@@ -549,10 +554,13 @@ Results *FindMiddleRoute(Nodes *nodes,Segments *segments,Ways *ways,Relations *r
           goto endloop;
 
        for(i=1;i<Property_Count;i++)
-          if(wayp->props & PROPERTIES(i))
-             segment_pref*=profile->props_yes[i];
-          else
-             segment_pref*=profile->props_no[i];
+          if(ways->file.props & PROPERTIES(i))
+            {
+             if(wayp->props & PROPERTIES(i))
+                segment_pref*=profile->props_yes[i];
+             else
+                segment_pref*=profile->props_no[i];
+            }
 
        /* profile preferences must allow this highway */
        if(segment_pref==0)
@@ -707,15 +715,15 @@ static index_t FindSuperSegment(Nodes *nodes,Segments *segments,Ways *ways,Relat
  if(IsFakeSegment(finish_segment))
     finish_segment=IndexRealSegment(finish_segment);
 
- supernodep=LookupNode(nodes,finish_node,5); /* finish_node cannot be a fake node (must be a super-node) */
- supersegmentp=LookupSegment(segments,finish_segment,2); /* finish_segment cannot be a fake segment. */
+ supernodep=LookupNode(nodes,finish_node,3); /* finish_node cannot be a fake node (must be a super-node) */
+ supersegmentp=LookupSegment(segments,finish_segment,4); /* finish_segment cannot be a fake segment. */
 
  if(IsSuperSegment(supersegmentp))
     return(finish_segment);
 
  /* Loop across all segments */
 
- supersegmentp=FirstSegment(segments,supernodep,3); /* supernode cannot be a fake node (must be a super-node) */
+ supersegmentp=FirstSegment(segments,supernodep,4); /* supernode cannot be a fake node (must be a super-node) */
 
  while(supersegmentp)
    {
@@ -805,11 +813,11 @@ static Results *FindSuperRoute(Nodes *nodes,Segments *segments,Ways *ways,Relati
     node1=result1->node;
     seg1=result1->segment;
 
-    node1p=LookupNode(nodes,node1,1); /* node1 cannot be a fake node */
+    node1p=LookupNode(nodes,node1,3); /* node1 cannot be a fake node */
 
     /* Loop across all segments */
 
-    segmentp=FirstSegment(segments,node1p,1); /* node1 cannot be a fake node */
+    segmentp=FirstSegment(segments,node1p,3); /* node1 cannot be a fake node */
 
     while(segmentp)
       {
@@ -829,9 +837,9 @@ static Results *FindSuperRoute(Nodes *nodes,Segments *segments,Ways *ways,Relati
           if(profile->allow!=Transports_Bicycle)
              goto endloop;
 
-          wayp=LookupWay(ways,segmentp->way,1);
+          wayp=LookupWay(ways,segmentp->way,2);
 
-          if(!(wayp->props&Properties_CycleBothWays))
+          if(!(wayp->type&Highway_CycleBothWays))
              goto endloop;
          }
 
@@ -843,7 +851,7 @@ static Results *FindSuperRoute(Nodes *nodes,Segments *segments,Ways *ways,Relati
 
        node2=OtherNode(segmentp,node1);
 
-       node2p=LookupNode(nodes,node2,2); /* node2 cannot be a fake node */
+       node2p=LookupNode(nodes,node2,4); /* node2 cannot be a fake node */
 
        /* must not pass over super-node */
        if(node2!=finish_node && IsSuperNode(node2p))
@@ -1003,7 +1011,7 @@ Results *FindStartRoutes(Nodes *nodes,Segments *segments,Ways *ways,Relations *r
 
           wayp=LookupWay(ways,segmentp->way,1);
 
-          if(!(wayp->props&Properties_CycleBothWays))
+          if(!(wayp->type&Highway_CycleBothWays))
              goto endloop;
          }
 
@@ -1056,10 +1064,13 @@ Results *FindStartRoutes(Nodes *nodes,Segments *segments,Ways *ways,Relations *r
           goto endloop;
 
        for(i=1;i<Property_Count;i++)
-          if(wayp->props & PROPERTIES(i))
-             segment_pref*=profile->props_yes[i];
-          else
-             segment_pref*=profile->props_no[i];
+          if(ways->file.props & PROPERTIES(i))
+            {
+             if(wayp->props & PROPERTIES(i))
+                segment_pref*=profile->props_yes[i];
+             else
+                segment_pref*=profile->props_no[i];
+            }
 
        /* profile preferences must allow this highway */
        if(segment_pref==0)
@@ -1240,7 +1251,7 @@ Results *ExtendStartRoutes(Nodes *nodes,Segments *segments,Ways *ways,Relations
          }
 
     if(!IsFakeNode(result3->node))
-       if(IsSuperNode(LookupNode(nodes,result3->node,5)))
+       if(IsSuperNode(LookupNode(nodes,result3->node,3)))
           InsertInQueue(queue,result3,result3->score);
 
     result3=NextResult(results,result3);
@@ -1303,7 +1314,7 @@ Results *ExtendStartRoutes(Nodes *nodes,Segments *segments,Ways *ways,Relations
 
           wayp=LookupWay(ways,segmentp->way,1);
 
-          if(!(wayp->props&Properties_CycleBothWays))
+          if(!(wayp->type&Highway_CycleBothWays))
              goto endloop;
          }
 
@@ -1349,10 +1360,13 @@ Results *ExtendStartRoutes(Nodes *nodes,Segments *segments,Ways *ways,Relations
           goto endloop;
 
        for(i=1;i<Property_Count;i++)
-          if(wayp->props & PROPERTIES(i))
-             segment_pref*=profile->props_yes[i];
-          else
-             segment_pref*=profile->props_no[i];
+          if(ways->file.props & PROPERTIES(i))
+            {
+             if(wayp->props & PROPERTIES(i))
+                segment_pref*=profile->props_yes[i];
+             else
+                segment_pref*=profile->props_no[i];
+            }
 
        /* profile preferences must allow this highway */
        if(segment_pref==0)
@@ -1489,7 +1503,7 @@ Results *FindFinishRoutes(Nodes *nodes,Segments *segments,Ways *ways,Relations *
     node1=result1->node;
     seg1=result1->segment;
 
-    if(IsFakeSegment(seg1))
+    if(seg1!=NO_SEGMENT && IsFakeSegment(seg1))
        seg1r=IndexRealSegment(seg1);
     else
        seg1r=seg1;
@@ -1532,7 +1546,7 @@ Results *FindFinishRoutes(Nodes *nodes,Segments *segments,Ways *ways,Relations *
 
           wayp=LookupWay(ways,segmentp->way,1);
 
-          if(!(wayp->props&Properties_CycleBothWays))
+          if(!(wayp->type&Highway_CycleBothWays))
              goto endloop;
          }
 
@@ -1550,11 +1564,24 @@ Results *FindFinishRoutes(Nodes *nodes,Segments *segments,Ways *ways,Relations *
          }
 
        /* must not perform U-turn (unless profile allows) */
-       if(profile->turns && (seg1==seg2 || seg1==seg2r || seg1r==seg2 || (seg1r==seg2r && IsFakeUTurn(seg1,seg2))))
-          goto endloop;
+       if(profile->turns && seg1!=NO_SEGMENT)
+         {
+          if(IsFakeNode(node1) || !IsSuperNode(node1p))
+            {
+             if(seg1==seg2 || seg1==seg2r || seg1r==seg2 || (seg1r==seg2r && IsFakeUTurn(seg1,seg2)))
+                goto endloop;
+            }
+          else
+            {
+             index_t superseg=FindSuperSegment(nodes,segments,ways,relations,profile,node1,seg1);
+
+             if(seg2==superseg)
+                goto endloop;
+            }
+         }
 
        /* must obey turn relations */
-       if(turnrelation!=NO_RELATION)
+       if(turnrelation!=NO_RELATION && seg1!=NO_SEGMENT)
          {
           index_t turnrelation2=FindFirstTurnRelation2(relations,node1,seg2r); /* node2 -> node1 -> result1->next->node */
 
@@ -1585,10 +1612,13 @@ Results *FindFinishRoutes(Nodes *nodes,Segments *segments,Ways *ways,Relations *
           goto endloop;
 
        for(i=1;i<Property_Count;i++)
-          if(wayp->props & PROPERTIES(i))
-             segment_pref*=profile->props_yes[i];
-          else
-             segment_pref*=profile->props_no[i];
+          if(ways->file.props & PROPERTIES(i))
+            {
+             if(wayp->props & PROPERTIES(i))
+                segment_pref*=profile->props_yes[i];
+             else
+                segment_pref*=profile->props_no[i];
+            }
 
        /* profile preferences must allow this highway */
        if(segment_pref==0)
diff --git a/src/osmparser.c b/src/osmparser.c
index 3dfd4f4..f0437c0 100644
--- a/src/osmparser.c
+++ b/src/osmparser.c
@@ -413,7 +413,7 @@ void ProcessWayTags(TagList *tags,int64_t way_id,int mode)
 {
  Way way={0};
  int oneway=0,area=0;
- int roundabout=0,lanes=0;
+ int roundabout=0,lanes=0,cyclebothways=0;
  char *name=NULL,*ref=NULL,*refname=NULL;
  way_t id;
  int i;
@@ -529,7 +529,7 @@ void ProcessWayTags(TagList *tags,int64_t way_id,int mode)
        if(!strcmp(k,"cyclebothways"))
          {
           if(ISTRUE(v))
-             way.props|=Properties_CycleBothWays;
+             cyclebothways=1;
           else if(!ISFALSE(v))
              logerror("Way %"Pway_t" has an unrecognised tag 'cyclebothways' = '%s' (after tagging rules); using 'no'.\n",logerror_way(id),v);
           recognised=1; break;
@@ -777,19 +777,28 @@ void ProcessWayTags(TagList *tags,int64_t way_id,int mode)
 
  if(area && oneway)
    {
-    logerror("Way %"Pway_t" is an area and oneway; ignoring area tagging.\n",logerror_way(id));
+    logerror("Way %"Pway_t" is an area and oneway; ignoring area tag.\n",logerror_way(id));
     area=0;
    }
 
- if(!oneway && way.props&Properties_CycleBothWays)
+ if(cyclebothways && !oneway)
    {
-    logerror("Way %"Pway_t" is not oneway and cyclebothways; ignoring cyclebothways tagging.\n",logerror_way(id));
-    way.props&=~Properties_CycleBothWays;
+    logerror("Way %"Pway_t" is cyclebothways but not oneway; ignoring cyclebothways tag.\n",logerror_way(id));
+    cyclebothways=0;
+   }
+
+ if(roundabout && !oneway)
+   {
+    logerror("Way %"Pway_t" is roundabout but not oneway; adding oneway tag.\n",logerror_way(id));
+    oneway=1;
    }
 
  if(!way.allow)
     return;
 
+ if(cyclebothways)
+    way.type|=Highway_CycleBothWays;
+
  if(oneway)
    {
     way.type|=Highway_OneWay;
diff --git a/src/output.c b/src/output.c
index e464f20..87e9325 100644
--- a/src/output.c
+++ b/src/output.c
@@ -40,6 +40,8 @@
 #include "xmlparse.h"
 
 
+#define DEBUG 0
+
 /* Constants */
 
 #define IMP_IGNORE      -1      /*+ Ignore this point. +*/
@@ -106,6 +108,7 @@ void PrintRoute(Results **results,int nresults,Nodes *nodes,Segments *segments,W
  FILE *htmlfile=NULL,*gpxtrackfile=NULL,*gpxroutefile=NULL,*textfile=NULL,*textallfile=NULL;
 
  char *prev_bearing=NULL,*prev_wayname=NULL;
+ index_t prev_node=NO_NODE;
  distance_t cum_distance=0;
  duration_t cum_duration=0;
 
@@ -323,11 +326,27 @@ void PrintRoute(Results **results,int nresults,Nodes *nodes,Segments *segments,W
 
  do
    {
+    int first=1;
     int next_point=point;
     distance_t junc_distance=0;
     duration_t junc_duration=0;
     Result *result;
 
+#if DEBUG
+    printf("Route section %d - waypoint %d to waypoint %d\n",point,results[point]->start_waypoint,results[point]->finish_waypoint);
+    printf("  start_node=%"Pindex_t" prev_segment=%"Pindex_t"\n",results[point]->start_node,results[point]->prev_segment);
+    printf("  finish_node=%"Pindex_t" last_segment=%"Pindex_t"\n",results[point]->finish_node,results[point]->last_segment);
+
+    Result *r=FindResult(results[point],results[point]->start_node,results[point]->prev_segment);
+
+    while(r)
+      {
+       printf("    node=%"Pindex_t" segment=%"Pindex_t" score=%f\n",r->node,r->segment,r->score);
+
+       r=r->next;
+      }
+#endif
+
     result=FindResult(results[point],results[point]->start_node,results[point]->prev_segment);
 
     /* Print the start of the segment */
@@ -382,7 +401,7 @@ void PrintRoute(Results **results,int nresults,Nodes *nodes,Segments *segments,W
 
        /* Calculate the information about this segment */
 
-       if(result->node!=results[point]->start_node) /* not first point of a section of the route */
+       if(!first)               /* not first point of a section of the route */
          {
           if(IsFakeSegment(result->segment))
             {
@@ -439,26 +458,57 @@ void PrintRoute(Results **results,int nresults,Nodes *nodes,Segments *segments,W
                }
              else
                {
-                Segment *segmentp=FirstSegment(segments,resultnodep,3);
+                Segment *segmentp;
+
+                if(resultnodep)
+                   segmentp=FirstSegment(segments,resultnodep,3);
+                else
+                   segmentp=FirstFakeSegment(result->node);
 
                 do
                   {
                    index_t othernode=OtherNode(segmentp,result->node);
+                   index_t thissegment;
 
-                   if(othernode!=result->prev->node && IndexSegment(segments,segmentp)!=realsegment)
-                      if(IsNormalSegment(segmentp) && (!profile->oneway || !IsOnewayTo(segmentp,result->node)))
+                   if(IsFakeNode(result->node))
+                      thissegment=IndexFakeSegment(segmentp);
+                   else
+                      thissegment=IndexSegment(segments,segmentp);
+
+                   if(othernode!=prev_node && othernode!=next_result->node &&
+                      thissegment!=realsegment && IsNormalSegment(segmentp))
+                     {
+                      int canexit=1;
+
+                      if(profile->oneway && IsOnewayTo(segmentp,result->node))
+                        {
+                         if(profile->allow!=Transports_Bicycle)
+                            canexit=0;
+                         else
+                           {
+                            Way *wayp=LookupWay(ways,segmentp->way,3);
+
+                            if(!(wayp->type&Highway_CycleBothWays))
+                               canexit=0;
+                           }
+                        }
+
+                      if(canexit)
                         {
                          Way *wayp=LookupWay(ways,segmentp->way,3);
 
                          if(!(wayp->type&Highway_Roundabout))
-                            if(othernode!=next_result->node)
-                              {
-                               roundabout++;
-                               important=IMP_RB_NOT_EXIT;
-                              }
+                           {
+                            roundabout++;
+                            important=IMP_RB_NOT_EXIT;
+                           }
                         }
+                     }
 
-                   segmentp=NextSegment(segments,segmentp,result->node);
+                   if(resultnodep)
+                      segmentp=NextSegment(segments,segmentp,result->node);
+                   else
+                      segmentp=NextFakeSegment(segmentp,result->node);
                   }
                 while(segmentp);
                }
@@ -473,14 +523,14 @@ void PrintRoute(Results **results,int nresults,Nodes *nodes,Segments *segments,W
 
        /* Decide if this is an important junction */
 
-       if(roundabout)           /* roundabout */
-          ;
-       else if(point_count==0)  /* first point overall = Waypoint */
+       if(point_count==0)  /* first point overall = Waypoint */
           important=IMP_WAYPOINT;
-       else if(result->node==results[point]->finish_node) /* Waypoint */
+       else if(result->next==NULL) /* Waypoint */
           important=IMP_WAYPOINT;
-       else if(result->node==results[point]->start_node) /* first point of a section of the route */
+       else if(first)           /* first point of a section of the route */
           important=IMP_IGNORE;
+       else if(roundabout)      /* roundabout */
+          ;
        else if(realsegment==next_realsegment) /* U-turn */
           important=IMP_UTURN;
        else if(resultnodep && (resultnodep->flags&NODE_MINIRNDBT))
@@ -493,8 +543,24 @@ void PrintRoute(Results **results,int nresults,Nodes *nodes,Segments *segments,W
             {
              index_t seg=IndexSegment(segments,segmentp);
 
-             if(seg!=realsegment)
-                if(IsNormalSegment(segmentp) && (!profile->oneway || !IsOnewayTo(segmentp,result->node)))
+             if(seg!=realsegment && IsNormalSegment(segmentp))
+               {
+                int cango=1;
+
+                if(profile->oneway && IsOnewayTo(segmentp,result->node))
+                  {
+                   if(profile->allow!=Transports_Bicycle)
+                      cango=0;
+                   else
+                     {
+                      Way *wayp=LookupWay(ways,segmentp->way,3);
+
+                      if(!(wayp->type&Highway_CycleBothWays))
+                         cango=0;
+                     }
+                  }
+
+                if(cango)
                   {
                    Way *wayp=LookupWay(ways,segmentp->way,3);
 
@@ -514,6 +580,7 @@ void PrintRoute(Results **results,int nresults,Nodes *nodes,Segments *segments,W
                          important=IMP_JUNCT_CONT;
                      }
                   }
+               }
 
              segmentp=NextSegment(segments,segmentp,result->node);
             }
@@ -522,7 +589,7 @@ void PrintRoute(Results **results,int nresults,Nodes *nodes,Segments *segments,W
 
        /* Calculate the strings to be used */
 
-       if(resultwayp && textallfile)
+       if(!first && textallfile)
          {
           waynameraw=WayName(ways,resultwayp);
           if(!*waynameraw)
@@ -535,9 +602,13 @@ void PrintRoute(Results **results,int nresults,Nodes *nodes,Segments *segments,W
 
        if(next_result && important>IMP_JUNCT_CONT)
          {
-          if(resultsegmentp && (htmlfile || textfile))
+          if(!first && (htmlfile || textfile))
             {
-             turn_int=(int)TurnAngle(nodes,resultsegmentp,next_resultsegmentp,result->node);
+             if(DISTANCE(resultsegmentp->distance)==0 || DISTANCE(next_resultsegmentp->distance)==0)
+                turn_int=0;
+             else
+                turn_int=(int)TurnAngle(nodes,resultsegmentp,next_resultsegmentp,result->node);
+
              turn=translate_xml_turn[((202+turn_int)/45)%8];
             }
 
@@ -552,7 +623,11 @@ void PrintRoute(Results **results,int nresults,Nodes *nodes,Segments *segments,W
 
           if(htmlfile || gpxroutefile || textfile)
             {
-             next_bearing_int=(int)BearingAngle(nodes,next_resultsegmentp,next_result->node);
+             if(!first && DISTANCE(next_resultsegmentp->distance)==0)
+                next_bearing_int=(int)BearingAngle(nodes,resultsegmentp,result->node);
+             else
+                next_bearing_int=(int)BearingAngle(nodes,next_resultsegmentp,next_result->node);
+
              next_bearing=translate_xml_heading[(4+(22+next_bearing_int)/45)%8];
             }
          }
@@ -601,7 +676,7 @@ void PrintRoute(Results **results,int nresults,Nodes *nodes,Segments *segments,W
                }
              else if(next_result) /* middle point */
                {
-                if(roundabout>1)
+                if(roundabout>1 && important!=IMP_WAYPOINT)
                   {
                    /* <tr class='n'><td class='l'>At:<td class='r'>Roundabout, take <span class='t'>the *Nth* exit</span> heading <span class='b'>*heading*</span> */
                    fprintf(htmlfile,"<tr class='n'><td class='l'>%s:<td class='r'>",translate_html_rbnode[0]);
@@ -799,6 +874,8 @@ void PrintRoute(Results **results,int nresults,Nodes *nodes,Segments *segments,W
 
        if(important>IMP_JUNCT_CONT)
           point_count++;
+
+       first=0;
       }
     while(point==next_point);
 
@@ -808,6 +885,11 @@ void PrintRoute(Results **results,int nresults,Nodes *nodes,Segments *segments,W
        fprintf(gpxtrackfile,"</trkseg>\n");
 
     point=next_point;
+
+    if(result)
+       prev_node=result->node;
+    else
+       prev_node=NO_NODE;
    }
  while(point<nresults);
 
diff --git a/src/prunex.c b/src/prunex.c
index a7d1d11..f09798e 100644
--- a/src/prunex.c
+++ b/src/prunex.c
@@ -3,7 +3,7 @@
 
  Part of the Routino routing software.
  ******************/ /******************
- This file Copyright 2011-2013 Andrew M. Bishop
+ This file Copyright 2011-2014 Andrew M. Bishop
 
  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU Affero General Public License as published by
@@ -593,7 +593,7 @@ void PruneShortSegments(NodesX *nodesx,SegmentsX *segmentsx,WaysX *waysx,distanc
           WayX *wayx1,*wayx2,*wayx3;
           NodeX *nodex2,*nodex3,*newnodex;
           index_t newnode;
-          int join12=1,join23=1;
+          int join12=1,join23=1,same13=1;
 
           /* Check if pruning would collapse a loop */
 
@@ -694,10 +694,35 @@ void PruneShortSegments(NodesX *nodesx,SegmentsX *segmentsx,WaysX *waysx,distanc
 
           PutBackNodeX(nodesx,newnodex);
 
-          /* Modify segments */
+          /* Modify segments - update the distances */
+
+          if(!IsOneway(segmentx1) && !IsOneway(segmentx3))
+             ;
+          else if(IsOneway(segmentx1) && IsOneway(segmentx3))
+            {
+             if(IsOnewayTo(segmentx1,node3) && !IsOnewayFrom(segmentx3,node3)) /* S1 is one-way but S3 doesn't continue */
+                same13=0;
+
+             if(IsOnewayFrom(segmentx1,node3) && !IsOnewayTo(segmentx3,node3)) /* S1 is one-way but S3 doesn't continue */
+                same13=0;
+            }
+          else
+             same13=0;
+
+          if(WaysCompare(&wayx1->way,&wayx3->way))
+             same13=0;
+
+          if(same13)
+            {
+             segmentx1->distance+=DISTANCE(segmentx2->distance)/2;
+             segmentx3->distance+=DISTANCE(segmentx2->distance)-DISTANCE(segmentx2->distance)/2;
+            }
+          else if(join12)
+             segmentx1->distance+=DISTANCE(segmentx2->distance);
+          else /* if(join23) */
+             segmentx3->distance+=DISTANCE(segmentx2->distance);
 
-          segmentx1->distance+=DISTANCE(segmentx2->distance)/2;
-          segmentx3->distance+=DISTANCE(segmentx2->distance)-DISTANCE(segmentx2->distance)/2;
+          /* Modify segments - update the segments */
 
           if(segmentx1->node1==node1)
             {
diff --git a/src/router.c b/src/router.c
index f9f8100..a7f3d42 100644
--- a/src/router.c
+++ b/src/router.c
@@ -61,7 +61,10 @@ int option_quickest=0;
 /* Local functions */
 
 static void print_usage(int detail,const char *argerr,const char *err);
-static Results *CalculateRoute(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,Profile *profile,index_t start_node,index_t prev_segment,index_t finish_node);
+
+static Results *CalculateRoute(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,Profile *profile,
+                               index_t start_node,index_t prev_segment,index_t finish_node,
+                               int start_waypoint,int finish_waypoint);
 
 
 /*++++++++++++++++++++++++++++++++++++++
@@ -362,10 +365,6 @@ int main(int argc,char** argv)
        print_usage(0,argv[arg],NULL);
    }
 
- for(waypoint=1;waypoint<=NWAYPOINTS;waypoint++)
-    if(point_used[waypoint]==1 || point_used[waypoint]==2)
-       print_usage(0,NULL,"All waypoints must have latitude and longitude.");
-
  /* Print one of the profiles if requested */
 
  if(help_profile)
@@ -393,6 +392,15 @@ int main(int argc,char** argv)
     return(0);
    }
 
+ /* Check the waypoints are valid */
+
+ for(waypoint=1;waypoint<=NWAYPOINTS;waypoint++)
+    if(point_used[waypoint]==1 || point_used[waypoint]==2)
+       print_usage(0,NULL,"All waypoints must have latitude and longitude.");
+
+ if(first_waypoint>=last_waypoint)
+    print_usage(0,NULL,"At least two waypoints must be specified.");
+
  /* Load in the translations */
 
  if(option_html==0 && option_gpx_track==0 && option_gpx_route==0 && option_text==0 && option_text_all==0 && option_none==0)
@@ -528,9 +536,6 @@ int main(int argc,char** argv)
     if(start_node==NO_NODE)
        continue;
 
-    if(start_node==finish_node)
-       continue;
-
     if(first_node==NO_NODE)
        first_node=start_node;
 
@@ -539,10 +544,7 @@ int main(int argc,char** argv)
 
     /* Calculate the route */
 
-    results[nresults]=CalculateRoute(OSMNodes,OSMSegments,OSMWays,OSMRelations,profile,start_node,join_segment,finish_node);
-
-    results[nresults]->start_waypoint=start_waypoint;
-    results[nresults]->finish_waypoint=finish_waypoint;
+    results[nresults]=CalculateRoute(OSMNodes,OSMSegments,OSMWays,OSMRelations,profile,start_node,join_segment,finish_node,start_waypoint,finish_waypoint);
 
     join_segment=results[nresults]->last_segment;
 
@@ -553,10 +555,7 @@ int main(int argc,char** argv)
 
  if(loop && finish_node!=NO_NODE)
    {
-    results[nresults]=CalculateRoute(OSMNodes,OSMSegments,OSMWays,OSMRelations,profile,finish_node,join_segment,first_node);
-
-    results[nresults]->start_waypoint=last_waypoint;
-    results[nresults]->finish_waypoint=first_waypoint;
+    results[nresults]=CalculateRoute(OSMNodes,OSMSegments,OSMWays,OSMRelations,profile,finish_node,join_segment,first_node,last_waypoint,first_waypoint);
 
     nresults++;
    }
@@ -574,9 +573,9 @@ int main(int argc,char** argv)
 
  /* Destroy the remaining results lists and data structures */
 
-#if 0
+#ifdef DEBUG_MEMORY_LEAK
 
- for(waypoint=0;waypoint<=nresults;waypoint++)
+ for(waypoint=0;waypoint<nresults;waypoint++)
     FreeResultsList(results[waypoint]);
 
  DestroyNodeList(OSMNodes);
@@ -610,34 +609,60 @@ int main(int argc,char** argv)
   index_t prev_segment The previous segment before the start node.
 
   index_t finish_node The finish node.
+
+  int start_waypoint The starting waypoint.
+
+  int finish_waypoint The finish waypoint.
   ++++++++++++++++++++++++++++++++++++++*/
 
-static Results *CalculateRoute(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,Profile *profile,index_t start_node,index_t prev_segment,index_t finish_node)
+static Results *CalculateRoute(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,Profile *profile,
+                               index_t start_node,index_t prev_segment,index_t finish_node,
+                               int start_waypoint,int finish_waypoint)
 {
- Results *begin,*end,*complete=NULL;
-
- /* Calculate the beginning of the route */
+ Results *complete=NULL;
 
- begin=FindStartRoutes(nodes,segments,ways,relations,profile,start_node,prev_segment,finish_node);
+ /* A special case if the first and last nodes are the same */
 
- if(begin)
+ if(start_node==finish_node)
    {
-    /* Check if the end of the route was reached */
+    index_t fake_segment;
+    Result *result1,*result2;
 
-    if(begin->finish_node!=NO_NODE)
-       complete=ExtendStartRoutes(nodes,segments,ways,relations,profile,begin,finish_node);
+    complete=NewResultsList(8);
+
+    if(prev_segment==NO_SEGMENT)
+      {
+       double lat,lon;
+       distance_t distmin,dist1,dist2;
+       index_t node1,node2;
+
+       GetLatLong(nodes,start_node,NULL,&lat,&lon);
+
+       prev_segment=FindClosestSegment(nodes,segments,ways,lat,lon,1,profile,&distmin,&node1,&node2,&dist1,&dist2);
+      }
+
+    fake_segment=CreateFakeNullSegment(segments,start_node,prev_segment,finish_waypoint);
+
+    result1=InsertResult(complete,start_node,prev_segment);
+    result2=InsertResult(complete,finish_node,fake_segment);
+
+    result1->next=result2;
+
+    complete->start_node=start_node;
+    complete->prev_segment=prev_segment;
+
+    complete->finish_node=finish_node;
+    complete->last_segment=prev_segment;
+
+    complete->last_segment=result2->segment;
    }
  else
    {
-    if(prev_segment!=NO_SEGMENT)
-      {
-       /* Try again but allow a U-turn at the start waypoint -
-          this solves the problem of facing a dead-end that contains no super-nodes. */
+    Results *begin,*end;
 
-       prev_segment=NO_SEGMENT;
+    /* Calculate the beginning of the route */
 
-       begin=FindStartRoutes(nodes,segments,ways,relations,profile,start_node,prev_segment,finish_node);
-      }
+    begin=FindStartRoutes(nodes,segments,ways,relations,profile,start_node,prev_segment,finish_node);
 
     if(begin)
       {
@@ -648,65 +673,88 @@ static Results *CalculateRoute(Nodes *nodes,Segments *segments,Ways *ways,Relati
       }
     else
       {
-       fprintf(stderr,"Error: Cannot find initial section of route compatible with profile.\n");
-       exit(EXIT_FAILURE);
-      }
-   }
+       if(prev_segment!=NO_SEGMENT)
+         {
+          /* Try again but allow a U-turn at the start waypoint -
+             this solves the problem of facing a dead-end that contains no super-nodes. */
 
- /* Calculate the rest of the route */
+          prev_segment=NO_SEGMENT;
 
- if(!complete)
-   {
-    Results *middle;
+          begin=FindStartRoutes(nodes,segments,ways,relations,profile,start_node,prev_segment,finish_node);
+         }
+
+       if(begin)
+         {
+          /* Check if the end of the route was reached */
 
-    /* Calculate the end of the route */
+          if(begin->finish_node!=NO_NODE)
+             complete=ExtendStartRoutes(nodes,segments,ways,relations,profile,begin,finish_node);
+         }
+       else
+         {
+          fprintf(stderr,"Error: Cannot find initial section of route compatible with profile.\n");
+          exit(EXIT_FAILURE);
+         }
+      }
 
-    end=FindFinishRoutes(nodes,segments,ways,relations,profile,finish_node);
+    /* Calculate the rest of the route */
 
-    if(!end)
+    if(!complete)
       {
-       fprintf(stderr,"Error: Cannot find final section of route compatible with profile.\n");
-       exit(EXIT_FAILURE);
-      }
+       Results *middle;
 
-    /* Calculate the middle of the route */
+       /* Calculate the end of the route */
 
-    middle=FindMiddleRoute(nodes,segments,ways,relations,profile,begin,end);
+       end=FindFinishRoutes(nodes,segments,ways,relations,profile,finish_node);
 
-    if(!middle && prev_segment!=NO_SEGMENT)
-      {
-       /* Try again but allow a U-turn at the start waypoint -
-          this solves the problem of facing a dead-end that contains some super-nodes. */
+       if(!end)
+         {
+          fprintf(stderr,"Error: Cannot find final section of route compatible with profile.\n");
+          exit(EXIT_FAILURE);
+         }
 
-       FreeResultsList(begin);
+       /* Calculate the middle of the route */
 
-       begin=FindStartRoutes(nodes,segments,ways,relations,profile,start_node,NO_SEGMENT,finish_node);
+       middle=FindMiddleRoute(nodes,segments,ways,relations,profile,begin,end);
 
-       if(begin)
-          middle=FindMiddleRoute(nodes,segments,ways,relations,profile,begin,end);
-      }
+       if(!middle && prev_segment!=NO_SEGMENT)
+         {
+          /* Try again but allow a U-turn at the start waypoint -
+             this solves the problem of facing a dead-end that contains some super-nodes. */
 
-    FreeResultsList(end);
+          FreeResultsList(begin);
 
-    if(!middle)
-      {
-       fprintf(stderr,"Error: Cannot find super-route compatible with profile.\n");
-       exit(EXIT_FAILURE);
-      }
+          begin=FindStartRoutes(nodes,segments,ways,relations,profile,start_node,NO_SEGMENT,finish_node);
 
-    complete=CombineRoutes(nodes,segments,ways,relations,profile,begin,middle);
+          if(begin)
+             middle=FindMiddleRoute(nodes,segments,ways,relations,profile,begin,end);
+         }
 
-    if(!complete)
-      {
-       fprintf(stderr,"Error: Cannot create combined route following super-route.\n");
-       exit(EXIT_FAILURE);
-      }
+       FreeResultsList(end);
 
-    FreeResultsList(begin);
+       if(!middle)
+         {
+          fprintf(stderr,"Error: Cannot find super-route compatible with profile.\n");
+          exit(EXIT_FAILURE);
+         }
 
-    FreeResultsList(middle);
+       complete=CombineRoutes(nodes,segments,ways,relations,profile,begin,middle);
+
+       if(!complete)
+         {
+          fprintf(stderr,"Error: Cannot create combined route following super-route.\n");
+          exit(EXIT_FAILURE);
+         }
+
+       FreeResultsList(begin);
+
+       FreeResultsList(middle);
+      }
    }
 
+ complete->start_waypoint=start_waypoint;
+ complete->finish_waypoint=finish_waypoint;
+
 #if DEBUG
  Result *r=FindResult(complete,complete->start_node,complete->prev_segment);
 
diff --git a/src/segments.c b/src/segments.c
index 425af4d..c45963a 100644
--- a/src/segments.c
+++ b/src/segments.c
@@ -159,7 +159,7 @@ index_t FindClosestSegmentHeading(Nodes *nodes,Segments *segments,Ways *ways,ind
        if(profile->allow!=Transports_Bicycle)
           goto endloop;
 
-       if(!(wayp->props&Properties_CycleBothWays))
+       if(!(wayp->type&Highway_CycleBothWays))
           goto endloop;
       }
 
diff --git a/src/segments.h b/src/segments.h
index ab0572a..1f99190 100644
--- a/src/segments.h
+++ b/src/segments.h
@@ -5,7 +5,7 @@
 
  Part of the Routino routing software.
  ******************/ /******************
- This file Copyright 2008-2013 Andrew M. Bishop
+ This file Copyright 2008-2014 Andrew M. Bishop
 
  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU Affero General Public License as published by
@@ -76,8 +76,8 @@ struct _Segments
 
  int          fd;               /*+ The file descriptor for the file. +*/
 
- Segment      cached[3];        /*+ Three cached segments read from the file in slim mode. +*/
- index_t      incache[3];       /*+ The indexes of the cached segments. +*/
+ Segment      cached[4];        /*+ Three cached segments read from the file in slim mode. +*/
+ index_t      incache[4];       /*+ The indexes of the cached segments. +*/
 
  SegmentCache *cache;           /*+ A RAM cache of segments read from the file. +*/
 
diff --git a/src/superx.c b/src/superx.c
index d179475..3a7bc77 100644
--- a/src/superx.c
+++ b/src/superx.c
@@ -350,6 +350,7 @@ SegmentsX *MergeSuperSegments(SegmentsX *segmentsx,SegmentsX *supersegmentsx)
  index_t i,j,lastj;
  index_t merged=0,added=0;
  SegmentsX *mergedsegmentsx;
+ SegmentX supersegmentx;
 
  mergedsegmentsx=NewSegmentList();
 
@@ -384,8 +385,6 @@ SegmentsX *MergeSuperSegments(SegmentsX *segmentsx,SegmentsX *supersegmentsx)
 
     while(j<supersegmentsx->number)
       {
-       SegmentX supersegmentx;
-
        if(j!=lastj)
          {
           ReadFileBuffered(supersegmentsx->fd,&supersegmentx,sizeof(SegmentX));
@@ -429,15 +428,24 @@ SegmentsX *MergeSuperSegments(SegmentsX *segmentsx,SegmentsX *supersegmentsx)
        printf_middle("Merging Segments: Segments=%"Pindex_t" Super=%"Pindex_t" Merged=%"Pindex_t" Added=%"Pindex_t,i+1,j,merged,added);
    }
 
- while(j<supersegmentsx->number)
+ if(j<supersegmentsx->number)
    {
-    SegmentX supersegmentx;
+    if(j==lastj)
+      {
+       AppendSegmentList(mergedsegmentsx,supersegmentx.way,supersegmentx.node1,supersegmentx.node2,supersegmentx.distance|SEGMENT_SUPER);
+
+       j++;
+      }
 
-    ReadFileBuffered(supersegmentsx->fd,&supersegmentx,sizeof(SegmentX));
+    while(j<supersegmentsx->number)
+      {
+       ReadFileBuffered(supersegmentsx->fd,&supersegmentx,sizeof(SegmentX));
 
-    AppendSegmentList(mergedsegmentsx,supersegmentx.way,supersegmentx.node1,supersegmentx.node2,supersegmentx.distance|SEGMENT_SUPER);
-    added++;
-    j++;
+       AppendSegmentList(mergedsegmentsx,supersegmentx.way,supersegmentx.node1,supersegmentx.node2,supersegmentx.distance|SEGMENT_SUPER);
+
+       added++;
+       j++;
+      }
    }
 
  FinishSegmentList(mergedsegmentsx);
diff --git a/src/test/Makefile b/src/test/Makefile
index 7db3d58..3f038a5 100644
--- a/src/test/Makefile
+++ b/src/test/Makefile
@@ -85,7 +85,7 @@ test : $(ROUTINO_EXE) $(EXE)
 
 ########
 
-$(ROUTINO_EXE) :
+$(ROUTINO_EXE) ::
 	cd .. && $(MAKE) $(notdir $@)
 
 is-fast-math : is-fast-math.o
diff --git a/src/test/a-b-c-d.sh b/src/test/a-b-c-d.sh
new file mode 100755
index 0000000..d1cbdf2
--- /dev/null
+++ b/src/test/a-b-c-d.sh
@@ -0,0 +1,105 @@
+#!/bin/sh
+
+# Exit on error
+
+set -e
+
+# Test name
+
+name=`basename $0 .sh`
+
+# Slim or non-slim
+
+if [ "$1" = "slim" ]; then
+    slim="-slim"
+    dir="slim"
+else
+    slim=""
+    dir="fat"
+fi
+
+# Pruned or non-pruned
+
+if [ "$2" = "prune" ]; then
+    prune=""
+    pruned="-pruned"
+else
+    prune="--prune-none"
+    pruned=""
+fi
+
+# Create the output directory
+
+dir="$dir$pruned"
+
+[ -d $dir ] || mkdir $dir
+
+# Run the programs under a run-time debugger
+
+debugger=valgrind
+debugger=
+
+# Name related options
+
+osm=$name.osm
+log=$name$slim$pruned.log
+
+option_prefix="--prefix=$name"
+option_dir="--dir=$dir"
+
+# Generic program options
+
+option_planetsplitter="--loggable --tagging=../../xml/routino-tagging.xml --errorlog $prune"
+option_filedumper="--dump-osm"
+option_router="--loggable --transport=motorcar --profiles=../../xml/routino-profiles.xml --translations=copyright.xml"
+
+# Run planetsplitter
+
+echo "Running planetsplitter"
+
+echo ../planetsplitter$slim $option_dir $option_prefix $option_planetsplitter $osm > $log
+$debugger ../planetsplitter$slim $option_dir $option_prefix $option_planetsplitter $osm >> $log
+
+# Run filedumper
+
+echo "Running filedumper"
+
+echo ../filedumper$slim $option_dir $option_prefix $option_filedumper >> $log
+$debugger ../filedumper$slim $option_dir $option_prefix $option_filedumper > $dir/$osm
+
+# Waypoints
+
+waypoints=`perl waypoints.pl $osm list`
+
+# Run the router for each waypoint
+
+for waypoint in $waypoints; do
+
+    case $waypoint in
+        *a) waypoint=`echo $waypoint | sed -e 's%a$%%'` ;;
+        *) continue ;;
+    esac
+
+    echo "Running router : $waypoint"
+
+    waypoint_a=`perl waypoints.pl $osm ${waypoint}a 1`
+    waypoint_b=`perl waypoints.pl $osm ${waypoint}b 2`
+    waypoint_c=`perl waypoints.pl $osm ${waypoint}c 3`
+    waypoint_d=`perl waypoints.pl $osm ${waypoint}d 4`
+
+    [ -d $dir/$name-$waypoint ] || mkdir $dir/$name-$waypoint
+
+    echo ../router$slim $option_dir $option_prefix $option_osm $option_router $waypoint_a $waypoint_b $waypoint_c $waypoint_d >> $log
+    $debugger ../router$slim $option_dir $option_prefix $option_osm $option_router $waypoint_a $waypoint_b $waypoint_c $waypoint_d >> $log
+
+    mv shortest* $dir/$name-$waypoint
+
+    echo diff -u expected/$name-$waypoint.txt $dir/$name-$waypoint/shortest-all.txt >> $log
+
+    if ./is-fast-math; then
+        diff -U 0 expected/$name-$waypoint.txt $dir/$name-$waypoint/shortest-all.txt | 2>&1 egrep '^[-+] ' || true
+    else
+        diff -u expected/$name-$waypoint.txt $dir/$name-$waypoint/shortest-all.txt >> $log
+    fi
+
+done
diff --git a/src/test/coincident-waypoint.osm b/src/test/coincident-waypoint.osm
new file mode 100644
index 0000000..57d1cb8
--- /dev/null
+++ b/src/test/coincident-waypoint.osm
@@ -0,0 +1,101 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<osm version='0.6' generator='JOSM'>
+  <node id='4' visible='true' version='1' lat='-0.21661291636529073' lon='-0.520761488739697' />
+  <node id='6' visible='true' version='1' lat='-0.2163742693028532' lon='-0.5205061674081213' />
+  <node id='8' visible='true' version='1' lat='-0.2161202780565698' lon='-0.5207419121625206' />
+  <node id='10' visible='true' version='1' lat='-0.2163536787625498' lon='-0.5209987436557322' />
+  <node id='35' visible='true' version='1' lat='-0.21848333709591153' lon='-0.5218427454267438' />
+  <node id='37' visible='true' version='1' lat='-0.21855669147258072' lon='-0.5198307250334835' />
+  <node id='47' visible='true' version='1' lat='-0.21695597822189805' lon='-0.5206870145975311'>
+    <tag k='name' v='WP02a' />
+  </node>
+  <node id='48' visible='true' version='1' lat='-0.21775028231343874' lon='-0.5206857546917354'>
+    <tag k='name' v='WP01c' />
+  </node>
+  <node id='49' visible='true' version='1' lat='-0.21911476984589462' lon='-0.5207363917442211'>
+    <tag k='name' v='WP02d' />
+  </node>
+  <node id='59' visible='true' version='1' lat='-0.21852291461431964' lon='-0.5208066156936016' />
+  <node id='61' visible='true' version='1' lat='-0.21724703005097415' lon='-0.5218177543802404' />
+  <node id='62' visible='true' version='1' lat='-0.2172864966637643' lon='-0.5207796778404852' />
+  <node id='65' visible='true' version='1' lat='-0.2173314123555489' lon='-0.5198074556089362' />
+  <node id='89' visible='true' version='1' lat='-0.2190801322909824' lon='-0.5207370616265178'>
+    <tag k='name' v='WP01d' />
+  </node>
+  <node id='96' visible='true' version='1' lat='-0.21997515560812292' lon='-0.5208564106644373' />
+  <node id='97' visible='true' version='1' lat='-0.2197365085990034' lon='-0.5206010893328616' />
+  <node id='99' visible='true' version='1' lat='-0.21971591806329774' lon='-0.5210936655804727' />
+  <node id='105' visible='true' version='1' lat='-0.21851780554404734' lon='-0.5208002940891365'>
+    <tag k='name' v='WP02b' />
+  </node>
+  <node id='106' visible='true' version='1' lat='-0.21851780554404734' lon='-0.5208002940891365'>
+    <tag k='name' v='WP02c' />
+  </node>
+  <node id='113' visible='true' version='1' lat='-0.2170269645236478' lon='-0.5206865769695495'>
+    <tag k='name' v='WP03a' />
+  </node>
+  <node id='114' visible='true' version='1' lat='-0.2170269645236478' lon='-0.5206865769695495'>
+    <tag k='name' v='WP03b' />
+  </node>
+  <node id='118' visible='true' version='1' lat='-0.21914996849699317' lon='-0.5207357110104526'>
+    <tag k='name' v='WP03c' />
+  </node>
+  <node id='122' visible='true' version='1' lat='-0.2172821880270113' lon='-0.5207768336434417'>
+    <tag k='name' v='WP04a' />
+  </node>
+  <node id='123' visible='true' version='1' lat='-0.2172821880270113' lon='-0.5207768336434417'>
+    <tag k='name' v='WP04b' />
+  </node>
+  <node id='127' visible='true' version='1' lat='-0.21851780554404734' lon='-0.5208002940891365'>
+    <tag k='name' v='WP04c' />
+  </node>
+  <node id='163' visible='true' version='1' lat='-0.21914996849699317' lon='-0.5207357110104526'>
+    <tag k='name' v='WP03d' />
+  </node>
+  <node id='166' visible='true' version='1' lat='-0.21851780554404734' lon='-0.5208002940891365'>
+    <tag k='name' v='WP04d' />
+  </node>
+  <node id='204' visible='true' version='1' lat='-0.21775028231343874' lon='-0.5206857546917354'>
+    <tag k='name' v='WP01b' />
+  </node>
+  <node id='208' visible='true' version='1' lat='-0.21691021404678168' lon='-0.5206872967320134'>
+    <tag k='name' v='WP01a' />
+  </node>
+  <node id='438' visible='true' version='1' lat='-0.21948251740942368' lon='-0.520836834087261' />
+  <way id='13' visible='true' version='1'>
+    <nd ref='4' />
+    <nd ref='6' />
+    <nd ref='8' />
+    <nd ref='10' />
+    <nd ref='4' />
+    <tag k='highway' v='primary' />
+  </way>
+  <way id='36' visible='true' version='1'>
+    <nd ref='35' />
+    <nd ref='59' />
+    <nd ref='37' />
+    <tag k='highway' v='footway' />
+  </way>
+  <way id='63' visible='true' version='1'>
+    <nd ref='61' />
+    <nd ref='62' />
+    <nd ref='65' />
+    <tag k='highway' v='footway' />
+  </way>
+  <way id='95' visible='true' version='1'>
+    <nd ref='96' />
+    <nd ref='97' />
+    <nd ref='438' />
+    <nd ref='99' />
+    <nd ref='96' />
+    <tag k='highway' v='primary' />
+  </way>
+  <way id='240' visible='true' version='1'>
+    <nd ref='438' />
+    <nd ref='59' />
+    <nd ref='62' />
+    <nd ref='4' />
+    <tag k='highway' v='primary' />
+    <tag k='name' v='main 1' />
+  </way>
+</osm>
diff --git a/src/test/coincident-waypoint.sh b/src/test/coincident-waypoint.sh
new file mode 120000
index 0000000..7256a60
--- /dev/null
+++ b/src/test/coincident-waypoint.sh
@@ -0,0 +1 @@
+a-b-c-d.sh
\ No newline at end of file
diff --git a/src/test/cycle-both-ways.osm b/src/test/cycle-both-ways.osm
new file mode 100644
index 0000000..7c1ffed
--- /dev/null
+++ b/src/test/cycle-both-ways.osm
@@ -0,0 +1,107 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<osm version='0.6' generator='JOSM'>
+  <node id='3' visible='true' version='1' lat='-0.2217201380129468' lon='-0.5209275966384278' />
+  <node id='4' visible='true' version='1' lat='-0.21828070777942268' lon='-0.5207912709437164' />
+  <node id='6' visible='true' version='1' lat='-0.21804206074333024' lon='-0.5205359496121407' />
+  <node id='8' visible='true' version='1' lat='-0.21778806952505525' lon='-0.52077169436654' />
+  <node id='10' visible='true' version='1' lat='-0.21802147020530807' lon='-0.5210285258597515' />
+  <node id='21' visible='true' version='1' lat='-0.2221908395649969' lon='-0.5209415430673436' />
+  <node id='22' visible='true' version='1' lat='-0.22195451857008858' lon='-0.5207002437384278' />
+  <node id='24' visible='true' version='1' lat='-0.22193543526189635' lon='-0.5211703062894754' />
+  <node id='43' visible='true' version='1' lat='-0.21930218575050586' lon='-0.5189086431233668' />
+  <node id='45' visible='true' version='1' lat='-0.22081066523325596' lon='-0.5189389950470827' />
+  <node id='47' visible='true' version='1' lat='-0.21834718947014287' lon='-0.5188894277663167' />
+  <node id='50' visible='true' version='1' lat='-0.2218359709346708' lon='-0.5189596250943859' />
+  <node id='204' visible='true' version='1' lat='-0.22140697109084054' lon='-0.5208125513491403'>
+    <tag k='name' v='WPstart' />
+  </node>
+  <node id='208' visible='true' version='1' lat='-0.22131959074544644' lon='-0.5188644539458277'>
+    <tag k='name' v='WPfinish' />
+  </node>
+  <node id='242' visible='true' version='1' lat='-0.21969184942143533' lon='-0.520508838695913' />
+  <node id='244' visible='true' version='1' lat='-0.2200812203297903' lon='-0.5205220270076113' />
+  <node id='246' visible='true' version='1' lat='-0.21966460614165306' lon='-0.5211903128432791' />
+  <node id='248' visible='true' version='1' lat='-0.22006229057645915' lon='-0.5212037827409091' />
+  <node id='253' visible='true' version='1' lat='-0.21927153579637806' lon='-0.5195315927529504' />
+  <node id='255' visible='true' version='1' lat='-0.2207678018006232' lon='-0.5197417721359917' />
+  <node id='257' visible='true' version='1' lat='-0.22054261127446687' lon='-0.5220737624335469' />
+  <node id='259' visible='true' version='1' lat='-0.21914142570197062' lon='-0.5220187154522741' />
+  <node id='345' visible='true' version='1' lat='-0.22026866394788633' lon='-0.5208635679861234' />
+  <node id='438' visible='true' version='1' lat='-0.21948172568612254' lon='-0.5208369137424373' />
+  <way id='5' visible='true' version='1'>
+    <nd ref='3' />
+    <nd ref='345' />
+    <tag k='highway' v='primary' />
+    <tag k='name' v='main 2' />
+  </way>
+  <way id='13' visible='true' version='1'>
+    <nd ref='4' />
+    <nd ref='6' />
+    <nd ref='8' />
+    <nd ref='10' />
+    <nd ref='4' />
+    <tag k='highway' v='primary' />
+  </way>
+  <way id='20' visible='true' version='1'>
+    <nd ref='21' />
+    <nd ref='22' />
+    <nd ref='3' />
+    <nd ref='24' />
+    <nd ref='21' />
+    <tag k='highway' v='primary' />
+  </way>
+  <way id='48' visible='true' version='1'>
+    <nd ref='47' />
+    <nd ref='43' />
+    <nd ref='45' />
+    <nd ref='50' />
+    <tag k='highway' v='primary' />
+    <tag k='name' v='main 3' />
+  </way>
+  <way id='239' visible='true' version='1'>
+    <nd ref='345' />
+    <nd ref='248' />
+    <nd ref='246' />
+    <nd ref='438' />
+    <nd ref='242' />
+    <nd ref='244' />
+    <nd ref='345' />
+    <tag k='highway' v='primary' />
+    <tag k='junction' v='roundabout' />
+    <tag k='name' v='roundabout' />
+    <tag k='oneway' v='yes' />
+  </way>
+  <way id='240' visible='true' version='1'>
+    <nd ref='438' />
+    <nd ref='4' />
+    <tag k='highway' v='primary' />
+    <tag k='name' v='main 1' />
+  </way>
+  <way id='254' visible='true' version='1'>
+    <nd ref='43' />
+    <nd ref='253' />
+    <nd ref='242' />
+    <tag k='highway' v='residential' />
+  </way>
+  <way id='256' visible='true' version='1'>
+    <nd ref='45' />
+    <nd ref='255' />
+    <nd ref='244' />
+    <tag k='cycleway' v='opposite' />
+    <tag k='highway' v='residential' />
+    <tag k='oneway' v='yes' />
+  </way>
+  <way id='258' visible='true' version='1'>
+    <nd ref='257' />
+    <nd ref='248' />
+    <tag k='highway' v='residential' />
+    <tag k='oneway' v='yes' />
+  </way>
+  <way id='260' visible='true' version='1'>
+    <nd ref='259' />
+    <nd ref='246' />
+    <tag k='cycleway' v='opposite' />
+    <tag k='highway' v='residential' />
+    <tag k='oneway' v='yes' />
+  </way>
+</osm>
diff --git a/src/test/cycle-both-ways.sh b/src/test/cycle-both-ways.sh
new file mode 120000
index 0000000..0614a94
--- /dev/null
+++ b/src/test/cycle-both-ways.sh
@@ -0,0 +1 @@
+cycle-drive.sh
\ No newline at end of file
diff --git a/src/test/cycle-drive.sh b/src/test/cycle-drive.sh
new file mode 100755
index 0000000..4e7a329
--- /dev/null
+++ b/src/test/cycle-drive.sh
@@ -0,0 +1,105 @@
+#!/bin/sh
+
+# Exit on error
+
+set -e
+
+# Test name
+
+name=`basename $0 .sh`
+
+# Slim or non-slim
+
+if [ "$1" = "slim" ]; then
+    slim="-slim"
+    dir="slim"
+else
+    slim=""
+    dir="fat"
+fi
+
+# Pruned or non-pruned
+
+if [ "$2" = "prune" ]; then
+    prune=""
+    pruned="-pruned"
+else
+    prune="--prune-none"
+    pruned=""
+fi
+
+# Create the output directory
+
+dir="$dir$pruned"
+
+[ -d $dir ] || mkdir $dir
+
+# Run the programs under a run-time debugger
+
+debugger=valgrind
+debugger=
+
+# Name related options
+
+osm=$name.osm
+log=$name$slim$pruned.log
+
+option_prefix="--prefix=$name"
+option_dir="--dir=$dir"
+
+# Generic program options
+
+option_planetsplitter="--loggable --tagging=../../xml/routino-tagging.xml --errorlog $prune"
+option_filedumper="--dump-osm"
+option_router="--loggable --profiles=../../xml/routino-profiles.xml --translations=copyright.xml"
+
+# Run planetsplitter
+
+echo "Running planetsplitter"
+
+echo ../planetsplitter$slim $option_dir $option_prefix $option_planetsplitter $osm > $log
+$debugger ../planetsplitter$slim $option_dir $option_prefix $option_planetsplitter $osm >> $log
+
+# Run filedumper
+
+echo "Running filedumper"
+
+echo ../filedumper$slim $option_dir $option_prefix $option_filedumper >> $log
+$debugger ../filedumper$slim $option_dir $option_prefix $option_filedumper > $dir/$osm
+
+# Waypoints
+
+waypoints=`perl waypoints.pl $osm list`
+
+waypoint_start=`perl waypoints.pl $osm WPstart 1`
+waypoint_finish=`perl waypoints.pl $osm WPfinish 2`
+
+# Run the router for each transport type
+
+transports="motorcar bicycle"
+
+for transport in $transports; do
+
+    case $transport in
+        motorcar) waypoint=WP01 ;;
+        *)        waypoint=WP02 ;;
+    esac
+
+    echo "Running router : $waypoint"
+
+    [ -d $dir/$name-$waypoint ] || mkdir $dir/$name-$waypoint
+
+    echo ../router$slim $option_dir $option_prefix $option_osm $option_router --transport=$transport $waypoint_start $waypoint_finish >> $log
+    $debugger ../router$slim $option_dir $option_prefix $option_osm $option_router --transport=$transport $waypoint_start $waypoint_finish >> $log
+
+    mv shortest* $dir/$name-$waypoint
+
+    echo diff -u expected/$name-$waypoint.txt $dir/$name-$waypoint/shortest-all.txt >> $log
+
+    if ./is-fast-math; then
+        diff -U 0 expected/$name-$waypoint.txt $dir/$name-$waypoint/shortest-all.txt | 2>&1 egrep '^[-+] ' || true
+    else
+        diff -u expected/$name-$waypoint.txt $dir/$name-$waypoint/shortest-all.txt >> $log
+    fi
+
+done
diff --git a/src/test/expected/coincident-waypoint-WP01.txt b/src/test/expected/coincident-waypoint-WP01.txt
new file mode 100644
index 0000000..e2daa78
--- /dev/null
+++ b/src/test/expected/coincident-waypoint-WP01.txt
@@ -0,0 +1,12 @@
+# Creator : Routino - http://www.routino.org/
+# Source : Routino test cases - (c) Andrew M. Bishop
+# License : GNU Affero General Public License v3 or later
+#
+#Latitude	Longitude	    Node	Type	Segment	Segment	Total	Total  	Speed	Bearing	Highway
+#        	         	        	    	Dist   	Durat'n	Dist 	Durat'n	     	       	       
+ -0.216904	  -0.520770	      -1 	Waypt	0.000	 0.00	 0.00	  0.0			
+ -0.217286	  -0.520780	       7 	Junct-	0.042	 0.03	 0.04	  0.0	 96	 181	main 1
+ -0.217741	  -0.520789	      -2 	Waypt	0.050	 0.03	 0.09	  0.1	 96	 181	main 1
+ -0.217741	  -0.520789	      -3 	Waypt	0.000	 0.00	 0.09	  0.1	 96	 270	main 1
+ -0.218523	  -0.520806	       6 	Junct-	0.086	 0.05	 0.18	  0.1	 96	 181	main 1
+ -0.219080	  -0.520824	      -4 	Waypt	0.061	 0.04	 0.24	  0.1	 96	 181	main 1
diff --git a/src/test/expected/coincident-waypoint-WP02.txt b/src/test/expected/coincident-waypoint-WP02.txt
new file mode 100644
index 0000000..8123d44
--- /dev/null
+++ b/src/test/expected/coincident-waypoint-WP02.txt
@@ -0,0 +1,11 @@
+# Creator : Routino - http://www.routino.org/
+# Source : Routino test cases - (c) Andrew M. Bishop
+# License : GNU Affero General Public License v3 or later
+#
+#Latitude	Longitude	    Node	Type	Segment	Segment	Total	Total  	Speed	Bearing	Highway
+#        	         	        	    	Dist   	Durat'n	Dist 	Durat'n	     	       	       
+ -0.216959	  -0.520771	      -1 	Waypt	0.000	 0.00	 0.00	  0.0			
+ -0.217286	  -0.520780	       7 	Junct-	0.036	 0.02	 0.04	  0.0	 96	 181	main 1
+ -0.218523	  -0.520806	       6 	Waypt	0.137	 0.09	 0.17	  0.1	 96	 181	main 1
+ -0.218523	  -0.520806	       6 	Waypt	0.000	 0.00	 0.17	  0.1	 96	 270	main 1
+ -0.219117	  -0.520825	      -4 	Waypt	0.065	 0.04	 0.24	  0.1	 96	 181	main 1
diff --git a/src/test/expected/coincident-waypoint-WP03.txt b/src/test/expected/coincident-waypoint-WP03.txt
new file mode 100644
index 0000000..32b1fa8
--- /dev/null
+++ b/src/test/expected/coincident-waypoint-WP03.txt
@@ -0,0 +1,12 @@
+# Creator : Routino - http://www.routino.org/
+# Source : Routino test cases - (c) Andrew M. Bishop
+# License : GNU Affero General Public License v3 or later
+#
+#Latitude	Longitude	    Node	Type	Segment	Segment	Total	Total  	Speed	Bearing	Highway
+#        	         	        	    	Dist   	Durat'n	Dist 	Durat'n	     	       	       
+ -0.217022	  -0.520773	      -1 	Waypt	0.000	 0.00	 0.00	  0.0			
+ -0.217022	  -0.520773	      -2 	Waypt	0.000	 0.00	 0.00	  0.0	 96	 270	main 1
+ -0.217286	  -0.520780	       7 	Junct-	0.029	 0.02	 0.03	  0.0	 96	 181	main 1
+ -0.218523	  -0.520806	       6 	Junct-	0.137	 0.09	 0.17	  0.1	 96	 181	main 1
+ -0.219153	  -0.520826	      -3 	Waypt	0.069	 0.04	 0.23	  0.1	 96	 181	main 1
+ -0.219153	  -0.520826	      -4 	Waypt	0.000	 0.00	 0.23	  0.1	 96	 270	main 1
diff --git a/src/test/expected/coincident-waypoint-WP04.txt b/src/test/expected/coincident-waypoint-WP04.txt
new file mode 100644
index 0000000..c79a7e2
--- /dev/null
+++ b/src/test/expected/coincident-waypoint-WP04.txt
@@ -0,0 +1,10 @@
+# Creator : Routino - http://www.routino.org/
+# Source : Routino test cases - (c) Andrew M. Bishop
+# License : GNU Affero General Public License v3 or later
+#
+#Latitude	Longitude	    Node	Type	Segment	Segment	Total	Total  	Speed	Bearing	Highway
+#        	         	        	    	Dist   	Durat'n	Dist 	Durat'n	     	       	       
+ -0.217286	  -0.520780	       7 	Waypt	0.000	 0.00	 0.00	  0.0			
+ -0.217286	  -0.520780	       7 	Waypt	0.000	 0.00	 0.00	  0.0	 96	 270	main 1
+ -0.218523	  -0.520806	       6 	Waypt	0.137	 0.09	 0.14	  0.1	 96	 181	main 1
+ -0.218523	  -0.520806	       6 	Waypt	0.000	 0.00	 0.14	  0.1	 96	 270	main 1
diff --git a/src/test/expected/cycle-both-ways-WP01.txt b/src/test/expected/cycle-both-ways-WP01.txt
new file mode 100644
index 0000000..60c2867
--- /dev/null
+++ b/src/test/expected/cycle-both-ways-WP01.txt
@@ -0,0 +1,16 @@
+# Creator : Routino - http://www.routino.org/
+# Source : Routino test cases - (c) Andrew M. Bishop
+# License : GNU Affero General Public License v3 or later
+#
+#Latitude	Longitude	    Node	Type	Segment	Segment	Total	Total  	Speed	Bearing	Highway
+#        	         	        	    	Dist   	Durat'n	Dist 	Durat'n	     	       	       
+ -0.221402	  -0.520913	      -1 	Waypt	0.000	 0.00	 0.00	  0.0			
+ -0.220268	  -0.520863	       8*	Junct	0.125	 0.08	 0.12	  0.1	 96	   2	main 2
+ -0.220062	  -0.521204	       2 	Inter	0.044	 0.03	 0.17	  0.1	 96	 301	roundabout
+ -0.219665	  -0.521190	       3 	Inter	0.044	 0.03	 0.21	  0.1	 96	   1	roundabout
+ -0.219482	  -0.520837	       9*	Junct-	0.044	 0.03	 0.26	  0.2	 96	  62	roundabout
+ -0.219692	  -0.520509	      15*	Junct	0.043	 0.03	 0.30	  0.2	 96	 122	roundabout
+ -0.219271	  -0.519532	      17 	Inter	0.118	 0.15	 0.42	  0.3	 48	  66	residential road
+ -0.219302	  -0.518908	      20*	Junct	0.069	 0.09	 0.49	  0.4	 48	  92	residential road
+ -0.220811	  -0.518939	      19*	Junct-	0.167	 0.10	 0.65	  0.5	 96	 181	main 3
+ -0.221319	  -0.518949	      -2 	Waypt	0.056	 0.04	 0.71	  0.6	 96	 181	main 3
diff --git a/src/test/expected/cycle-both-ways-WP02.txt b/src/test/expected/cycle-both-ways-WP02.txt
new file mode 100644
index 0000000..22a5bc8
--- /dev/null
+++ b/src/test/expected/cycle-both-ways-WP02.txt
@@ -0,0 +1,16 @@
+# Creator : Routino - http://www.routino.org/
+# Source : Routino test cases - (c) Andrew M. Bishop
+# License : GNU Affero General Public License v3 or later
+#
+#Latitude	Longitude	    Node	Type	Segment	Segment	Total	Total  	Speed	Bearing	Highway
+#        	         	        	    	Dist   	Durat'n	Dist 	Durat'n	     	       	       
+ -0.221402	  -0.520913	      -1 	Waypt	0.000	 0.00	 0.00	  0.0			
+ -0.220268	  -0.520863	       8*	Junct	0.125	 0.38	 0.12	  0.4	 20	   2	main 2
+ -0.220062	  -0.521204	       2 	Inter	0.044	 0.13	 0.17	  0.5	 20	 301	roundabout
+ -0.219665	  -0.521190	       3 	Junct-	0.044	 0.13	 0.21	  0.6	 20	   1	roundabout
+ -0.219482	  -0.520837	       9*	Junct-	0.044	 0.13	 0.26	  0.8	 20	  62	roundabout
+ -0.219692	  -0.520509	      15*	Junct-	0.043	 0.13	 0.30	  0.9	 20	 122	roundabout
+ -0.220082	  -0.520522	      14*	Junct	0.043	 0.13	 0.34	  1.0	 20	 181	roundabout
+ -0.220768	  -0.519742	      16 	Inter	0.115	 0.34	 0.46	  1.4	 20	 131	residential road
+ -0.220811	  -0.518939	      19*	Junct	0.089	 0.27	 0.55	  1.6	 20	  93	residential road
+ -0.221319	  -0.518949	      -2 	Waypt	0.056	 0.17	 0.60	  1.8	 20	 181	main 3
diff --git a/src/test/expected/fake-node-with-loop-WP01.txt b/src/test/expected/fake-node-with-loop-WP01.txt
new file mode 100644
index 0000000..7ab2431
--- /dev/null
+++ b/src/test/expected/fake-node-with-loop-WP01.txt
@@ -0,0 +1,19 @@
+# Creator : Routino - http://www.routino.org/
+# Source : Routino test cases - (c) Andrew M. Bishop
+# License : GNU Affero General Public License v3 or later
+#
+#Latitude	Longitude	    Node	Type	Segment	Segment	Total	Total  	Speed	Bearing	Highway
+#        	         	        	    	Dist   	Durat'n	Dist 	Durat'n	     	       	       
+ -0.216904	  -0.520770	      -1 	Waypt	0.000	 0.00	 0.00	  0.0			
+ -0.217286	  -0.520780	      10 	Junct-	0.042	 0.03	 0.04	  0.0	 96	 181	main 1
+ -0.218086	  -0.520797	      -2 	Waypt	0.088	 0.06	 0.13	  0.1	 96	 181	main 1
+ -0.218523	  -0.520806	       9 	Junct-	0.048	 0.03	 0.18	  0.1	 96	 181	main 1
+ -0.219482	  -0.520837	       8*	Junct	0.106	 0.07	 0.28	  0.2	 96	 181	main 1
+ -0.219692	  -0.520509	      14 	Junct-	0.043	 0.03	 0.33	  0.2	 96	 122	roundabout
+ -0.220082	  -0.520522	      13 	Junct-	0.043	 0.03	 0.37	  0.2	 96	 181	roundabout
+ -0.220268	  -0.520863	       7 	Inter	0.043	 0.03	 0.41	  0.3	 96	 241	roundabout
+ -0.220062	  -0.521204	       4 	Junct-	0.044	 0.03	 0.46	  0.3	 96	 301	roundabout
+ -0.219665	  -0.521190	       5 	Junct-	0.044	 0.03	 0.50	  0.3	 96	   1	roundabout
+ -0.219482	  -0.520837	       8*	Junct	0.044	 0.03	 0.55	  0.3	 96	  62	roundabout
+ -0.218523	  -0.520806	       9 	Junct-	0.106	 0.07	 0.65	  0.4	 96	   1	main 1
+ -0.217741	  -0.520789	      -3 	Waypt	0.086	 0.05	 0.74	  0.5	 96	   1	main 1
diff --git a/src/test/expected/fake-node-with-loop-WP02.txt b/src/test/expected/fake-node-with-loop-WP02.txt
new file mode 100644
index 0000000..6c32260
--- /dev/null
+++ b/src/test/expected/fake-node-with-loop-WP02.txt
@@ -0,0 +1,18 @@
+# Creator : Routino - http://www.routino.org/
+# Source : Routino test cases - (c) Andrew M. Bishop
+# License : GNU Affero General Public License v3 or later
+#
+#Latitude	Longitude	    Node	Type	Segment	Segment	Total	Total  	Speed	Bearing	Highway
+#        	         	        	    	Dist   	Durat'n	Dist 	Durat'n	     	       	       
+ -0.216959	  -0.520771	      -1 	Waypt	0.000	 0.00	 0.00	  0.0			
+ -0.217286	  -0.520780	      10 	Junct-	0.036	 0.02	 0.04	  0.0	 96	 181	main 1
+ -0.218523	  -0.520806	       9 	Junct-	0.137	 0.09	 0.17	  0.1	 96	 181	main 1
+ -0.219171	  -0.520827	      -2 	Waypt	0.071	 0.04	 0.24	  0.1	 96	 181	main 1
+ -0.219482	  -0.520837	       8*	Junct	0.034	 0.02	 0.28	  0.2	 96	 181	main 1
+ -0.219692	  -0.520509	      14 	Junct-	0.043	 0.03	 0.32	  0.2	 96	 122	roundabout
+ -0.220082	  -0.520522	      13 	Junct-	0.043	 0.03	 0.36	  0.2	 96	 181	roundabout
+ -0.220268	  -0.520863	       7 	Inter	0.043	 0.03	 0.41	  0.2	 96	 241	roundabout
+ -0.220062	  -0.521204	       4 	Junct-	0.044	 0.03	 0.45	  0.3	 96	 301	roundabout
+ -0.219665	  -0.521190	       5 	Junct-	0.044	 0.03	 0.49	  0.3	 96	   1	roundabout
+ -0.219482	  -0.520837	       8*	Junct	0.044	 0.03	 0.54	  0.3	 96	  62	roundabout
+ -0.218842	  -0.520816	      -3 	Waypt	0.070	 0.04	 0.61	  0.4	 96	   1	main 1
diff --git a/src/test/expected/loops-WP01.txt b/src/test/expected/loops-WP01.txt
index 42f78b6..06ab275 100644
--- a/src/test/expected/loops-WP01.txt
+++ b/src/test/expected/loops-WP01.txt
@@ -16,8 +16,9 @@
  -0.218776	  -0.518838	      18 	Inter	0.055	 0.07	 0.62	  0.7	 48	 143	loop 1
  -0.219237	  -0.519286	      13*	Junct	0.071	 0.09	 0.69	  0.8	 48	 224	loop 1
  -0.219910	  -0.519112	      17 	Inter	0.077	 0.10	 0.77	  0.9	 48	 165	loop 1
- -0.220695	  -0.519489	      11*	Junct	0.052	 0.07	 0.82	  0.9	 48	 209	loop 1
- -0.220739	  -0.517801	      19*	Junct	0.187	 0.23	 1.00	  1.2	 48	  91	high street
- -0.220784	  -0.516035	      30*	Junct	0.196	 0.24	 1.20	  1.4	 48	  91	high street
- -0.220311	  -0.516015	      31*	Junct-	0.052	 0.03	 1.25	  1.5	 96	   2	main 2
- -0.219596	  -0.515984	      -3 	Waypt	0.079	 0.05	 1.33	  1.5	 96	   2	main 2
+ -0.220280	  -0.519256	      15*	Junct-	0.044	 0.06	 0.81	  0.9	 48	 201	loop 1
+ -0.220695	  -0.519489	      11*	Junct	0.052	 0.07	 0.86	  1.0	 48	 209	loop 1
+ -0.220739	  -0.517801	      19*	Junct	0.187	 0.23	 1.05	  1.2	 48	  91	high street
+ -0.220784	  -0.516035	      30*	Junct	0.196	 0.24	 1.25	  1.5	 48	  91	high street
+ -0.220311	  -0.516015	      31*	Junct-	0.052	 0.03	 1.30	  1.5	 96	   2	main 2
+ -0.219596	  -0.515984	      -3 	Waypt	0.079	 0.05	 1.38	  1.6	 96	   2	main 2
diff --git a/src/test/expected/loops-WP02.txt b/src/test/expected/loops-WP02.txt
index 30a6a5d..2564227 100644
--- a/src/test/expected/loops-WP02.txt
+++ b/src/test/expected/loops-WP02.txt
@@ -15,9 +15,10 @@
  -0.218380	  -0.519134	      16 	Inter	0.056	 0.07	 0.56	  0.6	 48	  41	loop 1
  -0.218776	  -0.518838	      18 	Inter	0.055	 0.07	 0.62	  0.7	 48	 143	loop 1
  -0.219237	  -0.519286	      13*	Junct	0.071	 0.09	 0.69	  0.8	 48	 224	loop 1
- -0.220280	  -0.519256	      15*	Junct-	0.044	 0.06	 0.73	  0.8	 48	 201	loop 1
- -0.220695	  -0.519489	      11*	Junct	0.052	 0.07	 0.79	  0.9	 48	 209	loop 1
- -0.220739	  -0.517801	      19*	Junct	0.187	 0.23	 0.97	  1.1	 48	  91	high street
- -0.220784	  -0.516035	      30*	Junct	0.196	 0.24	 1.17	  1.4	 48	  91	high street
- -0.220311	  -0.516015	      31*	Junct-	0.052	 0.03	 1.22	  1.4	 96	   2	main 2
- -0.219596	  -0.515984	      -3 	Waypt	0.079	 0.05	 1.30	  1.5	 96	   2	main 2
+ -0.219910	  -0.519112	      17 	Inter	0.077	 0.10	 0.77	  0.9	 48	 165	loop 1
+ -0.220280	  -0.519256	      15*	Junct-	0.044	 0.06	 0.81	  0.9	 48	 201	loop 1
+ -0.220695	  -0.519489	      11*	Junct	0.052	 0.07	 0.86	  1.0	 48	 209	loop 1
+ -0.220739	  -0.517801	      19*	Junct	0.187	 0.23	 1.05	  1.2	 48	  91	high street
+ -0.220784	  -0.516035	      30*	Junct	0.196	 0.24	 1.25	  1.5	 48	  91	high street
+ -0.220311	  -0.516015	      31*	Junct-	0.052	 0.03	 1.30	  1.5	 96	   2	main 2
+ -0.219596	  -0.515984	      -3 	Waypt	0.079	 0.05	 1.38	  1.6	 96	   2	main 2
diff --git a/src/test/expected/loops-WP06.txt b/src/test/expected/loops-WP06.txt
index 9b9fc94..8310598 100644
--- a/src/test/expected/loops-WP06.txt
+++ b/src/test/expected/loops-WP06.txt
@@ -17,7 +17,8 @@
  -0.218805	  -0.517131	      25 	Inter	0.056	 0.07	 0.81	  0.9	 48	 139	loop 2
  -0.219266	  -0.517579	      21*	Junct	0.071	 0.09	 0.88	  1.0	 48	 224	loop 2
  -0.219946	  -0.517397	      24 	Inter	0.078	 0.10	 0.95	  1.1	 48	 165	loop 2
- -0.220739	  -0.517801	      19*	Junct	0.054	 0.07	 1.01	  1.2	 48	 207	loop 2
- -0.220784	  -0.516035	      30*	Junct	0.196	 0.24	 1.21	  1.4	 48	  91	high street
- -0.220311	  -0.516015	      31*	Junct-	0.052	 0.03	 1.26	  1.5	 96	   2	main 2
- -0.219596	  -0.515984	      -3 	Waypt	0.079	 0.05	 1.34	  1.5	 96	   2	main 2
+ -0.220301	  -0.517576	      22*	Junct-	0.044	 0.06	 1.00	  1.2	 48	 206	loop 2
+ -0.220739	  -0.517801	      19*	Junct	0.054	 0.07	 1.05	  1.2	 48	 207	loop 2
+ -0.220784	  -0.516035	      30*	Junct	0.196	 0.24	 1.25	  1.5	 48	  91	high street
+ -0.220311	  -0.516015	      31*	Junct-	0.052	 0.03	 1.30	  1.5	 96	   2	main 2
+ -0.219596	  -0.515984	      -3 	Waypt	0.079	 0.05	 1.38	  1.6	 96	   2	main 2
diff --git a/src/test/expected/loops-WP07.txt b/src/test/expected/loops-WP07.txt
index acf7b1f..5bc2e8a 100644
--- a/src/test/expected/loops-WP07.txt
+++ b/src/test/expected/loops-WP07.txt
@@ -16,8 +16,9 @@
  -0.218417	  -0.517462	      23*	Junct-	0.053	 0.07	 0.75	  0.9	 48	  38	loop 2
  -0.218805	  -0.517131	      25 	Inter	0.056	 0.07	 0.81	  0.9	 48	 139	loop 2
  -0.219266	  -0.517579	      21*	Junct	0.071	 0.09	 0.88	  1.0	 48	 224	loop 2
- -0.220301	  -0.517576	      22*	Junct-	0.044	 0.06	 0.92	  1.1	 48	 206	loop 2
- -0.220739	  -0.517801	      19*	Junct	0.054	 0.07	 0.97	  1.1	 48	 207	loop 2
- -0.220784	  -0.516035	      30*	Junct	0.196	 0.24	 1.17	  1.4	 48	  91	high street
- -0.220311	  -0.516015	      31*	Junct-	0.052	 0.03	 1.22	  1.4	 96	   2	main 2
- -0.219596	  -0.515984	      -3 	Waypt	0.079	 0.05	 1.30	  1.5	 96	   2	main 2
+ -0.219946	  -0.517397	      24 	Inter	0.078	 0.10	 0.95	  1.1	 48	 165	loop 2
+ -0.220301	  -0.517576	      22*	Junct-	0.044	 0.06	 1.00	  1.2	 48	 206	loop 2
+ -0.220739	  -0.517801	      19*	Junct	0.054	 0.07	 1.05	  1.2	 48	 207	loop 2
+ -0.220784	  -0.516035	      30*	Junct	0.196	 0.24	 1.25	  1.5	 48	  91	high street
+ -0.220311	  -0.516015	      31*	Junct-	0.052	 0.03	 1.30	  1.5	 96	   2	main 2
+ -0.219596	  -0.515984	      -3 	Waypt	0.079	 0.05	 1.38	  1.6	 96	   2	main 2
diff --git a/src/test/expected/roundabout-waypoints-WP01.txt b/src/test/expected/roundabout-waypoints-WP01.txt
new file mode 100644
index 0000000..304b108
--- /dev/null
+++ b/src/test/expected/roundabout-waypoints-WP01.txt
@@ -0,0 +1,12 @@
+# Creator : Routino - http://www.routino.org/
+# Source : Routino test cases - (c) Andrew M. Bishop
+# License : GNU Affero General Public License v3 or later
+#
+#Latitude	Longitude	    Node	Type	Segment	Segment	Total	Total  	Speed	Bearing	Highway
+#        	         	        	    	Dist   	Durat'n	Dist 	Durat'n	     	       	       
+ -0.218454	  -0.520798	      -1 	Waypt	0.000	 0.00	 0.00	  0.0			
+ -0.219482	  -0.520837	       9*	Waypt	0.113	 0.07	 0.11	  0.1	 96	 182	main 1
+ -0.219692	  -0.520509	      15 	Junct-	0.043	 0.03	 0.16	  0.1	 96	 122	roundabout
+ -0.220082	  -0.520522	      14 	Junct-	0.043	 0.03	 0.20	  0.1	 96	 181	roundabout
+ -0.220268	  -0.520863	       8*	Junct	0.043	 0.03	 0.24	  0.1	 96	 241	roundabout
+ -0.221566	  -0.520921	      -3 	Waypt	0.143	 0.09	 0.39	  0.2	 96	 182	main 2
diff --git a/src/test/expected/roundabout-waypoints-WP02.txt b/src/test/expected/roundabout-waypoints-WP02.txt
new file mode 100644
index 0000000..5ce9cbf
--- /dev/null
+++ b/src/test/expected/roundabout-waypoints-WP02.txt
@@ -0,0 +1,13 @@
+# Creator : Routino - http://www.routino.org/
+# Source : Routino test cases - (c) Andrew M. Bishop
+# License : GNU Affero General Public License v3 or later
+#
+#Latitude	Longitude	    Node	Type	Segment	Segment	Total	Total  	Speed	Bearing	Highway
+#        	         	        	    	Dist   	Durat'n	Dist 	Durat'n	     	       	       
+ -0.218454	  -0.520798	      -1 	Waypt	0.000	 0.00	 0.00	  0.0			
+ -0.219482	  -0.520837	       9*	Junct	0.113	 0.07	 0.11	  0.1	 96	 182	main 1
+ -0.219577	  -0.520689	      -2 	Waypt	0.019	 0.01	 0.13	  0.1	 96	 122	roundabout
+ -0.219692	  -0.520509	      15 	Junct-	0.023	 0.01	 0.15	  0.1	 96	 122	roundabout
+ -0.220082	  -0.520522	      14 	Junct-	0.043	 0.03	 0.20	  0.1	 96	 181	roundabout
+ -0.220268	  -0.520863	       8*	Junct	0.043	 0.03	 0.24	  0.1	 96	 241	roundabout
+ -0.221566	  -0.520921	      -3 	Waypt	0.143	 0.09	 0.38	  0.2	 96	 182	main 2
diff --git a/src/test/expected/roundabout-waypoints-WP03.txt b/src/test/expected/roundabout-waypoints-WP03.txt
new file mode 100644
index 0000000..a5a6398
--- /dev/null
+++ b/src/test/expected/roundabout-waypoints-WP03.txt
@@ -0,0 +1,12 @@
+# Creator : Routino - http://www.routino.org/
+# Source : Routino test cases - (c) Andrew M. Bishop
+# License : GNU Affero General Public License v3 or later
+#
+#Latitude	Longitude	    Node	Type	Segment	Segment	Total	Total  	Speed	Bearing	Highway
+#        	         	        	    	Dist   	Durat'n	Dist 	Durat'n	     	       	       
+ -0.218454	  -0.520798	      -1 	Waypt	0.000	 0.00	 0.00	  0.0			
+ -0.219482	  -0.520837	       9*	Junct	0.113	 0.07	 0.11	  0.1	 96	 182	main 1
+ -0.219692	  -0.520509	      15 	Waypt	0.043	 0.03	 0.16	  0.1	 96	 122	roundabout
+ -0.220082	  -0.520522	      14 	Junct-	0.043	 0.03	 0.20	  0.1	 96	 181	roundabout
+ -0.220268	  -0.520863	       8*	Junct	0.043	 0.03	 0.24	  0.1	 96	 241	roundabout
+ -0.221566	  -0.520921	      -3 	Waypt	0.143	 0.09	 0.39	  0.2	 96	 182	main 2
diff --git a/src/test/expected/roundabout-waypoints-WP04.txt b/src/test/expected/roundabout-waypoints-WP04.txt
new file mode 100644
index 0000000..dc04878
--- /dev/null
+++ b/src/test/expected/roundabout-waypoints-WP04.txt
@@ -0,0 +1,13 @@
+# Creator : Routino - http://www.routino.org/
+# Source : Routino test cases - (c) Andrew M. Bishop
+# License : GNU Affero General Public License v3 or later
+#
+#Latitude	Longitude	    Node	Type	Segment	Segment	Total	Total  	Speed	Bearing	Highway
+#        	         	        	    	Dist   	Durat'n	Dist 	Durat'n	     	       	       
+ -0.218454	  -0.520798	      -1 	Waypt	0.000	 0.00	 0.00	  0.0			
+ -0.219482	  -0.520837	       9*	Junct	0.113	 0.07	 0.11	  0.1	 96	 182	main 1
+ -0.219692	  -0.520509	      15 	Junct-	0.043	 0.03	 0.16	  0.1	 96	 122	roundabout
+ -0.219878	  -0.520515	      -2 	Waypt	0.020	 0.01	 0.18	  0.1	 96	 181	roundabout
+ -0.220082	  -0.520522	      14 	Junct-	0.022	 0.01	 0.20	  0.1	 96	 181	roundabout
+ -0.220268	  -0.520863	       8*	Junct	0.043	 0.03	 0.24	  0.1	 96	 241	roundabout
+ -0.221566	  -0.520921	      -3 	Waypt	0.143	 0.09	 0.38	  0.2	 96	 182	main 2
diff --git a/src/test/expected/roundabout-waypoints-WP05.txt b/src/test/expected/roundabout-waypoints-WP05.txt
new file mode 100644
index 0000000..d8e2149
--- /dev/null
+++ b/src/test/expected/roundabout-waypoints-WP05.txt
@@ -0,0 +1,12 @@
+# Creator : Routino - http://www.routino.org/
+# Source : Routino test cases - (c) Andrew M. Bishop
+# License : GNU Affero General Public License v3 or later
+#
+#Latitude	Longitude	    Node	Type	Segment	Segment	Total	Total  	Speed	Bearing	Highway
+#        	         	        	    	Dist   	Durat'n	Dist 	Durat'n	     	       	       
+ -0.218454	  -0.520798	      -1 	Waypt	0.000	 0.00	 0.00	  0.0			
+ -0.219482	  -0.520837	       9*	Junct	0.113	 0.07	 0.11	  0.1	 96	 182	main 1
+ -0.219692	  -0.520509	      15 	Junct-	0.043	 0.03	 0.16	  0.1	 96	 122	roundabout
+ -0.220082	  -0.520522	      14 	Waypt	0.043	 0.03	 0.20	  0.1	 96	 181	roundabout
+ -0.220268	  -0.520863	       8*	Junct	0.043	 0.03	 0.24	  0.1	 96	 241	roundabout
+ -0.221566	  -0.520921	      -3 	Waypt	0.143	 0.09	 0.39	  0.2	 96	 182	main 2
diff --git a/src/test/expected/roundabout-waypoints-WP06.txt b/src/test/expected/roundabout-waypoints-WP06.txt
new file mode 100644
index 0000000..097a52a
--- /dev/null
+++ b/src/test/expected/roundabout-waypoints-WP06.txt
@@ -0,0 +1,13 @@
+# Creator : Routino - http://www.routino.org/
+# Source : Routino test cases - (c) Andrew M. Bishop
+# License : GNU Affero General Public License v3 or later
+#
+#Latitude	Longitude	    Node	Type	Segment	Segment	Total	Total  	Speed	Bearing	Highway
+#        	         	        	    	Dist   	Durat'n	Dist 	Durat'n	     	       	       
+ -0.218454	  -0.520798	      -1 	Waypt	0.000	 0.00	 0.00	  0.0			
+ -0.219482	  -0.520837	       9*	Junct	0.113	 0.07	 0.11	  0.1	 96	 182	main 1
+ -0.219692	  -0.520509	      15 	Junct-	0.043	 0.03	 0.16	  0.1	 96	 122	roundabout
+ -0.220082	  -0.520522	      14 	Junct-	0.043	 0.03	 0.20	  0.1	 96	 181	roundabout
+ -0.220171	  -0.520685	      -2 	Waypt	0.020	 0.01	 0.22	  0.1	 96	 241	roundabout
+ -0.220268	  -0.520863	       8*	Junct	0.022	 0.01	 0.24	  0.1	 96	 241	roundabout
+ -0.221566	  -0.520921	      -3 	Waypt	0.143	 0.09	 0.38	  0.2	 96	 182	main 2
diff --git a/src/test/expected/roundabout-waypoints-WP07.txt b/src/test/expected/roundabout-waypoints-WP07.txt
new file mode 100644
index 0000000..5dd7a74
--- /dev/null
+++ b/src/test/expected/roundabout-waypoints-WP07.txt
@@ -0,0 +1,12 @@
+# Creator : Routino - http://www.routino.org/
+# Source : Routino test cases - (c) Andrew M. Bishop
+# License : GNU Affero General Public License v3 or later
+#
+#Latitude	Longitude	    Node	Type	Segment	Segment	Total	Total  	Speed	Bearing	Highway
+#        	         	        	    	Dist   	Durat'n	Dist 	Durat'n	     	       	       
+ -0.218454	  -0.520798	      -1 	Waypt	0.000	 0.00	 0.00	  0.0			
+ -0.219482	  -0.520837	       9*	Junct	0.113	 0.07	 0.11	  0.1	 96	 182	main 1
+ -0.219692	  -0.520509	      15 	Junct-	0.043	 0.03	 0.16	  0.1	 96	 122	roundabout
+ -0.220082	  -0.520522	      14 	Junct-	0.043	 0.03	 0.20	  0.1	 96	 181	roundabout
+ -0.220268	  -0.520863	       8*	Waypt	0.043	 0.03	 0.24	  0.1	 96	 241	roundabout
+ -0.221566	  -0.520921	      -3 	Waypt	0.143	 0.09	 0.39	  0.2	 96	 182	main 2
diff --git a/src/test/fake-node-with-loop.osm b/src/test/fake-node-with-loop.osm
new file mode 100644
index 0000000..5fc81d2
--- /dev/null
+++ b/src/test/fake-node-with-loop.osm
@@ -0,0 +1,102 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<osm version='0.6' generator='JOSM'>
+  <node id='4' visible='true' version='1' lat='-0.21661291636529073' lon='-0.520761488739697' />
+  <node id='6' visible='true' version='1' lat='-0.2163742693028532' lon='-0.5205061674081213' />
+  <node id='8' visible='true' version='1' lat='-0.2161202780565698' lon='-0.5207419121625206' />
+  <node id='10' visible='true' version='1' lat='-0.2163536787625498' lon='-0.5209987436557322' />
+  <node id='35' visible='true' version='1' lat='-0.21848333709591153' lon='-0.5218427454267438' />
+  <node id='37' visible='true' version='1' lat='-0.21855669147258072' lon='-0.5198307250334835' />
+  <node id='47' visible='true' version='1' lat='-0.21695596294699857' lon='-0.5206845368680583'>
+    <tag k='name' v='WP02a' />
+  </node>
+  <node id='48' visible='true' version='1' lat='-0.21775028231343874' lon='-0.5206857546917354'>
+    <tag k='name' v='WP01c' />
+  </node>
+  <node id='49' visible='true' version='1' lat='-0.2188482915170263' lon='-0.5207295158812542'>
+    <tag k='name' v='WP02c' />
+  </node>
+  <node id='59' visible='true' version='1' lat='-0.21852291461431964' lon='-0.5208066156936016' />
+  <node id='61' visible='true' version='1' lat='-0.21724703005097415' lon='-0.5218177543802404' />
+  <node id='62' visible='true' version='1' lat='-0.2172864966637643' lon='-0.5207796778404852' />
+  <node id='65' visible='true' version='1' lat='-0.2173314123555489' lon='-0.5198074556089362' />
+  <node id='89' visible='true' version='1' lat='-0.21917467817079206' lon='-0.5207413591979394'>
+    <tag k='name' v='WP02b' />
+  </node>
+  <node id='204' visible='true' version='1' lat='-0.21809098400469543' lon='-0.5207047848008673'>
+    <tag k='name' v='WP01b' />
+  </node>
+  <node id='208' visible='true' version='1' lat='-0.21691021404678168' lon='-0.5206872967320134'>
+    <tag k='name' v='WP01a' />
+  </node>
+  <node id='242' visible='true' version='1' lat='-0.21969184942143533' lon='-0.520508838695913' />
+  <node id='244' visible='true' version='1' lat='-0.2200812203297903' lon='-0.5205220270076113' />
+  <node id='246' visible='true' version='1' lat='-0.21966460614165306' lon='-0.5211903128432791' />
+  <node id='248' visible='true' version='1' lat='-0.22006229057645915' lon='-0.5212037827409091' />
+  <node id='253' visible='true' version='1' lat='-0.21927153579637806' lon='-0.5195315927529504' />
+  <node id='255' visible='true' version='1' lat='-0.2207678018006232' lon='-0.5197417721359917' />
+  <node id='257' visible='true' version='1' lat='-0.22054261127446687' lon='-0.5220737624335469' />
+  <node id='259' visible='true' version='1' lat='-0.21914142570197062' lon='-0.5220187154522741' />
+  <node id='345' visible='true' version='1' lat='-0.22026866394788633' lon='-0.5208635679861234' />
+  <node id='438' visible='true' version='1' lat='-0.21948172568612254' lon='-0.5208369137424373' />
+  <way id='13' visible='true' version='1'>
+    <nd ref='4' />
+    <nd ref='6' />
+    <nd ref='8' />
+    <nd ref='10' />
+    <nd ref='4' />
+    <tag k='highway' v='primary' />
+  </way>
+  <way id='36' visible='true' version='1'>
+    <nd ref='35' />
+    <nd ref='59' />
+    <nd ref='37' />
+    <tag k='highway' v='footway' />
+  </way>
+  <way id='63' visible='true' version='1'>
+    <nd ref='61' />
+    <nd ref='62' />
+    <nd ref='65' />
+    <tag k='highway' v='footway' />
+  </way>
+  <way id='239' visible='true' version='1'>
+    <nd ref='345' />
+    <nd ref='248' />
+    <nd ref='246' />
+    <nd ref='438' />
+    <nd ref='242' />
+    <nd ref='244' />
+    <nd ref='345' />
+    <tag k='highway' v='primary' />
+    <tag k='junction' v='roundabout' />
+    <tag k='name' v='roundabout' />
+    <tag k='oneway' v='yes' />
+  </way>
+  <way id='240' visible='true' version='1'>
+    <nd ref='438' />
+    <nd ref='59' />
+    <nd ref='62' />
+    <nd ref='4' />
+    <tag k='highway' v='primary' />
+    <tag k='name' v='main 1' />
+  </way>
+  <way id='254' visible='true' version='1'>
+    <nd ref='253' />
+    <nd ref='242' />
+    <tag k='highway' v='residential' />
+  </way>
+  <way id='256' visible='true' version='1'>
+    <nd ref='255' />
+    <nd ref='244' />
+    <tag k='highway' v='residential' />
+  </way>
+  <way id='258' visible='true' version='1'>
+    <nd ref='257' />
+    <nd ref='248' />
+    <tag k='highway' v='residential' />
+  </way>
+  <way id='260' visible='true' version='1'>
+    <nd ref='259' />
+    <nd ref='246' />
+    <tag k='highway' v='residential' />
+  </way>
+</osm>
diff --git a/src/test/fake-node-with-loop.sh b/src/test/fake-node-with-loop.sh
new file mode 120000
index 0000000..a093b70
--- /dev/null
+++ b/src/test/fake-node-with-loop.sh
@@ -0,0 +1 @@
+a-b-c.sh
\ No newline at end of file
diff --git a/src/test/prune-straight.osm b/src/test/prune-straight.osm
index c100ddc..27fe79c 100644
--- a/src/test/prune-straight.osm
+++ b/src/test/prune-straight.osm
@@ -1,5 +1,5 @@
 <?xml version='1.0' encoding='UTF-8'?>
-<osm version='0.6' upload='true' generator='JOSM'>
+<osm version='0.6' generator='JOSM'>
   <node id='122' visible='true' version='1' lat='-0.2202806356012029' lon='-0.5205283172729586' />
   <node id='183' visible='true' version='1' lat='-0.22026900997513588' lon='-0.5197565898111836' />
   <node id='203' visible='true' version='1' lat='-0.22025358651939986' lon='-0.5189993952842524' />
diff --git a/src/test/roundabout-waypoints.osm b/src/test/roundabout-waypoints.osm
new file mode 100644
index 0000000..3579a74
--- /dev/null
+++ b/src/test/roundabout-waypoints.osm
@@ -0,0 +1,105 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<osm version='0.6' generator='JOSM'>
+  <node id='3' visible='true' version='1' lat='-0.2217201380129468' lon='-0.5209275966384278' />
+  <node id='4' visible='true' version='1' lat='-0.21828070777942268' lon='-0.5207912709437164' />
+  <node id='6' visible='true' version='1' lat='-0.21804206074333024' lon='-0.5205359496121407' />
+  <node id='8' visible='true' version='1' lat='-0.21778806952505525' lon='-0.52077169436654' />
+  <node id='10' visible='true' version='1' lat='-0.21802147020530807' lon='-0.5210285258597515' />
+  <node id='21' visible='true' version='1' lat='-0.2221908395649969' lon='-0.5209415430673436' />
+  <node id='22' visible='true' version='1' lat='-0.22195451857008858' lon='-0.5207002437384278' />
+  <node id='24' visible='true' version='1' lat='-0.22193543526189635' lon='-0.5211703062894754' />
+  <node id='204' visible='true' version='1' lat='-0.21845168535119228' lon='-0.5209389065396647'>
+    <tag k='name' v='WPstart' />
+  </node>
+  <node id='208' visible='true' version='1' lat='-0.22155124019804942' lon='-0.5210546105815851'>
+    <tag k='name' v='WPfinish' />
+  </node>
+  <node id='242' visible='true' version='1' lat='-0.21969184942143533' lon='-0.520508838695913'>
+    <tag k='name' v='WP03' />
+  </node>
+  <node id='244' visible='true' version='1' lat='-0.2200812203297903' lon='-0.5205220270076113'>
+    <tag k='name' v='WP05' />
+  </node>
+  <node id='246' visible='true' version='1' lat='-0.21966460614165306' lon='-0.5211903128432791' />
+  <node id='248' visible='true' version='1' lat='-0.22006229057645915' lon='-0.5212037827409091' />
+  <node id='253' visible='true' version='1' lat='-0.21927153579637806' lon='-0.5195315927529504' />
+  <node id='255' visible='true' version='1' lat='-0.2207678018006232' lon='-0.5197417721359917' />
+  <node id='257' visible='true' version='1' lat='-0.22054261127446687' lon='-0.5220737624335469' />
+  <node id='259' visible='true' version='1' lat='-0.21914142570197062' lon='-0.5220187154522741' />
+  <node id='269' visible='true' version='1' lat='-0.21987704814393666' lon='-0.5204373658084384'>
+    <tag k='name' v='WP04' />
+  </node>
+  <node id='270' visible='true' version='1' lat='-0.2202373530002358' lon='-0.5206475451914799'>
+    <tag k='name' v='WP06' />
+  </node>
+  <node id='345' visible='true' version='1' lat='-0.22026866394788633' lon='-0.5208635679861234'>
+    <tag k='name' v='WP07' />
+  </node>
+  <node id='381' visible='true' version='1' lat='-0.21952244127387813' lon='-0.5206514738187112'>
+    <tag k='name' v='WP02' />
+  </node>
+  <node id='438' visible='true' version='1' lat='-0.21948172568612254' lon='-0.5208369137424373'>
+    <tag k='name' v='WP01' />
+  </node>
+  <way id='5' visible='true' version='1'>
+    <nd ref='3' />
+    <nd ref='345' />
+    <tag k='highway' v='primary' />
+    <tag k='name' v='main 2' />
+  </way>
+  <way id='13' visible='true' version='1'>
+    <nd ref='4' />
+    <nd ref='6' />
+    <nd ref='8' />
+    <nd ref='10' />
+    <nd ref='4' />
+    <tag k='highway' v='primary' />
+  </way>
+  <way id='20' visible='true' version='1'>
+    <nd ref='21' />
+    <nd ref='22' />
+    <nd ref='3' />
+    <nd ref='24' />
+    <nd ref='21' />
+    <tag k='highway' v='primary' />
+  </way>
+  <way id='239' visible='true' version='1'>
+    <nd ref='345' />
+    <nd ref='248' />
+    <nd ref='246' />
+    <nd ref='438' />
+    <nd ref='242' />
+    <nd ref='244' />
+    <nd ref='345' />
+    <tag k='highway' v='primary' />
+    <tag k='junction' v='roundabout' />
+    <tag k='name' v='roundabout' />
+    <tag k='oneway' v='yes' />
+  </way>
+  <way id='240' visible='true' version='1'>
+    <nd ref='438' />
+    <nd ref='4' />
+    <tag k='highway' v='primary' />
+    <tag k='name' v='main 1' />
+  </way>
+  <way id='254' visible='true' version='1'>
+    <nd ref='253' />
+    <nd ref='242' />
+    <tag k='highway' v='residential' />
+  </way>
+  <way id='256' visible='true' version='1'>
+    <nd ref='255' />
+    <nd ref='244' />
+    <tag k='highway' v='residential' />
+  </way>
+  <way id='258' visible='true' version='1'>
+    <nd ref='257' />
+    <nd ref='248' />
+    <tag k='highway' v='residential' />
+  </way>
+  <way id='260' visible='true' version='1'>
+    <nd ref='259' />
+    <nd ref='246' />
+    <tag k='highway' v='residential' />
+  </way>
+</osm>
diff --git a/src/test/roundabout-waypoints.sh b/src/test/roundabout-waypoints.sh
new file mode 120000
index 0000000..b627b17
--- /dev/null
+++ b/src/test/roundabout-waypoints.sh
@@ -0,0 +1 @@
+start-1-finish.sh
\ No newline at end of file
diff --git a/src/types.c b/src/types.c
index 44850af..7dd2577 100644
--- a/src/types.c
+++ b/src/types.c
@@ -163,11 +163,6 @@ Property PropertyType(const char *property)
        return(Property_Bridge);
     break;
 
-   case 'c':
-    if(!strcmp(property,"cyclebothways"))
-       return(Property_CycleBothWays);
-    break;
-
    case 'f':
     if(!strcmp(property,"footroute"))
        return(Property_FootRoute);
@@ -241,6 +236,8 @@ const char *HighwayName(Highway highway)
    case Highway_Count:
     ;
 
+   case Highway_CycleBothWays:
+    ;
    case Highway_OneWay:
     ;
    case Highway_Roundabout:
@@ -330,9 +327,6 @@ const char *PropertyName(Property property)
    case Property_BicycleRoute:
     return("bicycleroute");
 
-   case Property_CycleBothWays:
-    return("cyclebothways");
-
    case Property_Count:
     ;
   }
diff --git a/src/types.h b/src/types.h
index 69a7928..c3250b6 100644
--- a/src/types.h
+++ b/src/types.h
@@ -239,13 +239,14 @@ typedef enum _Highway
 
   Highway_Count        = 14,       /* One more than the number of highway types. */
 
-  Highway_OneWay       =  32,
-  Highway_Roundabout   =  64,
-  Highway_Area         = 128
+  Highway_CycleBothWays =  16,
+  Highway_OneWay        =  32,
+  Highway_Roundabout    =  64,
+  Highway_Area          = 128
  }
  Highway;
 
-#define HIGHWAY(xx) ((xx)&0x1f)
+#define HIGHWAY(xx) ((xx)&0x0f)
 
 /*+ A bitmask of multiple highway types. +*/
 typedef uint16_t highways_t;
@@ -338,9 +339,8 @@ typedef enum _Property
   Property_Tunnel       = 4,
   Property_FootRoute    = 5,
   Property_BicycleRoute = 6,
-  Property_CycleBothWays= 7,
 
-  Property_Count        = 8       /* One more than the number of property types. */
+  Property_Count        = 7       /* One more than the number of property types. */
  }
  Property;
 
@@ -361,7 +361,6 @@ typedef enum _Properties
   Properties_Tunnel       = PROPERTIES(Property_Tunnel       ),
   Properties_FootRoute    = PROPERTIES(Property_FootRoute    ),
   Properties_BicycleRoute = PROPERTIES(Property_BicycleRoute ),
-  Properties_CycleBothWays= PROPERTIES(Property_CycleBothWays),
 
   Properties_ALL          = PROPERTIES(Property_Count        )-1
  }
diff --git a/src/visualiser.c b/src/visualiser.c
index eed8bc1..d07b56b 100644
--- a/src/visualiser.c
+++ b/src/visualiser.c
@@ -65,6 +65,7 @@ static int limit_type=0;
 static Highway highways=Highway_None;
 static Transports transports=Transports_None;
 static Properties properties=Properties_None;
+static highway_t waytype=0;
 
 /* Local functions */
 
@@ -72,7 +73,7 @@ static void find_all_nodes(Nodes *nodes,callback_t callback);
 
 static void output_junctions(index_t node,double latitude,double longitude);
 static void output_super(index_t node,double latitude,double longitude);
-static void output_oneway(index_t node,double latitude,double longitude);
+static void output_waytype(index_t node,double latitude,double longitude);
 static void output_highway(index_t node,double latitude,double longitude);
 static void output_transport(index_t node,double latitude,double longitude);
 static void output_barrier(index_t node,double latitude,double longitude);
@@ -259,9 +260,11 @@ static void output_super(index_t node,double latitude,double longitude)
   double lonmin The minimum longitude.
 
   double lonmax The maximum longitude.
+
+  highway_t mask A bit mask that must match the highway type.
   ++++++++++++++++++++++++++++++++++++++*/
 
-void OutputOneway(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,double latmin,double latmax,double lonmin,double lonmax)
+void OutputWaytype(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,double latmin,double latmax,double lonmin,double lonmax,highway_t mask)
 {
  /* Use local variables so that the callback doesn't need to pass them backwards and forwards */
 
@@ -277,12 +280,14 @@ void OutputOneway(Nodes *nodes,Segments *segments,Ways *ways,Relations *relation
 
  /* Iterate through the nodes and process them */
 
- find_all_nodes(nodes,(callback_t)output_oneway);
+ waytype=mask;
+
+ find_all_nodes(nodes,(callback_t)output_waytype);
 }
 
 
 /*++++++++++++++++++++++++++++++++++++++
-  Process a single node and all connected one-way segments (called as a callback).
+  Process a single node and all connected way-type segments (called as a callback).
 
   index_t node The node to output.
 
@@ -291,7 +296,7 @@ void OutputOneway(Nodes *nodes,Segments *segments,Ways *ways,Relations *relation
   double longitude The longitude of the node.
   ++++++++++++++++++++++++++++++++++++++*/
 
-static void output_oneway(index_t node,double latitude,double longitude)
+static void output_waytype(index_t node,double latitude,double longitude)
 {
  Node *nodep=LookupNode(OSMNodes,node,1);
  Segment *segmentp;
@@ -302,18 +307,22 @@ static void output_oneway(index_t node,double latitude,double longitude)
    {
     if(IsNormalSegment(segmentp))
       {
-       index_t othernode=OtherNode(segmentp,node);
+       Way *wayp=LookupWay(OSMWays,segmentp->way,1);
 
-       if(node>othernode)
+       if(wayp->type&waytype)
          {
+          index_t othernode=OtherNode(segmentp,node);
           double lat,lon;
 
           GetLatLong(OSMNodes,othernode,NULL,&lat,&lon);
 
-          if(IsOnewayFrom(segmentp,node))
-             printf("segment%"Pindex_t" %.6f %.6f %.6f %.6f\n",IndexSegment(OSMSegments,segmentp),radians_to_degrees(latitude),radians_to_degrees(longitude),radians_to_degrees(lat),radians_to_degrees(lon));
-          else if(IsOnewayFrom(segmentp,othernode))
-             printf("segment%"Pindex_t" %.6f %.6f %.6f %.6f\n",IndexSegment(OSMSegments,segmentp),radians_to_degrees(lat),radians_to_degrees(lon),radians_to_degrees(latitude),radians_to_degrees(longitude));
+          if(node>othernode || (lat<LatMin || lat>LatMax || lon<LonMin || lon>LonMax))
+            {
+             if(IsOnewayFrom(segmentp,node))
+                printf("segment%"Pindex_t" %.6f %.6f %.6f %.6f\n",IndexSegment(OSMSegments,segmentp),radians_to_degrees(latitude),radians_to_degrees(longitude),radians_to_degrees(lat),radians_to_degrees(lon));
+             else if(IsOnewayFrom(segmentp,othernode))
+                printf("segment%"Pindex_t" %.6f %.6f %.6f %.6f\n",IndexSegment(OSMSegments,segmentp),radians_to_degrees(lat),radians_to_degrees(lon),radians_to_degrees(latitude),radians_to_degrees(longitude));
+            }
          }
       }
 
@@ -388,20 +397,17 @@ static void output_highway(index_t node,double latitude,double longitude)
    {
     if(IsNormalSegment(segmentp))
       {
-       index_t othernode=OtherNode(segmentp,node);
+       Way *wayp=LookupWay(OSMWays,segmentp->way,1);
 
-       if(node>othernode)
+       if(HIGHWAY(wayp->type)==highways)
          {
-          Way *wayp=LookupWay(OSMWays,segmentp->way,1);
-
-          if(HIGHWAY(wayp->type)==highways)
-            {
-             double lat,lon;
+          index_t othernode=OtherNode(segmentp,node);
+          double lat,lon;
 
-             GetLatLong(OSMNodes,othernode,NULL,&lat,&lon);
+          GetLatLong(OSMNodes,othernode,NULL,&lat,&lon);
 
+          if(node>othernode || (lat<LatMin || lat>LatMax || lon<LonMin || lon>LonMax))
              printf("segment%"Pindex_t" %.6f %.6f %.6f %.6f\n",IndexSegment(OSMSegments,segmentp),radians_to_degrees(latitude),radians_to_degrees(longitude),radians_to_degrees(lat),radians_to_degrees(lon));
-            }
          }
       }
 
@@ -476,20 +482,17 @@ static void output_transport(index_t node,double latitude,double longitude)
    {
     if(IsNormalSegment(segmentp))
       {
-       index_t othernode=OtherNode(segmentp,node);
+       Way *wayp=LookupWay(OSMWays,segmentp->way,1);
 
-       if(node>othernode)
+       if(wayp->allow&transports)
          {
-          Way *wayp=LookupWay(OSMWays,segmentp->way,1);
-
-          if(wayp->allow&transports)
-            {
-             double lat,lon;
+          index_t othernode=OtherNode(segmentp,node);
+          double lat,lon;
 
-             GetLatLong(OSMNodes,othernode,NULL,&lat,&lon);
+          GetLatLong(OSMNodes,othernode,NULL,&lat,&lon);
 
+          if(node>othernode || (lat<LatMin || lat>LatMax || lon<LonMin || lon>LonMax))
              printf("segment%"Pindex_t" %.6f %.6f %.6f %.6f\n",IndexSegment(OSMSegments,segmentp),radians_to_degrees(latitude),radians_to_degrees(longitude),radians_to_degrees(lat),radians_to_degrees(lon));
-            }
          }
       }
 
@@ -1029,20 +1032,17 @@ static void output_property(index_t node,double latitude,double longitude)
    {
     if(IsNormalSegment(segmentp))
       {
-       index_t othernode=OtherNode(segmentp,node);
+       Way *wayp=LookupWay(OSMWays,segmentp->way,1);
 
-       if(node>othernode)
+       if(wayp->props&properties)
          {
-          Way *wayp=LookupWay(OSMWays,segmentp->way,1);
-
-          if(wayp->props&properties)
-            {
-             double lat,lon;
+          index_t othernode=OtherNode(segmentp,node);
+          double lat,lon;
 
-             GetLatLong(OSMNodes,othernode,NULL,&lat,&lon);
+          GetLatLong(OSMNodes,othernode,NULL,&lat,&lon);
 
+          if(node>othernode || (lat<LatMin || lat>LatMax || lon<LonMin || lon>LonMax))
              printf("segment%"Pindex_t" %.6f %.6f %.6f %.6f\n",IndexSegment(OSMSegments,segmentp),radians_to_degrees(latitude),radians_to_degrees(longitude),radians_to_degrees(lat),radians_to_degrees(lon));
-            }
          }
       }
 
diff --git a/src/visualiser.h b/src/visualiser.h
index 05d15e7..2979d91 100644
--- a/src/visualiser.h
+++ b/src/visualiser.h
@@ -3,7 +3,7 @@
 
  Part of the Routino routing software.
  ******************/ /******************
- This file Copyright 2008-2013 Andrew M. Bishop
+ This file Copyright 2008-2014 Andrew M. Bishop
 
  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU Affero General Public License as published by
@@ -33,7 +33,7 @@ void OutputJunctions(Nodes *nodes,Segments *segments,Ways *ways,Relations *relat
 
 void OutputSuper(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,double latmin,double latmax,double lonmin,double lonmax);
 
-void OutputOneway(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,double latmin,double latmax,double lonmin,double lonmax);
+void OutputWaytype(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,double latmin,double latmax,double lonmin,double lonmax,highway_t mask);
 
 void OutputHighway(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,double latmin,double latmax,double lonmin,double lonmax,Highway highway);
 
diff --git a/web/Makefile b/web/Makefile
index d9a0f82..a280054 100644
--- a/web/Makefile
+++ b/web/Makefile
@@ -48,6 +48,8 @@ SPECIAL_XML_FILES=tagging-drive.xml \
 PROFILE_FILES=profiles.pl \
 	      profiles.js
 
+TRANS_FILES=$(wildcard $(WEBTRANSDIR)/translation.*.txt)
+
 DOC_FILES=$(notdir $(wildcard $(DOCDIR)/html/*.html)) $(notdir $(wildcard $(DOCDIR)/html/*.css))
 
 EXE_FILES=planetsplitter planetsplitter-slim \
@@ -71,13 +73,13 @@ all-bin: all-exe
 all-data: all-xml
 	@[ -d $(WEBDATADIR) ] || mkdir -p $(WEBDATADIR)
 	@for file in $(STANDARD_XML_FILES); do \
-	    if [ ! -f $(WEBDATADIR)/$$file ] || [ routino-$$file -nt $(WEBDATADIR)/$$file ]; then \
+	    if [ ! -f $(WEBDATADIR)/$$file ] || [ $(XMLDIR)/routino-$$file -nt $(WEBDATADIR)/$$file ]; then \
 	       echo cp $(XMLDIR)/routino-$$file $(WEBDATADIR)/$$file ;\
 	       cp -f $(XMLDIR)/routino-$$file $(WEBDATADIR)/$$file ;\
 	    fi ;\
 	 done
 	@for file in $(SPECIAL_XML_FILES); do \
-	    if [ ! -f $(WEBDATADIR)/$$file ] || [ $$file -nt $(WEBDATADIR)/$$file ]; then \
+	    if [ ! -f $(WEBDATADIR)/$$file ] || [ $(XMLDIR)/$$file -nt $(WEBDATADIR)/$$file ]; then \
 	       echo cp $(XMLDIR)/$$file $(WEBDATADIR)/$$file ;\
 	       cp -f $(XMLDIR)/$$file $(WEBDATADIR)/$$file ;\
 	    fi ;\
@@ -102,14 +104,22 @@ all-profiles: all-exe all-data
 
 all-icons: $(WEBICONDIR)/ball-0.png
 
-$(WEBICONDIR)/ball-0.png:
-	echo create-icons.pl
+$(WEBICONDIR)/ball-0.png: $(WEBICONDIR)/create-icons.pl
+	@echo create-icons.pl
 	@cd $(WEBICONDIR) && perl create-icons.pl
 
-all-translations: $(WEBWWWDIR)/router.html.en
+all-translations: $(WEBWWWDIR)/router.html.en $(WEBWWWDIR)/visualiser.html.en $(XMLDIR)/routino-translations.xml
+
+$(WEBWWWDIR)/router.html.en: $(WEBTRANSDIR)/router.html $(TRANS_FILES) $(WEBTRANSDIR)/translate.pl
+	@echo translate.pl
+	@cd $(WEBTRANSDIR) && perl translate.pl
+
+$(WEBWWWDIR)/visualiser.html.en: $(WEBTRANSDIR)/visualiser.html $(TRANS_FILES) $(WEBTRANSDIR)/translate.pl
+	@echo translate.pl
+	@cd $(WEBTRANSDIR) && perl translate.pl
 
-$(WEBWWWDIR)/router.html.en:
-	echo translate.pl
+$(XMLDIR)/routino-translations.xml: $(WEBTRANSDIR)/translations-head.xml $(WEBTRANSDIR)/translations-body.xml $(WEBTRANSDIR)/translations-tail.xml $(TRANS_FILES) $(WEBTRANSDIR)/translate.pl
+	@echo translate.pl
 	@cd $(WEBTRANSDIR) && perl translate.pl
 
 all-exe:
diff --git a/web/translations/router.html b/web/translations/router.html
index 63498e3..e28d6b5 100644
--- a/web/translations/router.html
+++ b/web/translations/router.html
@@ -64,7 +64,7 @@
     <form name="form" id="form" action="#" method="get" onsubmit="return false;">
       <div class="hideshow_box">
         <span class="hideshow_title">@@ROUTINO-ROUTER@@</span>
-        @@ROUTER-INFO@@
+        $$ROUTER-INFO$$
         <div class="center">
           <a target="other" href="http://www.routino.org/">@@ROUTINO-WEBSITE@@</a>
           |
@@ -79,12 +79,12 @@
 
         <div id="hideshow_language_div" style="display: none;">
           <table>
-           $$LANGUAGES-META$$
+           **LANGUAGES-META**
             <tr>
-              <td><a id="lang_xx_url" href="router.html.xx" title="@@LANGUAGE-WEBPAGE@@">@@LANGUAGE@@</a>
-              <td>(XX)
-              <td><input name="language" type="radio" value="xx" onchange="formSetLanguage();" CHECKED-XX>
-           $$LANGUAGES-META$$
+              <td><a id="lang_~~lang~~_url" href="router.html.~~lang~~" title="@@LANGUAGE-WEBPAGE@@">@@LANGUAGE@@</a>
+              <td>(~~LANG~~)
+              <td><input name="language" type="radio" value="~~lang~~" onchange="formSetLanguage();" ~~CHECKED~~>
+           **LANGUAGES-META**
           </table>
           <a target="translation" href="http://www.routino.org/translations/">Routino Translations</a>
         </div>
@@ -237,8 +237,8 @@
 
       <div class="hideshow_box">
         <span class="hideshow_title">@@FIND-BOX@@</span>
-        <input type="button" title="@@FIND-SHORTEST-ROUTE@@" id="shortest" value="@@SHORTEST-ROUTE@@" onclick="findRoute('shortest');">
-        <input type="button" title="@@FIND-QUICKEST-ROUTE@@" id="quickest" value="@@QUICKEST-ROUTE@@" onclick="findRoute('quickest');">
+        <input type="button" title="@@FIND-SHORTEST-ROUTE@@" id="shortest" value="@@SHORTEST-ROUTE@@" onclick="findRoute('shortest');" disabled="disabled">
+        <input type="button" title="@@FIND-QUICKEST-ROUTE@@" id="quickest" value="@@QUICKEST-ROUTE@@" onclick="findRoute('quickest');" disabled="disabled">
       </div>
 
       <div class="hideshow_box">
@@ -254,7 +254,7 @@
         <span class="hideshow_title">@@HELP-BOX@@</span>
         <div id="hideshow_help_options_div">
           <div class="scrollable">
-            @@ROUTER-OPTIONS-HELP@@
+            $$ROUTER-OPTIONS-HELP$$
           </div>
         </div>
       </div>
@@ -349,7 +349,7 @@
       <span class="hideshow_title">@@HELP-BOX@@</span>
       <div id="hideshow_help_route_div">
         <div class="scrollable">
-          @@ROUTER-RESULTS-HELP@@
+          $$ROUTER-RESULTS-HELP$$
         </div>
       </div>
     </div>
@@ -365,7 +365,7 @@
 
     <div class="hideshow_box">
       <span class="hideshow_title">@@VISUALISER-BOX@@</span>
-      @@ROUTER-VISUALISER-INFO@@
+      $$ROUTER-VISUALISER-INFO$$
       <br>
       <a id="visualiser_url" href="visualiser.html" target="visualiser">@@MAP-VIEW-LINK@@</a>
     </div>
diff --git a/web/translations/translate.pl b/web/translations/translate.pl
index 0023945..d579660 100755
--- a/web/translations/translate.pl
+++ b/web/translations/translate.pl
@@ -20,16 +20,13 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #
 
-# Use the perl encoding/decoding functions
-use Encode qw(decode encode);
-
 use strict;
 
 # Constants
 
 my @translation_files=(<translation.*.txt>);
-my $xml_file="../data/translations.xml";
-my $output_dir="../www/routino";
+my $xml_output_file="../../xml/routino-translations.xml";
+my $html_output_dir="../www/routino";
 
 my @html_template_files=(<*.html>);
 
@@ -37,7 +34,7 @@ my %languages=();
 my %translations=();
 
 
-# Read in the translations (HTML)
+# Read in the translations
 
 foreach my $translation_file (@translation_files)
   {
@@ -68,7 +65,7 @@ foreach my $translation_file (@translation_files)
       next if(m%^#%);
       next if(m%^$%);
 
-      # Single line entries
+      # Single line HTML entries
 
       if(m%\@\@%)
         {
@@ -82,16 +79,18 @@ foreach my $translation_file (@translation_files)
            {
             $translations{$language}->{html}++;
             $translations{$language}->{codes}->{$code}={};
-            $translations{$language}->{codes}->{$code}->{text}=encode('ascii',decode('UTF-8',$text),Encode::FB_HTMLCREF);
-            $translations{$language}->{codes}->{$code}->{used}=0;
+            $translations{$language}->{codes}->{$code}->{text}=$text;
+            $translations{$language}->{codes}->{$code}->{usedX}=0;
+            $translations{$language}->{codes}->{$code}->{usedR}=0;
+            $translations{$language}->{codes}->{$code}->{usedV}=0;
            }
         }
 
-      # Multi-line entries
+      # Multi-line HTML entries
 
-      if(m%\$\$([^\$]+)\$\$%)
+      if(m%(\$\$[^\$]+\$\$)%)
         {
-         my($code,$text)=("@@".$1."@@","");
+         my($code,$text)=($1,"");
 
          while(<FILE>)
            {
@@ -110,57 +109,38 @@ foreach my $translation_file (@translation_files)
            {
             $translations{$language}->{html}++;
             $translations{$language}->{codes}->{$code}={};
-            $translations{$language}->{codes}->{$code}->{text}=encode('ascii',decode('UTF-8',$text),Encode::FB_HTMLCREF);
-            $translations{$language}->{codes}->{$code}->{used}=0;
+            $translations{$language}->{codes}->{$code}->{text}=$text;
+            $translations{$language}->{codes}->{$code}->{usedX}=0;
+            $translations{$language}->{codes}->{$code}->{usedR}=0;
+            $translations{$language}->{codes}->{$code}->{usedV}=0;
            }
         }
-     }
-
-   close(FILE);
-  }
-
-
-# Read in the translations (XML)
-
-open(XML,"<$xml_file");
-
-my $language="";
-
-while(<XML>)
-  {
-   if(m%<language +lang=["']([^"']+)["'] *>%)
-     {
-      # Add to list of languages
 
-      $language=$1;
+      # Single line XML entries
 
-      if(! defined $languages{$language})
+      if(m%\%\%%)
         {
-         $languages{$language}=1;
+         my($code,$text)=split("\t");
 
-         $translations{$language}={};
-         $translations{$language}->{codes}={};
-         $translations{$language}->{html}=0;
-         $translations{$language}->{xml}=0;
+         if(defined $translations{$language}->{codes}->{$code})
+           {
+            print STDERR "Language: $language DUPLICATED codeword '$code'\n";
+           }
+         else
+           {
+            $translations{$language}->{xml}++;
+            $translations{$language}->{codes}->{$code}={};
+            $translations{$language}->{codes}->{$code}->{text}=$text;
+            $translations{$language}->{codes}->{$code}->{usedX}=0;
+            $translations{$language}->{codes}->{$code}->{usedR}=0;
+            $translations{$language}->{codes}->{$code}->{usedV}=0;
+           }
         }
-
-      next;
      }
 
-   $language="" if(m%</language *>%);
-
-   next if(!$language);
-
-   # Count the phrases
-
-   if(m%<[a-z]+% && m% +(text|string)=["']([^"']+)["']%)
-     {
-      $translations{$language}->{xml}++;
-     }
+   close(FILE);
   }
 
-close(XML);
-
 
 # Sort out the languages
 
@@ -174,10 +154,15 @@ foreach my $language (sort (keys %languages))
   }
 
 
-# Create the files
+# Create the HTML files
 
 foreach my $html_template_file (@html_template_files)
   {
+   my $usedtype="";
+
+   $usedtype="R" if($html_template_file =~ m%router%);
+   $usedtype="V" if($html_template_file =~ m%visualiser%);
+
    foreach my $language (@languages)
      {
       next if(!$translations{$language}->{html});
@@ -188,7 +173,7 @@ foreach my $html_template_file (@html_template_files)
       my $language_meta_string="";
 
       open(HTML_IN ,"<$html_template_file");
-      open(HTML_OUT,">$output_dir/$html_template_file.$language");
+      open(HTML_OUT,">$html_output_dir/$html_template_file.$language");
 
       while(<HTML_IN>)
         {
@@ -196,7 +181,7 @@ foreach my $html_template_file (@html_template_files)
 
          # Language selection - special handling
 
-         if($line =~ m%\$\$LANGUAGES-META\$\$%)
+         if($line =~ m%\*\*LANGUAGES-META\*\*%)
            {
             $language_meta=1-$language_meta;
 
@@ -211,15 +196,15 @@ foreach my $html_template_file (@html_template_files)
 
                   if($language eq $language2)
                     {
-                     $line =~ s%CHECKED-XX%checked%g;
+                     $line =~ s%~~CHECKED~~%checked%g;
                     }
                   else
                     {
-                     $line =~ s%CHECKED-XX%%g;
+                     $line =~ s%~~CHECKED~~%%g;
                     }
 
-                  $line =~ s%xx%$language2%g;
-                  $line =~ s%XX%$LANGUAGE2%g;
+                  $line =~ s%~~lang~~%$language2%g;
+                  $line =~ s%~~LANG~~%$LANGUAGE2%g;
 
                   if(!$translations{$language2}->{html})
                     {
@@ -231,10 +216,15 @@ foreach my $html_template_file (@html_template_files)
                      $line =~ s%<input .+>%%;
                     }
 
-                  foreach my $code (keys $translations{$language}->{codes})
+                  foreach my $code (keys %{$translations{$language2}->{codes}})
                     {
                      if($line =~ s%$code%$translations{$language2}->{codes}->{$code}->{text}%g)
-                       {$translations{$language2}->{codes}->{$code}->{used} = 1;}
+                       {$translations{$language2}->{codes}->{$code}->{"used$usedtype"} = 1;}
+                    }
+
+                  if($line =~ m%((\@\@|\$\$|\*\*|\~\~)[^\@\$*~]+(\@\@|\$\$|\*\*|\~\~))%)
+                    {
+                     print STDERR "   Unmatched codeword '$1' in line: $line";
                     }
 
                   # Remove un-needed spaces
@@ -258,22 +248,22 @@ foreach my $html_template_file (@html_template_files)
 
          # Replace with translated phrases
 
-         foreach my $code (keys $translations{$language}->{codes})
+         foreach my $code (keys %{$translations{$language}->{codes}})
            {
-            if($line =~ s%$code%$translations{$language}->{codes}->{$code}->{text}%g)
-              {$translations{$language}->{codes}->{$code}->{used} = 1;}
+            if($line =~ s%\Q$code\E%$translations{$language}->{codes}->{$code}->{text}%g)
+              {$translations{$language}->{codes}->{$code}->{"used$usedtype"} = 1;}
            }
 
          # Replace what is left with English phrases
 
-         foreach my $code (keys $translations{$languages[0]}->{codes})
+         foreach my $code (keys %{$translations{$languages[0]}->{codes}})
            {
-            $line =~ s%$code%$translations{$languages[0]}->{codes}->{$code}->{text}%g;
+            $line =~ s%\Q$code\E%$translations{$languages[0]}->{codes}->{$code}->{text}%g;
            }
 
-         if($line =~ m%\@\@%)
+         if($line =~ m%((\@\@|\$\$|\*\*|\~\~)[^\@\$*~]+(\@\@|\$\$|\*\*|\~\~))%)
            {
-            print STDERR "   Unmatched codeword in line: $line";
+            print STDERR "   Unmatched codeword '$1' in line: $line";
            }
 
          # Remove un-needed spaces
@@ -291,13 +281,98 @@ foreach my $html_template_file (@html_template_files)
   }
 
 
-# Check the languages
+# Create the XML file
+
+open(XML_OUT,">$xml_output_file");
+
+open(XML_IN ,"<translations-head.xml");
+
+while(<XML_IN>)
+  {
+   print XML_OUT;
+  }
+
+close(XML_IN);
 
 foreach my $language (@languages)
   {
-   foreach my $code (keys $translations{$language}->{codes})
+   next if(!$translations{$language}->{xml});
+
+   print "Language: $language File: translations.xml\n";
+
+   open(XML_IN ,"<translations-body.xml");
+
+   while(<XML_IN>)
      {
-      if(! $translations{$language}->{codes}->{$code}->{used})
+      my $line=$_;
+
+      $line =~ s%~~lang~~%$language%g;
+
+      # Replace with translated phrases
+
+      foreach my $code (keys %{$translations{$language}->{codes}})
+        {
+         if($line =~ s%$code%$translations{$language}->{codes}->{$code}->{text}%g)
+           {$translations{$language}->{codes}->{$code}->{usedX} = 1;}
+        }
+
+      # Replace what is left with a note about missing translations
+
+      if($line =~ m%\%\%%)
+        {
+         foreach my $code (keys %{$translations{$languages[0]}->{codes}})
+           {
+            $line =~ s%$code%$translations{$languages[0]}->{codes}->{$code}->{text}%g;
+           }
+
+         $line =~ s%<%<!-- TRANSLATION REQUIRED: %;
+         $line =~ s%>% -->%;
+
+         if($line =~ m%((\%\%|\~\~)[^\%~]+(\%\%|\~\~))%)
+           {
+            print STDERR "   Unmatched codeword '$1' in line: $line";
+           }
+        }
+
+      print XML_OUT $line;
+     }
+
+   close(XML_IN);
+  }
+
+open(XML_IN ,"<translations-tail.xml");
+
+while(<XML_IN>)
+  {
+   print XML_OUT;
+  }
+
+close(XML_IN);
+
+close(XML_OUT);
+
+
+# Check the languages and usage
+
+my %usedX=();
+my %usedR=();
+my %usedV=();
+
+foreach my $language (@languages)
+  {
+   $usedX{$language}=0;
+   $usedR{$language}=0;
+   $usedV{$language}=0;
+
+   foreach my $code (keys %{$translations{$language}->{codes}})
+     {
+      $usedX{$language}+=$translations{$language}->{codes}->{$code}->{usedX};
+      $usedR{$language}+=$translations{$language}->{codes}->{$code}->{usedR};
+      $usedV{$language}+=$translations{$language}->{codes}->{$code}->{usedV};
+
+      if(! $translations{$language}->{codes}->{$code}->{usedX} &&
+         ! $translations{$language}->{codes}->{$code}->{usedR} &&
+         ! $translations{$language}->{codes}->{$code}->{usedV})
         {
          print STDERR "Language: $language UNUSED codeword: $code\n";
         }
@@ -313,15 +388,17 @@ print "Translation Coverage\n";
 print "====================\n";
 
 print "\n";
-print "            Number      Fraction\n";
-print "Language  HTML   XML   HTML   XML\n";
-print "--------  ----   ---   ----   ---\n";
+print "           Number      Percentage Complete\n";
+print "Language  XML HTML    XML router visualiser\n";
+print "--------  --- ----    --- ------ ----------\n";
 
 foreach my $language (@languages)
   {
-   printf("%-6s     %3d   %3d  %4.0f%% %4.0f%%\n",$language,
-                                                  $translations{$language}->{html},
-                                                  $translations{$language}->{xml},
-                                                  100.0*$translations{$language}->{html}/$translations{$languages[0]}->{html},
-                                                  100.0*$translations{$language}->{xml} /$translations{$languages[0]}->{xml});
+   printf("%-6s    %3d  %3d  %4.0f%%  %4.0f%%  %4.0f%%\n",
+          $language,
+          $translations{$language}->{xml},
+          $translations{$language}->{html},
+          100.0*$usedX{$language}/$usedX{$languages[0]},
+          100.0*$usedR{$language}/$usedR{$languages[0]},
+          100.0*$usedV{$language}/$usedV{$languages[0]})
   }
diff --git a/web/translations/translation.de.txt b/web/translations/translation.de.txt
index 9f5e9a7..6278a28 100644
--- a/web/translations/translation.de.txt
+++ b/web/translations/translation.de.txt
@@ -1,14 +1,98 @@
 #
-# German language web-page translation phrases
+# German language translation phrases
 #
 
-@@LANGUAGE@@	Deutsche
-@@LANGUAGE-WEBPAGE@@	Deutsche Webseite
+#
+# Router output XML definition
+#
+
+%%copyright_creator_string%%	Urheber
+%%copyright_source_string%%	Source
+%%copyright_source_text%%	Basierend auf OpenStreetMap-Daten, erhältlich via http://www.openstreetmap.org/
+%%copyright_license_string%%	Lizenz
+
+%%turn_-4%%	Spitzkehre nach links
+%%turn_-3%%	Scharf links
+%%turn_-2%%	Links
+%%turn_-1%%	Halb links
+%%turn_0%%	Geradeaus
+%%turn_1%%	Halb rechts
+%%turn_2%%	Rechts
+%%turn_3%%	Scharf rechts
+%%turn_4%%	Spitzkehre nach rechts
+
+%%heading_-4%%	Süd
+%%heading_-3%%	Süd-West
+%%heading_-2%%	West
+%%heading_-1%%	Nord-West
+%%heading_0%%	Nord
+%%heading_1%%	Nord-Ost
+%%heading_2%%	Ost
+%%heading_3%%	Süd-Ost
+%%heading_4%%	Süd
+
+%%ordinal_1%%	Erste
+%%ordinal_2%%	Zweite
+%%ordinal_3%%	Dritte
+%%ordinal_4%%	Vierte
+%%ordinal_5%%	Fünfte
+%%ordinal_6%%	Sechste
+%%ordinal_7%%	Siebte
+%%ordinal_8%%	Achte
+%%ordinal_9%%	Neunte
+%%ordinal_10%%	Zehnte
+
+%%highway_motorway%%	Autobahn
+%%highway_trunk%%	Schnellstraße
+%%highway_primary%%	Bundesstraße
+%%highway_secondary%%	Landstraße
+%%highway_tertiary%%	Kreisstraße
+%%highway_unclassified%%	Nebenstraße
+%%highway_residential%%	Wohngebietsstraße
+%%highway_service%%	Erschließungsweg
+%%highway_track%%	Wirtschaftsweg
+%%highway_cycleway%%	Radweg
+%%highway_path%%	Weg
+%%highway_steps%%	Treppe
+%%highway_ferry%%	Fähre
+
+%%route_shortest%%	Kürzeste
+%%route_quickest%%	Schnellste
+
+%%output-html_waypoint_waypoint%%	Wegpunkt
+%%output-html_waypoint_junction%%	Anschlussstelle
+%%output-html_waypoint_roundabout%%	Kreisverkehr
+%%output-html_title%%	%s Route
+%%output-html_start_string%%	Start
+%%output-html_start_text%%	Bei %s halten Sie sich Richtung %s
+%%output-html_node_string%%	Bei
+%%output-html_node_text%%	Bei %s wenden Sie sich nach %s Richtung %s
+%%output-html_rbnode_string%%	Verlassen Sie
+%%output-html_rbnode_text%%	%s, nehmen Sie die %s Ausfahrt Richtung %s
+%%output-html_segment_string%%	Folgen
+%%output-html_segment_text%%	Folgen Sie der %s für %.3f km bzw. %.1f min
+%%output-html_stop_string%%	Stop
+%%output-html_stop_text%%	Sie sind bei %s angekommen
+%%output-html_total_string%%	Gesamt
+%%output-html_total_text%%	%.1f km, %.0f minuten
+
+%%output-gpx_waypoint_start%%	START
+%%output-gpx_waypoint_inter%%	INTER
+%%output-gpx_waypoint_trip%%	TRIP
+%%output-gpx_waypoint_finish%%	FINISH
+
+%%output-gpx_desc%%	%s Strecke zwischen 'Start' und 'Ziel'
+%%output-gpx_name%%	%s Strecke
+%%output-gpx_step%%	%s auf '%s' für %.3f km, %.1f min
+%%output-gpx_final%%	Gesamtstrecke %.1f km, %.0f minuten
 
 #
 # Router (and some shared) translations
 #
 
+@@LANGUAGE@@	Deutsch
+@@LANGUAGE-WEBPAGE@@	Deutsche Webseite
+
 @@ROUTER-TITLE@@	Routen Planer für OpenStreetMap Daten
 
 @@OPTION-TAB@@	Optionen
@@ -38,9 +122,18 @@
 @@STATUS-BOX@@	Status
 @@SHORTEST-ROUTE@@	kürzester Weg
 @@QUICKEST-ROUTE@@	schnellste Route
+
 @@STATISTICS-BOX@@	Routino Statistik
 @@VISUALISER-BOX@@	Routino Ansichten
 
+@@WAYPOINT-SEARCH@@	Nach Ort suchen
+@@WAYPOINT-CENTRE1@@	Karte auf Wegpunkt zentrieren
+@@WAYPOINT-UP@@	wegpunkt nach oben verschieben
+@@WAYPOINT-ADD@@	Neuer Wegpunkt nach diesem
+@@WAYPOINT-COORDS@@	Koordinaten des Orts
+@@WAYPOINT-CENTRE2@@	Wegpunkt auf Karte zentrieren
+@@WAYPOINT-DOWN@@	Wegpunkt nach unten verschieben
+@@WAYPOINT-REMOVE@@	Wegpunkt entfernen
 @@WAYPOINT-REVERSE@@	Rückwärts
 @@WAYPOINT-REVERSE-BUTTON@@	Rückwärts
 
@@ -83,6 +176,9 @@
 @@RESTRICT-WIDTH@@	Breite
 @@RESTRICT-LENGTH@@	Länge
 
+@@FIND-SHORTEST-ROUTE@@	Kürzeste Route finden
+@@FIND-QUICKEST-ROUTE@@	Schnellste Route finden
+
 @@MAP-VIEW-LINK@@	anpassen dieser Kartenansicht
 @@EDIT-OSM-DATA@@	Bearbeitet die OSM-Daten
 
@@ -103,10 +199,49 @@
 
 @@DISPLAY-STATISTICS@@	zeige die Statistik
 
+@@JAVASCRIPT-REQUIRED@@	Um die interaktive Karte zu nutzen iWork Javascript benötigt. 
+@@ROUTER@@	Router
+@@GEO-DATA@@	Geodaten
+@@TILES@@	Kacheln
+
 #
 # Visualiser specific translations
 #
 
+@@VISUALISER-TITLE@@	Visualisierung der Routing-Daten
+
+@@INSTRUCTIONS-BOX@@	Anweisungen
+@@ROUTER-BOX@@	Routino Router
+
+@@NO-DATA-DISPLAYED@@	Keine Daten angezeigt
+
+@@VISUALISER-FAILED@@	Fehler bei der Erstellung der visuellen Daten!
+@@VISUALISER-NUM-JUNCTIONS@@	# Kreuzungen verarbeitet
+@@VISUALISER-NUM-SUPER@@	# Super-Knoten/Segmente verarbeitet
+@@VISUALISER-NUM-WAYTYPE@@	# Wegtypen Segmente verarbeitet
+@@VISUALISER-NUM-SEGMENTS@@	# Segmente verarbeitet
+@@VISUALISER-NUM-NODES@@	# Knoten verarbeitet
+@@VISUALISER-NUM-TURNS@@	# Abbiegebeschrängkungen verarbeitet
+@@VISUALISER-NUM-ERRORS@@	# Error Logs erstellt
+
+@@JUNCTIONS-BUTTON@@	Kreuzungen anzeigen
+@@JUNCTIONS-2@@	Aufeinandertreffen zweier Wege unterschiedlichen Typs.
+@@JUNCTIONS-3@@	Aufeinandertreffen von drei Wegen.
+@@JUNCTIONS-4@@	Aufeinandertreffen von vier Wegen.
+@@JUNCTIONS-5@@	Aufeinandertreffen von fünf Wegen.
+@@JUNCTIONS-6@@	Aufeinandertreffen von sechs Wegen.
+@@JUNCTIONS-MORE@@	Aufeinandertreffen von sieben oder mehr Wegen.
+
+@@SUPER-BUTTON@@	Super-Segments anzeigen
+
+@@WEIGHT-LIMIT-8@@	8 Tonnen Wegbeschränkung
+
+@@HEIGHT-BUTTON@@	Maximale Höhe anzeigen 
+
+@@WIDTH-BUTTON@@	Maximale Breite anzeigen
+
+@@CLEAR-DATA-BUTTON@@	Daten zurücksetzen
+
 #
 # Multi-line descriptive translations (router)
 #
@@ -119,30 +254,30 @@ $$ROUTER-INFO$$
 $$ROUTER-OPTIONS-HELP$$
 <b>Schnellanleitung</b>
 <br>
-Klicke auf die Marker-Bildchen (oben), um sie in der Mitte der Karte (rechts) zu positionieren. Dann 
+Klicke auf die Marker-Bildchen (oben), um sie in der Mitte der Karte (rechts) zu positionieren. Dann
 ziehe das Bildchen auf die genaue Position. Das Zoomen der Karte vor der Patzierung ist vermutlich am einfachsten.
 Alternativ kann man die geografische Breite und Länge in den Kästchen eintragen.
 <p>
-Wähle die Fortbewegungsart, die Vorgaben zur Wegnutzung, die Geschwindigkeitsvorgaben, 
+Wähle die Fortbewegungsart, die Vorgaben zur Wegnutzung, die Geschwindigkeitsvorgaben,
 die Vorgaben zur Wegbeschaffenheit und die anderen Vorgaben von den obigen Auswahlfeldern.
 Ein Klick auf "kürzeste" oder "schnellste" ermittelt die entsprechende Verbindung und zeigt sie in der Karte an.
 <p>
 <b>Wegpunkte</b>
 <br>
 Ein Klick auf das Marker-Bildchen (oben) schaltet die Sichbarkeit in der Karte ein bzw. aus.
-Die Berechnung Route erfolgt in der Reihenfolge der Wegpunkte (so gut, wie es für die 
+Die Berechnung Route erfolgt in der Reihenfolge der Wegpunkte (so gut, wie es für die
 gewählte Fortbewegungsart möglich ist).
 <p>
 <b>Fortbewegungsart</b>
 <br>
-Die Auswahl der Fortbewegungsart bestimmt die bei der Routenberechnung erlaubten Wegtypen und die 
+Die Auswahl der Fortbewegungsart bestimmt die bei der Routenberechnung erlaubten Wegtypen und die
 Vorgabeeinstellungen aller anderen Parameter.
 <p>
 <b>Vorgaben zur Wegnutzung</b>
 <br>
 Die Vorgaben zur Wegnutzung bestimmen die Priorisierung von Wegarten.
-Wenn z. B. Schnellstraßen mit 110% und Bundesstraßen mit 100% angegeben werden, wird 
-bei zwei möglichen Wegwahlen die Schnellstraße solange bevorzugt wird, wie der 
+Wenn z. B. Schnellstraßen mit 110% und Bundesstraßen mit 100% angegeben werden, wird
+bei zwei möglichen Wegwahlen die Schnellstraße solange bevorzugt wird, wie der
 Längen(oder Zeit-)unterschied 10% nicht überschreitet.
 <p>
 <b>Geschwindigkeitsvorgaben</b>
@@ -152,16 +287,16 @@ andere Geschwindkeitsbegrenzung mit geringerem Wert bekannt ist.
 <p>
 <b>Vorgaben zur Wegbeschaffenheit</b>
 <br>
-Die Vorgaben zur Wegbeschaffenheit werden als Prozentangaben verwendet, um die Verhältnisse 
+Die Vorgaben zur Wegbeschaffenheit werden als Prozentangaben verwendet, um die Verhältnisse
 der Wegbenutzung zu steuern.
 Wenn z. B. befestigte Wege mit 75% angegeben sind, werden unbefestigte automatisch mit 25% angenommen, so
 werden Wege ausgewählt, die mindestens drei mal länger auf befestigten Wegen verlaufen.
 <p>
 <b>andere Vorgaben</b>
 <br>
-Die Berücksichtigung von Benutzungs-Begrenzungen durch Gewicht, Höhe, Länge und 
-Breite ist möglich. Genauso können Einbahnstraßenbeschräkungen ignoriert werden 
-(z. B. als Fußgänger). 
+Die Berücksichtigung von Benutzungs-Begrenzungen durch Gewicht, Höhe, Länge und
+Breite ist möglich. Genauso können Einbahnstraßenbeschräkungen ignoriert werden
+(z. B. als Fußgänger).
 $$ROUTER-OPTIONS-HELP$$
 
 $$ROUTER-RESULTS-HELP$$
@@ -182,10 +317,10 @@ Vorgaben sollte es erlauben eine Route zu finden.
   <dt>HTMLs
   <dd>Eine Beschreibung der Route mit Anweisungen für jede wichtige Abzweigung.
   <dt>GPX Track-Datei
-  <dd>Die gleichen Informationen, die in der Karte angezeigt werden mit Punkten für jeden Abzweig 
+  <dd>Die gleichen Informationen, die in der Karte angezeigt werden mit Punkten für jeden Abzweig
   und Linien für jedes Teilstück.
   <dt>GPX Routen-Datei
-  <dd>Die gleichen Informationen, die im Text angezeigt werden mit einem Wegpunkt für 
+  <dd>Die gleichen Informationen, die im Text angezeigt werden mit einem Wegpunkt für
   jede wichtige Richtungsänderung.
   <dt>Volltext-Datei
   <dd>Eine aller Knoten und die Abstände zwischen ihnen, sowie die Gesamtentfernung vom i
@@ -196,9 +331,10 @@ Vorgaben sollte es erlauben eine Route zu finden.
 $$ROUTER-RESULTS-HELP$$
 
 $$ROUTER-VISUALISER-INFO$$
-Die Anzeige der Daten kann auf verschiedene Weise angepasst werden.	
+Die Anzeige der Daten kann auf verschiedene Weise angepasst werden.
 $$ROUTER-VISUALISER-INFO$$
 
 #
 # Multi-line descriptive translations (visualiser)
 #
+
diff --git a/web/translations/translation.en.txt b/web/translations/translation.en.txt
index a3bcb84..ad75945 100644
--- a/web/translations/translation.en.txt
+++ b/web/translations/translation.en.txt
@@ -1,14 +1,98 @@
 #
-# English language web-page translation phrases
+# English language translation phrases
 #
 
-@@LANGUAGE@@	English
-@@LANGUAGE-WEBPAGE@@	English language webpage
+#
+# Router output XML definition
+#
+
+%%copyright_creator_string%%	Creator
+%%copyright_source_string%%	Source
+%%copyright_source_text%%	Based on OpenStreetMap data from http://www.openstreetmap.org/
+%%copyright_license_string%%	License
+
+%%turn_-4%%	Very sharp left
+%%turn_-3%%	Sharp left
+%%turn_-2%%	Left
+%%turn_-1%%	Slight left
+%%turn_0%%	Straight on
+%%turn_1%%	Slight right
+%%turn_2%%	Right
+%%turn_3%%	Sharp right
+%%turn_4%%	Very sharp right
+
+%%heading_-4%%	South
+%%heading_-3%%	South-West
+%%heading_-2%%	West
+%%heading_-1%%	North-West
+%%heading_0%%	North
+%%heading_1%%	North-East
+%%heading_2%%	East
+%%heading_3%%	South-East
+%%heading_4%%	South
+
+%%ordinal_1%%	First
+%%ordinal_2%%	Second
+%%ordinal_3%%	Third
+%%ordinal_4%%	Fourth
+%%ordinal_5%%	Fifth
+%%ordinal_6%%	Sixth
+%%ordinal_7%%	Seventh
+%%ordinal_8%%	Eighth
+%%ordinal_9%%	Ninth
+%%ordinal_10%%	Tenth
+
+%%highway_motorway%%	motorway
+%%highway_trunk%%	trunk road
+%%highway_primary%%	primary road
+%%highway_secondary%%	secondary road
+%%highway_tertiary%%	tertiary road
+%%highway_unclassified%%	unclassified road
+%%highway_residential%%	residential road
+%%highway_service%%	service road
+%%highway_track%%	track
+%%highway_cycleway%%	cycleway
+%%highway_path%%	path
+%%highway_steps%%	steps
+%%highway_ferry%%	ferry
+
+%%route_shortest%%	Shortest
+%%route_quickest%%	Quickest
+
+%%output-html_waypoint_waypoint%%	Waypoint
+%%output-html_waypoint_junction%%	Junction
+%%output-html_waypoint_roundabout%%	Roundabout
+%%output-html_title%%	%s Route
+%%output-html_start_string%%	Start
+%%output-html_start_text%%	At %s, head %s
+%%output-html_node_string%%	At
+%%output-html_node_text%%	%s, go %s heading %s
+%%output-html_rbnode_string%%	Leave
+%%output-html_rbnode_text%%	%s, take the %s exit heading %s
+%%output-html_segment_string%%	Follow
+%%output-html_segment_text%%	%s for %.3f km, %.1f min
+%%output-html_stop_string%%	Stop
+%%output-html_stop_text%%	At %s
+%%output-html_total_string%%	Total
+%%output-html_total_text%%	%.1f km, %.0f minutes
+
+%%output-gpx_waypoint_start%%	START
+%%output-gpx_waypoint_inter%%	INTER
+%%output-gpx_waypoint_trip%%	TRIP
+%%output-gpx_waypoint_finish%%	FINISH
+
+%%output-gpx_desc%%	%s route between 'start' and 'finish' waypoints
+%%output-gpx_name%%	%s route
+%%output-gpx_step%%	%s on '%s' for %.3f km, %.1f min
+%%output-gpx_final%%	Total Journey %.1f km, %.0f minutes
 
 #
 # Router (and some shared) translations
 #
 
+@@LANGUAGE@@	English
+@@LANGUAGE-WEBPAGE@@	English language webpage
+
 @@ROUTER-TITLE@@	Route Planner for OpenStreetMap Data
 
 @@OPTION-TAB@@	Options
@@ -92,7 +176,6 @@
 @@PROPERTY-TUNNEL@@	Tunnel
 @@PROPERTY-WALKINGROUTE@@	Walking Route
 @@PROPERTY-BICYCLEROUTE@@	Bicycle Route
-@@PROPERTY-CYCLE-BOTHWAYS@@	Cycle Both Ways
 
 @@RESTRICT-ONEWAY@@	Obey oneway streets
 @@RESTRICT-TURNS@@	Obey turn restrictions
@@ -143,7 +226,7 @@
 @@VISUALISER-FAILED@@	Failed to get visualiser data!
 @@VISUALISER-NUM-JUNCTIONS@@	Processed # junctions
 @@VISUALISER-NUM-SUPER@@	Processed # super-nodes/segments
-@@VISUALISER-NUM-ONEWAY@@	Processed # oneway segments
+@@VISUALISER-NUM-WAYTYPE@@	Processed # way type segments
 @@VISUALISER-NUM-SEGMENTS@@	Processed # segments
 @@VISUALISER-NUM-NODES@@	Processed # nodes
 @@VISUALISER-NUM-TURNS@@	Processed # turn restrictions
@@ -154,7 +237,7 @@
 $$JUNCTIONS-INFO$$
 Each node that is a dead-end, a junction of two highways of different
 types (or different properties) or a junction where more than two segments
-join are shown colour-coded:
+join are shown colour-coded.
 $$JUNCTIONS-INFO$$
 @@JUNCTIONS-1@@	only one highway - a dead-end.
 @@JUNCTIONS-2@@	two highways of different types meet.
@@ -170,12 +253,16 @@ Each super-node and the associated super-segments are shown (see
 algorithm page for description).
 $$SUPER-INFO$$
 
-@@ONEWAY-BUTTON@@	Display One-way Segments
-$$ONEWAY-INFO$$
-Each one-way segment is shown with a coloured triangle indicating the
-allowed direction.  The colours of the triangles depend on the bearing
-of the highway segment.
-$$ONEWAY-INFO$$
+@@WAYTYPE-BUTTON@@	Display Way Type Segments
+$$WAYTYPE-INFO$$
+Each highway segment of special types (one-way, cycle-both-ways and roundabout) are
+shown.  For one-way segments a coloured triangle indicates the allowed direction.
+The colours of the triangles depend on the bearing of the highway segment.
+$$WAYTYPE-INFO$$
+
+@@WAYTYPE-ONEWAY@@	One-way segments
+@@WAYTYPE-CYCLE-BOTH-WAYS@@	Cycle-both-way segments
+@@WAYTYPE-ROUNDABOUT@@	Roundabout segments
 
 @@HIGHWAY-BUTTON@@	Display Highway Segments
 $$HIGHWAY-INFO$$
diff --git a/web/translations/translation.fr.txt b/web/translations/translation.fr.txt
index f19e530..b04ab4b 100644
--- a/web/translations/translation.fr.txt
+++ b/web/translations/translation.fr.txt
@@ -1,14 +1,98 @@
 #
-# French language web-page translation phrases
+# French language translation phrases
 #
 
-@@LANGUAGE@@	Francais
-@@LANGUAGE-WEBPAGE@@	Francais
+#
+# Router output XML definition
+#
+
+%%copyright_creator_string%%	Créateur
+%%copyright_source_string%%	Source
+%%copyright_source_text%%	Basé sur les données OpenStreetMap de http://www.openstreetmap.org/
+%%copyright_license_string%%	License
+
+%%turn_-4%%	demi-tour à gauche
+%%turn_-3%%	Très à gauche
+%%turn_-2%%	à gauche
+%%turn_-1%%	Légèrement à gauche
+%%turn_0%%	Tout droit
+%%turn_1%%	légèrement à droite
+%%turn_2%%	à droite
+%%turn_3%%	très à droite
+%%turn_4%%	demi-tour à droite
+
+%%heading_-4%%	Sud
+%%heading_-3%%	Dud-Ouest
+%%heading_-2%%	Ouest
+%%heading_-1%%	Nord-Ouest
+%%heading_0%%	Nord
+%%heading_1%%	Nord-Est
+%%heading_2%%	Est
+%%heading_3%%	Sud-Est
+%%heading_4%%	Sud
+
+%%ordinal_1%%	Premier
+%%ordinal_2%%	Second
+%%ordinal_3%%	Troisième
+%%ordinal_4%%	Quatrième
+%%ordinal_5%%	Cinquième
+%%ordinal_6%%	Sixième
+%%ordinal_7%%	Septième
+%%ordinal_8%%	huitième
+%%ordinal_9%%	Neuvième
+%%ordinal_10%%	Dixième
+
+%%highway_motorway%%	autoroute
+%%highway_trunk%%	route de jonction
+%%highway_primary%%	route nationale
+%%highway_secondary%%	route départementale
+%%highway_tertiary%%	route locale
+%%highway_unclassified%%	route non classifiée
+%%highway_residential%%	rue résidentielle
+%%highway_service%%	rue de service
+%%highway_track%%	chemin
+%%highway_cycleway%%	voie cyclable
+%%highway_path%%	sentier
+%%highway_steps%%	escalier
+%%highway_ferry%%	ferry
+
+%%route_shortest%%	le plus court
+%%route_quickest%%	le plus rapide
+
+%%output-html_waypoint_waypoint%%	Etape
+%%output-html_waypoint_junction%%	Croisement
+%%output-html_waypoint_roundabout%%	rond-point
+%%output-html_title%%	Itinéraire %s
+%%output-html_start_string%%	Débute
+%%output-html_start_text%%	à %s, direction %s
+%%output-html_node_string%%	à
+%%output-html_node_text%%	%s, aller %s direction %s
+%%output-html_rbnode_string%%	Quitter
+%%output-html_rbnode_text%%	%s, prendre le %s sortir direction %s
+%%output-html_segment_string%%	Suivre
+%%output-html_segment_text%%	%s pendant %.3f km, %.1f min
+%%output-html_stop_string%%	S'arrêter
+%%output-html_stop_text%%	à %s
+%%output-html_total_string%%	Total
+%%output-html_total_text%%	%.1f km, %.0f minutes
+
+%%output-gpx_waypoint_start%%	DEBUT
+%%output-gpx_waypoint_inter%%	INTER
+%%output-gpx_waypoint_trip%%	POINT
+%%output-gpx_waypoint_finish%%	FINAL
+
+%%output-gpx_desc%%	Itinéraire %s entre les étapes 'début' et 'fin'
+%%output-gpx_name%%	Itinéraire %s
+%%output-gpx_step%%	%s sur '%s' pendant %.3f km, %.1f min
+%%output-gpx_final%%	Trajet total %.1f km, %.0f minutes
 
 #
 # Router (and some shared) translations
 #
 
+@@LANGUAGE@@	Francais
+@@LANGUAGE-WEBPAGE@@	Francais
+
 @@ROUTER-TITLE@@	Calculateur d'itinéraire pour OpenStreetMap
 
 @@OPTION-TAB@@	Options
@@ -22,7 +106,6 @@
 
 @@ROUTINO-ROUTER@@	Itinéraires pour Openstreetmap Routino
 @@ROUTINO-WEBSITE@@	site web Routino
-
 @@DOCUMENTATION@@	Documentation
 
 @@LANGUAGE-BOX@@	Langue
@@ -56,10 +139,10 @@
 @@WAYPOINT-CENTRE2@@	Centrer cette étape sur la carte
 @@WAYPOINT-DOWN@@	Placer cette étape après
 @@WAYPOINT-REMOVE@@	supprimer cette étape
-@@WAYPOINT-REVERSE-BUTTON@@	Inverser l'ordre
 @@WAYPOINT-REVERSE@@	Inverser l'ordre des étapes
-@@WAYPOINT-LOOP-BUTTON@@	Faire une boucle
+@@WAYPOINT-REVERSE-BUTTON@@	Inverser l'ordre
 @@WAYPOINT-LOOP@@	Ajouter une nouvelle étape pour faire une boucle
+@@WAYPOINT-LOOP-BUTTON@@	Faire une boucle
 
 @@TRANSPORT-FOOT@@	À pied
 @@TRANSPORT-HORSE@@	À cheval
@@ -145,11 +228,11 @@ $$ROUTER-OPTIONS-HELP$$
 <b>Aide simplifiée</b>
 <br>
 Cliquer sur les icones de balises (ci-dessus) pour les placer sur la carte (droite).  Puis
-les déplacer à la position choisie. Il sera sûrement plus facile de zoomer sur la carte 
+les déplacer à la position choisie. Il sera sûrement plus facile de zoomer sur la carte
 avant de placer les balises.  Autre solution, taper la latitude et
 la longitude dans les cases ci-dessus.
 <p>
-Selectionner le mode de déplacement, les types de voies autorisées, les limitations de vitesse, 
+Selectionner le mode de déplacement, les types de voies autorisées, les limitations de vitesse,
 les propriétés des voies et les autres restrictions dans les options ci-dessus.
 Selectionner "Le plus court" ou "Le plus rapide" pour calculer l'itinéraire et le visualiser
 sur la carte.
@@ -169,7 +252,7 @@ les autres paramètres.
 <p>
 <b>Préferences des voies</b>
 <br>
-La préférence de voies est définie par un pourcentage et des itinéraires sont choisis 
+La préférence de voies est définie par un pourcentage et des itinéraires sont choisis
 qui essaient de suivre les voies préferrées.
 Par exemple, si une voie "Primaire" a une préférence de "110%" et une voie "Secondaire"
 une préférence de "100%", alors cela signifie qu'un itinéraire sur une voie primaire
@@ -185,8 +268,8 @@ voie n'a pas d'autre limite de vitesse définie ou si celle-ci est supérieure 
 La préférence de propriété est définie par un pourcentage et des itinéraires sont choisis
 qui essaient de suivre les voies ayant cette propriété préférée.
 Par exemple, si une voie goudronnée a une préférence de "75%", alors cela signifie que
-une voie non goudronnée obtient automatiquement une préférence de "25%" ce qui fait que 
-un itinéraire sur une voie goudronnée peut avoir 3 fois la longueur d'une non goudronnée 
+une voie non goudronnée obtient automatiquement une préférence de "25%" ce qui fait que
+un itinéraire sur une voie goudronnée peut avoir 3 fois la longueur d'une non goudronnée
 et être sélectionnée.
 <p>
 <b>Autres restrictions</b>
@@ -207,14 +290,14 @@ visualiser la description de l'itinéraire et zoomer sur des tronçons sélectio
 <br>
 Si le calculateur aboutie à une erreur, la cause la plus probable est que
 il n'est pas possible de trouver un itinéraire entre les points sélectionnés.
-Por permettre de trouver un itinéraire, déplacer une ou des balises 
+Por permettre de trouver un itinéraire, déplacer une ou des balises
 ou changer les options de recherche.
 <p>
 <b>Formats d'affichage</b>
 <br>
 <dl>
   <dt>Instructions HTML
-  <dd>une description de l'itinéraire à prendre 
+  <dd>une description de l'itinéraire à prendre
     à chaque intersection importante.
   <dt>Fichier chemin GPX
   <dd>La même information qui est affichée sur la carte avec des points
@@ -223,7 +306,7 @@ ou changer les options de recherche.
   <dd>La même information qui est affichée en texte pour l'itinéraire
     avec une étape pour chaque intersection importante.
   <dt>Fichier texte complet
-  <dd>Une liste de tous les noeuds traversés ainsi que la distance 
+  <dd>Une liste de tous les noeuds traversés ainsi que la distance
     entre eux et la distance cumulée pour chaque étape de l'itinéraire.
   <dt>Fichier texte
   <dd>La même information qui est affichée en texte pour l'itinéraire.
@@ -238,3 +321,4 @@ $$ROUTER-VISUALISER-INFO$$
 #
 # Multi-line descriptive translations (visualiser)
 #
+
diff --git a/web/translations/translation.nl.txt b/web/translations/translation.nl.txt
index bf9e70e..cfc537a 100644
--- a/web/translations/translation.nl.txt
+++ b/web/translations/translation.nl.txt
@@ -1,14 +1,98 @@
 #
-# Dutch language web-page translation phrases
+# Dutch language translation phrases
 #
 
-@@LANGUAGE@@	Nederlands
-@@LANGUAGE-WEBPAGE@@	Nederlandse web pagina
+#
+# Router output XML definition
+#
+
+%%copyright_creator_string%%	Creator
+%%copyright_source_string%%	Source
+%%copyright_source_text%%	Gebouwd op OpenStreetMap data van http://www.openstreetmap.org/
+%%copyright_license_string%%	License
+
+%%turn_-4%%	Haarspeld naar links
+%%turn_-3%%	Scherp links
+%%turn_-2%%	Links
+%%turn_-1%%	Half links
+%%turn_0%%	Rechtdoor
+%%turn_1%%	Half rechts
+%%turn_2%%	Rechts
+%%turn_3%%	Scherp rechts
+%%turn_4%%	Haarspeld naar rechts
+
+%%heading_-4%%	Zuid
+%%heading_-3%%	Zuid-West
+%%heading_-2%%	West
+%%heading_-1%%	Noord-West
+%%heading_0%%	Noord
+%%heading_1%%	Noord-Oost
+%%heading_2%%	Oost
+%%heading_3%%	Zuid-Oost
+%%heading_4%%	Zuid
+
+%%ordinal_1%%	Eerste
+%%ordinal_2%%	Tweede
+%%ordinal_3%%	Derde
+%%ordinal_4%%	Vierde
+%%ordinal_5%%	Vijfde
+%%ordinal_6%%	Zesde
+%%ordinal_7%%	Zevende
+%%ordinal_8%%	Achtste
+%%ordinal_9%%	Negende
+%%ordinal_10%%	Tiende
+
+%%highway_motorway%%	Autostrade
+%%highway_trunk%%	Autoweg
+%%highway_primary%%	Provinciale weg
+%%highway_secondary%%	Nationale weg
+%%highway_tertiary%%	Doorgangsweg
+%%highway_unclassified%%	Niet geclassificeerd
+%%highway_residential%%	Woongebied
+%%highway_service%%	Toegangsweg
+%%highway_track%%	Veldweg
+%%highway_cycleway%%	Fietspad
+%%highway_path%%	Pad
+%%highway_steps%%	Trap
+%%highway_ferry%%	Veerboot
+
+%%route_shortest%%	Kortste
+%%route_quickest%%	Snelste
+
+%%output-html_waypoint_waypoint%%	Punt
+%%output-html_waypoint_junction%%	de splitsing
+%%output-html_waypoint_roundabout%%	rotonde
+%%output-html_title%%	%s Route
+%%output-html_start_string%%	Start
+%%output-html_start_text%%	Bij %s neemt u de richting %s
+%%output-html_node_string%%	Bij
+%%output-html_node_text%%	Bij %s gaat u %s richting %s
+%%output-html_rbnode_string%%	Leave
+%%output-html_rbnode_text%%	Aan de %s, neem de %s afslag richting %s
+%%output-html_segment_string%%	Volg
+%%output-html_segment_text%%	Volgt u de %s voor %.3f km %.1f min
+%%output-html_stop_string%%	Stop
+%%output-html_stop_text%%	U bent bij  %s aangekomen
+%%output-html_total_string%%	Totaal
+%%output-html_total_text%%	%.1f km, %.0f minuten
+
+%%output-gpx_waypoint_start%%	START
+%%output-gpx_waypoint_inter%%	INTER
+%%output-gpx_waypoint_trip%%	TRIP
+%%output-gpx_waypoint_finish%%	FINISH
+
+%%output-gpx_desc%%	%s Route tussen 'Start' und 'Finish'
+%%output-gpx_name%%	%s Route
+%%output-gpx_step%%	%s op '%s' voor %.3f km, %.1f min
+%%output-gpx_final%%	Totaal trip  %.1f km, %.0f minuten
 
 #
 # Router (and some shared) translations
 #
 
+@@LANGUAGE@@	Nederlands
+@@LANGUAGE-WEBPAGE@@	Nederlandse web pagina
+
 @@OPTION-TAB@@	Opties
 
 @@RESULTS-TAB@@	Resultaten
@@ -111,12 +195,12 @@ $$ROUTER-OPTIONS-HELP$$
 <b>Quick Start</b>
 <br>
 Click op marker-icoontje (Waypoints) om ze op de map te plaatsen (rechts).
-Sleep ze vervolgens naar de gewenste positie. 
-Het is best om eerst naar straat niveau te zoomen op de kaart. 
+Sleep ze vervolgens naar de gewenste positie.
+Het is best om eerst naar straat niveau te zoomen op de kaart.
 Selecteer het transport type, toegestane weg-types,
 snelheidslimieten, wegeigenschappen en andere restricties uit de
 opties.
-Selecteer  "Kortste" of "Snelste" om de route te berekenen en te tekenen op de map. 
+Selecteer  "Kortste" of "Snelste" om de route te berekenen en te tekenen op de map.
 <p>
 <b>Coordinaten (Waypoints)</b>
 <br>
@@ -133,7 +217,7 @@ Deze percentages kunnen ook nog eens manueel aangepast worden.
 <p>
 <b>Voorkeur Wegtype</b>
 <br>
-De voorkeur voor een bepaald type weg wordt uitgedrukt in een percentage.  
+De voorkeur voor een bepaald type weg wordt uitgedrukt in een percentage.
 Bijvoorbeeld wanneer u het Transport Type "Fiets" kiest, dan zal er
 voor Autostrade 0% staan, en voor Fietspad 100%.
 Wanneer u Autowegen, Nationale wegen wil vermijden of beperken bij
@@ -204,3 +288,4 @@ $$ROUTER-VISUALISER-INFO$$
 #
 # Multi-line descriptive translations (visualiser)
 #
+
diff --git a/web/translations/translation.ru.txt b/web/translations/translation.ru.txt
new file mode 100644
index 0000000..4cf4fbf
--- /dev/null
+++ b/web/translations/translation.ru.txt
@@ -0,0 +1,168 @@
+#
+# Russian language translation phrases
+#
+
+#
+# Router output XML definition
+#
+
+%%copyright_creator_string%%	Автор
+%%copyright_source_string%%	Источник
+%%copyright_source_text%%	Использованы данные OpenStreetMap http://www.openstreetmap.org/
+%%copyright_license_string%%	Лицензия
+
+%%turn_-4%%	очень крутой поворот налево
+%%turn_-3%%	крутой поворот налево
+%%turn_-2%%	налево
+%%turn_-1%%	плавно налево
+%%turn_0%%	прямо
+%%turn_1%%	плавно направо
+%%turn_2%%	направо
+%%turn_3%%	крутой поворот направо
+%%turn_4%%	очень крутой поворот направо
+
+%%heading_-4%%	юг
+%%heading_-3%%	юго-запад
+%%heading_-2%%	запад
+%%heading_-1%%	северо-запад
+%%heading_0%%	север
+%%heading_1%%	северо-восток
+%%heading_2%%	восток
+%%heading_3%%	юго-восток
+%%heading_4%%	юг
+
+%%ordinal_1%%	Первый
+%%ordinal_2%%	Второй
+%%ordinal_3%%	Третий
+%%ordinal_4%%	Четвертый
+%%ordinal_5%%	Пятый
+%%ordinal_6%%	Шестой
+%%ordinal_7%%	Седьмой
+%%ordinal_8%%	Восьмой
+%%ordinal_9%%	Девятый
+%%ordinal_10%%	Десятый
+
+%%highway_motorway%%	автомагистраль
+%%highway_trunk%%	международная трасса
+%%highway_primary%%	дорога регионального значения
+%%highway_secondary%%	дорога областного значения
+%%highway_tertiary%%	дорога районного значения
+%%highway_unclassified%%	дорога местного значения
+%%highway_residential%%	улица
+%%highway_service%%	проезд
+%%highway_track%%	дорога с/х назначения
+%%highway_cycleway%%	велодорожка
+%%highway_path%%	тропинка
+%%highway_steps%%	лестница
+%%highway_ferry%%	паром
+
+%%route_shortest%%	Короткий
+%%route_quickest%%	Быстрый
+
+%%output-html_waypoint_waypoint%%	путевая точка
+%%output-html_waypoint_junction%%	перекрестке
+%%output-html_title%%	%s маршрут
+%%output-html_start_string%%	Старт
+%%output-html_start_text%%	 %s, на %s
+%%output-html_node_string%%	на
+%%output-html_node_text%%	%s, %s,  на %s
+%%output-html_rbnode_string%%	Покинуть
+%%output-html_segment_string%%	Следуйте
+%%output-html_segment_text%%	по %s %.3f км, %.1f мин
+%%output-html_stop_string%%	Стоп
+%%output-html_stop_text%%	 %s
+%%output-html_total_string%%	Всего
+%%output-html_total_text%%	%.1f км, %.0f минут
+
+%%output-gpx_waypoint_start%%	Старт
+%%output-gpx_waypoint_inter%%	INTER
+%%output-gpx_waypoint_trip%%	TRIP
+%%output-gpx_waypoint_finish%%	Финиш
+
+%%output-gpx_desc%%	%s маршрут от 'Старта' до 'Финиша'
+%%output-gpx_name%%	%s маршрут
+%%output-gpx_step%%	на %s по '%s' %.3f км, %.1f мин
+%%output-gpx_final%%	Всего - %.1f км, продолжительность - %.0f минут
+
+#
+# Router (and some shared) translations
+#
+
+@@LANGUAGE@@	Русский
+@@LANGUAGE-WEBPAGE@@	Русский
+
+@@OPTION-TAB-HELP@@	Задать настройки маршрутизации
+
+@@DOCUMENTATION@@	Документация
+
+@@LANGUAGE-BOX@@	Язык
+@@TRANSPORT-TYPE-BOX@@	Тип транспорта
+@@SPEED-LIMITS-BOX@@	Ограничения скорости
+@@OTHER-RESTRICTIONS-BOX@@	Другие ограничения
+@@HELP-BOX@@	Помощь
+
+@@STATUS-BOX@@	Статус
+@@SHORTEST-ROUTE@@	Кратчайший маршрут
+@@QUICKEST-ROUTE@@	Быстрейший маршрут
+
+@@TRANSPORT-HORSE@@	Лошадь
+@@TRANSPORT-WHEELCHAIR@@	Инвалидное кресло
+@@TRANSPORT-BICYCLE@@	Велосипед
+@@TRANSPORT-MOPED@@	Мопед
+@@TRANSPORT-MOTORCYCLE@@	Мотоцикл
+@@TRANSPORT-GOODS@@	Товары
+
+@@HIGHWAY-MOTORWAY@@	Автомагистраль
+
+@@PROPERTY-BRIDGE@@	Мост
+@@PROPERTY-TUNNEL@@	Туннель
+@@PROPERTY-WALKINGROUTE@@	Пеший маршрут
+@@PROPERTY-BICYCLEROUTE@@	Велодорожка
+
+@@RESTRICT-ONEWAY@@	Односторонняя улица
+@@RESTRICT-WEIGHT@@	Вес
+@@RESTRICT-HEIGHT@@	Высота
+@@RESTRICT-WIDTH@@	Ширина
+@@RESTRICT-LENGTH@@	Длина
+
+@@FIND-SHORTEST-ROUTE@@	Найти кратчайший маршрут
+@@FIND-QUICKEST-ROUTE@@	Найти быстрейший маршут
+
+@@TILES@@	Тайлы
+
+#
+# Visualiser specific translations
+#
+
+@@INSTRUCTIONS-BOX@@	Инструкции
+
+@@NO-DATA-DISPLAYED@@	Нет данных для отображения
+
+@@VISUALISER-NUM-NODES@@	Обработано # нод
+@@VISUALISER-NUM-TURNS@@	Обработано # ограничений поворотов
+
+@@TURNS-BUTTON@@	Показывать ограничения поворотов
+
+@@SPEED-BUTTON@@	Показывать ограничения скорости
+
+@@LIMIT-CHANGE@@	Изменить ограничения
+@@SPEED-LIMIT-80@@	Ограничение скорости 80 км/ч
+
+@@WEIGHT-BUTTON@@	Показывать ограничения по весу
+
+@@WEIGHT-LIMIT-8@@	Ограничение веса 8 тонн
+
+@@HEIGHT-BUTTON@@	Показывать ограничение по высоте
+
+@@HEIGHT-LIMIT-4@@	Ограничение высоты 4.0 метра
+
+@@WIDTH-BUTTON@@	Показывать ограничение ширины
+
+#
+# Multi-line descriptive translations (router)
+#
+
+#
+# Multi-line descriptive translations (visualiser)
+#
+
diff --git a/web/translations/translations-body.xml b/web/translations/translations-body.xml
new file mode 100644
index 0000000..7e0c153
--- /dev/null
+++ b/web/translations/translations-body.xml
@@ -0,0 +1,93 @@
+  <language lang="~~lang~~">
+
+    <!-- Copyright of the data being routed, not of this file  -->
+    <copyright>
+      <creator string="%%copyright_creator_string%%" text="Routino - http://www.routino.org/" />
+      <source  string="%%copyright_source_string%%" text="%%copyright_source_text%%" />
+      <license string="%%copyright_license_string%%" text="http://www.openstreetmap.org/copyright" />
+    </copyright>
+
+    <!-- Turn directions, 0 = ahead, -2 = left, +/-4 = behind, +2 = right -->
+    <turn direction="-4" string="%%turn_-4%%" />
+    <turn direction="-3" string="%%turn_-3%%" />
+    <turn direction="-2" string="%%turn_-2%%" />
+    <turn direction="-1" string="%%turn_-1%%" />
+    <turn direction="0"  string="%%turn_0%%" />
+    <turn direction="1"  string="%%turn_1%%" />
+    <turn direction="2"  string="%%turn_2%%" />
+    <turn direction="3"  string="%%turn_3%%" />
+    <turn direction="4"  string="%%turn_4%%" />
+
+    <!-- Heading directions, 0 = North, -2 = West, +/-4 = South, +2 = East -->
+    <heading direction="-4" string="%%heading_-4%%" />
+    <heading direction="-3" string="%%heading_-3%%" />
+    <heading direction="-2" string="%%heading_-2%%" />
+    <heading direction="-1" string="%%heading_-1%%" />
+    <heading direction="0"  string="%%heading_0%%" />
+    <heading direction="1"  string="%%heading_1%%" />
+    <heading direction="2"  string="%%heading_2%%" />
+    <heading direction="3"  string="%%heading_3%%" />
+    <heading direction="4"  string="%%heading_4%%" />
+
+    <!-- Ordinals, 1 = first, 2 = second ... -->
+    <ordinal number="1"  string="%%ordinal_1%%" />
+    <ordinal number="2"  string="%%ordinal_2%%" />
+    <ordinal number="3"  string="%%ordinal_3%%" />
+    <ordinal number="4"  string="%%ordinal_4%%" />
+    <ordinal number="5"  string="%%ordinal_5%%" />
+    <ordinal number="6"  string="%%ordinal_6%%" />
+    <ordinal number="7"  string="%%ordinal_7%%" />
+    <ordinal number="8"  string="%%ordinal_8%%" />
+    <ordinal number="9"  string="%%ordinal_9%%" />
+    <ordinal number="10" string="%%ordinal_10%%" />
+
+    <!-- Highway names -->
+    <highway type="motorway"     string="%%highway_motorway%%" />
+    <highway type="trunk"        string="%%highway_trunk%%" />
+    <highway type="primary"      string="%%highway_primary%%" />
+    <highway type="secondary"    string="%%highway_secondary%%" />
+    <highway type="tertiary"     string="%%highway_tertiary%%" />
+    <highway type="unclassified" string="%%highway_unclassified%%" />
+    <highway type="residential"  string="%%highway_residential%%" />
+    <highway type="service"      string="%%highway_service%%" />
+    <highway type="track"        string="%%highway_track%%" />
+    <highway type="cycleway"     string="%%highway_cycleway%%" />
+    <highway type="path"         string="%%highway_path%%" />
+    <highway type="steps"        string="%%highway_steps%%" />
+    <highway type="ferry"        string="%%highway_ferry%%" />
+
+    <!-- The type of route -->
+    <route type="shortest" string="%%route_shortest%%" /> <!-- For the description and route name -->
+    <route type="quickest" string="%%route_quickest%%" /> <!-- For the description and route name -->
+
+    <!-- HTML output -->
+    <output-html>
+      <waypoint type="waypoint"   string="%%output-html_waypoint_waypoint%%" /> <!-- For the chosen waypoints -->
+      <waypoint type="junction"   string="%%output-html_waypoint_junction%%" /> <!-- For the interesting junctions -->
+      <waypoint type="roundabout" string="%%output-html_waypoint_roundabout%%" /> <!-- For roundabouts -->
+
+      <title text="%%output-html_title%%" /> <!-- %s = [shortest|quickest] -->
+
+      <start   string="%%output-html_start_string%%" text="%%output-html_start_text%%" /> <!-- 1st %s = [waypoint|junction], 2nd %s = [heading] -->
+      <node    string="%%output-html_node_string%%" text="%%output-html_node_text%%" /> <!-- 1st %s = [waypoint|junction], 2nd %s = [turn], 3rd %s = [heading] -->
+      <rbnode  string="%%output-html_rbnode_string%%" text="%%output-html_rbnode_text%%" /> <!-- 1st %s = [roundabout], 2nd %s = [first|second|...], 3rd %s = [heading] -->
+      <segment string="%%output-html_segment_string%%" text="%%output-html_segment_text%%" /> <!-- 1st %s = street name -->
+      <stop    string="%%output-html_stop_string%%" text="%%output-html_stop_text%%" /> <!-- 1st %s = [waypoint|junction] -->
+      <total   string="%%output-html_total_string%%" text="%%output-html_total_text%%" />
+    </output-html>
+
+    <!-- GPX output -->
+    <output-gpx>
+      <waypoint type="start" string="%%output-gpx_waypoint_start%%" /> <!-- For the first route waypoint -->
+      <waypoint type="inter" string="%%output-gpx_waypoint_inter%%" /> <!-- For the intermediate route waypoints -->
+      <waypoint type="trip" string="%%output-gpx_waypoint_trip%%" /> <!-- For the other route points -->
+      <waypoint type="finish" string="%%output-gpx_waypoint_finish%%"/> <!-- For the last route waypoint -->
+
+      <desc  text="%%output-gpx_desc%%" /> <!-- %s = [shortest|quickest] -->
+      <name  text="%%output-gpx_name%%" /> <!-- %s = [shortest|quickest] -->
+      <step  text="%%output-gpx_step%%" /> <!-- 1st %s = [turn], 2nd %s = street name -->
+      <final text="%%output-gpx_final%%" />
+    </output-gpx>
+
+  </language>
+
diff --git a/web/translations/translations-head.xml b/web/translations/translations-head.xml
new file mode 100644
index 0000000..2c0e8d4
--- /dev/null
+++ b/web/translations/translations-head.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- ============================================================
+     An XML format file containing Routino output translations.
+
+     Part of the Routino routing software.
+     ============================================================
+     This file Copyright 2010-2014 Andrew M. Bishop
+
+     This program is free software: you can redistribute it and/or modify
+     it under the terms of the GNU Affero General Public License as published by
+     the Free Software Foundation, either version 3 of the License, or
+     (at your option) any later version.
+     ============================================================ -->
+
+<routino-translations xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                      xsi:noNamespaceSchemaLocation="http://www.routino.org/xml/routino-translations.xsd">
+
diff --git a/web/translations/translations-tail.xml b/web/translations/translations-tail.xml
new file mode 100644
index 0000000..7b07541
--- /dev/null
+++ b/web/translations/translations-tail.xml
@@ -0,0 +1 @@
+</routino-translations>
diff --git a/web/translations/visualiser.html b/web/translations/visualiser.html
index 299973b..8531e37 100644
--- a/web/translations/visualiser.html
+++ b/web/translations/visualiser.html
@@ -63,7 +63,7 @@
 
     <div class="hideshow_box">
       <span class="hideshow_title">@@VISUALISER-BOX@@</span>
-      @@VISUALISER-INFO@@
+      $$VISUALISER-INFO$$
       <div class="center">
         <a target="other" href="http://www.routino.org/">@@ROUTINO-WEBSITE@@</a>
         |
@@ -78,11 +78,11 @@
 
       <div id="hideshow_language_div" style="display: none;">
         <table>
-          $$LANGUAGES-META$$
+          **LANGUAGES-META**
           <tr>
-            <td><a id="lang_xx_url" href="visualiser.html.xx" title="@@LANGUAGE-WEBPAGE@@">@@LANGUAGE@@</a>
-            <td>(XX)
-          $$LANGUAGES-META$$
+            <td><a id="lang_~~lang~~_url" href="visualiser.html.~~lang~~" title="@@LANGUAGE-WEBPAGE@@">@@LANGUAGE@@</a>
+            <td>(~~LANG~~)
+          **LANGUAGES-META**
         </table>
         <a target="translation" href="http://www.routino.org/translations/">Routino Translations</a>
       </div>
@@ -90,7 +90,7 @@
 
     <div class="hideshow_box">
       <span class="hideshow_title">@@INSTRUCTIONS-BOX@@</span>
-      @@VISUALISER-INSTRUCTIONS@@
+      $$VISUALISER-INSTRUCTIONS$$
     </div>
 
     <div class="hideshow_box">
@@ -110,8 +110,8 @@
         <div id="result_status_super"     style="display: none;">
           <b>@@VISUALISER-NUM-SUPER@@</b>
         </div>
-        <div id="result_status_oneway"    style="display: none;">
-          <b>@@VISUALISER-NUM-ONEWAY@@</b>
+        <div id="result_status_waytype"   style="display: none;">
+          <b>@@VISUALISER-NUM-WAYTYPE@@</b>
         </div>
         <div id="result_status_highway"   style="display: none;">
           <b>@@VISUALISER-NUM-SEGMENTS@@</b>
@@ -142,7 +142,7 @@
       <span id="hideshow_junctions_hide" onclick="hideshow_hide('junctions');" class="hideshow_hide">-</span>
       <input type="button" id="junctions" onclick="displayData('junctions');" value="@@JUNCTIONS-BUTTON@@">
       <div id="hideshow_junctions_div" style="display: none;">
-        @@JUNCTIONS-INFO@@
+        $$JUNCTIONS-INFO$$
         <br>
         <table>
           <tr><td><img src="icons/ball-1.png" alt="1" ><td>@@JUNCTIONS-1@@
@@ -161,16 +161,23 @@
       <span id="hideshow_super_hide" onclick="hideshow_hide('super');" class="hideshow_hide">-</span>
       <input type="button" id="super" onclick="displayData('super');" value="@@SUPER-BUTTON@@">
       <div id="hideshow_super_div" style="display: none;">
-        @@SUPER-INFO@@
+        $$SUPER-INFO$$
       </div>
     </div>
 
     <div class="hideshow_box">
-      <span id="hideshow_oneway_show" onclick="hideshow_show('oneway');" class="hideshow_show">+</span>
-      <span id="hideshow_oneway_hide" onclick="hideshow_hide('oneway');" class="hideshow_hide">-</span>
-      <input type="button" id="oneway" onclick="displayData('oneway');" value="@@ONEWAY-BUTTON@@">
-      <div id="hideshow_oneway_div" style="display: none;">
-        @@ONEWAY-INFO@@
+      <span id="hideshow_waytype_show" onclick="hideshow_show('waytype');" class="hideshow_show">+</span>
+      <span id="hideshow_waytype_hide" onclick="hideshow_hide('waytype');" class="hideshow_hide">-</span>
+      <input type="button" id="waytype" onclick="displayData('waytype');" value="@@WAYTYPE-BUTTON@@">
+      <div id="hideshow_waytype_div" style="display: none;">
+        $$WAYTYPE-INFO$$
+        <form name="waytypes" id="waytypes" action="#" method="get" onsubmit="return false;">
+          <table>
+            <tr><td>@@WAYTYPE-ONEWAY@@:         <td><input name="waytype" type="radio" value="oneway"        onchange="displayData('waytype');" checked>
+            <tr><td>@@WAYTYPE-CYCLE-BOTH-WAYS@@:<td><input name="waytype" type="radio" value="cyclebothways" onchange="displayData('waytype');">
+            <tr><td>@@WAYTYPE-ROUNDABOUT@@:     <td><input name="waytype" type="radio" value="roundabout"    onchange="displayData('waytype');">
+          </table>
+        </form>
       </div>
     </div>
 
@@ -179,7 +186,7 @@
       <span id="hideshow_highway_hide" onclick="hideshow_hide('highway');" class="hideshow_hide">-</span>
       <input type="button" id="highway" onclick="displayData('highway');" value="@@HIGHWAY-BUTTON@@">
       <div id="hideshow_highway_div" style="display: none;">
-        @@HIGHWAY-INFO@@
+        $$HIGHWAY-INFO$$
         <form name="highways" id="highways" action="#" method="get" onsubmit="return false;">
           <table>
             <tr><td>@@HIGHWAY-MOTORWAY@@:    <td><input name="highway" type="radio" value="motorway"     onchange="displayData('highway');">
@@ -205,7 +212,7 @@
       <span id="hideshow_transport_hide" onclick="hideshow_hide('transport');" class="hideshow_hide">-</span>
       <input type="button" id="transport" onclick="displayData('transport');" value="@@TRANSPORT-BUTTON@@">
       <div id="hideshow_transport_div" style="display: none;">
-        @@TRANSPORT-INFO@@
+        $$TRANSPORT-INFO$$
         <form name="transports" id="transports" action="#" method="get" onsubmit="return false;">
           <table>
             <tr><td>@@TRANSPORT-FOOT@@:      <td><input name="transport" type="radio" value="foot"       onchange="displayData('transport');">
@@ -228,7 +235,7 @@
       <span id="hideshow_barrier_hide" onclick="hideshow_hide('barrier');" class="hideshow_hide">-</span>
       <input type="button" id="barrier" onclick="displayData('barrier');" value="@@BARRIER-BUTTON@@">
       <div id="hideshow_barrier_div" style="display: none;">
-        @@BARRIER-INFO@@
+        $$BARRIER-INFO$$
         <form name="barriers" id="barriers" action="#" method="get" onsubmit="return false;">
           <table>
             <tr><td>@@TRANSPORT-FOOT@@:      <td><input name="barrier" type="radio" value="foot"       onchange="displayData('barrier');">
@@ -251,7 +258,7 @@
       <span id="hideshow_turns_hide" onclick="hideshow_hide('turns');" class="hideshow_hide">-</span>
       <input type="button" id="turns" onclick="displayData('turns');" value="@@TURNS-BUTTON@@">
       <div id="hideshow_turns_div" style="display: none;">
-        @@TURNS-INFO@@
+        $$TURNS-INFO$$
       </div>
     </div>
 
@@ -260,7 +267,7 @@
       <span id="hideshow_speed_hide" onclick="hideshow_hide('speed');" class="hideshow_hide">-</span>
       <input type="button" id="speed" onclick="displayData('speed');" value="@@SPEED-BUTTON@@">
       <div id="hideshow_speed_div" style="display: none;">
-        @@SPEED-INFO@@
+        $$SPEED-INFO$$
         <br>
         <table>
           <tr><td><img src="icons/ball-1.png"   alt="."   ><td>@@LIMIT-CHANGE@@
@@ -275,7 +282,7 @@
       <span id="hideshow_weight_hide" onclick="hideshow_hide('weight');" class="hideshow_hide">-</span>
       <input type="button" id="weight" onclick="displayData('weight');" value="@@WEIGHT-BUTTON@@">
       <div id="hideshow_weight_div" style="display: none;">
-        @@WEIGHT-INFO@@
+        $$WEIGHT-INFO$$
         <br>
         <table>
           <tr><td><img src="icons/ball-1.png"    alt="."    ><td>@@LIMIT-CHANGE@@
@@ -290,7 +297,7 @@
       <span id="hideshow_height_hide" onclick="hideshow_hide('height');" class="hideshow_hide">-</span>
       <input type="button" id="height" onclick="displayData('height');" value="@@HEIGHT-BUTTON@@">
       <div id="hideshow_height_div" style="display: none;">
-        @@HEIGHT-INFO@@
+        $$HEIGHT-INFO$$
         <br>
         <table>
           <tr><td><img src="icons/ball-1.png"    alt="."    ><td>@@LIMIT-CHANGE@@
@@ -305,7 +312,7 @@
       <span id="hideshow_width_hide" onclick="hideshow_hide('width');" class="hideshow_hide">-</span>
       <input type="button" id="width" onclick="displayData('width');" value="@@WIDTH-BUTTON@@">
       <div id="hideshow_width_div" style="display: none;">
-        @@WIDTH-INFO@@
+        $$WIDTH-INFO$$
         <br>
         <table>
           <tr><td><img src="icons/ball-1.png"    alt="."    ><td>@@LIMIT-CHANGE@@
@@ -320,7 +327,7 @@
       <span id="hideshow_length_hide" onclick="hideshow_hide('length');" class="hideshow_hide">-</span>
       <input type="button" id="length" onclick="displayData('length');" value="@@LENGTH-BUTTON@@">
       <div id="hideshow_length_div" style="display: none;">
-        @@LENGTH-INFO@@
+        $$LENGTH-INFO$$
         <br>
         <table>
           <tr><td><img src="icons/ball-1.png"    alt="."    ><td>@@LIMIT-CHANGE@@
@@ -335,7 +342,7 @@
       <span id="hideshow_property_hide" onclick="hideshow_hide('property');" class="hideshow_hide">-</span>
       <input type="button" id="property" onclick="displayData('property');" value="@@PROPERTY-BUTTON@@">
       <div id="hideshow_property_div" style="display: none;">
-        @@PROPERTY-INFO@@
+        $$PROPERTY-INFO$$
         <form name="properties" id="properties" action="#" method="get" onsubmit="return false;">
           <table>
             <tr><td>@@PROPERTY-PAVED@@:         <td><input name="property" type="radio" value="paved"         onchange="displayData('property');" checked>
@@ -344,7 +351,6 @@
             <tr><td>@@PROPERTY-TUNNEL@@:        <td><input name="property" type="radio" value="tunnel"        onchange="displayData('property');">
             <tr><td>@@PROPERTY-WALKINGROUTE@@:  <td><input name="property" type="radio" value="footroute"     onchange="displayData('property');">
             <tr><td>@@PROPERTY-BICYCLEROUTE@@:  <td><input name="property" type="radio" value="bicycleroute"  onchange="displayData('property');">
-            <tr><td>@@PROPERTY-CYCLE-BOTHWAYS@@:<td><input name="property" type="radio" value="cyclebothways" onchange="displayData('property');">
           </table>
         </form>
       </div>
@@ -355,7 +361,7 @@
       <span id="hideshow_errorlogs_hide" onclick="hideshow_hide('errorlogs');" class="hideshow_hide">-</span>
       <input type="button" id="errorlogs" onclick="displayData('errorlogs');" value="@@ERROR-LOG-BUTTON@@">
       <div id="hideshow_errorlogs_div" style="display: none;">
-        @@ERROR-LOG-INFO@@
+        $$ERROR-LOG-INFO$$
       </div>
     </div>
 
@@ -376,7 +382,7 @@
       <span class="hideshow_title">@@HELP-BOX@@</span>
       <div id="hideshow_help_options_div">
         <div class="scrollable">
-          @@VISUALISER-HELP@@
+          $$VISUALISER-HELP$$
         </div>
       </div>
     </div>
@@ -385,7 +391,7 @@
   <div class="tab_content" id="tab_router_div" style="display: none;">
     <div class="hideshow_box">
       <span class="hideshow_title">@@ROUTER-BOX@@</span>
-      @@VISUALISER-ROUTER-INFO@@
+      $$VISUALISER-ROUTER-INFO$$
       <br>
       <a id="router_url" href="router.html" target="router">@@MAP-VIEW-LINK@@</a>
     </div>
diff --git a/web/www/routino/router.css b/web/www/routino/router.css
index 71f9d45..4f8b9f4 100644
--- a/web/www/routino/router.css
+++ b/web/www/routino/router.css
@@ -3,7 +3,7 @@
 //
 // Part of the Routino routing software.
 //
-// This file Copyright 2008-2013 Andrew M. Bishop
+// This file Copyright 2008-2014 Andrew M. Bishop
 //
 // This program is free software: you can redistribute it and/or modify
 // it under the terms of the GNU Affero General Public License as published by
@@ -125,6 +125,18 @@ DIV#tab_options_div INPUT#shortest
  text-align: center;
 }
 
+DIV#tab_options_div INPUT#shortest:hover
+{
+ background: #F0F000;
+}
+
+DIV#tab_options_div INPUT[disabled]#shortest
+{
+ border-color: #004000;
+
+ background: #E0F0E0;
+}
+
 DIV#tab_options_div INPUT#quickest
 {
  margin: 3px;
@@ -137,6 +149,18 @@ DIV#tab_options_div INPUT#quickest
  text-align: center;
 }
 
+DIV#tab_options_div INPUT#quickest:hover
+{
+ background: #F0F000;
+}
+
+DIV#tab_options_div INPUT[disabled]#quickest
+{
+ border-color: #000040;
+
+ background: #E0E0F0;
+}
+
 DIV#tab_results_div TABLE
 {
  border-collapse: collapse;
diff --git a/web/www/routino/router.html.de b/web/www/routino/router.html.de
index 940187c..7288988 100644
--- a/web/www/routino/router.html.de
+++ b/web/www/routino/router.html.de
@@ -6,7 +6,7 @@
 <meta name="keywords" content="openstreetmap routing route planner">
 <meta name="viewport" content="width=device-width, height=device-height, initial-scale=1, user-scalable=no">
 
-<title>Routino : Routen Planer für OpenStreetMap Daten</title>
+<title>Routino : Routen Planer für OpenStreetMap Daten</title>
 
 <!--
 Routino router web page.
@@ -65,11 +65,11 @@ along with this program. If not, see http://www.gnu.org/licenses/.
 <div class="hideshow_box">
 <span class="hideshow_title">Routino OpenStreetMap Router</span>
 Diese Website erlaubt Routing mit den Daten, die OpenStreetMap gesammelt hat.
-Wähle Start- und Endpunkt (klicke auf die Marker-Symbole unten), wähle die Routing-Vorgaben und dann finde den Weg.
+Wähle Start- und Endpunkt (klicke auf die Marker-Symbole unten), wähle die Routing-Vorgaben und dann finde den Weg.
 <div class="center">
 <a target="other" href="http://www.routino.org/">Routino Website</a>
 |
-<a target="other" href="../documentation/">Dokumentation</a>
+<a target="other" href="documentation/">Dokumentation</a>
 </div>
 </div>
 
@@ -85,7 +85,7 @@ Wähle Start- und Endpunkt (klicke auf die Marker-Symbole unten), wähle
 <td>(EN)
 <td><input name="language" type="radio" value="en" onchange="formSetLanguage();" >
 <tr>
-<td><a id="lang_de_url" href="router.html.de" title="Deutsche Webseite">Deutsche</a>
+<td><a id="lang_de_url" href="router.html.de" title="Deutsche Webseite">Deutsch</a>
 <td>(DE)
 <td><input name="language" type="radio" value="de" onchange="formSetLanguage();" checked>
 <tr>
@@ -97,11 +97,11 @@ Wähle Start- und Endpunkt (klicke auf die Marker-Symbole unten), wähle
 <td>(NL)
 <td><input name="language" type="radio" value="nl" onchange="formSetLanguage();" >
 <tr>
-<td>
+<td><a id="lang_ru_url" href="router.html.ru" title="Русский">Русский</a>
 <td>(RU)
 <td><input name="language" type="radio" value="ru" onchange="formSetLanguage();" >
 </table>
-<a target="translation" href="../translations/">Routino Translations</a>
+<a target="translation" href="http://www.routino.org/translations/">Routino Translations</a>
 </div>
 </div>
 
@@ -128,23 +128,23 @@ Wähle Start- und Endpunkt (klicke auf die Marker-Symbole unten), wähle
 <input name="searchXXX" type="text" size="18" title="Waypoint XXX Location"> <!-- uses Javascript event for triggering -->
 </span>
 <td>
-<img alt="?" src="icons/waypoint-search.png" title="Search for location" onmousedown="markerSearch(XXX);" >
+<img alt="?" src="icons/waypoint-search.png" title="Nach Ort suchen" onmousedown="markerSearch(XXX);" >
 <img alt="G" src="icons/waypoint-locate.png" title="Get current location" onmousedown="markerLocate(XXX);" >
-<img alt="O" src="icons/waypoint-recentre.png" title="Centre map on this waypoint" onmousedown="markerRecentre(XXX);">
-<img alt="^" src="icons/waypoint-up.png" title="Move this waypoint up" onmousedown="markerMoveUp(XXX);" >
-<img alt="+" src="icons/waypoint-add.png" title="Add waypoint after this one" onmousedown="markerAddAfter(XXX);">
+<img alt="O" src="icons/waypoint-recentre.png" title="Karte auf Wegpunkt zentrieren" onmousedown="markerRecentre(XXX);">
+<img alt="^" src="icons/waypoint-up.png" title="wegpunkt nach oben verschieben" onmousedown="markerMoveUp(XXX);" >
+<img alt="+" src="icons/waypoint-add.png" title="Neuer Wegpunkt nach diesem" onmousedown="markerAddAfter(XXX);">
 <br>
-<img alt="#" src="icons/waypoint-coords.png" title="Coordinates for location" onmousedown="markerCoords(XXX);" >
+<img alt="#" src="icons/waypoint-coords.png" title="Koordinaten des Orts" onmousedown="markerCoords(XXX);" >
 <img alt="~" src="icons/waypoint-home.png" title="Toggle as home location" onmousedown="markerHome(XXX);" >
-<img alt="o" src="icons/waypoint-centre.png" title="Centre this waypoint on map" onmousedown="markerCentre(XXX);" >
-<img alt="v" src="icons/waypoint-down.png" title="Move this waypoint down" onmousedown="markerMoveDown(XXX);">
-<img alt="-" src="icons/waypoint-remove.png" title="Remove this waypoint" onmousedown="markerRemove(XXX);" >
+<img alt="o" src="icons/waypoint-centre.png" title="Wegpunkt auf Karte zentrieren" onmousedown="markerCentre(XXX);" >
+<img alt="v" src="icons/waypoint-down.png" title="Wegpunkt nach unten verschieben" onmousedown="markerMoveDown(XXX);">
+<img alt="-" src="icons/waypoint-remove.png" title="Wegpunkt entfernen" onmousedown="markerRemove(XXX);" >
 <tr id="searchresultsXXX" style="display: none;">
 <td colspan="3">
 <!-- The waypoints are inserted by the JavaScript, see the "maxmarkers" variable in router.js. -->
 <tr>
 <td colspan="3" class="center">
-<input type="button" title="Rückwärts" value="Rückwärts" onmousedown="markersReverse();">
+<input type="button" title="Rückwärts" value="Rückwärts" onmousedown="markersReverse();">
 <input type="button" title="Add a new waypoint to make a loop" value="Close loop" onmousedown="markersLoop();">
 </table>
 </div>
@@ -156,7 +156,7 @@ Wähle Start- und Endpunkt (klicke auf die Marker-Symbole unten), wähle
 <span class="hideshow_title">Fortbewegungsart</span>
 <div id="hideshow_transport_div">
 <table>
-<tr><td>Fußgänger: <td><input name="transport" type="radio" value="foot" onchange="formSetTransport('foot' );">
+<tr><td>Fußgänger: <td><input name="transport" type="radio" value="foot" onchange="formSetTransport('foot' );">
 <tr><td>Reiter: <td><input name="transport" type="radio" value="horse" onchange="formSetTransport('horse' );">
 <tr><td>Rollstuhl:<td><input name="transport" type="radio" value="wheelchair" onchange="formSetTransport('wheelchair');">
 <tr><td>Fahrrad: <td><input name="transport" type="radio" value="bicycle" onchange="formSetTransport('bicycle' );">
@@ -177,18 +177,18 @@ Wähle Start- und Endpunkt (klicke auf die Marker-Symbole unten), wähle
 <div id="hideshow_highway_div" style="display: none;">
 <table>
 <tr><td>Autobahn: <td><input name="highway-motorway" type="text" size="3" onchange="formSetHighway('motorway' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetHighway('motorway' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetHighway('motorway' ,'+');">
-<tr><td>Schnellstraße: <td><input name="highway-trunk" type="text" size="3" onchange="formSetHighway('trunk' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetHighway('trunk' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetHighway('trunk' ,'+');">
-<tr><td>Bundesstraße: <td><input name="highway-primary" type="text" size="3" onchange="formSetHighway('primary' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetHighway('primary' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetHighway('primary' ,'+');">
-<tr><td>Landesstraße: <td><input name="highway-secondary" type="text" size="3" onchange="formSetHighway('secondary' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetHighway('secondary' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetHighway('secondary' ,'+');">
-<tr><td>Hauptstraße: <td><input name="highway-tertiary" type="text" size="3" onchange="formSetHighway('tertiary' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetHighway('tertiary' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetHighway('tertiary' ,'+');">
-<tr><td>Straße:<td><input name="highway-unclassified" type="text" size="3" onchange="formSetHighway('unclassified','=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetHighway('unclassified','-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetHighway('unclassified','+');">
-<tr><td>Wohnstraße: <td><input name="highway-residential" type="text" size="3" onchange="formSetHighway('residential' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetHighway('residential' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetHighway('residential' ,'+');">
+<tr><td>Schnellstraße: <td><input name="highway-trunk" type="text" size="3" onchange="formSetHighway('trunk' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetHighway('trunk' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetHighway('trunk' ,'+');">
+<tr><td>Bundesstraße: <td><input name="highway-primary" type="text" size="3" onchange="formSetHighway('primary' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetHighway('primary' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetHighway('primary' ,'+');">
+<tr><td>Landesstraße: <td><input name="highway-secondary" type="text" size="3" onchange="formSetHighway('secondary' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetHighway('secondary' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetHighway('secondary' ,'+');">
+<tr><td>Hauptstraße: <td><input name="highway-tertiary" type="text" size="3" onchange="formSetHighway('tertiary' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetHighway('tertiary' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetHighway('tertiary' ,'+');">
+<tr><td>Straße:<td><input name="highway-unclassified" type="text" size="3" onchange="formSetHighway('unclassified','=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetHighway('unclassified','-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetHighway('unclassified','+');">
+<tr><td>Wohnstraße: <td><input name="highway-residential" type="text" size="3" onchange="formSetHighway('residential' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetHighway('residential' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetHighway('residential' ,'+');">
 <tr><td>Zufahrtsweg: <td><input name="highway-service" type="text" size="3" onchange="formSetHighway('service' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetHighway('service' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetHighway('service' ,'+');">
 <tr><td>Feld-(Wald-)weg: <td><input name="highway-track" type="text" size="3" onchange="formSetHighway('track' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetHighway('track' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetHighway('track' ,'+');">
 <tr><td>Fahrradweg: <td><input name="highway-cycleway" type="text" size="3" onchange="formSetHighway('cycleway' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetHighway('cycleway' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetHighway('cycleway' ,'+');">
 <tr><td>Weg: <td><input name="highway-path" type="text" size="3" onchange="formSetHighway('path' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetHighway('path' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetHighway('path' ,'+');">
-<tr><td>Fußweg: <td><input name="highway-steps" type="text" size="3" onchange="formSetHighway('steps' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetHighway('steps' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetHighway('steps' ,'+');">
-<tr><td>Fähre: <td><input name="highway-ferry" type="text" size="3" onchange="formSetHighway('ferry' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetHighway('ferry' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetHighway('ferry' ,'+');">
+<tr><td>Fußweg: <td><input name="highway-steps" type="text" size="3" onchange="formSetHighway('steps' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetHighway('steps' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetHighway('steps' ,'+');">
+<tr><td>Fähre: <td><input name="highway-ferry" type="text" size="3" onchange="formSetHighway('ferry' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetHighway('ferry' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetHighway('ferry' ,'+');">
 </table>
 </div>
 </div>
@@ -200,18 +200,18 @@ Wähle Start- und Endpunkt (klicke auf die Marker-Symbole unten), wähle
 <div id="hideshow_speed_div" style="display: none;">
 <table>
 <tr><td>Autobahn: <td><input name="speed-motorway" type="text" size="3" onchange="formSetSpeed('motorway' ,'=');"><td>km/hr<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetSpeed('motorway' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetSpeed('motorway' ,'+');">
-<tr><td>Schnellstraße: <td><input name="speed-trunk" type="text" size="3" onchange="formSetSpeed('trunk' ,'=');"><td>km/hr<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetSpeed('trunk' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetSpeed('trunk' ,'+');">
-<tr><td>Bundesstraße: <td><input name="speed-primary" type="text" size="3" onchange="formSetSpeed('primary' ,'=');"><td>km/hr<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetSpeed('primary' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetSpeed('primary' ,'+');">
-<tr><td>Landesstraße: <td><input name="speed-secondary" type="text" size="3" onchange="formSetSpeed('secondary' ,'=');"><td>km/hr<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetSpeed('secondary' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetSpeed('secondary' ,'+');">
-<tr><td>Hauptstraße: <td><input name="speed-tertiary" type="text" size="3" onchange="formSetSpeed('tertiary' ,'=');"><td>km/hr<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetSpeed('tertiary' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetSpeed('tertiary' ,'+');">
-<tr><td>Straße:<td><input name="speed-unclassified" type="text" size="3" onchange="formSetSpeed('unclassified','=');"><td>km/hr<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetSpeed('unclassified','-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetSpeed('unclassified','+');">
-<tr><td>Wohnstraße: <td><input name="speed-residential" type="text" size="3" onchange="formSetSpeed('residential' ,'=');"><td>km/hr<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetSpeed('residential' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetSpeed('residential' ,'+');">
+<tr><td>Schnellstraße: <td><input name="speed-trunk" type="text" size="3" onchange="formSetSpeed('trunk' ,'=');"><td>km/hr<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetSpeed('trunk' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetSpeed('trunk' ,'+');">
+<tr><td>Bundesstraße: <td><input name="speed-primary" type="text" size="3" onchange="formSetSpeed('primary' ,'=');"><td>km/hr<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetSpeed('primary' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetSpeed('primary' ,'+');">
+<tr><td>Landesstraße: <td><input name="speed-secondary" type="text" size="3" onchange="formSetSpeed('secondary' ,'=');"><td>km/hr<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetSpeed('secondary' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetSpeed('secondary' ,'+');">
+<tr><td>Hauptstraße: <td><input name="speed-tertiary" type="text" size="3" onchange="formSetSpeed('tertiary' ,'=');"><td>km/hr<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetSpeed('tertiary' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetSpeed('tertiary' ,'+');">
+<tr><td>Straße:<td><input name="speed-unclassified" type="text" size="3" onchange="formSetSpeed('unclassified','=');"><td>km/hr<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetSpeed('unclassified','-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetSpeed('unclassified','+');">
+<tr><td>Wohnstraße: <td><input name="speed-residential" type="text" size="3" onchange="formSetSpeed('residential' ,'=');"><td>km/hr<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetSpeed('residential' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetSpeed('residential' ,'+');">
 <tr><td>Zufahrtsweg: <td><input name="speed-service" type="text" size="3" onchange="formSetSpeed('service' ,'=');"><td>km/hr<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetSpeed('service' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetSpeed('service' ,'+');">
 <tr><td>Feld-(Wald-)weg: <td><input name="speed-track" type="text" size="3" onchange="formSetSpeed('track' ,'=');"><td>km/hr<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetSpeed('track' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetSpeed('track' ,'+');">
 <tr><td>Fahrradweg: <td><input name="speed-cycleway" type="text" size="3" onchange="formSetSpeed('cycleway' ,'=');"><td>km/hr<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetSpeed('cycleway' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetSpeed('cycleway' ,'+');">
 <tr><td>Weg: <td><input name="speed-path" type="text" size="3" onchange="formSetSpeed('path' ,'=');"><td>km/hr<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetSpeed('path' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetSpeed('path' ,'+');">
-<tr><td>Fußweg: <td><input name="speed-steps" type="text" size="3" onchange="formSetSpeed('steps' ,'=');"><td>km/hr<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetSpeed('steps' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetSpeed('steps' ,'+');">
-<tr><td>Fähre: <td><input name="speed-ferry" type="text" size="3" onchange="formSetSpeed('ferry' ,'=');"><td>km/hr<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetSpeed('ferry' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetSpeed('ferry' ,'+');">
+<tr><td>Fußweg: <td><input name="speed-steps" type="text" size="3" onchange="formSetSpeed('steps' ,'=');"><td>km/hr<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetSpeed('steps' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetSpeed('steps' ,'+');">
+<tr><td>Fähre: <td><input name="speed-ferry" type="text" size="3" onchange="formSetSpeed('ferry' ,'=');"><td>km/hr<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetSpeed('ferry' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetSpeed('ferry' ,'+');">
 </table>
 </div>
 </div>
@@ -224,7 +224,7 @@ Wähle Start- und Endpunkt (klicke auf die Marker-Symbole unten), wähle
 <table>
 <tr><td>befestigt: <td><input name="property-paved" type="text" size="3" onchange="formSetProperty('paved' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetProperty('paved' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetProperty('paved' ,'+');">
 <tr><td>mehrspurig: <td><input name="property-multilane" type="text" size="3" onchange="formSetProperty('multilane' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetProperty('multilane' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetProperty('multilane' ,'+');">
-<tr><td>Brücken: <td><input name="property-bridge" type="text" size="3" onchange="formSetProperty('bridge' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetProperty('bridge' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetProperty('bridge' ,'+');">
+<tr><td>Brücken: <td><input name="property-bridge" type="text" size="3" onchange="formSetProperty('bridge' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetProperty('bridge' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetProperty('bridge' ,'+');">
 <tr><td>Tunnel: <td><input name="property-tunnel" type="text" size="3" onchange="formSetProperty('tunnel' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetProperty('tunnel' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetProperty('tunnel' ,'+');">
 <tr><td>Wanderweg:<td><input name="property-footroute" type="text" size="3" onchange="formSetProperty('footroute' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetProperty('footroute' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetProperty('footroute' ,'+');">
 <tr><td>Radweg:<td><input name="property-bicycleroute" type="text" size="3" onchange="formSetProperty('bicycleroute','=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetProperty('bicycleroute','-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetProperty('bicycleroute','+');">
@@ -238,22 +238,22 @@ Wähle Start- und Endpunkt (klicke auf die Marker-Symbole unten), wähle
 <span class="hideshow_title">andere Vorgaben</span>
 <div id="hideshow_restriction_div" style="display: none;">
 <table>
-<tr><td>beachte Einbahnstraßen: <td><input name="restrict-oneway" type="checkbox" onchange="formSetRestriction('oneway');">
+<tr><td>beachte Einbahnstraßen: <td><input name="restrict-oneway" type="checkbox" onchange="formSetRestriction('oneway');">
 <tr><td>beachte Abbiegeverbot:<td><input name="restrict-turns" type="checkbox" onchange="formSetRestriction('turns' );">
 </table>
 <table>
 <tr><td>Gewicht:<td><input name="restrict-weight" type="text" size="3" onchange="formSetRestriction('weight','=');"><td>tonnes<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetRestriction('weight','-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetRestriction('weight','+');">
-<tr><td>Höhe:<td><input name="restrict-height" type="text" size="3" onchange="formSetRestriction('height','=');"><td>metres<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetRestriction('height','-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetRestriction('height','+');">
+<tr><td>Höhe:<td><input name="restrict-height" type="text" size="3" onchange="formSetRestriction('height','=');"><td>metres<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetRestriction('height','-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetRestriction('height','+');">
 <tr><td>Breite: <td><input name="restrict-width" type="text" size="3" onchange="formSetRestriction('width' ,'=');"><td>metres<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetRestriction('width' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetRestriction('width' ,'+');">
-<tr><td>Länge:<td><input name="restrict-length" type="text" size="3" onchange="formSetRestriction('length','=');"><td>metres<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetRestriction('length','-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetRestriction('length','+');">
+<tr><td>Länge:<td><input name="restrict-length" type="text" size="3" onchange="formSetRestriction('length','=');"><td>metres<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetRestriction('length','-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetRestriction('length','+');">
 </table>
 </div>
 </div>
 
 <div class="hideshow_box">
 <span class="hideshow_title">Suche</span>
-<input type="button" title="Find shortest route" id="shortest" value="kürzester Weg" onclick="findRoute('shortest');">
-<input type="button" title="Find quickest route" id="quickest" value="schnellste Route" onclick="findRoute('quickest');">
+<input type="button" title="Kürzeste Route finden" id="shortest" value="kürzester Weg" onclick="findRoute('shortest');" disabled="disabled">
+<input type="button" title="Schnellste Route finden" id="quickest" value="schnellste Route" onclick="findRoute('quickest');" disabled="disabled">
 </div>
 
 <div class="hideshow_box">
@@ -271,49 +271,49 @@ Wähle Start- und Endpunkt (klicke auf die Marker-Symbole unten), wähle
 <div class="scrollable">
 <b>Schnellanleitung</b>
 <br>
-Klicke auf die Marker-Bildchen (oben), um sie in der Mitte der Karte (rechts) zu positionieren. Dann 
+Klicke auf die Marker-Bildchen (oben), um sie in der Mitte der Karte (rechts) zu positionieren. Dann
 ziehe das Bildchen auf die genaue Position. Das Zoomen der Karte vor der Patzierung ist vermutlich am einfachsten.
-Alternativ kann man die geografische Breite und Länge in den Kästchen eintragen.
+Alternativ kann man die geografische Breite und Länge in den Kästchen eintragen.
 <p>
-Wähle die Fortbewegungsart, die Vorgaben zur Wegnutzung, die Geschwindigkeitsvorgaben, 
+Wähle die Fortbewegungsart, die Vorgaben zur Wegnutzung, die Geschwindigkeitsvorgaben,
 die Vorgaben zur Wegbeschaffenheit und die anderen Vorgaben von den obigen Auswahlfeldern.
-Ein Klick auf "kürzeste" oder "schnellste" ermittelt die entsprechende Verbindung und zeigt sie in der Karte an.
+Ein Klick auf "kürzeste" oder "schnellste" ermittelt die entsprechende Verbindung und zeigt sie in der Karte an.
 <p>
 <b>Wegpunkte</b>
 <br>
 Ein Klick auf das Marker-Bildchen (oben) schaltet die Sichbarkeit in der Karte ein bzw. aus.
-Die Berechnung Route erfolgt in der Reihenfolge der Wegpunkte (so gut, wie es für die 
-gewählte Fortbewegungsart möglich ist).
+Die Berechnung Route erfolgt in der Reihenfolge der Wegpunkte (so gut, wie es für die
+gewählte Fortbewegungsart möglich ist).
 <p>
 <b>Fortbewegungsart</b>
 <br>
-Die Auswahl der Fortbewegungsart bestimmt die bei der Routenberechnung erlaubten Wegtypen und die 
+Die Auswahl der Fortbewegungsart bestimmt die bei der Routenberechnung erlaubten Wegtypen und die
 Vorgabeeinstellungen aller anderen Parameter.
 <p>
 <b>Vorgaben zur Wegnutzung</b>
 <br>
 Die Vorgaben zur Wegnutzung bestimmen die Priorisierung von Wegarten.
-Wenn z. B. Schnellstraßen mit 110% und Bundesstraßen mit 100% angegeben werden, wird 
-bei zwei möglichen Wegwahlen die Schnellstraße solange bevorzugt wird, wie der 
-Längen(oder Zeit-)unterschied 10% nicht überschreitet.
+Wenn z. B. Schnellstraßen mit 110% und Bundesstraßen mit 100% angegeben werden, wird
+bei zwei möglichen Wegwahlen die Schnellstraße solange bevorzugt wird, wie der
+Längen(oder Zeit-)unterschied 10% nicht überschreitet.
 <p>
 <b>Geschwindigkeitsvorgaben</b>
 <br>
-Die hier geannten Geschwindigkeiten werden für den jeweiligen Wegtyp finden Anwendung wenn keine
+Die hier geannten Geschwindigkeiten werden für den jeweiligen Wegtyp finden Anwendung wenn keine
 andere Geschwindkeitsbegrenzung mit geringerem Wert bekannt ist.
 <p>
 <b>Vorgaben zur Wegbeschaffenheit</b>
 <br>
-Die Vorgaben zur Wegbeschaffenheit werden als Prozentangaben verwendet, um die Verhältnisse 
+Die Vorgaben zur Wegbeschaffenheit werden als Prozentangaben verwendet, um die Verhältnisse
 der Wegbenutzung zu steuern.
 Wenn z. B. befestigte Wege mit 75% angegeben sind, werden unbefestigte automatisch mit 25% angenommen, so
-werden Wege ausgewählt, die mindestens drei mal länger auf befestigten Wegen verlaufen.
+werden Wege ausgewählt, die mindestens drei mal länger auf befestigten Wegen verlaufen.
 <p>
 <b>andere Vorgaben</b>
 <br>
-Die Berücksichtigung von Benutzungs-Begrenzungen durch Gewicht, Höhe, Länge und 
-Breite ist möglich. Genauso können Einbahnstraßenbeschräkungen ignoriert werden 
-(z. B. als Fußgänger). 
+Die Berücksichtigung von Benutzungs-Begrenzungen durch Gewicht, Höhe, Länge und
+Breite ist möglich. Genauso können Einbahnstraßenbeschräkungen ignoriert werden
+(z. B. als Fußgänger).
 </div>
 </div>
 </div>
@@ -327,10 +327,10 @@ Breite ist möglich. Genauso können Einbahnstraßenbeschräkung
 <span class="hideshow_title">Status</span>
 <div id="result_status">
 <div id="result_status_not_run">
-<b><i>Router läuft nicht</i></b>
+<b><i>Router läuft nicht</i></b>
 </div>
 <div id="result_status_running" style="display: none;">
-<b>Router läuft...</b>
+<b>Router läuft...</b>
 </div>
 <div id="result_status_complete" style="display: none;">
 <b>Routing fertig</b>
@@ -351,7 +351,7 @@ Breite ist möglich. Genauso können Einbahnstraßenbeschräkung
 <div class="hideshow_box">
 <span id="hideshow_shortest_show" onclick="hideshow_show('shortest');" class="hideshow_show">+</span>
 <span id="hideshow_shortest_hide" onclick="hideshow_hide('shortest');" class="hideshow_hide">-</span>
-<span class="hideshow_title">kürzester Weg</span>
+<span class="hideshow_title">kürzester Weg</span>
 <div id="shortest_status">
 <div id="shortest_status_no_info">
 <b><i>keine Information</i></b>
@@ -362,11 +362,11 @@ Breite ist möglich. Genauso können Einbahnstraßenbeschräkung
 <div id="hideshow_shortest_div" style="display: none;">
 <div id="shortest_links" style="display: none;">
 <table>
-<tr><td>HTML: <td><a id="shortest_html" target="shortest_html" href="#">öffne Popup</a>
-<tr><td>GPX Track-Datei: <td><a id="shortest_gpx_track" target="shortest_gpx_track" href="#">öffne Popup</a>
-<tr><td>GPX Routen-Datei: <td><a id="shortest_gpx_route" target="shortest_gpx_route" href="#">öffne Popup</a>
-<tr><td>Volltext-Datei: <td><a id="shortest_text_all" target="shortest_text_all" href="#">öffne Popup</a>
-<tr><td>Text-Datei: <td><a id="shortest_text" target="shortest_text" href="#">öffne Popup</a>
+<tr><td>HTML: <td><a id="shortest_html" target="shortest_html" href="#">öffne Popup</a>
+<tr><td>GPX Track-Datei: <td><a id="shortest_gpx_track" target="shortest_gpx_track" href="#">öffne Popup</a>
+<tr><td>GPX Routen-Datei: <td><a id="shortest_gpx_route" target="shortest_gpx_route" href="#">öffne Popup</a>
+<tr><td>Volltext-Datei: <td><a id="shortest_text_all" target="shortest_text_all" href="#">öffne Popup</a>
+<tr><td>Text-Datei: <td><a id="shortest_text" target="shortest_text" href="#">öffne Popup</a>
 </table>
 <hr>
 </div>
@@ -389,11 +389,11 @@ Breite ist möglich. Genauso können Einbahnstraßenbeschräkung
 <div id="hideshow_quickest_div" style="display: none;">
 <div id="quickest_links" style="display: none;">
 <table>
-<tr><td>HTML: <td><a id="quickest_html" target="quickest_html" href="#">öffne Popup</a>
-<tr><td>GPX Track-Datei: <td><a id="quickest_gpx_track" target="quickest_gpx_track" href="#">öffne Popup</a>
-<tr><td>GPX Routen-Datei: <td><a id="quickest_gpx_route" target="quickest_gpx_route" href="#">öffne Popup</a>
-<tr><td>Volltext-Datei: <td><a id="quickest_text_all" target="quickest_text_all" href="#">öffne Popup</a>
-<tr><td>Text-Datei: <td><a id="quickest_text" target="quickest_text" href="#">öffne Popup</a>
+<tr><td>HTML: <td><a id="quickest_html" target="quickest_html" href="#">öffne Popup</a>
+<tr><td>GPX Track-Datei: <td><a id="quickest_gpx_track" target="quickest_gpx_track" href="#">öffne Popup</a>
+<tr><td>GPX Routen-Datei: <td><a id="quickest_gpx_route" target="quickest_gpx_route" href="#">öffne Popup</a>
+<tr><td>Volltext-Datei: <td><a id="quickest_text_all" target="quickest_text_all" href="#">öffne Popup</a>
+<tr><td>Text-Datei: <td><a id="quickest_text" target="quickest_text" href="#">öffne Popup</a>
 </table>
 <hr>
 </div>
@@ -411,27 +411,27 @@ Breite ist möglich. Genauso können Einbahnstraßenbeschräkung
 <b>Schnellanleitung</b>
 <br>
 Nach der Routenberechnung kann man eine GPX oder eine einfache Textdatei (Kurz- oder Langfassung)
-herunterladen. Ebenso kann man die Routenbeschreibung ansehen und in ausgewälte Bereiche zoomen.
+herunterladen. Ebenso kann man die Routenbeschreibung ansehen und in ausgewälte Bereiche zoomen.
 <p>
-<b>Problemlösung</b>
+<b>Problemlösung</b>
 <br>
-Wenn der Router einen Fehler meldet liegt es meistens daran, dass kein Weg zwischen den gewälten Punkten unter
-Beachtung der Vorgaben gefunden werden kann. Das Bewegen eines oder mehrere Punkte oder das verändern von
+Wenn der Router einen Fehler meldet liegt es meistens daran, dass kein Weg zwischen den gewälten Punkten unter
+Beachtung der Vorgaben gefunden werden kann. Das Bewegen eines oder mehrere Punkte oder das verändern von
 Vorgaben sollte es erlauben eine Route zu finden.
 <p>
 <b>Ausgabe-Formate</b>
 <br>
 <dl>
 <dt>HTMLs
-<dd>Eine Beschreibung der Route mit Anweisungen für jede wichtige Abzweigung.
+<dd>Eine Beschreibung der Route mit Anweisungen für jede wichtige Abzweigung.
 <dt>GPX Track-Datei
-<dd>Die gleichen Informationen, die in der Karte angezeigt werden mit Punkten für jeden Abzweig 
-und Linien für jedes Teilstück.
+<dd>Die gleichen Informationen, die in der Karte angezeigt werden mit Punkten für jeden Abzweig
+und Linien für jedes Teilstück.
 <dt>GPX Routen-Datei
-<dd>Die gleichen Informationen, die im Text angezeigt werden mit einem Wegpunkt für 
-jede wichtige Richtungsänderung.
+<dd>Die gleichen Informationen, die im Text angezeigt werden mit einem Wegpunkt für
+jede wichtige Richtungsänderung.
 <dt>Volltext-Datei
-<dd>Eine aller Knoten und die Abstände zwischen ihnen, sowie die Gesamtentfernung vom i
+<dd>Eine aller Knoten und die Abstände zwischen ihnen, sowie die Gesamtentfernung vom i
 Startpunkt zum jeweiligen Konten.
 <dt>Text-Datei
 <dd>Die gleiche Information, die als Text angezeigt wird.
@@ -451,7 +451,7 @@ Startpunkt zum jeweiligen Konten.
 
 <div class="hideshow_box">
 <span class="hideshow_title">Routino Ansichten</span>
-Die Anzeige der Daten kann auf verschiedene Weise angepasst werden. 
+Die Anzeige der Daten kann auf verschiedene Weise angepasst werden.
 <br>
 <a id="visualiser_url" href="visualiser.html" target="visualiser">anpassen dieser Kartenansicht</a>
 </div>
@@ -465,15 +465,15 @@ Die Anzeige der Daten kann auf verschiedene Weise angepasst werden.
 <div class="map" id="map">
 <noscript>
 <p>
-Javascript is <em>required</em> to use this web page because of the interactive map.
+Um die interaktive Karte zu nutzen iWork Javascript benötigt. 
 </noscript>
 </div>
 <div class="attribution">
 Router: <a href="http://www.routino.org/" target="routino">Routino</a>
 |
-Geo Data: <span id="attribution_data"></span>
+Geodaten: <span id="attribution_data"></span>
 |
-Tiles: <span id="attribution_tile"></span>
+Kacheln: <span id="attribution_tile"></span>
 </div>
 </div>
 
diff --git a/web/www/routino/router.html.en b/web/www/routino/router.html.en
index 0cb348a..df52d8b 100644
--- a/web/www/routino/router.html.en
+++ b/web/www/routino/router.html.en
@@ -85,7 +85,7 @@ Select start and end points (click on the marker icons below), select routing pr
 <td>(EN)
 <td><input name="language" type="radio" value="en" onchange="formSetLanguage();" checked>
 <tr>
-<td><a id="lang_de_url" href="router.html.de" title="Deutsche Webseite">Deutsche</a>
+<td><a id="lang_de_url" href="router.html.de" title="Deutsche Webseite">Deutsch</a>
 <td>(DE)
 <td><input name="language" type="radio" value="de" onchange="formSetLanguage();" >
 <tr>
@@ -97,7 +97,7 @@ Select start and end points (click on the marker icons below), select routing pr
 <td>(NL)
 <td><input name="language" type="radio" value="nl" onchange="formSetLanguage();" >
 <tr>
-<td>
+<td><a id="lang_ru_url" href="router.html.ru" title="Русский">Русский</a>
 <td>(RU)
 <td><input name="language" type="radio" value="ru" onchange="formSetLanguage();" >
 </table>
@@ -252,8 +252,8 @@ Select start and end points (click on the marker icons below), select routing pr
 
 <div class="hideshow_box">
 <span class="hideshow_title">Find</span>
-<input type="button" title="Find shortest route" id="shortest" value="Shortest Route" onclick="findRoute('shortest');">
-<input type="button" title="Find quickest route" id="quickest" value="Quickest Route" onclick="findRoute('quickest');">
+<input type="button" title="Find shortest route" id="shortest" value="Shortest Route" onclick="findRoute('shortest');" disabled="disabled">
+<input type="button" title="Find quickest route" id="quickest" value="Quickest Route" onclick="findRoute('quickest');" disabled="disabled">
 </div>
 
 <div class="hideshow_box">
diff --git a/web/www/routino/router.html.fr b/web/www/routino/router.html.fr
index 2e5054c..c352229 100644
--- a/web/www/routino/router.html.fr
+++ b/web/www/routino/router.html.fr
@@ -6,7 +6,7 @@
 <meta name="keywords" content="openstreetmap routing route planner">
 <meta name="viewport" content="width=device-width, height=device-height, initial-scale=1, user-scalable=no">
 
-<title>Routino : Calculateur d'itinéraire pour OpenStreetMap</title>
+<title>Routino : Calculateur d'itinéraire pour OpenStreetMap</title>
 
 <!--
 Routino router web page.
@@ -54,18 +54,18 @@ along with this program. If not, see http://www.gnu.org/licenses/.
 <div class="left_panel">
 
 <div class="tab_box">
-<span id="tab_options" onclick="tab_select('options');" class="tab_selected" title="définir les options">Options</span>
-<span id="tab_results" onclick="tab_select('results');" class="tab_unselected" title="Voir les resultats">Résultats</span>
-<span id="tab_data" onclick="tab_select('data');" class="tab_unselected" title="Voir les informations de la base de donnée">Données</span>
+<span id="tab_options" onclick="tab_select('options');" class="tab_selected" title="définir les options">Options</span>
+<span id="tab_results" onclick="tab_select('results');" class="tab_unselected" title="Voir les resultats">Résultats</span>
+<span id="tab_data" onclick="tab_select('data');" class="tab_unselected" title="Voir les informations de la base de donnée">Données</span>
 </div>
 
 <div class="tab_content" id="tab_options_div">
 
 <form name="form" id="form" action="#" method="get" onsubmit="return false;">
 <div class="hideshow_box">
-<span class="hideshow_title">Itinéraires pour Openstreetmap Routino</span>
-Cette page web permet de calculer des itinéraires à l'aide des données collectées par OpenStreetMap.
-Sélectionner les points de départ et d'arrivée (cliquer sur les icones ci-dessous), sélectionner les préférences, puis rechercher un itinéraire.
+<span class="hideshow_title">Itinéraires pour Openstreetmap Routino</span>
+Cette page web permet de calculer des itinéraires à l'aide des données collectées par OpenStreetMap.
+Sélectionner les points de départ et d'arrivée (cliquer sur les icones ci-dessous), sélectionner les préférences, puis rechercher un itinéraire.
 <div class="center">
 <a target="other" href="http://www.routino.org/">site web Routino</a>
 |
@@ -85,7 +85,7 @@ Sélectionner les points de départ et d'arrivée (cliquer sur les i
 <td>(EN)
 <td><input name="language" type="radio" value="en" onchange="formSetLanguage();" >
 <tr>
-<td><a id="lang_de_url" href="router.html.de" title="Deutsche Webseite">Deutsche</a>
+<td><a id="lang_de_url" href="router.html.de" title="Deutsche Webseite">Deutsch</a>
 <td>(DE)
 <td><input name="language" type="radio" value="de" onchange="formSetLanguage();" >
 <tr>
@@ -97,7 +97,7 @@ Sélectionner les points de départ et d'arrivée (cliquer sur les i
 <td>(NL)
 <td><input name="language" type="radio" value="nl" onchange="formSetLanguage();" >
 <tr>
-<td>
+<td><a id="lang_ru_url" href="router.html.ru" title="Русский">Русский</a>
 <td>(RU)
 <td><input name="language" type="radio" value="ru" onchange="formSetLanguage();" >
 </table>
@@ -108,7 +108,7 @@ Sélectionner les points de départ et d'arrivée (cliquer sur les i
 <div class="hideshow_box">
 <span id="hideshow_waypoint_show" onclick="hideshow_show('waypoint');" class="hideshow_hide">+</span>
 <span id="hideshow_waypoint_hide" onclick="hideshow_hide('waypoint');" class="hideshow_show">-</span>
-<span class="hideshow_title">Etapes de l'itinéraire</span>
+<span class="hideshow_title">Etapes de l'itinéraire</span>
 <div id="hideshow_waypoint_div">
 <table id="waypoints">
 <colgroup>
@@ -118,34 +118,34 @@ Sélectionner les points de départ et d'arrivée (cliquer sur les i
 </colgroup>
 <tr id="waypointXXX" style="display: none;">
 <td>
-<img id="iconXXX" src="icons/marker-XXX-grey.png" title="Etape XXX de l'itinéraire - (cliquer pour ajouter/enlever de la carte)" alt="Waypoint XXX" onmousedown="markerToggleMap(XXX);">
+<img id="iconXXX" src="icons/marker-XXX-grey.png" title="Etape XXX de l'itinéraire - (cliquer pour ajouter/enlever de la carte)" alt="Waypoint XXX" onmousedown="markerToggleMap(XXX);">
 <td>
 <span id="coordsXXX">
 <input name="lonXXX" type="text" size="7" title="Etape XXX Longitude" onchange="formSetCoords(XXX);">E
 <input name="latXXX" type="text" size="7" title="Etape XXX Latitude" onchange="formSetCoords(XXX);">N
 </span>
 <span id="searchXXX" style="display: none;">
-<input name="searchXXX" type="text" size="18" title="position de l'étape XXX"> <!-- uses Javascript event for triggering -->
+<input name="searchXXX" type="text" size="18" title="position de l'étape XXX"> <!-- uses Javascript event for triggering -->
 </span>
 <td>
 <img alt="?" src="icons/waypoint-search.png" title="Rechercher la position" onmousedown="markerSearch(XXX);" >
 <img alt="G" src="icons/waypoint-locate.png" title="obtenir la position actuelle" onmousedown="markerLocate(XXX);" >
-<img alt="O" src="icons/waypoint-recentre.png" title="Centrer la carte sur cette étape" onmousedown="markerRecentre(XXX);">
-<img alt="^" src="icons/waypoint-up.png" title="Placer cette étape avant" onmousedown="markerMoveUp(XXX);" >
-<img alt="+" src="icons/waypoint-add.png" title="Ajouter une étape après celle-ci" onmousedown="markerAddAfter(XXX);">
+<img alt="O" src="icons/waypoint-recentre.png" title="Centrer la carte sur cette étape" onmousedown="markerRecentre(XXX);">
+<img alt="^" src="icons/waypoint-up.png" title="Placer cette étape avant" onmousedown="markerMoveUp(XXX);" >
+<img alt="+" src="icons/waypoint-add.png" title="Ajouter une étape après celle-ci" onmousedown="markerAddAfter(XXX);">
 <br>
-<img alt="#" src="icons/waypoint-coords.png" title="Coordonnées de position" onmousedown="markerCoords(XXX);" >
-<img alt="~" src="icons/waypoint-home.png" title="Changer en position de départ" onmousedown="markerHome(XXX);" >
-<img alt="o" src="icons/waypoint-centre.png" title="Centrer cette étape sur la carte" onmousedown="markerCentre(XXX);" >
-<img alt="v" src="icons/waypoint-down.png" title="Placer cette étape après" onmousedown="markerMoveDown(XXX);">
-<img alt="-" src="icons/waypoint-remove.png" title="supprimer cette étape" onmousedown="markerRemove(XXX);" >
+<img alt="#" src="icons/waypoint-coords.png" title="Coordonnées de position" onmousedown="markerCoords(XXX);" >
+<img alt="~" src="icons/waypoint-home.png" title="Changer en position de départ" onmousedown="markerHome(XXX);" >
+<img alt="o" src="icons/waypoint-centre.png" title="Centrer cette étape sur la carte" onmousedown="markerCentre(XXX);" >
+<img alt="v" src="icons/waypoint-down.png" title="Placer cette étape après" onmousedown="markerMoveDown(XXX);">
+<img alt="-" src="icons/waypoint-remove.png" title="supprimer cette étape" onmousedown="markerRemove(XXX);" >
 <tr id="searchresultsXXX" style="display: none;">
 <td colspan="3">
 <!-- The waypoints are inserted by the JavaScript, see the "maxmarkers" variable in router.js. -->
 <tr>
 <td colspan="3" class="center">
-<input type="button" title="Inverser l'ordre des étapes" value="Inverser l'ordre" onmousedown="markersReverse();">
-<input type="button" title="Ajouter une nouvelle étape pour faire une boucle" value="Faire une boucle" onmousedown="markersLoop();">
+<input type="button" title="Inverser l'ordre des étapes" value="Inverser l'ordre" onmousedown="markersReverse();">
+<input type="button" title="Ajouter une nouvelle étape pour faire une boucle" value="Faire une boucle" onmousedown="markersLoop();">
 </table>
 </div>
 </div>
@@ -153,11 +153,11 @@ Sélectionner les points de départ et d'arrivée (cliquer sur les i
 <div class="hideshow_box">
 <span id="hideshow_transport_show" onclick="hideshow_show('transport');" class="hideshow_hide">+</span>
 <span id="hideshow_transport_hide" onclick="hideshow_hide('transport');" class="hideshow_show">-</span>
-<span class="hideshow_title">Mode de déplacement</span>
+<span class="hideshow_title">Mode de déplacement</span>
 <div id="hideshow_transport_div">
 <table>
-<tr><td>À pied: <td><input name="transport" type="radio" value="foot" onchange="formSetTransport('foot' );">
-<tr><td>À cheval: <td><input name="transport" type="radio" value="horse" onchange="formSetTransport('horse' );">
+<tr><td>À pied: <td><input name="transport" type="radio" value="foot" onchange="formSetTransport('foot' );">
+<tr><td>À cheval: <td><input name="transport" type="radio" value="horse" onchange="formSetTransport('horse' );">
 <tr><td>Fauteuil roulant:<td><input name="transport" type="radio" value="wheelchair" onchange="formSetTransport('wheelchair');">
 <tr><td>Bicyclette: <td><input name="transport" type="radio" value="bicycle" onchange="formSetTransport('bicycle' );">
 <tr><td>Mobilette: <td><input name="transport" type="radio" value="moped" onchange="formSetTransport('moped' );">
@@ -173,7 +173,7 @@ Sélectionner les points de départ et d'arrivée (cliquer sur les i
 <div class="hideshow_box">
 <span id="hideshow_highway_show" onclick="hideshow_show('highway');" class="hideshow_show">+</span>
 <span id="hideshow_highway_hide" onclick="hideshow_hide('highway');" class="hideshow_hide">-</span>
-<span class="hideshow_title">Préférences routières</span>
+<span class="hideshow_title">Préférences routières</span>
 <div id="hideshow_highway_div" style="display: none;">
 <table>
 <tr><td>Autoroute: <td><input name="highway-motorway" type="text" size="3" onchange="formSetHighway('motorway' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetHighway('motorway' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetHighway('motorway' ,'+');">
@@ -181,8 +181,8 @@ Sélectionner les points de départ et d'arrivée (cliquer sur les i
 <tr><td>Primaire: <td><input name="highway-primary" type="text" size="3" onchange="formSetHighway('primary' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetHighway('primary' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetHighway('primary' ,'+');">
 <tr><td>Secondaire: <td><input name="highway-secondary" type="text" size="3" onchange="formSetHighway('secondary' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetHighway('secondary' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetHighway('secondary' ,'+');">
 <tr><td>Tertiaire: <td><input name="highway-tertiary" type="text" size="3" onchange="formSetHighway('tertiary' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetHighway('tertiary' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetHighway('tertiary' ,'+');">
-<tr><td>Non classée:<td><input name="highway-unclassified" type="text" size="3" onchange="formSetHighway('unclassified','=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetHighway('unclassified','-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetHighway('unclassified','+');">
-<tr><td>Résidentiel: <td><input name="highway-residential" type="text" size="3" onchange="formSetHighway('residential' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetHighway('residential' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetHighway('residential' ,'+');">
+<tr><td>Non classée:<td><input name="highway-unclassified" type="text" size="3" onchange="formSetHighway('unclassified','=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetHighway('unclassified','-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetHighway('unclassified','+');">
+<tr><td>Résidentiel: <td><input name="highway-residential" type="text" size="3" onchange="formSetHighway('residential' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetHighway('residential' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetHighway('residential' ,'+');">
 <tr><td>Service: <td><input name="highway-service" type="text" size="3" onchange="formSetHighway('service' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetHighway('service' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetHighway('service' ,'+');">
 <tr><td>Chemin: <td><input name="highway-track" type="text" size="3" onchange="formSetHighway('track' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetHighway('track' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetHighway('track' ,'+');">
 <tr><td>Voie cyclable: <td><input name="highway-cycleway" type="text" size="3" onchange="formSetHighway('cycleway' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetHighway('cycleway' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetHighway('cycleway' ,'+');">
@@ -204,8 +204,8 @@ Sélectionner les points de départ et d'arrivée (cliquer sur les i
 <tr><td>Primaire: <td><input name="speed-primary" type="text" size="3" onchange="formSetSpeed('primary' ,'=');"><td>km/hr<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetSpeed('primary' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetSpeed('primary' ,'+');">
 <tr><td>Secondaire: <td><input name="speed-secondary" type="text" size="3" onchange="formSetSpeed('secondary' ,'=');"><td>km/hr<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetSpeed('secondary' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetSpeed('secondary' ,'+');">
 <tr><td>Tertiaire: <td><input name="speed-tertiary" type="text" size="3" onchange="formSetSpeed('tertiary' ,'=');"><td>km/hr<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetSpeed('tertiary' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetSpeed('tertiary' ,'+');">
-<tr><td>Non classée:<td><input name="speed-unclassified" type="text" size="3" onchange="formSetSpeed('unclassified','=');"><td>km/hr<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetSpeed('unclassified','-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetSpeed('unclassified','+');">
-<tr><td>Résidentiel: <td><input name="speed-residential" type="text" size="3" onchange="formSetSpeed('residential' ,'=');"><td>km/hr<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetSpeed('residential' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetSpeed('residential' ,'+');">
+<tr><td>Non classée:<td><input name="speed-unclassified" type="text" size="3" onchange="formSetSpeed('unclassified','=');"><td>km/hr<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetSpeed('unclassified','-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetSpeed('unclassified','+');">
+<tr><td>Résidentiel: <td><input name="speed-residential" type="text" size="3" onchange="formSetSpeed('residential' ,'=');"><td>km/hr<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetSpeed('residential' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetSpeed('residential' ,'+');">
 <tr><td>Service: <td><input name="speed-service" type="text" size="3" onchange="formSetSpeed('service' ,'=');"><td>km/hr<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetSpeed('service' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetSpeed('service' ,'+');">
 <tr><td>Chemin: <td><input name="speed-track" type="text" size="3" onchange="formSetSpeed('track' ,'=');"><td>km/hr<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetSpeed('track' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetSpeed('track' ,'+');">
 <tr><td>Voie cyclable: <td><input name="speed-cycleway" type="text" size="3" onchange="formSetSpeed('cycleway' ,'=');"><td>km/hr<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetSpeed('cycleway' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetSpeed('cycleway' ,'+');">
@@ -219,15 +219,15 @@ Sélectionner les points de départ et d'arrivée (cliquer sur les i
 <div class="hideshow_box">
 <span id="hideshow_property_show" onclick="hideshow_show('property');" class="hideshow_show">+</span>
 <span id="hideshow_property_hide" onclick="hideshow_hide('property');" class="hideshow_hide">-</span>
-<span class="hideshow_title">Préférences des propriétés</span>
+<span class="hideshow_title">Préférences des propriétés</span>
 <div id="hideshow_property_div" style="display: none;">
 <table>
-<tr><td>Pavée: <td><input name="property-paved" type="text" size="3" onchange="formSetProperty('paved' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetProperty('paved' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetProperty('paved' ,'+');">
+<tr><td>Pavée: <td><input name="property-paved" type="text" size="3" onchange="formSetProperty('paved' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetProperty('paved' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetProperty('paved' ,'+');">
 <tr><td>Voies multiples: <td><input name="property-multilane" type="text" size="3" onchange="formSetProperty('multilane' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetProperty('multilane' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetProperty('multilane' ,'+');">
 <tr><td>Pont: <td><input name="property-bridge" type="text" size="3" onchange="formSetProperty('bridge' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetProperty('bridge' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetProperty('bridge' ,'+');">
 <tr><td>Tunnel: <td><input name="property-tunnel" type="text" size="3" onchange="formSetProperty('tunnel' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetProperty('tunnel' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetProperty('tunnel' ,'+');">
-<tr><td>Itinér. piéton:<td><input name="property-footroute" type="text" size="3" onchange="formSetProperty('footroute' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetProperty('footroute' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetProperty('footroute' ,'+');">
-<tr><td>Itinér. cycle:<td><input name="property-bicycleroute" type="text" size="3" onchange="formSetProperty('bicycleroute','=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetProperty('bicycleroute','-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetProperty('bicycleroute','+');">
+<tr><td>Itinér. piéton:<td><input name="property-footroute" type="text" size="3" onchange="formSetProperty('footroute' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetProperty('footroute' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetProperty('footroute' ,'+');">
+<tr><td>Itinér. cycle:<td><input name="property-bicycleroute" type="text" size="3" onchange="formSetProperty('bicycleroute','=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetProperty('bicycleroute','-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetProperty('bicycleroute','+');">
 </table>
 </div>
 </div>
@@ -252,15 +252,15 @@ Sélectionner les points de départ et d'arrivée (cliquer sur les i
 
 <div class="hideshow_box">
 <span class="hideshow_title">Rechercher</span>
-<input type="button" title="Chercher l'itinéraire le plus court" id="shortest" value="Le plus court" onclick="findRoute('shortest');">
-<input type="button" title="Chercher l'itinéraire le plus rapide" id="quickest" value="Le plus rapide" onclick="findRoute('quickest');">
+<input type="button" title="Chercher l'itinéraire le plus court" id="shortest" value="Le plus court" onclick="findRoute('shortest');" disabled="disabled">
+<input type="button" title="Chercher l'itinéraire le plus rapide" id="quickest" value="Le plus rapide" onclick="findRoute('quickest');" disabled="disabled">
 </div>
 
 <div class="hideshow_box">
 <span class="hideshow_title">Liens</span>
 <a id="permalink_url" href="router.html">Lien vers cet outil de visualisation</a>
 <br>
-<a id="edit_url" target="edit" style="display: none;">Editer cette donnée OSM</a>
+<a id="edit_url" target="edit" style="display: none;">Editer cette donnée OSM</a>
 </div>
 
 <div class="hideshow_box">
@@ -269,57 +269,57 @@ Sélectionner les points de départ et d'arrivée (cliquer sur les i
 <span class="hideshow_title">Aide</span>
 <div id="hideshow_help_options_div">
 <div class="scrollable">
-<b>Aide simplifiée</b>
+<b>Aide simplifiée</b>
 <br>
 Cliquer sur les icones de balises (ci-dessus) pour les placer sur la carte (droite). Puis
-les déplacer à la position choisie. Il sera sûrement plus facile de zoomer sur la carte 
+les déplacer à la position choisie. Il sera sûrement plus facile de zoomer sur la carte
 avant de placer les balises. Autre solution, taper la latitude et
 la longitude dans les cases ci-dessus.
 <p>
-Selectionner le mode de déplacement, les types de voies autorisées, les limitations de vitesse, 
-les propriétés des voies et les autres restrictions dans les options ci-dessus.
-Selectionner "Le plus court" ou "Le plus rapide" pour calculer l'itinéraire et le visualiser
+Selectionner le mode de déplacement, les types de voies autorisées, les limitations de vitesse,
+les propriétés des voies et les autres restrictions dans les options ci-dessus.
+Selectionner "Le plus court" ou "Le plus rapide" pour calculer l'itinéraire et le visualiser
 sur la carte.
 <p>
 <b>Etapes</b>
 <br>
 Cliquer sur les balises affichera ou supprimera leur apparition sur la carte.
-Quand un itinéraire est calculé, il affichera (le plus près possible
-pour le mode de déplacement sélectionné) chacune des étapes qui ont une
-balise sur la carte dans l'ordre défini.
+Quand un itinéraire est calculé, il affichera (le plus près possible
+pour le mode de déplacement sélectionné) chacune des étapes qui ont une
+balise sur la carte dans l'ordre défini.
 <p>
-<b>Mode de déplacement</b>
+<b>Mode de déplacement</b>
 <br>
-Selectionner un mode de déplacement restreindra l'itinéraire choisi aux
-voies sur lesquelles il est autorisé et définira les valeurs par défaut pour
-les autres paramètres.
+Selectionner un mode de déplacement restreindra l'itinéraire choisi aux
+voies sur lesquelles il est autorisé et définira les valeurs par défaut pour
+les autres paramètres.
 <p>
-<b>Préferences des voies</b>
+<b>Préferences des voies</b>
 <br>
-La préférence de voies est définie par un pourcentage et des itinéraires sont choisis 
-qui essaient de suivre les voies préferrées.
-Par exemple, si une voie "Primaire" a une préférence de "110%" et une voie "Secondaire"
-une préférence de "100%", alors cela signifie qu'un itinéraire sur une voie primaire
-peut être jusqu'à 10% plus long que sur une voie secondaire et être sélectionné.
+La préférence de voies est définie par un pourcentage et des itinéraires sont choisis
+qui essaient de suivre les voies préferrées.
+Par exemple, si une voie "Primaire" a une préférence de "110%" et une voie "Secondaire"
+une préférence de "100%", alors cela signifie qu'un itinéraire sur une voie primaire
+peut être jusqu'à 10% plus long que sur une voie secondaire et être sélectionné.
 <p>
 <b>Limites de vitesse</b>
 <br>
 Les limites de vitesse choisies ici pour les differents types de voies s'appliquent si la
-voie n'a pas d'autre limite de vitesse définie ou si celle-ci est supérieure à celle choisie.
+voie n'a pas d'autre limite de vitesse définie ou si celle-ci est supérieure à celle choisie.
 <p>
-<b>Préférences de propriétés</b>
+<b>Préférences de propriétés</b>
 <br>
-La préférence de propriété est définie par un pourcentage et des itinéraires sont choisis
-qui essaient de suivre les voies ayant cette propriété préférée.
-Par exemple, si une voie goudronnée a une préférence de "75%", alors cela signifie que
-une voie non goudronnée obtient automatiquement une préférence de "25%" ce qui fait que 
-un itinéraire sur une voie goudronnée peut avoir 3 fois la longueur d'une non goudronnée 
-et être sélectionnée.
+La préférence de propriété est définie par un pourcentage et des itinéraires sont choisis
+qui essaient de suivre les voies ayant cette propriété préférée.
+Par exemple, si une voie goudronnée a une préférence de "75%", alors cela signifie que
+une voie non goudronnée obtient automatiquement une préférence de "25%" ce qui fait que
+un itinéraire sur une voie goudronnée peut avoir 3 fois la longueur d'une non goudronnée
+et être sélectionnée.
 <p>
 <b>Autres restrictions</b>
 <br>
-Celles-ci permettent de touver un itinéraire qui respecte les limites définies pour
-le poids, la hauteur, la largeur ou la longueur. Il est également possible d'ignorer
+Celles-ci permettent de touver un itinéraire qui respecte les limites définies pour
+le poids, la hauteur, la largeur ou la longueur. Il est également possible d'ignorer
 les restrictions de sens unique (e. pour la marche).
 </div>
 </div>
@@ -334,23 +334,23 @@ les restrictions de sens unique (e. pour la marche).
 <span class="hideshow_title">Status</span>
 <div id="result_status">
 <div id="result_status_not_run">
-<b><i>Routage non lancé</i></b>
+<b><i>Routage non lancé</i></b>
 </div>
 <div id="result_status_running" style="display: none;">
 <b>Routage en cours...</b>
 </div>
 <div id="result_status_complete" style="display: none;">
-<b>Routage terminé</b>
+<b>Routage terminé</b>
 <br>
-<a id="router_log_complete" target="router_log" href="#">Voir les Détails</a>
+<a id="router_log_complete" target="router_log" href="#">Voir les Détails</a>
 </div>
 <div id="result_status_error" style="display: none;">
 <b>Erreur de Routage</b>
 <br>
-<a id="router_log_error" target="router_log" href="#">Voir les Détails</a>
+<a id="router_log_error" target="router_log" href="#">Voir les Détails</a>
 </div>
 <div id="result_status_failed" style="display: none;">
-<b>Le Routage n'a pas été lancé correctement</b>
+<b>Le Routage n'a pas été lancé correctement</b>
 </div>
 </div>
 </div>
@@ -369,7 +369,7 @@ les restrictions de sens unique (e. pour la marche).
 <div id="hideshow_shortest_div" style="display: none;">
 <div id="shortest_links" style="display: none;">
 <table>
-<tr><td>Itinéraire HTML: <td><a id="shortest_html" target="shortest_html" href="#">Ouvrir Popup</a>
+<tr><td>Itinéraire HTML: <td><a id="shortest_html" target="shortest_html" href="#">Ouvrir Popup</a>
 <tr><td>Fichier chemin GPX: <td><a id="shortest_gpx_track" target="shortest_gpx_track" href="#">Ouvrir Popup</a>
 <tr><td>Fichier route GPX: <td><a id="shortest_gpx_route" target="shortest_gpx_route" href="#">Ouvrir Popup</a>
 <tr><td>Fichier texte complet: <td><a id="shortest_text_all" target="shortest_text_all" href="#">Ouvrir Popup</a>
@@ -396,7 +396,7 @@ les restrictions de sens unique (e. pour la marche).
 <div id="hideshow_quickest_div" style="display: none;">
 <div id="quickest_links" style="display: none;">
 <table>
-<tr><td>Itinéraire HTML: <td><a id="quickest_html" target="quickest_html" href="#">Ouvrir Popup</a>
+<tr><td>Itinéraire HTML: <td><a id="quickest_html" target="quickest_html" href="#">Ouvrir Popup</a>
 <tr><td>Fichier chemin GPX: <td><a id="quickest_gpx_track" target="quickest_gpx_track" href="#">Ouvrir Popup</a>
 <tr><td>Fichier route GPX: <td><a id="quickest_gpx_route" target="quickest_gpx_route" href="#">Ouvrir Popup</a>
 <tr><td>Fichier texte complet: <td><a id="quickest_text_all" target="quickest_text_all" href="#">Ouvrir Popup</a>
@@ -417,34 +417,34 @@ les restrictions de sens unique (e. pour la marche).
 <div class="scrollable">
 <b>Aide rapide</b>
 <br>
-Après le calcul de l'itinéraire, vous pouvez télécharger le fichier GPX ou
-la description au format texte (résumé ou version détaillée). Vous pouvez également
-visualiser la description de l'itinéraire et zoomer sur des tronçons sélectionnés.
+Après le calcul de l'itinéraire, vous pouvez télécharger le fichier GPX ou
+la description au format texte (résumé ou version détaillée). Vous pouvez également
+visualiser la description de l'itinéraire et zoomer sur des tronçons sélectionnés.
 <p>
-<b>Résoudre un problème</b>
+<b>Résoudre un problème</b>
 <br>
-Si le calculateur aboutie à une erreur, la cause la plus probable est que
-il n'est pas possible de trouver un itinéraire entre les points sélectionnés.
-Por permettre de trouver un itinéraire, déplacer une ou des balises 
+Si le calculateur aboutie à une erreur, la cause la plus probable est que
+il n'est pas possible de trouver un itinéraire entre les points sélectionnés.
+Por permettre de trouver un itinéraire, déplacer une ou des balises
 ou changer les options de recherche.
 <p>
 <b>Formats d'affichage</b>
 <br>
 <dl>
 <dt>Instructions HTML
-<dd>une description de l'itinéraire à prendre 
-à chaque intersection importante.
+<dd>une description de l'itinéraire à prendre
+à chaque intersection importante.
 <dt>Fichier chemin GPX
-<dd>La même information qui est affichée sur la carte avec des points
-pour chaque noeud et des lignes pour tous les sègments.
+<dd>La même information qui est affichée sur la carte avec des points
+pour chaque noeud et des lignes pour tous les sègments.
 <dt>Fichier route GPX
-<dd>La même information qui est affichée en texte pour l'itinéraire
-avec une étape pour chaque intersection importante.
+<dd>La même information qui est affichée en texte pour l'itinéraire
+avec une étape pour chaque intersection importante.
 <dt>Fichier texte complet
-<dd>Une liste de tous les noeuds traversés ainsi que la distance 
-entre eux et la distance cumulée pour chaque étape de l'itinéraire.
+<dd>Une liste de tous les noeuds traversés ainsi que la distance
+entre eux et la distance cumulée pour chaque étape de l'itinéraire.
 <dt>Fichier texte
-<dd>La même information qui est affichée en texte pour l'itinéraire.
+<dd>La même information qui est affichée en texte pour l'itinéraire.
 </dl>
 </div>
 </div>
@@ -456,13 +456,13 @@ entre eux et la distance cumulée pour chaque étape de l'itinérair
 <div class="hideshow_box">
 <span class="hideshow_title">Routino Statistiques</span>
 <div id="statistics_data"></div>
-<a id="statistics_link" href="statistics.cgi" onclick="displayStatistics();return(false);">Afficher les données statistiques</a>
+<a id="statistics_link" href="statistics.cgi" onclick="displayStatistics();return(false);">Afficher les données statistiques</a>
 </div>
 
 <div class="hideshow_box">
 <span class="hideshow_title">Routino Visualiser</span>
-Pour comprendre comment Routino voit les données, il y a un outil de visualisation
-qui permet d'afficher les données soujacentes de multiples manières.
+Pour comprendre comment Routino voit les données, il y a un outil de visualisation
+qui permet d'afficher les données soujacentes de multiples manières.
 <br>
 <a id="visualiser_url" href="visualiser.html" target="visualiser">Lien vers cet outil de visualisation</a>
 </div>
@@ -476,7 +476,7 @@ qui permet d'afficher les données soujacentes de multiples manières.
 <div class="map" id="map">
 <noscript>
 <p>
-Javascript est <em>nécessaire</em> pour cette page web à cause de la carte intéractive.
+Javascript est <em>nécessaire</em> pour cette page web à cause de la carte intéractive.
 </noscript>
 </div>
 <div class="attribution">
diff --git a/web/www/routino/router.html.nl b/web/www/routino/router.html.nl
index 26c5908..f5f1ff4 100644
--- a/web/www/routino/router.html.nl
+++ b/web/www/routino/router.html.nl
@@ -86,7 +86,7 @@ icoon links, schuif het op map naar gewenste positie).
 <td>(EN)
 <td><input name="language" type="radio" value="en" onchange="formSetLanguage();" >
 <tr>
-<td><a id="lang_de_url" href="router.html.de" title="Deutsche Webseite">Deutsche</a>
+<td><a id="lang_de_url" href="router.html.de" title="Deutsche Webseite">Deutsch</a>
 <td>(DE)
 <td><input name="language" type="radio" value="de" onchange="formSetLanguage();" >
 <tr>
@@ -98,7 +98,7 @@ icoon links, schuif het op map naar gewenste positie).
 <td>(NL)
 <td><input name="language" type="radio" value="nl" onchange="formSetLanguage();" checked>
 <tr>
-<td>
+<td><a id="lang_ru_url" href="router.html.ru" title="Русский">Русский</a>
 <td>(RU)
 <td><input name="language" type="radio" value="ru" onchange="formSetLanguage();" >
 </table>
@@ -253,8 +253,8 @@ icoon links, schuif het op map naar gewenste positie).
 
 <div class="hideshow_box">
 <span class="hideshow_title">Zoek Route</span>
-<input type="button" title="Zoek de kortste route" id="shortest" value="Kortste Route" onclick="findRoute('shortest');">
-<input type="button" title="Zoek de snelste route" id="quickest" value="Snelste Route" onclick="findRoute('quickest');">
+<input type="button" title="Zoek de kortste route" id="shortest" value="Kortste Route" onclick="findRoute('shortest');" disabled="disabled">
+<input type="button" title="Zoek de snelste route" id="quickest" value="Snelste Route" onclick="findRoute('quickest');" disabled="disabled">
 </div>
 
 <div class="hideshow_box">
@@ -273,12 +273,12 @@ icoon links, schuif het op map naar gewenste positie).
 <b>Quick Start</b>
 <br>
 Click op marker-icoontje (Waypoints) om ze op de map te plaatsen (rechts).
-Sleep ze vervolgens naar de gewenste positie. 
-Het is best om eerst naar straat niveau te zoomen op de kaart. 
+Sleep ze vervolgens naar de gewenste positie.
+Het is best om eerst naar straat niveau te zoomen op de kaart.
 Selecteer het transport type, toegestane weg-types,
 snelheidslimieten, wegeigenschappen en andere restricties uit de
 opties.
-Selecteer "Kortste" of "Snelste" om de route te berekenen en te tekenen op de map. 
+Selecteer "Kortste" of "Snelste" om de route te berekenen en te tekenen op de map.
 <p>
 <b>Coordinaten (Waypoints)</b>
 <br>
@@ -295,7 +295,7 @@ Deze percentages kunnen ook nog eens manueel aangepast worden.
 <p>
 <b>Voorkeur Wegtype</b>
 <br>
-De voorkeur voor een bepaald type weg wordt uitgedrukt in een percentage. 
+De voorkeur voor een bepaald type weg wordt uitgedrukt in een percentage.
 Bijvoorbeeld wanneer u het Transport Type "Fiets" kiest, dan zal er
 voor Autostrade 0% staan, en voor Fietspad 100%.
 Wanneer u Autowegen, Nationale wegen wil vermijden of beperken bij
diff --git a/web/www/routino/router.html.en b/web/www/routino/router.html.ru
similarity index 82%
copy from web/www/routino/router.html.en
copy to web/www/routino/router.html.ru
index 0cb348a..8da81b2 100644
--- a/web/www/routino/router.html.en
+++ b/web/www/routino/router.html.ru
@@ -54,7 +54,7 @@ along with this program. If not, see http://www.gnu.org/licenses/.
 <div class="left_panel">
 
 <div class="tab_box">
-<span id="tab_options" onclick="tab_select('options');" class="tab_selected" title="Set routing options">Options</span>
+<span id="tab_options" onclick="tab_select('options');" class="tab_selected" title="Задать настройки маршрутизации">Options</span>
 <span id="tab_results" onclick="tab_select('results');" class="tab_unselected" title="See routing results">Results</span>
 <span id="tab_data" onclick="tab_select('data');" class="tab_unselected" title="View database information">Data</span>
 </div>
@@ -69,23 +69,23 @@ Select start and end points (click on the marker icons below), select routing pr
 <div class="center">
 <a target="other" href="http://www.routino.org/">Routino Website</a>
 |
-<a target="other" href="documentation/">Documentation</a>
+<a target="other" href="documentation/">Документация</a>
 </div>
 </div>
 
 <div class="hideshow_box">
 <span id="hideshow_language_show" onclick="hideshow_show('language');" class="hideshow_show">+</span>
 <span id="hideshow_language_hide" onclick="hideshow_hide('language');" class="hideshow_hide">-</span>
-<span class="hideshow_title">Language</span>
+<span class="hideshow_title">Язык</span>
 
 <div id="hideshow_language_div" style="display: none;">
 <table>
 <tr>
 <td><a id="lang_en_url" href="router.html.en" title="English language webpage">English</a>
 <td>(EN)
-<td><input name="language" type="radio" value="en" onchange="formSetLanguage();" checked>
+<td><input name="language" type="radio" value="en" onchange="formSetLanguage();" >
 <tr>
-<td><a id="lang_de_url" href="router.html.de" title="Deutsche Webseite">Deutsche</a>
+<td><a id="lang_de_url" href="router.html.de" title="Deutsche Webseite">Deutsch</a>
 <td>(DE)
 <td><input name="language" type="radio" value="de" onchange="formSetLanguage();" >
 <tr>
@@ -97,9 +97,9 @@ Select start and end points (click on the marker icons below), select routing pr
 <td>(NL)
 <td><input name="language" type="radio" value="nl" onchange="formSetLanguage();" >
 <tr>
-<td>
+<td><a id="lang_ru_url" href="router.html.ru" title="Русский">Русский</a>
 <td>(RU)
-<td><input name="language" type="radio" value="ru" onchange="formSetLanguage();" >
+<td><input name="language" type="radio" value="ru" onchange="formSetLanguage();" checked>
 </table>
 <a target="translation" href="http://www.routino.org/translations/">Routino Translations</a>
 </div>
@@ -153,17 +153,17 @@ Select start and end points (click on the marker icons below), select routing pr
 <div class="hideshow_box">
 <span id="hideshow_transport_show" onclick="hideshow_show('transport');" class="hideshow_hide">+</span>
 <span id="hideshow_transport_hide" onclick="hideshow_hide('transport');" class="hideshow_show">-</span>
-<span class="hideshow_title">Transport Type</span>
+<span class="hideshow_title">Тип транспорта</span>
 <div id="hideshow_transport_div">
 <table>
 <tr><td>Foot: <td><input name="transport" type="radio" value="foot" onchange="formSetTransport('foot' );">
-<tr><td>Horse: <td><input name="transport" type="radio" value="horse" onchange="formSetTransport('horse' );">
-<tr><td>Wheelchair:<td><input name="transport" type="radio" value="wheelchair" onchange="formSetTransport('wheelchair');">
-<tr><td>Bicycle: <td><input name="transport" type="radio" value="bicycle" onchange="formSetTransport('bicycle' );">
-<tr><td>Moped: <td><input name="transport" type="radio" value="moped" onchange="formSetTransport('moped' );">
-<tr><td>Motorcycle:<td><input name="transport" type="radio" value="motorcycle" onchange="formSetTransport('motorcycle');">
+<tr><td>Лошадь: <td><input name="transport" type="radio" value="horse" onchange="formSetTransport('horse' );">
+<tr><td>Инвалидное кресло:<td><input name="transport" type="radio" value="wheelchair" onchange="formSetTransport('wheelchair');">
+<tr><td>Велосипед: <td><input name="transport" type="radio" value="bicycle" onchange="formSetTransport('bicycle' );">
+<tr><td>Мопед: <td><input name="transport" type="radio" value="moped" onchange="formSetTransport('moped' );">
+<tr><td>Мотоцикл:<td><input name="transport" type="radio" value="motorcycle" onchange="formSetTransport('motorcycle');">
 <tr><td>Motorcar: <td><input name="transport" type="radio" value="motorcar" onchange="formSetTransport('motorcar' );">
-<tr><td>Goods: <td><input name="transport" type="radio" value="goods" onchange="formSetTransport('goods' );">
+<tr><td>Товары: <td><input name="transport" type="radio" value="goods" onchange="formSetTransport('goods' );">
 <tr><td>HGV: <td><input name="transport" type="radio" value="hgv" onchange="formSetTransport('hgv' );">
 <tr><td>PSV: <td><input name="transport" type="radio" value="psv" onchange="formSetTransport('psv' );">
 </table>
@@ -176,7 +176,7 @@ Select start and end points (click on the marker icons below), select routing pr
 <span class="hideshow_title">Highway Preferences</span>
 <div id="hideshow_highway_div" style="display: none;">
 <table>
-<tr><td>Motorway: <td><input name="highway-motorway" type="text" size="3" onchange="formSetHighway('motorway' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetHighway('motorway' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetHighway('motorway' ,'+');">
+<tr><td>Автомагистраль: <td><input name="highway-motorway" type="text" size="3" onchange="formSetHighway('motorway' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetHighway('motorway' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetHighway('motorway' ,'+');">
 <tr><td>Trunk: <td><input name="highway-trunk" type="text" size="3" onchange="formSetHighway('trunk' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetHighway('trunk' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetHighway('trunk' ,'+');">
 <tr><td>Primary: <td><input name="highway-primary" type="text" size="3" onchange="formSetHighway('primary' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetHighway('primary' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetHighway('primary' ,'+');">
 <tr><td>Secondary: <td><input name="highway-secondary" type="text" size="3" onchange="formSetHighway('secondary' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetHighway('secondary' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetHighway('secondary' ,'+');">
@@ -196,10 +196,10 @@ Select start and end points (click on the marker icons below), select routing pr
 <div class="hideshow_box">
 <span id="hideshow_speed_show" onclick="hideshow_show('speed');" class="hideshow_show">+</span>
 <span id="hideshow_speed_hide" onclick="hideshow_hide('speed');" class="hideshow_hide">-</span>
-<span class="hideshow_title">Speed Limits</span>
+<span class="hideshow_title">Ограничения скорости</span>
 <div id="hideshow_speed_div" style="display: none;">
 <table>
-<tr><td>Motorway: <td><input name="speed-motorway" type="text" size="3" onchange="formSetSpeed('motorway' ,'=');"><td>km/hr<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetSpeed('motorway' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetSpeed('motorway' ,'+');">
+<tr><td>Автомагистраль: <td><input name="speed-motorway" type="text" size="3" onchange="formSetSpeed('motorway' ,'=');"><td>km/hr<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetSpeed('motorway' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetSpeed('motorway' ,'+');">
 <tr><td>Trunk: <td><input name="speed-trunk" type="text" size="3" onchange="formSetSpeed('trunk' ,'=');"><td>km/hr<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetSpeed('trunk' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetSpeed('trunk' ,'+');">
 <tr><td>Primary: <td><input name="speed-primary" type="text" size="3" onchange="formSetSpeed('primary' ,'=');"><td>km/hr<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetSpeed('primary' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetSpeed('primary' ,'+');">
 <tr><td>Secondary: <td><input name="speed-secondary" type="text" size="3" onchange="formSetSpeed('secondary' ,'=');"><td>km/hr<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetSpeed('secondary' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetSpeed('secondary' ,'+');">
@@ -224,10 +224,10 @@ Select start and end points (click on the marker icons below), select routing pr
 <table>
 <tr><td>Paved: <td><input name="property-paved" type="text" size="3" onchange="formSetProperty('paved' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetProperty('paved' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetProperty('paved' ,'+');">
 <tr><td>Multiple Lanes: <td><input name="property-multilane" type="text" size="3" onchange="formSetProperty('multilane' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetProperty('multilane' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetProperty('multilane' ,'+');">
-<tr><td>Bridge: <td><input name="property-bridge" type="text" size="3" onchange="formSetProperty('bridge' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetProperty('bridge' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetProperty('bridge' ,'+');">
-<tr><td>Tunnel: <td><input name="property-tunnel" type="text" size="3" onchange="formSetProperty('tunnel' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetProperty('tunnel' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetProperty('tunnel' ,'+');">
-<tr><td>Walking Route:<td><input name="property-footroute" type="text" size="3" onchange="formSetProperty('footroute' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetProperty('footroute' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetProperty('footroute' ,'+');">
-<tr><td>Bicycle Route:<td><input name="property-bicycleroute" type="text" size="3" onchange="formSetProperty('bicycleroute','=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetProperty('bicycleroute','-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetProperty('bicycleroute','+');">
+<tr><td>Мост: <td><input name="property-bridge" type="text" size="3" onchange="formSetProperty('bridge' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetProperty('bridge' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetProperty('bridge' ,'+');">
+<tr><td>Туннель: <td><input name="property-tunnel" type="text" size="3" onchange="formSetProperty('tunnel' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetProperty('tunnel' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetProperty('tunnel' ,'+');">
+<tr><td>Пеший маршрут:<td><input name="property-footroute" type="text" size="3" onchange="formSetProperty('footroute' ,'=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetProperty('footroute' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetProperty('footroute' ,'+');">
+<tr><td>Велодорожка:<td><input name="property-bicycleroute" type="text" size="3" onchange="formSetProperty('bicycleroute','=');"><td>%<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetProperty('bicycleroute','-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetProperty('bicycleroute','+');">
 </table>
 </div>
 </div>
@@ -235,25 +235,25 @@ Select start and end points (click on the marker icons below), select routing pr
 <div class="hideshow_box">
 <span id="hideshow_restriction_show" onclick="hideshow_show('restriction');" class="hideshow_show">+</span>
 <span id="hideshow_restriction_hide" onclick="hideshow_hide('restriction');" class="hideshow_hide">-</span>
-<span class="hideshow_title">Other Restrictions</span>
+<span class="hideshow_title">Другие ограничения</span>
 <div id="hideshow_restriction_div" style="display: none;">
 <table>
-<tr><td>Obey oneway streets: <td><input name="restrict-oneway" type="checkbox" onchange="formSetRestriction('oneway');">
+<tr><td>Односторонняя улица: <td><input name="restrict-oneway" type="checkbox" onchange="formSetRestriction('oneway');">
 <tr><td>Obey turn restrictions:<td><input name="restrict-turns" type="checkbox" onchange="formSetRestriction('turns' );">
 </table>
 <table>
-<tr><td>Weight:<td><input name="restrict-weight" type="text" size="3" onchange="formSetRestriction('weight','=');"><td>tonnes<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetRestriction('weight','-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetRestriction('weight','+');">
-<tr><td>Height:<td><input name="restrict-height" type="text" size="3" onchange="formSetRestriction('height','=');"><td>metres<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetRestriction('height','-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetRestriction('height','+');">
-<tr><td>Width: <td><input name="restrict-width" type="text" size="3" onchange="formSetRestriction('width' ,'=');"><td>metres<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetRestriction('width' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetRestriction('width' ,'+');">
-<tr><td>Length:<td><input name="restrict-length" type="text" size="3" onchange="formSetRestriction('length','=');"><td>metres<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetRestriction('length','-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetRestriction('length','+');">
+<tr><td>Вес:<td><input name="restrict-weight" type="text" size="3" onchange="formSetRestriction('weight','=');"><td>tonnes<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetRestriction('weight','-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetRestriction('weight','+');">
+<tr><td>Высота:<td><input name="restrict-height" type="text" size="3" onchange="formSetRestriction('height','=');"><td>metres<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetRestriction('height','-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetRestriction('height','+');">
+<tr><td>Ширина: <td><input name="restrict-width" type="text" size="3" onchange="formSetRestriction('width' ,'=');"><td>metres<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetRestriction('width' ,'-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetRestriction('width' ,'+');">
+<tr><td>Длина:<td><input name="restrict-length" type="text" size="3" onchange="formSetRestriction('length','=');"><td>metres<td><img alt="<" src="icons/waypoint-left.png" title="-" onmousedown="formSetRestriction('length','-');">–/+<img alt=">" src="icons/waypoint-right.png" title="+" onmousedown="formSetRestriction('length','+');">
 </table>
 </div>
 </div>
 
 <div class="hideshow_box">
 <span class="hideshow_title">Find</span>
-<input type="button" title="Find shortest route" id="shortest" value="Shortest Route" onclick="findRoute('shortest');">
-<input type="button" title="Find quickest route" id="quickest" value="Quickest Route" onclick="findRoute('quickest');">
+<input type="button" title="Найти кратчайший маршрут" id="shortest" value="Кратчайший маршрут" onclick="findRoute('shortest');" disabled="disabled">
+<input type="button" title="Найти быстрейший маршут" id="quickest" value="Быстрейший маршрут" onclick="findRoute('quickest');" disabled="disabled">
 </div>
 
 <div class="hideshow_box">
@@ -266,7 +266,7 @@ Select start and end points (click on the marker icons below), select routing pr
 <div class="hideshow_box">
 <span id="hideshow_help_options_show" onclick="hideshow_show('help_options');" class="hideshow_hide">+</span>
 <span id="hideshow_help_options_hide" onclick="hideshow_hide('help_options');" class="hideshow_show">-</span>
-<span class="hideshow_title">Help</span>
+<span class="hideshow_title">Помощь</span>
 <div id="hideshow_help_options_div">
 <div class="scrollable">
 <b>Quick Start</b>
@@ -331,7 +331,7 @@ one-way restrictions (e.g. if walking).
 <div class="tab_content" id="tab_results_div" style="display: none;">
 
 <div class="hideshow_box">
-<span class="hideshow_title">Status</span>
+<span class="hideshow_title">Статус</span>
 <div id="result_status">
 <div id="result_status_not_run">
 <b><i>Router not run</i></b>
@@ -358,7 +358,7 @@ one-way restrictions (e.g. if walking).
 <div class="hideshow_box">
 <span id="hideshow_shortest_show" onclick="hideshow_show('shortest');" class="hideshow_show">+</span>
 <span id="hideshow_shortest_hide" onclick="hideshow_hide('shortest');" class="hideshow_hide">-</span>
-<span class="hideshow_title">Shortest Route</span>
+<span class="hideshow_title">Кратчайший маршрут</span>
 <div id="shortest_status">
 <div id="shortest_status_no_info">
 <b><i>No Information</i></b>
@@ -385,7 +385,7 @@ one-way restrictions (e.g. if walking).
 <div class="hideshow_box">
 <span id="hideshow_quickest_show" onclick="hideshow_show('quickest');" class="hideshow_show">+</span>
 <span id="hideshow_quickest_hide" onclick="hideshow_hide('quickest');" class="hideshow_hide">-</span>
-<span class="hideshow_title">Quickest Route</span>
+<span class="hideshow_title">Быстрейший маршрут</span>
 <div id="quickest_status">
 <div id="quickest_status_no_info">
 <b><i>No Information</i></b>
@@ -412,7 +412,7 @@ one-way restrictions (e.g. if walking).
 <div class="hideshow_box">
 <span id="hideshow_help_route_show" onclick="hideshow_show('help_route');" class="hideshow_hide">+</span>
 <span id="hideshow_help_route_hide" onclick="hideshow_hide('help_route');" class="hideshow_show">-</span>
-<span class="hideshow_title">Help</span>
+<span class="hideshow_title">Помощь</span>
 <div id="hideshow_help_route_div">
 <div class="scrollable">
 <b>Quick Start</b>
@@ -485,7 +485,7 @@ Router: <a href="http://www.routino.org/" target="routino">Routino</a>
 |
 Geo Data: <span id="attribution_data"></span>
 |
-Tiles: <span id="attribution_tile"></span>
+Тайлы: <span id="attribution_tile"></span>
 </div>
 </div>
 
diff --git a/web/www/routino/router.leaflet.js b/web/www/routino/router.leaflet.js
index 3c93f32..a3b2328 100644
--- a/web/www/routino/router.leaflet.js
+++ b/web/www/routino/router.leaflet.js
@@ -279,6 +279,8 @@ function form_init()            // called from router.html
    }
 
  updateURLs();
+
+ updateSearchButtons();
 }
 
 
@@ -932,6 +934,8 @@ function markerToggleMap(marker) // called from router.html
    }
 
  markerAddRemoveMap(marker,!routino.point[marker].active);
+
+ updateSearchButtons();
 }
 
 
@@ -1065,6 +1069,8 @@ function markerRemove(marker)   // called from router.html
 
  if(vismarkers==1)
     markerAddAfter(1);
+
+ updateSearchButtons();
 }
 
 
@@ -1074,11 +1080,11 @@ function markerRemove(marker)   // called from router.html
 
 function markerAddBefore(marker)
 {
- clearSearchResult(marker);
-
  if(vismarkers==mapprops.maxmarkers || marker==1)
     return false;
 
+ clearSearchResult(marker);
+
  markerAddForm(++vismarkers);
 
  for(var m=vismarkers;m>marker;m--)
@@ -1094,11 +1100,11 @@ function markerAddBefore(marker)
 
 function markerAddAfter(marker) // called from router.html
 {
- clearSearchResult(marker);
-
  if(vismarkers==mapprops.maxmarkers)
     return false;
 
+ clearSearchResult(marker);
+
  markerAddForm(++vismarkers);
 
  for(var m=vismarkers;m>(marker+1);m--)
@@ -1145,6 +1151,31 @@ function markerLocate(marker)   // called from router.html
 
 
 //
+// Update the search buttons enable/disable.
+//
+
+function updateSearchButtons()
+{
+ var markersactive=0;
+
+ for(var m=1;m<=vismarkers;m++)
+    if(routino.point[m].active)
+       markersactive++;
+
+ if(markersactive<2)
+   {
+    document.getElementById("shortest").disabled="disabled";
+    document.getElementById("quickest").disabled="disabled";
+   }
+ else
+   {
+    document.getElementById("shortest").disabled="";
+    document.getElementById("quickest").disabled="";
+   }
+}
+
+
+//
 // Update an icon to set colours and home or normal marker.
 //
 
@@ -1360,7 +1391,15 @@ function markersLoop()          // called from router.html
     return false;
 
  if(routino.point[vismarkers].lon==routino.point[1].lon && routino.point[vismarkers].lat==routino.point[1].lat)
-    return false;
+   {
+    if(routino.point[vismarkers].active)
+       return false;
+    else
+      {
+       markerToggleMap(vismarkers);
+       return true;
+      }
+   }
 
  if(routino.point[vismarkers].used)
     markerAddForm(++vismarkers);
@@ -1370,6 +1409,8 @@ function markersLoop()          // called from router.html
  markersmoved=true;
 
  updateURLs();
+
+ updateSearchButtons();
 }
 
 
@@ -1411,6 +1452,7 @@ function markerClearForm(marker)
 
  routino.point[marker].used=false;
  routino.point[marker].home=false;
+ routino.point[marker].active=false;
 }
 
 
diff --git a/web/www/routino/router.openlayers.js b/web/www/routino/router.openlayers.js
index ec65f58..0ef7d88 100644
--- a/web/www/routino/router.openlayers.js
+++ b/web/www/routino/router.openlayers.js
@@ -279,6 +279,8 @@ function form_init()            // called from router.html
    }
 
  updateURLs();
+
+ updateSearchButtons();
 }
 
 
@@ -999,6 +1001,8 @@ function markerToggleMap(marker) // called from router.html
    }
 
  markerAddRemoveMap(marker,!routino.point[marker].active);
+
+ updateSearchButtons();
 }
 
 
@@ -1134,6 +1138,8 @@ function markerRemove(marker)   // called from router.html
 
  if(vismarkers==1)
     markerAddAfter(1);
+
+ updateSearchButtons();
 }
 
 
@@ -1143,11 +1149,11 @@ function markerRemove(marker)   // called from router.html
 
 function markerAddBefore(marker)
 {
- clearSearchResult(marker);
-
  if(vismarkers==mapprops.maxmarkers || marker==1)
     return false;
 
+ clearSearchResult(marker);
+
  markerAddForm(++vismarkers);
 
  for(var m=vismarkers;m>marker;m--)
@@ -1163,11 +1169,11 @@ function markerAddBefore(marker)
 
 function markerAddAfter(marker) // called from router.html
 {
- clearSearchResult(marker);
-
  if(vismarkers==mapprops.maxmarkers)
     return false;
 
+ clearSearchResult(marker);
+
  markerAddForm(++vismarkers);
 
  for(var m=vismarkers;m>(marker+1);m--)
@@ -1214,6 +1220,31 @@ function markerLocate(marker)   // called from router.html
 
 
 //
+// Update the search buttons enable/disable.
+//
+
+function updateSearchButtons()
+{
+ var markersactive=0;
+
+ for(var m=1;m<=vismarkers;m++)
+    if(routino.point[m].active)
+       markersactive++;
+
+ if(markersactive<2)
+   {
+    document.getElementById("shortest").disabled="disabled";
+    document.getElementById("quickest").disabled="disabled";
+   }
+ else
+   {
+    document.getElementById("shortest").disabled="";
+    document.getElementById("quickest").disabled="";
+   }
+}
+
+
+//
 // Update an icon to set colours and home or normal marker.
 //
 
@@ -1429,7 +1460,15 @@ function markersLoop()          // called from router.html
     return false;
 
  if(routino.point[vismarkers].lon==routino.point[1].lon && routino.point[vismarkers].lat==routino.point[1].lat)
-    return false;
+   {
+    if(routino.point[vismarkers].active)
+       return false;
+    else
+      {
+       markerToggleMap(vismarkers);
+       return true;
+      }
+   }
 
  if(routino.point[vismarkers].used)
     markerAddForm(++vismarkers);
@@ -1439,6 +1478,8 @@ function markersLoop()          // called from router.html
  markersmoved=true;
 
  updateURLs();
+
+ updateSearchButtons();
 }
 
 
@@ -1480,6 +1521,7 @@ function markerClearForm(marker)
 
  routino.point[marker].used=false;
  routino.point[marker].home=false;
+ routino.point[marker].active=false;
 }
 
 
diff --git a/web/www/routino/search.cgi b/web/www/routino/search.cgi
index 7189d39..95b40c1 100755
--- a/web/www/routino/search.cgi
+++ b/web/www/routino/search.cgi
@@ -85,7 +85,7 @@ my($search_time,$search_message, at places)=RunSearch($search,$lonmin,$lonmax,$latm
 
 # Return the output
 
-print header('text/plain');
+print header(-type=>'text/plain',-charset=>'utf-8');
 
 print "$marker\n";
 print "$search_time\n";
diff --git a/web/www/routino/search.pl b/web/www/routino/search.pl
index 18bb20f..1f4dbb4 100644
--- a/web/www/routino/search.pl
+++ b/web/www/routino/search.pl
@@ -24,6 +24,9 @@ use strict;
 # Use the directory paths script
 require "paths.pl";
 
+# Use the perl encoding/decoding functions
+use Encode qw(decode encode);
+
 # Use the perl URI module
 use URI::Escape;
 
@@ -108,7 +111,7 @@ sub DoNominatimSearch
      {
       my $lat=$place->{"lat"};
       my $lon=$place->{"lon"};
-      my $name=$place->{"display_name"};
+      my $name=encode('utf8',$place->{"display_name"});
 
       push(@places,"$lat $lon $name");
      }
diff --git a/web/www/routino/visualiser.cgi b/web/www/routino/visualiser.cgi
index 54b91cf..d287947 100755
--- a/web/www/routino/visualiser.cgi
+++ b/web/www/routino/visualiser.cgi
@@ -42,7 +42,7 @@ my %legalparams=(
                  "latmax" => "[-0-9.]+",
                  "lonmin" => "[-0-9.]+",
                  "lonmax" => "[-0-9.]+",
-                 "data"   => "(junctions|super|oneway|highway-.*|transport-.*|barrier-.*|turns|speed|weight|height|width|length|property-.*|errorlogs)",
+                 "data"   => "(junctions|super|waytype-.*|highway-.*|transport-.*|barrier-.*|turns|speed|weight|height|width|length|property-.*|errorlogs)",
                  "dump"   => "(node|segment|turn-relation|errorlog)[0-9]+"
                 );
 
@@ -87,7 +87,7 @@ if(defined $data)
    my %limits=(
                "junctions" => 0.2,
                "super"     => 0.2,
-               "oneway"    => 0.2,
+               "waytype"   => 0.2,
                "highway"   => 0.2,
                "transport" => 0.2,
                "barrier"   => 0.3,
@@ -115,6 +115,7 @@ if(defined $data)
      }
 
    my $subdata=$data;
+   $subdata="waytype"   if($data =~ m%waytype-%);
    $subdata="highway"   if($data =~ m%highway-%);
    $subdata="transport" if($data =~ m%transport-%);
    $subdata="barrier"   if($data =~ m%barrier-%);
diff --git a/web/www/routino/visualiser.html.de b/web/www/routino/visualiser.html.de
index 8b8782a..b2aa6b6 100644
--- a/web/www/routino/visualiser.html.de
+++ b/web/www/routino/visualiser.html.de
@@ -6,7 +6,7 @@
 <meta name="keywords" content="openstreetmap routino verifier">
 <meta name="viewport" content="width=device-width, height=device-height, initial-scale=1, user-scalable=no">
 
-<title>Routino : Data Visualiser for Routing Data</title>
+<title>Routino : Visualisierung der Routing-Daten</title>
 
 <!--
 Routino data visualiser web page.
@@ -83,7 +83,7 @@ Only data relevant for routing is displayed and some will therefore be excluded.
 <td><a id="lang_en_url" href="visualiser.html.en" title="English language webpage">English</a>
 <td>(EN)
 <tr>
-<td><a id="lang_de_url" href="visualiser.html.de" title="Deutsche Webseite">Deutsche</a>
+<td><a id="lang_de_url" href="visualiser.html.de" title="Deutsche Webseite">Deutsch</a>
 <td>(DE)
 <tr>
 <td><a id="lang_fr_url" href="visualiser.html.fr" title="Francais">Francais</a>
@@ -92,7 +92,7 @@ Only data relevant for routing is displayed and some will therefore be excluded.
 <td><a id="lang_nl_url" href="visualiser.html.nl" title="Nederlandse web pagina">Nederlands</a>
 <td>(NL)
 <tr>
-<td>
+<td><a id="lang_ru_url" href="visualiser.html.ru" title="Русский">Русский</a>
 <td>(RU)
 </table>
 <a target="translation" href="http://www.routino.org/translations/">Routino Translations</a>
@@ -100,7 +100,7 @@ Only data relevant for routing is displayed and some will therefore be excluded.
 </div>
 
 <div class="hideshow_box">
-<span class="hideshow_title">Instructions</span>
+<span class="hideshow_title">Anweisungen</span>
 Zoom in and then use the buttons below to download the data. The
 server will only return data if the selected area is small enough.
 </div>
@@ -109,42 +109,42 @@ server will only return data if the selected area is small enough.
 <span class="hideshow_title">Status</span>
 <div id="result_status">
 <div id="result_status_no_data">
-<b><i>No data displayed</i></b>
+<b><i>Keine Daten angezeigt</i></b>
 </div>
 <div id="result_status_data" style="display: none;">
 </div>
 <div id="result_status_failed" style="display: none;">
-<b>Failed to get visualiser data!</b>
+<b>Fehler bei der Erstellung der visuellen Daten!</b>
 </div>
 <div id="result_status_junctions" style="display: none;">
-<b>Processed # junctions</b>
+<b># Kreuzungen verarbeitet</b>
 </div>
 <div id="result_status_super" style="display: none;">
-<b>Processed # super-nodes/segments</b>
+<b># Super-Knoten/Segmente verarbeitet</b>
 </div>
-<div id="result_status_oneway" style="display: none;">
-<b>Processed # oneway segments</b>
+<div id="result_status_waytype" style="display: none;">
+<b># Wegtypen Segmente verarbeitet</b>
 </div>
 <div id="result_status_highway" style="display: none;">
-<b>Processed # segments</b>
+<b># Segmente verarbeitet</b>
 </div>
 <div id="result_status_transport" style="display: none;">
-<b>Processed # segments</b>
+<b># Segmente verarbeitet</b>
 </div>
 <div id="result_status_barrier" style="display: none;">
-<b>Processed # nodes</b>
+<b># Knoten verarbeitet</b>
 </div>
 <div id="result_status_turns" style="display: none;">
-<b>Processed # turn restrictions</b>
+<b># Abbiegebeschrängkungen verarbeitet</b>
 </div>
 <div id="result_status_limit" style="display: none;">
 <b>Processed # limit changes</b>
 </div>
 <div id="result_status_property" style="display: none;">
-<b>Processed # segments</b>
+<b># Segmente verarbeitet</b>
 </div>
 <div id="result_status_errorlogs" style="display: none;">
-<b>Processed # error logs</b>
+<b># Error Logs erstellt</b>
 </div>
 </div>
 </div>
@@ -152,20 +152,20 @@ server will only return data if the selected area is small enough.
 <div class="hideshow_box">
 <span id="hideshow_junctions_show" onclick="hideshow_show('junctions');" class="hideshow_show">+</span>
 <span id="hideshow_junctions_hide" onclick="hideshow_hide('junctions');" class="hideshow_hide">-</span>
-<input type="button" id="junctions" onclick="displayData('junctions');" value="Display Junctions">
+<input type="button" id="junctions" onclick="displayData('junctions');" value="Kreuzungen anzeigen">
 <div id="hideshow_junctions_div" style="display: none;">
 Each node that is a dead-end, a junction of two highways of different
 types (or different properties) or a junction where more than two segments
-join are shown colour-coded:
+join are shown colour-coded.
 <br>
 <table>
 <tr><td><img src="icons/ball-1.png" alt="1" ><td>only one highway - a dead-end.
-<tr><td><img src="icons/ball-2.png" alt="2" ><td>two highways of different types meet.
-<tr><td><img src="icons/ball-3.png" alt="3" ><td>three highways meet.
-<tr><td><img src="icons/ball-4.png" alt="4" ><td>four highways meet.
-<tr><td><img src="icons/ball-5.png" alt="5" ><td>five highways meet.
-<tr><td><img src="icons/ball-6.png" alt="6" ><td>six highways meet.
-<tr><td><img src="icons/ball-7.png" alt="7+"><td>seven (or more) highways meet.
+<tr><td><img src="icons/ball-2.png" alt="2" ><td>Aufeinandertreffen zweier Wege unterschiedlichen Typs.
+<tr><td><img src="icons/ball-3.png" alt="3" ><td>Aufeinandertreffen von drei Wegen.
+<tr><td><img src="icons/ball-4.png" alt="4" ><td>Aufeinandertreffen von vier Wegen.
+<tr><td><img src="icons/ball-5.png" alt="5" ><td>Aufeinandertreffen von fünf Wegen.
+<tr><td><img src="icons/ball-6.png" alt="6" ><td>Aufeinandertreffen von sechs Wegen.
+<tr><td><img src="icons/ball-7.png" alt="7+"><td>Aufeinandertreffen von sieben oder mehr Wegen.
 </table>
 </div>
 </div>
@@ -173,7 +173,7 @@ join are shown colour-coded:
 <div class="hideshow_box">
 <span id="hideshow_super_show" onclick="hideshow_show('super');" class="hideshow_show">+</span>
 <span id="hideshow_super_hide" onclick="hideshow_hide('super');" class="hideshow_hide">-</span>
-<input type="button" id="super" onclick="displayData('super');" value="Display Super Segments">
+<input type="button" id="super" onclick="displayData('super');" value="Super-Segments anzeigen">
 <div id="hideshow_super_div" style="display: none;">
 Each super-node and the associated super-segments are shown (see
 algorithm page for description).
@@ -181,13 +181,20 @@ algorithm page for description).
 </div>
 
 <div class="hideshow_box">
-<span id="hideshow_oneway_show" onclick="hideshow_show('oneway');" class="hideshow_show">+</span>
-<span id="hideshow_oneway_hide" onclick="hideshow_hide('oneway');" class="hideshow_hide">-</span>
-<input type="button" id="oneway" onclick="displayData('oneway');" value="Display One-way Segments">
-<div id="hideshow_oneway_div" style="display: none;">
-Each one-way segment is shown with a coloured triangle indicating the
-allowed direction. The colours of the triangles depend on the bearing
-of the highway segment.
+<span id="hideshow_waytype_show" onclick="hideshow_show('waytype');" class="hideshow_show">+</span>
+<span id="hideshow_waytype_hide" onclick="hideshow_hide('waytype');" class="hideshow_hide">-</span>
+<input type="button" id="waytype" onclick="displayData('waytype');" value="Display Way Type Segments">
+<div id="hideshow_waytype_div" style="display: none;">
+Each highway segment of special types (one-way, cycle-both-ways and roundabout) are
+shown. For one-way segments a coloured triangle indicates the allowed direction.
+The colours of the triangles depend on the bearing of the highway segment.
+<form name="waytypes" id="waytypes" action="#" method="get" onsubmit="return false;">
+<table>
+<tr><td>One-way segments: <td><input name="waytype" type="radio" value="oneway" onchange="displayData('waytype');" checked>
+<tr><td>Cycle-both-way segments:<td><input name="waytype" type="radio" value="cyclebothways" onchange="displayData('waytype');">
+<tr><td>Roundabout segments: <td><input name="waytype" type="radio" value="roundabout" onchange="displayData('waytype');">
+</table>
+</form>
 </div>
 </div>
 
@@ -200,18 +207,18 @@ Each segment of the chosen type of highway is drawn.
 <form name="highways" id="highways" action="#" method="get" onsubmit="return false;">
 <table>
 <tr><td>Autobahn: <td><input name="highway" type="radio" value="motorway" onchange="displayData('highway');">
-<tr><td>Schnellstraße: <td><input name="highway" type="radio" value="trunk" onchange="displayData('highway');">
-<tr><td>Bundesstraße: <td><input name="highway" type="radio" value="primary" onchange="displayData('highway');" checked>
-<tr><td>Landesstraße: <td><input name="highway" type="radio" value="secondary" onchange="displayData('highway');">
-<tr><td>Hauptstraße: <td><input name="highway" type="radio" value="tertiary" onchange="displayData('highway');">
-<tr><td>Straße:<td><input name="highway" type="radio" value="unclassified" onchange="displayData('highway');">
-<tr><td>Wohnstraße: <td><input name="highway" type="radio" value="residential" onchange="displayData('highway');">
+<tr><td>Schnellstraße: <td><input name="highway" type="radio" value="trunk" onchange="displayData('highway');">
+<tr><td>Bundesstraße: <td><input name="highway" type="radio" value="primary" onchange="displayData('highway');" checked>
+<tr><td>Landesstraße: <td><input name="highway" type="radio" value="secondary" onchange="displayData('highway');">
+<tr><td>Hauptstraße: <td><input name="highway" type="radio" value="tertiary" onchange="displayData('highway');">
+<tr><td>Straße:<td><input name="highway" type="radio" value="unclassified" onchange="displayData('highway');">
+<tr><td>Wohnstraße: <td><input name="highway" type="radio" value="residential" onchange="displayData('highway');">
 <tr><td>Zufahrtsweg: <td><input name="highway" type="radio" value="service" onchange="displayData('highway');">
 <tr><td>Feld-(Wald-)weg: <td><input name="highway" type="radio" value="track" onchange="displayData('highway');">
 <tr><td>Fahrradweg: <td><input name="highway" type="radio" value="cycleway" onchange="displayData('highway');">
 <tr><td>Weg: <td><input name="highway" type="radio" value="path" onchange="displayData('highway');">
-<tr><td>Fußweg: <td><input name="highway" type="radio" value="steps" onchange="displayData('highway');">
-<tr><td>Fähre: <td><input name="highway" type="radio" value="ferry" onchange="displayData('highway');">
+<tr><td>Fußweg: <td><input name="highway" type="radio" value="steps" onchange="displayData('highway');">
+<tr><td>Fähre: <td><input name="highway" type="radio" value="ferry" onchange="displayData('highway');">
 </table>
 </form>
 </div>
@@ -225,7 +232,7 @@ Each segment of the chosen type of highway is drawn.
 Each segment allowed for the chosen type of transport is drawn.
 <form name="transports" id="transports" action="#" method="get" onsubmit="return false;">
 <table>
-<tr><td>Fußgänger: <td><input name="transport" type="radio" value="foot" onchange="displayData('transport');">
+<tr><td>Fußgänger: <td><input name="transport" type="radio" value="foot" onchange="displayData('transport');">
 <tr><td>Reiter: <td><input name="transport" type="radio" value="horse" onchange="displayData('transport');">
 <tr><td>Rollstuhl:<td><input name="transport" type="radio" value="wheelchair" onchange="displayData('transport');">
 <tr><td>Fahrrad: <td><input name="transport" type="radio" value="bicycle" onchange="displayData('transport');">
@@ -248,7 +255,7 @@ Each segment allowed for the chosen type of transport is drawn.
 Each barrier blocking the chosen type of transport is drawn.
 <form name="barriers" id="barriers" action="#" method="get" onsubmit="return false;">
 <table>
-<tr><td>Fußgänger: <td><input name="barrier" type="radio" value="foot" onchange="displayData('barrier');">
+<tr><td>Fußgänger: <td><input name="barrier" type="radio" value="foot" onchange="displayData('barrier');">
 <tr><td>Reiter: <td><input name="barrier" type="radio" value="horse" onchange="displayData('barrier');">
 <tr><td>Rollstuhl:<td><input name="barrier" type="radio" value="wheelchair" onchange="displayData('barrier');">
 <tr><td>Fahrrad: <td><input name="barrier" type="radio" value="bicycle" onchange="displayData('barrier');">
@@ -299,7 +306,7 @@ along with the weight limit on relevant segments.
 <table>
 <tr><td><img src="icons/ball-1.png" alt="." ><td>Change of limit
 <tr><td><img src="icons/limit-no.png" alt="()" ><td>No specified limit
-<tr><td><img src="icons/limit-8.0.png" alt="(8.0)"><td>8.0 tonnes weight limit
+<tr><td><img src="icons/limit-8.0.png" alt="(8.0)"><td>8 Tonnen Wegbeschränkung
 </table>
 </div>
 </div>
@@ -307,7 +314,7 @@ along with the weight limit on relevant segments.
 <div class="hideshow_box">
 <span id="hideshow_height_show" onclick="hideshow_show('height');" class="hideshow_show">+</span>
 <span id="hideshow_height_hide" onclick="hideshow_hide('height');" class="hideshow_hide">-</span>
-<input type="button" id="height" onclick="displayData('height');" value="Display Height Limits">
+<input type="button" id="height" onclick="displayData('height');" value="Maximale Höhe anzeigen ">
 <div id="hideshow_height_div" style="display: none;">
 Each node that joins segments with different height limits is shown
 along with the height limit on relevant segments.
@@ -323,7 +330,7 @@ along with the height limit on relevant segments.
 <div class="hideshow_box">
 <span id="hideshow_width_show" onclick="hideshow_show('width');" class="hideshow_show">+</span>
 <span id="hideshow_width_hide" onclick="hideshow_hide('width');" class="hideshow_hide">-</span>
-<input type="button" id="width" onclick="displayData('width');" value="Display Width Limits">
+<input type="button" id="width" onclick="displayData('width');" value="Maximale Breite anzeigen">
 <div id="hideshow_width_div" style="display: none;">
 Each node that joins segments with different width limits is shown
 along with the width limit on relevant segments.
@@ -362,11 +369,10 @@ Each segment of the highways with a particular property is drawn.
 <table>
 <tr><td>befestigt: <td><input name="property" type="radio" value="paved" onchange="displayData('property');" checked>
 <tr><td>mehrspurig: <td><input name="property" type="radio" value="multilane" onchange="displayData('property');">
-<tr><td>Brücken: <td><input name="property" type="radio" value="bridge" onchange="displayData('property');">
+<tr><td>Brücken: <td><input name="property" type="radio" value="bridge" onchange="displayData('property');">
 <tr><td>Tunnel: <td><input name="property" type="radio" value="tunnel" onchange="displayData('property');">
 <tr><td>Wanderweg: <td><input name="property" type="radio" value="footroute" onchange="displayData('property');">
 <tr><td>Radweg: <td><input name="property" type="radio" value="bicycleroute" onchange="displayData('property');">
-<tr><td>Cycle Both Ways:<td><input name="property" type="radio" value="cyclebothways" onchange="displayData('property');">
 </table>
 </form>
 </div>
@@ -382,7 +388,7 @@ Potential problems found by Routino when processing the input data.
 </div>
 
 <div class="hideshow_box">
-<input type="button" id="clear" onclick="displayData('');" value="Clear data">
+<input type="button" id="clear" onclick="displayData('');" value="Daten zurücksetzen">
 </div>
 
 <div class="hideshow_box">
@@ -441,15 +447,15 @@ To perform routing on the map use the link below.
 <div class="map" id="map">
 <noscript>
 <p>
-Javascript is <em>required</em> to use this web page because of the interactive map.
+Um die interaktive Karte zu nutzen iWork Javascript benötigt. 
 </noscript>
 </div>
 <div class="attribution">
 Router: <a href="http://www.routino.org/" target="routino">Routino</a>
 |
-Geo Data: <span id="attribution_data"></span>
+Geodaten: <span id="attribution_data"></span>
 |
-Tiles: <span id="attribution_tile"></span>
+Kacheln: <span id="attribution_tile"></span>
 </div>
 </div>
 
diff --git a/web/www/routino/visualiser.html.en b/web/www/routino/visualiser.html.en
index c39f289..5401881 100644
--- a/web/www/routino/visualiser.html.en
+++ b/web/www/routino/visualiser.html.en
@@ -83,7 +83,7 @@ Only data relevant for routing is displayed and some will therefore be excluded.
 <td><a id="lang_en_url" href="visualiser.html.en" title="English language webpage">English</a>
 <td>(EN)
 <tr>
-<td><a id="lang_de_url" href="visualiser.html.de" title="Deutsche Webseite">Deutsche</a>
+<td><a id="lang_de_url" href="visualiser.html.de" title="Deutsche Webseite">Deutsch</a>
 <td>(DE)
 <tr>
 <td><a id="lang_fr_url" href="visualiser.html.fr" title="Francais">Francais</a>
@@ -92,7 +92,7 @@ Only data relevant for routing is displayed and some will therefore be excluded.
 <td><a id="lang_nl_url" href="visualiser.html.nl" title="Nederlandse web pagina">Nederlands</a>
 <td>(NL)
 <tr>
-<td>
+<td><a id="lang_ru_url" href="visualiser.html.ru" title="Русский">Русский</a>
 <td>(RU)
 </table>
 <a target="translation" href="http://www.routino.org/translations/">Routino Translations</a>
@@ -122,8 +122,8 @@ server will only return data if the selected area is small enough.
 <div id="result_status_super" style="display: none;">
 <b>Processed # super-nodes/segments</b>
 </div>
-<div id="result_status_oneway" style="display: none;">
-<b>Processed # oneway segments</b>
+<div id="result_status_waytype" style="display: none;">
+<b>Processed # way type segments</b>
 </div>
 <div id="result_status_highway" style="display: none;">
 <b>Processed # segments</b>
@@ -156,7 +156,7 @@ server will only return data if the selected area is small enough.
 <div id="hideshow_junctions_div" style="display: none;">
 Each node that is a dead-end, a junction of two highways of different
 types (or different properties) or a junction where more than two segments
-join are shown colour-coded:
+join are shown colour-coded.
 <br>
 <table>
 <tr><td><img src="icons/ball-1.png" alt="1" ><td>only one highway - a dead-end.
@@ -181,13 +181,20 @@ algorithm page for description).
 </div>
 
 <div class="hideshow_box">
-<span id="hideshow_oneway_show" onclick="hideshow_show('oneway');" class="hideshow_show">+</span>
-<span id="hideshow_oneway_hide" onclick="hideshow_hide('oneway');" class="hideshow_hide">-</span>
-<input type="button" id="oneway" onclick="displayData('oneway');" value="Display One-way Segments">
-<div id="hideshow_oneway_div" style="display: none;">
-Each one-way segment is shown with a coloured triangle indicating the
-allowed direction. The colours of the triangles depend on the bearing
-of the highway segment.
+<span id="hideshow_waytype_show" onclick="hideshow_show('waytype');" class="hideshow_show">+</span>
+<span id="hideshow_waytype_hide" onclick="hideshow_hide('waytype');" class="hideshow_hide">-</span>
+<input type="button" id="waytype" onclick="displayData('waytype');" value="Display Way Type Segments">
+<div id="hideshow_waytype_div" style="display: none;">
+Each highway segment of special types (one-way, cycle-both-ways and roundabout) are
+shown. For one-way segments a coloured triangle indicates the allowed direction.
+The colours of the triangles depend on the bearing of the highway segment.
+<form name="waytypes" id="waytypes" action="#" method="get" onsubmit="return false;">
+<table>
+<tr><td>One-way segments: <td><input name="waytype" type="radio" value="oneway" onchange="displayData('waytype');" checked>
+<tr><td>Cycle-both-way segments:<td><input name="waytype" type="radio" value="cyclebothways" onchange="displayData('waytype');">
+<tr><td>Roundabout segments: <td><input name="waytype" type="radio" value="roundabout" onchange="displayData('waytype');">
+</table>
+</form>
 </div>
 </div>
 
@@ -366,7 +373,6 @@ Each segment of the highways with a particular property is drawn.
 <tr><td>Tunnel: <td><input name="property" type="radio" value="tunnel" onchange="displayData('property');">
 <tr><td>Walking Route: <td><input name="property" type="radio" value="footroute" onchange="displayData('property');">
 <tr><td>Bicycle Route: <td><input name="property" type="radio" value="bicycleroute" onchange="displayData('property');">
-<tr><td>Cycle Both Ways:<td><input name="property" type="radio" value="cyclebothways" onchange="displayData('property');">
 </table>
 </form>
 </div>
diff --git a/web/www/routino/visualiser.html.fr b/web/www/routino/visualiser.html.fr
index e49b6ee..5372d87 100644
--- a/web/www/routino/visualiser.html.fr
+++ b/web/www/routino/visualiser.html.fr
@@ -83,7 +83,7 @@ Only data relevant for routing is displayed and some will therefore be excluded.
 <td><a id="lang_en_url" href="visualiser.html.en" title="English language webpage">English</a>
 <td>(EN)
 <tr>
-<td><a id="lang_de_url" href="visualiser.html.de" title="Deutsche Webseite">Deutsche</a>
+<td><a id="lang_de_url" href="visualiser.html.de" title="Deutsche Webseite">Deutsch</a>
 <td>(DE)
 <tr>
 <td><a id="lang_fr_url" href="visualiser.html.fr" title="Francais">Francais</a>
@@ -92,7 +92,7 @@ Only data relevant for routing is displayed and some will therefore be excluded.
 <td><a id="lang_nl_url" href="visualiser.html.nl" title="Nederlandse web pagina">Nederlands</a>
 <td>(NL)
 <tr>
-<td>
+<td><a id="lang_ru_url" href="visualiser.html.ru" title="Русский">Русский</a>
 <td>(RU)
 </table>
 <a target="translation" href="http://www.routino.org/translations/">Routino Translations</a>
@@ -122,8 +122,8 @@ server will only return data if the selected area is small enough.
 <div id="result_status_super" style="display: none;">
 <b>Processed # super-nodes/segments</b>
 </div>
-<div id="result_status_oneway" style="display: none;">
-<b>Processed # oneway segments</b>
+<div id="result_status_waytype" style="display: none;">
+<b>Processed # way type segments</b>
 </div>
 <div id="result_status_highway" style="display: none;">
 <b>Processed # segments</b>
@@ -156,7 +156,7 @@ server will only return data if the selected area is small enough.
 <div id="hideshow_junctions_div" style="display: none;">
 Each node that is a dead-end, a junction of two highways of different
 types (or different properties) or a junction where more than two segments
-join are shown colour-coded:
+join are shown colour-coded.
 <br>
 <table>
 <tr><td><img src="icons/ball-1.png" alt="1" ><td>only one highway - a dead-end.
@@ -181,13 +181,20 @@ algorithm page for description).
 </div>
 
 <div class="hideshow_box">
-<span id="hideshow_oneway_show" onclick="hideshow_show('oneway');" class="hideshow_show">+</span>
-<span id="hideshow_oneway_hide" onclick="hideshow_hide('oneway');" class="hideshow_hide">-</span>
-<input type="button" id="oneway" onclick="displayData('oneway');" value="Display One-way Segments">
-<div id="hideshow_oneway_div" style="display: none;">
-Each one-way segment is shown with a coloured triangle indicating the
-allowed direction. The colours of the triangles depend on the bearing
-of the highway segment.
+<span id="hideshow_waytype_show" onclick="hideshow_show('waytype');" class="hideshow_show">+</span>
+<span id="hideshow_waytype_hide" onclick="hideshow_hide('waytype');" class="hideshow_hide">-</span>
+<input type="button" id="waytype" onclick="displayData('waytype');" value="Display Way Type Segments">
+<div id="hideshow_waytype_div" style="display: none;">
+Each highway segment of special types (one-way, cycle-both-ways and roundabout) are
+shown. For one-way segments a coloured triangle indicates the allowed direction.
+The colours of the triangles depend on the bearing of the highway segment.
+<form name="waytypes" id="waytypes" action="#" method="get" onsubmit="return false;">
+<table>
+<tr><td>One-way segments: <td><input name="waytype" type="radio" value="oneway" onchange="displayData('waytype');" checked>
+<tr><td>Cycle-both-way segments:<td><input name="waytype" type="radio" value="cyclebothways" onchange="displayData('waytype');">
+<tr><td>Roundabout segments: <td><input name="waytype" type="radio" value="roundabout" onchange="displayData('waytype');">
+</table>
+</form>
 </div>
 </div>
 
@@ -204,8 +211,8 @@ Each segment of the chosen type of highway is drawn.
 <tr><td>Primaire: <td><input name="highway" type="radio" value="primary" onchange="displayData('highway');" checked>
 <tr><td>Secondaire: <td><input name="highway" type="radio" value="secondary" onchange="displayData('highway');">
 <tr><td>Tertiaire: <td><input name="highway" type="radio" value="tertiary" onchange="displayData('highway');">
-<tr><td>Non classée:<td><input name="highway" type="radio" value="unclassified" onchange="displayData('highway');">
-<tr><td>Résidentiel: <td><input name="highway" type="radio" value="residential" onchange="displayData('highway');">
+<tr><td>Non classée:<td><input name="highway" type="radio" value="unclassified" onchange="displayData('highway');">
+<tr><td>Résidentiel: <td><input name="highway" type="radio" value="residential" onchange="displayData('highway');">
 <tr><td>Service: <td><input name="highway" type="radio" value="service" onchange="displayData('highway');">
 <tr><td>Chemin: <td><input name="highway" type="radio" value="track" onchange="displayData('highway');">
 <tr><td>Voie cyclable: <td><input name="highway" type="radio" value="cycleway" onchange="displayData('highway');">
@@ -225,8 +232,8 @@ Each segment of the chosen type of highway is drawn.
 Each segment allowed for the chosen type of transport is drawn.
 <form name="transports" id="transports" action="#" method="get" onsubmit="return false;">
 <table>
-<tr><td>À pied: <td><input name="transport" type="radio" value="foot" onchange="displayData('transport');">
-<tr><td>À cheval: <td><input name="transport" type="radio" value="horse" onchange="displayData('transport');">
+<tr><td>À pied: <td><input name="transport" type="radio" value="foot" onchange="displayData('transport');">
+<tr><td>À cheval: <td><input name="transport" type="radio" value="horse" onchange="displayData('transport');">
 <tr><td>Fauteuil roulant:<td><input name="transport" type="radio" value="wheelchair" onchange="displayData('transport');">
 <tr><td>Bicyclette: <td><input name="transport" type="radio" value="bicycle" onchange="displayData('transport');">
 <tr><td>Mobilette: <td><input name="transport" type="radio" value="moped" onchange="displayData('transport');">
@@ -248,8 +255,8 @@ Each segment allowed for the chosen type of transport is drawn.
 Each barrier blocking the chosen type of transport is drawn.
 <form name="barriers" id="barriers" action="#" method="get" onsubmit="return false;">
 <table>
-<tr><td>À pied: <td><input name="barrier" type="radio" value="foot" onchange="displayData('barrier');">
-<tr><td>À cheval: <td><input name="barrier" type="radio" value="horse" onchange="displayData('barrier');">
+<tr><td>À pied: <td><input name="barrier" type="radio" value="foot" onchange="displayData('barrier');">
+<tr><td>À cheval: <td><input name="barrier" type="radio" value="horse" onchange="displayData('barrier');">
 <tr><td>Fauteuil roulant:<td><input name="barrier" type="radio" value="wheelchair" onchange="displayData('barrier');">
 <tr><td>Bicyclette: <td><input name="barrier" type="radio" value="bicycle" onchange="displayData('barrier');">
 <tr><td>Mobilette: <td><input name="barrier" type="radio" value="moped" onchange="displayData('barrier');">
@@ -360,13 +367,12 @@ along with the length limit on relevant segments.
 Each segment of the highways with a particular property is drawn.
 <form name="properties" id="properties" action="#" method="get" onsubmit="return false;">
 <table>
-<tr><td>Pavée: <td><input name="property" type="radio" value="paved" onchange="displayData('property');" checked>
+<tr><td>Pavée: <td><input name="property" type="radio" value="paved" onchange="displayData('property');" checked>
 <tr><td>Voies multiples: <td><input name="property" type="radio" value="multilane" onchange="displayData('property');">
 <tr><td>Pont: <td><input name="property" type="radio" value="bridge" onchange="displayData('property');">
 <tr><td>Tunnel: <td><input name="property" type="radio" value="tunnel" onchange="displayData('property');">
-<tr><td>Itinér. piéton: <td><input name="property" type="radio" value="footroute" onchange="displayData('property');">
-<tr><td>Itinér. cycle: <td><input name="property" type="radio" value="bicycleroute" onchange="displayData('property');">
-<tr><td>Cycle Both Ways:<td><input name="property" type="radio" value="cyclebothways" onchange="displayData('property');">
+<tr><td>Itinér. piéton: <td><input name="property" type="radio" value="footroute" onchange="displayData('property');">
+<tr><td>Itinér. cycle: <td><input name="property" type="radio" value="bicycleroute" onchange="displayData('property');">
 </table>
 </form>
 </div>
@@ -389,7 +395,7 @@ Potential problems found by Routino when processing the input data.
 <span class="hideshow_title">Liens</span>
 <a id="permalink_url" href="visualiser.html">Lien vers cet outil de visualisation</a>
 <br>
-<a id="edit_url" target="edit" style="display: none;">Editer cette donnée OSM</a>
+<a id="edit_url" target="edit" style="display: none;">Editer cette donnée OSM</a>
 </div>
 
 <div class="hideshow_box">
@@ -429,7 +435,7 @@ To perform routing on the map use the link below.
 <div class="hideshow_box">
 <span class="hideshow_title">Routino Statistiques</span>
 <div id="statistics_data"></div>
-<a id="statistics_link" href="statistics.cgi" onclick="displayStatistics();return(false);">Afficher les données statistiques</a>
+<a id="statistics_link" href="statistics.cgi" onclick="displayStatistics();return(false);">Afficher les données statistiques</a>
 </div>
 </div>
 
@@ -441,7 +447,7 @@ To perform routing on the map use the link below.
 <div class="map" id="map">
 <noscript>
 <p>
-Javascript est <em>nécessaire</em> pour cette page web à cause de la carte intéractive.
+Javascript est <em>nécessaire</em> pour cette page web à cause de la carte intéractive.
 </noscript>
 </div>
 <div class="attribution">
diff --git a/web/www/routino/visualiser.html.nl b/web/www/routino/visualiser.html.nl
index c262bc7..e49ced8 100644
--- a/web/www/routino/visualiser.html.nl
+++ b/web/www/routino/visualiser.html.nl
@@ -83,7 +83,7 @@ Only data relevant for routing is displayed and some will therefore be excluded.
 <td><a id="lang_en_url" href="visualiser.html.en" title="English language webpage">English</a>
 <td>(EN)
 <tr>
-<td><a id="lang_de_url" href="visualiser.html.de" title="Deutsche Webseite">Deutsche</a>
+<td><a id="lang_de_url" href="visualiser.html.de" title="Deutsche Webseite">Deutsch</a>
 <td>(DE)
 <tr>
 <td><a id="lang_fr_url" href="visualiser.html.fr" title="Francais">Francais</a>
@@ -92,7 +92,7 @@ Only data relevant for routing is displayed and some will therefore be excluded.
 <td><a id="lang_nl_url" href="visualiser.html.nl" title="Nederlandse web pagina">Nederlands</a>
 <td>(NL)
 <tr>
-<td>
+<td><a id="lang_ru_url" href="visualiser.html.ru" title="Русский">Русский</a>
 <td>(RU)
 </table>
 <a target="translation" href="http://www.routino.org/translations/">Routino Translations</a>
@@ -122,8 +122,8 @@ server will only return data if the selected area is small enough.
 <div id="result_status_super" style="display: none;">
 <b>Processed # super-nodes/segments</b>
 </div>
-<div id="result_status_oneway" style="display: none;">
-<b>Processed # oneway segments</b>
+<div id="result_status_waytype" style="display: none;">
+<b>Processed # way type segments</b>
 </div>
 <div id="result_status_highway" style="display: none;">
 <b>Processed # segments</b>
@@ -156,7 +156,7 @@ server will only return data if the selected area is small enough.
 <div id="hideshow_junctions_div" style="display: none;">
 Each node that is a dead-end, a junction of two highways of different
 types (or different properties) or a junction where more than two segments
-join are shown colour-coded:
+join are shown colour-coded.
 <br>
 <table>
 <tr><td><img src="icons/ball-1.png" alt="1" ><td>only one highway - a dead-end.
@@ -181,13 +181,20 @@ algorithm page for description).
 </div>
 
 <div class="hideshow_box">
-<span id="hideshow_oneway_show" onclick="hideshow_show('oneway');" class="hideshow_show">+</span>
-<span id="hideshow_oneway_hide" onclick="hideshow_hide('oneway');" class="hideshow_hide">-</span>
-<input type="button" id="oneway" onclick="displayData('oneway');" value="Display One-way Segments">
-<div id="hideshow_oneway_div" style="display: none;">
-Each one-way segment is shown with a coloured triangle indicating the
-allowed direction. The colours of the triangles depend on the bearing
-of the highway segment.
+<span id="hideshow_waytype_show" onclick="hideshow_show('waytype');" class="hideshow_show">+</span>
+<span id="hideshow_waytype_hide" onclick="hideshow_hide('waytype');" class="hideshow_hide">-</span>
+<input type="button" id="waytype" onclick="displayData('waytype');" value="Display Way Type Segments">
+<div id="hideshow_waytype_div" style="display: none;">
+Each highway segment of special types (one-way, cycle-both-ways and roundabout) are
+shown. For one-way segments a coloured triangle indicates the allowed direction.
+The colours of the triangles depend on the bearing of the highway segment.
+<form name="waytypes" id="waytypes" action="#" method="get" onsubmit="return false;">
+<table>
+<tr><td>One-way segments: <td><input name="waytype" type="radio" value="oneway" onchange="displayData('waytype');" checked>
+<tr><td>Cycle-both-way segments:<td><input name="waytype" type="radio" value="cyclebothways" onchange="displayData('waytype');">
+<tr><td>Roundabout segments: <td><input name="waytype" type="radio" value="roundabout" onchange="displayData('waytype');">
+</table>
+</form>
 </div>
 </div>
 
@@ -366,7 +373,6 @@ Each segment of the highways with a particular property is drawn.
 <tr><td>Tunnel: <td><input name="property" type="radio" value="tunnel" onchange="displayData('property');">
 <tr><td>Walking Route: <td><input name="property" type="radio" value="footroute" onchange="displayData('property');">
 <tr><td>Bicycle Route: <td><input name="property" type="radio" value="bicycleroute" onchange="displayData('property');">
-<tr><td>Cycle Both Ways:<td><input name="property" type="radio" value="cyclebothways" onchange="displayData('property');">
 </table>
 </form>
 </div>
diff --git a/web/www/routino/visualiser.html.en b/web/www/routino/visualiser.html.ru
similarity index 77%
copy from web/www/routino/visualiser.html.en
copy to web/www/routino/visualiser.html.ru
index c39f289..d3e7d41 100644
--- a/web/www/routino/visualiser.html.en
+++ b/web/www/routino/visualiser.html.ru
@@ -68,14 +68,14 @@ Only data relevant for routing is displayed and some will therefore be excluded.
 <div class="center">
 <a target="other" href="http://www.routino.org/">Routino Website</a>
 |
-<a target="other" href="documentation/">Documentation</a>
+<a target="other" href="documentation/">Документация</a>
 </div>
 </div>
 
 <div class="hideshow_box">
 <span id="hideshow_language_show" onclick="hideshow_show('language');" class="hideshow_show">+</span>
 <span id="hideshow_language_hide" onclick="hideshow_hide('language');" class="hideshow_hide">-</span>
-<span class="hideshow_title">Language</span>
+<span class="hideshow_title">Язык</span>
 
 <div id="hideshow_language_div" style="display: none;">
 <table>
@@ -83,7 +83,7 @@ Only data relevant for routing is displayed and some will therefore be excluded.
 <td><a id="lang_en_url" href="visualiser.html.en" title="English language webpage">English</a>
 <td>(EN)
 <tr>
-<td><a id="lang_de_url" href="visualiser.html.de" title="Deutsche Webseite">Deutsche</a>
+<td><a id="lang_de_url" href="visualiser.html.de" title="Deutsche Webseite">Deutsch</a>
 <td>(DE)
 <tr>
 <td><a id="lang_fr_url" href="visualiser.html.fr" title="Francais">Francais</a>
@@ -92,7 +92,7 @@ Only data relevant for routing is displayed and some will therefore be excluded.
 <td><a id="lang_nl_url" href="visualiser.html.nl" title="Nederlandse web pagina">Nederlands</a>
 <td>(NL)
 <tr>
-<td>
+<td><a id="lang_ru_url" href="visualiser.html.ru" title="Русский">Русский</a>
 <td>(RU)
 </table>
 <a target="translation" href="http://www.routino.org/translations/">Routino Translations</a>
@@ -100,16 +100,16 @@ Only data relevant for routing is displayed and some will therefore be excluded.
 </div>
 
 <div class="hideshow_box">
-<span class="hideshow_title">Instructions</span>
+<span class="hideshow_title">Инструкции</span>
 Zoom in and then use the buttons below to download the data. The
 server will only return data if the selected area is small enough.
 </div>
 
 <div class="hideshow_box">
-<span class="hideshow_title">Status</span>
+<span class="hideshow_title">Статус</span>
 <div id="result_status">
 <div id="result_status_no_data">
-<b><i>No data displayed</i></b>
+<b><i>Нет данных для отображения</i></b>
 </div>
 <div id="result_status_data" style="display: none;">
 </div>
@@ -122,8 +122,8 @@ server will only return data if the selected area is small enough.
 <div id="result_status_super" style="display: none;">
 <b>Processed # super-nodes/segments</b>
 </div>
-<div id="result_status_oneway" style="display: none;">
-<b>Processed # oneway segments</b>
+<div id="result_status_waytype" style="display: none;">
+<b>Processed # way type segments</b>
 </div>
 <div id="result_status_highway" style="display: none;">
 <b>Processed # segments</b>
@@ -132,10 +132,10 @@ server will only return data if the selected area is small enough.
 <b>Processed # segments</b>
 </div>
 <div id="result_status_barrier" style="display: none;">
-<b>Processed # nodes</b>
+<b>Обработано # нод</b>
 </div>
 <div id="result_status_turns" style="display: none;">
-<b>Processed # turn restrictions</b>
+<b>Обработано # ограничений поворотов</b>
 </div>
 <div id="result_status_limit" style="display: none;">
 <b>Processed # limit changes</b>
@@ -156,7 +156,7 @@ server will only return data if the selected area is small enough.
 <div id="hideshow_junctions_div" style="display: none;">
 Each node that is a dead-end, a junction of two highways of different
 types (or different properties) or a junction where more than two segments
-join are shown colour-coded:
+join are shown colour-coded.
 <br>
 <table>
 <tr><td><img src="icons/ball-1.png" alt="1" ><td>only one highway - a dead-end.
@@ -181,13 +181,20 @@ algorithm page for description).
 </div>
 
 <div class="hideshow_box">
-<span id="hideshow_oneway_show" onclick="hideshow_show('oneway');" class="hideshow_show">+</span>
-<span id="hideshow_oneway_hide" onclick="hideshow_hide('oneway');" class="hideshow_hide">-</span>
-<input type="button" id="oneway" onclick="displayData('oneway');" value="Display One-way Segments">
-<div id="hideshow_oneway_div" style="display: none;">
-Each one-way segment is shown with a coloured triangle indicating the
-allowed direction. The colours of the triangles depend on the bearing
-of the highway segment.
+<span id="hideshow_waytype_show" onclick="hideshow_show('waytype');" class="hideshow_show">+</span>
+<span id="hideshow_waytype_hide" onclick="hideshow_hide('waytype');" class="hideshow_hide">-</span>
+<input type="button" id="waytype" onclick="displayData('waytype');" value="Display Way Type Segments">
+<div id="hideshow_waytype_div" style="display: none;">
+Each highway segment of special types (one-way, cycle-both-ways and roundabout) are
+shown. For one-way segments a coloured triangle indicates the allowed direction.
+The colours of the triangles depend on the bearing of the highway segment.
+<form name="waytypes" id="waytypes" action="#" method="get" onsubmit="return false;">
+<table>
+<tr><td>One-way segments: <td><input name="waytype" type="radio" value="oneway" onchange="displayData('waytype');" checked>
+<tr><td>Cycle-both-way segments:<td><input name="waytype" type="radio" value="cyclebothways" onchange="displayData('waytype');">
+<tr><td>Roundabout segments: <td><input name="waytype" type="radio" value="roundabout" onchange="displayData('waytype');">
+</table>
+</form>
 </div>
 </div>
 
@@ -199,7 +206,7 @@ of the highway segment.
 Each segment of the chosen type of highway is drawn.
 <form name="highways" id="highways" action="#" method="get" onsubmit="return false;">
 <table>
-<tr><td>Motorway: <td><input name="highway" type="radio" value="motorway" onchange="displayData('highway');">
+<tr><td>Автомагистраль: <td><input name="highway" type="radio" value="motorway" onchange="displayData('highway');">
 <tr><td>Trunk: <td><input name="highway" type="radio" value="trunk" onchange="displayData('highway');">
 <tr><td>Primary: <td><input name="highway" type="radio" value="primary" onchange="displayData('highway');" checked>
 <tr><td>Secondary: <td><input name="highway" type="radio" value="secondary" onchange="displayData('highway');">
@@ -226,13 +233,13 @@ Each segment allowed for the chosen type of transport is drawn.
 <form name="transports" id="transports" action="#" method="get" onsubmit="return false;">
 <table>
 <tr><td>Foot: <td><input name="transport" type="radio" value="foot" onchange="displayData('transport');">
-<tr><td>Horse: <td><input name="transport" type="radio" value="horse" onchange="displayData('transport');">
-<tr><td>Wheelchair:<td><input name="transport" type="radio" value="wheelchair" onchange="displayData('transport');">
-<tr><td>Bicycle: <td><input name="transport" type="radio" value="bicycle" onchange="displayData('transport');">
-<tr><td>Moped: <td><input name="transport" type="radio" value="moped" onchange="displayData('transport');">
-<tr><td>Motorcycle:<td><input name="transport" type="radio" value="motorcycle" onchange="displayData('transport');">
+<tr><td>Лошадь: <td><input name="transport" type="radio" value="horse" onchange="displayData('transport');">
+<tr><td>Инвалидное кресло:<td><input name="transport" type="radio" value="wheelchair" onchange="displayData('transport');">
+<tr><td>Велосипед: <td><input name="transport" type="radio" value="bicycle" onchange="displayData('transport');">
+<tr><td>Мопед: <td><input name="transport" type="radio" value="moped" onchange="displayData('transport');">
+<tr><td>Мотоцикл:<td><input name="transport" type="radio" value="motorcycle" onchange="displayData('transport');">
 <tr><td>Motorcar: <td><input name="transport" type="radio" value="motorcar" onchange="displayData('transport');" checked>
-<tr><td>Goods: <td><input name="transport" type="radio" value="goods" onchange="displayData('transport');">
+<tr><td>Товары: <td><input name="transport" type="radio" value="goods" onchange="displayData('transport');">
 <tr><td>HGV: <td><input name="transport" type="radio" value="hgv" onchange="displayData('transport');">
 <tr><td>PSV: <td><input name="transport" type="radio" value="psv" onchange="displayData('transport');">
 </table>
@@ -249,13 +256,13 @@ Each barrier blocking the chosen type of transport is drawn.
 <form name="barriers" id="barriers" action="#" method="get" onsubmit="return false;">
 <table>
 <tr><td>Foot: <td><input name="barrier" type="radio" value="foot" onchange="displayData('barrier');">
-<tr><td>Horse: <td><input name="barrier" type="radio" value="horse" onchange="displayData('barrier');">
-<tr><td>Wheelchair:<td><input name="barrier" type="radio" value="wheelchair" onchange="displayData('barrier');">
-<tr><td>Bicycle: <td><input name="barrier" type="radio" value="bicycle" onchange="displayData('barrier');">
-<tr><td>Moped: <td><input name="barrier" type="radio" value="moped" onchange="displayData('barrier');">
-<tr><td>Motorcycle:<td><input name="barrier" type="radio" value="motorcycle" onchange="displayData('barrier');">
+<tr><td>Лошадь: <td><input name="barrier" type="radio" value="horse" onchange="displayData('barrier');">
+<tr><td>Инвалидное кресло:<td><input name="barrier" type="radio" value="wheelchair" onchange="displayData('barrier');">
+<tr><td>Велосипед: <td><input name="barrier" type="radio" value="bicycle" onchange="displayData('barrier');">
+<tr><td>Мопед: <td><input name="barrier" type="radio" value="moped" onchange="displayData('barrier');">
+<tr><td>Мотоцикл:<td><input name="barrier" type="radio" value="motorcycle" onchange="displayData('barrier');">
 <tr><td>Motorcar: <td><input name="barrier" type="radio" value="motorcar" onchange="displayData('barrier');" checked>
-<tr><td>Goods: <td><input name="barrier" type="radio" value="goods" onchange="displayData('barrier');">
+<tr><td>Товары: <td><input name="barrier" type="radio" value="goods" onchange="displayData('barrier');">
 <tr><td>HGV: <td><input name="barrier" type="radio" value="hgv" onchange="displayData('barrier');">
 <tr><td>PSV: <td><input name="barrier" type="radio" value="psv" onchange="displayData('barrier');">
 </table>
@@ -266,7 +273,7 @@ Each barrier blocking the chosen type of transport is drawn.
 <div class="hideshow_box">
 <span id="hideshow_turns_show" onclick="hideshow_show('turns');" class="hideshow_show">+</span>
 <span id="hideshow_turns_hide" onclick="hideshow_hide('turns');" class="hideshow_hide">-</span>
-<input type="button" id="turns" onclick="displayData('turns');" value="Display Turn Restrictions">
+<input type="button" id="turns" onclick="displayData('turns');" value="Показывать ограничения поворотов">
 <div id="hideshow_turns_div" style="display: none;">
 Each turn restrictions is shown with a line indicating the disallowed turn.
 </div>
@@ -275,15 +282,15 @@ Each turn restrictions is shown with a line indicating the disallowed turn.
 <div class="hideshow_box">
 <span id="hideshow_speed_show" onclick="hideshow_show('speed');" class="hideshow_show">+</span>
 <span id="hideshow_speed_hide" onclick="hideshow_hide('speed');" class="hideshow_hide">-</span>
-<input type="button" id="speed" onclick="displayData('speed');" value="Display Speed Limits">
+<input type="button" id="speed" onclick="displayData('speed');" value="Показывать ограничения скорости">
 <div id="hideshow_speed_div" style="display: none;">
 Each node that joins segments with different speed limits is shown
 along with the speed limit on relevant segments.
 <br>
 <table>
-<tr><td><img src="icons/ball-1.png" alt="." ><td>Change of limit
+<tr><td><img src="icons/ball-1.png" alt="." ><td>Изменить ограничения
 <tr><td><img src="icons/limit-no.png" alt="()" ><td>No specified limit
-<tr><td><img src="icons/limit-80.png" alt="(80)"><td>80 km/hour speed limit
+<tr><td><img src="icons/limit-80.png" alt="(80)"><td>Ограничение скорости 80 км/ч
 </table>
 </div>
 </div>
@@ -291,15 +298,15 @@ along with the speed limit on relevant segments.
 <div class="hideshow_box">
 <span id="hideshow_weight_show" onclick="hideshow_show('weight');" class="hideshow_show">+</span>
 <span id="hideshow_weight_hide" onclick="hideshow_hide('weight');" class="hideshow_hide">-</span>
-<input type="button" id="weight" onclick="displayData('weight');" value="Display Weight Limits">
+<input type="button" id="weight" onclick="displayData('weight');" value="Показывать ограничения по весу">
 <div id="hideshow_weight_div" style="display: none;">
 Each node that joins segments with different weight limits is shown
 along with the weight limit on relevant segments.
 <br>
 <table>
-<tr><td><img src="icons/ball-1.png" alt="." ><td>Change of limit
+<tr><td><img src="icons/ball-1.png" alt="." ><td>Изменить ограничения
 <tr><td><img src="icons/limit-no.png" alt="()" ><td>No specified limit
-<tr><td><img src="icons/limit-8.0.png" alt="(8.0)"><td>8.0 tonnes weight limit
+<tr><td><img src="icons/limit-8.0.png" alt="(8.0)"><td>Ограничение веса 8 тонн
 </table>
 </div>
 </div>
@@ -307,15 +314,15 @@ along with the weight limit on relevant segments.
 <div class="hideshow_box">
 <span id="hideshow_height_show" onclick="hideshow_show('height');" class="hideshow_show">+</span>
 <span id="hideshow_height_hide" onclick="hideshow_hide('height');" class="hideshow_hide">-</span>
-<input type="button" id="height" onclick="displayData('height');" value="Display Height Limits">
+<input type="button" id="height" onclick="displayData('height');" value="Показывать ограничение по высоте">
 <div id="hideshow_height_div" style="display: none;">
 Each node that joins segments with different height limits is shown
 along with the height limit on relevant segments.
 <br>
 <table>
-<tr><td><img src="icons/ball-1.png" alt="." ><td>Change of limit
+<tr><td><img src="icons/ball-1.png" alt="." ><td>Изменить ограничения
 <tr><td><img src="icons/limit-no.png" alt="()" ><td>No specified limit
-<tr><td><img src="icons/limit-4.0.png" alt="(4.0)"><td>4.0 m height limit
+<tr><td><img src="icons/limit-4.0.png" alt="(4.0)"><td>Ограничение высоты 4.0 метра
 </table>
 </div>
 </div>
@@ -323,13 +330,13 @@ along with the height limit on relevant segments.
 <div class="hideshow_box">
 <span id="hideshow_width_show" onclick="hideshow_show('width');" class="hideshow_show">+</span>
 <span id="hideshow_width_hide" onclick="hideshow_hide('width');" class="hideshow_hide">-</span>
-<input type="button" id="width" onclick="displayData('width');" value="Display Width Limits">
+<input type="button" id="width" onclick="displayData('width');" value="Показывать ограничение ширины">
 <div id="hideshow_width_div" style="display: none;">
 Each node that joins segments with different width limits is shown
 along with the width limit on relevant segments.
 <br>
 <table>
-<tr><td><img src="icons/ball-1.png" alt="." ><td>Change of limit
+<tr><td><img src="icons/ball-1.png" alt="." ><td>Изменить ограничения
 <tr><td><img src="icons/limit-no.png" alt="()" ><td>No specified limit
 <tr><td><img src="icons/limit-3.0.png" alt="(3.0)"><td>3.0 m width limit
 </table>
@@ -345,7 +352,7 @@ Each node that joins segments with different length limits is shown
 along with the length limit on relevant segments.
 <br>
 <table>
-<tr><td><img src="icons/ball-1.png" alt="." ><td>Change of limit
+<tr><td><img src="icons/ball-1.png" alt="." ><td>Изменить ограничения
 <tr><td><img src="icons/limit-no.png" alt="()" ><td>No specified limit
 <tr><td><img src="icons/limit-9.0.png" alt="(9.0)"><td>9.0 m length limit
 </table>
@@ -362,11 +369,10 @@ Each segment of the highways with a particular property is drawn.
 <table>
 <tr><td>Paved: <td><input name="property" type="radio" value="paved" onchange="displayData('property');" checked>
 <tr><td>Multiple Lanes: <td><input name="property" type="radio" value="multilane" onchange="displayData('property');">
-<tr><td>Bridge: <td><input name="property" type="radio" value="bridge" onchange="displayData('property');">
-<tr><td>Tunnel: <td><input name="property" type="radio" value="tunnel" onchange="displayData('property');">
-<tr><td>Walking Route: <td><input name="property" type="radio" value="footroute" onchange="displayData('property');">
-<tr><td>Bicycle Route: <td><input name="property" type="radio" value="bicycleroute" onchange="displayData('property');">
-<tr><td>Cycle Both Ways:<td><input name="property" type="radio" value="cyclebothways" onchange="displayData('property');">
+<tr><td>Мост: <td><input name="property" type="radio" value="bridge" onchange="displayData('property');">
+<tr><td>Туннель: <td><input name="property" type="radio" value="tunnel" onchange="displayData('property');">
+<tr><td>Пеший маршрут: <td><input name="property" type="radio" value="footroute" onchange="displayData('property');">
+<tr><td>Велодорожка: <td><input name="property" type="radio" value="bicycleroute" onchange="displayData('property');">
 </table>
 </form>
 </div>
@@ -395,7 +401,7 @@ Potential problems found by Routino when processing the input data.
 <div class="hideshow_box">
 <span id="hideshow_help_options_show" onclick="hideshow_show('help_options');" class="hideshow_hide">+</span>
 <span id="hideshow_help_options_hide" onclick="hideshow_hide('help_options');" class="hideshow_show">-</span>
-<span class="hideshow_title">Help</span>
+<span class="hideshow_title">Помощь</span>
 <div id="hideshow_help_options_div">
 <div class="scrollable">
 <b>Quick Start</b>
@@ -449,7 +455,7 @@ Router: <a href="http://www.routino.org/" target="routino">Routino</a>
 |
 Geo Data: <span id="attribution_data"></span>
 |
-Tiles: <span id="attribution_tile"></span>
+Тайлы: <span id="attribution_tile"></span>
 </div>
 </div>
 
diff --git a/web/www/routino/visualiser.leaflet.js b/web/www/routino/visualiser.leaflet.js
index eb3e91f..d6d2ed6 100644
--- a/web/www/routino/visualiser.leaflet.js
+++ b/web/www/routino/visualiser.leaflet.js
@@ -27,7 +27,7 @@
 var data_types=[
                 "junctions",
                 "super",
-                "oneway",
+                "waytype",
                 "highway",
                 "transport",
                 "barrier",
@@ -585,8 +585,14 @@ function displayData(datatype)  // called from visualiser.html
    case "super":
     ajaxGET(url, runSuperSuccess, runFailure);
     break;
-   case "oneway":
-    ajaxGET(url, runOnewaySuccess, runFailure);
+   case "waytype":
+    var waytype;
+    var waytypes=document.forms["waytypes"].elements["waytype"];
+    for(var h in waytypes)
+       if(waytypes[h].checked)
+          waytype=waytypes[h].value;
+    url+="-" + waytype;
+    ajaxGET(url, runWaytypeSuccess, runFailure);
     break;
    case "highway":
     var highway;
@@ -766,10 +772,10 @@ function runSuperSuccess(response)
 
 
 //
-// Success in getting the oneway data
+// Success in getting the waytype data
 //
 
-function runOnewaySuccess(response)
+function runWaytypeSuccess(response)
 {
  var hex={0: "00", 1: "11",  2: "22",  3: "33",  4: "44",  5: "55",  6: "66",  7: "77",
           8: "88", 9: "99", 10: "AA", 11: "BB", 12: "CC", 13: "DD", 14: "EE", 15: "FF"};
@@ -833,7 +839,7 @@ function runOnewaySuccess(response)
       }
    }
 
- displayStatus("data","oneway",lines.length-2);
+ displayStatus("data","waytype",lines.length-2);
 }
 
 
diff --git a/web/www/routino/visualiser.openlayers.js b/web/www/routino/visualiser.openlayers.js
index 7649a6c..49be815 100644
--- a/web/www/routino/visualiser.openlayers.js
+++ b/web/www/routino/visualiser.openlayers.js
@@ -27,7 +27,7 @@
 var data_types=[
                 "junctions",
                 "super",
-                "oneway",
+                "waytype",
                 "highway",
                 "transport",
                 "barrier",
@@ -599,8 +599,14 @@ function displayData(datatype)  // called from visualiser.html
    case "super":
     ajaxGET(url, runSuperSuccess, runFailure);
     break;
-   case "oneway":
-    ajaxGET(url, runOnewaySuccess, runFailure);
+   case "waytype":
+    var waytype;
+    var waytypes=document.forms["waytypes"].elements["waytype"];
+    for(var h in waytypes)
+       if(waytypes[h].checked)
+          waytype=waytypes[h].value;
+    url+="-" + waytype;
+    ajaxGET(url, runWaytypeSuccess, runFailure);
     break;
    case "highway":
     var highway;
@@ -796,10 +802,10 @@ function runSuperSuccess(response)
 
 
 //
-// Success in getting the oneway data
+// Success in getting the waytype data
 //
 
-function runOnewaySuccess(response)
+function runWaytypeSuccess(response)
 {
  var hex={0: "00", 1: "11",  2: "22",  3: "33",  4: "44",  5: "55",  6: "66",  7: "77",
           8: "88", 9: "99", 10: "AA", 11: "BB", 12: "CC", 13: "DD", 14: "EE", 15: "FF"};
@@ -864,7 +870,7 @@ function runOnewaySuccess(response)
 
  layerVectors.addFeatures(features);
 
- displayStatus("data","oneway",lines.length-2);
+ displayStatus("data","waytype",lines.length-2);
 }
 
 
diff --git a/xml/routino-profiles.xml b/xml/routino-profiles.xml
index 4562bc9..40c0aad 100644
--- a/xml/routino-profiles.xml
+++ b/xml/routino-profiles.xml
@@ -54,7 +54,6 @@
       <property type="tunnel"        percent="50" />
       <property type="footroute"     percent="55" />
       <property type="bicycleroute"  percent="55" />
-      <property type="cyclebothways" percent="50" />
     </properties>
     <restrictions>
       <oneway obey="0" /> 
@@ -104,7 +103,6 @@
       <property type="tunnel"        percent="50" />
       <property type="footroute"     percent="50" />
       <property type="bicycleroute"  percent="50" />
-      <property type="cyclebothways" percent="50" />
     </properties>
     <restrictions>
       <oneway obey="1" /> 
@@ -154,7 +152,6 @@
       <property type="tunnel"        percent="50" />
       <property type="footroute"     percent="55" />
       <property type="bicycleroute"  percent="55" />
-      <property type="cyclebothways" percent="50" />
     </properties>
     <restrictions>
       <oneway obey="0" /> 
@@ -204,7 +201,6 @@
       <property type="tunnel"        percent="50" />
       <property type="footroute"     percent="50" />
       <property type="bicycleroute"  percent="60" />
-      <property type="cyclebothways" percent="50" />
     </properties>
     <restrictions>
       <oneway obey="1" /> 
@@ -254,7 +250,6 @@
       <property type="tunnel"        percent="50" />
       <property type="footroute"     percent="50" />
       <property type="bicycleroute"  percent="50" />
-      <property type="cyclebothways" percent="50" />
     </properties>
     <restrictions>
       <oneway obey="1" /> 
@@ -304,7 +299,6 @@
       <property type="tunnel"        percent="50" />
       <property type="footroute"     percent="50" />
       <property type="bicycleroute"  percent="50" />
-      <property type="cyclebothways" percent="50" />
     </properties>
     <restrictions>
       <oneway obey="1" /> 
@@ -354,7 +348,6 @@
       <property type="tunnel"        percent="50" />
       <property type="footroute"     percent="45" />
       <property type="bicycleroute"  percent="45" />
-      <property type="cyclebothways" percent="50" />
     </properties>
     <restrictions>
       <oneway obey="1" /> 
@@ -404,7 +397,6 @@
       <property type="tunnel"        percent="50" />
       <property type="footroute"     percent="45" />
       <property type="bicycleroute"  percent="45" />
-      <property type="cyclebothways" percent="50" />
     </properties>
     <restrictions>
       <oneway obey="1" /> 
@@ -454,7 +446,6 @@
       <property type="tunnel"        percent="50" />
       <property type="footroute"     percent="45" />
       <property type="bicycleroute"  percent="45" />
-      <property type="cyclebothways" percent="50" />
     </properties>
     <restrictions>
       <oneway obey="1" /> 
@@ -504,7 +495,6 @@
       <property type="tunnel"        percent="50" />
       <property type="footroute"     percent="45" />
       <property type="bicycleroute"  percent="45" />
-      <property type="cyclebothways" percent="50" />
     </properties>
     <restrictions>
       <oneway obey="1" /> 
diff --git a/xml/routino-translations.xml b/xml/routino-translations.xml
index 45e7b1a..7b75298 100644
--- a/xml/routino-translations.xml
+++ b/xml/routino-translations.xml
@@ -16,14 +16,12 @@
 <routino-translations xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                       xsi:noNamespaceSchemaLocation="http://www.routino.org/xml/routino-translations.xsd">
 
-  <!-- Original English language version by Andrew M. Bishop -->
-
   <language lang="en">
 
     <!-- Copyright of the data being routed, not of this file  -->
     <copyright>
       <creator string="Creator" text="Routino - http://www.routino.org/" />
-      <source  string="Source"  text="Based on OpenStreetMap data from http://www.openstreetmap.org/" />
+      <source  string="Source" text="Based on OpenStreetMap data from http://www.openstreetmap.org/" />
       <license string="License" text="http://www.openstreetmap.org/copyright" />
     </copyright>
 
@@ -82,44 +80,42 @@
 
     <!-- HTML output -->
     <output-html>
-      <waypoint type="waypoint"   string="Waypoint" />   <!-- For the chosen waypoints -->
-      <waypoint type="junction"   string="Junction" />   <!-- For the interesting junctions -->
+      <waypoint type="waypoint"   string="Waypoint" /> <!-- For the chosen waypoints -->
+      <waypoint type="junction"   string="Junction" /> <!-- For the interesting junctions -->
       <waypoint type="roundabout" string="Roundabout" /> <!-- For roundabouts -->
 
       <title text="%s Route" /> <!-- %s = [shortest|quickest] -->
 
-      <start   string="Start"  text="At %s, head %s" />                  <!-- 1st %s = [waypoint|junction], 2nd %s = [heading] -->
-      <node    string="At"     text="%s, go %s heading %s" />            <!-- 1st %s = [waypoint|junction], 2nd %s = [turn], 3rd %s = [heading] -->
-      <rbnode  string="Leave"  text="%s, take the %s exit heading %s" /> <!-- 1st %s = [roundabout], 2nd %s = [first|second|...], 3rd %s = [heading] -->
-      <segment string="Follow" text="%s for %.3f km, %.1f min" />        <!-- 1st %s = street name -->
-      <stop    string="Stop"   text="At %s" />                           <!-- 1st %s = [waypoint|junction] -->
-      <total   string="Total"  text="%.1f km, %.0f minutes" />
+      <start   string="Start" text="At %s, head %s" /> <!-- 1st %s = [waypoint|junction], 2nd %s = [heading] -->
+      <node    string="At" text="%s, go %s heading %s" /> <!-- 1st %s = [waypoint|junction], 2nd %s = [turn], 3rd %s = [heading] -->
+      <rbnode  string="Leave" text="%s, take the %s exit heading %s" /> <!-- 1st %s = [roundabout], 2nd %s = [first|second|...], 3rd %s = [heading] -->
+      <segment string="Follow" text="%s for %.3f km, %.1f min" /> <!-- 1st %s = street name -->
+      <stop    string="Stop" text="At %s" /> <!-- 1st %s = [waypoint|junction] -->
+      <total   string="Total" text="%.1f km, %.0f minutes" />
     </output-html>
 
     <!-- GPX output -->
     <output-gpx>
-      <waypoint type="start"  string="START" /> <!-- For the first route waypoint -->
-      <waypoint type="inter"  string="INTER" /> <!-- For the intermediate route waypoints -->
-      <waypoint type="trip"   string="TRIP"  /> <!-- For the other route points -->
+      <waypoint type="start" string="START" /> <!-- For the first route waypoint -->
+      <waypoint type="inter" string="INTER" /> <!-- For the intermediate route waypoints -->
+      <waypoint type="trip" string="TRIP" /> <!-- For the other route points -->
       <waypoint type="finish" string="FINISH"/> <!-- For the last route waypoint -->
 
       <desc  text="%s route between 'start' and 'finish' waypoints" /> <!-- %s = [shortest|quickest] -->
-      <name  text="%s route" />                                        <!-- %s = [shortest|quickest] -->
-      <step  text="%s on '%s' for %.3f km, %.1f min" />                <!-- 1st %s = [turn], 2nd %s = street name -->
+      <name  text="%s route" /> <!-- %s = [shortest|quickest] -->
+      <step  text="%s on '%s' for %.3f km, %.1f min" /> <!-- 1st %s = [turn], 2nd %s = street name -->
       <final text="Total Journey %.1f km, %.0f minutes" />
     </output-gpx>
 
   </language>
 
-  <!-- German translation by Christoph Eckert (July 2010) / Alex Treiber (Jan 2013) -->
-
   <language lang="de">
 
     <!-- Copyright of the data being routed, not of this file  -->
     <copyright>
-      <creator string="Creator" text="Routino - http://www.routino.org/" />
-      <source  string="Source"  text="Basierend auf OpenStreetMap-Daten, erhältlich via http://www.openstreetmap.org/" />
-      <license string="License" text="http://www.openstreetmap.org/copyright" />
+      <creator string="Urheber" text="Routino - http://www.routino.org/" />
+      <source  string="Source" text="Basierend auf OpenStreetMap-Daten, erhältlich via http://www.openstreetmap.org/" />
+      <license string="Lizenz" text="http://www.openstreetmap.org/copyright" />
     </copyright>
 
     <!-- Turn directions, 0 = ahead, -2 = left, +/-4 = behind, +2 = right -->
@@ -169,51 +165,49 @@
     <highway type="cycleway"     string="Radweg" />
     <highway type="path"         string="Weg" />
     <highway type="steps"        string="Treppe" />
-    <highway type="ferry"        string="Fähre" /> 
+    <highway type="ferry"        string="Fähre" />
 
     <!-- The type of route -->
-    <route type="shortest" string="Kürzeste" />   <!-- For the description and route name -->
+    <route type="shortest" string="Kürzeste" /> <!-- For the description and route name -->
     <route type="quickest" string="Schnellste" /> <!-- For the description and route name -->
 
     <!-- HTML output -->
     <output-html>
-      <waypoint type="waypoint"  string="Wegpunkt" />        <!-- For the chosen waypoints -->
-      <waypoint type="junction"  string="Anschlussstelle" /> <!-- For the interesting junctions -->
+      <waypoint type="waypoint"   string="Wegpunkt" /> <!-- For the chosen waypoints -->
+      <waypoint type="junction"   string="Anschlussstelle" /> <!-- For the interesting junctions -->
       <waypoint type="roundabout" string="Kreisverkehr" /> <!-- For roundabouts -->
 
       <title text="%s Route" /> <!-- %s = [shortest|quickest] -->
 
-      <start   string="Start"  text="Bei %s halten Sie sich Richtung %s" />          <!-- 1st %s = [waypoint|junction], 2nd %s = [heading] -->
-      <node    string="Bei"    text="Bei %s wenden Sie sich nach %s Richtung %s" />  <!-- 1st %s = [waypoint|junction], 2nd %s = [turn], 3rd %s = [heading] -->
-      <rbnode  string="Verlassen Sie"  text="%s, nehmen Sie die %s Ausfahrt Richtung %s" /> <!-- 1st %s = [roundabout], 2nd %s = [first|second|...], 3rd %s = [heading] -->
+      <start   string="Start" text="Bei %s halten Sie sich Richtung %s" /> <!-- 1st %s = [waypoint|junction], 2nd %s = [heading] -->
+      <node    string="Bei" text="Bei %s wenden Sie sich nach %s Richtung %s" /> <!-- 1st %s = [waypoint|junction], 2nd %s = [turn], 3rd %s = [heading] -->
+      <rbnode  string="Verlassen Sie" text="%s, nehmen Sie die %s Ausfahrt Richtung %s" /> <!-- 1st %s = [roundabout], 2nd %s = [first|second|...], 3rd %s = [heading] -->
       <segment string="Folgen" text="Folgen Sie der %s für %.3f km bzw. %.1f min" /> <!-- 1st %s = street name -->
-      <stop    string="Stop"   text="Sie sind bei %s angekommen" />                  <!-- 1st %s = [waypoint|junction] -->
+      <stop    string="Stop" text="Sie sind bei %s angekommen" /> <!-- 1st %s = [waypoint|junction] -->
       <total   string="Gesamt" text="%.1f km, %.0f minuten" />
     </output-html>
 
     <!-- GPX output -->
     <output-gpx>
-      <waypoint type="start"  string="START" /> <!-- For the first route waypoint -->
-      <waypoint type="inter"  string="INTER" /> <!-- For the intermediate route waypoints -->
-      <waypoint type="trip"   string="TRIP"  /> <!-- For the other route points -->
+      <waypoint type="start" string="START" /> <!-- For the first route waypoint -->
+      <waypoint type="inter" string="INTER" /> <!-- For the intermediate route waypoints -->
+      <waypoint type="trip" string="TRIP" /> <!-- For the other route points -->
       <waypoint type="finish" string="FINISH"/> <!-- For the last route waypoint -->
 
       <desc  text="%s Strecke zwischen 'Start' und 'Ziel'" /> <!-- %s = [shortest|quickest] -->
-      <name  text="%s Strecke" />                             <!-- %s = [shortest|quickest] -->
-      <step  text="%s auf '%s' für %.3f km, %.1f min" />      <!-- 1st %s = [turn], 2nd %s = street name -->
+      <name  text="%s Strecke" /> <!-- %s = [shortest|quickest] -->
+      <step  text="%s auf '%s' für %.3f km, %.1f min" /> <!-- 1st %s = [turn], 2nd %s = street name -->
       <final text="Gesamtstrecke %.1f km, %.0f minuten" />
     </output-gpx>
 
   </language>
 
-  <!-- French translation by Christophe Collard (janvier 2014) -->
-
- <language lang="fr">
+  <language lang="fr">
 
     <!-- Copyright of the data being routed, not of this file  -->
     <copyright>
       <creator string="Créateur" text="Routino - http://www.routino.org/" />
-      <source  string="Source"  text="Basé sur les données OpenStreetMap de http://www.openstreetmap.org/" />
+      <source  string="Source" text="Basé sur les données OpenStreetMap de http://www.openstreetmap.org/" />
       <license string="License" text="http://www.openstreetmap.org/copyright" />
     </copyright>
 
@@ -272,43 +266,41 @@
 
     <!-- HTML output -->
     <output-html>
-      <waypoint type="waypoint"   string="Etape" />   <!-- For the chosen waypoints -->
-      <waypoint type="junction"   string="Croisement" />   <!-- For the interesting junctions -->
+      <waypoint type="waypoint"   string="Etape" /> <!-- For the chosen waypoints -->
+      <waypoint type="junction"   string="Croisement" /> <!-- For the interesting junctions -->
       <waypoint type="roundabout" string="rond-point" /> <!-- For roundabouts -->
 
       <title text="Itinéraire %s" /> <!-- %s = [shortest|quickest] -->
 
-      <start   string="Débute"  text="à %s, direction %s" />                  <!-- 1st %s = [waypoint|junction], 2nd %s = [heading] -->
-      <node    string="à"     text="%s, aller %s direction %s" />            <!-- 1st %s = [waypoint|junction], 2nd %s = [turn], 3rd %s = [heading] -->
-      <rbnode  string="Quitter"  text="%s, prendre le %s sortir direction %s" /> <!-- 1st %s = [roundabout], 2nd %s = [first|second|...], 3rd %s = [heading] -->
-      <segment string="Suivre" text="%s pendant %.3f km, %.1f min" />        <!-- 1st %s = street name -->
-      <stop    string="S'arrêter"   text="à %s" />                           <!-- 1st %s = [waypoint|junction] -->
-      <total   string="Total"  text="%.1f km, %.0f minutes" />
+      <start   string="Débute" text="à %s, direction %s" /> <!-- 1st %s = [waypoint|junction], 2nd %s = [heading] -->
+      <node    string="à" text="%s, aller %s direction %s" /> <!-- 1st %s = [waypoint|junction], 2nd %s = [turn], 3rd %s = [heading] -->
+      <rbnode  string="Quitter" text="%s, prendre le %s sortir direction %s" /> <!-- 1st %s = [roundabout], 2nd %s = [first|second|...], 3rd %s = [heading] -->
+      <segment string="Suivre" text="%s pendant %.3f km, %.1f min" /> <!-- 1st %s = street name -->
+      <stop    string="S'arrêter" text="à %s" /> <!-- 1st %s = [waypoint|junction] -->
+      <total   string="Total" text="%.1f km, %.0f minutes" />
     </output-html>
 
     <!-- GPX output -->
     <output-gpx>
-      <waypoint type="start"  string="DEBUT" /> <!-- For the first route waypoint -->
-      <waypoint type="inter"  string="INTER" /> <!-- For the intermediate route waypoints -->
-      <waypoint type="trip"   string="POINT"  /> <!-- For the other route points -->
+      <waypoint type="start" string="DEBUT" /> <!-- For the first route waypoint -->
+      <waypoint type="inter" string="INTER" /> <!-- For the intermediate route waypoints -->
+      <waypoint type="trip" string="POINT" /> <!-- For the other route points -->
       <waypoint type="finish" string="FINAL"/> <!-- For the last route waypoint -->
 
-      <desc  text="Itinéraire %s entre les étapes 'début' et 'fin' " /> <!-- %s = [shortest|quickest] -->
-      <name  text="Itinéraire %s" />                                        <!-- %s = [shortest|quickest] -->
-      <step  text="%s sur '%s' pendant %.3f km, %.1f min" />                <!-- 1st %s = [turn], 2nd %s = street name -->
+      <desc  text="Itinéraire %s entre les étapes 'début' et 'fin'" /> <!-- %s = [shortest|quickest] -->
+      <name  text="Itinéraire %s" /> <!-- %s = [shortest|quickest] -->
+      <step  text="%s sur '%s' pendant %.3f km, %.1f min" /> <!-- 1st %s = [turn], 2nd %s = street name -->
       <final text="Trajet total %.1f km, %.0f minutes" />
     </output-gpx>
 
   </language>
 
-  <!-- Dutch translation by Jan Jansen (August 2010) / Glenn Plas (August 2013) -->
-
   <language lang="nl">
 
     <!-- Copyright of the data being routed, not of this file  -->
     <copyright>
       <creator string="Creator" text="Routino - http://www.routino.org/" />
-      <source  string="Source"  text="Gebouwd op OpenStreetMap data van http://www.openstreetmap.org/" />
+      <source  string="Source" text="Gebouwd op OpenStreetMap data van http://www.openstreetmap.org/" />
       <license string="License" text="http://www.openstreetmap.org/copyright" />
     </copyright>
 
@@ -367,43 +359,41 @@
 
     <!-- HTML output -->
     <output-html>
-      <waypoint type="waypoint"  string="Punt" />         <!-- For the chosen waypoints -->
-      <waypoint type="junction"  string="de splitsing" /> <!-- For the interesting junctions -->
+      <waypoint type="waypoint"   string="Punt" /> <!-- For the chosen waypoints -->
+      <waypoint type="junction"   string="de splitsing" /> <!-- For the interesting junctions -->
       <waypoint type="roundabout" string="rotonde" /> <!-- For roundabouts -->
 
       <title text="%s Route" /> <!-- %s = [shortest|quickest] -->
 
-      <start   string="Start"  text="Bij %s neemt u de richting %s" />       <!-- 1st %s = [waypoint|junction], 2nd %s = [heading] -->
-      <node    string="Bij"    text="Bij %s gaat u %s richting %s" />        <!-- 1st %s = [waypoint|junction], 2nd %s = [turn], 3rd %s = [heading] -->
-      <rbnode  string="Leave"  text="Aan de %s, neem de %s afslag richting %s" /> <!-- 1st %s = [roundabout], 2nd %s = [first|second|...], 3rd %s = [heading] -->
-      <segment string="Volg"   text="Volgt u de %s voor %.3f km %.1f min" /> <!-- 1st %s = street name -->
-      <stop    string="Stop"   text="U bent bij  %s aangekomen" />           <!-- 1st %s = [waypoint|junction] -->
+      <start   string="Start" text="Bij %s neemt u de richting %s" /> <!-- 1st %s = [waypoint|junction], 2nd %s = [heading] -->
+      <node    string="Bij" text="Bij %s gaat u %s richting %s" /> <!-- 1st %s = [waypoint|junction], 2nd %s = [turn], 3rd %s = [heading] -->
+      <rbnode  string="Leave" text="Aan de %s, neem de %s afslag richting %s" /> <!-- 1st %s = [roundabout], 2nd %s = [first|second|...], 3rd %s = [heading] -->
+      <segment string="Volg" text="Volgt u de %s voor %.3f km %.1f min" /> <!-- 1st %s = street name -->
+      <stop    string="Stop" text="U bent bij  %s aangekomen" /> <!-- 1st %s = [waypoint|junction] -->
       <total   string="Totaal" text="%.1f km, %.0f minuten" />
     </output-html>
 
     <!-- GPX output -->
     <output-gpx>
-      <waypoint type="start"  string="START" /> <!-- For the first route waypoint -->
-      <waypoint type="inter"  string="INTER" /> <!-- For the intermediate route waypoints -->
-      <waypoint type="trip"   string="TRIP"  /> <!-- For the other route points -->
+      <waypoint type="start" string="START" /> <!-- For the first route waypoint -->
+      <waypoint type="inter" string="INTER" /> <!-- For the intermediate route waypoints -->
+      <waypoint type="trip" string="TRIP" /> <!-- For the other route points -->
       <waypoint type="finish" string="FINISH"/> <!-- For the last route waypoint -->
 
       <desc  text="%s Route tussen 'Start' und 'Finish'" /> <!-- %s = [shortest|quickest] -->
-      <name  text="%s Route  " />                           <!-- %s = [shortest|quickest] -->
-      <step  text="%s op '%s' voor %.3f km, %.1f min" />    <!-- 1st %s = [turn], 2nd %s = street name -->
+      <name  text="%s Route" /> <!-- %s = [shortest|quickest] -->
+      <step  text="%s op '%s' voor %.3f km, %.1f min" /> <!-- 1st %s = [turn], 2nd %s = street name -->
       <final text="Totaal trip  %.1f km, %.0f minuten" />
     </output-gpx>
 
   </language>
 
- <!-- Russian language by dimmer (November 2011) -->
-
   <language lang="ru">
 
     <!-- Copyright of the data being routed, not of this file  -->
     <copyright>
       <creator string="Автор" text="Routino - http://www.routino.org/" />
-      <source  string="Источник"  text="Использованы данные OpenStreetMap http://www.openstreetmap.org/" />
+      <source  string="Источник" text="Использованы данные OpenStreetMap http://www.openstreetmap.org/" />
       <license string="Лицензия" text="http://www.openstreetmap.org/copyright" />
     </copyright>
 
@@ -430,16 +420,16 @@
     <heading direction="4"  string="юг" />
 
     <!-- Ordinals, 1 = first, 2 = second ... -->
-    <!-- TRANSLATION REQUIRED: ordinal number="1"  string="First" / -->
-    <!-- TRANSLATION REQUIRED: ordinal number="2"  string="Second" / -->
-    <!-- TRANSLATION REQUIRED: ordinal number="3"  string="Third" / -->
-    <!-- TRANSLATION REQUIRED: ordinal number="4"  string="Fourth" / -->
-    <!-- TRANSLATION REQUIRED: ordinal number="5"  string="Fifth" / -->
-    <!-- TRANSLATION REQUIRED: ordinal number="6"  string="Sixth" / -->
-    <!-- TRANSLATION REQUIRED: ordinal number="7"  string="Seventh" / -->
-    <!-- TRANSLATION REQUIRED: ordinal number="8"  string="Eighth" / -->
-    <!-- TRANSLATION REQUIRED: ordinal number="9"  string="Ninth" / -->
-    <!-- TRANSLATION REQUIRED: ordinal number="10" string="Tenth" / -->
+    <ordinal number="1"  string="Первый" />
+    <ordinal number="2"  string="Второй" />
+    <ordinal number="3"  string="Третий" />
+    <ordinal number="4"  string="Четвертый" />
+    <ordinal number="5"  string="Пятый" />
+    <ordinal number="6"  string="Шестой" />
+    <ordinal number="7"  string="Седьмой" />
+    <ordinal number="8"  string="Восьмой" />
+    <ordinal number="9"  string="Девятый" />
+    <ordinal number="10" string="Десятый" />
 
     <!-- Highway names -->
     <highway type="motorway"     string="автомагистраль" />
@@ -462,30 +452,30 @@
 
     <!-- HTML output -->
     <output-html>
-      <waypoint type="waypoint"  string="путевая точка" /> <!-- For the chosen waypoints -->
-      <waypoint type="junction"  string="перекрестке" /> <!-- For the interesting junctions -->
+      <waypoint type="waypoint"   string="путевая точка" /> <!-- For the chosen waypoints -->
+      <waypoint type="junction"   string="перекрестке" /> <!-- For the interesting junctions -->
       <!-- TRANSLATION REQUIRED: waypoint type="roundabout" string="Roundabout" / --> <!-- For roundabouts -->
 
       <title text="%s маршрут" /> <!-- %s = [shortest|quickest] -->
 
-      <start   string="Старт"  text=" %s, на %s" />           <!-- 1st %s = [waypoint|junction], 2nd %s = [heading] -->
-      <node    string="на"     text="%s, %s,  на %s" />     <!-- 1st %s = [waypoint|junction], 2nd %s = [turn], 3rd %s = [heading] -->
-      <!-- TRANSLATION REQUIRED: rbnode  string="Leave"  text="%s, take the %s exit heading %s" / --> <!-- 1st %s = [roundabout], 2nd %s = [first|second|...], 3rd %s = [heading] -->
+      <start   string="Старт" text=" %s, на %s" /> <!-- 1st %s = [waypoint|junction], 2nd %s = [heading] -->
+      <node    string="на" text="%s, %s,  на %s" /> <!-- 1st %s = [waypoint|junction], 2nd %s = [turn], 3rd %s = [heading] -->
+      <!-- TRANSLATION REQUIRED: rbnode  string="Покинуть" text="%s, take the %s exit heading %s" / --> <!-- 1st %s = [roundabout], 2nd %s = [first|second|...], 3rd %s = [heading] -->
       <segment string="Следуйте" text="по %s %.3f км, %.1f мин" /> <!-- 1st %s = street name -->
-      <stop    string="Стоп"   text=" %s" />                    <!-- 1st %s = [waypoint|junction] -->
-      <total   string="Всего"  text="%.1f км, %.0f минут" />
+      <stop    string="Стоп" text=" %s" /> <!-- 1st %s = [waypoint|junction] -->
+      <total   string="Всего" text="%.1f км, %.0f минут" />
     </output-html>
 
     <!-- GPX output -->
     <output-gpx>
-      <waypoint type="start"  string="Старт" /> <!-- For the first route waypoint -->
-      <waypoint type="inter"  string="INTER" /> <!-- For the intermediate route waypoints -->
-      <waypoint type="trip"   string="TRIP"  /> <!-- For the other route points -->
+      <waypoint type="start" string="Старт" /> <!-- For the first route waypoint -->
+      <waypoint type="inter" string="INTER" /> <!-- For the intermediate route waypoints -->
+      <waypoint type="trip" string="TRIP" /> <!-- For the other route points -->
       <waypoint type="finish" string="Финиш"/> <!-- For the last route waypoint -->
 
-      <desc  text="%s маршрут от 'Старта' до 'Финиша' " /> <!-- %s = [shortest|quickest] -->
-      <name  text="%s маршрут" />                                        <!-- %s = [shortest|quickest] -->
-      <step  text="на %s по '%s' %.3f км, %.1f мин" />                <!-- 1st %s = [turn], 2nd %s = street name -->
+      <desc  text="%s маршрут от 'Старта' до 'Финиша'" /> <!-- %s = [shortest|quickest] -->
+      <name  text="%s маршрут" /> <!-- %s = [shortest|quickest] -->
+      <step  text="на %s по '%s' %.3f км, %.1f мин" /> <!-- 1st %s = [turn], 2nd %s = street name -->
       <final text="Всего - %.1f км, продолжительность - %.0f минут" />
     </output-gpx>
 
diff --git a/xml/scripts/drive.pl b/xml/scripts/drive.pl
index 8885e73..9a391b9 100755
--- a/xml/scripts/drive.pl
+++ b/xml/scripts/drive.pl
@@ -36,8 +36,11 @@ while(<STDIN>)
       print "      <output k=\"wheelchair\" v=\"no\"/>\n";
       print "      <output k=\"bicycle\"    v=\"no\"/>\n";
       print "\n";
-      print "      <output k=\"bridge\" v=\"no\"/>\n";
-      print "      <output k=\"tunnel\" v=\"no\"/>\n";
+      print "      <output k=\"bridge\"        v=\"no\"/>\n";
+      print "      <output k=\"tunnel\"        v=\"no\"/>\n";
+      print "      <output k=\"footroute\"     v=\"no\"/>\n";
+      print "      <output k=\"bicycleroute\"  v=\"no\"/>\n";
+      print "      <output k=\"cyclebothways\" v=\"no\"/>\n";
       print "    </if>\n";
       print "\n";
      }
diff --git a/xml/scripts/walk.pl b/xml/scripts/walk.pl
index cbf0f06..3ece70d 100755
--- a/xml/scripts/walk.pl
+++ b/xml/scripts/walk.pl
@@ -45,7 +45,8 @@ while(<STDIN>)
       print "      <output k=\"bridge\" v=\"no\"/>\n";
       print "      <output k=\"tunnel\" v=\"no\"/>\n";
       print "\n";
-      print "      <output k=\"bicycleroute\" v=\"no\"/>\n";
+      print "      <output k=\"bicycleroute\"  v=\"no\"/>\n";
+      print "      <output k=\"cyclebothways\" v=\"no\"/>\n";
       print "    </if>\n";
       print "\n";
      }

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/routino.git



More information about the Pkg-grass-devel mailing list